From c6dffb5d9771f4050c5536f4027bec21a1bec869 Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Mon, 20 Jul 2026 11:26:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=AA=E6=AD=A2=E2=80=98=E8=BF=90=E5=8A=9B?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E2=80=99=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .npmrc | 2 +- AGENTS.md | 244 ++++ index.html | 76 +- public/img/左侧背景放底部.png | Bin 0 -> 90229 bytes public/img/系统首页顶部背景图.png | Bin 0 -> 116064 bytes public/img/运输登录.jpg | Bin 0 -> 248897 bytes src/api/base/airport-master.js | 52 + src/api/base/common-address.js | 52 + src/api/base/currency.js | 60 + src/api/base/customer-type.js | 52 + src/api/base/fee-item.js | 52 + src/api/base/port-terminal.js | 59 + src/api/base/railway-station.js | 52 + src/api/base/region.js | 7 + src/api/system/user.js | 13 +- src/api/transportCapacity/driver.js | 60 + src/api/transportCapacity/transport-ship.js | 60 + .../transportCapacity/transport-vehicle.js | 60 + src/api/user.js | 11 +- src/api/vehicle/accident-record.js | 49 + src/api/vehicle/annual-inspection-record.js | 49 + .../vehicle/credit-score-quantification.js | 62 + src/api/vehicle/customer-archive.js | 92 ++ src/api/vehicle/etc-record.js | 49 + src/api/vehicle/insurance-record.js | 49 + src/api/vehicle/maintenance-plan.js | 49 + src/api/vehicle/maintenance-record.js | 49 + src/api/vehicle/mileage-record.js | 49 + src/api/vehicle/oil-electric-record.js | 49 + src/api/vehicle/other-expense-record.js | 49 + src/api/vehicle/tire-replacement-record.js | 49 + src/api/vehicle/transport-change-record.js | 49 + src/api/vehicle/violation-record.js | 49 + src/axios.js | 4 + src/config/website.js | 16 +- src/lang/zh.js | 4 +- src/mac/login.scss | 33 + src/mac/login.vue | 48 +- src/option/base/common-address.js | 172 +++ src/option/transportCapacity/driver.js | 111 ++ .../transportCapacity/transport-ship.js | 66 + .../transportCapacity/transport-vehicle.js | 113 ++ src/option/vehicle/accident-record.js | 277 ++++ .../vehicle/annual-inspection-record.js | 284 ++++ src/option/vehicle/etc-record.js | 211 +++ src/option/vehicle/insurance-record.js | 262 ++++ src/option/vehicle/mileage-record.js | 223 +++ src/option/vehicle/oil-electric-record.js | 321 +++++ src/option/vehicle/other-expense-record.js | 220 +++ src/option/vehicle/tire-replacement-record.js | 223 +++ src/option/vehicle/transport-change-record.js | 199 +++ src/option/vehicle/violation-record.js | 297 ++++ src/page/index/logo.vue | 4 +- src/page/login/callback.vue | 74 + src/page/login/codelogin.vue | 1 - src/page/login/index.vue | 64 +- src/page/login/registerlogin.vue | 1 - src/page/login/userlogin.vue | 8 - src/router/page/index.js | 10 + src/store/modules/user.js | 3 +- src/styles/common.scss | 9 + src/styles/login.scss | 56 +- src/styles/media.scss | 18 +- src/styles/theme/cool.scss | 8 +- src/styles/theme/star.scss | 8 +- src/styles/theme/white.scss | 8 +- src/styles/top.scss | 26 +- src/utils/audit.js | 4 + src/utils/crypto.js | 6 +- src/views/base/airport-master.vue | 665 +++++++++ src/views/base/common-address.vue | 815 +++++++++++ src/views/base/currency.vue | 580 ++++++++ src/views/base/customer-type.vue | 290 ++++ src/views/base/fee-item.vue | 290 ++++ src/views/base/port-terminal.vue | 804 +++++++++++ src/views/base/railway-station.vue | 663 +++++++++ src/views/base/region.vue | 33 +- src/views/system/menu.vue | 34 + src/views/system/user.vue | 107 +- src/views/transportCapacity/driver.vue | 875 ++++++++++++ src/views/transportCapacity/ship.vue | 603 ++++++++ src/views/transportCapacity/vehicle.vue | 852 +++++++++++ src/views/vehicle/accident-record.vue | 426 ++++++ .../vehicle/annual-inspection-record.vue | 441 ++++++ .../vehicle/credit-score-quantification.vue | 862 ++++++++++++ src/views/vehicle/customer-archive.vue | 1243 +++++++++++++++++ src/views/vehicle/etc-record.vue | 413 ++++++ src/views/vehicle/insurance-record.vue | 449 ++++++ src/views/vehicle/maintenance-plan.vue | 602 ++++++++ src/views/vehicle/maintenance-record.vue | 598 ++++++++ src/views/vehicle/mileage-record.vue | 431 ++++++ src/views/vehicle/oil-electric-record.vue | 450 ++++++ src/views/vehicle/other-expense-record.vue | 441 ++++++ src/views/vehicle/tire-replacement-record.vue | 393 ++++++ src/views/vehicle/transport-change-record.vue | 411 ++++++ src/views/vehicle/violation-record.vue | 490 +++++++ 常用地址需求卡.md | 115 ++ 模块需求卡生成规范.md | 183 +++ 98 files changed, 19429 insertions(+), 176 deletions(-) create mode 100644 AGENTS.md create mode 100644 public/img/左侧背景放底部.png create mode 100644 public/img/系统首页顶部背景图.png create mode 100644 public/img/运输登录.jpg create mode 100644 src/api/base/airport-master.js create mode 100644 src/api/base/common-address.js create mode 100644 src/api/base/currency.js create mode 100644 src/api/base/customer-type.js create mode 100644 src/api/base/fee-item.js create mode 100644 src/api/base/port-terminal.js create mode 100644 src/api/base/railway-station.js create mode 100644 src/api/transportCapacity/driver.js create mode 100644 src/api/transportCapacity/transport-ship.js create mode 100644 src/api/transportCapacity/transport-vehicle.js create mode 100644 src/api/vehicle/accident-record.js create mode 100644 src/api/vehicle/annual-inspection-record.js create mode 100644 src/api/vehicle/credit-score-quantification.js create mode 100644 src/api/vehicle/customer-archive.js create mode 100644 src/api/vehicle/etc-record.js create mode 100644 src/api/vehicle/insurance-record.js create mode 100644 src/api/vehicle/maintenance-plan.js create mode 100644 src/api/vehicle/maintenance-record.js create mode 100644 src/api/vehicle/mileage-record.js create mode 100644 src/api/vehicle/oil-electric-record.js create mode 100644 src/api/vehicle/other-expense-record.js create mode 100644 src/api/vehicle/tire-replacement-record.js create mode 100644 src/api/vehicle/transport-change-record.js create mode 100644 src/api/vehicle/violation-record.js create mode 100644 src/option/base/common-address.js create mode 100644 src/option/transportCapacity/driver.js create mode 100644 src/option/transportCapacity/transport-ship.js create mode 100644 src/option/transportCapacity/transport-vehicle.js create mode 100644 src/option/vehicle/accident-record.js create mode 100644 src/option/vehicle/annual-inspection-record.js create mode 100644 src/option/vehicle/etc-record.js create mode 100644 src/option/vehicle/insurance-record.js create mode 100644 src/option/vehicle/mileage-record.js create mode 100644 src/option/vehicle/oil-electric-record.js create mode 100644 src/option/vehicle/other-expense-record.js create mode 100644 src/option/vehicle/tire-replacement-record.js create mode 100644 src/option/vehicle/transport-change-record.js create mode 100644 src/option/vehicle/violation-record.js create mode 100644 src/page/login/callback.vue create mode 100644 src/utils/audit.js create mode 100644 src/views/base/airport-master.vue create mode 100644 src/views/base/common-address.vue create mode 100644 src/views/base/currency.vue create mode 100644 src/views/base/customer-type.vue create mode 100644 src/views/base/fee-item.vue create mode 100644 src/views/base/port-terminal.vue create mode 100644 src/views/base/railway-station.vue create mode 100644 src/views/transportCapacity/driver.vue create mode 100644 src/views/transportCapacity/ship.vue create mode 100644 src/views/transportCapacity/vehicle.vue create mode 100644 src/views/vehicle/accident-record.vue create mode 100644 src/views/vehicle/annual-inspection-record.vue create mode 100644 src/views/vehicle/credit-score-quantification.vue create mode 100644 src/views/vehicle/customer-archive.vue create mode 100644 src/views/vehicle/etc-record.vue create mode 100644 src/views/vehicle/insurance-record.vue create mode 100644 src/views/vehicle/maintenance-plan.vue create mode 100644 src/views/vehicle/maintenance-record.vue create mode 100644 src/views/vehicle/mileage-record.vue create mode 100644 src/views/vehicle/oil-electric-record.vue create mode 100644 src/views/vehicle/other-expense-record.vue create mode 100644 src/views/vehicle/tire-replacement-record.vue create mode 100644 src/views/vehicle/transport-change-record.vue create mode 100644 src/views/vehicle/violation-record.vue create mode 100644 常用地址需求卡.md create mode 100644 模块需求卡生成规范.md diff --git a/.npmrc b/.npmrc index 614e2bc..cbd1d05 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,2 @@ @saber:registry=https://center.javablade.com/api/packages/blade/npm/ -//center.javablade.com/api/packages/blade/npm/:_authToken=如何配置请见BladeX开发手册 1.3.0配置资源令牌 章节 +//center.javablade.com/api/packages/blade/npm/:_authToken=aafaf70d1edf6ac66f7eddce9a57c67199b274a3 diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..1187987 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,244 @@ +# AGENTS.md +本文件用于指导 Codex (Codex.ai/code) 在 Saber3 代码仓库中工作时的行为规范。 + +> 本规范适用于 Saber3 前端工程的所有开发任务,为强制性条款。除非用户显式豁免,任何条目都不得忽视或删减。 +> +> 作为 AI 助手参与本项目开发时,你必须: +> - 每次输出前深度理解 BladeX 微服务架构体系、Saber3 前端工程结构和 Vue 3 技术栈特征 +> - 当回答依赖外部知识时,先查询 Vue 3、Element Plus、Avue、Vite 等官方文档 +> - 若需求含糊,先复述已知信息并列出关键澄清问题 +> - 面对复杂需求,先拆分为可管理的子任务 +> +> 所有开发内容必须建立在深度思考过的基础之上,禁止机械生成与错误填充。 +> 如果你已了解所有规范,请在用户第一次对话时说明:"我已充分了解 BladeX 微服务平台开发规范。" + +--- + +## 1. 项目概览 + +**Saber3** 是 BladeX 微服务平台的官方前端工程,基于 Vue 3 生态构建的企业级后台管理系统。 + +### 1.1 技术栈 + +| 技术 | 版本 | 用途 | +| ------------------ | -------- | ------------------ | +| Vue | ^3.5.13 | 核心框架 | +| Element Plus | ^2.10.1 | UI 组件库 | +| @smallwei/avue | ^3.7.2 | 增强型 CRUD 组件库 | +| Vue Router | ^4.3.2 | 路由管理 | +| Vuex | ^4.1.0 | 状态管理 | +| Axios | ^1.8.3 | HTTP 客户端 | +| Vite | ^5.4.19 | 构建工具 | +| vue-i18n | ^11.1.3 | 国际化 | +| Sass | ^1.85.1 | CSS 预处理器 | +| crypto-js / sm-crypto | - | 加密(AES / SM2) | + +--- + +## 2. 项目架构 + +``` +Saber3/ +├── src/ +│ ├── main.js # 应用入口(全局组件注册、插件挂载) +│ ├── permission.js # 路由守卫(鉴权、标签页、锁屏) +│ ├── axios.js # HTTP 拦截器(Token 刷新、加密、错误处理) +│ ├── api/ # API 接口层(按业务模块组织) +│ ├── views/ # 业务页面(按模块目录组织) +│ ├── option/ # Avue 表格/表单配置(与 views/api 同构路径) +│ ├── const/ # 常量定义 +│ ├── config/ # 全局配置 +│ │ ├── website.js # 核心配置(认证、菜单、水印、OAuth2、设计器) +│ │ └── env.js # 环境变量(API 基础地址) +│ ├── store/ # Vuex 状态管理(user/common/tags/logs/dict) +│ ├── router/ # 路由系统 +│ │ ├── avue-router.js # 动态路由核心(菜单→路由、keep-alive 扁平化) +│ │ ├── page/ # 页面级路由(登录、锁屏、错误页) +│ │ └── views/ # 视图路由(首页、控制台等) +│ ├── components/ # 全局公共组件 +│ ├── mixins/ # 混入(crud.js 等) +│ ├── utils/ # 工具函数(auth/crypto/validate/util...) +│ ├── lang/ # 国际化(zh/en) +│ ├── styles/ # 全局样式 & 多主题 +│ ├── mac/ # macOS 风格主题 +│ └── page/ # 页面布局框架(主布局、登录、锁屏) +├── vite/ # Vite 插件配置 +├── vite.config.mjs # Vite 主配置 +└── package.json +``` + +### 2.1 路径别名 + +`@` → `./src`、`~` → `./`、`components` → `./src/components`、`styles` → `./src/styles`、`utils` → `./src/utils` + +--- + +## 3. 核心机制 + +### 3.1 Avue 组件代码生成(Skill 调用) + +当涉及 `avue-crud`、`avue-form`、`avue-tree` 等 Avue 组件的代码生成或配置时,**优先调用 `avue-design` Skill**。该 Skill 覆盖 Avue 全部组件类型,支持 Options API 和 Composition API 两种代码风格。 + +**触发场景**:用户要求创建 CRUD 表格、Avue 表单、树组件、数据展示页面,或提到 avue、crud 表格、动态表单、JSON 配置表单等关键词。 + +### 3.2 Avue Option 配置 + +Avue 表格/表单配置独立存放于 `src/option/` 目录,与 `views` 和 `api` 保持同构的模块路径映射。 + +### 3.3 API 接口规范 + +- 所有 API 通过 `src/axios.js` 封装的 Axios 实例发起,按业务模块组织于 `src/api/` +- 命名约定:列表 `getList(current, size, params)`、详情 `getDetail(id)`、新增 `add(row)`、更新 `update(row)`、删除 `remove(ids)`、树形 `getXxxTree()` +- 后端微服务前缀:`/blade-system/`、`/blade-resource/`、`/blade-flow/`、`/blade-desk/`、`/blade-log/`、`/blade-develop/` + +### 3.4 认证机制 + +- OAuth2:`Basic` 头传递 `clientId:clientSecret`(Base64 编码) +- Token:请求头 `Blade-Auth: bearer {token}`,支持 AES 加密模式 +- 存储:`saber3-access-token` / `saber3-refresh-token`(通过 `utils/auth.js` 管理) +- 401 自动刷新 Token,并发请求排队等待;登录密码使用 SM2 国密加密 + +### 3.5 路由系统 + +- 静态路由:`router/page/` + `router/views/` +- 动态路由:`avue-router.js` 将后端菜单数据转换为 Vue Router 路由 +- 多级路由自动扁平化为二级,支持 keep-alive 跨层级缓存 +- 外部链接自动转换为 iframe 路由,支持 Token 透传 + +### 3.6 权限控制 + +- 路由守卫:`permission.js` 控制登录态、锁屏、标签页 +- 按钮权限:`store.getters.permission`,格式 `{module}_{action}`(如 `dict_add`) +- 管理员判断:`userInfo.authority.includes('admin')` + +### 3.7 多租户 + +通过 `website.tenantMode` 控制开关,管理组租户编号 `000000`,后端自动通过请求头传递租户信息。 + +--- + +## 4. 开发规范 + +### 4.1 双 API 风格共存 + +项目同时支持 **Options API**(主流,绝大多数现有页面)和 **Composition API**(新组件可选)。 + +**选择原则**: +- 修改现有页面:保持该页面原有风格,不混用 +- 新建 CRUD 页面:调用 `avue-design` Skill 生成,或参考现有页面手动编写 +- 新建复杂交互页面:可使用 Composition API + ` - - + + diff --git a/public/img/左侧背景放底部.png b/public/img/左侧背景放底部.png new file mode 100644 index 0000000000000000000000000000000000000000..bef3839bbd248f42648f04b7ded0e99230c8a845 GIT binary patch literal 90229 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

Pk){-XdapW#%k{}jGKf|+CvCN~%OXUN9LLkUb zYD*Kbg0^;qNC^Z6#mSV`yd`zGQ!l)qOrEb6Z?PQTfJmg-AXTOy;yDkkE`3+V*UfWVcAc%*`L#yoKBw1 zIhuvj)+T4HwsfR)Bn&5=@x=y?3t%_wf&(nzpe)i0?Sx&IyE+$Vl_pt3(sK1?(sOqy zC-o?9&ZfXBE&@1NcHyzzP2gUt*z0OLdA^)*b{pTm>9d8!db2YD3l>?eLn9cE1cn%C zY3PV)Pm?IbC#HfKs6H5_@!}~81ty9W>NN^BDuWRRN3YsevgOxSvLOU1qd37FBxvJl zmPwQfgpyq7NI=KR{>sN_RAA!g1tYc{F=jknE*5T$7EU4?HE^ab zgxC@sF*&|YMwT2x<6e9}KtYN{Q@?+4!K{GF^7rO&dT|lbv$JHu{l7EgYJfT|j z3sc=2LUxcu%MenU(4}3vtIhP0H5?6r4edasb}+-R4#(U>O$ZQ0;rwT;e)2?|rVrFfE7H?wf)0W_ghO0o)!+>Np> zHPhl14GB&WxWy1qq<&=JLumuojcj{>KHL*jc+Iyo*d0FE|8TS6i*EnmEvY@wXxkb_ zu@IU;r|MFH^wlF2DT#tF;I99u{ZSgpQM3Td@($Jrl9W#+Ru*Y`y2!;wg0@S^K%&^t z3*FI=1@2>H3sXBllNv}Y0n8!4REtKIJA)VGh-oNC51B!FAsfldT^vQmk0GeLrU~Gt zOZ8e31gEQ!!U%N4gm3rdCoH%JsXRiw)=j}5ED5A>#~cL3=TmeJG;@7qWQJ3k@E9)1 z=BI)iE*39kHlUKWV-djyDmCOnt!yl<8`NqN!6;HA{L2}Io5}XoV*YlsVa1F!bY@H2 znhLqX%furDIs?3$JK>Pu(L4&``S@Hnw`KQ35T#J$u`rRR$uGUQ1~F?c(G#x01OC70 zQQPj={qw`^`iuFDe)VQDdxlqco*!~5go98LN5up%N84>PuTdfZCnVuX3ydOcWJN@w zL(>@}SPGuJ$YphzyP6n>RJqnaF&uSVLc*4n{E}F&Drh@WcOfJco7>6aLn^_+1;to~ zkNnY1RVwjPZonFcVo+-j7o&?sBtl@biwcf2_CT$poJhk<-ymB5!e0P}FX#?8)y87! zGYQ&y!uCkEU!$5nw{i#)lSTw3R^t$cJMj>YJW9d-wGlX`)RPABpoAp#1QzAv*<$%( zF?~8;;H;`CIQjQ>y`OE_6~LUn-%*livaPSQ#StqpxjR{zr6de42S$xASWWX+$)A@!2e0Mue?7dn~=6Zu)Tix?rUUu!M zFMXO`$rpaCk$|j1tcM=TajPj_hDl(^fDkUR_i*`0G(0%@|7x?N*86!g`D)2mV&-3+ z&mQaBrV|bkzs&acF$rnJ950Sy#UvS)FQQXDSRY0Y{#qWWf-0pJ*mlVWO~5ftKb~6V zInbObAUrm^2op2KzfGpxB!bBtB=wJk8>5PA7Ny|9Ma^t?p{2+=!xA0&RZvwVxge^h zP(VBl^gCWIUqTV#&Um$t6AC$6j-8)+FL}3_P39Q ACeN(vV(0MMoA=z3n+SFfTb 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�zpqGU^x9in)K0B)`Q3fMxPNdT={^z{R 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 literal 0 HcmV?d00001 diff --git a/public/img/系统首页顶部背景图.png b/public/img/系统首页顶部背景图.png new file mode 100644 index 0000000000000000000000000000000000000000..5832ce62323d7d75dde0f56f737c667668098552 GIT binary patch literal 116064 zcmaI6V{~RgyDb`Y?4)Dcwr$(CZQJUoV|Q%ZR>wBpSZ~bR-#%xbbAQ}@*N?TTYCLm3 zs5xq_RimPn6eJN~abQ6}KoF#*#8f~)pnv~svp|FWyQdwQb^Uu_yNPSLsXAJ?c^bQz zg9w{BnwS$w+Z$V&tC$;`c{@*-^MQbXlUb{2xoOGE@t8W=GZ_EJhQZ6;=^q*dgip}R z$=KA^+>OY@+|t^CpX8>ikA%qDjGsi4U7ktaNz~lRTFS@8T-8TG&D6)%l-rC%P=JWf zi{~GKy}6q)k(a%lgDa00Kgoab^89Q6XPA+M=)X+dZ23w4S5R8=N<^ZLF6KlW3{3Q< zOiUa^oZJj%#wNz5CMI-5EKDrSj7)5d%xv^bOgyaIJZx-4|NA2O=g!5h0iW>_zY3O8VanV&<-< zF4j(N){YKD|6w#Xadda%C;1oZ|H{GM>Hp9=xc=`t{i_(Gm$4HgGXv9qa{6yWdHMf; zQ+xaWW9{muV*Y>Q{r@C(Rr7W-XH+qFb#!+z{Wo(Kr2lc{#3SlrZtUjhqUPvm_upky zvT}5DbhUDH`md4^$s3zmJN#$hzX0;`Jkk!XZpIF#=F(#PB>yNFtgX#>SjEJ}MTEsg zIXO9)n3*M*xh2@e#h4{nxS3g5+1a@{{u?XiXzFfn?%?*{ShN3&75g8t{}F?|(?8E* z<}TJA=4KKuj`l?Vl{1g^{~U|(|H${hv1b2sEF%9SmhoROjQ^S0|JO|a_s~E2{HOVU zg!`}af242j@K5h9|Af6;9BT>!I`aTB2S$qN>3H?;Q(q3OHS}vgO+MZtX=LmJfMqt}Ms)4kC zM8R*LBj-8J`QklbtOhtl{{r-m z#b~$tqGgzC<#uFaq^V;S{04636SnzzywvzaJkD^5Q@n(k ziA-+^vwgY-QV+7Q-NSQ{htIQ`Yi&>=b7!>7*@@8kmj=5puVZtn{DCeEp80jtcPKAl zJ+Z*#yt%pb_`34v^i^v=rRR=|IsXILxyAdB?D(=5??gb;%xmL?xb9cP46%>I1|ZNg z0MH)WO>s!t;4^rkckDZ1NffvU8>@{S-XCB zov}Rfby8W9MXHK)>`v@O2~gBO_f`dn3Km;;yaNz&^B?BMe2`qKRv)~B0P=bJ!Jcj0 ztGAO*7cc3X>_KBv9-m~ZuwU?j2J9l!|qWtp!C4XEe3nVO}4@umdS? z<@;K%pOy`@+{umleF5}OgI60T=0hGIfuDV!T#1(e-fxq;GFQYLl!uOU*GLo`R!g^~ z&3#gLcSmd>12V)^`_cSC4bgeyBBZjo(6S@!B2 zd%VrmwDs$dJ5?yrB)!)?cV_s010(a+ES@Ogi=y6iiNs3?xN zjawVRAG7D{86n3K1o)tgh7431{XNeTbu%6IhjhQzNCrai)_NfGdC^I{cIEHB={=dR zzET6&$Gl_mUr__!$1W5dzsJ5epC1n=+j3QJrVRn@@p_}@%=;X!hcFCG^RaF5zerr* zPblzp?>jzF_;xtOt!l#ZQ~=UV7TUa9TggXRvowZ)Sk>fF-WL9^kVBUynNOJ^=fK zbSK^MX%yNoFnvU6-YMV*T$S_oAj>4C_m|}%v9E)e?8QKbS-|wd3Pw5fmMd_r%zzs+ zc+4k&ync8&X%W_!fiZH>{QctVvo27tuP5LGIQQ;Z`}#HM+h6=vZBvyeSx+{3H|zt8 zZd6Bb!CJzIYmS%q@)8^lm3)D|>smXk#XeivICSUaN?pn6O)&r%u;ZIz&}q}ePvaHB zGDNUoKOq2+*+w*J?4AA4+~^O9-<&FJF2*1h{S2lLi2JoMIhSuxF4VjAeUAQp?f7)# z_%8T8vijILD-eJ6#@A6395z3ez0&%73iw*`4kS~DGdb$JTT-e&`Hk?A;=!vH#tjGd z$bsRpl*IkwMeC*7+G(`M%ct4q4WT7!GBcQMtFC9+g$w?y*7S=1N>|I;*Qf);eRoA1 z>$X@-A2Bg@Rw;Jz4aB&OQk;LN3*7pi=?nNg4E%Ua41BX|#7qx~J)Xh_wIs`_q}V;Q zl)9m7bp_kGUUQ{i&B`GM5V&ymgYy-~P$qY$cYD`@aSvV3IqJ7QMj&+I&GGPI9Lvtt z@OpZnfAIaxVgG1b{dD|(ytn{-Dt>=-6s#INmmY^)$khu?sarTh>`ZZw%<7GdK?Fcq zhUro8OQyy|^N%71?pegA485j?zWZ%jnh%sk_Ia+B=8e3Jm_IkM=GJ{rAEQ?XVk&TY zm061E(;7aXoaegF0&)!julc2R0E2T&oSk@voE?@m`o+-M;fhWJBW#6rj-47s8 zT)W%v>$P|H`y_F-?|oD7>vQ)TC>WUQOxTfp6iuxJb7Y=R&V6gSr76Jse&Oey-ukA4 zal3Ui-QIV{;VLpVtE&cs#ff>?y`VbtgMchUIl*jdLy+=MK7W*?MYZ{w=RNUK(GXM= z`5Ei)9ZNm?)QHuzp%GUFC{7A=i&y&m)vs5QZ){VErl;Am``0j5M2BkSVvG0bM_>zP z!q)rc?;E}lgDnohXO~fv0QIk+eEj9tY9?GB>*D)-?0xF{`X->3P_U7v>%*?|MrYQ=R~O*zN3r(_jPn_~ z4_WPYZCdy0vJ9Vd6`k#DLbjH!RrULL8A_Zh@9Miw1J8p>gDW=h1#~>m^#z=NZMyWW z8X7-tQ-KRm-sf~@Kq99L06L~z81l^bzTh8n0=FcYb4G)i9+X;J_jv`K>S&ZaHB6lW z;LHJFhSvX*&aCz6RX=r2>Aa7;$$mcNJ34dE2angUdx6LDJRpii^0*6n``TJ|41BK> z;C#*h+9zBEd>Y^80TNZG-SZ^2auf>G(5UL$(2p`a;v- zJ7BHBXeYYuV;1E1uQ!RSolllPt(%bxvi8013ip^8J!VI_(#P@|r&#(O! zri43@?dEZAOJVRIw*H@AoZnZ5-&*g6Utfkh`G?nz9Zd%%{t^i&{qJ(8f*)L}Z?ufl z9I~oEPc3I}9<}d!uU}qW?YAjlb@?{uAp8POW>ria?YjA}10e4Jcn{cfhK70#vt%sS zb8ANegkP`8yWcsA)RLqgz_7))dT~y&9;~r+<+sC~zV6apu31V1IyEr`P3Bm?X&XerXZ-6)h7T3x3T8_v~uh z*E7o=So=35AKWgn&DG#9w#ak->YQf|JyD%Er$iihxxWA)Am2J~43~%n9O~|qM-t=P z2Z^df;&AlW)Z=ShC!yucm)}`O&@P5?p%Q)loMM2%0ie;bx=?rbx2H3JzT3t9?bC9F z_HBDicRcex(?5R>w5ZvpW=AhTFyGr=VcK;_({$1MQ-aBQozUQ}qYHO=u&esk?{MZ?)xtATX6PeETjn-3!C)`A2erlTjv*wY3ZY{lFpwG$gw@^af&G)fGoi7 zx&|l*ew}s0k;=W}JI@Aw@#W0be17Q1)*$L>Tojti*SmlaCVAyyz4rQ)je7OsAl-lX z#o2fY_{~aw9uNlbzVzpR4+H90jf+Y0Egz}#1)hB`jI$u6^+A-9SS?NcD<&)BFa3PK zRxG0eX1xQyKIz^^4}^J@yGI57ay{c%^(x5*d|?Oy^DhpD!F3>hg`AV;8IC0C<7_vD z3l%u)EjzHy+Yqhlt_bu)P`v2LU&wnp)OSDZEjHBya&?7yc6Bj#zmI}n(3Y51rH(BJFWzgYGB$?r?vk{vBqD+ z7qRa~^dX1O-eTFlh&rGhbmS3?52FOeK+HGZG;*3+WCZmxMU47r(OEq9i*qH&9Qbn> zMG*3rkPY9jOND|kiJElAeEatK$;xOXA^CblBA9K`pp(BP{pPoH`SkH&_!n%Rh%SHv z5H_nh>hZLSH=e)F;ioo z)7bsVt+l&aqm0~b19pSJbWNYsZEs__UkDs#B-r*tGh3LHLs-v)9{MA9hL!N~U?TG( za4v<%(}HlYvLbUzjGtpGhIp6 zwCq`kdtl7w9GR#_thwcY-6`~K+t%`f2+4pKRu-g}#7I8H2kGdYZpeAZ(Sx+ocC8mDr>)OXQYJbS!Jzk#pJ$i zLndbXJLV3$&=}(@x9-s&2KpP{-1XGeGCP+0#T&3@HC2(>IP&#iyDgn+HUQeka9cU4 zG$5j4ur={P6_-5xL1vj=v&$t!Tb0(zuetgl_;eUO++{x=T{=FxlgC%5xxHtDpS?Fg zxq8pZ()4FTxT4vi!1`kERVgLa>Iarz_%>PRfdl7mwsiJ$6YSI)o?Bx0N`mH?vD!m@oBzXZ6g)=l_08Awd z63WYt9r=U224FtF*wq=PjI!Mg+!P61)y77nd`BeHN~x5rarRmw12e<7J6(^p`w0*>FX^Ro+!0ML<< zmLRI1eQ%=;5%GvC#HO>KaZ@2-r*)qFZg~uWXerjoOtbOeEn@GaXWq|nGwW}x?ar#p z6-&qDQ!v;k)?+3tsB&=SRo~wp^2;>YO2j~nL{;NB8fe^1?;gEYP*}5Si)9b|zj2=S z=L2;5fXdmwGzLiD9!Lt;I7r6iuoEQiz`{)9^g9bqOywY3095PVz3UyOPqzq{T~KI= zz)9QD9HnkG;r1kiJ3!P`RaH{_91yyjkHk;Pg?pJ`aQ+IY8TG8+1Lg{i`k)PoUxgje zWbfLAIV=K|yR2Mg`8i!EJ~Pglg~e z8y5$oyNf^QTUK8wgI&kKdT0$B0FjiZhvy$xdhwhuiKl;|Wr=;Voq!@EF#x3{QPn!- zCf~^M`U#IG{bWDi_kN>q3Gm0*+0>pZJRIp^%Q^a9SU4MT*v7k z(KP#d{=!@fu&NZu{!wP(TQ$-m87hN@aLn^uJYv3R)3rOo`r((F|FxACdv(nzVsdyc zFm^`0buOcm4<}Cvv53|GSS_5o<3n`Rd6dL(Z@HcO#%AevgV{xw!<>zP?jGVy1$kV$ zDuH&Jd+gFWECQDbjMlfAKH8dJs3h)jVHB-ue}Zcrb3km$XbCg9#8hEi+VRZ)Lw{1q z{rR*N>(7ngX8L0JJWf2iCz8HZuPam?Z}_UK-m*#>^IW z(00%oowU%6_83WOhGZBVa9o}VlS|8R5d9EQ&~(pg8?2v(7&ysM(&karg~$qkKDO2s zQ5xgV^qk`~_2i}>6!ftMnlV>z+)lZo+!cSixQvRuix3rI=scddi4uu4uKTx{CNV; zxDzNc2CjO1zsWA8M^c8qK7o-zC=~P-HoP$ZGGBF*w#u*^a*j$RP87T{&=zs(>%XbnQ4K@uC8$ULYQsG27oMv?C z&bI~}Kxl~N5%8Cl6PG*P=%;&-nj#)jDMG+jm2kBTCznhH^r9=4QBocdGvj4^C^r-X zXBfcWOAoh=a-eKlwloc);8Vvza7xUds)N(>_xniKZSdGAA{6UrqKw+yBu~&enk+|- z9B;pBP7H&m8}>y{DBT45B<4Z)hiZ4@M}`B4IDYZCG#Ob6)v_>>7aoFrnoeKAwM>D! zE%bQFH6OO`Y`dA8eJcZ>7)YeiNdJijCv+vcKbPfZrl8SC5%g$^i&4ADj9H18j)WB2 zIj|+*>!>y7nW(V{repn4Z`NF4M!_P=W#n7?M5QgP7O#vT5>2VB$eq%6b z95Q|}vLK2sLaPX))q8?uFeT1Vk4*IxT3H1-HjR=1YwuAaVto7;tIn34MP9V!4Hg1Y z`rdL|7a4^%OjC%}o)8OKs*C%0gGggJ7+1x%Ag^@7E)U>#-2N2AkXn;Vl2#VqekPvQ zwx;Pxf9o6x<7nVSj(}8^m57d$88_I$sw&>O0bVvGz_tM#)<0&3^+1gFJnvzscWYxL9w%CwPjjN`iQ8&p2B(B_`?I7xaeC1O@{>C%tmJkBpP1)vQ)9gn(#bep$aU||3xS}H9b{|NSUWAcB;-wMl()`jnejrxlMvaq9Y;w zuR`^qlrTiKkUuWL8-;{$xS> zx444Q$rYKwk_eNxw+w4P@P_pPO1;6t)@2s(1O-C}J9!(i+^N5!XbeEVR6Zp}%CpI$ zBoJAJKCNsVqbAhJmaCWaTSSa_fdPjjPva~piY}aRW|+F>?l8?#qmv8|3N&DOG{CUh`)Bica~(|Kx1^Xyg&iqAC_77# z<2^5p_fJ-}Qzq|U-F8-Ue7m%W=Dmf;{5kaXcdvi@^_v7l6&`RCU_xjYmrcTvBLu)) zwX0%sOKz@U9__AH2*MNg*I{?-Lw?=uEnm$-0&9!U4^E}x@Ip$qItplS2i8z+FiIRK z=Sr;e6c7y7rUY3n`cxxX$CGE)=i+hWB7WedY^%kXI`WO2rwH0k(SlL{pzVC&+)|fO z81AW(1#*A)&rV3-S|*LC78Q2c{7@1C{EWSwHP zX`7{1a90n(*2WZ@!P(6$7Hq1l;N&NLRp=OJ)37A$gT#ygxfcGXZwEwT+?x0&wPu(+ zfflOo=QO*Af0@-N;R2cm4nx3U+UAe-CT=y(>dF;~lT`O=J|y-`SDW(~ zjafLrO=;^diii8&(#Rc7IfM5Yh^R6juB^+Hi8At)czY|f58ue>xys^rym1ZTCxZ;b z(4ch_>(5{2MrXF9S%2wJs`Vy82BmaWF`JHM(#ng!rsn$AIg(Cqx(ncV>TxLhuW#}k z=UY$#6@qsTZmRGrs0$sY5L=--hGQ%C!v)%fR}Q7(pT=ivlpI=tK4&BAOwi>T$3A?` z>4(27S&BUAi08<&zduL*gvSd!_I&kyQ1<$ZSQAxCZz+1;yqu|!NnZW^$@5z~ zl~NksLm{=c@b^87;WbmMzhIV;GHRUYRXk zgv!rv6YnNvldM{J81XLqCDJ<@?Gg4?eB~YVZ0^E#&g*{%nyq!;-PYOEmA&cSY|8J@j)CF4;EhB< zD!56Qp@!xcz+gt{cu8{WXkp3MBYE!Cp%6L2x!m9K;xI%@z^c~MdNA3rtUOlqO4U$S}>gawmO|AXoXr6Ed$sX4*w8s@?sOO^Xqw=@ z#qJU;eL2wVaP>4yL{9g8SB-DX3mD$v5ra%$MqKxGO=zg)RGfs~#TXK0kw+cr$ zK;Dr`Y_|9v5#23PZ*I&=VUVYXTeAz)aD5FG0p%D5*Q;tNC5E5~thADTW&85*$42<- z&RTP2BZRT141$slW9U7Sv)b;i2z$**7L;x%qVLYVn!#kH2&F+^#}e#`W8SDl*JIW*9p zB?~88HA6ZGOC|Gt_}kZfQ={rH)i|IgoY`>DHi5mF(gn%K8{>aeXPut9f=oLTQ2G6C z!F&shl@ytGt4B}PbjdrnHLST*b7ahez1C6Hg9@&^n0#g##;I39JCECIeV-QgIqi)O z$*gg9TY`?11x zA}DHeQ^F7JaJM@hc5#U#s;o_36B83_C+8kR98aF3XWP=C-tiYrDv}&3Ucw_e+e;69 z*#@t;dfb2g0N={E*jl+HE^6VTb63cYqfpOREzmKDPF)UzbSzIxqehCD*1&C{sjePX zL7}o&dP{mgjx$6u#ei@@#3_1BY-}Nnzxmeh%!G)@dzl!RE(3!^)_=6FgqWWYO^>@khOrA55M=TcC87;^Ok40ugQJqJ@oZ%QI|y@y4d~6!PO#qnjl~nG1=4^yORPpzJ!cGOIQ7&{oJ=@pyqQVjB4ormkH? z$cW{N$P!aksQxpNQCF&N*Ex6+^<3L_+0Cpv*S2?ZTNB16J>7H0BF(Hi(`8(k8gvVY z-=V^gqDFW7ZeKEpZ)x_EoD#-WSX16aEyRn3%r?zCRb=)Ozry2ai!U*>1C-d`l*Z3I zD;77}#F|{VPn?VBFA)g<5wo_rH8?g?K12EO!9Ku`EWL(#8~&St2~pD-7mUKq>^nCJ zmOn@{6_IJan&73&+GILuLyRRN2m9b_Q^5#E`|02&pvN_$zt9`KBv&qjikiegFW7|8 z1k8^!X%**I+-~JqmpD4MQ$-0h;T(g<8Kfwd29vq9mV{LWD5+2sL_ zjTbRO>L#B0bKi(Wq}ZOE$g+Qj;EI`b`&iPt;d^T3!6vv)Mifnqcdj zANTHxwfmuhDkkLw5 z2}5wp^){_Hb&ZA^xt4~5d1LU);E^>vw!0Z1t+iFpkbX0JmDOvNhPy~poy z#CUnFwmhLee0EBi1~+*?EtrDiIZn@I!crE^J!GnpI?h~*sBEsy>RKYAc0Pe<8Pbhx zzd8@ms3-b$G3;mU?`Rit2OOnftn9p82d$@ekHo5Oh8uE^<@uzmW{nEbxR zbICN_HKgaEtqD${oD33@+ z+hCZZ{Dz$**@6ashn>$bZb2WpP_>`TPRyIao#_QpVM_iDl zV^+Xvg9V8L6R)y}X%xF;tI@g;CVixyTC;C>avaVmH_3KCs7Vmhrv^7j{E?yfa&IG+ zy1Pg~jtMfyKWKp83|Z^WF9|2_a}Z3011hhsFyX+I%{dxLVsS`3vePAt0m~{rFPnWv zKVJt0#!etTk?QrNpm5X2jfu)MHC~>xp_p0h=`HBdW2h?r&WJi?bW7~Oq)mF_THBUy z>>@*vxOef$c>LrqGevV#%E8HWIa513)?7}aNY?GJi9DhLPEEkZZB^Ra$|NqiW{q?D zJ4FO3LicPh%dLZOT=L)5-0deZzY_RNc&I$g*5a1OpIzJ4`UOeOj%{p#%^6Dtwvj(n zu$QQ+VQADhbZmC|K`{95{AZZu<_%z~6?YxqkrU{hmJB8a++{O(xaj%__;i7hpskRWC>F znuHpXesEOK{x$Ba<_~PW6+57nd2eteI=-YMm4ranEo1_z%%QkH4McgU*2hgu@6R2+ zbGUT9X7A;vWjUagG{d&W+mE}QIErC$Jp+=G$*|uO#%eWVLQC}$uSIT0@v_R&c^_MV z?LeTM{@l4T;A_woaB#6TZi2v|X|yIA%a0WicUwAJ?*D$=7fM8OVd!r0@3cj)>1KGt z!?@a`fawcP_=#V-`K3~xkyS&!om}BJ9!b%PY;|wr1<`(2-X>w9T_|Yh z{%QjJh_k^HyJ8VMxa;8I;&=dN><~*-tAA> z<3L`FZOhPI%@Zp;4cIir>;*M!N6XVTzJw{URqH zs`^iA;fMACU%q!(DGhQ8Nw|O!`Ea~eiN9A@8zw-mE_h{wqiM;Ib2Mtvgx1wsXAsg8 ztn5^sNYye}lUoJ!HpkJVA1PsRR!-eUYT2%#crQVM4;}?yr2TeJ%i ztqX5wRh!AL+#h$^U)VDzO5*-D=1icofK6QNG_$yo&F_`w715dcBBweJ^RFVYc$Q*+ zU(R!~HA$8xKiO`taR?8W4p$!W8I<~63&|S=jG5z=V?)S5%y&w>NTH)Z82^d4&`|B* z5$$p26f?X!rVRvq+~G2e6%^;M28w7jHl#8<{~if@5mH#zlYQK%QxSAar49& z_H36bXMI0|Anf38w0r4?LgI#Z44>X2G^ozuOy!uit9d>qJC>!2mi}om-hB)DEY0X(j*GHir?nm%9f7>b!*|%CGArViIoN9`O|ZjJ-%a3 zo$Cl0kXCBx>c6wagcFQ7Vp+0-aPx_Hv{xiB=lQfa6GtF;gNc**MUYD(I$ZbAjSk~u zSvJWm{8q+uUm1iqTzYzf7c@t*TWCF=9=vAI@!y!L$^{u0;W+-*s>3+_X|!!xntskZ z*R9-yH0`BwPmk%(X-|o%szHWbS1Wic61U+VG7B<%W47zCYL=}Z$~MxilA%4IogDqm z0|jMG+A^=D#osehVz0H>b=Hlofz-ZJ{7^ft=HK^gyEiN@s}c zLaAgaml9Q&&R(F!)19oEt@tMdxP*`Qpn5K&LHYOXpJXyVB>qMR6dLeu3i466`E`!iwsvd+!+cA z*&Lr9GL0FAC3PK7;$EiBAEL6%m7myQ$6{P*c3DxO4J zD)Kr4dKgW9xP-;!PJJO?^uspCxklk_oz#bz!iuRN@D)2H$KVSnKMXNn$Q_xQyF)rlTnk6?B-uhm_B_kYuekWCG0`PsT51ekt z5{a=I>pL%28%tfRS%Md8(!+>4!)Tf(Z#@1Q7kK43UiA`SZ3%t0WtH+yW43hPbDGJB z&>opy^6tb>kj*Py?w2GP(kV7hf^2AN(#;;O55W1>KfKpy!}Vl}GDql`wo~zeZ_O*} zJ0I}jL;j}5t`;xEv3@}kpZDe87{`HkQ9ZF*KYt#2L%Q&|!7ui;IUK4STcrML+EIR6 za%S4P;?{HtKG*w#gpb$&kqec!TBEx*R9+Fsyc`tcb&6OeXyY;wTiB!)b!Jx_r)~v3 ze{J?>VPDBIsdV@R>&v7E3SnqE=Ki1pU(uA0)9X|H0Ez=hHB`a?X1L3Pl~+0%@MG=4 z##GU>5^J7g!(WXhnpHal=4S}Q*&+CvPTE$tE!?e#<~4s-cvDIM8|NILsVo9>4X<8&YDY?lS9!x#Q>EsyMA37r>&|hPu4A0qAmGxNzwY3wY zbPo!;6%nuqLG8Z2ZR_?DESw+s4`q2hRN9*G4r+(Dx;qdesJgM;==M<05t9#5(^w!w z?5LXu#1`{jIuHqAo-?e`=>}`(R(X!p&(UOmVw37Csi6iWCG$yXps6MWs?>SGCaKP% z8!HL<^U9HlVpwG`R57yRtkXAxM0mQ3R5u#p9|05+ZhY3WOkJj4xwi8j6nA;BD1Ka3 z{DLz6bD*J>IL>4D<4-5@vC=+Bu^hLiq0pzU+H@D(*I$TdCp`|u+$v8Cc)tSW*VU=# zYjRON2+$vwWO%r6|GtO+fK#kGtl>5)_GfD4%@U*F8Y)xFvOFFx$Z0Rn-M@5wbw4aI z?b6($T&#b@qOi61PAer;mfqoolq-Zd-=ENXxH=M{bLlAOE*x2F1YX zlYk?7lIdl)-xbCU4gIrlX;&3sOCwJ8@s{({GgO$SpqBiXM} z4ncC|d%~UK16cEVh^rk*Z@NqBw8cB@n=v5h4t95=*cQ!{{$NqH2kv1dJ#1Sq%|AlC zi9>|^&hB0`((QLTLA4*;P@o6YES7V{Wr*loozk(Kl}v8nZ1k3=d*pd|O!;;Y>8TNk z7nxcv=rIdG%5sJxYRyz+4u9koR8k);V1uFJ?T`$p)=^V+u(;F+Chg5DDan8@jW3BB ziR}$Cy2W3ibVBd6IN5idrAgkX{*w3&7eYt4#`Ttz*@`Ve!TlaV`Lz;pLGuZ}B7Z49 zj}--1z{z`5sBCfRc}g<1gA(-IHHUS_+@d!CXwdKi*$#sNN@k0E9rAL7 zvQKHLq1gs(>#TV3BF3SYQm{R}n~orJ7C#CqNI}Wc2&AMc{}MBv{anb|`PpMusB0gz z^5=&?SP(o*2EIkcUaM!U!w*jccB+8Sbb5oV@w>a6#VP;6$kH=uHWX>QO&O2$CdCMk zgfCi+xEWZS8qj-Mg>sq9*?GQmRfCqK_LI;FhQ_$>_~YhkCwv#3sppW5#cwM@ySd2t6oX00&A`&;d$7t#3txq86I{V|Fru zPnm*{=_Bz7+!fIww2ix)QZNn=ekj5u#>0D4Nahlkez{tP% zajP|y-O1!9>q_enE%J86R_7F{R#nBxwSry{UA!kTi_un`a8O<4dtRS}mbI~&bU@_A z8pG}T5k%$<_dI%>X4hl`MNmIHZmHH5hXj>Y-+2E5kFhfdKzD&<%rRce*WJ4oj#*>%9P5d;<)&}Ui zo9yWcq;V>B6X^m-C5B{h^X0RY_;bRAnJlPQ8!opvdcqODXfN!Ge`W4s4xwxssl>xe z2xX>Dn)9BsGPY_DnM~ifnP*cYA(M~I_+(bNU;g3w$cI=F zoYVsWb==rm;$h~AEA%Jgfa^_^LWGkbk-xfhMM`^Z2y~ZDMx1SFVi3waw>cI@W88E) z$=JfAIQqZ^>R{P`kJvF4npm@;aVMJCIm+1C6kf1MI&09@@z@mD6*p?)K#D-s8`>uu zgZ+nW98Hc@&-4VQy$vGClS_tMrpAhB8S=y+B$Q)s@S-=r^3QUH4@K1UUB924HYd_i z_<4F%PV8D#W0WO)+xa?4Rjp)R|MW4dkN!rGZS4D;-+Jt-pp1_Vj)|A$E3&BC$c1?m z#T(|L7%W-_memxcy_h~C#(_iT5;llt@#efY!7rkAlYnmiM!QaB`?s5x0=i18Gs&X` zto0zn{eo~el4-8h_jsyJRg;y);F=WI*fQ~)n?g0@nhqYki?ak$-ZB1-F!Vzm$UmN` zW;NjyD{q3noz^YsQ<{!W=K`J2YR}2>J1SHB)3{Jhr=-!9JVNG1;Ztku&UlhMJ;f4` zsoV`^YZr3snv2q!*f6`Qauk=2n}_#Xy5eKTH@o;hYeap-_WvC|R&c6mFFJO(Lg#>g zlcUS->7osNsj|^&GYqBXl!Y|(6$=^3>0jAsVMmQd$$F$9m|rxm@BI;>$?ERXaF{vB zuJOBP3f%Mb=wX?l3h#x`+fGB7$0lIaB>kQA&;1p>X(_5!?CnYuL^)v-uf;B-DUU0{ zgM8m9y`NBTa@>toS6km_Eu>RIkjCq#6H@&zw2Bnu*YU74R)wu!$A^4Yc}jr=!&6TH}sW`MLCjq+e!IFxC8A^ zvyss@HX}H~)V5@~ZM+>LPR17sAT>j)50n+COh?=X0#doDTn+LCe{g^&Y|)0O@O$3F1r1zF>?O_@_@>jaaLNH4{9`fTA3vJcXb9G6~AA?@;xXFFo2beev(ZC@L^R&B? zrpILr5oNIX)SE-qtz=-9#iE%D>Q#xY)bj`}OMp59Ad1bT$~vreQ4%rOtf`E%eEgs} z++Cbs#r{RQYvj%-d8|MKw6@FL1ev-QkGv?D;D8MI2S_5@kp$ITyY+_(8a`$qk2Y3* z;40Gwjak@rz5P$LkcEQ6fu={LeenHQilF(3>@N;E98B}qN__k5oS5XU8az{-gb5ak z5eQBLQhA7O8)Mc8l8h|4o-wf=Kd{O93EGaE_S(qZC7P;+@|`SkUJWIuW|WsKO2?qXaq1nh1Bc_1!Lt{3aRy&@q>ei)bg{G3RCj=6i zBB7(%GGL+C^WUQA^1WrxAqJ-|1h~&yD+CbP%d#G7npQL=w=1-Cv>Wo^tkDX+2$n?R z)#VE|8V8(6>X-XekyTLR%f~nHupfX4%CX^__lt{*-oQ>zunB?DMH^(%4*=Cvx`ul- zv95Axxv!~~f8Kzrj!d}@$woXxR{7=dftLrPgnNez{|#(8CiTFdj35!Zd25lnv87kt z%ZLe$+;*DAM${~Y9XWzEa!Zn;fA2rPB@26088WE%!zr4F^~C($7PyaAxeV#eIJG_q z&HOT&WC7EL2s5pwyRK*r-N-Y8nx zFC>$){saxX+(xH2O)lr%^FpxX-L!;~Jn&|RP==1Fp>&_B89APboATHxmwE0_=qai1 zo^`x2Wvx#zZtILMy9~O3IzrAHzyKOEJIPm8mnqXi#O!75O>+%8>pjyJ+DBczB19p`JLB z{)yrXso@&`&BLdLTlPZaO*a>FF9W}Bm}0cwC`JDzn%mkqBOR=e03SMOkvQm)foR<8 zDYuBQo-UcMbPCkaHVrC4PQ+$WF>O>EcUfZ9;dWHgr@x_f;I7a<3?9%Dau`Y3o#RAVExM>1xi1s)KWw=_Su5Wr1ol7W;MC+ z>EFlbwBb}X|A_mkx|6xS8G5$T`2b2L3O z`tl*mC;IkFh<_kQLdyH!k}&5iBqq#X4OT=~C`R9tM#^`aohUiDR@khG5+RU_D|qJFJq7Co;-drnU*_A}NLOSj$Rp6MREt{>S(Q$^F z5XJmtCFYc3q4A9uOZQPph4*XK9UUd?TO-x^7_Rr){wEpTD~uItk9A!vLY=Evir|fo zzLwd|2)ZMuYhd9_BbQ4fR;ZQTI?P=Te}+>Mx{cS{={Llz>QzK%6m5mC-eOaXc9Qwg z0(98)nB|=pk*k5GlOxbdC1U8bJYxpbb+jA(y~ZgPaEwj!v-f37l51W(#B%#lK71Ti zM5V}W+c+YyRC3W2ujfjVe|wv}epUFSOfz3Y?E`!W3Lj;|G@hchwbC8cV96( ziQG^)_5I1lBqK>nhrREweycFoF@D(I0D+jIcA%)MA8PQl?$8jHF6h#y%DJER{QK#@ z>uwOFr08K`oG4*;+0j^eoiBpz3hfTIs|`hT(IOF2?ozHI ztk`=lCCPT7W7L<5t(X2GPKYRu>eueIe}7h3KbrhgKSNNMgcyyTARqe@&GQ|W-0Y7R zltkx{sk8;!A5coo??XnMZnMjGeJF`^aC|%UV5nn1j`pKE5g|QDFt;||5lDr1@MX;` zgOF4IG~l24dUB|v*MtyV%uJ2PN+bEM7|YfgUjDh{G0*BtLC6+q->-mLeQa;EVD*OWdzHpnQh1OVtFcqQrXy#+Z}?;AVkyr zt>D}l4NCi&CDAiB|7o)+Z*Lp4k3^8$ zAY+Y2>0IzvYH!17Qvj`!QP9jgpgW{#Z?OT=k7pOn0B_yF{)rc?L*D+i zu44!HfA~zEi^69REZ(>O{QAtRbCqxI^Pj^Jm<>!yve?6=rM%tbJPAiMZ-MCn zV($)q8#=<0lH%DCQ!?npTV`4gTIgA(!4zb!S}Ssu@=nb1*ql@7sGc(Rn*%*E>Gk*mY2m7vKR zFqeb~Vp5{(j&vL0fdskLSrbO7h2N5qc`YyqUKax1iy3K>-4uoZ#r|~^ zg-PdKq6nP_e(y~D;z?`k1eB`;gJFpAZz;g6jXMJF9tWUL=X;wW(FkIye#XYz+nu$@ zR7H3wN_vV;Jp3E+SlJ4_uJiz0m$4u&uGNlS#xmD9+wu!EBdi1$nAfbJ0K~j+BX8v^ zwB3`Dz|N{vZ&oRo#wu`IDFVw@!&DmGT7|3g11LqMcGeP%Go_Fp z86RXpWg>xyFLkANas%!=%}R2VcHch9Ito~W%Hmp?niXbM9Bnulo>Z+;| zftuj}op(Qn&Ya&mYHtxuG(_P55WhIZ)s1Ynqq0PEUW_0rBA#AB7n>xYy{jS_iX7qo z0}ff0gt!DdY+P21&gF}*_{tu@uJ~2!ta6N>oh`{yjX-VD!nOSMOJOYzyg^!-QdZ3& zgbrWYi06QrqL%#di%f`YT^VEQNo}YcCJBM4P8+cPd3R2b;3`wKP2(ma3@7*PJhvD7 z>AFZChD3Q&*Y)|CMppK2gTCswZC&upg2Mkj_j2WI&*fmJV#%&f-vRygWzi_ocsb|8FHI{NZB1h|bep1r!TW4Xg#=CrlB%4K_0gZ( zPYgZyYA&@u_fXYTqtt?}$u0jtTaWc^>lK$zI7ASI8!9XnNumD!09eEp6r6i}#FR_ZUtZ%dpSo0nQLr#0MKMz?7a z2Ii}1E2XIIKX?c#s%@_ZoQ>||K&cj!E=kYX*{P*2y8?ci3|+!AHBw^4*})cR1a((e zCcdS|$g(%7t6o{z)iA1phobf@F5(!0((+j zw0tBu(UJ8Xvd(`htJK9Q_d77=JVrBPg!PT)52bvAi-1#>IS8(FIxEbxBHIO!nFs-r z?|L_x0Em@`qDgj8u<(-S7|*T}Y@K72%i+n%@rEGc<|yjsb2P)+hLR_GIHNaNNdato zhMZAql#|6uUjpS_fi`XmNZ3VI=^ms~Mx1R=Od+eTqxa!F#Y;%6z*efqfb1u@Zs3{= zA(koJmFI0(L>+?+U-vs%s95)|&BQ@fW{RH&{ZcXvaJwj&+v)D$p|ib+?ZHSX8h4dk%Wi)k0G!<60*a%^A6%szMkyhCjWr~aGNawY2Ewq;ymPnS zyf4l+pk}*My<~jHTsm~1Jyweqj0dhLgJ)jmgOs^;#%uW8ZD;L8EGfE{-cJ9ad=lbaS;h%`Lx-+BXfa5kIqWtz_}yn z2KF{-X#ECHVhe;km>wH|?^_P{(2~rIVb5 z7(_=v8J>vTCEZGgjC6INa}W2yU1AjNw0qW>y;6!$jE}gF9wLzhhVEV)q<#uZUVO0Y zX8Zp$@?ZAjx9g9u*NJ%g{PgR`Q3U?H{rCIJ@83^L^o?s*$kb;^yfz)Eki81PuZ~7{ z8-Z2@$Oc47!jWLnJskktFlVE9j`m08!W-WSg)XM4rQj)z?$0IOXP{rXupdS3LG;lwH7$J>O^>*D zDa&F0Vj%~!9SRX~`E9fPaqdYLPPeB7|@s(EZSgLnryGi+L}EAJ81>1$WU3?t`g_BY7w z#dqIrCQvwjNZ4xaR{?f=E{5qAP)8t1S+QcDLFl*ke_2zJlH!bC3yv9pmM)r2mg-El zpb!cN6IXd_F@-_Q%7Hvkb;Q6>bbRww!BP;@TU2<~gTbrkOHcc-C%B6n zhSr;(H+b`C@rY0;Lvw5{yIb#rQ&-l@@qk%(DKH-M?U9a94q(%Dr!#M&t$UVqHfM2% zJZ0nD>8yhV^&6rV=2kYRqYMq z8v1#m?|2NG+e;dTbWrRBX12Q9FOi zz%7Clc7h{n@(~dviI3L|k_u~vV3na~sAtJ8om@n&-Hq7tWI}hD-A7mgSaVVL(sj0j z5FEneevkG;W!0>9=&Ed$Ug?S#Ji2aDS|{f#O+vSjyonF_OjMbZIg^Ahpi!Y|>wucbPModmU zy(pcfwLe^Mxl@25e~0MsCMgkDx5G;lgO&13=ZmCsBQYbcv>a?@sy&i^q7LEKUaAzQ z7YGv1oUoZ)Vo~g*P3NCFOvSfEw_*@kj9jr+C64s6l82H!Wg^tR*jAbT$N#_nGxC5d z&25{-Bj98W>yDBFKXh_y%?zh#U8&WQ+=>IWF^4CMl9r8}6s3TDGk=>D&ei^$6=)?P z&8D)H?gtsU5z*0Nw&E8hlXBN(-c_0lVNx4m2=;3vkJ2PYM67Zkzy~h|^u9+uVEsJ0 z17gFd%Q`JSDm=;=L%qRQA33TVqpa9a%&h{R=)~$iwM&wm*i3cx>I~Tt6H7usk64|p3{4B8&zp`d4vo~Aj29JW-?$p+g<(o9MyLRRmDvhIX2 zoKga+xvVf200BE13@*sl%j+T3LIY4$Nj`urL&kVKJ34oU*M@QYXh7CwKOu1`-~n93ZBv9lRcO_>ZB9|}wK};U73Bq0f?PJ$iHhpGYX1v4B|43= zBj`6p5u0rEvz1Zq4oKwMo5^J9)L&}!7VSEc|Q6O|gV^kFYaQ=YLD91%(?7jK}wV`5>a4jmK?ysF_E&mzA% zGut{xDbzwOk3u_;R&aUL6IkuRNa}=$#A-NY7J9@gPF}61E^PD4u=B7>bwkJA8GZKl z;$TDGi%j97Obqzl^s+{F0%Y;#{ITK3*|;=-d-rkjX~^lS%cxZ$izEk0lvU&BRN38N<08}j)g z%D}}Wxs660XpYEtyOr&CySQXD2fCA#I?Xf7Qy1vD7fFc|C;k1S8r z7Yq6OVxhQ-F;G64(4WzyI;?_I<*iXC#9&3m4a!d5D~vo0r@sG!<>mp8a= z=fHdAx4i3kq5>l&m|N~-cZJ6Ls@g=}h6Np=L>;l@UM_IH1E!W0d8DKkJ{9(Rd`FvM zI1i5w2~G#sp{9$~^7m#|E-|&xeI<*=1s%20w!GRG)tE&7dHV9Yl(LDn!2_kE-;+1=1 zdT#F=! z@TSn?kkmmeQRy5(A3ql@;B47>7w7ihH2%7y6=~4$7xVw~3hq*O#lv52|4`{9>(m)T-gsxn1l43+qt6N!$;x1SG1>M>AW8aF^6}Ms*d+9qKWr- z=KI%6lwk@zW136>0g&l3)>w1aa3sr@RW6QIg)ARE;F`SF%W_X`d3nv#c_~_8E27Kc z1pmA>Jod}Rg0|1AbQS;_4675fB6`~1)g$#0gcEcR*mu9v9(8NvNL7~Z)=C}>J&IxV zIV~2UB!1U3^wh(JW=AP?v|!dBF0CGvo%Ms~T_=-?@9nY?oFZGNz|g8a5v$zYd)9q- z3feoW8q4uE5SY!7xif5_rzBVA-1WnQZ_tRcDk#aRFr(e zI%LnlE`UTvXEkX7>fmUr*nY62z=42IU=Qz$8V502UolFQRSU9vMOr={WqJ9+CLw_} z4;l@Z<3t-`8bb@Keu{@HpM(;7*)MrQt2l5SRQyEmhu>)zxMgAnDR!>gZdj3o=XD4~ zR9<6=b9`uVKv7RXRbAi&eo%tKC}VH?=7%d+blNa+aPZfTdjxDiAv~JVV ztTW2Z*lAe9wxb+6VL&3KP>>E%s;?Nco(>VzEsC}sZ8~Zc;A*N^*)kFEB%{tsX1~xT z2x|{6F(Oy>g1wt?g)>*$9U>aD5gBgia)+4mA7sd1YfB118=-1g8 z_SaV(-Y-@TyGaaf9DBQLf4oJILZ~;MF`|_bMujZe2XB4}>ISy!M)+g5TYLF+_VnXE zUg;BXaR>8Iw~KzCED34El0*L%*xajnXLPytzowzGgPX5xGx-`gg@E=_8l|kLX@FKSzttm!f$4E{?7nYH)w=5~P3jy|0dwtrkCY2cb&K{h9UAGAy|4%q1{R!~`<<1cPOWT}P*v@G8UVRe zz+57&_IvUBcDk5Q;82Q+j(wy!l_dsUGEKT}p{$1Zhvp7h(^LR)_C8636$#8cD!FT? zmCIJE>5eq;+3U5G*^=+VoaXj?^bjaCk=kjxvSeTrWtZwAwp$hGA?E)A!DWw?0bE7W zH|U(A5N0f}PVvP`Z0*_wb(BB>JENuk#w!TN6Ej}bi=_u3)-lnP>C2X^TiQ8_V@7SU zJCaqlxbjP0NA!}WCJ32}2MbpKL$|3z5kIcP9d)b@mBGmOwT3I()|KrTFwOb7$C*d@ zJOWIzW21odd%BYY^TzTTm5(VH^)92dHWpb?+2Z-yax?~b$)^b_SwK|ViA7qo2T&p0 zZvhD+1HG>E-)r0JhyA#Ie75xas2Ahs*YCf7?&>Sy-$O9?vF#6FmhUucVFl*7b7A?u zW9+e`;;*WJ7ljOYFK&lPA}$*8QY&5Enn4uJad(qPf4g)SIq4O$nbTp5{*pFXm6x() zW|xvGSAs*ECCiOSz;?y9){1BR^Ar=FeuLi_Kbt+8QP)JCj6aj6tje53Q3W@xND0%) zlLr9A5G{wE5<+dJKM&O{V-?Q=5*m1F9>b!MhYw6j9Ptl0!EhKT?ZU%_P^jUw*f`|o z#wWR8d|JWXXBR}qw}cZ7Opj00iKZa-N;dBI3Y*A zVse<@jV&@FL&a^vdd$G((8_4= zg2iXD)(2C$j3ZVtw43tEzE)Wd*72qS70a$e3$+j~p|v=qp$%r*g6tW#Q3qP5o9C88 zsN~ctS!wV{j+R06&MK7!?dNxI_BMAa6I*^2CPH(8#lVKzD5YN5RHRxdA;54n$)dusi16gR%bP`EJbPe0YfuLO#-32$bXpcU`iVC>wz>+dG znlTb(nzV<~$cCu0!Rg|edSzBBOXq!w=tsdy!9(fVXpcSD-VQa(E^`T!0!IvXq zq*Dq?NFja3jJnw|4fY3vLeGD%!DruHKW-Zx0?{=s9vMi{1r{Veag_pKcWwQ-*nZ>a6GMqs~ZM*2(QhE(jDVntcOa;E|Lk#j%mpoYFSG$>Q3qEBfmI2gliAc zlE^NDvfVPH%4{#Zc0UN|vdEi=g~rT1EbO**_DuUt#mIq&G1MN>O(V$4tc5Hw0;Sh8 zv?=;|Ue~^NJ)bEiGg@ufXpj2%TN)$=U!2mr`%6npXEe2!0wA}ME3x<#F)OEPJU#37 zA$W5k+!nvAsCm^VHF5Tcqh}`%7f?p6b-~pn4%u)OlSs&|S!+6J`8Wc%=p8&28xq)^ z2lajkp)Pw&Qj?6VzhbqjX(=;?i_>lkM4B{ioL3LJ@*3Ty%joB(Qip3DbYr~*j1{KE zk)<-(MU4|jTR7HU-MQbRAG7DEP*gQok!x6@p&GbyZhqb07jUjFTTHClrxcYm0q(X9 zTx})i6&O|*Lqn5iPiTx%avJ@yh4ojAkvwpca_=0bo!3zC&~Wv&{*o%SY0K5_D3ai_ zqk}qfns~HW2@I6XXN38{1M^s8U=OW~Y|5F*sW`jBVjqQn)D7!AQ7$6W{&0a5940Nt z`XyMZIknxHDdk;v#b`N00+E!<%^-$Dx<~g?7E5R~XS7(tfF4dPbi!?)B4s68`GGN4 zS>T%Z{#L~J7^mJ2B?`uecJo5apGTlj*p!MqEa0EHaPerL3~%88k2yP}_V8U$0C z|DAxQz2FubIYt8d10TZCvGh$9;8ZzX(M|z0Wm1fVwDY^)qZXta=9jaQ)&dDw#q~O$`6&io zr{0R+zvAmFxkQnY{Dr9I4k-y@&c)G|CL)y`X0+-Av|Z@Q;1YIAIGWVA#^4k$x_fx#0&Zn^aMl5Xlr1Ez8jDKF zyFBe(b3+Ykp4q`|_JCX=Bvdf%F$x3^*;D3?pSyOt=EMN`roUD_Z8>aYHRS3}sCsZG zx~ji1J&?n~mmj&&Yhx?o9qFx5!2kGp8j9Zdk3c`>>@ZmssZSDv~+8w<~o7UZ&LVRUPW<2T@ z!~&f!+J*h;VPb4BXU+Q)O3)G;CabW! zO*M;3k$qBteFye2r{7hQ(1Y7n8e!RpB4Y#F$zI(yqUg?$2(aIezQWO@si8!h2F7Jk zH341Da53$Lom7x)yauv!7Sdx(riAFrA_Jhix=@$qj>h^Y>TK?xcMl8&o$q{g>9#Lj zA~=w#D9ypPnZC9*7in<`#rROI?l0aqqEg(Y-^O1)5d5%|#W#8N3&jq{bBMZ7ReIQa=;UyRYX6jLf zyL^i!#s)dSF!*1u&%nFwsNAuvbTS7Q5!nvd8nFhOJ5EpWEk8`7?^R@Y>fP)Cf2X+I zs5O549@ms4t(xGcqqfO+WB7@wJ~1zZiTJtl5_-`K#RbqXAJzS;^{A+pyCG7m(fyGQ1dgT=|ph zm_U>$%F#)$!=?#U6Wxij`M`m<;J_dqC@A}pUudO7Doil1c+(Yj*C}pQLqG<8My`X6 z1Q(k2`kGzV83D2@nd9@kuW>%WrCzJ-T+G$%sq2J=n?MC@1lH+Ky_J+eJ_q63_MlTV z;X<8>NYTD%xm6vP5uA|hooAhpftq_54+ ze~GqRt5ni~^9Ju>FSS?oB`YU`{}rle3T3IB^8(W+zzu)~3*&D8;C4B$1W$&w+9T7b z8)?E>;w}|!iW_{i+}6{fYc^zk*+@9vzOD{8nf=OdzL~$oo_|yES37W~vkd)5wS@{6 zO`Z9}?yn80I^yx+_*b1q`nBLlau4ZMMatK#zu2O?@>RZLb=ED-;(5Q9T$)2jX0iAo z0A7Oe;!BN(3Y)oBHKaFLf@|=nHPml<+1+X+bQ>>P+URPaR)1*gVk&tOHKS8a)T79K zwE8pxOL6s>p}QTudi2f|^{LvysD5#Nd31Kp_yrwHu1s0;!T;@c0zBKVQ+ucFA$qs% z-nQlDcXeJ@QQIv>qkU6L!Y9`DT8g?BP2KlX!q`xMm!>gkQpliUc< z#i>@SCS!OjC$>7}yA%}~;b;%rGnb~8cT>l`g*c<19rCnvW2H|X{q@v}?aY<@ z6l~WEkwPUfdad=K?@6xnus!=O!gwwb2~ybzSfFHe!{$aD_M+)jyL~8So17a8oFL4i z^bzvP8DqdQ%-L4~*1}#`YS-)#{An%P(%WcSdN71f7BS^x0XI&c!%l(|4Xm(RAJIk%`jg4w-M&AFtNF{2aa zyGs2~2V=y03@rlfp_YPG)U6>Y&Xt+&N*hx=`Y_228L>-NvIf7q7U;50;&H`rkd;4$ z4adhyZ?6yINq#oZ7M$&Xw;LiLwgir8!5k2-Ap;HQ)GI4xjJ%~2$ zF-;Gd{8Y(1c|0-F?ki*>h9(PKy45DliVLXJs2V?eI33wjLVMFdPKvBg0dq>a)RZ^t zo0H-k(B44`F7c%+5jz0n!bz_By@1&@K5E zZ`Td+(i*rx($yL=wC2mRX41MIIX~Mtij{nJEj&k`LYI zDLm<=l34Dx@`c}JYbdGQmJ&5HQnH(*^zx{HY;In=x~02>gh~hSVjlS+ zNxYR$oXYhgVWgDeN^7h*0W1oS*iY()#>^fC%vFcUw|9Gtxh%W(!2-5y(BVM z`}B}zZ&_+ecbpN-#L`tcz<4PoMF<-PKUy)|)T%IXlBWNRM`$xg1G^_$C60ybhUWl0 z!Rec0=`05&MI-d-cEtkB=}$#=echw4O8YS{QjCmw*k@HhOGsSL3FRiE%fPf9YiNa* zFp1KcEt8D#iyz^f)sB1=ulXkvZS;a-%lPzM$)(y7)fhgANjV`M{hgC286{Dy{f(@z z_GT{fDs9Q^ATixYC>v7ic-STmJ#-@_ukj9llhdIiT*nppRiu;BFGq4iELy)KC|lx$ zC`#Dggf0`9+Z&+7XNR~La1wq;vD9TU;-%TzQl8aiC&_&cU#BC`xo`G;j(Eo6x8L?} zzrB9!*Xwnq?(l@$eEqzCer1_?`ZS9XTV}{3#P;VIo~`#fgZbqD z-4(;WX#FW?g4Fm?rbRuhld$Nd3PqdcstFp^o5|$%EzSED_a{YsSHkY%qvhG^LZD5^ zx#9Ru;M?R*>7;*T+PaB)yeWOi{MbYzRlGsDQ#0DYE<*DOMno%`CN;!Al34E?+JfI1 z4`LL?;RGxbtzLC=>%E;uxQu)ex1>@l-IOP7Ua^;D%O$+Nb8{&;#Rh-m9gaM$1G_kE z#aeh_*&6ijdFWhv<+Mpf3H*eF>)if_%m2Io@~{4<|Nf8v+uvRP;eXxte~gzT%crHd zxVnNS^OiI&n|;Q#vU~#9b;%K$n(x&~zGw1&E@8`BJ<({`;wd@Dq#Hj&;26x&R$nQ7 z<{JK|TCUamYI9-AG4=y>>Rm!-$X z@(aJ~T{LOUTcb4@KwETNw#JTcs@j6RGLK5r#%#>w<>Td$K~0cG1VF0{_aRM3c))I8 z%m^Thtg@#@RsM&Is#G;Z>Ud}-=d9>#zB0-yL&y|Es)O>N!wzHkA~~5HoHjjYcv!oW zl5j~|M9$qCdxu}do|qMQL%;XTC<&2VjW%(OLKef6hqQJ#>!e_|!EQJ@>VU>>&5~E} zh-c`cSW6;`ImTr-vgw12TlS;mgZQ$Mr`?dadhJ3eilJYchU!LG5w!ORGSNS*y=2VI z^l5_f!XC0==cK8PROadou?4l|AGuFl&{0Qycl8;%bIdp=s_63a3OUFHlHPsNiAS4Z z4H$hr$n`N`wc@j{$Fps)-e@72(0p|xz8S#{Owi()H#+(XF}$agZpIw@l1*%(&n}ke zD=~P!?Bg{QHXKoQ!54tkVjP|JXv>{mh-}QL)Lz42{z!(;-gncL!X!bh-~b(SDuAMg zkfHkA`aITA!mKPQPv@HIrN(?s!yCFoHX3E#Yd)M3h|EZZ zp;y-amOT>qhD`(QcEZ>X+q6;|Ep-QJK&?E$9qiKidgSG3J)_LrUfdCZgkc5wSXnMi2ef(@tJ4NrYBThQg%Z+|)7Fqelig2F zzg*|Z%~dh0Knv{^0lZ*!wy5mJuNX}s;Ga6k&EOg_eA}S7JYEQ8c>9#eSa}SfTzGgA zG4Ulpxr=t{7_raY4c*&DQmB%?32ZCCTTFPKg}(KSgC6d%`^mOMgix5Jvp+bGtBm-n z1}*i6liIhU{L&MAArP4y++%JW$W6Gik?{I~ta68o($^Pv1mA^3&8tmItHn=^Uam}1 z7M0=Q<)8%X4}!UyNvJn*JG-Nf3~r^IzLRMACPS4>pf=AuT$*VcNR)%_T8)VByV^0!(2< z;vor#8%ZuxZPS}A6Tr*0uK22^OFV)z1A2s-uoX!vdo)yAHypZ^cQVgdw5_B(fSl+P zu?Fj?WVXUMsyL~KR(LcW_P*cgsDh5sZ7m990T3`b(GEy-4!PpcM#Qs1NaV06Ur1{& zJ&F`69TZX_&bD-l?!GI2e~aPFo?gDk%PEVeKc!Ngx;0OH;@Xeh%9_@EXHMAK_ONRT z@Q%}ms{C4`c;bMcikg_?;Q)gds%lt|tbzUJ9dQ*8G=MuHvx8I>Mpb7cABe!`6XE&{ zX-2V;Z(pZUXE(cc2!#J zIS#}~a#DF^;{Z4QKU(G+G2QQ@Fud!W|GMnAAN!B5>#u$sXOYhxe7)o6&-b5x|8n?a zvtpI`$ocQ*s@`GwmnRqGJc8{koL~0;u=RGkvL#uTmQAzezW0ffk(F7LXu2gNZV)u$ z4R{#dqhFvec?@oN0Ion>w`e2~5*J9#6{4x1tjvfwXK(jqHd!{u7}Ly8Q5l&Pabo|t zFJH@S+MHv2qjF6*eN^byYlNCh?(30oEd7!%`7%m_IdlkZ%@5huIm6B?%u-+K7>1|; z`;1o-5%eJ?oQSso7z!`Uwn&gOYu=J{U(wJw1_$C?6Gi4)CJEXH(gf9r6yAz%w>} zU=ZGfoI(STE^%v?B{6`Mdn_D3@mDe z->g+ZKE^aP#&&xyxw?3VTiRM4-L7BP++IZez6C7%OFFTHU>q#W#^+)PPEn%ho05`m<@hwUJ zf-;G%2$Zq)GB^iP{LC_OZvLJmVC=-Ux|uM39PrqyCnMfF)*xKly09Ol2K#G54}WCm zl4at*7Df9o4ul>}nA5J6n$ecoAzj^t4ax+9iusBp2{WJoH#KQaS$GA@$_SkDBQtF%#%6`Okv7x%a{F0+)hNSWFH|e5>3h&LGg20_tmtARDIk3LLSp3^w#-sF4du19NHOVC zoiXW)sIQtQLQ2D^^%2x9rS63RsA)uEq$?Hv@%Yr8w^lM5CoOb&uCrI`38zF&ZT(KG zv~59i${r-v!8ZKbO2^6Ro@IzgNumOOTEo>ok|LOHk{@QnpaT97Rzi8{>Mw# zgO{yRvd;P07LT-eBicKxZsW8q|13Yy{9omQY$xcp`Ja5DqIUn>k&EsAkoulxq*vZ{ z?1uWS+6ukpR$FR$$u8m#jJfjc7@Qk;Q1?I_g~gVvb86$8^(}tVv9k}i1h?HTxiPgi z>mg$T^Dta@8ZHAr%G!=zd`>>Z?x|_x_Sc*j!F9>VtqTt#I}QpRHOMnzv6dgf^~owv zc2OC=O16ooA~zK}2kO412w0C5`4|)t<5y44zLDGGtc9aB40TKfj|xH zrMgMYv|34ZD@YaP@+^s$!X%Ag=r^ddx*(GX6+ljr*Q6bJHr#)RjN)ZigJq;$!_>Hr z5e~j!pskO_R;cv{WbW)|nFdDktM6LjTy%tNgmTkLraGf5HEgvzV$$TzbbBw)R)#-U zv5n-cA)mz5hokDLjIrjZR<@G5q&0__m#VQHEOjR3x`|`GmhSnvwPuWMmwJrHCOW)~ zW;^2wGtn;C&U&iPW-q=1bgx2gy)#d(PxmZSU})92OS2uo7Hj|v7v-vE0zkR z*W=}n)u51#t3td=&Q^?GnV5V1O`G#3+!d6BAyj^3kZj&tZ6L8lakZ*+jAP6d!;}7% z7>2pVy4kQq>lZ;#wGr!ha`hH+WE(J}qZ{g7TP}7d#e+1L^>`p5+Xh1$apEq~H%yz7 zLVA{&tm2St+afp$#H3`h&32(&T(N?Pexv}JASznS2Rg*dn^(_$^+ebpgEMY0uPb4! zq+qF;&RdsJ9Nedr$2D)J5UIBk+27rjO{6qtJ`X)b*BU2|3@iA-<;3>O$UrPTeL?J* zFYmyc8NPC=H&nR3E{pB3N8|1j~hjCJ`8$CMi-1(mCrVo)e$}kj-=cP z2C9lK4X;KG%9_L{QYg%i4L!6lzxL8;QXabDh~17Mu6YJI%YQZ`5;N`6aaW*`1X)8` zCS5HLt=*&-mYQHRuH&`(3t=Gonl`$qtcs%I>`v{`T0A+HVCi5Lw9L@8L9E>>F_OL+H*@suJq4R!>X$dIS#_~?yRILhK_ zrQL5|3ZfY|5KRv;k<4SQYZ^Jf%3ylX0Mp>nf_A=Dwtz7qzpb(Z!Q9?bO z6KSg2r(BM>ic&Q{&RMWo6(2DH|vR=aX3>DeNL1}QsXn(~|Kc0>90 zcsx%B^ltq0R^M;;`w{H681S6W^7-MvTwgP%myM8GO!W^sTM@`*p+I!WGUl&ob0ng6 zjW3+i()pOAuPEB*Ue+V?GmUU1Z6m7-mH7h-0~5zrQEyCCK|`(9WCY9|H_|3jmoV#q z${|C1)cra^J?FR72&VBfYb{496(8^{$zWkAbYr>@n+dP;jBQYuRgqeo_hH5N4!K5? z=^W$#YxnS_Zj15Ch+Gz>rVEJ+^kk5iW{qfc#gC==B^uS4$7%#x)n1rT*oB3xte?bn z4yjaK#sNLrXzi{8iJ1f%vDo)9lm%ymA7;64B3_Yk6NZX~)JDRc4wDgGAQmaV-|2si z0Gnl9<+O6h-wZ-P@G3?otm@WlXeXOwWdkDea)C3}m+fujqR5ht}ZhkNT`|2GP~rMj@rnBxjcc zojmZLxG_F!ppW>V(3PupA#nW(2At5LU+S5Xb#|hWmB2I>F2^z9SxV_l~ z&e?<{(~?ENKy%f={^G^WC@z*f3@$n&eky9*s?;SiKDayA%&!;;8_2W$()=+Fxr(jK zS@DoBAv3?{G$%+5Ig{Z5Jcim%_yE!gD=%H$i^#3?!B2^WE(NxbKo9~>et>3Gf{vP| zkH%T#*eDHFmbI=Uz_0iaeprNFU%m@9#C*Ri5{_l`y6Z+-=`Xt_Wp%Q4(WPe}%{7S1 zxED~3jC!J!&&{d^0v}9rguIP|J#88*MfHeQRN-pgz&_i|AO^rEt~Y zz7xhKx^S5@G8e=$oql&|R^A`<`JlM420#4U5Ldt|8eWzO4elR%E@dbEV=l z)%|G<-$*gL^Kq<%a0Sv}BO;A6)51N6i_0x!E1S??93d3WKuA0ClUyMyFUmnz!#&>n zIm*}u+|m(LbeY)pHOU3a8hnMKcK*|G)^L!O?DKUpqBXg4=W^GHcGCV93#4pz6oRQQXrV%KB66U_0TMhK)^T(OSuJZC zZNRj6hGud@6jG${!d@D; zwTZIfOF$E!mZ}b>Z|OnVm8wIBuov^6XJ68XhOoA@l5w<94B%M0bCHWu{2oI4K5Pp* z$XGg_YHMQ7INRIJW80*3bKaQ79||2U%GB8&)uk0Bs4k?e+hJQ*V>kL~b#+DWF4J5# z^A@}g_oeEzTD@#8_sS!PDMMrnR~rtyx*Z(>wVR$=DF0ZfTj*gR&`VJXhpOs~YG|Zp1?(J z&{TeD=Rr9rNk6RGF9)Y|)Kt#8t>Mm;@X7g5k4hJ2r0qm^U_BWo07XE$zrDdogZ+?G zxbEP}!S`G-)Ckl`=oy107EPCCD&|~S0QAYN(4m!JMFrc!I@;>cQz8cA2a|bXmJqNd zQiKqRYs$(#XP8Fpmt94&q4XFzjg6Vq+yKtOZV_*HW=YwoGv%04WA-{rVXAe-u`c4; z8L0qA8hTG$1UqK&TX@$Xj!Y>DEhM*$J!0E5T@~C71HMV%7ZYX{i8bHdwo6t_M5;O_ zd|0cTk#Zm^49}QBB~OjC8*Em!mEg5h6 zkuCQt7j zmB7&yWrx4S!j6QX8qM>$xx@DnN)0TOEAmCHCKFwb`502Z&eu&2a6vRY?srNHWboGh zL)H1>V8wLq7}-Kqd~+!ZC`c|I4N5X5un|X}H~WToPx2AfozF~u9_0VbQ&qRnv6v_h zli}r&o09OVq8X>~la>@Urh;(>Gl=JeQ;Gqm)MA@LXDWt5(ft7Y3#-D+z(V`{R_ps) zyUxpRZ*BHeO1qYW$76hc8_#DyJEq^Q&DO)buNs29N`KCOgGDQ%(5}nXD20lo=-D-m z04wjwgmXy(hH%k3K}d~){=E4Mo1M7RLZg*WH0NqhBXy=vtjExgj;}}DP<&BKi?=U} zG{&eEU_kX8wHd4Iqw*SpfjNSkB|?KI8v=n!{ltt`A?(eud{-WX=m*Etq*H?)YbPGU z8QwF5s@CX00u7FXeTksdL3E`6V`diPl#J`>rm!xt&eR(pB$dwwP*3dvCZQRTH(sJW zVhQgRybs;+ zfOUq=&SLY6L@i%H8!g$GW>kSDh?}cLjm-rwX9g2KqY+~x;M?+n=tDI;ygj3!;*(-x zB}6SkJ_@M1G=GHf#EU_Tb97?sU4sYT&ORN$U@UL@R710fM*lh^TVD>P!cwuRTH_NQ zA$LnB=axf&Ly*AZF1Dc`Yxo3h5Tkff=U-Xys>IjSNjvhH@U^rYwX~ITlUt~pvv988hJtqmdR&B?X4eN) z58mOkKnO=mYnj|eh_p7NN@?EwnR>j+l`}0I^}7XqjvSvczw#Rrw}V2_Q73XC}3X3=GKtCwU+f4&|(i zTSnZ^uponul`p=TELNP1+~GB$?x!&=|te<%_Kjoa8nHqnX2vmGQ*qzubm2q9^8g+dO?%aFoI z0%CYNGG1Vym0SsEqE@wV1W9@|barbV8V}{kc3)EF3NlB?;*SGlHO_>EJv8<~IkMoP zeQ<`CdNifW?3!9%Hsus!72-gBN9Gz$R_Xj^n1d6gi|VEtDZrO0 zs`2DME;t{W)9@hW!^x*M=ta}6UY8~WBp+_f!Xr5{ zZ{Q-_xL#ZnBkvqD0Dkh3ZSy8(Pt0?PP155rH}M0#%6wv{Hx~l-IJhI=a$x0Lv-MfEMu3QN&e@ z)@UJ+EP`|Lr4GhW)j1(0(_D#Oj?>v$;iG4sii}*2sYuPN8}6;c>!Q1oT)NW9O8OdT z{w%3w7nhX(ZVx6+n>3o}=oY{w0=c2lrU9rS~-ojOU0X9MUA=lc`G)>9|WEl(KYoRaqF!^4Pa(r=h&!twM3y;%o(Tw%8#9 zBWAvogmEtbp_+)FWL`yU;=JDfb^bx9fibfkbMyd?RbQu;E}OAb+=WR#oa5-T61Tac zl8yFHvsGNW$N~sOYvF$z@cECJztRGiF(lDLoIYCgvV_5ULftCU3?jHYBkM73 ztS#mgvmYOCYMN=_t8n^>qt6zrc+318p*(4t-v=sTH)3nh{nSt%WE&j#jffQN=>!1O%W46tyvRt3YB@WyeL~j`XCC zNW=NQ6m$r23dBW)v^k4+(-Rv8PdG$W)l;XiJTf(<2dWU|d>N3AVBkA#b>r9GE&;-ihi}$vO$BpZ_&zOMP~XY4tdK4E&g*dM4*#-#p zjs?lamMXMh*TI2h*i*w{S+p>CW089h%>DM4%x+sE?~>lJ zmSYu#2GLH3{p|48g^?0Xx@kKCkaw(HV=r!q;j4+)kZa9X2-AFuWBkyLOl#MqA@1iI7|a^Q zOG7`izYHV*xs79N+A*0-+!oRtt@`KnjMk)DMvA-SR{TfdWy$C{3WwYrQ-NnQ=BHft z>5DJ>V?5!wJ+_gFkb3pymA{yxlK04Xo6QY5pPeK!ZhT8DWmOX$KVFPYbNP+gi3JoN z4)4%Lxr`c)hhlLQTy1Yqyqr@sd=|`#fRivLnk5bwQD{4zPK~OLMx0-yC1`wD6*b3k znWq8h*k(0yt7az3jspKN?f#{CM0ssp(chudiS$%FNsk7)hi$$NJdlT@lxVQYN;2)w?nE@-!-AVwk1X$RzFGQibS$r;8j* zL&`s@pi1+!$!l9TOH|#v+O}COZN=~q-)bo+;PB2W)fH!VE?z)A>1GCXdT!lKO;&pi zN2~HTq#X|}!wqn$V5GUm^sxe;amUvBfVyZJEx^+QUJVRbm35i0lpGRn2YoOIcEnGBEb>GTusY@k-Fk_nXu6XPj~VW z{sqb>ZBgsvkY9aulX!kxX&KOYxFwH*;yKaHaAU)x%(4fdE<9j1_S8UG8%P?%GCQ0c zSkq#>U}DlFk@W>jDz4{1Gc0$2l8?Ruj1}!ft3(2ci28yzWn$}!XOoO8DoZ+vE9Y5c ztec)EdOk8ZaA~KGIat($%2?=YLl3E;tk{0+f@QVB#?-?oKpEfJWbIbE9l)hxh zA(%P%kZ|(|nH$WJFJIbq(Ei%|hL%noW;Fj+?=InY>_+tBYtSksZCnsO$kK7puySO9 zlp(x$%o`w>LCNc)O(v&Fi4~|HyS(C76R5G2A~1!_%B#DOJIZ^;IYsp0K@=K`$7W>y z48HeH>|17TTSQUByd>-tMe#Q^{VX=*-n+j0z4oI%e|m3!yl&ypZCwx48G7OTBK^=d(Yb^qUL)AGmhie23H57%Rn?J^OnL zc)1@x{qFj<+gw=j#klkpJI*LVj6@wgZ-)3Oy)rDs6gliGvt24(>GC%U(A>Rf*sX*T z9?=FnJGoNv3!uC|gdkvEQFVoe!T4Hd$GS~tm-m6A@9aHxnlM8L8d#Qr4Q(j-q$~IX z!9-~BQ`SP1N?qh^C#<15s~a@m1dcIC|1)_IH)N+0qC%NJ!sdsWA1>T{CdvU%^gQcT z3Z0|HN_rKfFc{AbPlX{7l9eb3He>s}UQg@$+wJ}B{d2ZF4YvzZLgt<^IZknWzs=VZ zvU;SzR$2==zyk!g#%!RhVS@F?-$tb~I#f8J1~}%*b_`6|?0GUt zZ?2w3m(mHGPTCt`5JZO;c+aaaiHJa^*VSMZvk}V#MJCqJi5jPez!25wco7H-DQx(; zBA=4`()Hr6#d&t82h55U1CG(c-AEKc%>HgQlAo^Ee3h8(cKwE<_1QhXA76g{I_Ix3 zt9*>J%XzPdVjeaIntKiEXqJwqaYZPaefGG$_DPGT`^~_JYl^+Pu0(5UgH)tt#$#v- zY* zn|F-_w3N4^rC1lOPCXrU{?~heMvkT_>m71L$B5fkr!7OwxkoY)q+%i?pjbSy=lJa( zz8Cv^e2h5_N{-aEe>?}V3K&z}%#OEJff*I zd4PG8jZLbj)gxvvhm~howfq&<*VV9^mo!R3^w~S~6}E*Zh1d3+9guQ;xS!9dt%|z5 zd_GwCAms&?ks-fS4a3KESFxCnRTZ@ z=;=Q9ldwc|@N=24KELCB%=yp|l%C!@4w=i9NnrF!%cUMfB7Ya0OaqK|!(5o68gMpb@ zGp(dA%2^bKJ{i?mAHqO$3TZ=Ixe|;Jq8ayLxR_0!EKUtap{=vy=)sDrt`>i+oQ$DR zKM!Ag)kW?*TGO@>&Nk;Lslu-%{gf+mKz5du7ONsX&Sjc?QofNsCH;5MTulqk>rkQO z^Mr$6R8t9MTdI(6 z6sVfhhQzmSnV9x+iKSiFv;e27oDzvguu}fqGIDSv-C3TMP18v1#_+UMm~W2cMYh?I zSzAuySThr3dw2#0knAzo%1G-UkGFEWu4n`BwB%PCm4!M&V`U#n7xF(fI954=&6~%Y#;JIsKnmUyTeEJ%8cD$ z&znrpDzS|~V}R3(vd4w}(ST%A2|)LuU?gx|oYI6CenWS~s%`;jE!kxzQk8FYQWYqS z)+8p_D`hkhn$V{yvzz}S`X@lZAn3qL&f>(=k>-F3O$edOf+r(iqEd7^4;r*r`Ub9B zj5%LOOfluqRk&XD$D@GqR7U22JM&$K$nJCe>2+KC^_jt*U96g+V)?R}7)-91&Eai3SUTQLc8&j`rO z0Q20b)^1zbC|!hLu0exnN z0Osua=mwo9?rlq18y!gpv!uBGkD=2;lX6fo=J`4}N>|;Q{lLNi29-1cx-@{Vl6jv& z@q^pVDO~=b?m4b$hhCQh*`d^F*VHh2QW(ArOu^`tjSk@yxeWwgf1cwXi+?=*^Lc&W zX$IjcZtKbzg=mf=IO~k}&n7)Ko{okQygUOV`?X5PV&Uwd7j!^FIt|3iV0^`F--Rn7 zq}glQMZf-n;+2f0L6wc;C+A?-)jT=;?l|^OL&<>c1oz7IWlxBw=9>I=n?LhY;UbLf zy$VTGOT%UQQ71OBjeyZoW6fz{muL`=KLOV38ns$?V((G`0XvWPgo#F>k;9aDe! zy277tc565L{_(gDbgfpbc}>xpQmu4z8|r;sTJrlWdXWP-z5W zT-=wBUOqM{b2-O6YXaD7w@8NlvN3duHP71@@ zt$qFJew*FI`F1`&$DjW6_A=tFT@$B4~iCg53>mF97|jwl!yHUNd?d(D|n1 zm*e(`XHkWY@mz$gpf3q9?}R*#THEYtM(6g=v%7Hn_1ojyXSu;WUWIBM+G;F$s9p1a z(GC%hhwqyzxii~YPHt95EKf`y%gDkH!6H~B3j@*&D;hSYsVXRP7e;ajNA=y8K{Q|x z*CKw@TYdld^zYx#da(0`lrAKL#8W-6G1Sl&;}u8esZVk6d~snLbS(W*;Y7VK(q(O+ zMiB|(gXua&XnM#xuJ!7ixAXO0>M@uT(Jey~POT4h+i;s&ToRe$_;$cXeZCz*-cm9ekUBiE)s_ zWg@m%gK|BBoo3Pb=+mP)zi(Dya?Q2q!G*68qac`vVo8NxX$%PrX^Z2aX`E5aHCF_J zqpN6D2gRYXzLE?K)U2z@7-Skm;XjWnGwaB7+$IPc0K__!@L}m?q2ujyF2%?A)9qT= z%U}NXo88_#6Hw$MwMBLB6|qWF{z&Ftk*?kZKD-vZXsLBTv5<*p)P~_6>4$x}R>kM% zBU2llpdMtc(dpW5Z8q3k$`zmnECX6A<`EsTWde+fI9beVnuGM1xcK!ZVVZGeYez_{ z%of+{KjSm6Iy{+DLkN7H+^sp~doExa7*=9QhYhuj!5uj^DEL-rybo%AFviSN%xo%m zaF{yo$5kw!{i(4|j5SH-Ygf&7y^i{JTy_8X@iFV0i8}0-2b0>%^46zv7cHa4y&^ur z=v4GANxqOKWL2ku!A8#w(F;QYlp=G!tyH$qq0c6!f=n~wem>gmC}*D^L0x>jo-x^> z{fztnxne3Rqo~Q9ou^r}(fcwH$zUSkO;|e4lhpT+Zp?=MFMs*x|Kj)m*?;;U{@efU zAO7#ZdzO1+V<@(ZFrzdUb9HvldH-W7hQuJvpTs*qi{kR=O4M+Znkr7z`a*g`aT{C5 zk_ol4r*5!&QDe(fr=!?wUXGGRB)W?+NmacG3GpapBbHNPX5%G&$Ed8G&(@isjiq2- zji!~3pvd}^h~mg0J!671Gyj`Eq!npwe0`ddnXiBV8=`(0QBGxhF@^KsSt0V19UD#8 z7YS|s6~8yu<=9>_cnNn`6;+S=8)E@B0_sH(s&4X;Su;yET{ga!^sL;VhACzyR-C$t zU=cFd6zvm9xeHB(CZ*6v3-E*+re?%ZdXPe;z}sv?8%9#gxWzfti{ ziSj6Qo2w;p&O_S7)UjocTY*OI3wl;}yyPClm2VllyS}V#aI?fYG9z`YRgP~R`rWd@ z@ybh!Mha*fTQ#(B(;^4UAn7m7ug9<;sP}Zq(=WE{e;ormu;yBesLgVI#GYDI zKF*S0NVuPmr*AwlXG%EaD{<{0%qpho54{vrwSxNKlt!C=&+<9Zjf6=Pm1fLZ$G9g+ z&JYU9H349?1TIx@`hZk(J!7D>aAUS=NV1`&^S1}@LZk?abUb*hPu#HHu@q)G0HoHWO>7K zaUL-3MPn;QS&*#{QLdGsrmlZzVSR-i#r0tyVNJGTXiZ$+_ioP)$+95cX#fD42*D<7 znpJ6=hVEWv1Pqtq$8|$H@NSMrdN#_&5x480(0~`MN9Pb*7bac2n}eY{k|D?tgsR14 zJ{6~DxYCSLkI_zJL@JefkmFf$PldRri1hKCyN)unSS5v)1rvEbg2Q2|LfcG(9M$2l z4)@GBWo!)){hHj7!CJ|UbcI1n3=nLx*w3ktZc{G%7~k!@`SEy8k_Ym3AkhUzn53dP zoI$fX$Tw0gOU1(Eb6RW{pFU)mrm!Ig*8*;y#;l?tFiy~goY4mg42$1E^-ocs*nFFf zW-D%FXkj|bW1!}-qOe*Rpob3jJka>BiWnOT(vIN#fi|q?i0pG5 zTUyZY&@WdoA(^37=?G-oEg2a_P>44h>V#EljhZs9XX_cMShU#0`$YI6bMOj@t8s(5 zr4=z52cf7%)z7-g1j{XSoW%UA2hNd&f2`bi*4JX?$kUx#`DeG!(;lZ!wR%N#)yi0O z2`r>$*7#CK=^DTUyo`SKXfDki?@Z0L4_%dcMpmReR;JFfQ@5_oI9ZjY5nzUgnPVPa z*0{OwyanRx4A#oy9M7{~mCy8vo@jgw_PtzY)`-FyVu?6cygpzZK}L=%XrV`}5_4I& zNxO2KrY<#l!46Ecld2W%mp(YWo;Ao3H_c%8P~u`A2n~*pyF2K%gKV%-$N`(K(X4L$T3+SBAucW+tbka? z-BsJ8KW7u&+W9g-YUhH zd2*B3h^Pum{9GbONT2}J>3KlnSr!_nfF4zf15`fZD;rpxHYdXKYM*E4CL}{A)CA~? zxY81VVghyzh78{%VO4F9I2Ul3c>T>Y217pWe3h8T7(vD?3;0JY9#5BxbU4h-)>nPsMy4W;~3MRghK1448gcS*X?^gjxOq=G9f=3B|qFmWD@S zsCSQ^M~wsUK<$;pHakCSIJaTqA$3OGi0k?=dUN5YwM_@EPfJuwf91~(ra*)uk zteM2D-s{+!=`SOJ%E`+0l+c1dvL4R=lYuu$8hUC^1bzg8=rcl@oFCp0#w$dz(mbA~isU)Qa8+7jmH zx0e+s`O3a8FLMr944dL0=(HM(F`Z4+DzpIJY>&Q_WvkT4g5YT|$6ED8oK7}9)cDI9l_X_xxkVAF2;~a0!*_3Jg$h&4st-A!x05fy@bHgydub2$f7&?}|$deAEK$(rEa0(i-i zUAE6_P=SeaLF#{Y6ViS&yNHM>_09Bjm&vRu1I$Y@jyQcub+FYHy@n4C;@V~_kSWtp zeVZ7{4Z{1RkNqZIxb_@=%Pm`cCopZVodmtjDl`CkaG4DV0t#xG{v!f==5UA zS*?82ENi2170>*7xgZL72!qFZ8aV346Dwvf0jIvJS$+9&LM&8tTpKQYiD#;8F*V7z zQBKZLP*laT%+n{?>bb7FZz1ihOAH{|K_rYV2Fc672zp-#ep*dh(TW>i>{FF%N%&Y} z16vUc3Pkj6A%UR87xzb(G#^lHeY;mC^K+KK{KccHqrf)MGJ?cxcWUuuJY=5VH?j`q ztnI3dQiQ^AVW-mdq3W22W*2ovxRZr#OBplQ!;-NmB?A|7uNW(1X*1uLUc91kQdz&< zC*-RTV(kfEk@zAYr@B64eQK0!TPov)Cvu$DVoX6F7fn&JNl86C)G*kZ;bcu)y4`Xe ziPkv6_~>-4aV&un-4(2u@@pwHbf}}RBHiF4)5dt7usqc$l->bmf?-MQ;gdT*pGw1*fNq{x)iVM#ew!A*ywy(TGI0h>^Z|9mQoHF1SF> zrCdo7njwHlY|NZR(;C}K&&N5l?GvV^u_i~AR&u(N;GCGkRF~F34mOG;t5ivNeN&n$ zn>%MoOn~A#pe1Dq9WZE@q>U%Hy&|m?m}VF&pg_s(L?OF&jPs`wGs1c`Dhb13Q*0A_}9mBWH z$dJ65o%BZK-4H#KjimGm#jS0?sZ-1=?Y8EyW$jAJnvCIG?D0>m2ol!dpzFNy=w-7#CixCMv zrem^qx60pwJGlk#RHLr&NixEe9g=nkh}- zM%r~hjcD*8R|-R)<}wCj68eEFj98%acF^3v7FhCy2Fzp_hgBn99zB`hH}uw@Qy} zWFr>FikXBV^I5|z#+$l($v1^TjhC?wg*D>XmCZaX#8VKc1aWw1J8jP$u*memNA9Cv6(ZdR=; zliC5_@62La5xGc->r_PsL#YNT4-n-7E}q&!BH0l52{IpntPXDAa?W$h7n;wQmjaw} zlQf4o9*W{x&|LySRAVyGW1t&lYgo*kpK$V|=e0fd6=m+I`~vLSrG9f4Ep4f|Kv zacZ=8uZr=UuUma`Q`ogd`=|S+xz?D`5B%0diJ5V=fnbCKY2X+ zL?GUe7%0wQ=%Zc#IKxQhUqL~;{_XW{9*@WM0*+8dOfu8$_V|3vXL){z(a)SShUb(Q zTkWt*%(8fX%XIS0XsCJTzTM{Y^zr#w+x)+C4k9N^tHmV#(fil?aV;|+=Xn3}*86!~ z?smHk!$RIWb8XoNy|voW;|r5n4b^R6@aw!Llc9FFosorHKOYatg94`(_S%^U%=9B7 zdV+(-K#1&(LMH(e4c5oVh{;nnpa(4Is~qp{DN@Um=U{RRXU$aIAx<>%W2DwvxdSqB z1pGb^RDyX^ixgBn+k)wbWk*s)Qe(KvAjXy{lr<-F6^dC~$xO&WjLrW<^Bu*k!4sUl zJkJc?lopOWfQRH{z||F}mM-#GD1|VM#||Ctoe0Azqb!?ze7-}TaDOhzE}g%*M<+u? z;z3`HC)<$qo|JzSj%{LwdEQGUn>gk&45MtBMcDkLPGvgFi#vpRp3BcvPjTkyifvZM zFtk+&#~Y06g`rkT8EoKVB7(c;u~4HSonk<(>@ka`GfO?CvGH{V72I7E5vL$dA>Kz6 zXhSXajX6H#;(qCw4N3U5RJ~j`LL%ev1iH`BRzkd6}-~8@*+Q0w%zx(+7OF4e;F&7U-apMRzih+vTWT2cHWo**; z;j7I%>KYocPt!9Q0_3sPno8(!t57bg8W6gXX8;0I))OvImAw=9nf0kp3qymv6%Mq-GTk7wguu9<(%hx|G0daNVdYe*!(NG0ndVRyOj8sLa20Xi4V~ zfYuz6z2vkPMMCaT=(^6;%APq9e(`vlicEC*#-w#i9_UNbOa{@W5u`GWi_d9>F5=GA z*U(-L?~)9(m#q zw1(6*p0PXv4_X;At5fQ|HC2)>$<~HjUM)mk(qz6SG_|Bu$kgDo94NLld#)RPUs&pf z5~I9##e~E^4jyB;##TKSfZAo)YnA^@pHy9|L?P56N3)g`DBlK3dOecNgGplgM>m@D z%-6WL=F1*}&goI|-G@}<{fa3dTEEqn7tj&!BT-!WCrLQFYeX)ZC87Oc%1f`YQlv|I zVX1Cd?iBSO?T0~;5wDyx*P7i+#m_KFnRb6$xwPBV&W04DRpBR*B!u7zy%lKsI)al8 zT5@9U^0cos`yVKC+w6)N0yX0S(#?}0P~yUv+3r8ZTN;B$=)tqB))2Iu)LLQiux%ni zOP|DQ)(rpQrKWc#>#E$+8LmY(>mrZ2Elv*m{^}ntUK0n9`Qg{P4XyIP9OpG+^%+@# zFv>yxVoBfbno+p`Ol2FR+Nv}xCuEze31Yak!nnVzlIw1Ba_*K{VY^l&maaRSlIN9N zzqmY!Y26}r!Ku|Lg+t{WK}lYnDK*tsc++sXY2@)Rf-ceW42xC8Imwfz6g?MsysIKL z(xb?f02kvI(v`K(8X5GGrSU_RK$}^R-S@buif~gvu6uf6$hgAr35RI3P~0|ZpRI8w z`dW3Y)>?{U*vrew7H~G`S(K>s@l*O(Wl8WB($a&@GB#EYHEWt5`B^X@WxNb&M9kUG z8j08t{fe%CykQsl{Uu(?7eEE27B4tyjaHWaV_4Z#9Euy}Z=fG((CwFDHfiwkL=?Lx z6bPk7Wlz^VX^#73#?ympiF4#V?z<#f=dINT)LbEgY`Jh%V!5JYVtPGd8`52)rZ11p z8uXfy2vUdRTZkh?JGdFD6jYfg<_H1}?!Hi*`Vb|k;aVgCxTQVCRQrvzIndZfuSgwg zuQi_Q%+pAmtMtb7&i-HBH5|K|WBwSBizYAq^fW-x^rXNa6i`YL(L}avoV=oQ6%Wnp zCgoTN#-!_DJX}+N!ZaJUs5vh5tv9|Q4L%4l{;AAa-I_?Vj`V2LGQxo^sZnrou$W|u8gEEaj_L-MkyzJQiL~7F;}$!|351&? zzeOfP&43kZUUU|fT4y<ZD(l-7GDd=+LX z)^s?-!*|_2Q@%g9kLRt8pTF4O{O;`!U+Z)D_ix9a{`~y*%P)^U(d^+wILa}b)Pr!` zh-&bBBn3@H%bF==5xgEiw?Y$X@?F_FLt=K!>RakO@yXA?j9{8cyOI0b{A;>KChDrG zae?J^3~G{DTE!~ea5i<0ekFqdb`)pIF(NXzAb_fB`W12ro5ag`7xnbJ^3XpRdxYt) zq(uYy16C3z4(H~)QkdMAkp+zTGIP5GyqlONF!z!lqiL*i z6b6t+wygRkr+Dml#1*M2NRaQEOPu!%%Bx_vVaN*CoK+Y0mvI_#Nygdxag@LL!_U{J z|M!3X?ep~GxFMB*XP#C&!)E3UH!TTm1{}u0h+kN_s8?udw+j_8|Qh32kS6@zqjWYpO44e{r-MCzJ2?4SbKZBJz|=A{o32@ z+UzE(|JH6FpO5P?e0#fpKAzVPxF7ADRNs2P9na_U`k}{+R%r-LzBOw{!`N?5Z)Ypa zZtvGu&T-6r{)+3v_4oPHK3lt8U-Ep+zV_|y&99&J_ofoUdERcvPxss7alOB@wtBnOk7vK%Z-4l5|M+g1lIitQpN~hY_4tNJbHgS=B0l|h5@*r*L%Ai z_mk}6Fte_0#SxJ1zE;tsWinu{8S`tq03piHDC9a6ZLI+! zEVQ>rtsRFn_WN>3RU|;fx2z+m;P6;5#@4xpQQ9L2GURYPfVQ4(th`9`_BTx2y(HVb> z&Q00)7}?^tr6$bm-(9T-=YwzU=A~RMDW}8apxSCQvtHZf=k}w<+;xs^wu`)XdGne> z7?@75gWt;AU;oel_V51n=fC-n|JmFB@NfRzKYsk7{`ALdv6%9=62_hMiR{a&thp(Gq zfvu!5SI*&Kop|U-*8u zciihMi3(2fvLbMEW)EI8Bm!OE$fnZJb83mh(g#<|uFf_U|E)04bq7DXy*$Mk#IR;> z8_+UGKP%wCw+yFBduSaDVah&q-RFWikqSdJp$!`gu51EpBfC{1SzA#8%Z+5T5T#Vk zUuAQ)&0>_}UUukGHtq8hSsk>wA0t8g>QF01W*h8^QVA%#U zE-Ty83bV0}BFNUFOnoO0ONd&!tV9@p#iKb;Zrg|O4KWb zHPnhL?;|a7MhLK zwK`xgRpQ&0o9U1 z2t{`Hl|q?L;>=ZFYY+OerX-O;Au$X$BcNq5M^aaO&R0xwS62s6dMse$oQPWXRRVzm zN>9hXHQRV)wV`M+Wr2h!y-QsXgb`n(iI_%;Uo%XemuyP!8A=?!kXK?kVn*q1fE2+^ zm;sLTJ#3`!*v2z*siYr7Owr{QE{P*A`xZvyA3O1`K_}a#zV=DWEG4B5*PO}bAfrf6 z7AMg$hCXRaOSr;}GXcx?LFRg4nfjSWVkUTFC1ga+01l?;C(C)zB|j)Rr+M8;d><#M zle)>q;`6f{2Can-HWXKMurlEij7Ufw^!MA*Yv}}HYR*M`aBw$PoN2~`>eMt6);f(} zbM5RULiqHiqVlg}WySNOjRae-Lo)I)eC3!rMFmXF?P}4pR6y+~gAq(FxRV<5e|lDr6E2tn_X2X&R$i)x8ar&MLF$dDT%8E68As zpe#Y~AWxdn80=hVjHOecdb<{^9lhB|v38R(E)TM1V&lr2>FE|@z*3ELiqOr7a>C=u zi07>;sMXa==e;cJujDi8P~g@>H!NJ0UTOIf7L@`_XvyYJJ1QP__ztnyLer_kx#wb= zN%fkJXL&zd)ojhZ2Y{Mbz=MY7OtcEhQ3QaAZ4wo7xO|SuaLUloAR!UfSL%x_n zrGmG%*7b1QhU=l~hl4qnAUhRsnUI&N`e@Rv&`StdDn+3TV-z-Dz!SWGF9hqEQ!Z-h zJmSJ2dW@$gd4}gmJ!G4{NG`_^%v6EV$}%esqPyfNWS3Nv!gaYS%|FbMbcP_ON)Qxt zl*TokTrM4j)H&hw5)OO@qL8!(q?ChZC4fN9EXJ5L!xr8ocuE$Lr$f9V&;`KK!pe4I zP;bgv`~pUC4rFTZWQcxmS@!2(R9M%%H*7Z^(sbt6na<(hM%9SFkl@3f=f}^#yZ_Z6 ze*XU1|KZQy9y8{4&Oh3`*TW}g8k9MyTpXu*H+%6_FSQyi+B{-kul>vY_IRF;ejam9 zS)S)O=E%bOdA0+N?=eRgy?;C&UyhlybZe~-`*@!B+wIHy+vD?mlyZMN9v@?}!j8%` zo%x83+i|^-Ae+_lj0EG`w8dDstj_DT+;7vA@^-&{|I7Dc_uI9rUw37jui|{pq>6e> zMBDT1*U!AoE6|VI{M*OJ+QF1A78&5|G^)>{`&p-+i#EeFZb)W zeEat8e!supZ~gqV`@K%raIek3yiGazIR`?qv<(0H<;!p1KIcjF>9=V}nnlU=9j71H zI~~(_)Q)3P+3mQ`q`Jp>e}8+%l1u(3ghcFNfROiaCs7@EwJf z6d7g5a~C(kmPo=+3M>R8&+!1_46v}6+I|D2AeveNVtVG*4o_Juv5>v+N{y0eZ;E|6 z4+4IV=V!5-IK8H%Dm6_h4L1U`J4j2oR#dgAmF#O@S*K86PI;@zCR*syD#u2xE9k{F z)8vTA>7~Gn?!HEn15l%E_H7pb0#CcKL+rMqKFTX4sp!O>J!0GGaJuVSS=6!@s@3K= z8HvNXHiN_ccmM0Zd;a@h>|6a~`RRR3OXn$3s|q5PU40$&sY2D&*X<+`+nEaKmx&Uj z@ns}dJUn%(k!(BCkG{Ef^c&IY8JPepCF~I5wfp%PzF`m2>!8l?AP!$5V^dFAQW~Xl zy28g_VtBT$v9ET+QoixGt>APUrXjem?(i79w1l6ar-*bTiLHLn5|Qxh&0$X9I)r9G z2K_R@h{OP*U5LxA06a&2D~?OGCxa_9u4cGc)?g4Z1&?F;$~|pZY0R>~e31e!b5=P; zqKM47K;w0Cb5n4Jt5ItXS8$4%qqwm(4#v>)6)ShmX|z!f14a5-wr~`5EfZvJD>OxM zf;8l>0oo|wWHOGJ>#a^+Tn#LvmR&7J*O|X~_RfkDd-cC<2Mo?Kr;2e-+!~b9O!$&gwWT5)ryr zAp7_t6Gs-QaGAk=ggR3CYTJm~s1PKVU=dP{xfE+$fse78jt$1FRNsfy(yc6ozGZ)x zc2gOE*!-)^MlHJs#)|C@9!@E-(p7d0lhQV#1HPnhYQ+exR8qlT%8zL}3mrCg!`UdS zFVFTtNm63UO$W_^%@<^Ntef>^DAFzM!I^EfplcZz8b?WE2Rt@0mDr^uDTPYGn zY4*hJq=3RUU4=#}rqi%0Y+vC|Jd;$mC3knQZ_=B=G-9{SPbd(&B29ev`+3b}Mw~Tc z4`pNTbjPHS6vVQ+U)+_eNuO&kbxzW= zxN_&S)8nuCYlW0X5D*;p;@@>$EABj)UfOA@dZ1XjP%OmzC zzcgk3mOT18Emw}jG^K!1869l~u$WFR{7`d;vV3G@5e?vLP8vGQ;r&GVi~}10nnYcA zCQR}wNA69JZe@@WvbB*vj^|^>+E-H)TtHTG72?_#3ZQrrV`i%CECRa~&jUudzcN`h zb1T%EbKD`lU5S#*WcjIX3j{$BmNpmCvXus9 zGd)J`NP6Tody1>j;-8KN*glu^A|zr~lha|)G5L`x);QmCWwhc4L_yjqCROXoeW`+2 zQ|W$&$P-~bAt+BxD6tTgj-+KLv7UrR)ltGGn#>=`w#DjUDa!QpeyKf+glQ$pSbQ#% zq8|+QGY&roXI-WYqTwr?lS5SJxOBK;$k9Q=%$PIV!uT6e9~oqXzER~=ISn?ij^r^p zcmq-p@S4zZBfTCcPmcNkZ05c@r38ZvD~>w@tQ0ZN7ztN}$k;+4R)p9NPqAPxpsW{a zrO|-mu2~s!KL=u9j*gk8GS%j9M}2>{FYj+ZwTdP~@8>Vy{M(2B`Sbj8JO7hEzR!;C zakl$0e?{13c-$fvSXFf;PqfIcsvQN*Q(rSL9?XX5d5*}L3Kd4qPfchwrOnayDi76? z=1?;Z8K$LGY)9H6R!|QOFhc|U!jjPVmFG~?nWA%ZLuqoo!6so=wxbX;!zK!S0L)^h z)NtVGr{qje5=HA-vtc?x`;ejdB>js%-RsU@8Q0s!s--45vm#K|S~c|U&lAO2pP4$7t$JO?=kxk8{p(L}zyA7h zyMFGiJw6_9Z*SMv%t7q^)}PPo@?U@Q{NAr${&qXAC-*$(J=`N{t=(_uZ+$%a#Hr1( zPkoLv0%qnkZjOa+_v@#X7H5ZkU6W(Byh=T8_R&Xw%y)3$fsIDiM4ZhCo{#tYtxosM z=k=rB?(OsXCFfkUr;W+Sw~voov)fU>eVlLa_Z9}Qj^&CRrFmWj#u0T+ z>1R;guJUBo6Zh{Q&)Xc}G@k~haZZ-0pU=-Z(}|x;kZ3DvL;z_nH7F&bOJNyQJE&Kx zp2SR>2J~<)fUQ-+PFWjL$x)Y$ld{7~rNXEs6~U!7V{!!Mw{z@mN^e2nlZ-*PS(Jv` z7A##BJPjcfZH9`V<0Nnam6zb7MXFq7X*HW#BUu!aP}huac`Kk}LAp^uQZS&!@?}iB zG6G~Kq;KAg(-6$5D@VhN${wp_zjngOggk1sjpMDWi-il@z;%ydJP;!!mowOO0B6qa z_4U{9?F}PdRx*vbDL9WHh;$C4p@d)tksSpGVDE`1upFjPu z<60hKO%8XdiP8?D2Z$Bu6U=BTboyf9Do3*%PQ*Y7%t{UHLYb`iqHAxQYIQ}hI1#yC z+e+5)iU}1;4`+pjrC^2|9kgKeXkx_5=|Js)Scv<4e#VVvAXoR+H(yAeDAF4plXcE) zOsf3r+viMt5n{@DA-2)3%NX>@N*WK&0H+XDly*VQfbZ~h z6(ku9AsLCj$0h|FXT!0HIaqrP1LW}6A{f)w+a5)vQ;&)Quf54?Iv=3;7$R;Yre&7O z5}oId`EgGUX7y{;HKVptIDmF*=ge7^JIck)bCziHolND`W7?x**#ta!e<``RSi_9wj{A&W^U^K47&$X*_lf4!hx~w6ERg+6?EZ zuqGR@#=65X-Mr(kRjrmKsG-{H`fP83FMU=X{D&UK2=t6=MLr~j-T_gZ*Sy-o z)2S0!t_ScqMtv;CM`;`Ruo7EW<7lWN*p?8R;f7C){l^3>0C$^lxu1X1NG$8>Vu7vfXY6aH zK#k>9#0hHt{Ob^ONGl;tzOCUUt&P#FISDTvTi#eko=isV(I02Q+JX=xV4|--X$^X+ z!c?wTRr4*Zr?Ww6Wn;=^@Ifs3bC)i+z?5#>em32%UbN@1fq(zf2U5NA+%M#ci9@;YvU zG+SL+VgB-t)+A<7ODH{cd=Qm6y8bd&$+)ulpB_bnGI%*z^p%f-LBCojq{tG(>UH(M z?1e(Oxq>LDK!Y4zRhCC3Rr02RNYtbA>(5-X@yA)0#wBgCFDipQ8G^p}q)dlV?hZZP z9$T^CV-V}C5OpUU5+jSnWGS9uY1%01myc0f4QTbSB$=w99XwKtOrlZT(%%hRja@Dy zSZY0yb<1?Z7EaA%mrRBcX@{~f-n{IGn|bnN7H(n#(;?ebCMpT?jV7EJsZ}bG)LIU_ zd!^@_y7iUgf##HHh#bMlt_2Ydf`t_rl)mEmfxj%>*A_4e2TX&GCz$nDa}!MyaD@uH zU{#@(5M#T98FOK5VYQh#oqZv4WEz=9Gfx2{LMWrBPsQ)ZQ1a+@b-tPCRT+rDYC!1< z`bOaOJabVs5x;t#IOnhLBWJ97+W{yl-?Ds^(RS~(j!irh0ojL=86tX*(Ic4lt}Q^6yrmF7!4(6wabj2Ol7 zyN1$hd{MmB2~;Z{zYD0LC<|F{3^mXZ`CAf69R(lKf9a^H;!X1Yt;U(6?A8^H#jz0Q zLCG1;wu~`81i5jVHbjLtfBS4L)X5r(87MxXK3&w|C56Feo>YUPA4as48fL_-Z+;l$ zz*SZmv^U|@I!a~|ncPRkUP3Qx!aPEQI$*2i-X2nwrdTlQ`=ZYT!69Ed&xN*J!cr45Z$S4_IP|~ z961^L$$Jr(E=GG{ot(|3*~^GpRZTIYu5~aG8QY)Y#_101o<~_EoJ1oA(-E7Y>_OaW ztv`EYOu-6?^pV-dVqOu2(vFV*oFURl6LI#V(~8e&F(-q4C>8`xrr4EY3v9-D4lNok z5hDl@vpMA0;t_tnQ8!J2ps~#Nksfso-wM4Bw5#E1o?9CaX;#(q!sP(TZuV&%J?ZO& z`}^O`xy=2T&EWH#C;ET*e0+TLepaWE?>3{p(P{)1>#EwG^JzTdoy~XE8dtvon$QS< zlOeu>6JpL!Xm@3V)g~y9u1E|{=bD3k)F89NyTsP5wAlEdw{Sd1aigg$4xyDMAmu_0 zG{PYDzyzUd#8cV8aMN`a|J>P&plB#8J#4PY;0p0#jBui}V)dL2AlD!fy-ApX@aij9 zt(sAdu{Y1g)EQMu%hai`5qJGG$Ongjn+ukx{81Ai&|)d;Mx%7ybf3dl*Dsl*^Kn8r z1176YtCj}CAuYa^yf}Of`qbjHj%vHQIP&pPMY#czRTzxe+huZMh9=|1RN7=vGxs5l zUJ53K17>R(RTKWyeS?k173gDZ2!|SNuS$z>iFR)c?xKJ!&j}2Byxr`d{YSt5>FxFp zzx?*M|M=+rI(EMuGuF(NWzr&*WnxVZC=7H*$H;Ji9va8K`8m#RlS~%Dy_{=!Jmu#c zlg!Wgyxs2e<)41L&$azAJu$Nz@O+-VKi}?eqx?UbeLUv4;^+7K#F#zLxBLBi zIgdyG^5yOE`Mh4^PhY=$`}Xba>;1Ya=Xq^Dcbgrd+qM1mnMpGhOpnL)mF0fBP5jv? z$MsTf(e1lmTh+MVuhroG`SE%E+cTcUFZZ`=Vg2^;d4Ibf?f%>M-|la3t=7-)kGC&h zKR+Kw8DD?;>3VJ7KR$nYyT9LVzkdJhafByLRHVrqw|M~O#$Mtr9{@vH-35lE8gnlWJCQ^s6o%o`XXGNt<3N5D3pi}_@2bwe^~ z(UP@??I7i^mQm8w8Hp%R{&X!A0VR$BFjH_`^7b~Hr}RbGj><-@Fgrx^-tKerm_M^q zFQ&K;A4|6j6+<$7D^Ke5y^N@gA!6z{t=5bR^s25Ipy)mPozA%{Y51^sV1Lx50Jj!i zlW|hfKQB~|{!;o6M&`5|d9)B^*68q#u|cksnpr}`guQz}%bQ~JxO~w1gcd6X3N4LS zeaeM!#0JK4ihg3C6BuG-zC*-NA)bh1MLmW_F-6OqRN%l|Amx;rf%HgY2P%;b1psg6 z56TtTI9(f_2{-&NZey4!J()JtWlt=CFdMGs;aL7__XL0TLBq{RGT6Lr=FU7bzB++9 zL+NECLp%GVeK)u$KW6?-OO?83WR7i^oW408dfXL&YzQCs@#x=v`@9ylYZ2jzSx|9h zDa1tQ+7Zq|XmS}#ONS7}&{IX6)>tv{RjxOjdv-w+S}|}e2wY7@e2wH1-y8!TO=pVS zak3XTOu&&K0H1xRseOHF)mM~Bx@6L?q(pjPB_ZJ*z>Za5IeMhv6bgt+Sq*p3fV*oG z8jC)M$zP$|mtha{j_fr4^G0&I{qYbX`5P}~j7=CW;TCT3o~)`4-bL)KI_l4H6d`$qq)x=bw6}oREx0v)ZA8_Pq`L59M$6byKNcvmAXIcJ;5)|Fxs)v)J*%~Hl0EM zLd+t9tcaoD;G2(>x()O0eLG()~bDav3@+{>|S&_aE z5nNOX7$%X9v_Rx|qf#h`p60`w%R&ClIiB zk~k*_i^*0AfeGo#fae%T2Uek8rS${QG`{s53!ERLyoI@&u1`xM zwZHI8{irM8VcB4+kjI-eJdKS0{}&a*Y_ceiD@!6Q#6%yKp&+)TsiaR@4&Q8lZ{8+- zG7^a}QrjSM(RPX~Q5SC(LL3DtV;aCsM{IwhrGcS!1zp(7yHqDMZCIGzLB|YBR_2V5 z0|qj}NY(@aPE}Yed6Zp%!!mM7VE;!^3fc!ZorP-~`Vnes@~0%Wnx2TLkiDEo$( zmf;*y78AYuv?LBjuwad=;?@!Cs_cM(gJ`gnth}M5IHP3%-9}ARL#WqKW{smoNL;tG zQ(illcPAbl>O9VB$B(hK_1EEsuzhkyM8CrklV!u7w)%+aVJVdqZhuBUsipLtBv< zHGTfJ%L=ks<)cPMx4&dUX&{YZ zk7>{=ATVOaQ=p+VN2abo zy&pYCG)V_5Dd80sdUd2hC~7Pyqm9m|2@q%**~ir^6$uy_$H)Q>0JUaDFKa;)1x_9~ z?5(D_3+I~Zx$5v!)yztuU|^)8u+gH|3qzEdQs20vb9mEB&7G5xCoy>FNv7=R;Nvc8 zl|dq98RW0q*btND8@Edq#}h@Fj)rSOa1cYe!n9d!=9h#pMU*)KK;Rgc4$gl{O`P~WHQ2E zJ}{jnjrV9JI%HhGsvt&#O4B3YTue=25Z{qYtk-6?C?ghrIR-)W(#zkFxx8c{ohn zkta{oCETi2A_Lvio|(Kdug{hQa)5@!Ccbz8sV<1_OTa)acnz;c|M`z6QZbn5#V3Lc z-)S$X1}RSrx0Wl|l81yKi%1XlV5V(AngkAHe2@s{Y;I?qT&8#ae`LLVudQ2h-8HM8 zwf8>fo^$*5d%Nv+UW{#wlmJm8A*4ur1mGL+58`9-A&^kSKM^1z1W^PcIBo=S{MNR+ z+kJ1}x3l+N&#Yq2sxhkOx=vbAr_VWiul2mlS+i=4-$>HU?Vmo}?%~Vz*~iNdzyGZt zeE0p=AFluQuRi_owTG_&oIv3JoDq|dcmV*9F1qcQ12AkDCClGVTdBwo*dM ze$DMOJ)aRg89idxltQf+{CN$t7a#3;`kHmz-gbQyxqSHgGaV*=wJm>3qhM@k) zcDCxn^^A*hti+nc8GQA;&is#$Z*PC{<@4*(>Z`ua=rZa!&t7D`iO9W03Q3q+h-ic^Csci@Q^f}FP9=c@P3+lSMV2n1HV)@XAK&62*E2c?eQxQnwKg&<0i41bfCgoFxrLJU;099#(|09WI2ODT7;ZYv`fQ zgmcWpCOt-L5{ag@=kO*qfNRn{IG8aXTiuwSO55n%jO95814lh?LF%Kz>fZwS>~SmB zLXT*x%L4w8bhH6&yG5aNJW>s2YOEdu2om1n+g;-K zo*+u&xnRYC>p#ymPO%sZy}qu?7-jspp7Ca%RUTkCQK2J|0v)I{BGtq>JIv4;scEGQ z>TnCbv#zkFF75Ui1`KJXA=vUxJbuxfO&iL=azcx)aVQ8+F%nIjKr`nc2MX2$$%+@j zlZm|aa&=hh4cGtoJUg(pB;FxufP*A_!Ol4(Tq|U6-*)_TEcvqb3cFhz+bA)Qw>y+= z6FTynC=_lfoEgVM+{bLM8-pC6oQf8MF97SyZPj?88%fwnw;oHcr83^u+rw~WZjf+b ze~ri9qG^QCN*jA5uT2b2Vw|}J?`-eymVKEoZy3THI=iHc=XQ|(t;uyMJuw5Kj%aJt z)2w8!c_$*s8FsXpL%5h2p)Zr8uG=cMzUevXb*uBVqJw$c|L0{H?=oHzC(c~)QZ*Q( z`mxx~vD8?81-kDGg@uT}aWy;(dzCbV{D1z^hW{_a}?q9x-3AiJJ701wK8%&p`kjP+M@^0`7l!oXH2bUVV4UNTL$hOaEG}# zI!fwWbhLo}4|E-}ojI1u{6ZνzN5r&~n)YQ%@H9N3-M@6i{6nx5j1JxGSAQmHuu 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

e; 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 JPDHLkV1g8IdQt!Y literal 0 HcmV?d00001 diff --git a/public/img/运输登录.jpg b/public/img/运输登录.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1c254bdca7178e2390c63a6bb46f353ba39560b0 GIT binary patch literal 248897 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 literal 0 HcmV?d00001 diff --git a/src/api/base/airport-master.js b/src/api/base/airport-master.js new file mode 100644 index 0000000..e95b967 --- /dev/null +++ b/src/api/base/airport-master.js @@ -0,0 +1,52 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/airport-master/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/airport-master/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/airport-master/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-system/airport-master/submit', + method: 'post', + data: row, + }); +}; + +export const changeStatus = (id, status) => { + return request({ + url: '/blade-system/airport-master/status', + method: 'post', + params: { + id, + status, + }, + }); +}; diff --git a/src/api/base/common-address.js b/src/api/base/common-address.js new file mode 100644 index 0000000..0b8eab0 --- /dev/null +++ b/src/api/base/common-address.js @@ -0,0 +1,52 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/common-address/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/common-address/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-transport/common-address/submit', + method: 'post', + data: row, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/common-address/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const getSourceOptions = (addressType, keyword) => { + return request({ + url: '/blade-transport/common-address/source-options', + method: 'get', + params: { + addressType, + keyword, + }, + }); +}; diff --git a/src/api/base/currency.js b/src/api/base/currency.js new file mode 100644 index 0000000..adb7555 --- /dev/null +++ b/src/api/base/currency.js @@ -0,0 +1,60 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/currency/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/currency/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const getRate = params => { + return request({ + url: '/blade-system/currency/rate', + method: 'get', + params, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/currency/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-system/currency/submit', + method: 'post', + data: row, + }); +}; + +export const changeStatus = (id, status) => { + return request({ + url: '/blade-system/currency/status', + method: 'post', + params: { + id, + status, + }, + }); +}; diff --git a/src/api/base/customer-type.js b/src/api/base/customer-type.js new file mode 100644 index 0000000..0ad91d8 --- /dev/null +++ b/src/api/base/customer-type.js @@ -0,0 +1,52 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/customer-type/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/customer-type/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/customer-type/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-system/customer-type/submit', + method: 'post', + data: row, + }); +}; + +export const changeStatus = (id, status) => { + return request({ + url: '/blade-system/customer-type/status', + method: 'post', + params: { + id, + status, + }, + }); +}; diff --git a/src/api/base/fee-item.js b/src/api/base/fee-item.js new file mode 100644 index 0000000..3aeec72 --- /dev/null +++ b/src/api/base/fee-item.js @@ -0,0 +1,52 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/fee-item/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/fee-item/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/fee-item/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-system/fee-item/submit', + method: 'post', + data: row, + }); +}; + +export const changeStatus = (id, status) => { + return request({ + url: '/blade-system/fee-item/status', + method: 'post', + params: { + id, + status, + }, + }); +}; diff --git a/src/api/base/port-terminal.js b/src/api/base/port-terminal.js new file mode 100644 index 0000000..6215602 --- /dev/null +++ b/src/api/base/port-terminal.js @@ -0,0 +1,59 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/port-terminal/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/port-terminal/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/port-terminal/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-system/port-terminal/submit', + method: 'post', + data: row, + }); +}; + +export const changeStatus = (id, status) => { + return request({ + url: '/blade-system/port-terminal/status', + method: 'post', + params: { + id, + status, + }, + }); +}; + +export const getPortSelect = () => { + return request({ + url: '/blade-system/port-terminal/port-select', + method: 'get', + }); +}; diff --git a/src/api/base/railway-station.js b/src/api/base/railway-station.js new file mode 100644 index 0000000..6af7c68 --- /dev/null +++ b/src/api/base/railway-station.js @@ -0,0 +1,52 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-system/railway-station/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-system/railway-station/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-system/railway-station/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-system/railway-station/submit', + method: 'post', + data: row, + }); +}; + +export const changeStatus = (id, status) => { + return request({ + url: '/blade-system/railway-station/status', + method: 'post', + params: { + id, + status, + }, + }); +}; diff --git a/src/api/base/region.js b/src/api/base/region.js index 01bcd16..9a020a0 100644 --- a/src/api/base/region.js +++ b/src/api/base/region.js @@ -50,3 +50,10 @@ export const submit = row => { data: row, }); }; + +export const sync = () => { + return request({ + url: '/blade-system/region/sync', + method: 'post', + }); +}; diff --git a/src/api/system/user.js b/src/api/system/user.js index f62c5ff..87bd534 100644 --- a/src/api/system/user.js +++ b/src/api/system/user.js @@ -88,6 +88,18 @@ export const resetPassword = userIds => { }); }; +export const setPassword = (userId, password, password2) => { + return request({ + url: '/blade-system/user/set-password', + method: 'post', + params: { + userId, + password, + password2, + }, + }); +}; + export const updatePassword = (oldPassword, newPassword, newPassword1) => { return request({ url: '/blade-system/user/update-password', @@ -172,4 +184,3 @@ export const getUserPage = (current, size, account, name) => { }, }); }; - diff --git a/src/api/transportCapacity/driver.js b/src/api/transportCapacity/driver.js new file mode 100644 index 0000000..16597ae --- /dev/null +++ b/src/api/transportCapacity/driver.js @@ -0,0 +1,60 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/driver/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/driver/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-transport/driver/submit', + method: 'post', + data: row, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/driver/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const changeStatus = (id, status) => { + return request({ + url: '/blade-transport/driver/status', + method: 'post', + params: { + id, + status, + }, + }); +}; + +export const getExpiryStat = params => { + return request({ + url: '/blade-transport/driver/expiry-stat', + method: 'get', + params, + }); +}; diff --git a/src/api/transportCapacity/transport-ship.js b/src/api/transportCapacity/transport-ship.js new file mode 100644 index 0000000..25122d1 --- /dev/null +++ b/src/api/transportCapacity/transport-ship.js @@ -0,0 +1,60 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/transport-ship/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/transport-ship/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-transport/transport-ship/submit', + method: 'post', + data: row, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/transport-ship/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const changeStatus = (id, status) => { + return request({ + url: '/blade-transport/transport-ship/status', + method: 'post', + params: { + id, + status, + }, + }); +}; + +export const getExpiryStat = params => { + return request({ + url: '/blade-transport/transport-ship/expiry-stat', + method: 'get', + params, + }); +}; diff --git a/src/api/transportCapacity/transport-vehicle.js b/src/api/transportCapacity/transport-vehicle.js new file mode 100644 index 0000000..573d67d --- /dev/null +++ b/src/api/transportCapacity/transport-vehicle.js @@ -0,0 +1,60 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/transport-vehicle/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/transport-vehicle/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-transport/transport-vehicle/submit', + method: 'post', + data: row, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/transport-vehicle/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const changeStatus = (id, status) => { + return request({ + url: '/blade-transport/transport-vehicle/status', + method: 'post', + params: { + id, + status, + }, + }); +}; + +export const getExpiryStat = params => { + return request({ + url: '/blade-transport/transport-vehicle/expiry-stat', + method: 'get', + params, + }); +}; diff --git a/src/api/user.js b/src/api/user.js index 75f3531..b59b6cc 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -45,17 +45,18 @@ export const loginBySocial = (tenantId, source, code, state) => }, }); -export const loginBySso = (state, code) => +export const loginBySso = (tenantId, state, code) => request({ - url: '/blade-auth/oauth/token', + url: '/blade-auth/iam/sso/token', method: 'post', headers: { - 'Tenant-Id': state, + 'Tenant-Id': tenantId, }, params: { - tenantId: state, + tenant_id: tenantId, code, - grant_type: 'authorization_code', + state, + grant_type: 'iam_sso', scope: 'all', redirect_uri: website.oauth2.redirectUri, }, diff --git a/src/api/vehicle/accident-record.js b/src/api/vehicle/accident-record.js new file mode 100644 index 0000000..2dab765 --- /dev/null +++ b/src/api/vehicle/accident-record.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/accident-record/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/accident-record/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/accident-record/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-transport/accident-record/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-transport/accident-record/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/vehicle/annual-inspection-record.js b/src/api/vehicle/annual-inspection-record.js new file mode 100644 index 0000000..51cbd4d --- /dev/null +++ b/src/api/vehicle/annual-inspection-record.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/annual-inspection-record/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/annual-inspection-record/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/annual-inspection-record/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-transport/annual-inspection-record/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-transport/annual-inspection-record/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/vehicle/credit-score-quantification.js b/src/api/vehicle/credit-score-quantification.js new file mode 100644 index 0000000..196ab44 --- /dev/null +++ b/src/api/vehicle/credit-score-quantification.js @@ -0,0 +1,62 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/credit-score-quantification/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/credit-score-quantification/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-transport/credit-score-quantification/submit', + method: 'post', + data: row, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/credit-score-quantification/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const publish = id => { + return request({ + url: '/blade-transport/credit-score-quantification/publish', + method: 'post', + params: { + id, + }, + }); +}; + +export const changeStatus = (id, status) => { + return request({ + url: '/blade-transport/credit-score-quantification/status', + method: 'post', + params: { + id, + status, + }, + }); +}; diff --git a/src/api/vehicle/customer-archive.js b/src/api/vehicle/customer-archive.js new file mode 100644 index 0000000..08245bc --- /dev/null +++ b/src/api/vehicle/customer-archive.js @@ -0,0 +1,92 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/customer-archive/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/customer-archive/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const submit = row => { + return request({ + url: '/blade-transport/customer-archive/submit', + method: 'post', + data: row, + }); +}; + +export const submitApproval = id => { + return request({ + url: '/blade-transport/customer-archive/submit-approval', + method: 'post', + params: { + id, + }, + }); +}; + +export const approve = id => { + return request({ + url: '/blade-transport/customer-archive/approve', + method: 'post', + params: { + id, + }, + }); +}; + +export const reject = id => { + return request({ + url: '/blade-transport/customer-archive/reject', + method: 'post', + params: { + id, + }, + }); +}; + +export const changeStatus = (id, status) => { + return request({ + url: '/blade-transport/customer-archive/status', + method: 'post', + params: { + id, + status, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/customer-archive/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const getScoreTemplate = quantificationId => { + return request({ + url: '/blade-transport/customer-archive/score-template', + method: 'get', + params: { + quantificationId, + }, + }); +}; diff --git a/src/api/vehicle/etc-record.js b/src/api/vehicle/etc-record.js new file mode 100644 index 0000000..1b698b9 --- /dev/null +++ b/src/api/vehicle/etc-record.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/etc-record/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/etc-record/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/etc-record/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-transport/etc-record/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-transport/etc-record/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/vehicle/insurance-record.js b/src/api/vehicle/insurance-record.js new file mode 100644 index 0000000..8bb823d --- /dev/null +++ b/src/api/vehicle/insurance-record.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/insurance-record/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/insurance-record/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/insurance-record/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-transport/insurance-record/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-transport/insurance-record/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/vehicle/maintenance-plan.js b/src/api/vehicle/maintenance-plan.js new file mode 100644 index 0000000..52db725 --- /dev/null +++ b/src/api/vehicle/maintenance-plan.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/maintenance-plan/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/maintenance-plan/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/maintenance-plan/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-transport/maintenance-plan/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-transport/maintenance-plan/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/vehicle/maintenance-record.js b/src/api/vehicle/maintenance-record.js new file mode 100644 index 0000000..8773398 --- /dev/null +++ b/src/api/vehicle/maintenance-record.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/maintenance-record/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/maintenance-record/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/maintenance-record/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-transport/maintenance-record/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-transport/maintenance-record/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/vehicle/mileage-record.js b/src/api/vehicle/mileage-record.js new file mode 100644 index 0000000..033443f --- /dev/null +++ b/src/api/vehicle/mileage-record.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/mileage-record/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/mileage-record/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/mileage-record/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-transport/mileage-record/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-transport/mileage-record/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/vehicle/oil-electric-record.js b/src/api/vehicle/oil-electric-record.js new file mode 100644 index 0000000..428f1c2 --- /dev/null +++ b/src/api/vehicle/oil-electric-record.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/oil-electric-record/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/oil-electric-record/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/oil-electric-record/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-transport/oil-electric-record/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-transport/oil-electric-record/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/vehicle/other-expense-record.js b/src/api/vehicle/other-expense-record.js new file mode 100644 index 0000000..58c7819 --- /dev/null +++ b/src/api/vehicle/other-expense-record.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/other-expense-record/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/other-expense-record/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/other-expense-record/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-transport/other-expense-record/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-transport/other-expense-record/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/vehicle/tire-replacement-record.js b/src/api/vehicle/tire-replacement-record.js new file mode 100644 index 0000000..0446c74 --- /dev/null +++ b/src/api/vehicle/tire-replacement-record.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/tire-replacement-record/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/tire-replacement-record/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/tire-replacement-record/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-transport/tire-replacement-record/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-transport/tire-replacement-record/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/vehicle/transport-change-record.js b/src/api/vehicle/transport-change-record.js new file mode 100644 index 0000000..fb01f62 --- /dev/null +++ b/src/api/vehicle/transport-change-record.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/transport-change-record/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/transport-change-record/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/transport-change-record/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-transport/transport-change-record/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-transport/transport-change-record/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/api/vehicle/violation-record.js b/src/api/vehicle/violation-record.js new file mode 100644 index 0000000..0575f04 --- /dev/null +++ b/src/api/vehicle/violation-record.js @@ -0,0 +1,49 @@ +import request from '@/axios'; + +export const getList = (current, size, params) => { + return request({ + url: '/blade-transport/violation-record/list', + method: 'get', + params: { + ...params, + current, + size, + }, + }); +}; + +export const getDetail = id => { + return request({ + url: '/blade-transport/violation-record/detail', + method: 'get', + params: { + id, + }, + }); +}; + +export const remove = ids => { + return request({ + url: '/blade-transport/violation-record/remove', + method: 'post', + params: { + ids, + }, + }); +}; + +export const add = row => { + return request({ + url: '/blade-transport/violation-record/submit', + method: 'post', + data: row, + }); +}; + +export const update = row => { + return request({ + url: '/blade-transport/violation-record/submit', + method: 'post', + data: row, + }); +}; diff --git a/src/axios.js b/src/axios.js index a4719cd..cd29fa6 100644 --- a/src/axios.js +++ b/src/axios.js @@ -33,10 +33,14 @@ const isRefreshTokenRequest = config => (config.url || '').includes('/oauth/token') && (config.params || {}).grant_type === REFRESH_GRANT_TYPE; +// 判断是否为IAM统一身份认证登录请求 +const isIamSsoLoginRequest = config => (config.url || '').includes('/iam/sso/token'); + // 判断是否为重新登录请求:会开启新的会话周期 const isLoginRequest = config => { const grantType = (config.params || {}).grant_type; return ( + isIamSsoLoginRequest(config) || (config.url || '').includes('/oauth/token') && !!grantType && grantType !== REFRESH_GRANT_TYPE ); }; diff --git a/src/config/website.js b/src/config/website.js index dcce142..c3d1bcc 100644 --- a/src/config/website.js +++ b/src/config/website.js @@ -2,10 +2,10 @@ * 全局配置文件 */ export default { - title: 'Saber', + title: '运输板块数字化管理平台', logo: 'X', key: 'saber', //配置主键,目前用于存储 - indexTitle: 'BladeX 微服务平台', + indexTitle: 'TMS物流运输管理系统', clientId: 'saber3', // 客户端id clientSecret: 'saber3_secret', // 客户端密钥 tenantMode: true, // 是否开启租户模式 @@ -53,22 +53,24 @@ export default { //水印配置 watermark: { mode: false, - text: 'BladeX', + text: 'TMS物流运输管理系统', }, //oauth2配置 oauth2: { // 是否开启注册功能 registerMode: true, // 使用后端工程 @org.springblade.test.Sm2KeyGenerator 获取 - publicKey: '请配置国密sm2公钥', + publicKey: + '04db3266e1a3bc32d590911a68a1c14f833c2f93edf19f23114bbb6072792d0dd40c1b25316690255d8cf5db1784995f8ade67f66e436d56913cc739c64a780d71', // 第三方系统授权地址 authUrl: 'http://localhost/blade-auth/oauth/render', // 单点登录系统认证 ssoMode: false, // 是否开启单点登录功能 - ssoBaseUrl: 'http://localhost:8100', // 单点登录系统地址(cloud端口为8100,boot端口为80) - ssoAuthUrl: '/oauth/authorize?client_id=saber3&response_type=code&redirect_uri=', // 单点登录授权地址 + ssoClientId: 'f0b52f23f71b1649c468', // IAM统一身份认证客户端ID + ssoBaseUrl: 'https://sso.gxwuzi.com/esc-sso', // IAM统一身份认证地址 + ssoAuthUrl: '/oauth2.0/authorize', // IAM统一身份认证授权地址 ssoLogoutUrl: '/oauth/authorize/logout?redirect_uri=', // 单点登录退出地址 - redirectUri: 'http://localhost:2888/login', // 单点登录回调地址(Saber服务的登录界面地址) + redirectUri: 'http://172.16.203.228:8000/callback', // 单点登录回调地址(Saber服务的登录界面地址) }, //设计器配置 design: { diff --git a/src/lang/zh.js b/src/lang/zh.js index 83af021..a20c5d0 100644 --- a/src/lang/zh.js +++ b/src/lang/zh.js @@ -1,5 +1,5 @@ export default { - title: 'BladeX微服务平台', + title: 'TMS物流运输管理系统', confirmTip: '提示', logoutTip: '退出系统, 是否继续?', submitText: '确定', @@ -79,7 +79,7 @@ export default { }, login: { title: '登录 ', - info: 'BladeX 微服务平台', + info: 'TMS物流运输管理系统', tenantId: '请输入租户ID', name: '请输入姓名', username: '请输入账号', diff --git a/src/mac/login.scss b/src/mac/login.scss index 19e5e87..87b82eb 100644 --- a/src/mac/login.scss +++ b/src/mac/login.scss @@ -132,3 +132,36 @@ .item .iconfont:hover { background-color: rgba(255, 255, 255, 0.5); } + +.iam-button { + min-width: 280px; + height: 45px; + color: #fff; + font-size: 16px; + border: none; + border-radius: 22px; + cursor: pointer; + background-color: #2c77f1; + box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.1); +} + +.iam-button:hover { + background-color: #4b8df5; +} + +.account-button { + min-width: 280px; + height: 45px; + margin-top: 16px; + color: #fff; + font-size: 16px; + border: 1px solid rgba(255, 255, 255, 0.6); + border-radius: 22px; + cursor: pointer; + background-color: rgba(255, 255, 255, 0.2); + box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.1); +} + +.account-button:hover { + background-color: rgba(255, 255, 255, 0.35); +} diff --git a/src/mac/login.vue b/src/mac/login.vue index 457cb7a..18ddc73 100644 --- a/src/mac/login.vue +++ b/src/mac/login.vue @@ -2,12 +2,10 @@ <div class="mac_bg"></div> <div class="login animate__animated" :class="{ animate__bounceOut: pass }"> <div class="head"> - <img - src="https://bladex.cn/images/logo-small.png" - alt="" - /> + <img src="https://bladex.cn/images/logo-small.png" alt="" /> </div> <div class="message">Login Please</div> + <!-- 原登录方式先注释保留备用 <div class="form"> <div class="item" :class="isUserNameError ? 'error' : ''"> <input class="account" placeholder="account here..." v-model="form.username" type="email" /> @@ -22,27 +20,67 @@ <i class="iconfont icon-send" @click="handleLogin"></i> </div> </div> + --> + <div class="form" v-if="activeName === 'user'"> + <div class="item" :class="isUserNameError ? 'error' : ''"> + <input class="account" placeholder="account here..." v-model="form.username" type="email" /> + </div> + <div class="item" :class="isUserPasswordError ? 'error' : ''"> + <input + class="password" + placeholder="password here..." + v-model="form.password" + type="password" + /> + <i class="iconfont icon-send" @click="handleLogin"></i> + </div> + </div> + <div class="form" v-else> + <button class="iam-button" @click="handleIamLogin">IAM统一身份认证</button> + <button class="account-button" @click="activeName = 'user'">账号密码登录</button> + </div> </div> </template> <script> import { mapGetters } from 'vuex'; +import website from '@/config/website'; export default { data() { return { + website, + activeName: 'iam', pass: false, isUserNameError: false, isUserPasswordError: false, form: { + tenantId: '000000', + deptId: '', + roleId: '', username: '', password: '', + type: 'account', }, }; }, computed: { ...mapGetters(['tagWel']), + iamAuthorizeUrl() { + const params = new URLSearchParams({ + client_id: this.website.oauth2.ssoClientId, + response_type: 'code', + redirect_uri: this.website.oauth2.redirectUri, + state: this.website.tenantId, + }); + return `${this.website.oauth2.ssoBaseUrl}${ + this.website.oauth2.ssoAuthUrl + }?${params.toString()}`; + }, }, methods: { + handleIamLogin() { + window.location.href = this.iamAuthorizeUrl; + }, handleLogin() { if (this.form.username === '') { this.isUserNameError = true; @@ -57,7 +95,7 @@ export default { }, 1000); return; } - this.$store.dispatch('LoginByUsername', this.loginForm).then(() => { + this.$store.dispatch('LoginByUsername', this.form).then(() => { this.pass = true; setTimeout(() => { this.$router.push(this.tagWel); diff --git a/src/option/base/common-address.js b/src/option/base/common-address.js new file mode 100644 index 0000000..f8f1c55 --- /dev/null +++ b/src/option/base/common-address.js @@ -0,0 +1,172 @@ +export const addressTypeOptions = [ + { label: '常规地址', value: '常规地址' }, + { label: '港口/码头', value: '港口/码头' }, + { label: '铁路车站', value: '铁路车站' }, + { label: '空港机场', value: '空港机场' }, +]; + +export const createOption = ({ validateLongitude, validateLatitude }) => ({ + height: 'auto', + calcHeight: 32, + dialogWidth: 980, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + indexLabel: '序号', + indexWidth: 70, + selection: true, + viewBtn: false, + editBtn: false, + delBtn: false, + addBtn: false, + dialogClickModal: false, + menuWidth: 180, + column: [ + { + label: '地址名称', + prop: 'addressName', + search: true, + minWidth: 150, + rules: [{ required: true, message: '请输入地址名称', trigger: 'blur' }], + }, + { + label: '地址编号', + prop: 'addressCode', + minWidth: 120, + addDisplay: false, + editDisplay: false, + }, + { + label: '类型', + prop: 'addressType', + type: 'select', + search: true, + dicData: addressTypeOptions, + rules: [{ required: true, message: '请选择类型', trigger: 'change' }], + }, + { + label: '来源主数据', + prop: 'sourceId', + formslot: true, + hide: true, + span: 24, + }, + { + label: '站点编码', + prop: 'siteCodeDisplay', + search: false, + minWidth: 120, + addDisplay: false, + editDisplay: false, + }, + { + label: '站点编码', + prop: 'siteCode', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + }, + { + label: '详细地址', + prop: 'detailAddress', + search: true, + formslot: true, + type: 'textarea', + minRows: 3, + span: 24, + minWidth: 220, + rules: [{ required: true, message: '请输入详细地址', trigger: 'blur' }], + }, + { + label: '经度', + prop: 'longitude', + type: 'number', + precision: 6, + minWidth: 120, + rules: [{ validator: validateLongitude, trigger: 'blur' }], + }, + { + label: '纬度', + prop: 'latitude', + type: 'number', + precision: 6, + minWidth: 120, + rules: [{ validator: validateLatitude, trigger: 'blur' }], + }, + { + label: '行政区划', + prop: 'regionName', + search: true, + minWidth: 150, + }, + { + label: '组织', + prop: 'deptId', + type: 'select', + search: true, + hide: true, + display: false, + dicData: [], + }, + { + label: '组织', + prop: 'deptName', + minWidth: 150, + addDisplay: false, + editDisplay: false, + }, + { + label: '联系人', + prop: 'contactName', + search: true, + minWidth: 110, + }, + { + label: '联系方式', + prop: 'contactPhone', + search: true, + minWidth: 130, + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 4, + span: 24, + hide: true, + maxlength: 200, + showWordLimit: true, + rules: [{ max: 200, message: '备注不能超过200个字', trigger: 'blur' }], + }, + { + label: '更新人', + prop: 'updateUserName', + minWidth: 120, + addDisplay: false, + editDisplay: false, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + minWidth: 160, + addDisplay: false, + editDisplay: false, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + minWidth: 160, + addDisplay: false, + editDisplay: false, + }, + ], +}); diff --git a/src/option/transportCapacity/driver.js b/src/option/transportCapacity/driver.js new file mode 100644 index 0000000..1d04f17 --- /dev/null +++ b/src/option/transportCapacity/driver.js @@ -0,0 +1,111 @@ +export const option = { + height: 'auto', + calcHeight: 32, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + selection: true, + addBtn: false, + editBtn: false, + delBtn: false, + viewBtn: false, + menuWidth: 180, + dialogClickModal: false, + column: [ + { + label: '姓名', + prop: 'driverName', + search: true, + slot: true, + width: 110, + }, + { + label: '身份证号', + prop: 'idCardNo', + search: true, + width: 190, + }, + { + label: '手机号码', + prop: 'mobile', + search: true, + width: 130, + }, + { + label: '性别', + prop: 'gender', + width: 80, + align: 'center', + }, + { + label: '司机类型', + prop: 'driverType', + search: true, + type: 'select', + dicData: [ + { + label: '自有', + value: '自有', + }, + { + label: '外协', + value: '外协', + }, + ], + width: 100, + align: 'center', + }, + { + label: '岗位', + prop: 'posts', + width: 150, + }, + { + label: '准驾车型', + prop: 'drivingType', + search: true, + width: 110, + }, + { + label: '所属组织', + prop: 'organizationName', + search: true, + width: 140, + }, + { + label: '状态', + prop: 'status', + search: true, + type: 'select', + slot: true, + dicData: [ + { + label: '启用', + value: 1, + }, + { + label: '停用', + value: 2, + }, + ], + width: 90, + align: 'center', + }, + { + label: '驾驶认证', + prop: 'drivingLicenseEndDate', + slot: true, + width: 130, + align: 'center', + }, + { + label: '从业资格认证', + prop: 'qualificationEndDate', + slot: true, + width: 140, + align: 'center', + }, + ], +}; diff --git a/src/option/transportCapacity/transport-ship.js b/src/option/transportCapacity/transport-ship.js new file mode 100644 index 0000000..167eb16 --- /dev/null +++ b/src/option/transportCapacity/transport-ship.js @@ -0,0 +1,66 @@ +export const option = { + height: 'auto', + calcHeight: 32, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + selection: true, + addBtn: false, + editBtn: false, + delBtn: false, + viewBtn: false, + menuWidth: 210, + dialogClickModal: false, + column: [ + { label: '船舶名', prop: 'shipName', search: true, slot: true, width: 130 }, + { label: '船舶识别号', prop: 'shipIdentifierNo', search: true, width: 140 }, + { label: '所属组织', prop: 'organizationName', search: true, width: 160 }, + { label: '船检登记号', prop: 'shipInspectionNo', search: true, width: 130 }, + { + label: '船舶类型', + prop: 'shipType', + search: true, + type: 'select', + dicData: [ + { label: '干货船', value: '干货船' }, + { label: '集装箱船', value: '集装箱船' }, + { label: '散货船', value: '散货船' }, + { label: '油船', value: '油船' }, + { label: '拖轮', value: '拖轮' }, + ], + width: 110, + align: 'center', + }, + { + label: '状态', + prop: 'status', + search: true, + type: 'select', + slot: true, + dicData: [ + { label: '启用', value: 1 }, + { label: '停用', value: 2 }, + ], + width: 90, + align: 'center', + }, + { label: '国籍证有效期至', prop: 'nationalityCertEndDate', slot: true, width: 150, align: 'center' }, + { + label: '最低安全配员证书有效期至', + prop: 'safeManningCertEndDate', + slot: true, + width: 210, + align: 'center', + }, + { + label: '营业运输证有效期至', + prop: 'businessTransportCertEndDate', + slot: true, + width: 170, + align: 'center', + }, + { label: '承租有效期至', prop: 'leaseEndDate', slot: true, width: 140, align: 'center' }, + ], +}; diff --git a/src/option/transportCapacity/transport-vehicle.js b/src/option/transportCapacity/transport-vehicle.js new file mode 100644 index 0000000..572b315 --- /dev/null +++ b/src/option/transportCapacity/transport-vehicle.js @@ -0,0 +1,113 @@ +export const option = { + height: 'auto', + calcHeight: 32, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + selection: true, + addBtn: false, + editBtn: false, + delBtn: false, + viewBtn: false, + menuWidth: 180, + dialogClickModal: false, + column: [ + { + label: '车牌号', + prop: 'plateNo', + search: true, + slot: true, + width: 120, + }, + { + label: '所属组织', + prop: 'organizationName', + search: true, + width: 150, + }, + { + label: '车辆类型', + prop: 'vehicleType', + search: true, + type: 'select', + dicData: [ + { label: '厢式', value: '厢式' }, + { label: '高栏', value: '高栏' }, + { label: '平板', value: '平板' }, + { label: '仓栅', value: '仓栅' }, + { label: '牵引车', value: '牵引车' }, + ], + width: 110, + align: 'center', + }, + { + label: '业务关系', + prop: 'businessRelation', + search: true, + type: 'select', + dicData: [ + { label: '自有', value: '自有' }, + { label: '业务合作', value: '业务合作' }, + { label: '管理挂靠', value: '管理挂靠' }, + ], + width: 120, + align: 'center', + }, + { + label: '能源类型', + prop: 'energyType', + search: true, + type: 'select', + dicData: [ + { label: '柴油', value: '柴油' }, + { label: '汽油', value: '汽油' }, + { label: '新能源', value: '新能源' }, + { label: '天然气', value: '天然气' }, + ], + width: 110, + align: 'center', + }, + { + label: '核定载质量(KG)', + prop: 'approvedLoadKg', + width: 140, + align: 'right', + }, + { + label: '状态', + prop: 'status', + search: true, + type: 'select', + slot: true, + dicData: [ + { label: '启用', value: 1 }, + { label: '停用', value: 2 }, + ], + width: 90, + align: 'center', + }, + { + label: '行驶证有效期', + prop: 'drivingLicenseEndDate', + slot: true, + width: 140, + align: 'center', + }, + { + label: '道路运输证有效期', + prop: 'roadTransportCertEndDate', + slot: true, + width: 160, + align: 'center', + }, + { + label: '年审有效期', + prop: 'annualReviewEndDate', + slot: true, + width: 130, + align: 'center', + }, + ], +}; diff --git a/src/option/vehicle/accident-record.js b/src/option/vehicle/accident-record.js new file mode 100644 index 0000000..9c1ef49 --- /dev/null +++ b/src/option/vehicle/accident-record.js @@ -0,0 +1,277 @@ +import { formatUpdateUserName } from '@/utils/audit'; + +const validateNonNegative = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < 0) { + callback(new Error('不能小于 0')); + } else { + callback(); + } +}; + +export const vehicleTypeDic = [ + { label: '车辆', value: '车辆' }, + { label: '船舶', value: '船舶' }, +]; + +export const accidentNatureDic = [ + { label: '重大事故', value: '重大事故' }, + { label: '一般事故', value: '一般事故' }, + { label: '轻微事故', value: '轻微事故' }, + { label: '其他', value: '其他' }, +]; + +export const accidentResponsibilityDic = [ + { label: '全部责任', value: '全部责任' }, + { label: '主要责任', value: '主要责任' }, + { label: '同等责任', value: '同等责任' }, + { label: '次要责任', value: '次要责任' }, + { label: '无责任', value: '无责任' }, +]; + +export const option = { + height: 'auto', + calcHeight: 32, + dialogWidth: 1050, + labelPosition: 'top', + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + selection: true, + dialogClickModal: false, + menuWidth: 180, + column: [ + { + label: '车船类型', + prop: 'vehicleType', + type: 'radio', + minWidth: 110, + dicData: vehicleTypeDic, + value: '车辆', + search: true, + rules: [{ required: true, message: '请选择车船类型', trigger: 'change' }], + }, + { + label: '车牌号/船号', + prop: 'vehicleNo', + slot: true, + formslot: true, + search: true, + minWidth: 140, + rules: [ + { required: true, message: '请输入车牌号/船号', trigger: 'blur' }, + { max: 30, message: '最多 30 个字符', trigger: 'blur' }, + ], + }, + { + label: '事故发生日期', + prop: 'accidentDate', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + minWidth: 140, + rules: [{ required: true, message: '请选择事故发生日期', trigger: 'click' }], + }, + { + label: '事故发生地点', + prop: 'accidentLocation', + minWidth: 200, + overHidden: true, + rules: [{ max: 100, message: '最多 100 个字符', trigger: 'blur' }], + }, + { + label: '事故性质', + prop: 'accidentNature', + type: 'select', + dicData: accidentNatureDic, + search: true, + minWidth: 120, + }, + { + label: '事故责任', + prop: 'accidentResponsibility', + type: 'select', + dicData: accidentResponsibilityDic, + search: true, + minWidth: 120, + }, + { + label: '直接经济损失', + prop: 'directEconomicLoss', + type: 'number', + precision: 2, + minWidth: 140, + rules: [{ validator: validateNonNegative, trigger: 'blur' }], + }, + { + label: '保险理赔金额', + prop: 'insuranceClaimAmount', + type: 'number', + precision: 2, + minWidth: 140, + rules: [{ validator: validateNonNegative, trigger: 'blur' }], + }, + { + label: '事故原因', + prop: 'accidentReasonDamage', + type: 'textarea', + minRows: 3, + span: 24, + search: true, + hide: true, + rules: [{ max: 500, message: '最多 500 个字符', trigger: 'blur' }], + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 3, + span: 24, + hide: true, + rules: [{ max: 200, message: '最多 200 个字符', trigger: 'blur' }], + }, + { + label: '附件', + prop: 'attachments', + type: 'upload', + listType: 'text', + multiple: true, + accept: '.jpg,.jpeg,.png,.pdf', + propsHttp: { + res: 'data', + url: 'link', + name: 'name', + }, + action: '/blade-resource/oss/endpoint/put-file', + span: 24, + minWidth: 100, + slot: true, + }, + { + label: '事故评定开始日期', + prop: 'accidentAssessmentDateStart', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '事故评定结束日期', + prop: 'accidentAssessmentDateEnd', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'date', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + viewDisplay: false, + display: false, + minWidth: 170, + }, + { + label: '创建开始时间', + prop: 'createTimeStart', + type: 'date', + format: 'YYYY-MM-DD 00:00:00', + valueFormat: 'YYYY-MM-DD 00:00:00', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建结束时间', + prop: 'createTimeEnd', + type: 'date', + format: 'YYYY-MM-DD 23:59:59', + valueFormat: 'YYYY-MM-DD 23:59:59', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '组织', + prop: 'createDept', + type: 'tree', + dicData: [], + props: { + label: 'title', + value: 'id', + }, + checkStrictly: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '更新人', + prop: 'updateUserName', + formatter: formatUpdateUserName, + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 180, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 170, + }, + ], +}; + +export const excelOption = { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + action: '/blade-transport/accident-record/import-accident-record', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], +}; diff --git a/src/option/vehicle/annual-inspection-record.js b/src/option/vehicle/annual-inspection-record.js new file mode 100644 index 0000000..96144d8 --- /dev/null +++ b/src/option/vehicle/annual-inspection-record.js @@ -0,0 +1,284 @@ +import { formatUpdateUserName } from '@/utils/audit'; + +const validateNonNegative = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < 0) { + callback(new Error('不能小于 0')); + } else { + callback(); + } +}; + +export const vehicleTypeDic = [ + { label: '车辆', value: '车辆' }, + { label: '船舶', value: '船舶' }, +]; + +export const vehicleTechnicalLevelDic = [ + { label: '一级', value: '一级' }, + { label: '二级', value: '二级' }, + { label: '三级', value: '三级' }, + { label: '其他', value: '其他' }, +]; + +export const shipInspectionTypeDic = [ + { label: '年检', value: '年检' }, + { label: '中检', value: '中检' }, + { label: '特检', value: '特检' }, + { label: '其他', value: '其他' }, +]; + +export const option = { + height: 'auto', + calcHeight: 32, + dialogWidth: 1050, + labelPosition: 'top', + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + selection: true, + dialogClickModal: false, + menuWidth: 180, + column: [ + { + label: '车船类型', + prop: 'vehicleType', + type: 'radio', + minWidth: 110, + dicData: vehicleTypeDic, + value: '车辆', + search: true, + rules: [{ required: true, message: '请选择车船类型', trigger: 'change' }], + }, + { + label: '车牌号/船号', + prop: 'vehicleNo', + slot: true, + formslot: true, + search: true, + minWidth: 140, + rules: [ + { required: true, message: '请输入车牌号/船号', trigger: 'blur' }, + { max: 30, message: '最多 30 个字符', trigger: 'blur' }, + ], + }, + { + label: '检测评定日期', + prop: 'inspectionAssessmentDate', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + minWidth: 140, + rules: [{ required: true, message: '请选择检测评定日期', trigger: 'click' }], + }, + { + label: '有效期截止日', + prop: 'validUntilDate', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + minWidth: 140, + rules: [{ required: true, message: '请选择有效期截止日', trigger: 'click' }], + }, + { + label: '车辆技术等级', + prop: 'vehicleTechnicalLevel', + type: 'select', + dicData: vehicleTechnicalLevelDic, + minWidth: 130, + rules: [{ required: true, message: '请选择车辆技术等级', trigger: 'change' }], + }, + { + label: '船舶检验类型', + prop: 'shipInspectionType', + type: 'select', + dicData: shipInspectionTypeDic, + display: false, + minWidth: 130, + rules: [{ required: true, message: '请选择船舶检验类型', trigger: 'change' }], + }, + { + label: '客车类型及等级', + prop: 'passengerTypeLevel', + minWidth: 150, + hide: true, + rules: [{ max: 50, message: '最多 50 个字符', trigger: 'blur' }], + }, + { + label: '检测评定单位', + prop: 'inspectionUnit', + minWidth: 160, + rules: [{ max: 50, message: '最多 50 个字符', trigger: 'blur' }], + }, + { + label: '费用', + prop: 'fee', + type: 'number', + precision: 2, + minWidth: 100, + rules: [ + { required: true, message: '请输入费用', trigger: 'blur' }, + { validator: validateNonNegative, trigger: 'blur' }, + ], + }, + { + label: '评定(复核)单位', + prop: 'assessmentUnit', + minWidth: 160, + hide: true, + rules: [{ max: 50, message: '最多 50 个字符', trigger: 'blur' }], + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 3, + span: 24, + hide: true, + rules: [{ max: 200, message: '最多 200 个字符', trigger: 'blur' }], + }, + { + label: '附件', + prop: 'attachments', + type: 'upload', + listType: 'text', + multiple: true, + accept: '.jpg,.jpeg,.png,.pdf', + propsHttp: { + res: 'data', + url: 'link', + name: 'name', + }, + action: '/blade-resource/oss/endpoint/put-file', + span: 24, + minWidth: 100, + slot: true, + }, + { + label: '检测评定开始日期', + prop: 'inspectionAssessmentDateStart', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '检测评定结束日期', + prop: 'inspectionAssessmentDateEnd', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'date', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + viewDisplay: false, + display: false, + minWidth: 170, + }, + { + label: '创建开始时间', + prop: 'createTimeStart', + type: 'date', + format: 'YYYY-MM-DD 00:00:00', + valueFormat: 'YYYY-MM-DD 00:00:00', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建结束时间', + prop: 'createTimeEnd', + type: 'date', + format: 'YYYY-MM-DD 23:59:59', + valueFormat: 'YYYY-MM-DD 23:59:59', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '组织', + prop: 'createDept', + type: 'tree', + dicData: [], + props: { + label: 'title', + value: 'id', + }, + checkStrictly: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '更新人', + prop: 'updateUserName', + formatter: formatUpdateUserName, + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 180, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 170, + }, + ], +}; + +export const excelOption = { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + action: '/blade-transport/annual-inspection-record/import-annual-inspection-record', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], +}; diff --git a/src/option/vehicle/etc-record.js b/src/option/vehicle/etc-record.js new file mode 100644 index 0000000..7839b40 --- /dev/null +++ b/src/option/vehicle/etc-record.js @@ -0,0 +1,211 @@ +import { formatUpdateUserName } from '@/utils/audit'; + +const isEmpty = value => value === undefined || value === null || value === ''; + +const validateNonNegative = (rule, value, callback) => { + if (isEmpty(value)) { + callback(); + } else if (Number(value) < 0) { + callback(new Error('不能小于 0')); + } else { + callback(); + } +}; + +const maskEtcCardNo = value => { + if (!value) return ''; + const cardNo = String(value); + if (cardNo.length <= 8) return cardNo.replace(/.(?=.{4})/g, '*'); + return `${cardNo.slice(0, 4)}**** ****${cardNo.slice(-8)}`; +}; + +export const option = { + height: 'auto', + calcHeight: 32, + dialogWidth: 980, + labelPosition: 'top', + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + selection: true, + dialogClickModal: false, + menuWidth: 180, + menuFixed: 'right', + column: [ + { + label: '车牌号', + prop: 'vehicleNo', + slot: true, + formslot: true, + search: true, + minWidth: 140, + rules: [ + { required: true, message: '请输入车牌号', trigger: 'blur' }, + { max: 30, message: '最多 30 个字符', trigger: 'blur' }, + ], + }, + { + label: 'ETC卡号', + prop: 'etcCardNo', + formatter: row => maskEtcCardNo(row.etcCardNo), + search: true, + minWidth: 220, + rules: [ + { required: true, message: '请输入ETC卡号', trigger: 'blur' }, + { max: 30, message: '最多 30 个字符', trigger: 'blur' }, + ], + }, + { + label: '入口时间', + prop: 'entryTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + minWidth: 170, + }, + { + label: '出口时间', + prop: 'exitTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + minWidth: 170, + rules: [{ required: true, message: '请选择出口时间', trigger: 'click' }], + }, + { + label: '入口站', + prop: 'entryStation', + minWidth: 150, + rules: [{ max: 50, message: '最多 50 个字符', trigger: 'blur' }], + }, + { + label: '出口站', + prop: 'exitStation', + minWidth: 150, + rules: [{ max: 50, message: '最多 50 个字符', trigger: 'blur' }], + }, + { + label: '数据来源', + prop: 'dataSource', + value: '手工录入', + minWidth: 120, + addDisplay: false, + editDisplay: false, + }, + { + label: '交易金额', + prop: 'transactionAmount', + type: 'number', + precision: 2, + append: '元', + minWidth: 130, + rules: [ + { required: true, message: '请输入交易金额', trigger: 'blur' }, + { validator: validateNonNegative, trigger: 'blur' }, + ], + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 4, + span: 24, + minWidth: 180, + overHidden: true, + rules: [{ max: 200, message: '最多 200 个字符', trigger: 'blur' }], + }, + { + label: '附件', + prop: 'attachments', + type: 'upload', + listType: 'text', + multiple: true, + accept: '.jpg,.jpeg,.png,.pdf', + propsHttp: { + res: 'data', + url: 'link', + name: 'name', + }, + action: '/blade-resource/oss/endpoint/put-file', + span: 24, + minWidth: 100, + slot: true, + }, + { + label: '组织', + prop: 'createDept', + type: 'tree', + dicData: [], + props: { + label: 'title', + value: 'id', + }, + checkStrictly: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + viewDisplay: false, + minWidth: 170, + }, + { + label: '更新人', + prop: 'updateUserName', + formatter: formatUpdateUserName, + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 180, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 170, + }, + ], +}; + +export const excelOption = { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + action: '/blade-transport/etc-record/import-etc-record', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], +}; diff --git a/src/option/vehicle/insurance-record.js b/src/option/vehicle/insurance-record.js new file mode 100644 index 0000000..9aaf874 --- /dev/null +++ b/src/option/vehicle/insurance-record.js @@ -0,0 +1,262 @@ +import { formatUpdateUserName } from '@/utils/audit'; + +const validateNonNegative = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < 0) { + callback(new Error('不能小于 0')); + } else { + callback(); + } +}; + +export const vehicleTypeDic = [ + { label: '车辆', value: '车辆' }, + { label: '船舶', value: '船舶' }, +]; + +export const insuranceTypeDic = [ + { label: '交强险', value: '交强险' }, + { label: '商业险', value: '商业险' }, + { label: '承运人责任险', value: '承运人责任险' }, + { label: '货运险', value: '货运险' }, + { label: '船舶险', value: '船舶险' }, +]; + +export const ocrTemplateDic = [ + { label: '紫金-机动车交强险', value: '紫金-机动车交强险' }, + { label: '机动车商业险', value: '机动车商业险' }, + { label: '船舶保险', value: '船舶保险' }, +]; + +export const option = { + height: 'auto', + calcHeight: 32, + dialogWidth: 1100, + labelPosition: 'top', + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + selection: true, + dialogClickModal: false, + menuWidth: 180, + column: [ + { + label: '车船类型', + prop: 'vehicleType', + type: 'radio', + minWidth: 110, + dicData: vehicleTypeDic, + value: '车辆', + search: true, + rules: [{ required: true, message: '请选择车船类型', trigger: 'change' }], + }, + { + label: 'OCR识别模板', + prop: 'ocrTemplate', + type: 'select', + dicData: ocrTemplateDic, + value: '紫金-机动车交强险', + hide: true, + span: 12, + }, + { + label: '上传文件', + prop: 'policyFile', + formslot: true, + hide: true, + span: 24, + }, + { + label: '车牌号/船号', + prop: 'vehicleNo', + slot: true, + formslot: true, + search: true, + minWidth: 140, + rules: [ + { required: true, message: '请输入车牌号/船号', trigger: 'blur' }, + { max: 50, message: '最多 50 个字符', trigger: 'blur' }, + ], + }, + { + label: '保险类型', + prop: 'insuranceType', + type: 'select', + dicData: insuranceTypeDic, + search: true, + minWidth: 130, + rules: [{ required: true, message: '请选择保险类型', trigger: 'change' }], + }, + { + label: '保单号', + prop: 'policyNo', + minWidth: 170, + rules: [ + { required: true, message: '请输入保单号', trigger: 'blur' }, + { max: 80, message: '最多 80 个字符', trigger: 'blur' }, + ], + }, + { + label: '开始日期', + prop: 'startDate', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + minWidth: 120, + rules: [{ required: true, message: '请选择开始日期', trigger: 'click' }], + }, + { + label: '结束日期', + prop: 'endDate', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + minWidth: 120, + rules: [{ required: true, message: '请选择结束日期', trigger: 'click' }], + }, + { + label: '保额', + prop: 'insuredAmount', + type: 'number', + precision: 2, + minWidth: 120, + rules: [{ validator: validateNonNegative, trigger: 'blur' }], + }, + { + label: '保费', + prop: 'premium', + type: 'number', + precision: 2, + minWidth: 120, + rules: [ + { required: true, message: '请输入保费', trigger: 'blur' }, + { validator: validateNonNegative, trigger: 'blur' }, + ], + }, + { + label: '发票号', + prop: 'invoiceNo', + minWidth: 150, + rules: [{ max: 80, message: '最多 80 个字符', trigger: 'blur' }], + }, + { + label: '开票日期', + prop: 'invoiceDate', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + minWidth: 120, + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 3, + span: 24, + hide: true, + rules: [{ max: 200, message: '备注最多 200 个字', trigger: 'blur' }], + }, + { + label: '创建时间', + prop: 'createTime', + type: 'date', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + viewDisplay: false, + display: false, + minWidth: 170, + }, + { + label: '创建开始时间', + prop: 'createTimeStart', + type: 'date', + format: 'YYYY-MM-DD 00:00:00', + valueFormat: 'YYYY-MM-DD 00:00:00', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建结束时间', + prop: 'createTimeEnd', + type: 'date', + format: 'YYYY-MM-DD 23:59:59', + valueFormat: 'YYYY-MM-DD 23:59:59', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '组织', + prop: 'createDept', + type: 'tree', + dicData: [], + props: { + label: 'title', + value: 'id', + }, + checkStrictly: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '更新人', + prop: 'updateUserName', + formatter: formatUpdateUserName, + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 180, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 170, + }, + ], +}; + +export const excelOption = { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + action: '/blade-transport/insurance-record/import-insurance-record', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], +}; diff --git a/src/option/vehicle/mileage-record.js b/src/option/vehicle/mileage-record.js new file mode 100644 index 0000000..62535a8 --- /dev/null +++ b/src/option/vehicle/mileage-record.js @@ -0,0 +1,223 @@ +import { formatUpdateUserName } from '@/utils/audit'; + +const isEmpty = value => value === undefined || value === null || value === ''; + +const validateNonNegative = (rule, value, callback) => { + if (isEmpty(value)) { + callback(); + } else if (Number(value) < 0) { + callback(new Error('不能小于 0')); + } else { + callback(); + } +}; + +export const option = { + height: 'auto', + calcHeight: 32, + dialogWidth: 980, + labelPosition: 'top', + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + selection: true, + dialogClickModal: false, + menuWidth: 180, + menuFixed: 'right', + column: [ + { + label: '车牌号', + prop: 'vehicleNo', + slot: true, + formslot: true, + search: true, + minWidth: 130, + rules: [ + { required: true, message: '请输入车牌号', trigger: 'blur' }, + { max: 30, message: '最多 30 个字符', trigger: 'blur' }, + ], + }, + { + label: '上月统计日里程表示值(km)', + prop: 'previousMonthMileage', + type: 'number', + precision: 2, + minWidth: 210, + rules: [{ validator: validateNonNegative, trigger: 'blur' }], + }, + { + label: '本月统计日里程表示值(km)', + prop: 'currentMonthMileage', + type: 'number', + precision: 2, + minWidth: 210, + rules: [{ validator: validateNonNegative, trigger: 'blur' }], + }, + { + label: '本月行驶里程(km)', + prop: 'monthlyMileage', + type: 'number', + precision: 2, + minWidth: 170, + rules: [{ validator: validateNonNegative, trigger: 'blur' }], + }, + { + label: '累计行驶里程(km)', + prop: 'totalMileage', + type: 'number', + precision: 2, + minWidth: 170, + rules: [{ validator: validateNonNegative, trigger: 'blur' }], + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 4, + span: 24, + minWidth: 180, + overHidden: true, + rules: [{ max: 200, message: '最多 200 个字符', trigger: 'blur' }], + }, + { + label: '附件', + prop: 'attachments', + type: 'upload', + listType: 'text', + multiple: true, + accept: '.jpg,.jpeg,.png,.pdf', + propsHttp: { + res: 'data', + url: 'link', + name: 'name', + }, + action: '/blade-resource/oss/endpoint/put-file', + span: 24, + minWidth: 100, + slot: true, + }, + { + label: '累计行驶里程开始值', + prop: 'totalMileageStart', + type: 'number', + precision: 2, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '累计行驶里程结束值', + prop: 'totalMileageEnd', + type: 'number', + precision: 2, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'date', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + viewDisplay: false, + display: false, + minWidth: 170, + }, + { + label: '创建开始时间', + prop: 'createTimeStart', + type: 'date', + format: 'YYYY-MM-DD 00:00:00', + valueFormat: 'YYYY-MM-DD 00:00:00', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建结束时间', + prop: 'createTimeEnd', + type: 'date', + format: 'YYYY-MM-DD 23:59:59', + valueFormat: 'YYYY-MM-DD 23:59:59', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '组织', + prop: 'createDept', + type: 'tree', + dicData: [], + props: { + label: 'title', + value: 'id', + }, + checkStrictly: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '更新人', + prop: 'updateUserName', + formatter: formatUpdateUserName, + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 180, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 170, + }, + ], +}; + +export const excelOption = { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + action: '/blade-transport/mileage-record/import-mileage-record', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], +}; diff --git a/src/option/vehicle/oil-electric-record.js b/src/option/vehicle/oil-electric-record.js new file mode 100644 index 0000000..f02b113 --- /dev/null +++ b/src/option/vehicle/oil-electric-record.js @@ -0,0 +1,321 @@ +import { formatUpdateUserName } from '@/utils/audit'; + +const isEmpty = value => value === undefined || value === null || value === ''; + +const validateNonNegative = (rule, value, callback) => { + if (isEmpty(value)) { + callback(); + } else if (Number(value) < 0) { + callback(new Error('不能小于 0')); + } else { + callback(); + } +}; + +export const vehicleTypeDic = [ + { label: '车辆', value: '车辆' }, + { label: '船舶', value: '船舶' }, +]; + +export const feeTypeDic = [ + { label: '加油', value: '加油' }, + { label: '充电', value: '充电' }, +]; + +export const option = { + height: 'auto', + calcHeight: 32, + dialogWidth: 980, + labelPosition: 'top', + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + selection: true, + dialogClickModal: false, + menuWidth: 180, + menuFixed: 'right', + column: [ + { + label: '卡号', + prop: 'cardNo', + minWidth: 150, + rules: [{ max: 30, message: '最多 30 个字符', trigger: 'blur' }], + }, + { + label: '交易时间', + prop: 'transactionTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + minWidth: 170, + rules: [{ required: true, message: '请选择交易时间', trigger: 'click' }], + }, + { + label: '车船类型', + prop: 'vehicleType', + type: 'radio', + dicData: vehicleTypeDic, + value: '车辆', + search: true, + minWidth: 110, + rules: [{ required: true, message: '请选择车船类型', trigger: 'change' }], + }, + { + label: '费用类型', + prop: 'feeType', + type: 'select', + dicData: feeTypeDic, + search: true, + minWidth: 120, + rules: [{ required: true, message: '请选择费用类型', trigger: 'change' }], + }, + { + label: '油品', + prop: 'oilProduct', + minWidth: 160, + rules: [{ max: 50, message: '最多 50 个字符', trigger: 'blur' }], + }, + { + label: '车牌号/船号', + prop: 'vehicleNo', + slot: true, + formslot: true, + search: true, + minWidth: 150, + rules: [ + { required: true, message: '请输入车牌号/船号', trigger: 'blur' }, + { max: 30, message: '最多 30 个字符', trigger: 'blur' }, + ], + }, + { + label: '持卡人', + prop: 'cardHolder', + minWidth: 120, + rules: [{ max: 20, message: '最多 20 个字符', trigger: 'blur' }], + }, + { + label: '数据来源', + prop: 'dataSource', + value: '手工录入', + minWidth: 120, + addDisplay: false, + editDisplay: false, + }, + { + label: '数量', + prop: 'quantity', + type: 'number', + precision: 2, + minWidth: 110, + rules: [{ validator: validateNonNegative, trigger: 'blur' }], + }, + { + label: '单价', + prop: 'unitPrice', + type: 'number', + precision: 2, + minWidth: 120, + append: '元/升', + rules: [{ validator: validateNonNegative, trigger: 'blur' }], + }, + { + label: '交易金额', + prop: 'transactionAmount', + type: 'number', + precision: 2, + minWidth: 130, + rules: [ + { required: true, message: '请输入交易金额', trigger: 'blur' }, + { validator: validateNonNegative, trigger: 'blur' }, + ], + }, + { + label: '余额', + prop: 'balance', + type: 'number', + precision: 2, + minWidth: 110, + rules: [{ validator: validateNonNegative, trigger: 'blur' }], + }, + { + label: '站点', + prop: 'station', + minWidth: 150, + rules: [{ max: 50, message: '最多 50 个字符', trigger: 'blur' }], + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 4, + span: 24, + minWidth: 180, + overHidden: true, + rules: [{ max: 200, message: '最多 200 个字符', trigger: 'blur' }], + }, + { + label: '附件', + prop: 'attachments', + type: 'upload', + listType: 'text', + multiple: true, + accept: '.jpg,.jpeg,.png,.pdf', + propsHttp: { + res: 'data', + url: 'link', + name: 'name', + }, + action: '/blade-resource/oss/endpoint/put-file', + span: 24, + minWidth: 100, + slot: true, + }, + { + label: '交易开始时间', + prop: 'transactionTimeStart', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '交易结束时间', + prop: 'transactionTimeEnd', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '消费金额开始值', + prop: 'transactionAmountStart', + type: 'number', + precision: 2, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '消费金额结束值', + prop: 'transactionAmountEnd', + type: 'number', + precision: 2, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'date', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + viewDisplay: false, + display: false, + minWidth: 170, + }, + { + label: '创建开始时间', + prop: 'createTimeStart', + type: 'date', + format: 'YYYY-MM-DD 00:00:00', + valueFormat: 'YYYY-MM-DD 00:00:00', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建结束时间', + prop: 'createTimeEnd', + type: 'date', + format: 'YYYY-MM-DD 23:59:59', + valueFormat: 'YYYY-MM-DD 23:59:59', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '组织', + prop: 'createDept', + type: 'tree', + dicData: [], + props: { + label: 'title', + value: 'id', + }, + checkStrictly: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '更新人', + prop: 'updateUserName', + formatter: formatUpdateUserName, + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 180, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 170, + }, + ], +}; + +export const excelOption = { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + action: '/blade-transport/oil-electric-record/import-oil-electric-record', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], +}; diff --git a/src/option/vehicle/other-expense-record.js b/src/option/vehicle/other-expense-record.js new file mode 100644 index 0000000..b4f5548 --- /dev/null +++ b/src/option/vehicle/other-expense-record.js @@ -0,0 +1,220 @@ +import { formatUpdateUserName } from '@/utils/audit'; + +const isEmpty = value => value === undefined || value === null || value === ''; + +const validateNonNegative = (rule, value, callback) => { + if (isEmpty(value)) { + callback(); + } else if (Number(value) < 0) { + callback(new Error('不能小于 0')); + } else { + callback(); + } +}; + +export const vehicleTypeDic = [ + { label: '车辆', value: '车辆' }, + { label: '船舶', value: '船舶' }, +]; + +export const expenseTypeDic = [ + { label: '过路费', value: '过路费' }, + { label: '停车费', value: '停车费' }, + { label: '维修费', value: '维修费' }, + { label: '保险费', value: '保险费' }, + { label: '年检费', value: '年检费' }, + { label: '装卸费', value: '装卸费' }, + { label: '其他', value: '其他' }, +]; + +export const option = { + height: 'auto', + calcHeight: 32, + dialogWidth: 980, + labelPosition: 'top', + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + selection: true, + dialogClickModal: false, + menuWidth: 180, + menuFixed: 'right', + column: [ + { + label: '费用日期', + prop: 'expenseDate', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + minWidth: 140, + rules: [{ required: true, message: '请选择费用日期', trigger: 'click' }], + }, + { + label: '其他费用类型', + prop: 'expenseType', + type: 'select', + dicData: expenseTypeDic, + search: true, + minWidth: 150, + rules: [{ required: true, message: '请选择其他费用类型', trigger: 'change' }], + }, + { + label: '车船类型', + prop: 'vehicleType', + type: 'radio', + dicData: vehicleTypeDic, + value: '车辆', + search: true, + minWidth: 110, + rules: [{ required: true, message: '请选择车船类型', trigger: 'change' }], + }, + { + label: '车牌号/船号', + prop: 'vehicleNo', + slot: true, + formslot: true, + search: true, + minWidth: 150, + rules: [ + { required: true, message: '请输入车牌号/船号', trigger: 'blur' }, + { max: 30, message: '最多 30 个字符', trigger: 'blur' }, + ], + }, + { + label: '数据来源', + prop: 'dataSource', + value: '手工录入', + minWidth: 120, + addDisplay: false, + editDisplay: false, + }, + { + label: '金额', + prop: 'amount', + type: 'number', + precision: 2, + append: '元', + minWidth: 120, + rules: [ + { required: true, message: '请输入金额', trigger: 'blur' }, + { validator: validateNonNegative, trigger: 'blur' }, + ], + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 4, + span: 24, + minWidth: 180, + overHidden: true, + rules: [{ max: 200, message: '最多 200 个字符', trigger: 'blur' }], + }, + { + label: '附件', + prop: 'attachments', + type: 'upload', + listType: 'text', + multiple: true, + accept: '.jpg,.jpeg,.png,.pdf', + propsHttp: { + res: 'data', + url: 'link', + name: 'name', + }, + action: '/blade-resource/oss/endpoint/put-file', + span: 24, + minWidth: 100, + slot: true, + }, + { + label: '费用日期', + prop: 'expenseDateRange', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + searchRange: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '组织', + prop: 'createDept', + type: 'tree', + dicData: [], + props: { + label: 'title', + value: 'id', + }, + checkStrictly: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + viewDisplay: false, + minWidth: 170, + }, + { + label: '更新人', + prop: 'updateUserName', + formatter: formatUpdateUserName, + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 180, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 170, + }, + ], +}; + +export const excelOption = { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + action: '/blade-transport/other-expense-record/import-other-expense-record', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], +}; diff --git a/src/option/vehicle/tire-replacement-record.js b/src/option/vehicle/tire-replacement-record.js new file mode 100644 index 0000000..5127cbb --- /dev/null +++ b/src/option/vehicle/tire-replacement-record.js @@ -0,0 +1,223 @@ +import { formatUpdateUserName } from '@/utils/audit'; + +const validateNonNegative = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < 0) { + callback(new Error('不能小于 0')); + } else { + callback(); + } +}; + +const validatePositiveInteger = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (!Number.isInteger(Number(value)) || Number(value) <= 0) { + callback(new Error('换胎数量必须为正整数')); + } else { + callback(); + } +}; + +export const option = { + height: 'auto', + calcHeight: 32, + dialogWidth: 980, + labelPosition: 'top', + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + selection: true, + dialogClickModal: false, + menuWidth: 180, + column: [ + { + label: '车牌号', + prop: 'vehicleNo', + slot: true, + formslot: true, + search: true, + minWidth: 130, + rules: [ + { required: true, message: '请输入车牌号', trigger: 'blur' }, + { max: 30, message: '最多 30 个字符', trigger: 'blur' }, + ], + }, + { + label: '处理人', + prop: 'handler', + minWidth: 120, + rules: [{ max: 20, message: '最多 20 个字符', trigger: 'blur' }], + }, + { + label: '换胎时间', + prop: 'replacementTime', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + minWidth: 130, + rules: [{ required: true, message: '请选择换胎时间', trigger: 'click' }], + }, + { + label: '轮胎品牌', + prop: 'tireBrand', + minWidth: 140, + rules: [{ max: 50, message: '最多 50 个字符', trigger: 'blur' }], + }, + { + label: '换胎数量', + prop: 'tireQuantity', + type: 'number', + precision: 0, + minWidth: 110, + rules: [{ validator: validatePositiveInteger, trigger: 'blur' }], + }, + { + label: '换胎费用', + prop: 'replacementCost', + type: 'number', + precision: 2, + minWidth: 120, + rules: [ + { required: true, message: '请输入换胎费用', trigger: 'blur' }, + { validator: validateNonNegative, trigger: 'blur' }, + ], + }, + { + label: '换胎说明', + prop: 'replacementDescription', + minWidth: 180, + overHidden: true, + rules: [{ max: 200, message: '最多 200 个字符', trigger: 'blur' }], + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 4, + span: 24, + minWidth: 180, + overHidden: true, + rules: [{ max: 500, message: '最多 500 个字符', trigger: 'blur' }], + }, + { + label: '附件', + prop: 'attachments', + type: 'upload', + listType: 'text', + multiple: true, + accept: '.jpg,.jpeg,.png,.pdf', + propsHttp: { + res: 'data', + url: 'link', + name: 'name', + }, + action: '/blade-resource/oss/endpoint/put-file', + span: 24, + minWidth: 100, + slot: true, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'date', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + viewDisplay: false, + display: false, + minWidth: 170, + }, + { + label: '创建开始时间', + prop: 'createTimeStart', + type: 'date', + format: 'YYYY-MM-DD 00:00:00', + valueFormat: 'YYYY-MM-DD 00:00:00', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建结束时间', + prop: 'createTimeEnd', + type: 'date', + format: 'YYYY-MM-DD 23:59:59', + valueFormat: 'YYYY-MM-DD 23:59:59', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '组织', + prop: 'createDept', + type: 'tree', + dicData: [], + props: { + label: 'title', + value: 'id', + }, + checkStrictly: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '更新人', + prop: 'updateUserName', + formatter: formatUpdateUserName, + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 180, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 170, + }, + ], +}; + +export const excelOption = { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + action: '/blade-transport/tire-replacement-record/import-tire-replacement-record', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], +}; diff --git a/src/option/vehicle/transport-change-record.js b/src/option/vehicle/transport-change-record.js new file mode 100644 index 0000000..0fa65a1 --- /dev/null +++ b/src/option/vehicle/transport-change-record.js @@ -0,0 +1,199 @@ +import { formatUpdateUserName } from '@/utils/audit'; + +export const vehicleTypeDic = [ + { label: '车辆', value: '车辆' }, + { label: '船舶', value: '船舶' }, +]; + +export const changeItemDic = [ + { label: '所有人变更', value: '所有人变更' }, + { label: '挂靠变更', value: '挂靠变更' }, + { label: '经营范围变更', value: '经营范围变更' }, + { label: '车牌号变更', value: '车牌号变更' }, + { label: '其他', value: '其他' }, +]; + +export const option = { + height: 'auto', + calcHeight: 32, + dialogWidth: 980, + labelPosition: 'top', + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + selection: true, + dialogClickModal: false, + menuWidth: 180, + menuFixed: 'right', + column: [ + { + label: '车船类型', + prop: 'vehicleType', + type: 'radio', + minWidth: 110, + dicData: vehicleTypeDic, + value: '车辆', + search: true, + rules: [{ required: true, message: '请选择车船类型', trigger: 'change' }], + }, + { + label: '车牌号/船号', + prop: 'vehicleNo', + slot: true, + formslot: true, + search: true, + minWidth: 140, + rules: [{ max: 30, message: '最多 30 个字符', trigger: 'blur' }], + }, + { + label: '变更事项', + prop: 'changeItem', + type: 'select', + dicData: changeItemDic, + minWidth: 180, + rules: [{ required: true, message: '请选择变更事项', trigger: 'change' }], + }, + { + label: '变更内容', + prop: 'changeContent', + type: 'textarea', + minRows: 4, + span: 24, + search: true, + minWidth: 260, + overHidden: true, + rules: [ + { required: true, message: '请输入变更内容', trigger: 'blur' }, + { max: 200, message: '最多 200 个字符', trigger: 'blur' }, + ], + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 4, + span: 24, + minWidth: 180, + overHidden: true, + rules: [{ max: 200, message: '最多 200 个字符', trigger: 'blur' }], + }, + { + label: '附件', + prop: 'attachments', + type: 'upload', + listType: 'text', + multiple: true, + accept: '.jpg,.jpeg,.png,.pdf', + propsHttp: { + res: 'data', + url: 'link', + name: 'name', + }, + action: '/blade-resource/oss/endpoint/put-file', + span: 24, + minWidth: 100, + slot: true, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'date', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + viewDisplay: false, + display: false, + minWidth: 170, + }, + { + label: '创建开始时间', + prop: 'createTimeStart', + type: 'date', + format: 'YYYY-MM-DD 00:00:00', + valueFormat: 'YYYY-MM-DD 00:00:00', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建结束时间', + prop: 'createTimeEnd', + type: 'date', + format: 'YYYY-MM-DD 23:59:59', + valueFormat: 'YYYY-MM-DD 23:59:59', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '组织', + prop: 'createDept', + type: 'tree', + dicData: [], + props: { + label: 'title', + value: 'id', + }, + checkStrictly: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '更新人', + prop: 'updateUserName', + formatter: formatUpdateUserName, + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 180, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 170, + }, + ], +}; + +export const excelOption = { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + action: '/blade-transport/transport-change-record/import-transport-change-record', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], +}; diff --git a/src/option/vehicle/violation-record.js b/src/option/vehicle/violation-record.js new file mode 100644 index 0000000..96fe013 --- /dev/null +++ b/src/option/vehicle/violation-record.js @@ -0,0 +1,297 @@ +import { formatUpdateUserName } from '@/utils/audit'; + +const validateNonNegative = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < 0) { + callback(new Error('不能小于 0')); + } else { + callback(); + } +}; + +const validateDeductPoints = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (!Number.isInteger(Number(value)) || Number(value) < 0 || Number(value) > 15) { + callback(new Error('被扣分数范围为 0-15 分')); + } else { + callback(); + } +}; + +export const vehicleTypeDic = [ + { label: '车辆', value: '车辆' }, + { label: '船舶', value: '船舶' }, +]; + +export const violationTypeDic = [ + { label: '闯红灯', value: '闯红灯' }, + { label: '超速', value: '超速' }, + { label: '违停', value: '违停' }, + { label: '压线', value: '压线' }, + { label: '其他', value: '其他' }, +]; + +export const processStatusDic = [ + { label: '未处理', value: '未处理' }, + { label: '已处理', value: '已处理' }, +]; + +export const option = { + height: 'auto', + calcHeight: 32, + dialogWidth: 1100, + labelPosition: 'top', + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + selection: true, + dialogClickModal: false, + menuWidth: 180, + column: [ + { + label: '车船类型', + prop: 'vehicleType', + type: 'radio', + minWidth: 110, + dicData: vehicleTypeDic, + value: '车辆', + search: true, + rules: [{ required: true, message: '请选择车船类型', trigger: 'change' }], + }, + { + label: '车牌号/船号', + prop: 'vehicleNo', + slot: true, + formslot: true, + search: true, + minWidth: 140, + rules: [ + { required: true, message: '请输入车牌号/船号', trigger: 'blur' }, + { max: 30, message: '最多 30 个字符', trigger: 'blur' }, + ], + }, + { + label: '驾驶人', + prop: 'driverName', + formslot: true, + search: true, + minWidth: 120, + rules: [ + { required: true, message: '请输入驾驶人/船长', trigger: 'blur' }, + { max: 20, message: '最多 20 个字符', trigger: 'blur' }, + ], + }, + { + label: '类型', + prop: 'violationType', + type: 'select', + dicData: violationTypeDic, + minWidth: 120, + rules: [{ required: true, message: '请选择类型', trigger: 'change' }], + }, + { + label: '事项', + prop: 'violationItem', + minWidth: 180, + overHidden: true, + display: false, + rules: [ + { required: true, message: '请输入事项', trigger: 'blur' }, + { max: 100, message: '最多 100 个字符', trigger: 'blur' }, + ], + }, + { + label: '日期', + prop: 'violationTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + minWidth: 170, + rules: [{ required: true, message: '请选择时间', trigger: 'click' }], + }, + { + label: '地点', + prop: 'location', + minWidth: 180, + overHidden: true, + rules: [ + { required: true, message: '请输入地点', trigger: 'blur' }, + { max: 100, message: '最多 100 个字符', trigger: 'blur' }, + ], + }, + { + label: '罚款', + prop: 'fineAmount', + type: 'number', + precision: 2, + minWidth: 100, + rules: [{ validator: validateNonNegative, trigger: 'blur' }], + }, + { + label: '被扣分数', + prop: 'deductPoints', + type: 'number', + precision: 0, + hide: true, + rules: [{ validator: validateDeductPoints, trigger: 'blur' }], + }, + { + label: '被罚单位', + prop: 'penaltyUnit', + minWidth: 150, + hide: true, + rules: [{ max: 50, message: '最多 50 个字符', trigger: 'blur' }], + }, + { + label: '状态', + prop: 'processStatus', + type: 'radio', + dicData: processStatusDic, + value: '已处理', + search: true, + minWidth: 120, + rules: [{ required: true, message: '请选择状态', trigger: 'change' }], + }, + { + label: '过程描述', + prop: 'processDescription', + type: 'textarea', + minRows: 3, + span: 24, + hide: true, + rules: [ + { required: true, message: '请输入过程描述', trigger: 'blur' }, + { max: 500, message: '最多 500 个字符', trigger: 'blur' }, + ], + }, + { + label: '处理结果', + prop: 'processResult', + type: 'textarea', + minRows: 3, + span: 24, + hide: true, + rules: [{ max: 500, message: '最多 500 个字符', trigger: 'blur' }], + }, + { + label: '附件', + prop: 'attachments', + type: 'upload', + listType: 'text', + multiple: true, + accept: '.jpg,.jpeg,.png,.pdf', + propsHttp: { + res: 'data', + url: 'link', + name: 'name', + }, + action: '/blade-resource/oss/endpoint/put-file', + span: 24, + minWidth: 100, + slot: true, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'date', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + viewDisplay: false, + display: false, + minWidth: 170, + }, + { + label: '创建开始时间', + prop: 'createTimeStart', + type: 'date', + format: 'YYYY-MM-DD 00:00:00', + valueFormat: 'YYYY-MM-DD 00:00:00', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建结束时间', + prop: 'createTimeEnd', + type: 'date', + format: 'YYYY-MM-DD 23:59:59', + valueFormat: 'YYYY-MM-DD 23:59:59', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '组织', + prop: 'createDept', + type: 'tree', + dicData: [], + props: { + label: 'title', + value: 'id', + }, + checkStrictly: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '更新人', + prop: 'updateUserName', + formatter: formatUpdateUserName, + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 180, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 170, + }, + ], +}; + +export const excelOption = { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + action: '/blade-transport/violation-record/import-violation-record', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], +}; diff --git a/src/page/index/logo.vue b/src/page/index/logo.vue index 8963ecc..9b7fa02 100644 --- a/src/page/index/logo.vue +++ b/src/page/index/logo.vue @@ -7,7 +7,7 @@ </transition> <transition-group name="fade"> <template v-if="getScreen(!isCollapse)"> - <span class="logo-title" key="1">{{ website.indexTitle }} </span> + <span class="logo-title" key="1">{{ website.indexTitle }}</span> </template> </transition-group> </div> @@ -30,7 +30,7 @@ export default { </script> <style scoped> .logo-title { - font-size: 20px; + font-size: 16px; background-image: linear-gradient(120deg, #54b6d0 16%, #3f8bdb, #2c77f1); -webkit-background-clip: text; -webkit-text-fill-color: transparent; diff --git a/src/page/login/callback.vue b/src/page/login/callback.vue new file mode 100644 index 0000000..b8944d1 --- /dev/null +++ b/src/page/login/callback.vue @@ -0,0 +1,74 @@ +<template> + <div class="callback-container"> + <div class="loading-174"></div> + </div> +</template> + +<script> +import { mapGetters } from 'vuex'; +import website from '@/config/website'; + +export default { + name: 'iamCallback', + computed: { + ...mapGetters(['tagWel']), + }, + created() { + this.handleCallback(); + }, + methods: { + handleCallback() { + const { code, state } = this.$route.query; + // console.log(this.$route.query); + if (!code) { + this.$router.replace('/login'); + return; + } + this.$store + .dispatch('LoginBySso', { + tenantId: state || website.tenantId, + code, + state: state || website.tenantId, + }) + .then(() => this.$store.dispatch('FlowRoutes')) + .then(() => { + this.$router.replace(this.tagWel); + }) + .catch(() => { + this.$router.replace('/login'); + }); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.callback-container { + width: 100vw; + height: 100vh; + display: flex; + align-items: center; + justify-content: center; + background: #fff; +} + +.loading-174 { + width: 10px; + aspect-ratio: 1; + background: #0694cd; + border-radius: 50%; + animation: loading-174 1s infinite linear alternate; +} + +@keyframes loading-174 { + 0% { + box-shadow: 15px 0 #0694cd, -25px 0 #0694cd; + } + 50% { + box-shadow: 15px 0 #0694cd, -15px 0 #0694cd; + } + 100% { + box-shadow: 25px 0 #0694cd, -15px 0 #0694cd; + } +} +</style> diff --git a/src/page/login/codelogin.vue b/src/page/login/codelogin.vue index ba7cf60..ae6b929 100644 --- a/src/page/login/codelogin.vue +++ b/src/page/login/codelogin.vue @@ -170,7 +170,6 @@ export default { if (data.success && data.data.tenantId) { this.tenantMode = false; this.loginForm.tenantId = data.data.tenantId; - this.$parent.$refs.login.style.backgroundImage = `url(${data.data.backgroundUrl})`; } }); }, diff --git a/src/page/login/index.vue b/src/page/login/index.vue index abbb8ee..ac42e2d 100644 --- a/src/page/login/index.vue +++ b/src/page/login/index.vue @@ -4,36 +4,33 @@ {{ time }} </div> <div class="login-weaper"> - <div class="login-left animate__animated animate__fadeInLeft"> - <img class="img" src="/img/logo.png" alt="" /> - <p class="title">{{ $t('login.info') }}</p> - </div> <div class="login-border animate__animated animate__fadeInRight"> <div class="login-main"> <p class="login-title"> {{ $t('login.title') }}{{ website.title }} <top-lang></top-lang> </p> + <!-- 原登录方式先注释保留备用 <userLogin v-if="activeName === 'user'"></userLogin> <codeLogin v-else-if="activeName === 'code'"></codeLogin> <thirdLogin v-else-if="activeName === 'third'"></thirdLogin> <registerLogin v-else-if="activeName === 'register'"></registerLogin> <div class="login-menu"> - <el-link href="#" @click.stop="activeName = 'user'">{{ - $t('login.userLogin') - }}</el-link> - <el-link href="#" @click.stop="activeName = 'code'">{{ - $t('login.phoneLogin') - }}</el-link> - <el-link href="#" @click.stop="activeName = 'third'">{{ - $t('login.thirdLogin') - }}</el-link> - <el-link - :href=" - website.oauth2.ssoBaseUrl + website.oauth2.ssoAuthUrl + website.oauth2.redirectUri - " - >{{ $t('login.ssoLogin') }}</el-link - > + <el-link href="#" @click.stop="activeName = 'user'">{{ $t('login.userLogin') }}</el-link> + <el-link href="#" @click.stop="activeName = 'code'">{{ $t('login.phoneLogin') }}</el-link> + <el-link href="#" @click.stop="activeName = 'third'">{{ $t('login.thirdLogin') }}</el-link> + <el-link :href="iamAuthorizeUrl">{{ $t('login.ssoLogin') }}</el-link> + </div> + --> + <userLogin v-if="activeName === 'user'"></userLogin> + <registerLogin v-else-if="activeName === 'register'"></registerLogin> + <div v-else class="iam-login"> + <el-button type="primary" class="login-submit" @click.prevent="handleIamLogin"> + IAM统一身份认证 + </el-button> + <el-button class="account-submit" @click.prevent="activeName = 'user'"> + 账号密码登录 + </el-button> </div> </div> </div> @@ -64,7 +61,7 @@ export default { return { website: website, time: '', - activeName: 'user', + activeName: 'iam', socialForm: { tenantId: '000000', source: '', @@ -85,6 +82,17 @@ export default { mounted() {}, computed: { ...mapGetters(['tagWel']), + iamAuthorizeUrl() { + const params = new URLSearchParams({ + client_id: this.website.oauth2.ssoClientId, + response_type: 'code', + redirect_uri: this.website.oauth2.redirectUri, + state: this.website.tenantId, + }); + return `${this.website.oauth2.ssoBaseUrl}${ + this.website.oauth2.ssoAuthUrl + }?${params.toString()}`; + }, }, props: [], methods: { @@ -152,9 +160,25 @@ export default { }); } }, + handleIamLogin() { + window.location.href = this.iamAuthorizeUrl; + }, loadFlowRoutes() { this.$store.dispatch('FlowRoutes').then(() => {}); }, }, }; </script> +<style lang="scss" scoped> +.account-submit { + width: 100%; + height: 45px; + font-size: 18px; + letter-spacing: 2px; + font-weight: 300; + cursor: pointer; + margin-top: 18px; + margin-left: 0; + transition: 0.25s; +} +</style> diff --git a/src/page/login/registerlogin.vue b/src/page/login/registerlogin.vue index 7e5c6b4..6d66659 100644 --- a/src/page/login/registerlogin.vue +++ b/src/page/login/registerlogin.vue @@ -205,7 +205,6 @@ export default { if (data.success && data.data.tenantId) { this.tenantMode = false; this.loginForm.tenantId = data.data.tenantId; - this.$parent.$refs.login.style.backgroundImage = `url(${data.data.backgroundUrl})`; } }); }, diff --git a/src/page/login/userlogin.vue b/src/page/login/userlogin.vue index 5e3a1d1..5972557 100644 --- a/src/page/login/userlogin.vue +++ b/src/page/login/userlogin.vue @@ -83,7 +83,6 @@ import { mapGetters } from 'vuex'; import { info } from '@/api/system/tenant'; import { getCaptcha } from '@/api/user'; import { getTopUrl } from '@/utils/util'; -import { validatenull } from '@/utils/validate'; import BehaviorCaptcha from '@/components/behavior-captcha/index.vue'; export default { @@ -201,13 +200,6 @@ export default { if (data.success && data.data.tenantId) { this.tenantMode = false; this.loginForm.tenantId = data.data.tenantId; - if (!validatenull(data.data.backgroundUrl)) { - const loginEl = this.$parent.$refs.login; - loginEl.style.backgroundImage = `url(${data.data.backgroundUrl})`; - loginEl.style.backgroundSize = '100% 100%'; - loginEl.style.backgroundRepeat = 'no-repeat'; - loginEl.style.backgroundPosition = 'center center'; - } } }); }, diff --git a/src/router/page/index.js b/src/router/page/index.js index 3a148f7..9110d5c 100644 --- a/src/router/page/index.js +++ b/src/router/page/index.js @@ -23,6 +23,16 @@ export default [ isAuth: false, }, }, + { + path: '/callback', + name: 'IAM统一身份认证回调', + component: () => import('@/page/login/callback.vue'), + meta: { + keepAlive: true, + isTab: false, + isAuth: false, + }, + }, { path: '/lock', name: '锁屏页', diff --git a/src/store/modules/user.js b/src/store/modules/user.js index ae8648a..32a9e22 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -101,7 +101,8 @@ const user = { //根据单点信息登录 LoginBySso({ commit }, userInfo) { return new Promise((resolve, reject) => { - loginBySso(userInfo.state, userInfo.code) + const tenantId = userInfo.tenantId || userInfo.state; + loginBySso(tenantId, userInfo.state, userInfo.code) .then(res => { const data = res.data; if (data.error_description) { diff --git a/src/styles/common.scss b/src/styles/common.scss index 11cce9c..40248c8 100644 --- a/src/styles/common.scss +++ b/src/styles/common.scss @@ -48,6 +48,15 @@ a { height: 100%; overflow: hidden; + &:not(.avue-layout--horizontal) { + .avue-sidebar { + background-image: url('/img/左侧背景放底部.png') !important; + background-repeat: no-repeat !important; + background-position: left bottom !important; + background-size: 100% auto !important; + } + } + &--horizontal { flex-direction: column; diff --git a/src/styles/login.scss b/src/styles/login.scss index 4421443..38d4752 100644 --- a/src/styles/login.scss +++ b/src/styles/login.scss @@ -4,10 +4,12 @@ align-items: center; width: 100%; height: 100%; - // background-color: #fff; - background: linear-gradient(110deg, rgb(2, 40, 85) 0%, rgb(44, 119, 241) 50%, rgb(255,255,255) 50%, rgb(240,240,240) 100%); + background-image: url('/img/运输登录.jpg'); + background-position: center center; + background-repeat: no-repeat; + background-size: cover; overflow: hidden; - &::before{ + &::before { // content:' '; position: absolute; top: 0; @@ -15,7 +17,7 @@ width: 100%; height: 100%; margin-left: -48%; - background-image: url(/img/login-bg.svg); + background-image: url('/img/运输登录.jpg'); background-position: 100%; background-repeat: no-repeat; background-size: auto 100%; @@ -23,29 +25,17 @@ } .login-weaper { margin: 0 auto; - width:100%; + width: 100%; + display: flex; + justify-content: flex-end; } -.login-left, .login-border { position: relative; min-height: 500px; align-items: center; display: flex; } -.login-left { - padding-top: 100px; - justify-content: center; - flex-direction: column; - color: #fff; - float: left; - width: 50%; - position: relative; - box-sizing: border-box; -} -.login-left .img { - width: 200px; -} .login-time { position: absolute; left: 25px; @@ -58,15 +48,6 @@ overflow: hidden; font-weight: bold; } -.login-left .title { - margin-top: 60px; - text-align: center; - color: #fff; - font-weight: 300; - letter-spacing: 2px; - font-size: 28px; - font-weight: bold; -} .login-border { border-left: none; @@ -74,7 +55,6 @@ border-bottom-right-radius: 5px; color: #fff; width: 50%; - float: left; box-sizing: border-box; } .login-main { @@ -83,6 +63,7 @@ width: 70%; //box-shadow: -4px 5px 10px rgba(255, 255, 255, 0.4); box-sizing: border-box; + background: white; } .login-main > h3 { margin-bottom: 20px; @@ -114,7 +95,7 @@ cursor: pointer; margin-top: 30px; transition: 0.25s; - background-color: #2C77F1; + background-color: #2c77f1; } .register-submit { width: 100%; @@ -124,7 +105,7 @@ font-weight: 300; cursor: pointer; margin-top: 30px; - margin-left: 0!important; + margin-left: 0 !important; transition: 0.25s; } .login-form { @@ -136,16 +117,17 @@ input { text-indent: 5px; } - .el-input__wrapper{ - padding:5px 10px; + .el-input__wrapper { + padding: 5px 10px; border-radius: 0; } - .el-input__suffix,.el-input__prefix{ + .el-input__suffix, + .el-input__prefix { display: flex; align-items: center; text-align: center; } - .el-input__prefix{ + .el-input__prefix { margin-left: 8px; } } @@ -153,11 +135,11 @@ .login-code { width: 100%; height: 100%; - .el-input-group__append{ + .el-input-group__append { background-color: #fff; } } -.login-code-box{ +.login-code-box { display: flex; align-items: center; } diff --git a/src/styles/media.scss b/src/styles/media.scss index 0330337..89ce6d3 100644 --- a/src/styles/media.scss +++ b/src/styles/media.scss @@ -27,20 +27,6 @@ width: 98%; } //登录页面 - .login-left { - width: 100%; - min-height: auto; - - .title { - margin-top: 20px; - font-size: 20px; - text-shadow: #000 1px 0 0, #000 0 1px 0, #000 -1px 0 0, #000 0 -1px 0; - } - - .img { - width: 50px; - } - } .login-logo { padding-top: 30px; margin-left: -30px; @@ -55,11 +41,11 @@ width: 100%; background-color: #fff; padding: 10px 20px; - box-shadow: none + box-shadow: none; } .login-container { &::before { - margin-left: 0 + margin-left: 0; } } .top-bar__item { diff --git a/src/styles/theme/cool.scss b/src/styles/theme/cool.scss index 82e7e75..1ae469b 100644 --- a/src/styles/theme/cool.scss +++ b/src/styles/theme/cool.scss @@ -145,25 +145,25 @@ input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { /* WebKit browsers */ - color: #fff; + color: #909399; } input:-moz-placeholder, textarea:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ - color: #fff; + color: #909399; } input::-moz-placeholder, textarea::-moz-placeholder { /* Mozilla Firefox 19+ */ - color: #fff; + color: #909399; } input:-ms-input-placeholder, textarea:-ms-input-placeholder { /* Internet Explorer 10+ */ - color: #fff; + color: #909399; } } diff --git a/src/styles/theme/star.scss b/src/styles/theme/star.scss index 7a8055a..1e91646 100644 --- a/src/styles/theme/star.scss +++ b/src/styles/theme/star.scss @@ -86,25 +86,25 @@ input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { /* WebKit browsers */ - color: #fff; + color: #909399; } input:-moz-placeholder, textarea:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ - color: #fff; + color: #909399; } input::-moz-placeholder, textarea::-moz-placeholder { /* Mozilla Firefox 19+ */ - color: #fff; + color: #909399; } input:-ms-input-placeholder, textarea:-ms-input-placeholder { /* Internet Explorer 10+ */ - color: #fff; + color: #909399; } } diff --git a/src/styles/theme/white.scss b/src/styles/theme/white.scss index 338dba1..cd5db57 100644 --- a/src/styles/theme/white.scss +++ b/src/styles/theme/white.scss @@ -113,25 +113,25 @@ input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { /* WebKit browsers */ - color: #fff; + color: #909399; } input:-moz-placeholder, textarea:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ - color: #fff; + color: #909399; } input::-moz-placeholder, textarea::-moz-placeholder { /* Mozilla Firefox 19+ */ - color: #fff; + color: #909399; } input:-ms-input-placeholder, textarea:-ms-input-placeholder { /* Internet Explorer 10+ */ - color: #fff; + color: #909399; } } diff --git a/src/styles/top.scss b/src/styles/top.scss index ddb4cbb..432aa30 100644 --- a/src/styles/top.scss +++ b/src/styles/top.scss @@ -54,8 +54,13 @@ .el-input__wrapper { font-size: 13px; border: none; - box-shadow: none; - background-color: transparent; + box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.45); + background-color: #fff; + border-radius: 4px; + } + + .el-input__inner { + color: #303133; } } @@ -90,6 +95,22 @@ right: 10px; display: flex; align-items: center; + color: #fff; + + i, + .el-icon, + .el-dropdown, + .el-dropdown-link { + color: inherit; + } + + .el-color-picker__trigger { + border-color: rgba(255, 255, 255, 0.85); + } + + .el-color-picker__icon { + color: inherit; + } } .top-bar__item { @@ -109,6 +130,7 @@ height: 100%; padding-left: 50px; box-sizing: border-box; + background: url('/img/系统首页顶部背景图.png') center center / cover no-repeat; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; diff --git a/src/utils/audit.js b/src/utils/audit.js new file mode 100644 index 0000000..b09b2fb --- /dev/null +++ b/src/utils/audit.js @@ -0,0 +1,4 @@ +export const formatUpdateUserName = row => { + if (!row) return ''; + return row.updateUserName || row.updateUser || ''; +}; diff --git a/src/utils/crypto.js b/src/utils/crypto.js index 4bbd03a..3b1e677 100644 --- a/src/utils/crypto.js +++ b/src/utils/crypto.js @@ -5,17 +5,17 @@ export default class crypto { * token加密key 使用@org.springblade.test.CryptoKeyGenerator获取,需和后端配置保持一致 * @type {string} */ - static cryptoKey = '请配置cryptoKey'; + static cryptoKey = 'NWmP0cuIWAfL6GPeLJlbY8898b5iPk1y'; /** * 报文加密key 使用@org.springblade.test.CryptoKeyGenerator获取,需和后端配置保持一致 * @type {string} */ - static aesKey = '请配置aesKey'; + static aesKey = 'gLJvoZfX9pOp3nkIdQ9U2DzxlzsrTvJC'; /** * 报文加密key 使用@org.springblade.test.CryptoKeyGenerator获取,需和后端配置保持一致 * @type {string} */ - static desKey = '请配置desKey'; + static desKey = 'hdlxNCD2KZI91Taq'; /** * aes 加密方法 diff --git a/src/views/base/airport-master.vue b/src/views/base/airport-master.vue new file mode 100644 index 0000000..d4c4dba --- /dev/null +++ b/src/views/base/airport-master.vue @@ -0,0 +1,665 @@ +<template> + <basic-container class="airport-master-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + v-model="form" + ref="crud" + :permission="permissionList" + :before-open="beforeOpen" + @row-save="rowSave" + @row-update="rowUpdate" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('airport_master_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('airport_master_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('airport_master_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('airport_master_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #status="{ row }"> + <el-tag :type="row.status === 1 ? 'primary' : 'info'"> + {{ row.status === 1 ? '启用' : '停用' }} + </el-tag> + </template> + <template #menu="{ row, index }"> + <el-button + type="primary" + text + icon="el-icon-edit" + v-if="hasPermission('airport_master_edit')" + @click="$refs.crud.rowEdit(row, index)" + > + 编辑 + </el-button> + <el-button + type="primary" + text + :icon="row.status === 1 ? 'el-icon-close' : 'el-icon-check'" + v-if="hasPermission('airport_master_status')" + @click="handleStatus(row)" + > + {{ row.status === 1 ? '停用' : '启用' }} + </el-button> + </template> + </avue-crud> + + <el-dialog title="空港机场主数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form + :option="excelOption" + v-model="excelForm" + :upload-before="uploadBefore" + :upload-after="uploadAfter" + > + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { getList, getDetail, submit, remove, changeStatus } from '@/api/base/airport-master'; +import { getLazyTree } from '@/api/base/region'; +import { exportBlob } from '@/api/common'; +import { mapGetters } from 'vuex'; +import { downloadXls } from '@/utils/util'; +import { formatUpdateUserName } from '@/utils/audit'; +import { getToken } from '@/utils/auth'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + const validateIataCode = (rule, value, callback) => { + if (!/^[A-Z]{3}$/.test(String(value || '').toUpperCase())) { + callback(new Error('IATA编码为3位大写字母')); + } else { + callback(); + } + }; + const validateIcaoCode = (rule, value, callback) => { + if (!/^[A-Z]{4}$/.test(String(value || '').toUpperCase())) { + callback(new Error('ICAO代码为4位大写字母')); + } else { + callback(); + } + }; + const validateLongitude = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < -180 || Number(value) > 180) { + callback(new Error('经度范围为 -180 到 180')); + } else { + callback(); + } + }; + const validateLatitude = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < -90 || Number(value) > 90) { + callback(new Error('纬度范围为 -90 到 90')); + } else { + callback(); + } + }; + return { + form: {}, + query: {}, + loading: true, + data: [], + excelBox: false, + excelForm: {}, + provinceOptions: [], + cityOptions: [], + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + option: { + height: 'auto', + calcHeight: 32, + dialogWidth: 980, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + indexLabel: '序号', + indexWidth: 70, + viewBtn: false, + delBtn: false, + editBtn: false, + selection: true, + dialogClickModal: false, + menuWidth: 160, + column: [ + { + label: '编码', + prop: 'code', + search: true, + addDisabled: true, + editDisabled: true, + placeholder: '系统自动生成', + searchPlaceholder: '请输入编码', + }, + { + label: 'IATA编码', + prop: 'iataCode', + minWidth: 120, + maxlength: 3, + rules: [ + { required: true, message: '请输入IATA编码', trigger: 'blur' }, + { validator: validateIataCode, trigger: 'blur' }, + ], + change: ({ value }) => this.handleIataChange(value), + blur: ({ value }) => this.handleIataChange(value), + }, + { + label: 'ICAO代码', + prop: 'icaoCode', + minWidth: 100, + maxlength: 4, + rules: [ + { required: true, message: '请输入ICAO代码', trigger: 'blur' }, + { validator: validateIcaoCode, trigger: 'blur' }, + ], + change: ({ value }) => this.handleIcaoChange(value), + blur: ({ value }) => this.handleIcaoChange(value), + }, + { + label: '机场标准名称', + prop: 'name', + minWidth: 180, + search: true, + rules: [{ required: true, message: '请输入机场标准名称', trigger: 'blur' }], + }, + { + label: '机场简称', + prop: 'shortName', + minWidth: 130, + }, + { + label: '所属省份', + prop: 'provinceCode', + type: 'select', + minWidth: 120, + hide: true, + props: { + label: 'title', + value: 'id', + }, + dicData: [], + filterable: true, + rules: [{ required: true, message: '请选择省份', trigger: 'change' }], + change: ({ value }) => this.handleProvinceChange(value), + }, + { + label: '所属省份', + prop: 'provinceName', + minWidth: 140, + addDisplay: false, + editDisplay: false, + }, + { + label: '所属城市', + prop: 'cityCode', + type: 'select', + minWidth: 120, + hide: true, + props: { + label: 'title', + value: 'id', + }, + dicData: [], + filterable: true, + rules: [{ required: true, message: '请选择城市', trigger: 'change' }], + change: ({ value }) => this.handleCityChange(value), + }, + { + label: '所属城市', + prop: 'cityName', + minWidth: 140, + addDisplay: false, + editDisplay: false, + }, + { + label: '经度', + prop: 'longitude', + type: 'number', + precision: 6, + rules: [{ validator: validateLongitude, trigger: 'blur' }], + }, + { + label: '纬度', + prop: 'latitude', + type: 'number', + precision: 6, + rules: [{ validator: validateLatitude, trigger: 'blur' }], + }, + { + label: '数据来源', + prop: 'dataSource', + type: 'select', + search: true, + dicData: [ + { label: '全部', value: '' }, + { label: '初始导入', value: '初始导入' }, + { label: '批量导入', value: '批量导入' }, + { label: '手动录入', value: '手动录入' }, + ], + }, + { + label: '启停状态', + prop: 'status', + type: 'select', + search: true, + slot: true, + dataType: 'number', + dicData: [ + { label: '全部', value: '' }, + { label: '启用', value: 1 }, + { label: '停用', value: 2 }, + ], + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 4, + span: 24, + hide: true, + maxlength: 200, + showWordLimit: true, + rules: [{ max: 200, message: '备注不能超过200字', trigger: 'blur' }], + }, + { + label: '更新人', + prop: 'updateUserName', + formatter: formatUpdateUserName, + addDisplay: false, + editDisplay: false, + minWidth: 120, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 160, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 160, + }, + ], + }, + excelOption: { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + accept: '.xls,.xlsx', + action: '/blade-system/airport-master/import-airport-master', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], + }, + }; + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + permissionList() { + return { + addBtn: this.hasPermission('airport_master_add'), + }; + }, + isAdmin() { + const authority = this.userInfo && this.userInfo.authority; + return Array.isArray(authority) ? authority.includes('admin') : String(authority || '').includes('admin'); + }, + ids() { + let ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + created() { + this.loadProvinceOptions(); + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission && this.permission[code], false); + }, + findColumn(prop) { + return this.option.column.find(item => item.prop === prop); + }, + loadProvinceOptions() { + getLazyTree('00').then(res => { + this.provinceOptions = res.data.data; + this.findColumn('provinceCode').dicData = this.provinceOptions; + }); + }, + loadCityOptions(provinceCode) { + if (!provinceCode) { + this.cityOptions = []; + this.findColumn('cityCode').dicData = []; + return Promise.resolve(); + } + return getLazyTree(provinceCode).then(res => { + this.cityOptions = res.data.data; + this.findColumn('cityCode').dicData = this.cityOptions; + }); + }, + handleIataChange(value) { + this.form.iataCode = String(value || '') + .toUpperCase() + .replace(/[^A-Z]/g, '') + .slice(0, 3); + this.form.code = this.form.iataCode ? `JC-${this.form.iataCode}` : ''; + }, + handleIcaoChange(value) { + this.form.icaoCode = String(value || '') + .toUpperCase() + .replace(/[^A-Z]/g, '') + .slice(0, 4); + }, + handleProvinceChange(value) { + const province = this.provinceOptions.find(item => item.id === value); + this.form.provinceName = province ? province.title : ''; + this.form.cityCode = undefined; + this.form.cityName = ''; + this.loadCityOptions(value); + }, + handleCityChange(value) { + const city = this.cityOptions.find(item => item.id === value); + this.form.cityName = city ? city.title : ''; + }, + normalizeRow(row) { + row.code = row.iataCode ? `JC-${row.iataCode}` : row.code; + if (!row.dataSource) row.dataSource = '手动录入'; + if (!row.status) row.status = 1; + return row; + }, + validateUnique(row) { + const rowId = String(row.id || ''); + const hasDuplicate = (params, prop) => { + return getList(1, 10, params).then(res => { + const records = res.data.data.records || []; + return records.some(item => item[prop] === row[prop] && String(item.id || '') !== rowId); + }); + }; + return Promise.all([ + hasDuplicate({ iataCode: row.iataCode }, 'iataCode'), + hasDuplicate({ icaoCode: row.icaoCode }, 'icaoCode'), + ]).then(([iataExists, icaoExists]) => { + if (iataExists) { + return Promise.reject(new Error('该IATA编码已存在')); + } + if (icaoExists) { + return Promise.reject(new Error('该ICAO代码已存在')); + } + return Promise.resolve(); + }); + }, + handleSubmitError(error, loading) { + const uniqueMessages = ['该IATA编码已存在', '该ICAO代码已存在']; + if (uniqueMessages.includes(error.message)) { + this.$message.warning(error.message); + } + window.console.log(error); + loading(); + }, + rowSave(row, done, loading) { + const submitRow = this.normalizeRow(row); + this.validateUnique(submitRow) + .then(() => submit(submitRow)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }) + .catch(error => this.handleSubmitError(error, loading)); + }, + rowUpdate(row, index, done, loading) { + const submitRow = this.normalizeRow(row); + this.validateUnique(submitRow) + .then(() => submit(submitRow)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }) + .catch(error => this.handleSubmitError(error, loading)); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + handleStatus(row) { + const nextStatus = row.status === 1 ? 2 : 1; + const actionName = nextStatus === 1 ? '启用' : '停用'; + this.$confirm(`是否确认${actionName}该条数据?`, { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => changeStatus(row.id, nextStatus)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + beforeOpen(done, type) { + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + this.form = res.data.data; + this.loadCityOptions(this.form.provinceCode).then(() => done()); + }); + return; + } + this.form.code = ''; + this.form.dataSource = '手动录入'; + this.form.status = 1; + this.loadCityOptions(this.form.provinceCode).then(() => done()); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadBefore(file, done) { + const fileName = file && file.name ? file.name.toLowerCase() : ''; + if (!/\.(xls|xlsx)$/.test(fileName)) { + this.$message.error('请上传 .xls,.xlsx 标准格式文件'); + return false; + } + if (typeof done === 'function') { + done(); + } + return true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出空港机场主数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-system/airport-master/export-airport-master', this.buildExportParams()) + .then(res => { + downloadXls( + res.data, + `空港机场主数据${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx` + ); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob( + `/blade-system/airport-master/export-template?${this.website.tokenHeader}=${getToken()}` + ).then(res => { + downloadXls(res.data, '空港机场主数据模板.xlsx'); + }); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.airport-master-page { + :deep(.avue-crud__header), + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } +} +</style> diff --git a/src/views/base/common-address.vue b/src/views/base/common-address.vue new file mode 100644 index 0000000..9e744dd --- /dev/null +++ b/src/views/base/common-address.vue @@ -0,0 +1,815 @@ +<template> + <basic-container class="common-address-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + v-model="form" + ref="crud" + :permission="permissionList" + :before-open="beforeOpen" + @row-save="rowSave" + @row-update="rowUpdate" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-plus" + plain + v-if="hasPermission('common_address_add')" + @click="$refs.crud.rowAdd()" + >新增 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('common_address_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('common_address_delete')" + @click="handleDelete" + >批量删除 + </el-button> + <el-switch + v-if="canViewAllDept" + v-model="allDept" + class="common-address-page__scope" + active-text="全部组织" + inactive-text="当前组织" + :active-value="1" + :inactive-value="0" + @change="handleScopeChange" + /> + </template> + + <template #siteCodeDisplay="{ row }"> + <span>{{ row.addressType === '常规地址' ? '/' : row.siteCodeDisplay || row.siteCode }}</span> + </template> + + <template #menu="{ row, index }"> + <el-button + type="primary" + text + icon="el-icon-view" + v-if="hasPermission('common_address_view')" + @click="$refs.crud.rowView(row, index)" + > + 查看 + </el-button> + <el-button + type="primary" + text + icon="el-icon-edit" + v-if="hasPermission('common_address_edit') && !row.readonly" + @click="$refs.crud.rowEdit(row, index)" + > + 编辑 + </el-button> + <el-button + type="primary" + text + icon="el-icon-delete" + v-if="hasPermission('common_address_delete') && !row.readonly" + @click="rowDel(row)" + > + 删除 + </el-button> + </template> + + <template #sourceId-form> + <el-select + v-model="form.sourceId" + filterable + remote + clearable + :remote-method="loadSourceOptions" + :loading="sourceLoading" + :disabled="dialogReadonly || form.addressType === '常规地址'" + placeholder="请选择来源主数据" + style="width: 100%" + @change="handleSourceChange" + > + <el-option + v-for="item in sourceOptions" + :key="item.sourceId" + :label="`${item.addressName}(${item.siteCode})`" + :value="item.sourceId" + /> + </el-select> + </template> + + <template #detailAddress-form> + <div class="common-address-page__address"> + <el-input + v-model="form.detailAddress" + type="textarea" + :rows="3" + maxlength="255" + show-word-limit + :disabled="dialogReadonly || form.addressType !== '常规地址'" + /> + <el-button + icon="el-icon-location" + plain + :disabled="dialogReadonly || form.addressType !== '常规地址'" + @click="handleMapPick" + > + 地图选点 + </el-button> + </div> + </template> + </avue-crud> + + <el-dialog + title="地图选点" + append-to-body + v-model="mapBox" + width="920px" + class="common-address-page__map-dialog" + @opened="initTiandituMap" + > + <div class="common-address-page__map-toolbar"> + <el-input + v-model="mapKeyword" + clearable + placeholder="输入地址关键词" + @keyup.enter="searchMapKeyword" + /> + <el-button type="primary" icon="el-icon-search" :loading="mapLoading" @click="searchMapKeyword"> + 搜索 + </el-button> + </div> + <div ref="tiandituMap" class="common-address-page__map"></div> + <div class="common-address-page__map-info"> + <span>{{ mapStatus }}</span> + <span v-if="mapSelected.longitude"> + 经度:{{ mapSelected.longitude }},纬度:{{ mapSelected.latitude }} + </span> + </div> + <template #footer> + <el-button @click="mapBox = false">取消</el-button> + <el-button type="primary" :disabled="!mapSelected.longitude" @click="confirmMapPick"> + 确定 + </el-button> + </template> + </el-dialog> + </basic-container> +</template> + +<script> +import { getDetail, getList, getSourceOptions, remove, submit } from '@/api/base/common-address'; +import { getDeptTree } from '@/api/system/dept'; +import { exportBlob } from '@/api/common'; +import { createOption } from '@/option/base/common-address'; +import { mapGetters } from 'vuex'; +import { downloadXls } from '@/utils/util'; +import { getToken } from '@/utils/auth'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +const TIANDITU_KEY = '71f234f251d4cb1feeb3c293a0f21709'; +let tiandituLoader; + +export default { + data() { + const validateLongitude = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < -180 || Number(value) > 180) { + callback(new Error('经度范围为 -180 到 180')); + } else { + callback(); + } + }; + const validateLatitude = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < -90 || Number(value) > 90) { + callback(new Error('纬度范围为 -90 到 90')); + } else { + callback(); + } + }; + return { + form: {}, + query: {}, + loading: true, + data: [], + allDept: 0, + dialogReadonly: false, + sourceLoading: false, + sourceOptions: [], + deptOptions: [], + mapBox: false, + mapLoading: false, + mapKeyword: '', + mapStatus: '可搜索地址或点击地图选点', + mapSelected: {}, + tiandituMap: null, + tiandituMarker: null, + tiandituGeocoder: null, + tiandituClickHandler: null, + option: createOption({ validateLongitude, validateLatitude }), + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + }; + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + permissionList() { + return { + addBtn: this.hasPermission('common_address_add'), + }; + }, + isAdmin() { + const authority = this.userInfo && this.userInfo.authority; + return Array.isArray(authority) ? authority.includes('admin') : String(authority || '').includes('admin'); + }, + canViewAllDept() { + return this.isAdmin; + }, + ids() { + return this.selectionList.map(item => item.id).join(','); + }, + }, + created() { + this.initDeptTree(); + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission && this.permission[code], false); + }, + initDeptTree() { + getDeptTree(this.userInfo.tenantId).then(res => { + this.deptOptions = this.flattenDept(res.data.data || []); + const deptColumn = this.findColumn(this.option.column, 'deptId'); + deptColumn.dicData = this.deptOptions; + }); + }, + flattenDept(tree, level = 0) { + const result = []; + tree.forEach(item => { + result.push({ + label: `${' '.repeat(level)}${item.title || item.deptName || item.name}`, + value: item.id, + rawLabel: item.title || item.deptName || item.name, + }); + if (item.children && item.children.length) { + result.push(...this.flattenDept(item.children, level + 1)); + } + }); + return result; + }, + handleScopeChange() { + if (!this.canViewAllDept) { + this.allDept = 0; + } + if (!this.allDept) { + this.query.deptId = undefined; + } + this.page.currentPage = 1; + this.onLoad(this.page); + }, + loadSourceOptions(keyword = '') { + if (!this.form.addressType || this.form.addressType === '常规地址') { + this.sourceOptions = []; + return; + } + this.sourceLoading = true; + getSourceOptions(this.form.addressType, keyword) + .then(res => { + this.sourceOptions = res.data.data || []; + }) + .finally(() => { + this.sourceLoading = false; + }); + }, + handleSourceChange(value) { + const source = this.sourceOptions.find(item => item.sourceId === value); + if (!source) return; + this.form.addressName = this.form.addressName || source.addressName; + this.form.siteCode = source.siteCode; + this.form.siteCodeDisplay = source.siteCode; + this.form.detailAddress = source.detailAddress; + this.form.regionName = source.regionName; + this.form.longitude = source.longitude; + this.form.latitude = source.latitude; + }, + handleAddressTypeChange(value, reset = true) { + const sourceColumn = this.findColumn(this.option.column, 'sourceId'); + sourceColumn.rules = value === '常规地址' ? [] : [{ required: true, message: '请选择来源主数据', trigger: 'change' }]; + const sourceDisabled = value === '常规地址'; + this.findColumn(this.option.column, 'longitude').disabled = !sourceDisabled; + this.findColumn(this.option.column, 'latitude').disabled = !sourceDisabled; + if (value === '常规地址') { + if (reset) { + this.form.sourceId = undefined; + this.form.siteCode = '/'; + this.form.siteCodeDisplay = '/'; + this.sourceOptions = []; + } + return; + } + if (reset) { + this.form.sourceId = undefined; + this.form.siteCode = ''; + this.form.siteCodeDisplay = ''; + } + this.loadSourceOptions(); + }, + normalizeRow(row) { + const submitRow = { + ...row, + addressName: String(row.addressName || '').trim(), + addressType: String(row.addressType || '').trim(), + detailAddress: String(row.detailAddress || '').trim(), + regionName: String(row.regionName || '').trim(), + contactName: String(row.contactName || '').trim(), + contactPhone: String(row.contactPhone || '').trim(), + remark: String(row.remark || '').trim(), + }; + if (submitRow.addressType === '常规地址') { + submitRow.siteCode = '/'; + submitRow.sourceId = undefined; + } + return submitRow; + }, + validateRequiredFields(row) { + if (!row.addressType) { + this.$message.warning('请选择类型'); + return false; + } + if (!row.addressName) { + this.$message.warning('请输入地址名称'); + return false; + } + if (!row.detailAddress) { + this.$message.warning('请输入详细地址'); + return false; + } + if (row.addressType !== '常规地址' && !row.sourceId) { + this.$message.warning('请选择来源主数据'); + return false; + } + if (row.remark && row.remark.length > 200) { + this.$message.warning('备注不能超过200个字'); + return false; + } + if (row.longitude !== undefined && row.longitude !== null && row.longitude !== '') { + if (Number(row.longitude) < -180 || Number(row.longitude) > 180) { + this.$message.warning('经度范围为 -180 到 180'); + return false; + } + row.longitude = Number(row.longitude).toFixed(6); + } + if (row.latitude !== undefined && row.latitude !== null && row.latitude !== '') { + if (Number(row.latitude) < -90 || Number(row.latitude) > 90) { + this.$message.warning('纬度范围为 -90 到 90'); + return false; + } + row.latitude = Number(row.latitude).toFixed(6); + } + return true; + }, + stopSubmitLoading(loading) { + if (typeof loading === 'function') { + loading(); + } + }, + rowSave(row, done, loading) { + const submitRow = this.normalizeRow(row); + if (!this.validateRequiredFields(submitRow)) { + this.stopSubmitLoading(loading); + return; + } + submit(submitRow).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + const submitRow = this.normalizeRow(row); + if (!this.validateRequiredFields(submitRow)) { + this.stopSubmitLoading(loading); + return; + } + submit(submitRow).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(res => { + this.afterRemove(res.data.data); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + const editableSelection = this.selectionList.filter(item => !item.readonly); + if (!editableSelection.length) { + this.$message.warning('所选数据均为只读组织数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(editableSelection.map(item => item.id).join(','))) + .then(res => { + this.afterRemove(res.data.data); + }); + }, + afterRemove(result = {}) { + this.onLoad(this.page); + const successCount = result.successCount || 0; + const skippedCount = result.skippedCount || 0; + if (skippedCount) { + this.$message.warning(`成功删除${successCount}条,${skippedCount}条因业务引用已跳过`); + } else { + this.$message({ type: 'success', message: '删除成功!' }); + } + this.$refs.crud.toggleSelection(); + }, + beforeOpen(done, type) { + this.dialogReadonly = type === 'view'; + const addressTypeColumn = this.findColumn(this.option.column, 'addressType'); + addressTypeColumn.change = ({ value }) => this.handleAddressTypeChange(value); + if (type === 'add') { + this.form.addressType = this.form.addressType || '常规地址'; + this.form.siteCode = '/'; + this.form.siteCodeDisplay = '/'; + this.handleAddressTypeChange(this.form.addressType); + done(); + return; + } + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + this.form = res.data.data; + this.handleAddressTypeChange(this.form.addressType, false); + if (this.form.addressType !== '常规地址' && this.form.sourceId) { + this.sourceOptions = [ + { + sourceId: this.form.sourceId, + addressName: this.form.addressName, + siteCode: this.form.siteCode, + detailAddress: this.form.detailAddress, + regionName: this.form.regionName, + longitude: this.form.longitude, + latitude: this.form.latitude, + }, + ]; + } + done(); + }); + return; + } + done(); + }, + searchReset() { + this.query = {}; + this.page.currentPage = 1; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query, allDept: this.allDept }) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleExport() { + this.$confirm('是否导出常用地址?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-transport/common-address/export-common-address', this.buildExportParams()) + .then(res => { + downloadXls(res.data, `常用地址${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + allDept: this.allDept, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleMapPick() { + if (this.dialogReadonly || this.form.addressType !== '常规地址') { + return; + } + this.mapKeyword = this.form.detailAddress || this.form.regionName || ''; + this.mapSelected = this.buildMapSelection({ + lng: this.form.longitude, + lat: this.form.latitude, + address: this.form.detailAddress, + regionName: this.form.regionName, + }); + this.mapStatus = this.mapSelected.longitude ? '已加载当前经纬度,可重新选点' : '可搜索地址或点击地图选点'; + this.mapBox = true; + }, + loadTianditu() { + if (window.T && window.T.Map) { + return Promise.resolve(); + } + if (!tiandituLoader) { + tiandituLoader = new Promise((resolve, reject) => { + const script = document.createElement('script'); + script.src = `https://api.tianditu.gov.cn/api?v=4.0&tk=${TIANDITU_KEY}`; + script.async = true; + script.onload = resolve; + script.onerror = () => reject(new Error('天地图组件加载失败')); + document.body.appendChild(script); + }); + } + return tiandituLoader; + }, + initTiandituMap() { + this.loadTianditu() + .then(() => { + this.$nextTick(() => { + if (!this.tiandituMap) { + const center = this.toLngLat( + this.mapSelected.longitude || 116.40769, + this.mapSelected.latitude || 39.89945 + ); + this.tiandituMap = new window.T.Map(this.$refs.tiandituMap); + this.tiandituMap.centerAndZoom(center, this.mapSelected.longitude ? 14 : 11); + this.tiandituMap.addControl(new window.T.Control.Zoom()); + this.tiandituClickHandler = event => this.pickMapPoint(event.lnglat); + this.tiandituMap.addEventListener('click', this.tiandituClickHandler); + this.tiandituGeocoder = new window.T.Geocoder(); + } else { + if (typeof this.tiandituMap.checkResize === 'function') { + this.tiandituMap.checkResize(); + } + } + if (this.mapSelected.longitude) { + this.renderMapMarker(this.toLngLat(this.mapSelected.longitude, this.mapSelected.latitude)); + } + }); + }) + .catch(() => { + this.$message.error('天地图组件加载失败,请稍后重试或重新打开弹窗'); + this.mapBox = false; + }); + }, + searchMapKeyword() { + const keyword = String(this.mapKeyword || '').trim(); + if (!keyword) { + this.$message.warning('请输入地址关键词'); + return; + } + this.loadTianditu() + .then(() => { + this.mapLoading = true; + if (!this.tiandituGeocoder) { + this.tiandituGeocoder = new window.T.Geocoder(); + } + this.tiandituGeocoder.getPoint(keyword, result => { + this.mapLoading = false; + const point = this.resolveMapPoint(result); + if (!point) { + this.mapStatus = '未找到匹配地址'; + this.$message.warning('地图搜索无匹配地址'); + return; + } + this.pickMapPoint(point, keyword); + }); + }) + .catch(() => { + this.$message.error('天地图组件加载失败,请稍后重试或重新打开弹窗'); + }); + }, + pickMapPoint(lnglat, keyword) { + const longitude = this.getPointLng(lnglat); + const latitude = this.getPointLat(lnglat); + if (longitude === undefined || latitude === undefined) { + this.$message.warning('选点坐标无效'); + return; + } + const point = this.toLngLat(longitude, latitude); + this.renderMapMarker(point); + this.mapSelected = this.buildMapSelection({ lng: longitude, lat: latitude, address: keyword }); + this.mapStatus = '正在反查地址...'; + if (!this.tiandituGeocoder) { + this.tiandituGeocoder = new window.T.Geocoder(); + } + this.tiandituGeocoder.getLocation(point, result => { + const address = this.resolveMapAddress(result); + this.mapSelected = { + ...this.mapSelected, + detailAddress: address.detailAddress || this.mapSelected.detailAddress, + regionName: address.regionName || this.mapSelected.regionName, + regionCode: address.regionCode || this.mapSelected.regionCode, + }; + this.mapKeyword = this.mapSelected.detailAddress || this.mapKeyword; + this.mapStatus = this.mapSelected.detailAddress || '已选点,可确认回填'; + }); + }, + renderMapMarker(point) { + if (!this.tiandituMap || !window.T) return; + if (this.tiandituMarker) { + this.tiandituMap.removeOverLay(this.tiandituMarker); + } + this.tiandituMarker = new window.T.Marker(point); + this.tiandituMap.addOverLay(this.tiandituMarker); + this.tiandituMap.panTo(point); + }, + confirmMapPick() { + if (!this.mapSelected.longitude) { + this.$message.warning('请先搜索或点击地图完成选点'); + return; + } + this.form.detailAddress = this.mapSelected.detailAddress || this.form.detailAddress; + this.form.regionName = this.mapSelected.regionName || this.form.regionName; + this.form.regionCode = this.mapSelected.regionCode || this.form.regionCode; + this.form.longitude = this.mapSelected.longitude; + this.form.latitude = this.mapSelected.latitude; + this.mapBox = false; + }, + buildMapSelection({ lng, lat, address, regionName, regionCode }) { + const longitude = lng === undefined || lng === null || lng === '' ? '' : Number(lng).toFixed(6); + const latitude = lat === undefined || lat === null || lat === '' ? '' : Number(lat).toFixed(6); + return { + longitude, + latitude, + detailAddress: address || '', + regionName: regionName || '', + regionCode: regionCode || '', + }; + }, + toLngLat(lng, lat) { + return new window.T.LngLat(Number(lng), Number(lat)); + }, + getPointLng(point) { + if (!point) return undefined; + if (typeof point.getLng === 'function') return point.getLng(); + return point.lng ?? point.lon; + }, + getPointLat(point) { + if (!point) return undefined; + if (typeof point.getLat === 'function') return point.getLat(); + return point.lat; + }, + resolveMapPoint(result) { + if (!result) return null; + if (typeof result.getLocationPoint === 'function') return result.getLocationPoint(); + if (Array.isArray(result)) return result[0] || null; + if (result.location) return result.location; + if (result.lnglat) return result.lnglat; + if (result.lonlat) return result.lonlat; + if (result.getLng || result.lng || result.lon) return result; + return null; + }, + resolveMapAddress(result = {}) { + const component = + (typeof result.getAddressComponent === 'function' && result.getAddressComponent()) || + result.addressComponent || + {}; + const detailAddress = + (typeof result.getAddress === 'function' && result.getAddress()) || + result.formatted_address || + result.address || + result.formattedAddress || + ''; + const regionName = [component.province, component.city, component.county || component.district] + .filter(Boolean) + .join(''); + return { + detailAddress, + regionName, + regionCode: component.countyCode || component.adcode || component.cityCode || '', + }; + }, + }, +}; +</script> + +<style lang="scss" scoped> +.common-address-page { + &__scope { + margin-left: 12px; + vertical-align: middle; + } + + &__address { + display: flex; + gap: 10px; + align-items: flex-start; + + .el-input { + flex: 1; + } + + .el-button { + flex: 0 0 auto; + } + } + + &__map-toolbar { + display: flex; + gap: 10px; + margin-bottom: 12px; + + .el-input { + flex: 1; + } + } + + &__map { + width: 100%; + height: 460px; + border: 1px solid #dcdfe6; + } + + &__map-info { + display: flex; + justify-content: space-between; + gap: 16px; + min-height: 22px; + margin-top: 10px; + color: #606266; + font-size: 13px; + } +} +</style> diff --git a/src/views/base/currency.vue b/src/views/base/currency.vue new file mode 100644 index 0000000..72a7e47 --- /dev/null +++ b/src/views/base/currency.vue @@ -0,0 +1,580 @@ +<template> + <basic-container class="currency-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + v-model="form" + ref="crud" + :permission="permissionList" + :before-open="beforeOpen" + @row-save="rowSave" + @row-update="rowUpdate" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="permission.currency_import" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="permission.currency_template" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="permission.currency_export" + @click="handleExport" + >批量导出 + </el-button> + </template> + <template #codeForm> + <el-autocomplete + v-model="form.code" + :fetch-suggestions="fetchCurrencyOptions" + clearable + placeholder="请输入币种编码查询选择" + value-key="code" + class="currency-page__input" + @select="handleCurrencySelect" + @change="handleCodeChange" + > + <template #default="{ item }"> + <span>{{ item.code }}</span> + <span class="currency-page__option-name">{{ item.name }}</span> + </template> + </el-autocomplete> + </template> + <template #status="{ row }"> + <el-tag :type="row.status === 1 ? 'primary' : 'info'"> + {{ row.status === 1 ? '启用' : '停用' }} + </el-tag> + </template> + <template #menu="{ row, index }"> + <el-button + type="primary" + text + icon="el-icon-edit" + v-if="permission.currency_edit" + @click="$refs.crud.rowEdit(row, index)" + > + 编辑 + </el-button> + <el-button + type="primary" + text + :icon="row.status === 1 ? 'el-icon-close' : 'el-icon-check'" + v-if="permission.currency_status" + @click="handleStatus(row)" + > + {{ row.status === 1 ? '停用' : '启用' }} + </el-button> + </template> + </avue-crud> + + <el-dialog title="币种汇率导入" append-to-body v-model="excelBox" width="555px"> + <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter"> + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { changeStatus, getDetail, getList, submit } from '@/api/base/currency'; +import { exportBlob } from '@/api/common'; +import { mapGetters } from 'vuex'; +import { downloadXls } from '@/utils/util'; +import { getToken } from '@/utils/auth'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +const statusDic = [ + { label: '启用', value: 1 }, + { label: '停用', value: 2 }, +]; + +const sourceDic = [ + { label: '手工录入', value: '手工录入' }, + { label: '批量导入', value: '批量导入' }, +]; + +export default { + data() { + const validateCurrencyCode = (rule, value, callback) => { + if (!/^[A-Z]{3}$/.test(value || '')) { + callback(new Error('币种编码为3位大写字母')); + } else { + callback(); + } + }; + const validateExchangeRate = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(new Error('请输入汇率')); + } else if (Number(value) <= 0) { + callback(new Error('汇率必须大于0')); + } else if (!/^\d+(\.\d{1,6})?$/.test(String(value))) { + callback(new Error('汇率最多保留6位小数')); + } else { + callback(); + } + }; + return { + form: {}, + query: {}, + loading: true, + data: [], + excelBox: false, + excelForm: {}, + page: { + pageSize: 10, + currentPage: 1, + total: 0, + }, + selectionList: [], + option: { + height: 'auto', + calcHeight: 32, + dialogWidth: 860, + labelPosition: 'top', + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + indexLabel: '序号', + viewBtn: false, + delBtn: false, + editBtn: false, + selection: true, + dialogClickModal: false, + menuWidth: 170, + menuFixed: 'right', + column: [ + { + label: '币种编码', + prop: 'code', + search: true, + formslot: true, + minWidth: 120, + maxlength: 3, + rules: [ + { required: true, message: '请选择币种编码', trigger: 'blur' }, + { validator: validateCurrencyCode, trigger: 'blur' }, + ], + }, + { + label: '币种名称', + prop: 'name', + minWidth: 150, + search: true, + disabled: true, + rules: [{ required: true, message: '请选择币种编码带出币种名称', trigger: 'blur' }], + }, + { + label: '汇率', + prop: 'exchangeRate', + type: 'number', + search: true, + minWidth: 120, + precision: 6, + rules: [{ validator: validateExchangeRate, trigger: 'blur' }], + }, + { + label: '生效日期', + prop: 'effectiveDate', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + minWidth: 130, + rules: [{ required: true, message: '请选择生效日期', trigger: 'click' }], + }, + { + label: '生效日期', + prop: 'effectiveDateRange', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + searchRange: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '失效日期', + prop: 'expiryDate', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + minWidth: 130, + addDisplay: false, + editDisplay: false, + }, + { + label: '失效日期', + prop: 'expiryDateRange', + type: 'date', + format: 'YYYY-MM-DD', + valueFormat: 'YYYY-MM-DD', + searchRange: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '状态', + prop: 'status', + type: 'select', + search: true, + slot: true, + dataType: 'number', + dicData: statusDic, + value: 1, + minWidth: 100, + }, + { + label: '来源', + prop: 'dataSource', + type: 'select', + search: true, + dicData: sourceDic, + value: '手工录入', + minWidth: 120, + addDisplay: false, + editDisplay: false, + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 4, + span: 24, + hide: true, + maxlength: 200, + showWordLimit: true, + rules: [{ max: 200, message: '最多 200 个字符', trigger: 'blur' }], + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 160, + }, + { + label: '更新时间', + prop: 'updateTimeRange', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + searchRange: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + ], + }, + excelOption: { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + action: '/blade-system/currency/import-currency', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], + }, + }; + }, + computed: { + ...mapGetters(['permission']), + permissionList() { + return { + addBtn: this.validData(this.permission.currency_add, false), + }; + }, + ids() { + return this.selectionList.map(ele => ele.id).join(','); + }, + }, + methods: { + handleCodeChange(value) { + this.form.code = String(value || '').toUpperCase().replace(/[^A-Z]/g, '').slice(0, 3); + const matched = this.data.find(item => item.code === this.form.code); + if (matched) { + this.form.name = matched.name; + } + }, + fetchCurrencyOptions(queryString, callback) { + getList(1, 20, { code: String(queryString || '').toUpperCase() }) + .then(res => { + const records = res.data.data.records || []; + const exists = new Map(); + records.forEach(item => { + if (!exists.has(item.code)) { + exists.set(item.code, { + code: item.code, + value: item.code, + name: item.name, + }); + } + }); + callback(Array.from(exists.values())); + }) + .catch(() => callback([])); + }, + handleCurrencySelect(item) { + this.form.code = item.code; + this.form.name = item.name; + }, + normalizeRow(row) { + const values = { ...row }; + values.code = String(values.code || '').toUpperCase(); + values.dataSource = values.dataSource || '手工录入'; + values.status = values.status || 1; + return values; + }, + validateRow(row) { + if (row.remark && row.remark.length > 200) { + this.$message.warning('备注不能超过 200 字'); + return false; + } + if (Number(row.exchangeRate) <= 0) { + this.$message.warning('汇率必须大于0'); + return false; + } + if (!/^\d+(\.\d{1,6})?$/.test(String(row.exchangeRate))) { + this.$message.warning('汇率最多保留6位小数'); + return false; + } + return true; + }, + rowSave(row, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + submit(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + submit(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + handleStatus(row) { + const nextStatus = row.status === 1 ? 2 : 1; + const actionName = nextStatus === 1 ? '启用' : '停用'; + this.$confirm(`是否确认${actionName}该条汇率?`, { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => changeStatus(row.id, nextStatus)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + beforeOpen(done, type) { + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + this.form = res.data.data; + done(); + }); + return; + } + this.form = { + status: 1, + dataSource: '手工录入', + }; + done(); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + buildQuery(params = {}) { + const values = { ...params, ...this.query }; + const rangeMap = { + effectiveDateRange: ['effectiveDateStart', 'effectiveDateEnd'], + expiryDateRange: ['expiryDateStart', 'expiryDateEnd'], + updateTimeRange: ['updateTimeStart', 'updateTimeEnd'], + }; + Object.keys(rangeMap).forEach(key => { + const range = values[key]; + if (range && range.length === 2) { + values[rangeMap[key][0]] = range[0]; + values[rangeMap[key][1]] = range[1]; + } + values[key] = null; + }); + return values; + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, this.buildQuery(params)) + .then(res => { + const result = res.data.data; + this.page.total = result.total; + this.data = result.records; + if (result.records.length === 0 && result.total > 0 && page.currentPage > 1) { + this.page.currentPage = page.currentPage - 1; + this.onLoad(this.page, this.query); + } + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出币种汇率数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-system/currency/export-currency', this.buildExportParams()) + .then(res => { + downloadXls(res.data, `币种汇率${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.buildQuery(), + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob(`/blade-system/currency/export-template?${this.website.tokenHeader}=${getToken()}`).then(res => { + downloadXls(res.data, '币种汇率模板.xlsx'); + }); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.currency-page { + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } + + &__input { + width: 100%; + } + + &__option-name { + float: right; + color: #8492a6; + font-size: 13px; + margin-left: 16px; + } +} +</style> diff --git a/src/views/base/customer-type.vue b/src/views/base/customer-type.vue new file mode 100644 index 0000000..30eba90 --- /dev/null +++ b/src/views/base/customer-type.vue @@ -0,0 +1,290 @@ +<template> + <basic-container> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + v-model="form" + ref="crud" + :permission="permissionList" + :before-open="beforeOpen" + @row-save="rowSave" + @row-update="rowUpdate" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="permission.customer_type_delete" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #status="{ row }"> + <el-tag :type="row.status === 1 ? 'primary' : 'info'"> + {{ row.status === 1 ? '启用' : '停用' }} + </el-tag> + </template> + <template #menu="{ row, index }"> + <el-button + type="primary" + text + icon="el-icon-edit" + v-if="permission.customer_type_edit" + @click="$refs.crud.rowEdit(row, index)" + > + 编辑 + </el-button> + <el-button + type="primary" + text + :icon="row.status === 1 ? 'el-icon-close' : 'el-icon-check'" + v-if="permission.customer_type_status" + @click="handleStatus(row)" + > + {{ row.status === 1 ? '停用' : '启用' }} + </el-button> + </template> + </avue-crud> + </basic-container> +</template> + +<script> +import { getList, getDetail, submit, remove, changeStatus } from '@/api/base/customer-type'; +import { mapGetters } from 'vuex'; + +export default { + data() { + return { + form: {}, + query: {}, + loading: true, + data: [], + page: { + pageSize: 10, + currentPage: 1, + total: 0, + }, + selectionList: [], + option: { + height: 'auto', + calcHeight: 32, + dialogWidth: 680, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + indexLabel: '序号', + viewBtn: false, + delBtn: false, + editBtn: false, + selection: true, + dialogClickModal: false, + menuWidth: 160, + column: [ + { + label: '中文名称', + prop: 'name', + minWidth: 140, + search: true, + maxlength: 50, + rules: [{ required: true, message: '请输入中文名称', trigger: 'blur' }], + }, + { + label: '英文名称', + prop: 'englishName', + minWidth: 160, + search: true, + maxlength: 100, + }, + { + label: '状态', + prop: 'status', + type: 'select', + search: true, + slot: true, + dataType: 'number', + dicData: [ + { label: '启用', value: 1 }, + { label: '停用', value: 2 }, + ], + value: 1, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 160, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 160, + }, + ], + }, + }; + }, + computed: { + ...mapGetters(['permission']), + permissionList() { + return { + addBtn: this.validData(this.permission.customer_type_add, false), + }; + }, + ids() { + let ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + methods: { + normalizeRow(row) { + row.name = String(row.name || '').trim(); + row.englishName = String(row.englishName || '').trim(); + if (!row.status) row.status = 1; + return row; + }, + rowSave(row, done, loading) { + submit(this.normalizeRow(row)).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + submit(this.normalizeRow(row)).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + handleStatus(row) { + const nextStatus = row.status === 1 ? 2 : 1; + const actionName = nextStatus === 1 ? '启用' : '停用'; + this.$confirm(`是否确认${actionName}该条数据?`, { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => changeStatus(row.id, nextStatus)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + beforeOpen(done, type) { + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + this.form = res.data.data; + done(); + }); + return; + } + this.form.status = 1; + done(); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.loading = false; + this.selectionClear(); + }); + }, + }, +}; +</script> diff --git a/src/views/base/fee-item.vue b/src/views/base/fee-item.vue new file mode 100644 index 0000000..715d755 --- /dev/null +++ b/src/views/base/fee-item.vue @@ -0,0 +1,290 @@ +<template> + <basic-container> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + v-model="form" + ref="crud" + :permission="permissionList" + :before-open="beforeOpen" + @row-save="rowSave" + @row-update="rowUpdate" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="permission.fee_item_delete" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #status="{ row }"> + <el-tag :type="row.status === 1 ? 'primary' : 'info'"> + {{ row.status === 1 ? '启用' : '停用' }} + </el-tag> + </template> + <template #menu="{ row, index }"> + <el-button + type="primary" + text + icon="el-icon-edit" + v-if="permission.fee_item_edit" + @click="$refs.crud.rowEdit(row, index)" + > + 编辑 + </el-button> + <el-button + type="primary" + text + :icon="row.status === 1 ? 'el-icon-close' : 'el-icon-check'" + v-if="permission.fee_item_status" + @click="handleStatus(row)" + > + {{ row.status === 1 ? '停用' : '启用' }} + </el-button> + </template> + </avue-crud> + </basic-container> +</template> + +<script> +import { getList, getDetail, submit, remove, changeStatus } from '@/api/base/fee-item'; +import { mapGetters } from 'vuex'; + +export default { + data() { + return { + form: {}, + query: {}, + loading: true, + data: [], + page: { + pageSize: 10, + currentPage: 1, + total: 0, + }, + selectionList: [], + option: { + height: 'auto', + calcHeight: 32, + dialogWidth: 680, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + indexLabel: '序号', + viewBtn: false, + delBtn: false, + editBtn: false, + selection: true, + dialogClickModal: false, + menuWidth: 160, + column: [ + { + label: '中文名称', + prop: 'name', + minWidth: 140, + search: true, + maxlength: 50, + rules: [{ required: true, message: '请输入中文名称', trigger: 'blur' }], + }, + { + label: '英文名称', + prop: 'englishName', + minWidth: 160, + search: true, + maxlength: 100, + }, + { + label: '状态', + prop: 'status', + type: 'select', + search: true, + slot: true, + dataType: 'number', + dicData: [ + { label: '启用', value: 1 }, + { label: '停用', value: 2 }, + ], + value: 1, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 160, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 160, + }, + ], + }, + }; + }, + computed: { + ...mapGetters(['permission']), + permissionList() { + return { + addBtn: this.validData(this.permission.fee_item_add, false), + }; + }, + ids() { + let ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + methods: { + normalizeRow(row) { + row.name = String(row.name || '').trim(); + row.englishName = String(row.englishName || '').trim(); + if (!row.status) row.status = 1; + return row; + }, + rowSave(row, done, loading) { + submit(this.normalizeRow(row)).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + submit(this.normalizeRow(row)).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + handleStatus(row) { + const nextStatus = row.status === 1 ? 2 : 1; + const actionName = nextStatus === 1 ? '启用' : '停用'; + this.$confirm(`是否确认${actionName}该条数据?`, { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => changeStatus(row.id, nextStatus)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + beforeOpen(done, type) { + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + this.form = res.data.data; + done(); + }); + return; + } + this.form.status = 1; + done(); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.loading = false; + this.selectionClear(); + }); + }, + }, +}; +</script> diff --git a/src/views/base/port-terminal.vue b/src/views/base/port-terminal.vue new file mode 100644 index 0000000..4476cd9 --- /dev/null +++ b/src/views/base/port-terminal.vue @@ -0,0 +1,804 @@ +<template> + <basic-container class="port-terminal-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + v-model="form" + ref="crud" + :permission="permissionList" + :before-open="beforeOpen" + @row-save="rowSave" + @row-update="rowUpdate" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('port_terminal_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('port_terminal_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('port_terminal_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('port_terminal_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #parentName="{ row }"> + <span>{{ row.category === '港口' ? '-' : row.parentName }}</span> + </template> + <template #parentCode="{ row }"> + <span>{{ row.category === '港口' ? '-' : row.parentCode }}</span> + </template> + <template #status="{ row }"> + <el-tag :type="row.status === 1 ? 'primary' : 'info'"> + {{ row.status === 1 ? '启用' : '停用' }} + </el-tag> + </template> + <template #menu="{ row, index }"> + <el-button + type="primary" + text + icon="el-icon-edit" + v-if="hasPermission('port_terminal_edit')" + @click="$refs.crud.rowEdit(row, index)" + > + 编辑 + </el-button> + <el-button + type="primary" + text + :icon="row.status === 1 ? 'el-icon-close' : 'el-icon-check'" + v-if="hasPermission('port_terminal_status')" + @click="handleStatus(row)" + > + {{ row.status === 1 ? '停用' : '启用' }} + </el-button> + </template> + <template #regionCode-form> + <el-cascader + v-model="form.regionCode" + :props="regionProps" + clearable + filterable + :disabled="isParentRegionLocked" + style="width: 100%" + @change="handleRegionChange" + /> + </template> + </avue-crud> + + <el-dialog title="港口码头主数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form + :option="excelOption" + v-model="excelForm" + :upload-before="uploadBefore" + :upload-after="uploadAfter" + > + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { + getList, + getDetail, + submit, + remove, + changeStatus, + getPortSelect, +} from '@/api/base/port-terminal'; +import { getLazyTree } from '@/api/base/region'; +import { exportBlob } from '@/api/common'; +import { mapGetters } from 'vuex'; +import { downloadXls } from '@/utils/util'; +import { formatUpdateUserName } from '@/utils/audit'; +import { getToken } from '@/utils/auth'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + const validateCode = (rule, value, callback) => { + const code = String(value || '').toUpperCase(); + if (this.form.category === '港口') { + if (!/^[A-Z]{5}$/.test(code)) { + callback(new Error('港口编码为5位大写字母,如:CNSHG')); + } else { + callback(); + } + return; + } + if (this.form.category === '码头') { + if (!/^[A-Z]{5}-[A-Z0-9]+$/.test(code)) { + callback(new Error('码头编码格式为“港口编码-码头标识”,如:CNSHG-CT1')); + } else if (this.form.parentCode && !code.startsWith(`${this.form.parentCode}-`)) { + callback(new Error(`码头编码须以所选上级港口编码 ${this.form.parentCode}- 开头`)); + } else { + callback(); + } + return; + } + callback(); + }; + const validateLongitude = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < -180 || Number(value) > 180) { + callback(new Error('经度范围为 -180 到 180')); + } else { + callback(); + } + }; + const validateLatitude = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < -90 || Number(value) > 90) { + callback(new Error('纬度范围为 -90 到 90')); + } else { + callback(); + } + }; + return { + form: {}, + query: {}, + loading: true, + data: [], + excelBox: false, + excelForm: {}, + portOptions: [], + regionNodeMap: {}, + regionNameMap: {}, + regionProps: { + lazy: true, + lazyLoad: this.loadRegionNode, + label: 'title', + value: 'id', + checkStrictly: false, + emitPath: true, + }, + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + option: { + height: 'auto', + calcHeight: 32, + dialogWidth: 980, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + indexLabel: '序号', + indexWidth: 70, + viewBtn: false, + delBtn: false, + editBtn: false, + selection: true, + dialogClickModal: false, + menuWidth: 160, + column: [ + { + label: '编码', + prop: 'code', + search: true, + width: 140, + placeholder: '港口如 CNSHG,码头如 CNSHG-CT1', + rules: [ + { required: true, message: '请输入编码', trigger: 'blur' }, + { validator: validateCode, trigger: 'blur' }, + ], + change: ({ value }) => this.handleCodeChange(value), + blur: ({ value }) => this.handleCodeChange(value), + }, + { + label: '港口/码头名称', + prop: 'name', + minWidth: 140, + search: true, + rules: [{ required: true, message: '请输入港口/码头名称', trigger: 'blur' }], + }, + { + label: '类型', + prop: 'category', + type: 'select', + search: true, + dicData: [ + { label: '全部', value: '' }, + { label: '港口', value: '港口' }, + { label: '码头', value: '码头' }, + ], + rules: [{ required: true, message: '请选择类型', trigger: 'change' }], + change: ({ value }) => this.handleCategoryChange(value), + }, + { + label: '上级港口', + prop: 'parentId', + type: 'select', + props: { + label: 'name', + value: 'id', + }, + dicData: [], + hide: true, + rules: [{ required: false, message: '请选择上级港口', trigger: 'change' }], + change: ({ value }) => this.handleParentChange(value), + }, + { + label: '上级港口', + prop: 'parentName', + minWidth: 120, + slot: true, + addDisplay: false, + editDisplay: false, + }, + { + label: '上级港口编码', + prop: 'parentCode', + minWidth: 120, + slot: true, + disabled: true, + }, + { + label: '城市', + prop: 'regionCode', + formslot: true, + hide: true, + span: 12, + rules: [{ required: true, message: '请选择所属城市', trigger: 'change' }], + }, + { + label: '国家', + prop: 'country', + search: true, + addDisplay: false, + editDisplay: false, + minWidth: 100, + }, + { + label: '城市', + prop: 'city', + search: true, + addDisplay: false, + editDisplay: false, + minWidth: 100, + }, + { + label: '经度', + prop: 'longitude', + type: 'number', + precision: 6, + minWidth: 130, + rules: [{ validator: validateLongitude, trigger: 'blur' }], + }, + { + label: '纬度', + prop: 'latitude', + type: 'number', + precision: 6, + minWidth: 130, + rules: [{ validator: validateLatitude, trigger: 'blur' }], + }, + { + label: '数据来源', + prop: 'dataSource', + type: 'select', + search: true, + dicData: [ + { label: '全部', value: '' }, + { label: '初始化导入', value: '初始化导入' }, + { label: '批量导入', value: '批量导入' }, + { label: '手工导入', value: '手工导入' }, + ], + }, + { + label: '启停状态', + prop: 'status', + type: 'select', + search: true, + slot: true, + dataType: 'number', + dicData: [ + { label: '全部', value: '' }, + { label: '启用', value: 1 }, + { label: '停用', value: 2 }, + ], + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 4, + span: 24, + hide: true, + maxlength: 200, + showWordLimit: true, + rules: [{ max: 200, message: '备注不能超过200个字', trigger: 'blur' }], + }, + { + label: '更新人', + prop: 'updateUserName', + formatter: formatUpdateUserName, + addDisplay: false, + editDisplay: false, + minWidth: 120, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + minWidth: 160, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 160, + }, + ], + }, + excelOption: { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + accept: '.xls,.xlsx', + action: '/blade-system/port-terminal/import-port-terminal', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], + }, + }; + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + permissionList() { + return { + addBtn: this.hasPermission('port_terminal_add'), + }; + }, + isAdmin() { + const authority = this.userInfo && this.userInfo.authority; + return Array.isArray(authority) ? authority.includes('admin') : String(authority || '').includes('admin'); + }, + isParentRegionLocked() { + return this.form.category === '码头' && !!this.form.parentId; + }, + ids() { + let ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + created() { + this.loadPortOptions(); + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission && this.permission[code], false); + }, + handleCodeChange(value) { + const code = String(value || '').toUpperCase(); + if (this.form.category === '港口') { + this.form.code = code.replace(/[^A-Z]/g, '').slice(0, 5); + return; + } + if (this.form.category === '码头') { + this.form.code = code.replace(/[^A-Z0-9-]/g, ''); + } + }, + loadRegionNode(node, resolve) { + const parentCode = node.level === 0 ? '00' : node.value; + getLazyTree(parentCode).then(res => { + const regionList = res.data.data || []; + const nodes = regionList.map(region => { + this.regionNodeMap[region.id] = region; + this.regionNameMap[region.title] = region.id; + return { + id: region.id, + title: region.title, + leaf: node.level >= 1, + }; + }); + resolve(nodes); + }); + }, + loadPortOptions() { + getPortSelect().then(res => { + this.portOptions = res.data.data; + this.findColumn(this.option.column, 'parentId').dicData = this.portOptions; + }); + }, + handleCategoryChange(value) { + const parentColumn = this.findColumn(this.option.column, 'parentId'); + parentColumn.rules[0].required = value === '码头'; + if (value === '港口') { + this.form.parentId = undefined; + this.form.parentCode = ''; + this.form.parentName = ''; + } + this.handleCodeChange(this.form.code); + }, + handleParentChange(value) { + const parent = this.portOptions.find(item => item.id === value); + if (!parent) return; + const terminalCode = String(this.form.code || '') + .split('-') + .slice(1) + .join('-'); + this.form.parentCode = parent.code; + this.form.parentName = parent.name; + if (this.form.category === '码头' && terminalCode) { + this.form.code = `${parent.code}-${terminalCode}`; + } + this.form.country = parent.country; + this.form.city = parent.city; + this.resolveRegionCode(parent.country, parent.city).then(regionCode => { + this.form.regionCode = regionCode; + }); + }, + handleRegionChange(value) { + const regionCode = Array.isArray(value) ? value : []; + const provinceCode = regionCode[0]; + const cityCode = regionCode[1]; + const province = this.regionNodeMap[provinceCode]; + const city = this.regionNodeMap[cityCode]; + this.form.country = province ? province.title : ''; + this.form.city = city ? city.title : ''; + }, + resolveRegionCode(country, city) { + if (!country || !city) { + return Promise.resolve([]); + } + const provinceCode = this.regionNameMap[country]; + if (provinceCode) { + const cityCode = this.regionNameMap[city]; + if (cityCode) { + return Promise.resolve([provinceCode, cityCode]); + } + return this.loadRegionList(provinceCode).then(cityList => { + const cityNode = cityList.find(item => item.title === city); + return cityNode ? [provinceCode, cityNode.id] : [provinceCode]; + }); + } + return this.loadRegionList('00').then(provinceList => { + const province = provinceList.find(item => item.title === country); + if (!province) { + return []; + } + return this.loadRegionList(province.id).then(cityList => { + const cityNode = cityList.find(item => item.title === city); + return cityNode ? [province.id, cityNode.id] : [province.id]; + }); + }); + }, + loadRegionList(parentCode) { + return getLazyTree(parentCode).then(res => { + const regionList = res.data.data || []; + regionList.forEach(region => { + this.regionNodeMap[region.id] = region; + this.regionNameMap[region.title] = region.id; + }); + return regionList; + }); + }, + normalizeRow(row) { + row.code = String(row.code || '').toUpperCase(); + if (row.category === '港口') { + row.parentId = undefined; + row.parentCode = undefined; + row.parentName = undefined; + } + if (!row.dataSource) row.dataSource = '手工导入'; + if (!row.status) row.status = 1; + return row; + }, + validateRequiredFields(row) { + const isBlank = value => value === undefined || value === null || String(value).trim() === ''; + if (isBlank(row.code)) { + this.$message.warning('请输入编码'); + return false; + } + if (isBlank(row.name)) { + this.$message.warning('请输入港口/码头名称'); + return false; + } + if (isBlank(row.category)) { + this.$message.warning('请选择类型'); + return false; + } + if (row.category === '码头' && isBlank(row.parentId)) { + this.$message.warning('请选择上级港口'); + return false; + } + if (!Array.isArray(row.regionCode) || row.regionCode.length < 2) { + this.$message.warning('请选择所属城市'); + return false; + } + return true; + }, + stopSubmitLoading(loading) { + if (typeof loading === 'function') { + loading(); + } + }, + rowSave(row, done, loading) { + const submitRow = this.normalizeRow(row); + if (!this.validateRequiredFields(submitRow)) { + this.stopSubmitLoading(loading); + return; + } + submit(submitRow).then( + () => { + this.onLoad(this.page); + this.loadPortOptions(); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + const submitRow = this.normalizeRow(row); + if (!this.validateRequiredFields(submitRow)) { + this.stopSubmitLoading(loading); + return; + } + submit(submitRow).then( + () => { + this.onLoad(this.page); + this.loadPortOptions(); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.loadPortOptions(); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.loadPortOptions(); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + handleStatus(row) { + const nextStatus = row.status === 1 ? 2 : 1; + const actionName = nextStatus === 1 ? '启用' : '停用'; + this.$confirm(`是否确认${actionName}该条数据?`, { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => changeStatus(row.id, nextStatus)) + .then(() => { + this.onLoad(this.page); + this.loadPortOptions(); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + beforeOpen(done, type) { + if (type === 'add') { + this.form.category = this.form.category || '港口'; + this.form.dataSource = this.form.dataSource || '手工导入'; + this.form.status = this.form.status || 1; + } + this.handleCategoryChange(this.form.category || '港口'); + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + this.form = res.data.data; + this.resolveRegionCode(this.form.country, this.form.city).then(regionCode => { + this.form.regionCode = regionCode; + this.handleCategoryChange(this.form.category); + done(); + }); + }); + return; + } else { + this.resolveRegionCode(this.form.country, this.form.city).then(regionCode => { + this.form.regionCode = regionCode; + done(); + }); + return; + } + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadBefore(file, done) { + const fileName = file && file.name ? file.name.toLowerCase() : ''; + if (!/\.(xls|xlsx)$/.test(fileName)) { + this.$message.error('请上传 .xls,.xlsx 标准格式文件'); + return false; + } + if (typeof done === 'function') { + done(); + } + return true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + this.loadPortOptions(); + done(); + }, + handleExport() { + this.$confirm('是否导出港口码头主数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-system/port-terminal/export-port-terminal', this.buildExportParams()) + .then(res => { + downloadXls( + res.data, + `港口码头主数据${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx` + ); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob( + `/blade-system/port-terminal/export-template?${this.website.tokenHeader}=${getToken()}` + ).then(res => { + downloadXls(res.data, '港口码头主数据模板.xlsx'); + }); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.port-terminal-page { + :deep(.avue-crud__header), + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } +} +</style> diff --git a/src/views/base/railway-station.vue b/src/views/base/railway-station.vue new file mode 100644 index 0000000..cf8e20b --- /dev/null +++ b/src/views/base/railway-station.vue @@ -0,0 +1,663 @@ +<template> + <basic-container class="railway-station-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + v-model="form" + ref="crud" + :permission="permissionList" + :before-open="beforeOpen" + @row-save="rowSave" + @row-update="rowUpdate" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('railway_station_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('railway_station_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('railway_station_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('railway_station_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #status="{ row }"> + <el-tag :type="row.status === 1 ? 'primary' : 'info'"> + {{ row.status === 1 ? '启用' : '停用' }} + </el-tag> + </template> + <template #menu="{ row, index }"> + <el-button + type="primary" + text + icon="el-icon-edit" + v-if="hasPermission('railway_station_edit')" + @click="$refs.crud.rowEdit(row, index)" + > + 编辑 + </el-button> + <el-button + type="primary" + text + :icon="row.status === 1 ? 'el-icon-close' : 'el-icon-check'" + v-if="hasPermission('railway_station_status')" + @click="handleStatus(row)" + > + {{ row.status === 1 ? '停用' : '启用' }} + </el-button> + </template> + </avue-crud> + + <el-dialog title="铁路车站主数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form + :option="excelOption" + v-model="excelForm" + :upload-before="uploadBefore" + :upload-after="uploadAfter" + > + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { getList, getDetail, submit, remove, changeStatus } from '@/api/base/railway-station'; +import { getLazyTree } from '@/api/base/region'; +import { exportBlob } from '@/api/common'; +import { mapGetters } from 'vuex'; +import { downloadXls } from '@/utils/util'; +import { formatUpdateUserName } from '@/utils/audit'; +import { getToken } from '@/utils/auth'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + const validateTmisCode = (rule, value, callback) => { + if (!/^\d{5}$/.test(value || '')) { + callback(new Error('TMIS国标编码为5位数字')); + } else { + callback(); + } + }; + const validateTelegraphCode = (rule, value, callback) => { + if (!/^[A-Z]{3}$/.test(String(value || '').toUpperCase())) { + callback(new Error('电报码为3位大写字母')); + } else { + callback(); + } + }; + const validateLongitude = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < -180 || Number(value) > 180) { + callback(new Error('经度范围为 -180 到 180')); + } else { + callback(); + } + }; + const validateLatitude = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < -90 || Number(value) > 90) { + callback(new Error('纬度范围为 -90 到 90')); + } else { + callback(); + } + }; + return { + form: {}, + query: {}, + loading: true, + data: [], + excelBox: false, + excelForm: {}, + provinceOptions: [], + cityOptions: [], + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + option: { + height: 'auto', + calcHeight: 32, + dialogWidth: 980, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + indexLabel: '序号', + indexWidth: 70, + viewBtn: false, + delBtn: false, + editBtn: false, + selection: true, + dialogClickModal: false, + menuWidth: 160, + column: [ + { + label: '编码', + prop: 'code', + search: true, + addDisabled: true, + editDisabled: true, + placeholder: '系统自动生成', + searchPlaceholder: '请输入编码', + }, + { + label: 'TMIS国标编码', + prop: 'tmisCode', + minWidth: 120, + maxlength: 5, + rules: [ + { required: true, message: '请输入TMIS国标编码', trigger: 'blur' }, + { validator: validateTmisCode, trigger: 'blur' }, + ], + change: ({ value }) => this.handleTmisChange(value), + }, + { + label: '电报码', + prop: 'telegraphCode', + minWidth: 100, + maxlength: 3, + rules: [ + { required: true, message: '请输入电报码', trigger: 'blur' }, + { validator: validateTelegraphCode, trigger: 'blur' }, + ], + change: ({ value }) => this.handleTelegraphChange(value), + blur: ({ value }) => this.handleTelegraphChange(value), + }, + { + label: '车站名称', + prop: 'name', + minWidth: 120, + search: true, + rules: [{ required: true, message: '请输入车站名称', trigger: 'blur' }], + }, + { + label: '所属铁路线路', + prop: 'railwayLine', + minWidth: 130, + }, + { + label: '所属省份', + prop: 'provinceCode', + type: 'select', + hide: true, + props: { + label: 'title', + value: 'id', + }, + dicData: [], + filterable: true, + span: 12, + rules: [{ required: true, message: '请选择所属省份', trigger: 'change' }], + change: ({ value }) => this.handleProvinceChange(value), + }, + { + label: '所属城市', + prop: 'cityCode', + type: 'select', + hide: true, + props: { + label: 'title', + value: 'id', + }, + dicData: [], + filterable: true, + span: 12, + rules: [{ required: true, message: '请选择所属城市', trigger: 'change' }], + change: ({ value }) => this.handleCityChange(value), + }, + { + label: '所属省份', + prop: 'provinceName', + minWidth: 140, + addDisplay: false, + editDisplay: false, + }, + { + label: '所属城市', + prop: 'cityName', + minWidth: 140, + addDisplay: false, + editDisplay: false, + }, + { + label: '经度', + prop: 'longitude', + type: 'number', + precision: 6, + rules: [{ validator: validateLongitude, trigger: 'blur' }], + }, + { + label: '纬度', + prop: 'latitude', + type: 'number', + precision: 6, + rules: [{ validator: validateLatitude, trigger: 'blur' }], + }, + { + label: '数据来源', + prop: 'dataSource', + type: 'select', + search: true, + dicData: [ + { label: '全部', value: '' }, + { label: '初始化导入', value: '初始化导入' }, + { label: '批量', value: '批量' }, + { label: '手动', value: '手动' }, + ], + }, + { + label: '启停状态', + prop: 'status', + type: 'select', + search: true, + slot: true, + dataType: 'number', + dicData: [ + { label: '全部', value: '' }, + { label: '启用', value: 1 }, + { label: '停用', value: 2 }, + ], + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 4, + span: 24, + hide: true, + maxlength: 200, + showWordLimit: true, + rules: [{ max: 200, message: '备注不能超过200字', trigger: 'blur' }], + }, + { + label: '更新人', + prop: 'updateUserName', + formatter: formatUpdateUserName, + addDisplay: false, + editDisplay: false, + minWidth: 120, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 160, + }, + { + label: '创建时间', + prop: 'createTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 160, + }, + ], + }, + excelOption: { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + accept: '.xls,.xlsx', + action: '/blade-system/railway-station/import-railway-station', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], + }, + }; + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + permissionList() { + return { + addBtn: this.hasPermission('railway_station_add'), + }; + }, + isAdmin() { + const authority = this.userInfo && this.userInfo.authority; + return Array.isArray(authority) ? authority.includes('admin') : String(authority || '').includes('admin'); + }, + ids() { + let ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + created() { + this.loadProvinceOptions(); + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission && this.permission[code], false); + }, + findColumn(prop) { + return this.option.column.find(item => item.prop === prop); + }, + loadProvinceOptions() { + getLazyTree('00').then(res => { + this.provinceOptions = res.data.data; + this.findColumn('provinceCode').dicData = this.provinceOptions; + }); + }, + loadCityOptions(provinceCode) { + if (!provinceCode) { + this.cityOptions = []; + this.findColumn('cityCode').dicData = []; + return Promise.resolve(); + } + return getLazyTree(provinceCode).then(res => { + this.cityOptions = res.data.data; + this.findColumn('cityCode').dicData = this.cityOptions; + }); + }, + handleTmisChange(value) { + this.form.tmisCode = String(value || '') + .replace(/\D/g, '') + .slice(0, 5); + this.form.code = this.form.tmisCode ? `TL${this.form.tmisCode}` : ''; + }, + handleTelegraphChange(value) { + this.form.telegraphCode = String(value || '') + .toUpperCase() + .replace(/[^A-Z]/g, '') + .slice(0, 3); + }, + handleProvinceChange(value) { + const province = this.provinceOptions.find(item => item.id === value); + this.form.provinceName = province ? province.title : ''; + this.form.cityCode = undefined; + this.form.cityName = ''; + this.loadCityOptions(value); + }, + handleCityChange(value) { + const city = this.cityOptions.find(item => item.id === value); + this.form.cityName = city ? city.title : ''; + }, + normalizeRow(row) { + row.code = row.tmisCode ? `TL${row.tmisCode}` : row.code; + if (!row.dataSource) row.dataSource = '手动'; + if (!row.status) row.status = 1; + return row; + }, + validateUnique(row) { + const rowId = String(row.id || ''); + const hasDuplicate = (params, prop) => { + return getList(1, 10, params).then(res => { + const records = res.data.data.records || []; + return records.some(item => item[prop] === row[prop] && String(item.id || '') !== rowId); + }); + }; + return Promise.all([ + hasDuplicate({ tmisCode: row.tmisCode }, 'tmisCode'), + hasDuplicate({ telegraphCode: row.telegraphCode }, 'telegraphCode'), + ]).then(([tmisExists, telegraphExists]) => { + if (tmisExists) { + return Promise.reject(new Error('该TMIS编码已存在')); + } + if (telegraphExists) { + return Promise.reject(new Error('该电报码已存在')); + } + return Promise.resolve(); + }); + }, + handleSubmitError(error, loading) { + const uniqueMessages = ['该TMIS编码已存在', '该电报码已存在']; + if (uniqueMessages.includes(error.message)) { + this.$message.warning(error.message); + } + window.console.log(error); + loading(); + }, + rowSave(row, done, loading) { + const submitRow = this.normalizeRow(row); + this.validateUnique(submitRow) + .then(() => submit(submitRow)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }) + .catch(error => this.handleSubmitError(error, loading)); + }, + rowUpdate(row, index, done, loading) { + const submitRow = this.normalizeRow(row); + this.validateUnique(submitRow) + .then(() => submit(submitRow)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }) + .catch(error => this.handleSubmitError(error, loading)); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + handleStatus(row) { + const nextStatus = row.status === 1 ? 2 : 1; + const actionName = nextStatus === 1 ? '启用' : '停用'; + this.$confirm(`是否确认${actionName}该条数据?`, { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => changeStatus(row.id, nextStatus)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + beforeOpen(done, type) { + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + this.form = res.data.data; + this.loadCityOptions(this.form.provinceCode).then(() => done()); + }); + return; + } + this.form.code = ''; + this.form.dataSource = '手动'; + this.form.status = 1; + this.loadCityOptions(this.form.provinceCode).then(() => done()); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadBefore(file, done) { + const fileName = file && file.name ? file.name.toLowerCase() : ''; + if (!/\.(xls|xlsx)$/.test(fileName)) { + this.$message.error('请上传 .xls,.xlsx 标准格式文件'); + return false; + } + if (typeof done === 'function') { + done(); + } + return true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出铁路车站主数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-system/railway-station/export-railway-station', this.buildExportParams()) + .then(res => { + downloadXls( + res.data, + `铁路车站主数据${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx` + ); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob( + `/blade-system/railway-station/export-template?${this.website.tokenHeader}=${getToken()}` + ).then(res => { + downloadXls(res.data, '铁路车站主数据模板.xlsx'); + }); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.railway-station-page { + :deep(.avue-crud__header), + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } +} +</style> diff --git a/src/views/base/region.vue b/src/views/base/region.vue index 332d4cc..60541b2 100644 --- a/src/views/base/region.vue +++ b/src/views/base/region.vue @@ -40,6 +40,14 @@ @click="handleExport" >导出 </el-button> + <el-button + v-if="permission.region_sync" + type="primary" + icon="el-icon-refresh" + :loading="syncLoading" + @click="handleSync" + >同步 + </el-button> <el-button v-if="permission.region_debug" type="primary" @@ -75,7 +83,7 @@ </template> <script> -import { getLazyTree, getDetail, submit, remove } from '@/api/base/region'; +import { getLazyTree, getDetail, submit, remove, sync } from '@/api/base/region'; import { exportBlob } from '@/api/common'; import { mapGetters } from 'vuex'; import { validatenull } from '@/utils/validate'; @@ -91,6 +99,7 @@ export default { treeCode: '', treeParentCode: '', treeData: [], + syncLoading: false, treeOption: { nodeKey: 'id', lazy: true, @@ -431,6 +440,28 @@ export default { handleImport() { this.excelBox = true; }, + handleSync() { + this.$confirm('确定同步最新行政区划数据?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => { + this.syncLoading = true; + return sync(); + }) + .then(() => { + this.$message({ + type: 'success', + message: '同步成功!', + }); + this.initTree(); + this.regionForm = {}; + }) + .finally(() => { + this.syncLoading = false; + }); + }, handleExport() { this.$confirm('是否导出行政区划数据?', '提示', { confirmButtonText: '确定', diff --git a/src/views/system/menu.vue b/src/views/system/menu.vue index ce41c7e..18f065c 100644 --- a/src/views/system/menu.vue +++ b/src/views/system/menu.vue @@ -216,10 +216,34 @@ export default { }, ], }, + { + label: '是否显示', + prop: 'isDisplay', + type: 'radio', + dicData: [ + { + label: '显示', + value: 1, + }, + { + label: '不显示', + value: 2, + }, + ], + value: 1, + rules: [ + { + required: true, + message: '请选择是否显示', + trigger: 'blur', + }, + ], + }, { label: '菜单排序', prop: 'sort', type: 'number', + value: 1, rules: [ { required: true, @@ -248,9 +272,15 @@ export default { if (item.prop === 'path') { item.rules[0].required = category === 1; } + if (item.prop === 'source') { + item.rules[0].required = category === 1; + } if (item.prop === 'isOpen') { item.disabled = category === 2; } + if (item.prop === 'isDisplay') { + item.disabled = category === 2; + } }); }, }, @@ -389,6 +419,10 @@ export default { if (['add', 'edit'].includes(type)) { this.initData(); } + if (type === 'add') { + this.form.sort = 1; + this.form.isDisplay = 1; + } if (['edit', 'view'].includes(type)) { getMenu(this.form.id).then(res => { this.form = Object.assign(res.data.data, { diff --git a/src/views/system/user.vue b/src/views/system/user.vue index efbeaeb..ad8489a 100644 --- a/src/views/system/user.vue +++ b/src/views/system/user.vue @@ -172,6 +172,10 @@ <el-icon><refresh /></el-icon> 密码重置 </el-dropdown-item> + <el-dropdown-item command="setPassword" v-if="permission.user_reset"> + <el-icon><key /></el-icon> + 修改密码 + </el-dropdown-item> <el-dropdown-item command="delete" v-if="this.permission.user_delete"> <el-icon><delete /></el-icon> 删除用户 @@ -265,6 +269,32 @@ </template> </el-dialog> + <!-- 管理员修改密码 --> + <el-dialog title="修改密码" append-to-body v-model="passwordBox" width="460px"> + <el-form + ref="passwordFormRef" + :model="passwordForm" + :rules="passwordRules" + label-width="90px" + > + <el-form-item label="登录账号"> + <el-input v-model="passwordForm.account" disabled /> + </el-form-item> + <el-form-item label="新密码" prop="password"> + <el-input v-model="passwordForm.password" type="password" show-password /> + </el-form-item> + <el-form-item label="确认密码" prop="password2"> + <el-input v-model="passwordForm.password2" type="password" show-password /> + </el-form-item> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="passwordBox = false">取 消</el-button> + <el-button type="primary" @click="submitPassword">确 定</el-button> + </span> + </template> + </el-dialog> + <!-- 认证日志组件 --> <auth-log ref="authLog" /> <!-- 认证锁定配置组件 --> @@ -285,6 +315,7 @@ import { add, grant, resetPassword, + setPassword, auditPass, auditRefuse, setLeader, @@ -295,6 +326,7 @@ import { getDeptTree } from '@/api/system/dept'; import { getRoleTree } from '@/api/system/role'; import { getPostList } from '@/api/system/post'; import { mapGetters } from 'vuex'; +import { h } from 'vue'; import website from '@/config/website'; import { getToken } from '@/utils/auth'; import { downloadXls } from '@/utils/util'; @@ -318,6 +350,7 @@ export default { grantUserId: '', excelBox: false, platformBox: false, + passwordBox: false, initFlag: true, auditMode: false, selectionList: [], @@ -341,6 +374,17 @@ export default { platformFormOption: platformFormOption, data: [], platformForm: {}, + passwordForm: {}, + passwordRules: { + password: [ + { required: true, message: '请输入新密码', trigger: 'blur' }, + { min: 6, max: 32, message: '密码长度在6到32个字符', trigger: 'blur' }, + ], + password2: [ + { required: true, message: '请再次输入新密码', trigger: 'blur' }, + { validator: this.validatePassword2, trigger: 'blur' }, + ], + }, excelForm: {}, excelOption: excelOption, }; @@ -409,12 +453,14 @@ export default { this.handlePlatformForRow(row); } else if (command === 'resetPassword') { this.handleResetForRow(row); + } else if (command === 'setPassword') { + this.handlePasswordForRow(row); } else if (command === 'delete') { this.$refs.crud.rowDel(row, index); } }, handleResetForRow(row) { - this.$confirm(`确定将账号【${row.account}】的密码重置为初始密码?`, '提示', { + this.$confirm(`确定将账号【${row.account}】的密码重置为随机密码?`, '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', @@ -422,11 +468,8 @@ export default { .then(() => { return resetPassword(row.id); }) - .then(() => { - this.$message({ - type: 'success', - message: '密码重置成功!', - }); + .then(res => { + this.showResetPassword(res.data.data); }); }, handleDataManageCommand(command) { @@ -642,7 +685,7 @@ export default { this.$message.warning('请选择至少一条数据'); return; } - this.$confirm('确定将选择账号密码重置为初始密码?', { + this.$confirm('确定将选择账号密码重置为随机密码?', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', @@ -650,14 +693,20 @@ export default { .then(() => { return resetPassword(this.ids); }) - .then(() => { - this.$message({ - type: 'success', - message: '操作成功!', - }); + .then(res => { + this.showResetPassword(res.data.data); this.$refs.crud.toggleSelection(); }); }, + showResetPassword(passwordMap) { + const passwordList = Object.keys(passwordMap || {}).map(account => + h('div', null, `${account}:${passwordMap[account]}`) + ); + this.$alert(h('div', null, passwordList), '密码重置成功,请立即保存', { + confirmButtonText: '我已保存', + type: 'success', + }); + }, handleGrant() { if (this.selectionList.length === 0) { this.$message.warning('请选择至少一条数据'); @@ -759,6 +808,40 @@ export default { this.$message({ type: 'success', message: '操作成功!' }); }); }, + handlePasswordForRow(row) { + this.passwordForm = { + userId: row.id, + account: row.account, + password: '', + password2: '', + }; + this.passwordBox = true; + this.$nextTick(() => { + this.$refs.passwordFormRef && this.$refs.passwordFormRef.clearValidate(); + }); + }, + validatePassword2(rule, value, callback) { + if (value !== this.passwordForm.password) { + callback(new Error('两次输入密码不一致!')); + } else { + callback(); + } + }, + submitPassword() { + this.$refs.passwordFormRef.validate(valid => { + if (!valid) { + return; + } + setPassword( + this.passwordForm.userId, + this.passwordForm.password, + this.passwordForm.password2 + ).then(() => { + this.passwordBox = false; + this.$message({ type: 'success', message: '密码修改成功!' }); + }); + }); + }, handleImport() { this.excelBox = true; }, diff --git a/src/views/transportCapacity/driver.vue b/src/views/transportCapacity/driver.vue new file mode 100644 index 0000000..500fbce --- /dev/null +++ b/src/views/transportCapacity/driver.vue @@ -0,0 +1,875 @@ +<template> + <basic-container class="driver-page"> + <div class="driver-toolbar"> + <div class="driver-toolbar__actions"> + <el-button + type="primary" + icon="el-icon-plus" + plain + v-if="hasPermission('driver_add')" + @click="openDriver()" + >新增 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('driver_export')" + @click="handleExport" + >导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('driver_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </div> + <el-radio-group v-model="query.expireStatus" class="driver-stat" @change="handleExpireChange"> + <el-radio-button label="">全部({{ expiryStat.total }})</el-radio-button> + <el-radio-button label="within30">30天内到期({{ expiryStat.within30 }})</el-radio-button> + <el-radio-button label="expired">已到期({{ expiryStat.expired }})</el-radio-button> + </el-radio-group> + </div> + + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + v-model="form" + ref="crud" + :permission="permissionList" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #driverName="{ row }"> + <el-button type="primary" link @click="openDriver(row, true)"> + {{ row.driverName }} + </el-button> + </template> + <template #status="{ row }"> + <el-tag :type="row.status === 1 ? 'primary' : 'info'"> + {{ row.status === 1 ? '启用' : '停用' }} + </el-tag> + </template> + <template #drivingLicenseEndDate="{ row }"> + <span :class="getDateClass(row, 'drivingLicenseEndDate', 'drivingLicenseLongTerm')"> + {{ formatEndDate(row.drivingLicenseEndDate, row.drivingLicenseLongTerm) }} + </span> + </template> + <template #qualificationEndDate="{ row }"> + <span :class="getDateClass(row, 'qualificationEndDate', 'qualificationLongTerm')"> + {{ formatEndDate(row.qualificationEndDate, row.qualificationLongTerm) }} + </span> + </template> + <template #menu="{ row }"> + <el-button + type="primary" + text + icon="el-icon-view" + v-if="hasPermission('driver_view')" + @click="openDriver(row, true)" + > + 查看 + </el-button> + <el-button + type="primary" + text + icon="el-icon-edit" + v-if="hasPermission('driver_edit')" + @click="openDriver(row)" + > + 修改 + </el-button> + <el-button + type="primary" + text + :icon="row.status === 1 ? 'el-icon-close' : 'el-icon-check'" + v-if="hasPermission('driver_status')" + @click="handleStatus(row)" + > + {{ row.status === 1 ? '停用' : '启用' }} + </el-button> + </template> + </avue-crud> + + <el-dialog + :title="dialogTitle" + append-to-body + v-model="driverBox" + width="92%" + top="4vh" + class="driver-dialog" + @closed="resetDriver" + > + <el-form + ref="driverForm" + :model="driverForm" + :rules="formRules" + label-position="top" + :disabled="readonly" + class="driver-form" + > + <div class="section-title">基础身份信息</div> + <el-row :gutter="18"> + <el-col :span="6"> + <el-form-item label="司机姓名" prop="driverName"> + <el-input v-model="driverForm.driverName" maxlength="20" show-word-limit /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="身份证号" prop="idCardNo"> + <el-input + v-model="driverForm.idCardNo" + maxlength="18" + show-word-limit + @input="driverForm.idCardNo = String(driverForm.idCardNo || '').toUpperCase()" + /> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item label="出生年月" prop="birthday"> + <el-date-picker v-model="driverForm.birthday" type="date" value-format="YYYY-MM-DD" /> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item label="性别" prop="gender"> + <el-select v-model="driverForm.gender" clearable> + <el-option label="男" value="男" /> + <el-option label="女" value="女" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item label="民族" prop="nation"> + <el-input v-model="driverForm.nation" maxlength="20" /> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item label="学历" prop="education"> + <el-select v-model="driverForm.education" clearable filterable> + <el-option v-for="item in educationOptions" :key="item" :label="item" :value="item" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="住址" prop="addressRegion"> + <el-input v-model="driverForm.addressRegion" maxlength="100" placeholder="省 / 市 / 区" /> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="详细地址" prop="address"> + <el-input v-model="driverForm.address" maxlength="200" show-word-limit /> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item label="状态" prop="status"> + <el-select v-model="driverForm.status"> + <el-option label="启用" :value="1" /> + <el-option label="停用" :value="2" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="岗位" prop="postList"> + <el-checkbox-group v-model="driverForm.postList"> + <el-checkbox label="司机" /> + <el-checkbox label="押运员" /> + <el-checkbox label="装卸管理员" /> + </el-checkbox-group> + </el-form-item> + </el-col> + <el-col :span="8"> + <image-upload-field + label="身份证正面照" + prop="idCardFront" + :value="driverForm.idCardFront" + :readonly="readonly" + :headers="uploadHeaders" + @success="url => setImage('idCardFront', url)" + /> + </el-col> + <el-col :span="8"> + <image-upload-field + label="身份证反面照" + prop="idCardBack" + :value="driverForm.idCardBack" + :readonly="readonly" + :headers="uploadHeaders" + @success="url => setImage('idCardBack', url)" + /> + </el-col> + <el-col :span="8"> + <image-upload-field + label="大头照" + prop="headPhoto" + :value="driverForm.headPhoto" + :readonly="readonly" + :headers="uploadHeaders" + @success="url => setImage('headPhoto', url)" + /> + </el-col> + </el-row> + + <div class="section-title">驾驶证信息</div> + <el-row :gutter="18"> + <el-col :span="6"> + <el-form-item label="准驾车型" prop="drivingType"> + <el-select v-model="driverForm.drivingType" clearable filterable allow-create default-first-option> + <el-option v-for="item in drivingTypeOptions" :key="item" :label="item" :value="item" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="档案编号" prop="drivingLicenseNo"> + <el-input v-model="driverForm.drivingLicenseNo" maxlength="50" /> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="有效期" prop="drivingLicenseEndDate"> + <div class="date-range"> + <el-date-picker + v-model="driverForm.drivingLicenseStartDate" + type="date" + value-format="YYYY-MM-DD" + placeholder="起" + /> + <el-date-picker + v-model="driverForm.drivingLicenseEndDate" + type="date" + value-format="YYYY-MM-DD" + placeholder="止" + :disabled="driverForm.drivingLicenseLongTerm === 1" + /> + </div> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item label="长期有效" prop="drivingLicenseLongTerm"> + <el-checkbox v-model="driverForm.drivingLicenseLongTerm" :true-label="1" :false-label="0"> + 是 + </el-checkbox> + </el-form-item> + </el-col> + <el-col :span="12"> + <image-upload-field + label="驾驶证主页" + prop="drivingLicenseFront" + :value="driverForm.drivingLicenseFront" + :readonly="readonly" + :headers="uploadHeaders" + large + @success="url => setImage('drivingLicenseFront', url)" + /> + </el-col> + <el-col :span="12"> + <image-upload-field + label="驾驶证副页" + prop="drivingLicenseBack" + :value="driverForm.drivingLicenseBack" + :readonly="readonly" + :headers="uploadHeaders" + large + @success="url => setImage('drivingLicenseBack', url)" + /> + </el-col> + </el-row> + + <div class="section-title">从业资格证信息</div> + <el-row :gutter="18"> + <el-col :span="6"> + <el-form-item label="从业资格证类型" prop="qualificationType"> + <el-select v-model="driverForm.qualificationType" clearable filterable allow-create default-first-option> + <el-option label="道路运输从业资格证" value="道路运输从业资格证" /> + <el-option label="危险货物运输从业资格证" value="危险货物运输从业资格证" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="资格证号" prop="qualificationNo"> + <el-input v-model="driverForm.qualificationNo" maxlength="50" placeholder="默认身份证号" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="有效期" prop="qualificationEndDate"> + <el-date-picker + v-model="driverForm.qualificationEndDate" + type="date" + value-format="YYYY-MM-DD" + :disabled="driverForm.qualificationLongTerm === 1" + /> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item label="长期有效" prop="qualificationLongTerm"> + <el-checkbox v-model="driverForm.qualificationLongTerm" :true-label="1" :false-label="0"> + 是 + </el-checkbox> + </el-form-item> + </el-col> + <el-col :span="12"> + <image-upload-field + label="封面页" + prop="qualificationFront" + :value="driverForm.qualificationFront" + :readonly="readonly" + :headers="uploadHeaders" + large + @success="url => setImage('qualificationFront', url)" + /> + </el-col> + <el-col :span="12"> + <image-upload-field + label="内容页" + prop="qualificationBack" + :value="driverForm.qualificationBack" + :readonly="readonly" + :headers="uploadHeaders" + large + @success="url => setImage('qualificationBack', url)" + /> + </el-col> + </el-row> + + <div class="section-title">司机联系信息</div> + <el-row :gutter="18"> + <el-col :span="6"> + <el-form-item label="司机类型" prop="driverType"> + <el-select v-model="driverForm.driverType"> + <el-option label="自有" value="自有" /> + <el-option label="外协" value="外协" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="手机号" prop="mobile"> + <el-input v-model="driverForm.mobile" maxlength="20" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="紧急联系人姓名" prop="emergencyContactName"> + <el-input v-model="driverForm.emergencyContactName" maxlength="20" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="紧急联系人手机号" prop="emergencyContactMobile"> + <el-input v-model="driverForm.emergencyContactMobile" maxlength="20" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="与联系人关系" prop="contactRelation"> + <el-select v-model="driverForm.contactRelation" clearable filterable allow-create default-first-option> + <el-option v-for="item in relationOptions" :key="item" :label="item" :value="item" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="所属组织" prop="organizationName"> + <el-input v-model="driverForm.organizationName" maxlength="50" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="备注" prop="remark"> + <el-input v-model="driverForm.remark" type="textarea" maxlength="200" show-word-limit /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <el-button @click="driverBox = false">取消</el-button> + <el-button type="primary" v-if="!readonly" :loading="submitLoading" @click="handleSubmit"> + 确定 + </el-button> + </template> + </el-dialog> + </basic-container> +</template> + +<script> +import { mapGetters } from 'vuex'; +import NProgress from 'nprogress'; +import { option } from '@/option/transportCapacity/driver'; +import { getList, getDetail, submit, remove, changeStatus, getExpiryStat } from '@/api/transportCapacity/driver'; +import { exportBlob } from '@/api/common'; +import { getToken } from '@/utils/auth'; +import { downloadXls } from '@/utils/util'; + +const emptyForm = () => ({ + id: '', + driverName: '', + idCardNo: '', + birthday: '', + gender: '', + nation: '', + education: '', + addressRegion: '', + address: '', + postList: ['司机'], + posts: '', + idCardFront: '', + idCardBack: '', + headPhoto: '', + drivingType: '', + drivingLicenseNo: '', + drivingLicenseStartDate: '', + drivingLicenseEndDate: '', + drivingLicenseLongTerm: 0, + drivingLicenseFront: '', + drivingLicenseBack: '', + qualificationType: '', + qualificationNo: '', + qualificationEndDate: '', + qualificationLongTerm: 0, + qualificationFront: '', + qualificationBack: '', + driverType: '自有', + mobile: '', + contactRelation: '', + organizationName: '', + emergencyContactName: '', + emergencyContactMobile: '', + remark: '', + status: 1, +}); + +const imageUploadField = { + name: 'ImageUploadField', + props: { + label: String, + prop: String, + value: String, + readonly: Boolean, + headers: Object, + large: Boolean, + }, + emits: ['success'], + methods: { + handleSuccess(res) { + if (res.code === 200 && res.data) { + this.$emit('success', res.data.link || res.data.url || res.data.domain || ''); + } else { + this.$message.error(res.msg || '上传失败'); + } + }, + beforeUpload(file) { + const validType = ['image/jpeg', 'image/png', 'image/jpg', 'image/bmp'].includes(file.type); + const validSize = file.size / 1024 / 1024 < 5; + if (!validType) { + this.$message.error('仅支持 JPG、PNG、BMP 图片'); + } + if (!validSize) { + this.$message.error('图片大小不能超过 5MB'); + } + return validType && validSize; + }, + }, + template: ` + <el-form-item :label="label" :prop="prop"> + <el-upload + class="driver-uploader" + :class="{ 'driver-uploader--large': large }" + action="/api/blade-resource/oss/endpoint/put-file" + name="file" + :headers="headers" + :show-file-list="false" + :disabled="readonly" + :before-upload="beforeUpload" + :on-success="handleSuccess" + > + <img v-if="value" :src="value" class="driver-uploader__image" /> + <div v-else class="driver-uploader__empty">上传证件图片</div> + </el-upload> + </el-form-item> + `, +}; + +export default { + components: { + ImageUploadField: imageUploadField, + }, + data() { + return { + option, + form: {}, + query: { + expireStatus: '', + }, + searchForm: {}, + loading: true, + submitLoading: false, + data: [], + ids: '', + selectionList: [], + page: { + pageSize: 10, + currentPage: 1, + total: 0, + }, + expiryStat: { + total: 0, + within30: 0, + expired: 0, + }, + driverBox: false, + readonly: false, + driverForm: emptyForm(), + uploadHeaders: { + 'Blade-Auth': `bearer ${getToken()}`, + 'Blade-Requested-With': 'BladeHttpRequest', + }, + educationOptions: ['初中', '高中', '中专', '大专', '本科', '硕士及以上'], + drivingTypeOptions: ['A1', 'A2', 'A3', 'B1', 'B2', 'C1', 'C2'], + relationOptions: ['父母', '配偶', '子女', '兄弟姐妹', '朋友', '同事'], + formRules: { + driverName: [{ required: true, message: '请输入司机姓名', trigger: 'blur' }], + idCardNo: [{ required: true, message: '请输入身份证号', trigger: 'blur' }], + drivingType: [{ required: true, message: '请选择准驾车型', trigger: 'change' }], + drivingLicenseEndDate: [{ validator: this.validateDrivingLicenseEndDate, trigger: 'change' }], + driverType: [{ required: true, message: '请选择司机类型', trigger: 'change' }], + mobile: [{ required: true, message: '请输入手机号', trigger: 'blur' }], + emergencyContactName: [{ required: true, message: '请输入紧急联系人姓名', trigger: 'blur' }], + emergencyContactMobile: [{ required: true, message: '请输入紧急联系人手机号', trigger: 'blur' }], + organizationName: [{ required: true, message: '请输入所属组织', trigger: 'blur' }], + idCardFront: [{ required: true, message: '请上传身份证正面照', trigger: 'change' }], + idCardBack: [{ required: true, message: '请上传身份证反面照', trigger: 'change' }], + drivingLicenseFront: [{ required: true, message: '请上传驾驶证主页', trigger: 'change' }], + drivingLicenseBack: [{ required: true, message: '请上传驾驶证副页', trigger: 'change' }], + remark: [{ max: 200, message: '备注最多200字', trigger: 'blur' }], + }, + }; + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: this.hasPermission('driver_add'), + viewBtn: this.hasPermission('driver_view'), + delBtn: this.hasPermission('driver_delete'), + editBtn: this.hasPermission('driver_edit'), + }; + }, + dialogTitle() { + if (this.readonly) { + return '查看司机'; + } + return this.driverForm.id ? '修改司机' : '新增司机'; + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.permission?.[code] === true; + }, + validateDrivingLicenseEndDate(rule, value, callback) { + if (this.driverForm.drivingLicenseLongTerm !== 1 && !value) { + callback(new Error('请选择驾驶证有效期止')); + return; + } + callback(); + }, + openDriver(row, readonly = false) { + this.readonly = readonly; + if (!row?.id) { + this.driverForm = emptyForm(); + this.driverBox = true; + return; + } + getDetail(row.id).then(res => { + const detail = res.data.data || {}; + this.driverForm = { + ...emptyForm(), + ...detail, + postList: detail.posts ? detail.posts.split(',').filter(Boolean) : [], + }; + this.driverBox = true; + }); + }, + resetDriver() { + this.driverForm = emptyForm(); + this.readonly = false; + this.submitLoading = false; + this.$refs.driverForm?.clearValidate(); + }, + setImage(prop, url) { + this.driverForm[prop] = url; + this.$refs.driverForm?.validateField(prop); + }, + handleSubmit() { + this.$refs.driverForm.validate(valid => { + if (!valid) { + return; + } + const row = { + ...this.driverForm, + qualificationNo: this.driverForm.qualificationNo || this.driverForm.idCardNo, + posts: this.driverForm.postList.join(','), + }; + this.submitLoading = true; + submit(row) + .then(() => { + this.$message.success('操作成功'); + this.driverBox = false; + this.onLoad(this.page); + }) + .finally(() => { + this.submitLoading = false; + }); + }); + }, + handleStatus(row) { + const status = row.status === 1 ? 2 : 1; + const text = status === 1 ? '启用' : '停用'; + this.$confirm(`是否${text}该司机?`, '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + changeStatus(row.id, status).then(() => { + this.$message.success('操作成功'); + this.onLoad(this.page); + }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('是否删除选中的司机数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + remove(this.ids).then(() => { + this.$message.success('操作成功'); + this.onLoad(this.page); + }); + }); + }, + handleExpireChange() { + this.page.currentPage = 1; + this.onLoad(this.page); + }, + refreshStat() { + getExpiryStat(this.buildQuery(false)).then(res => { + this.expiryStat = { + total: res.data.data?.total || 0, + within30: res.data.data?.within30 || 0, + expired: res.data.data?.expired || 0, + }; + }); + }, + searchReset() { + this.searchForm = {}; + this.query = { + expireStatus: this.query.expireStatus, + }; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.searchForm = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + this.ids = list.map(item => item.id).join(','); + }, + selectionClear() { + this.selectionList = []; + this.ids = ''; + this.$refs.crud?.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.searchForm); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, this.buildQuery(true, params)) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + this.refreshStat(); + }) + .finally(() => { + this.loading = false; + }); + }, + buildQuery(includeExpire = true, params = {}) { + const query = { + ...params, + ...this.searchForm, + }; + if (includeExpire && this.query.expireStatus) { + query.expireStatus = this.query.expireStatus; + } + return query; + }, + handleExport() { + this.$confirm('是否导出司机数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-transport/driver/export-driver', this.buildExportParams()) + .then(res => { + downloadXls(res.data, `司机管理${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.buildQuery(true), + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + formatEndDate(date, longTerm) { + if (longTerm === 1) { + return '长期有效'; + } + return date || '-'; + }, + getDateClass(row, dateProp, longTermProp) { + if (row[longTermProp] === 1 || !row[dateProp]) { + return ''; + } + const today = this.$dayjs(); + const endDate = this.$dayjs(row[dateProp]); + if (endDate.isBefore(today, 'day')) { + return 'date-danger'; + } + if (endDate.diff(today, 'day') <= 30) { + return 'date-warning'; + } + return ''; + }, + }, +}; +</script> + +<style lang="scss" scoped> +.driver-page { + .driver-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-bottom: 12px; + } + + .driver-toolbar__actions { + display: flex; + align-items: center; + gap: 8px; + } + + .driver-stat { + flex-shrink: 0; + } + + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } +} + +.driver-form { + .section-title { + margin: 18px 0 14px; + padding-left: 10px; + border-left: 3px solid #e74b5f; + color: #303133; + font-weight: 600; + line-height: 18px; + } + + .section-title:first-child { + margin-top: 0; + } + + :deep(.el-date-editor.el-input), + :deep(.el-date-editor.el-input__wrapper), + :deep(.el-select), + :deep(.el-input) { + width: 100%; + } + + .date-range { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + gap: 8px; + } +} + +:deep(.driver-uploader .el-upload) { + width: 100%; + height: 170px; + border: 1px dashed #c0c4cc; + background: #fafafa; + overflow: hidden; +} + +:deep(.driver-uploader--large .el-upload) { + height: 260px; +} + +:deep(.driver-uploader__image) { + width: 100%; + height: 100%; + object-fit: contain; + display: block; +} + +:deep(.driver-uploader__empty) { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + color: #606266; +} + +.date-warning { + color: #f56c6c; + font-weight: 600; +} + +.date-danger { + color: #d40000; + font-weight: 600; +} + +@media (max-width: 1200px) { + .driver-page { + .driver-toolbar { + align-items: flex-start; + flex-direction: column; + } + } +} +</style> diff --git a/src/views/transportCapacity/ship.vue b/src/views/transportCapacity/ship.vue new file mode 100644 index 0000000..0865d9c --- /dev/null +++ b/src/views/transportCapacity/ship.vue @@ -0,0 +1,603 @@ +<template> + <basic-container class="transport-ship-page"> + <div class="ship-toolbar"> + <div class="ship-toolbar__actions"> + <el-button type="primary" icon="el-icon-plus" plain v-if="hasPermission('transport_ship_add')" @click="openShip()"> + 新增 + </el-button> + <el-button type="primary" icon="el-icon-download" plain v-if="hasPermission('transport_ship_export')" @click="handleExport"> + 导出 + </el-button> + <el-button type="danger" icon="el-icon-delete" plain v-if="hasPermission('transport_ship_delete')" @click="handleDelete"> + 批量删除 + </el-button> + </div> + <el-radio-group v-model="query.expireStatus" class="ship-stat" @change="handleExpireChange"> + <el-radio-button label="">全部({{ expiryStat.total }})</el-radio-button> + <el-radio-button label="within30">30天内到期({{ expiryStat.within30 }})</el-radio-button> + <el-radio-button label="expired">已到期({{ expiryStat.expired }})</el-radio-button> + </el-radio-group> + </div> + + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + v-model="form" + ref="crud" + :permission="permissionList" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #shipName="{ row }"> + <el-button type="primary" link @click="openShip(row, true)"> + {{ row.shipName }} + </el-button> + </template> + <template #status="{ row }"> + <el-tag :type="row.status === 1 ? 'primary' : 'info'"> + {{ row.status === 1 ? '启用' : '停用' }} + </el-tag> + </template> + <template #nationalityCertEndDate="{ row }"> + <span :class="getDateClass(row, 'nationalityCertEndDate', 'nationalityCertLongTerm')"> + {{ formatEndDate(row.nationalityCertEndDate, row.nationalityCertLongTerm) }} + </span> + </template> + <template #safeManningCertEndDate="{ row }"> + <span :class="getDateClass(row, 'safeManningCertEndDate', 'safeManningCertLongTerm')"> + {{ formatEndDate(row.safeManningCertEndDate, row.safeManningCertLongTerm) }} + </span> + </template> + <template #businessTransportCertEndDate="{ row }"> + <span :class="getDateClass(row, 'businessTransportCertEndDate', 'businessTransportCertLongTerm')"> + {{ formatEndDate(row.businessTransportCertEndDate, row.businessTransportCertLongTerm) }} + </span> + </template> + <template #leaseEndDate="{ row }"> + <span :class="getDateClass(row, 'leaseEndDate', 'leaseLongTerm')"> + {{ formatEndDate(row.leaseEndDate, row.leaseLongTerm) }} + </span> + </template> + <template #menu="{ row }"> + <el-button type="primary" text icon="el-icon-edit" v-if="hasPermission('transport_ship_edit')" @click="openShip(row)"> + 修改 + </el-button> + <el-button type="primary" text icon="el-icon-view" v-if="hasPermission('transport_ship_view')" @click="openShip(row, true)"> + 综合台账 + </el-button> + <el-button + type="primary" + text + :icon="row.status === 1 ? 'el-icon-close' : 'el-icon-check'" + v-if="hasPermission('transport_ship_status')" + @click="handleStatus(row)" + > + {{ row.status === 1 ? '停用' : '启用' }} + </el-button> + </template> + </avue-crud> + + <el-dialog :title="dialogTitle" append-to-body v-model="shipBox" width="92%" top="4vh" @closed="resetShip"> + <el-form ref="shipForm" :model="shipForm" :rules="formRules" label-position="top" :disabled="readonly" class="ship-form"> + <div class="section-title">基础船舶信息</div> + <el-row :gutter="18"> + <el-col :span="6"> + <el-form-item label="船舶名" prop="shipName"> + <el-input v-model="shipForm.shipName" maxlength="50" show-word-limit /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="船舶识别号" prop="shipIdentifierNo"> + <el-input v-model="shipForm.shipIdentifierNo" maxlength="50" show-word-limit @input="shipForm.shipIdentifierNo = String(shipForm.shipIdentifierNo || '').toUpperCase()" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="所属组织" prop="organizationName"> + <el-input v-model="shipForm.organizationName" maxlength="50" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="船检登记号" prop="shipInspectionNo"> + <el-input v-model="shipForm.shipInspectionNo" maxlength="50" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="船舶类型" prop="shipType"> + <el-select v-model="shipForm.shipType" filterable allow-create default-first-option> + <el-option v-for="item in shipTypeOptions" :key="item" :label="item" :value="item" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="状态" prop="status"> + <el-select v-model="shipForm.status"> + <el-option label="启用" :value="1" /> + <el-option label="停用" :value="2" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="备注" prop="remark"> + <el-input v-model="shipForm.remark" type="textarea" maxlength="200" show-word-limit /> + </el-form-item> + </el-col> + </el-row> + + <div class="section-title">国籍证信息</div> + <el-row :gutter="18"> + <el-col :span="8"> + <el-form-item label="国籍证有效期至" prop="nationalityCertEndDate"> + <el-date-picker v-model="shipForm.nationalityCertEndDate" type="date" value-format="YYYY-MM-DD" :disabled="shipForm.nationalityCertLongTerm === 1" /> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item label="长期有效" prop="nationalityCertLongTerm"> + <el-checkbox v-model="shipForm.nationalityCertLongTerm" :true-label="1" :false-label="0">是</el-checkbox> + </el-form-item> + </el-col> + <el-col :span="12"> + <image-upload-field label="国籍证图片" prop="nationalityCertImage" :value="shipForm.nationalityCertImage" :readonly="readonly" :headers="uploadHeaders" large @success="url => setImage('nationalityCertImage', url)" /> + </el-col> + </el-row> + + <div class="section-title">安全配员证信息</div> + <el-row :gutter="18"> + <el-col :span="8"> + <el-form-item label="最低安全配员证书有效期至" prop="safeManningCertEndDate"> + <el-date-picker v-model="shipForm.safeManningCertEndDate" type="date" value-format="YYYY-MM-DD" :disabled="shipForm.safeManningCertLongTerm === 1" /> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item label="长期有效" prop="safeManningCertLongTerm"> + <el-checkbox v-model="shipForm.safeManningCertLongTerm" :true-label="1" :false-label="0">是</el-checkbox> + </el-form-item> + </el-col> + <el-col :span="12"> + <image-upload-field label="最低安全配员证书图片" prop="safeManningCertImage" :value="shipForm.safeManningCertImage" :readonly="readonly" :headers="uploadHeaders" large @success="url => setImage('safeManningCertImage', url)" /> + </el-col> + </el-row> + + <div class="section-title">营业运输证信息</div> + <el-row :gutter="18"> + <el-col :span="8"> + <el-form-item label="营业运输证有效期至" prop="businessTransportCertEndDate"> + <el-date-picker v-model="shipForm.businessTransportCertEndDate" type="date" value-format="YYYY-MM-DD" :disabled="shipForm.businessTransportCertLongTerm === 1" /> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item label="长期有效" prop="businessTransportCertLongTerm"> + <el-checkbox v-model="shipForm.businessTransportCertLongTerm" :true-label="1" :false-label="0">是</el-checkbox> + </el-form-item> + </el-col> + <el-col :span="12"> + <image-upload-field label="营业运输证图片" prop="businessTransportCertImage" :value="shipForm.businessTransportCertImage" :readonly="readonly" :headers="uploadHeaders" large @success="url => setImage('businessTransportCertImage', url)" /> + </el-col> + </el-row> + + <div class="section-title">承租信息</div> + <el-row :gutter="18"> + <el-col :span="8"> + <el-form-item label="承租有效期至" prop="leaseEndDate"> + <el-date-picker v-model="shipForm.leaseEndDate" type="date" value-format="YYYY-MM-DD" :disabled="shipForm.leaseLongTerm === 1" /> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item label="长期有效" prop="leaseLongTerm"> + <el-checkbox v-model="shipForm.leaseLongTerm" :true-label="1" :false-label="0">是</el-checkbox> + </el-form-item> + </el-col> + <el-col :span="12"> + <image-upload-field label="承租合同图片" prop="leaseContractImage" :value="shipForm.leaseContractImage" :readonly="readonly" :headers="uploadHeaders" large @success="url => setImage('leaseContractImage', url)" /> + </el-col> + </el-row> + </el-form> + <template #footer> + <el-button @click="shipBox = false">取消</el-button> + <el-button type="primary" v-if="!readonly" :loading="submitLoading" @click="handleSubmit">确定</el-button> + </template> + </el-dialog> + </basic-container> +</template> + +<script> +import { mapGetters } from 'vuex'; +import NProgress from 'nprogress'; +import { option } from '@/option/transportCapacity/transport-ship'; +import { getList, getDetail, submit, remove, changeStatus, getExpiryStat } from '@/api/transportCapacity/transport-ship'; +import { exportBlob } from '@/api/common'; +import { getToken } from '@/utils/auth'; +import { downloadXls } from '@/utils/util'; + +const emptyForm = () => ({ + id: '', + shipName: '', + shipIdentifierNo: '', + organizationName: '', + shipInspectionNo: '', + shipType: '', + nationalityCertEndDate: '', + nationalityCertLongTerm: 0, + nationalityCertImage: '', + safeManningCertEndDate: '', + safeManningCertLongTerm: 0, + safeManningCertImage: '', + businessTransportCertEndDate: '', + businessTransportCertLongTerm: 0, + businessTransportCertImage: '', + leaseEndDate: '', + leaseLongTerm: 0, + leaseContractImage: '', + remark: '', + status: 1, +}); + +const imageUploadField = { + name: 'ImageUploadField', + props: { + label: String, + prop: String, + value: String, + readonly: Boolean, + headers: Object, + large: Boolean, + }, + emits: ['success'], + methods: { + handleSuccess(res) { + if (res.code === 200 && res.data) { + this.$emit('success', res.data.link || res.data.url || res.data.domain || ''); + } else { + this.$message.error(res.msg || '上传失败'); + } + }, + beforeUpload(file) { + const validType = ['image/jpeg', 'image/png', 'image/jpg', 'image/bmp'].includes(file.type); + const validSize = file.size / 1024 / 1024 < 5; + if (!validType) this.$message.error('仅支持 JPG、PNG、BMP 图片'); + if (!validSize) this.$message.error('图片大小不能超过 5MB'); + return validType && validSize; + }, + }, + template: ` + <el-form-item :label="label" :prop="prop"> + <el-upload + class="ship-uploader" + :class="{ 'ship-uploader--large': large }" + action="/api/blade-resource/oss/endpoint/put-file" + name="file" + :headers="headers" + :show-file-list="false" + :disabled="readonly" + :before-upload="beforeUpload" + :on-success="handleSuccess" + > + <img v-if="value" :src="value" class="ship-uploader__image" /> + <div v-else class="ship-uploader__empty">上传证件图片</div> + </el-upload> + </el-form-item> + `, +}; + +export default { + components: { ImageUploadField: imageUploadField }, + data() { + return { + option, + form: {}, + query: { expireStatus: '' }, + searchForm: {}, + loading: true, + submitLoading: false, + data: [], + ids: '', + selectionList: [], + page: { pageSize: 10, currentPage: 1, total: 0 }, + expiryStat: { total: 0, within30: 0, expired: 0 }, + shipBox: false, + readonly: false, + shipForm: emptyForm(), + uploadHeaders: { + 'Blade-Auth': `bearer ${getToken()}`, + 'Blade-Requested-With': 'BladeHttpRequest', + }, + shipTypeOptions: ['干货船', '集装箱船', '散货船', '油船', '拖轮', '驳船'], + formRules: { + shipName: [{ required: true, message: '请输入船舶名', trigger: 'blur' }], + shipIdentifierNo: [{ required: true, message: '请输入船舶识别号', trigger: 'blur' }], + organizationName: [{ required: true, message: '请输入所属组织', trigger: 'blur' }], + shipType: [{ required: true, message: '请选择船舶类型', trigger: 'change' }], + nationalityCertEndDate: [{ validator: this.validateNationalityCertEndDate, trigger: 'change' }], + safeManningCertEndDate: [{ validator: this.validateSafeManningCertEndDate, trigger: 'change' }], + businessTransportCertEndDate: [{ validator: this.validateBusinessTransportCertEndDate, trigger: 'change' }], + remark: [{ max: 200, message: '备注最多200字', trigger: 'blur' }], + }, + }; + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: this.hasPermission('transport_ship_add'), + viewBtn: this.hasPermission('transport_ship_view'), + delBtn: this.hasPermission('transport_ship_delete'), + editBtn: this.hasPermission('transport_ship_edit'), + }; + }, + dialogTitle() { + if (this.readonly) return '船舶综合台账'; + return this.shipForm.id ? '修改船舶' : '新增船舶'; + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.permission?.[code] === true; + }, + validateNationalityCertEndDate(rule, value, callback) { + if (this.shipForm.nationalityCertLongTerm !== 1 && !value) return callback(new Error('请选择国籍证有效期至')); + callback(); + }, + validateSafeManningCertEndDate(rule, value, callback) { + if (this.shipForm.safeManningCertLongTerm !== 1 && !value) return callback(new Error('请选择最低安全配员证书有效期至')); + callback(); + }, + validateBusinessTransportCertEndDate(rule, value, callback) { + if (this.shipForm.businessTransportCertLongTerm !== 1 && !value) return callback(new Error('请选择营业运输证有效期至')); + callback(); + }, + openShip(row, readonly = false) { + this.readonly = readonly; + if (!row?.id) { + this.shipForm = emptyForm(); + this.shipBox = true; + return; + } + getDetail(row.id).then(res => { + this.shipForm = { ...emptyForm(), ...(res.data.data || {}) }; + this.shipBox = true; + }); + }, + resetShip() { + this.shipForm = emptyForm(); + this.readonly = false; + this.submitLoading = false; + this.$refs.shipForm?.clearValidate(); + }, + setImage(prop, url) { + this.shipForm[prop] = url; + this.$refs.shipForm?.validateField(prop); + }, + handleSubmit() { + this.$refs.shipForm.validate(valid => { + if (!valid) return; + this.submitLoading = true; + submit(this.shipForm) + .then(() => { + this.$message.success('操作成功'); + this.shipBox = false; + this.onLoad(this.page); + }) + .finally(() => { + this.submitLoading = false; + }); + }); + }, + handleStatus(row) { + const status = row.status === 1 ? 2 : 1; + const text = status === 1 ? '启用' : '停用'; + this.$confirm(`是否${text}该船舶?`, '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { + changeStatus(row.id, status).then(() => { + this.$message.success('操作成功'); + this.onLoad(this.page); + }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('是否删除选中的船舶数据?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { + remove(this.ids).then(() => { + this.$message.success('操作成功'); + this.onLoad(this.page); + }); + }); + }, + handleExpireChange() { + this.page.currentPage = 1; + this.onLoad(this.page); + }, + refreshStat() { + getExpiryStat(this.buildQuery(false)).then(res => { + this.expiryStat = { + total: res.data.data?.total || 0, + within30: res.data.data?.within30 || 0, + expired: res.data.data?.expired || 0, + }; + }); + }, + searchReset() { + this.searchForm = {}; + this.query = { expireStatus: this.query.expireStatus }; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.searchForm = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + this.ids = list.map(item => item.id).join(','); + }, + selectionClear() { + this.selectionList = []; + this.ids = ''; + this.$refs.crud?.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.searchForm); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, this.buildQuery(true, params)) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + this.refreshStat(); + }) + .finally(() => { + this.loading = false; + }); + }, + buildQuery(includeExpire = true, params = {}) { + const query = { ...params, ...this.searchForm }; + if (includeExpire && this.query.expireStatus) query.expireStatus = this.query.expireStatus; + return query; + }, + handleExport() { + this.$confirm('是否导出船舶数据?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => { + NProgress.start(); + exportBlob('/blade-transport/transport-ship/export-transport-ship', this.buildExportParams()) + .then(res => { + downloadXls(res.data, `船舶管理${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { ...this.buildQuery(true), ids: this.ids, [this.website.tokenHeader]: getToken() }; + }, + formatEndDate(date, longTerm) { + if (longTerm === 1) return '长期有效'; + return date || '-'; + }, + getDateClass(row, dateProp, longTermProp) { + if (row[longTermProp] === 1 || !row[dateProp]) return ''; + const today = this.$dayjs(); + const endDate = this.$dayjs(row[dateProp]); + if (endDate.isBefore(today, 'day')) return 'date-danger'; + if (endDate.diff(today, 'day') <= 30) return 'date-warning'; + return ''; + }, + }, +}; +</script> + +<style lang="scss" scoped> +.transport-ship-page { + .ship-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-bottom: 12px; + } + + .ship-toolbar__actions { + display: flex; + align-items: center; + gap: 8px; + } + + .ship-stat { + flex-shrink: 0; + } + + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } +} + +.ship-form { + .section-title { + margin: 18px 0 14px; + padding-left: 10px; + border-left: 3px solid #e74b5f; + color: #303133; + font-weight: 600; + line-height: 18px; + } + + .section-title:first-child { + margin-top: 0; + } + + :deep(.el-date-editor.el-input), + :deep(.el-date-editor.el-input__wrapper), + :deep(.el-select), + :deep(.el-input) { + width: 100%; + } +} + +:deep(.ship-uploader .el-upload) { + width: 100%; + height: 170px; + border: 1px dashed #c0c4cc; + background: #fafafa; + overflow: hidden; +} + +:deep(.ship-uploader--large .el-upload) { + height: 260px; +} + +:deep(.ship-uploader__image) { + width: 100%; + height: 100%; + object-fit: contain; + display: block; +} + +:deep(.ship-uploader__empty) { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + color: #606266; +} + +.date-warning { + color: #f56c6c; + font-weight: 600; +} + +.date-danger { + color: #d40000; + font-weight: 600; +} + +@media (max-width: 1200px) { + .transport-ship-page { + .ship-toolbar { + align-items: flex-start; + flex-direction: column; + } + } +} +</style> diff --git a/src/views/transportCapacity/vehicle.vue b/src/views/transportCapacity/vehicle.vue new file mode 100644 index 0000000..4937bc1 --- /dev/null +++ b/src/views/transportCapacity/vehicle.vue @@ -0,0 +1,852 @@ +<template> + <basic-container class="transport-vehicle-page"> + <div class="vehicle-toolbar"> + <div class="vehicle-toolbar__actions"> + <el-button + type="primary" + icon="el-icon-plus" + plain + v-if="hasPermission('transport_vehicle_add')" + @click="openVehicle()" + >新增 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('transport_vehicle_export')" + @click="handleExport" + >导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('transport_vehicle_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </div> + <el-radio-group v-model="query.expireStatus" class="vehicle-stat" @change="handleExpireChange"> + <el-radio-button label="">全部({{ expiryStat.total }})</el-radio-button> + <el-radio-button label="within30">30天内到期({{ expiryStat.within30 }})</el-radio-button> + <el-radio-button label="expired">已到期({{ expiryStat.expired }})</el-radio-button> + </el-radio-group> + </div> + + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + v-model="form" + ref="crud" + :permission="permissionList" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #plateNo="{ row }"> + <el-button type="primary" link @click="openVehicle(row, true)"> + {{ row.plateNo }} + </el-button> + </template> + <template #status="{ row }"> + <el-tag :type="row.status === 1 ? 'primary' : 'info'"> + {{ row.status === 1 ? '启用' : '停用' }} + </el-tag> + </template> + <template #drivingLicenseEndDate="{ row }"> + <span :class="getDateClass(row, 'drivingLicenseEndDate', 'drivingLicenseLongTerm')"> + {{ formatEndDate(row.drivingLicenseEndDate, row.drivingLicenseLongTerm) }} + </span> + </template> + <template #roadTransportCertEndDate="{ row }"> + <span :class="getDateClass(row, 'roadTransportCertEndDate', 'roadTransportCertLongTerm')"> + {{ formatEndDate(row.roadTransportCertEndDate, row.roadTransportCertLongTerm) }} + </span> + </template> + <template #annualReviewEndDate="{ row }"> + <span :class="getDateClass(row, 'annualReviewEndDate', 'annualReviewLongTerm')"> + {{ formatEndDate(row.annualReviewEndDate, row.annualReviewLongTerm) }} + </span> + </template> + <template #menu="{ row }"> + <el-button + type="primary" + text + icon="el-icon-view" + v-if="hasPermission('transport_vehicle_view')" + @click="openVehicle(row, true)" + > + 查看 + </el-button> + <el-button + type="primary" + text + icon="el-icon-edit" + v-if="hasPermission('transport_vehicle_edit')" + @click="openVehicle(row)" + > + 修改 + </el-button> + <el-button + type="primary" + text + :icon="row.status === 1 ? 'el-icon-close' : 'el-icon-check'" + v-if="hasPermission('transport_vehicle_status')" + @click="handleStatus(row)" + > + {{ row.status === 1 ? '停用' : '启用' }} + </el-button> + </template> + </avue-crud> + + <el-dialog + :title="dialogTitle" + append-to-body + v-model="vehicleBox" + width="92%" + top="4vh" + class="vehicle-dialog" + @closed="resetVehicle" + > + <el-form + ref="vehicleForm" + :model="vehicleForm" + :rules="formRules" + label-position="top" + :disabled="readonly" + class="vehicle-form" + > + <div class="section-title">基础车辆信息</div> + <el-row :gutter="18"> + <el-col :span="6"> + <el-form-item label="所属组织" prop="organizationName"> + <el-input v-model="vehicleForm.organizationName" maxlength="50" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="车牌号" prop="plateNo"> + <el-input + v-model="vehicleForm.plateNo" + maxlength="16" + show-word-limit + @input="vehicleForm.plateNo = String(vehicleForm.plateNo || '').toUpperCase()" + /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="车辆类型" prop="vehicleType"> + <el-select v-model="vehicleForm.vehicleType" filterable allow-create default-first-option> + <el-option v-for="item in vehicleTypeOptions" :key="item" :label="item" :value="item" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="业务关系" prop="businessRelation"> + <el-select v-model="vehicleForm.businessRelation"> + <el-option v-for="item in businessRelationOptions" :key="item" :label="item" :value="item" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="能源类型" prop="energyType"> + <el-select v-model="vehicleForm.energyType" filterable allow-create default-first-option> + <el-option v-for="item in energyTypeOptions" :key="item" :label="item" :value="item" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="核定载质量(KG)" prop="approvedLoadKg"> + <el-input-number v-model="vehicleForm.approvedLoadKg" :min="0" :precision="0" controls-position="right" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="准牵引总质量(KG)" prop="tractionMassKg"> + <el-input-number v-model="vehicleForm.tractionMassKg" :min="0" :precision="0" controls-position="right" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="状态" prop="status"> + <el-select v-model="vehicleForm.status"> + <el-option label="启用" :value="1" /> + <el-option label="停用" :value="2" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="外廓长度(mm)" prop="outerLength"> + <el-input-number v-model="vehicleForm.outerLength" :min="0" :precision="0" controls-position="right" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="外廓宽度(mm)" prop="outerWidth"> + <el-input-number v-model="vehicleForm.outerWidth" :min="0" :precision="0" controls-position="right" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="外廓高度(mm)" prop="outerHeight"> + <el-input-number v-model="vehicleForm.outerHeight" :min="0" :precision="0" controls-position="right" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="海关备案号" prop="customsRecordNo"> + <el-input v-model="vehicleForm.customsRecordNo" maxlength="50" /> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="强制报废日期" prop="compulsoryScrapDate"> + <el-date-picker + v-model="vehicleForm.compulsoryScrapDate" + type="date" + value-format="YYYY-MM-DD" + :disabled="vehicleForm.compulsoryScrapLongTerm === 1" + /> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item label="长期有效" prop="compulsoryScrapLongTerm"> + <el-checkbox v-model="vehicleForm.compulsoryScrapLongTerm" :true-label="1" :false-label="0"> + 是 + </el-checkbox> + </el-form-item> + </el-col> + </el-row> + + <div class="section-title">行驶证信息</div> + <el-row :gutter="18"> + <el-col :span="6"> + <el-form-item label="行驶证档案编号" prop="drivingLicenseNo"> + <el-input v-model="vehicleForm.drivingLicenseNo" maxlength="50" /> + </el-form-item> + </el-col> + <el-col :span="10"> + <el-form-item label="行驶证有效期" prop="drivingLicenseEndDate"> + <div class="date-range"> + <el-date-picker v-model="vehicleForm.drivingLicenseStartDate" type="date" value-format="YYYY-MM-DD" placeholder="起" /> + <el-date-picker + v-model="vehicleForm.drivingLicenseEndDate" + type="date" + value-format="YYYY-MM-DD" + placeholder="止" + :disabled="vehicleForm.drivingLicenseLongTerm === 1" + /> + </div> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item label="长期有效" prop="drivingLicenseLongTerm"> + <el-checkbox v-model="vehicleForm.drivingLicenseLongTerm" :true-label="1" :false-label="0"> + 是 + </el-checkbox> + </el-form-item> + </el-col> + <el-col :span="12"> + <image-upload-field + label="行驶证图片" + prop="drivingLicenseImage" + :value="vehicleForm.drivingLicenseImage" + :readonly="readonly" + :headers="uploadHeaders" + large + @success="url => setImage('drivingLicenseImage', url)" + /> + </el-col> + </el-row> + + <div class="section-title">道路运输证信息</div> + <el-row :gutter="18"> + <el-col :span="6"> + <el-form-item label="道路运输证号" prop="roadTransportCertNo"> + <el-input v-model="vehicleForm.roadTransportCertNo" maxlength="50" /> + </el-form-item> + </el-col> + <el-col :span="10"> + <el-form-item label="道路运输证有效期" prop="roadTransportCertEndDate"> + <div class="date-range"> + <el-date-picker v-model="vehicleForm.roadTransportCertStartDate" type="date" value-format="YYYY-MM-DD" placeholder="起" /> + <el-date-picker + v-model="vehicleForm.roadTransportCertEndDate" + type="date" + value-format="YYYY-MM-DD" + placeholder="止" + :disabled="vehicleForm.roadTransportCertLongTerm === 1" + /> + </div> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item label="长期有效" prop="roadTransportCertLongTerm"> + <el-checkbox v-model="vehicleForm.roadTransportCertLongTerm" :true-label="1" :false-label="0"> + 是 + </el-checkbox> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="道路运输年审有效期" prop="annualReviewEndDate"> + <el-date-picker + v-model="vehicleForm.annualReviewEndDate" + type="date" + value-format="YYYY-MM-DD" + :disabled="vehicleForm.annualReviewLongTerm === 1" + /> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item label="年审长期有效" prop="annualReviewLongTerm"> + <el-checkbox v-model="vehicleForm.annualReviewLongTerm" :true-label="1" :false-label="0"> + 是 + </el-checkbox> + </el-form-item> + </el-col> + <el-col :span="12"> + <image-upload-field + label="道路运输证图片" + prop="roadTransportCertImage" + :value="vehicleForm.roadTransportCertImage" + :readonly="readonly" + :headers="uploadHeaders" + large + @success="url => setImage('roadTransportCertImage', url)" + /> + </el-col> + </el-row> + + <div class="section-title">机动车登记本信息</div> + <el-row :gutter="18"> + <el-col :span="6"> + <el-form-item label="机动车登记编号" prop="registrationNo"> + <el-input v-model="vehicleForm.registrationNo" maxlength="50" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="机动车登记日期" prop="registrationDate"> + <el-date-picker v-model="vehicleForm.registrationDate" type="date" value-format="YYYY-MM-DD" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="备注" prop="remark"> + <el-input v-model="vehicleForm.remark" type="textarea" maxlength="200" show-word-limit /> + </el-form-item> + </el-col> + <el-col :span="12"> + <image-upload-field + label="机动车登记本图片" + prop="registrationImage" + :value="vehicleForm.registrationImage" + :readonly="readonly" + :headers="uploadHeaders" + large + @success="url => setImage('registrationImage', url)" + /> + </el-col> + </el-row> + </el-form> + <template #footer> + <el-button @click="vehicleBox = false">取消</el-button> + <el-button type="primary" v-if="!readonly" :loading="submitLoading" @click="handleSubmit"> + 确定 + </el-button> + </template> + </el-dialog> + </basic-container> +</template> + +<script> +import { mapGetters } from 'vuex'; +import NProgress from 'nprogress'; +import { option } from '@/option/transportCapacity/transport-vehicle'; +import { + getList, + getDetail, + submit, + remove, + changeStatus, + getExpiryStat, +} from '@/api/transportCapacity/transport-vehicle'; +import { exportBlob } from '@/api/common'; +import { getToken } from '@/utils/auth'; +import { downloadXls } from '@/utils/util'; + +const emptyForm = () => ({ + id: '', + organizationName: '', + plateNo: '', + vehicleType: '', + outerLength: undefined, + outerWidth: undefined, + outerHeight: undefined, + approvedLoadKg: undefined, + tractionMassKg: undefined, + businessRelation: '自有', + energyType: '', + compulsoryScrapDate: '', + compulsoryScrapLongTerm: 0, + customsRecordNo: '', + drivingLicenseNo: '', + drivingLicenseStartDate: '', + drivingLicenseEndDate: '', + drivingLicenseLongTerm: 0, + drivingLicenseImage: '', + roadTransportCertNo: '', + roadTransportCertStartDate: '', + roadTransportCertEndDate: '', + roadTransportCertLongTerm: 0, + roadTransportCertImage: '', + annualReviewEndDate: '', + annualReviewLongTerm: 0, + registrationNo: '', + registrationDate: '', + registrationImage: '', + remark: '', + status: 1, +}); + +const imageUploadField = { + name: 'ImageUploadField', + props: { + label: String, + prop: String, + value: String, + readonly: Boolean, + headers: Object, + large: Boolean, + }, + emits: ['success'], + methods: { + handleSuccess(res) { + if (res.code === 200 && res.data) { + this.$emit('success', res.data.link || res.data.url || res.data.domain || ''); + } else { + this.$message.error(res.msg || '上传失败'); + } + }, + beforeUpload(file) { + const validType = ['image/jpeg', 'image/png', 'image/jpg', 'image/bmp'].includes(file.type); + const validSize = file.size / 1024 / 1024 < 5; + if (!validType) { + this.$message.error('仅支持 JPG、PNG、BMP 图片'); + } + if (!validSize) { + this.$message.error('图片大小不能超过 5MB'); + } + return validType && validSize; + }, + }, + template: ` + <el-form-item :label="label" :prop="prop"> + <el-upload + class="vehicle-uploader" + :class="{ 'vehicle-uploader--large': large }" + action="/api/blade-resource/oss/endpoint/put-file" + name="file" + :headers="headers" + :show-file-list="false" + :disabled="readonly" + :before-upload="beforeUpload" + :on-success="handleSuccess" + > + <img v-if="value" :src="value" class="vehicle-uploader__image" /> + <div v-else class="vehicle-uploader__empty">上传证件图片</div> + </el-upload> + </el-form-item> + `, +}; + +export default { + components: { + ImageUploadField: imageUploadField, + }, + data() { + return { + option, + form: {}, + query: { + expireStatus: '', + }, + searchForm: {}, + loading: true, + submitLoading: false, + data: [], + ids: '', + selectionList: [], + page: { + pageSize: 10, + currentPage: 1, + total: 0, + }, + expiryStat: { + total: 0, + within30: 0, + expired: 0, + }, + vehicleBox: false, + readonly: false, + vehicleForm: emptyForm(), + uploadHeaders: { + 'Blade-Auth': `bearer ${getToken()}`, + 'Blade-Requested-With': 'BladeHttpRequest', + }, + vehicleTypeOptions: ['厢式', '高栏', '平板', '仓栅', '牵引车', '冷藏车'], + businessRelationOptions: ['自有', '业务合作', '管理挂靠'], + energyTypeOptions: ['柴油', '汽油', '新能源', '天然气'], + formRules: { + organizationName: [{ required: true, message: '请输入所属组织', trigger: 'blur' }], + plateNo: [ + { required: true, message: '请输入车牌号', trigger: 'blur' }, + { pattern: /^[\u4e00-\u9fa5][A-Z][A-Z0-9挂学警港澳]{5,6}$/, message: '请输入标准车牌号', trigger: 'blur' }, + ], + vehicleType: [{ required: true, message: '请选择车辆类型', trigger: 'change' }], + approvedLoadKg: [{ required: true, message: '请输入核定载质量', trigger: 'blur' }], + businessRelation: [{ required: true, message: '请选择业务关系', trigger: 'change' }], + energyType: [{ required: true, message: '请选择能源类型', trigger: 'change' }], + drivingLicenseNo: [{ required: true, message: '请输入行驶证档案编号', trigger: 'blur' }], + drivingLicenseEndDate: [{ validator: this.validateDrivingLicenseEndDate, trigger: 'change' }], + roadTransportCertNo: [{ required: true, message: '请输入道路运输证号', trigger: 'blur' }], + roadTransportCertEndDate: [{ validator: this.validateRoadTransportCertEndDate, trigger: 'change' }], + annualReviewEndDate: [{ validator: this.validateAnnualReviewEndDate, trigger: 'change' }], + registrationNo: [{ required: true, message: '请输入机动车登记编号', trigger: 'blur' }], + remark: [{ max: 200, message: '备注最多200字', trigger: 'blur' }], + }, + }; + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: this.hasPermission('transport_vehicle_add'), + viewBtn: this.hasPermission('transport_vehicle_view'), + delBtn: this.hasPermission('transport_vehicle_delete'), + editBtn: this.hasPermission('transport_vehicle_edit'), + }; + }, + dialogTitle() { + if (this.readonly) { + return '查看车辆'; + } + return this.vehicleForm.id ? '修改车辆' : '新增车辆'; + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.permission?.[code] === true; + }, + validateDrivingLicenseEndDate(rule, value, callback) { + if (this.vehicleForm.drivingLicenseLongTerm !== 1 && !value) { + callback(new Error('请选择行驶证有效期止')); + return; + } + callback(); + }, + validateRoadTransportCertEndDate(rule, value, callback) { + if (this.vehicleForm.roadTransportCertLongTerm !== 1 && !value) { + callback(new Error('请选择道路运输证有效期止')); + return; + } + callback(); + }, + validateAnnualReviewEndDate(rule, value, callback) { + if (this.vehicleForm.annualReviewLongTerm !== 1 && !value) { + callback(new Error('请选择道路运输年审有效期')); + return; + } + callback(); + }, + openVehicle(row, readonly = false) { + this.readonly = readonly; + if (!row?.id) { + this.vehicleForm = emptyForm(); + this.vehicleBox = true; + return; + } + getDetail(row.id).then(res => { + this.vehicleForm = { + ...emptyForm(), + ...(res.data.data || {}), + }; + this.vehicleBox = true; + }); + }, + resetVehicle() { + this.vehicleForm = emptyForm(); + this.readonly = false; + this.submitLoading = false; + this.$refs.vehicleForm?.clearValidate(); + }, + setImage(prop, url) { + this.vehicleForm[prop] = url; + this.$refs.vehicleForm?.validateField(prop); + }, + handleSubmit() { + this.$refs.vehicleForm.validate(valid => { + if (!valid) { + return; + } + this.submitLoading = true; + submit(this.vehicleForm) + .then(() => { + this.$message.success('操作成功'); + this.vehicleBox = false; + this.onLoad(this.page); + }) + .finally(() => { + this.submitLoading = false; + }); + }); + }, + handleStatus(row) { + const status = row.status === 1 ? 2 : 1; + const text = status === 1 ? '启用' : '停用'; + this.$confirm(`是否${text}该车辆?`, '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + changeStatus(row.id, status).then(() => { + this.$message.success('操作成功'); + this.onLoad(this.page); + }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('是否删除选中的车辆数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + remove(this.ids).then(() => { + this.$message.success('操作成功'); + this.onLoad(this.page); + }); + }); + }, + handleExpireChange() { + this.page.currentPage = 1; + this.onLoad(this.page); + }, + refreshStat() { + getExpiryStat(this.buildQuery(false)).then(res => { + this.expiryStat = { + total: res.data.data?.total || 0, + within30: res.data.data?.within30 || 0, + expired: res.data.data?.expired || 0, + }; + }); + }, + searchReset() { + this.searchForm = {}; + this.query = { + expireStatus: this.query.expireStatus, + }; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.searchForm = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + this.ids = list.map(item => item.id).join(','); + }, + selectionClear() { + this.selectionList = []; + this.ids = ''; + this.$refs.crud?.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.searchForm); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, this.buildQuery(true, params)) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + this.refreshStat(); + }) + .finally(() => { + this.loading = false; + }); + }, + buildQuery(includeExpire = true, params = {}) { + const query = { + ...params, + ...this.searchForm, + }; + if (includeExpire && this.query.expireStatus) { + query.expireStatus = this.query.expireStatus; + } + return query; + }, + handleExport() { + this.$confirm('是否导出车辆数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-transport/transport-vehicle/export-transport-vehicle', this.buildExportParams()) + .then(res => { + downloadXls(res.data, `车辆管理${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.buildQuery(true), + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + formatEndDate(date, longTerm) { + if (longTerm === 1) { + return '长期有效'; + } + return date || '-'; + }, + getDateClass(row, dateProp, longTermProp) { + if (row[longTermProp] === 1 || !row[dateProp]) { + return ''; + } + const today = this.$dayjs(); + const endDate = this.$dayjs(row[dateProp]); + if (endDate.isBefore(today, 'day')) { + return 'date-danger'; + } + if (endDate.diff(today, 'day') <= 30) { + return 'date-warning'; + } + return ''; + }, + }, +}; +</script> + +<style lang="scss" scoped> +.transport-vehicle-page { + .vehicle-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-bottom: 12px; + } + + .vehicle-toolbar__actions { + display: flex; + align-items: center; + gap: 8px; + } + + .vehicle-stat { + flex-shrink: 0; + } + + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } +} + +.vehicle-form { + .section-title { + margin: 18px 0 14px; + padding-left: 10px; + border-left: 3px solid #e74b5f; + color: #303133; + font-weight: 600; + line-height: 18px; + } + + .section-title:first-child { + margin-top: 0; + } + + :deep(.el-date-editor.el-input), + :deep(.el-date-editor.el-input__wrapper), + :deep(.el-select), + :deep(.el-input), + :deep(.el-input-number) { + width: 100%; + } + + .date-range { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + gap: 8px; + } +} + +:deep(.vehicle-uploader .el-upload) { + width: 100%; + height: 170px; + border: 1px dashed #c0c4cc; + background: #fafafa; + overflow: hidden; +} + +:deep(.vehicle-uploader--large .el-upload) { + height: 260px; +} + +:deep(.vehicle-uploader__image) { + width: 100%; + height: 100%; + object-fit: contain; + display: block; +} + +:deep(.vehicle-uploader__empty) { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + color: #606266; +} + +.date-warning { + color: #f56c6c; + font-weight: 600; +} + +.date-danger { + color: #d40000; + font-weight: 600; +} + +@media (max-width: 1200px) { + .transport-vehicle-page { + .vehicle-toolbar { + align-items: flex-start; + flex-direction: column; + } + } +} +</style> diff --git a/src/views/vehicle/accident-record.vue b/src/views/vehicle/accident-record.vue new file mode 100644 index 0000000..ab7207a --- /dev/null +++ b/src/views/vehicle/accident-record.vue @@ -0,0 +1,426 @@ +<template> + <basic-container class="accident-record-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + :permission="permissionList" + :before-open="beforeOpen" + v-model="form" + ref="crud" + @row-update="rowUpdate" + @row-save="rowSave" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('accident_record_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('accident_record_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('accident_record_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('accident_record_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #vehicleNo="{ row, index }"> + <el-button type="primary" link @click="$refs.crud.rowView(row, index)"> + {{ row.vehicleNo }} + </el-button> + </template> + <template #vehicleNoForm> + <el-autocomplete + v-model="form.vehicleNo" + :fetch-suggestions="fetchVehicleOptions" + clearable + placeholder="输入车牌号/船号查询选择" + value-key="value" + class="accident-record-page__input" + /> + </template> + <template #attachments="{ row }"> + <span>{{ formatAttachments(row.attachments) }}</span> + </template> + </avue-crud> + <el-dialog title="事故记录数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter"> + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { add, getDetail, getList, remove, update } from '@/api/vehicle/accident-record'; +import { getList as getVehicleList } from '@/api/transportCapacity/transport-vehicle'; +import { getList as getShipList } from '@/api/transportCapacity/transport-ship'; +import { getDeptTree } from '@/api/system/dept'; +import { exportBlob } from '@/api/common'; +import { downloadXls } from '@/utils/util'; +import { getToken } from '@/utils/auth'; +import { mapGetters } from 'vuex'; +import { excelOption, option } from '@/option/vehicle/accident-record'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + return { + form: {}, + query: {}, + loading: true, + excelBox: false, + excelForm: {}, + option, + excelOption, + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + data: [], + }; + }, + created() { + this.initDeptTree(); + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: this.hasPermission('accident_record_add'), + viewBtn: this.hasPermission('accident_record_view'), + delBtn: this.hasPermission('accident_record_delete'), + editBtn: this.hasPermission('accident_record_edit'), + }; + }, + ids() { + const ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + watch: { + 'form.vehicleType': { + handler(value) { + this.updateVehicleTypeDisplays(value || '车辆'); + }, + immediate: true, + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission[code], false); + }, + initDeptTree() { + getDeptTree(this.userInfo.tenantId).then(res => { + const column = this.findColumn(this.option.column, 'createDept'); + column.dicData = res.data.data; + }); + }, + updateVehicleTypeDisplays(vehicleType) { + const vehicleTypeColumn = this.findColumn(this.option.column, 'vehicleType'); + vehicleTypeColumn.disabled = Boolean(this.form.id); + if (!this.form.id && this.form.vehicleNo) { + this.form.vehicleNo = ''; + } + }, + fetchVehicleOptions(queryString, callback) { + const vehicleType = this.form.vehicleType || '车辆'; + const request = vehicleType === '船舶' ? getShipList : getVehicleList; + const params = + vehicleType === '船舶' ? { shipIdentifierNo: queryString } : { plateNo: queryString }; + request(1, 20, params) + .then(res => { + const records = res.data.data.records || []; + callback( + records.map(item => ({ + value: vehicleType === '船舶' ? item.shipIdentifierNo || item.shipName : item.plateNo, + })) + ); + }) + .catch(() => callback([])); + }, + formatAttachments(value) { + if (!value) return ''; + if (Array.isArray(value)) return `${value.length} 个`; + if (typeof value !== 'string') return '1 个'; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? `${attachments.length} 个` : '1 个'; + } catch (error) { + return ( + value + .split(',') + .map(item => item.trim()) + .filter(Boolean).length + ' 个' + ); + } + }, + parseAttachments(value) { + if (!value || Array.isArray(value)) return value; + if (typeof value !== 'string') return []; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? attachments : []; + } catch (error) { + return value + .split(',') + .map(item => ({ name: item.trim(), url: item.trim() })) + .filter(item => item.url); + } + }, + stringifyAttachments(value) { + if (!value || typeof value === 'string') return value; + return JSON.stringify(value); + }, + normalizeRow(row) { + const values = { ...row }; + values.vehicleType = values.vehicleType || '车辆'; + if (values.vehicleNo) { + values.vehicleNo = values.vehicleNo.trim().toUpperCase(); + } + values.attachments = this.stringifyAttachments(values.attachments); + return values; + }, + validateRow(row) { + if (Number(row.directEconomicLoss) < 0) { + this.$message.warning('直接经济损失不能小于 0'); + return false; + } + if (Number(row.insuranceClaimAmount) < 0) { + this.$message.warning('保险理赔金额不能小于 0'); + return false; + } + if ( + row.directEconomicLoss !== undefined && + row.directEconomicLoss !== null && + row.directEconomicLoss !== '' && + row.insuranceClaimAmount !== undefined && + row.insuranceClaimAmount !== null && + row.insuranceClaimAmount !== '' && + Number(row.insuranceClaimAmount) > Number(row.directEconomicLoss) + ) { + this.$message.warning('保险理赔金额不能超过直接经济损失金额'); + return false; + } + return true; + }, + rowSave(row, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + add(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + update(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + beforeOpen(done, type) { + if (type === 'add') { + this.form = { + vehicleType: '车辆', + }; + this.updateVehicleTypeDisplays('车辆'); + } + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + const detail = res.data.data; + detail.attachments = this.parseAttachments(detail.attachments); + this.form = detail; + this.updateVehicleTypeDisplays(detail.vehicleType); + }); + } + done(); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出事故记录数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-transport/accident-record/export-accident-record', this.buildExportParams()) + .then(res => { + downloadXls(res.data, `事故记录${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob( + `/blade-transport/accident-record/export-template?${this.website.tokenHeader}=${getToken()}` + ).then(res => { + downloadXls(res.data, '事故记录模板.xlsx'); + }); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.accident-record-page { + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } + + &__input { + width: 100%; + } +} +</style> diff --git a/src/views/vehicle/annual-inspection-record.vue b/src/views/vehicle/annual-inspection-record.vue new file mode 100644 index 0000000..cf26a86 --- /dev/null +++ b/src/views/vehicle/annual-inspection-record.vue @@ -0,0 +1,441 @@ +<template> + <basic-container class="annual-inspection-record-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + :permission="permissionList" + :before-open="beforeOpen" + v-model="form" + ref="crud" + @row-update="rowUpdate" + @row-save="rowSave" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('annual_inspection_record_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('annual_inspection_record_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('annual_inspection_record_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('annual_inspection_record_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #vehicleNo="{ row, index }"> + <el-button type="primary" link @click="$refs.crud.rowView(row, index)"> + {{ row.vehicleNo }} + </el-button> + </template> + <template #vehicleNoForm> + <el-autocomplete + v-model="form.vehicleNo" + :fetch-suggestions="fetchVehicleOptions" + clearable + placeholder="输入车牌号/船号查询选择" + value-key="value" + class="annual-inspection-record-page__input" + /> + </template> + <template #attachments="{ row }"> + <span>{{ formatAttachments(row.attachments) }}</span> + </template> + </avue-crud> + <el-dialog title="年检记录数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter"> + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { add, getDetail, getList, remove, update } from '@/api/vehicle/annual-inspection-record'; +import { getList as getVehicleList } from '@/api/transportCapacity/transport-vehicle'; +import { getList as getShipList } from '@/api/transportCapacity/transport-ship'; +import { getDeptTree } from '@/api/system/dept'; +import { exportBlob } from '@/api/common'; +import { downloadXls } from '@/utils/util'; +import { getToken } from '@/utils/auth'; +import { mapGetters } from 'vuex'; +import { excelOption, option } from '@/option/vehicle/annual-inspection-record'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + return { + form: {}, + query: {}, + loading: true, + excelBox: false, + excelForm: {}, + option, + excelOption, + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + data: [], + }; + }, + created() { + this.initDeptTree(); + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: this.hasPermission('annual_inspection_record_add'), + viewBtn: this.hasPermission('annual_inspection_record_view'), + delBtn: this.hasPermission('annual_inspection_record_delete'), + editBtn: this.hasPermission('annual_inspection_record_edit'), + }; + }, + ids() { + const ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + watch: { + 'form.vehicleType': { + handler(value) { + this.updateVehicleTypeDisplays(value || '车辆'); + }, + immediate: true, + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission[code], false); + }, + initDeptTree() { + getDeptTree(this.userInfo.tenantId).then(res => { + const column = this.findColumn(this.option.column, 'createDept'); + column.dicData = res.data.data; + }); + }, + updateVehicleTypeDisplays(vehicleType) { + const vehicleTypeColumn = this.findColumn(this.option.column, 'vehicleType'); + const vehicleLevelColumn = this.findColumn(this.option.column, 'vehicleTechnicalLevel'); + const shipTypeColumn = this.findColumn(this.option.column, 'shipInspectionType'); + const passengerColumn = this.findColumn(this.option.column, 'passengerTypeLevel'); + vehicleTypeColumn.disabled = Boolean(this.form.id); + vehicleLevelColumn.display = vehicleType !== '船舶'; + shipTypeColumn.display = vehicleType === '船舶'; + passengerColumn.display = vehicleType !== '船舶'; + if (vehicleType === '船舶') { + this.form.vehicleTechnicalLevel = undefined; + this.form.passengerTypeLevel = undefined; + } else { + this.form.shipInspectionType = undefined; + } + if (!this.form.id && this.form.vehicleNo) { + this.form.vehicleNo = ''; + } + }, + fetchVehicleOptions(queryString, callback) { + const vehicleType = this.form.vehicleType || '车辆'; + const request = vehicleType === '船舶' ? getShipList : getVehicleList; + const params = + vehicleType === '船舶' ? { shipIdentifierNo: queryString } : { plateNo: queryString }; + request(1, 20, params) + .then(res => { + const records = res.data.data.records || []; + callback( + records.map(item => ({ + value: vehicleType === '船舶' ? item.shipIdentifierNo || item.shipName : item.plateNo, + })) + ); + }) + .catch(() => callback([])); + }, + formatAttachments(value) { + if (!value) return ''; + if (Array.isArray(value)) return `${value.length} 个`; + if (typeof value !== 'string') return '1 个'; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? `${attachments.length} 个` : '1 个'; + } catch (error) { + return ( + value + .split(',') + .map(item => item.trim()) + .filter(Boolean).length + ' 个' + ); + } + }, + parseAttachments(value) { + if (!value || Array.isArray(value)) return value; + if (typeof value !== 'string') return []; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? attachments : []; + } catch (error) { + return value + .split(',') + .map(item => ({ name: item.trim(), url: item.trim() })) + .filter(item => item.url); + } + }, + stringifyAttachments(value) { + if (!value || typeof value === 'string') return value; + return JSON.stringify(value); + }, + normalizeRow(row) { + const values = { ...row }; + values.vehicleType = values.vehicleType || '车辆'; + if (values.vehicleNo) { + values.vehicleNo = values.vehicleNo.trim().toUpperCase(); + } + if (values.vehicleType === '船舶') { + values.vehicleTechnicalLevel = undefined; + values.passengerTypeLevel = undefined; + } else { + values.shipInspectionType = undefined; + } + values.attachments = this.stringifyAttachments(values.attachments); + return values; + }, + validateRow(row) { + if (Number(row.fee) < 0) { + this.$message.warning('费用不能小于 0'); + return false; + } + if ( + row.inspectionAssessmentDate && + row.validUntilDate && + new Date(row.validUntilDate.replace(/-/g, '/')).getTime() <= + new Date(row.inspectionAssessmentDate.replace(/-/g, '/')).getTime() + ) { + this.$message.warning('有效期截止日应大于检测评定日期'); + return false; + } + return true; + }, + rowSave(row, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + add(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + update(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + beforeOpen(done, type) { + if (type === 'add') { + this.form = { + vehicleType: '车辆', + inspectionAssessmentDate: this.$dayjs().format('YYYY-MM-DD'), + }; + this.updateVehicleTypeDisplays('车辆'); + } + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + const detail = res.data.data; + detail.attachments = this.parseAttachments(detail.attachments); + this.form = detail; + this.updateVehicleTypeDisplays(detail.vehicleType); + }); + } + done(); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出年检记录数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob( + '/blade-transport/annual-inspection-record/export-annual-inspection-record', + this.buildExportParams() + ) + .then(res => { + downloadXls(res.data, `年检记录${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob( + `/blade-transport/annual-inspection-record/export-template?${this.website.tokenHeader}=${getToken()}` + ).then(res => { + downloadXls(res.data, '年检记录模板.xlsx'); + }); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.annual-inspection-record-page { + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } + + &__input { + width: 100%; + } +} +</style> diff --git a/src/views/vehicle/credit-score-quantification.vue b/src/views/vehicle/credit-score-quantification.vue new file mode 100644 index 0000000..f4cd009 --- /dev/null +++ b/src/views/vehicle/credit-score-quantification.vue @@ -0,0 +1,862 @@ +<template> + <basic-container> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + v-model="form" + ref="crud" + :permission="permissionList" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-plus" + plain + v-if="hasPermission('credit_score_quantification_add')" + @click="openConfig()" + >新增 + </el-button> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('credit_score_quantification_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('credit_score_quantification_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('credit_score_quantification_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('credit_score_quantification_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #name="{ row }"> + <el-button type="primary" link @click="openConfig(row, true)"> + {{ row.name }} + </el-button> + </template> + <template #status="{ row }"> + <el-tag :type="statusMap[row.status].type"> + {{ statusMap[row.status].label }} + </el-tag> + </template> + <template #menu="{ row }"> + <el-button + type="primary" + text + icon="el-icon-edit" + v-if="hasPermission('credit_score_quantification_edit')" + @click="openConfig(row)" + > + 编辑 + </el-button> + <el-button + type="primary" + text + icon="el-icon-position" + v-if="hasPermission('credit_score_quantification_publish') && row.status !== 1" + @click="handlePublish(row)" + > + 发布 + </el-button> + <el-button + type="primary" + text + :icon="row.status === 1 ? 'el-icon-close' : 'el-icon-check'" + v-if="hasPermission('credit_score_quantification_status') && row.status !== 3" + @click="handleStatus(row)" + > + {{ row.status === 1 ? '停用' : '启用' }} + </el-button> + <el-button + type="danger" + text + icon="el-icon-delete" + v-if="hasPermission('credit_score_quantification_delete') && row.status === 3" + @click="rowDel(row)" + > + 删除 + </el-button> + </template> + </avue-crud> + + <el-dialog title="评分量化表数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter"> + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + + <el-dialog + :title="readonly ? '查看评分量化表' : configForm.id ? '编辑评分量化表' : '新增评分量化表'" + append-to-body + v-model="configBox" + width="88%" + class="score-dialog" + @closed="resetConfig" + > + <div class="score-config"> + <div class="section-title">评分量化表</div> + <el-form :model="configForm" label-width="110px" class="base-form" :disabled="readonly"> + <el-form-item label="评定表名称" required> + <el-input v-model="configForm.name" maxlength="30" show-word-limit /> + </el-form-item> + <el-form-item label="备注"> + <el-input v-model="configForm.remark" type="textarea" maxlength="500" show-word-limit /> + </el-form-item> + </el-form> + + <div class="section-head"> + <div class="section-title">评分表</div> + </div> + <el-table :data="configForm.categories" border class="config-table"> + <el-table-column label="序号" type="index" width="70" align="center" /> + <el-table-column label="评分类目" prop="categoryName" min-width="180" /> + <el-table-column label="评分项目数" width="140" align="center"> + <template #default="{ row }">{{ row.items.length }}</template> + </el-table-column> + <el-table-column label="操作" width="180" align="center"> + <template #default="{ row }"> + <el-button type="primary" text @click="openCategory(row)">编辑</el-button> + </template> + </el-table-column> + </el-table> + + <div class="section-head standard-head"> + <div class="section-title">评估标准</div> + <el-button + type="primary" + icon="el-icon-plus" + v-if="!readonly" + @click="openStandard()" + > + 添加 + </el-button> + </div> + <el-table :data="configForm.standards" border class="config-table"> + <el-table-column label="序号" type="index" width="70" align="center" /> + <el-table-column label="信用等级" prop="creditLevel" width="120" align="center" /> + <el-table-column label="得分率" width="160" align="center"> + <template #default="{ row }">{{ row.scoreRateLower }}% - {{ row.scoreRateUpper }}%</template> + </el-table-column> + <el-table-column label="最大资金使用额度(万元)" width="210" align="center"> + <template #default="{ row }"> + {{ row.creditLimitLower }} - {{ row.creditLimitUpper }} + </template> + </el-table-column> + <el-table-column label="标准说明" prop="standardDescription" min-width="320" /> + <el-table-column label="操作" width="160" align="center"> + <template #default="{ row, $index }"> + <el-button type="primary" text @click="openStandard(row, $index)">编辑</el-button> + <el-button type="danger" text v-if="!readonly" @click="removeStandard($index)">删除</el-button> + </template> + </el-table-column> + </el-table> + </div> + <template #footer> + <el-button @click="configBox = false">{{ readonly ? '关闭' : '取消' }}</el-button> + <el-button type="primary" v-if="!readonly" @click="saveConfig">保存</el-button> + </template> + </el-dialog> + + <el-dialog + title="评分类目详情" + append-to-body + v-model="categoryBox" + width="82%" + class="score-dialog" + > + <div class="category-detail"> + <div class="category-line">评分类目:{{ currentCategory.categoryName }}</div> + <div class="section-head"> + <span></span> + <el-button type="primary" icon="el-icon-plus" v-if="!readonly" @click="openItem()"> + 添加 + </el-button> + </div> + <el-table :data="currentCategory.items" border class="config-table"> + <el-table-column label="序号" type="index" width="70" align="center" /> + <el-table-column label="评分项目" prop="itemName" width="180" /> + <el-table-column label="得分说明" prop="scoreDescription" min-width="260" /> + <el-table-column label="选项数" width="100" align="center"> + <template #default="{ row }">{{ row.options.length }}</template> + </el-table-column> + <el-table-column label="操作" width="160" align="center"> + <template #default="{ row, $index }"> + <el-button type="primary" text @click="openItem(row, $index)">编辑</el-button> + <el-button type="danger" text v-if="!readonly" @click="removeItem($index)">删除</el-button> + </template> + </el-table-column> + </el-table> + </div> + <template #footer> + <el-button type="primary" @click="categoryBox = false">保存</el-button> + </template> + </el-dialog> + + <el-dialog title="评分项目详情" append-to-body v-model="itemBox" width="76%"> + <el-form :model="itemForm" label-width="100px" :disabled="readonly"> + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="评分项目" required> + <el-input v-model="itemForm.itemName" maxlength="20" show-word-limit /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="得分说明"> + <el-input v-model="itemForm.scoreDescription" maxlength="300" show-word-limit /> + </el-form-item> + </el-col> + </el-row> + <el-form-item label="选项描述"> + <el-input v-model="itemForm.optionDescription" maxlength="100" show-word-limit /> + </el-form-item> + <el-form-item label="选项" required> + <div class="option-editor"> + <div class="option-row" v-for="(option, index) in itemForm.options" :key="index"> + <el-input v-model="option.optionName" maxlength="100" placeholder="选项描述" /> + <el-input-number v-model="option.score" :min="0" :precision="2" placeholder="分值" /> + <span class="score-unit">分</span> + <el-button type="danger" text v-if="!readonly && itemForm.options.length > 1" @click="removeOption(index)"> + 删除 + </el-button> + </div> + <el-button type="primary" text v-if="!readonly" @click="addOption">+添加选项</el-button> + </div> + </el-form-item> + </el-form> + <template #footer> + <el-button @click="itemBox = false">取消</el-button> + <el-button type="primary" v-if="!readonly" @click="saveItem">保存</el-button> + </template> + </el-dialog> + + <el-dialog title="评估标准设置" append-to-body v-model="standardBox" width="76%"> + <el-form :model="standardForm" label-width="170px" :disabled="readonly"> + <el-row :gutter="20"> + <el-col :span="8"> + <el-form-item label="信用等级" required> + <el-input v-model="standardForm.creditLevel" maxlength="30" /> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="得分率(%)" required> + <div class="range-input"> + <el-input-number v-model="standardForm.scoreRateLower" :min="0" :max="100" :precision="0" /> + <span>至</span> + <el-input-number v-model="standardForm.scoreRateUpper" :min="0" :max="100" :precision="0" /> + </div> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="得分率每增加" required> + <el-input-number v-model="standardForm.scoreRateIncrease" :min="0" :precision="0" /> + </el-form-item> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="8"> + <el-form-item label="最大资金使用额度(万元)" required> + <div class="range-input"> + <el-input-number v-model="standardForm.creditLimitLower" :min="0" :precision="2" /> + <span>至</span> + <el-input-number v-model="standardForm.creditLimitUpper" :min="0" :precision="2" /> + </div> + </el-form-item> + </el-col> + <el-col :span="8"> + <el-form-item label="额度增加" required> + <el-input-number v-model="standardForm.creditLimitIncrease" :min="0" :precision="2" /> + <span class="score-unit">万元</span> + </el-form-item> + </el-col> + </el-row> + <el-form-item label="标准说明"> + <el-input v-model="standardForm.standardDescription" type="textarea" maxlength="500" show-word-limit /> + </el-form-item> + </el-form> + <template #footer> + <el-button @click="standardBox = false">取消</el-button> + <el-button type="primary" v-if="!readonly" @click="saveStandard">保存</el-button> + </template> + </el-dialog> + </basic-container> +</template> + +<script> +import { + getList, + getDetail, + submit, + remove, + publish, + changeStatus, +} from '@/api/vehicle/credit-score-quantification'; +import { exportBlob } from '@/api/common'; +import { downloadXls } from '@/utils/util'; +import { getToken } from '@/utils/auth'; +import { mapGetters } from 'vuex'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + return { + form: {}, + query: {}, + loading: true, + data: [], + page: { + pageSize: 10, + currentPage: 1, + total: 0, + }, + selectionList: [], + configBox: false, + categoryBox: false, + itemBox: false, + standardBox: false, + excelBox: false, + readonly: false, + excelForm: {}, + configForm: this.emptyConfig(), + currentCategory: { items: [] }, + currentItemIndex: -1, + currentStandardIndex: -1, + itemForm: this.emptyItem(), + standardForm: this.emptyStandard(), + statusMap: { + 1: { label: '正常', type: 'success' }, + 2: { label: '停用', type: 'info' }, + 3: { label: '草稿', type: 'warning' }, + }, + option: { + height: 'auto', + calcHeight: 32, + dialogWidth: 760, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + indexLabel: '序号', + addBtn: false, + viewBtn: false, + delBtn: false, + editBtn: false, + selection: true, + dialogClickModal: false, + menuWidth: 300, + column: [ + { + label: '评定表名称', + prop: 'name', + slot: true, + minWidth: 180, + search: true, + maxlength: 30, + rules: [{ required: true, message: '请输入评定表名称', trigger: 'blur' }], + }, + { + label: '备注', + prop: 'remark', + minWidth: 260, + overHidden: true, + }, + { + label: '状态', + prop: 'status', + type: 'select', + search: true, + slot: true, + dataType: 'number', + dicData: [ + { label: '正常', value: 1 }, + { label: '停用', value: 2 }, + { label: '草稿', value: 3 }, + ], + }, + { + label: '创建时间', + prop: 'createTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + minWidth: 160, + }, + { + label: '创建开始时间', + prop: 'createTimeStart', + type: 'date', + format: 'YYYY-MM-DD 00:00:00', + valueFormat: 'YYYY-MM-DD 00:00:00', + search: true, + hide: true, + display: false, + }, + { + label: '创建结束时间', + prop: 'createTimeEnd', + type: 'date', + format: 'YYYY-MM-DD 23:59:59', + valueFormat: 'YYYY-MM-DD 23:59:59', + search: true, + hide: true, + display: false, + }, + ], + }, + excelOption: { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + action: '/blade-transport/credit-score-quantification/import-credit-score-quantification', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], + }, + }; + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: false, + }; + }, + ids() { + let ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission[code], false); + }, + emptyConfig() { + return { + name: '', + remark: '', + standardDescription: '', + status: 3, + categories: this.defaultCategories(), + standards: [], + }; + }, + defaultCategories() { + return [ + { categoryCode: 'basic', categoryName: '基础得分项', sort: 1, items: [] }, + { categoryCode: 'plus', categoryName: '加分项目', sort: 2, items: [] }, + { categoryCode: 'minus', categoryName: '减分项目', sort: 3, items: [] }, + ]; + }, + emptyItem() { + return { + itemName: '', + scoreDescription: '', + optionDescription: '', + options: [{ optionName: '', score: 0 }], + }; + }, + emptyStandard() { + return { + creditLevel: '', + scoreRateLower: undefined, + scoreRateUpper: undefined, + scoreRateIncrease: undefined, + creditLimitLower: undefined, + creditLimitUpper: undefined, + creditLimitIncrease: undefined, + standardDescription: '', + }; + }, + normalizeDetail(detail) { + const categories = this.defaultCategories(); + const map = {}; + (detail.categories || []).forEach(category => { + map[category.categoryCode] = { + ...category, + items: (category.items || []).map(item => ({ + ...item, + options: item.options && item.options.length ? item.options : [{ optionName: '', score: 0 }], + })), + }; + }); + return { + ...detail, + categories: categories.map(category => map[category.categoryCode] || category), + standards: detail.standards || [], + }; + }, + openConfig(row, readonly = false) { + this.readonly = readonly; + if (row && row.id) { + getDetail(row.id).then(res => { + this.configForm = this.normalizeDetail(res.data.data); + this.configBox = true; + }); + return; + } + this.configForm = this.emptyConfig(); + if (row && row.name) { + this.configForm.name = row.name; + } + this.configBox = true; + }, + resetConfig() { + this.readonly = false; + this.configForm = this.emptyConfig(); + }, + openCategory(category) { + this.currentCategory = category; + this.categoryBox = true; + }, + openItem(row, index = -1) { + this.currentItemIndex = index; + this.itemForm = row ? JSON.parse(JSON.stringify(row)) : this.emptyItem(); + this.itemBox = true; + }, + saveItem() { + if (!this.itemForm.itemName || !this.itemForm.itemName.trim()) { + this.$message.warning('请输入评分项目'); + return; + } + if (!this.itemForm.options.length) { + this.$message.warning('至少添加1条档位选项'); + return; + } + const item = JSON.parse(JSON.stringify(this.itemForm)); + if (this.currentItemIndex >= 0) { + this.currentCategory.items.splice(this.currentItemIndex, 1, item); + } else { + this.currentCategory.items.push(item); + } + this.itemBox = false; + }, + removeItem(index) { + this.currentCategory.items.splice(index, 1); + }, + addOption() { + this.itemForm.options.push({ optionName: '', score: 0 }); + }, + removeOption(index) { + this.itemForm.options.splice(index, 1); + }, + openStandard(row, index = -1) { + this.currentStandardIndex = index; + this.standardForm = row ? JSON.parse(JSON.stringify(row)) : this.emptyStandard(); + this.standardBox = true; + }, + saveStandard() { + if (!this.standardForm.creditLevel || !this.standardForm.creditLevel.trim()) { + this.$message.warning('请输入信用等级'); + return; + } + if ( + [ + this.standardForm.scoreRateLower, + this.standardForm.scoreRateUpper, + this.standardForm.scoreRateIncrease, + this.standardForm.creditLimitLower, + this.standardForm.creditLimitUpper, + this.standardForm.creditLimitIncrease, + ].some(value => value === undefined || value === null || value === '') + ) { + this.$message.warning('请完整填写评估标准必填项'); + return; + } + if (Number(this.standardForm.scoreRateLower) >= Number(this.standardForm.scoreRateUpper)) { + this.$message.warning('得分率下限必须小于上限'); + return; + } + const standard = JSON.parse(JSON.stringify(this.standardForm)); + if (this.currentStandardIndex >= 0) { + this.configForm.standards.splice(this.currentStandardIndex, 1, standard); + } else { + this.configForm.standards.push(standard); + } + this.standardBox = false; + }, + removeStandard(index) { + this.configForm.standards.splice(index, 1); + }, + validateConfig() { + if (!this.configForm.name || !this.configForm.name.trim()) { + this.$message.warning('请输入评定表名称'); + return false; + } + const basic = this.configForm.categories.find(item => item.categoryCode === 'basic'); + if (!basic || basic.items.length === 0) { + this.$message.warning('至少配置1个基础得分项目'); + return false; + } + for (const category of this.configForm.categories) { + for (const item of category.items) { + if (!item.options || item.options.length === 0) { + this.$message.warning(`${item.itemName}至少存在1条档位选项`); + return false; + } + } + } + return true; + }, + saveConfig() { + if (!this.validateConfig()) return; + submit(this.configForm).then(() => { + this.configBox = false; + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('仅草稿状态量表可删除,确定删除所选数据?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + handlePublish(row) { + this.$confirm('发布前将校验所有评分项目、档位选项和评估标准,是否继续?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => publish(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '发布成功!' }); + }); + }, + handleStatus(row) { + const nextStatus = row.status === 1 ? 2 : 1; + const actionName = nextStatus === 1 ? '启用' : '停用'; + this.$confirm(`是否确认${actionName}该量表?`, { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => changeStatus(row.id, nextStatus)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出评分量化表数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob( + '/blade-transport/credit-score-quantification/export-credit-score-quantification', + this.buildExportParams() + ) + .then(res => { + downloadXls(res.data, `评分量化表${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob( + `/blade-transport/credit-score-quantification/export-template?${this.website.tokenHeader}=${getToken()}` + ).then(res => { + downloadXls(res.data, '评分量化表模板.xlsx'); + }); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.score-config { + padding: 4px 12px 12px; +} + +.base-form { + max-width: 1080px; + margin: 10px auto 28px; +} + +.section-head { + display: flex; + align-items: center; + justify-content: space-between; + margin: 24px 0 12px; +} + +.section-title { + margin: 18px 0 12px; + font-size: 20px; + font-weight: 700; + color: #303133; +} + +.standard-head { + margin-top: 36px; +} + +.config-table { + width: 100%; +} + +.category-line { + margin: 0 0 24px; + font-size: 16px; + font-weight: 600; + color: #606266; +} + +.option-editor { + width: 100%; +} + +.option-row { + display: grid; + grid-template-columns: minmax(260px, 1fr) 190px 32px 70px; + gap: 12px; + align-items: center; + margin-bottom: 14px; +} + +.range-input { + display: flex; + align-items: center; + gap: 10px; +} + +.score-unit { + margin-left: 8px; + color: #606266; +} + +:deep(.score-dialog .el-dialog__body) { + max-height: 70vh; + overflow: auto; +} +</style> diff --git a/src/views/vehicle/customer-archive.vue b/src/views/vehicle/customer-archive.vue new file mode 100644 index 0000000..2d515f8 --- /dev/null +++ b/src/views/vehicle/customer-archive.vue @@ -0,0 +1,1243 @@ +<template> + <basic-container class="customer-archive-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + v-model="form" + ref="crud" + :permission="permissionList" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-plus" + plain + v-if="hasPermission('customer_archive_add')" + @click="openArchive()" + >新增 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('customer_archive_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('customer_archive_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #customerCode="{ row }"> + <el-button type="primary" link @click="openArchive(row, true)"> + {{ row.customerCode }} + </el-button> + </template> + <template #accessType="{ row }"> + <el-tag :type="row.accessType === 'formal' ? 'success' : 'warning'"> + {{ accessTypeMap[row.accessType] || '临时客商' }} + </el-tag> + </template> + <template #approvalStatus="{ row }"> + <el-tag :type="approvalStatusMap[row.approvalStatus]?.type || 'info'"> + {{ approvalStatusMap[row.approvalStatus]?.label || '草稿' }} + </el-tag> + </template> + <template #status="{ row }"> + <el-tag :type="row.status === 1 ? 'primary' : 'info'"> + {{ row.status === 1 ? '启用' : '停用' }} + </el-tag> + </template> + <template #menu="{ row }"> + <el-button + type="primary" + text + icon="el-icon-view" + v-if="hasPermission('customer_archive_view')" + @click="openArchive(row, true)" + > + 查看 + </el-button> + <el-button + type="primary" + text + icon="el-icon-edit" + v-if="hasPermission('customer_archive_edit') && row.approvalStatus !== 'reviewing'" + @click="openArchive(row)" + > + 编辑 + </el-button> + <el-button + type="primary" + text + icon="el-icon-position" + v-if=" + hasPermission('customer_archive_submit') && + ['draft', 'rejected'].includes(row.approvalStatus) + " + @click="handleSubmitApproval(row)" + > + 提交 + </el-button> + <el-button + type="success" + text + icon="el-icon-check" + v-if="hasPermission('customer_archive_approve') && row.approvalStatus === 'reviewing'" + @click="handleApprove(row)" + > + 审核通过 + </el-button> + <el-button + type="warning" + text + icon="el-icon-close" + v-if="hasPermission('customer_archive_reject') && row.approvalStatus === 'reviewing'" + @click="handleReject(row)" + > + 审核不通过 + </el-button> + <el-button + type="primary" + text + :icon="row.status === 1 ? 'el-icon-close' : 'el-icon-check'" + v-if="hasPermission('customer_archive_status')" + @click="handleStatus(row)" + > + {{ row.status === 1 ? '停用' : '启用' }} + </el-button> + <el-button + type="danger" + text + icon="el-icon-delete" + v-if="hasPermission('customer_archive_delete') && row.approvalStatus === 'draft'" + @click="rowDel(row)" + > + 删除 + </el-button> + </template> + </avue-crud> + + <el-dialog + :title="dialogTitle" + append-to-body + v-model="archiveBox" + width="92%" + top="4vh" + class="archive-dialog" + @closed="resetArchive" + > + <el-form + ref="archiveForm" + :model="archiveForm" + :rules="formRules" + label-position="top" + :disabled="readonly" + class="archive-form" + > + <div class="section-title">基本信息</div> + <el-row :gutter="18"> + <el-col :span="6"> + <el-form-item label="客商编号" prop="customerCode"> + <el-input v-model="archiveForm.customerCode" disabled placeholder="保存后自动生成" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="准入类型" prop="accessType"> + <el-radio-group v-model="archiveForm.accessType"> + <el-radio label="temporary">临时客商</el-radio> + <el-radio label="formal">正式客商</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="审批状态" prop="approvalStatus"> + <el-select v-model="archiveForm.approvalStatus" disabled> + <el-option + v-for="item in approvalStatusOptions" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="状态" prop="status"> + <el-select v-model="archiveForm.status"> + <el-option label="启用" :value="1" /> + <el-option label="停用" :value="2" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="客商简称" prop="shortName"> + <el-input v-model="archiveForm.shortName" maxlength="20" show-word-limit /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="客商全称" prop="fullName"> + <el-input v-model="archiveForm.fullName" maxlength="100" show-word-limit /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="客商性质" prop="customerNature"> + <el-select v-model="archiveForm.customerNature" filterable allow-create default-first-option> + <el-option label="企业" value="企业" /> + <el-option label="个人" value="个人" /> + <el-option label="事业单位" value="事业单位" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="统一社会信用代码" prop="unifiedCreditCode"> + <el-input + v-model="archiveForm.unifiedCreditCode" + maxlength="18" + show-word-limit + @input="archiveForm.unifiedCreditCode = String(archiveForm.unifiedCreditCode || '').toUpperCase()" + /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="客商类型" prop="customerType"> + <el-select v-model="archiveForm.customerType" filterable allow-create default-first-option> + <el-option + v-for="item in customerTypeOptions" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="所属项目" prop="projectName"> + <el-input v-model="archiveForm.projectName" maxlength="100" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="法人/负责人" prop="legalPerson"> + <el-input v-model="archiveForm.legalPerson" maxlength="10" show-word-limit /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="联系电话" prop="contactPhone"> + <el-input v-model="archiveForm.contactPhone" maxlength="20" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="所属组织" prop="deptName"> + <el-select v-model="archiveForm.deptId" filterable clearable @change="onDeptChange"> + <el-option + v-for="item in deptOptions" + :key="item.value" + :label="item.label" + :value="item.value" + /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="开票税点" prop="invoiceTaxRate"> + <el-input-number v-model="archiveForm.invoiceTaxRate" :min="0" :precision="2" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="营业期限类型" prop="businessTermType"> + <el-select v-model="archiveForm.businessTermType" clearable> + <el-option label="长期" value="长期" /> + <el-option label="固定期限" value="固定期限" /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="营业期限截止日" prop="businessEndDate"> + <el-date-picker + v-model="archiveForm.businessEndDate" + type="date" + value-format="YYYY-MM-DD" + :disabled="archiveForm.businessTermType === '长期'" + /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="注册资金(万元)" prop="registeredCapital"> + <el-input-number v-model="archiveForm.registeredCapital" :min="0" :precision="2" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="客商负责人" prop="principal"> + <el-input v-model="archiveForm.principal" maxlength="10" show-word-limit /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="助记码" prop="mnemonicCode"> + <el-input v-model="archiveForm.mnemonicCode" maxlength="15" show-word-limit /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="客户等级" prop="customerLevel"> + <el-input v-model="archiveForm.customerLevel" maxlength="30" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="最大资金使用额度(万元)" prop="maxCreditLimit"> + <el-input-number v-model="archiveForm.maxCreditLimit" :min="0" :precision="2" /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item label="申请总资金使用额度(万元)" prop="applyCreditLimit"> + <el-input-number v-model="archiveForm.applyCreditLimit" :min="0" :precision="2" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="注册/实际经营地址" prop="registeredAddress"> + <el-input v-model="archiveForm.registeredAddress" maxlength="200" show-word-limit /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="经营范围" prop="businessScope"> + <el-input + v-model="archiveForm.businessScope" + type="textarea" + maxlength="500" + show-word-limit + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="备注" prop="remark"> + <el-input v-model="archiveForm.remark" type="textarea" maxlength="500" show-word-limit /> + </el-form-item> + </el-col> + </el-row> + </el-form> + + <div class="section-head"> + <div class="section-title">资质附件</div> + <el-button type="primary" icon="el-icon-plus" v-if="!readonly" @click="addAttachment"> + 添加附件 + </el-button> + </div> + <el-table :data="qualificationFiles" border> + <el-table-column label="序号" type="index" width="70" align="center" /> + <el-table-column label="附件名称" min-width="180"> + <template #default="{ row }"> + <el-input v-model="row.name" :disabled="readonly" maxlength="100" /> + </template> + </el-table-column> + <el-table-column label="附件地址" min-width="320"> + <template #default="{ row }"> + <el-input v-model="row.url" :disabled="readonly" maxlength="500" /> + </template> + </el-table-column> + <el-table-column label="操作" width="90" align="center" v-if="!readonly"> + <template #default="{ $index }"> + <el-button type="danger" text @click="qualificationFiles.splice($index, 1)">删除</el-button> + </template> + </el-table-column> + </el-table> + + <el-tabs v-model="activeTab" class="archive-tabs"> + <el-tab-pane label="评分表" name="scores"> + <div class="section-head"> + <span></span> + <el-button type="primary" icon="el-icon-plus" v-if="!readonly" @click="addScore"> + 读取评分量化表 + </el-button> + </div> + <el-table :data="archiveForm.scores" border> + <el-table-column label="序号" type="index" width="70" align="center" /> + <el-table-column label="评分日期" min-width="150"> + <template #default="{ row }"> + <el-date-picker + v-model="row.scoreDate" + type="date" + value-format="YYYY-MM-DD" + :disabled="readonly" + /> + </template> + </el-table-column> + <el-table-column label="自评得分" prop="selfScore" width="110" align="center" /> + <el-table-column label="复评得分" prop="reviewScore" width="110" align="center" /> + <el-table-column label="最终得分" prop="finalScore" width="110" align="center" /> + <el-table-column label="信用等级" min-width="130"> + <template #default="{ row }"> + <el-input v-model="row.creditLevel" :disabled="readonly" maxlength="30" /> + </template> + </el-table-column> + <el-table-column label="自评状态" prop="selfStatus" width="110" align="center" /> + <el-table-column label="复评状态" prop="reviewStatus" width="110" align="center" /> + <el-table-column label="操作" width="210" align="center"> + <template #default="{ row, $index }"> + <el-button type="primary" text @click="openScore(row)">评分明细</el-button> + <el-button type="success" text v-if="!readonly" @click="finishScore(row)">完成评分</el-button> + <el-button type="danger" text v-if="!readonly" @click="archiveForm.scores.splice($index, 1)"> + 删除 + </el-button> + </template> + </el-table-column> + </el-table> + </el-tab-pane> + <el-tab-pane label="联系人" name="contacts"> + <editable-table + :data="archiveForm.contacts" + :columns="contactColumns" + :readonly="readonly" + @add="archiveForm.contacts.push(emptyContact())" + /> + </el-tab-pane> + <el-tab-pane label="收款信息" name="receiptAccounts"> + <editable-table + :data="archiveForm.receiptAccounts" + :columns="receiptColumns" + :readonly="readonly" + @add="archiveForm.receiptAccounts.push(emptyReceiptAccount())" + /> + </el-tab-pane> + <el-tab-pane label="发票信息" name="invoices"> + <editable-table + :data="archiveForm.invoices" + :columns="invoiceColumns" + :readonly="readonly" + @add="archiveForm.invoices.push(emptyInvoice())" + /> + </el-tab-pane> + <el-tab-pane label="变更记录" name="changeRecords"> + <el-table :data="archiveForm.changeRecords" border> + <el-table-column label="序号" type="index" width="70" align="center" /> + <el-table-column label="变更日期" prop="changeTime" min-width="170" /> + <el-table-column label="变更内容" prop="changeContent" min-width="260" /> + <el-table-column label="变更账号" prop="changeUserName" min-width="160" /> + </el-table> + </el-tab-pane> + </el-tabs> + + <template #footer> + <el-button @click="archiveBox = false">{{ readonly ? '关闭' : '取消' }}</el-button> + <el-button type="primary" v-if="!readonly" @click="saveArchive">保存</el-button> + </template> + </el-dialog> + + <el-dialog title="评分明细" append-to-body v-model="scoreBox" width="88%" class="archive-dialog"> + <el-table :data="currentScore.details" border class="score-detail-table"> + <el-table-column label="序号" type="index" width="70" align="center" /> + <el-table-column label="评分类目" prop="categoryName" min-width="130" /> + <el-table-column label="评分项目" prop="itemName" min-width="170" /> + <el-table-column label="评分标准" prop="optionDescription" min-width="180" /> + <el-table-column label="选项" min-width="240"> + <template #default="{ row }"> + <el-select + v-model="row.selectedOption" + filterable + :disabled="readonly" + @change="scoreOptionChange(row, $event)" + > + <el-option + v-for="item in parseScoreOptions(row.optionsJson)" + :key="item.value" + :label="`${item.label}(${item.score || 0}分)`" + :value="item.value" + /> + </el-select> + </template> + </el-table-column> + <el-table-column label="自评得分" width="130" align="center"> + <template #default="{ row }"> + <el-input-number v-model="row.selfScore" :min="0" :precision="2" :disabled="readonly" /> + </template> + </el-table-column> + <el-table-column label="复评得分" width="130" align="center"> + <template #default="{ row }"> + <el-input-number v-model="row.reviewScore" :min="0" :precision="2" :disabled="readonly" /> + </template> + </el-table-column> + <el-table-column label="得分说明" prop="scoreDescription" min-width="220" /> + </el-table> + <template #footer> + <el-button @click="scoreBox = false">关闭</el-button> + <el-button type="primary" v-if="!readonly" @click="saveScoreDetail">保存明细</el-button> + </template> + </el-dialog> + </basic-container> +</template> + +<script> +import { + getList, + getDetail, + submit, + submitApproval, + approve, + reject, + changeStatus, + remove, + getScoreTemplate, +} from '@/api/vehicle/customer-archive'; +import { getList as getCustomerTypeList } from '@/api/base/customer-type'; +import { getDeptTree } from '@/api/system/dept'; +import { exportBlob } from '@/api/common'; +import { downloadXls } from '@/utils/util'; +import { getToken } from '@/utils/auth'; +import { mapGetters } from 'vuex'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +const EditableTable = { + props: { + data: { + type: Array, + default: () => [], + }, + columns: { + type: Array, + default: () => [], + }, + readonly: { + type: Boolean, + default: false, + }, + }, + emits: ['add'], + template: ` + <div> + <div class="section-head"> + <span></span> + <el-button type="primary" icon="el-icon-plus" v-if="!readonly" @click="$emit('add')">添加</el-button> + </div> + <el-table :data="data" border> + <el-table-column label="序号" type="index" width="70" align="center" /> + <el-table-column + v-for="column in columns" + :key="column.prop" + :label="column.label" + :min-width="column.minWidth || 150" + > + <template #default="{ row }"> + <el-select v-if="column.type === 'select'" v-model="row[column.prop]" :disabled="readonly"> + <el-option label="是" :value="1" /> + <el-option label="否" :value="0" /> + </el-select> + <el-input v-else v-model="row[column.prop]" :disabled="readonly" :maxlength="column.maxlength || 200" /> + </template> + </el-table-column> + <el-table-column label="操作" width="90" align="center" v-if="!readonly"> + <template #default="{ $index }"> + <el-button type="danger" text @click="data.splice($index, 1)">删除</el-button> + </template> + </el-table-column> + </el-table> + </div> + `, +}; + +export default { + components: { + EditableTable, + }, + data() { + const nonNegativeLabelMap = { + invoiceTaxRate: '开票税点', + registeredCapital: '注册资金', + maxCreditLimit: '最大资金使用额度', + applyCreditLimit: '申请总资金使用额度', + }; + const validateNonNegative = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < 0) { + callback(new Error(`${nonNegativeLabelMap[rule.field] || '数值'}不能小于0`)); + } else { + callback(); + } + }; + return { + form: {}, + query: {}, + loading: true, + data: [], + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + archiveBox: false, + scoreBox: false, + readonly: false, + activeTab: 'scores', + archiveForm: this.emptyArchive(), + currentScore: { details: [] }, + qualificationFiles: [], + deptOptions: [], + customerTypeOptions: [ + { label: '客户', value: '客户' }, + { label: '供应商', value: '供应商' }, + { label: '客户/供应商', value: '客户/供应商' }, + ], + accessTypeMap: { + temporary: '临时客商', + formal: '正式客商', + }, + approvalStatusOptions: [ + { label: '草稿', value: 'draft' }, + { label: '审核中', value: 'reviewing' }, + { label: '审核通过', value: 'approved' }, + { label: '审核不通过', value: 'rejected' }, + ], + approvalStatusMap: { + draft: { label: '草稿', type: 'info' }, + reviewing: { label: '审核中', type: 'warning' }, + approved: { label: '审核通过', type: 'success' }, + rejected: { label: '审核不通过', type: 'danger' }, + }, + contactColumns: [ + { label: '联系人姓名', prop: 'contactName', minWidth: 150, maxlength: 30 }, + { label: '联系电话', prop: 'contactPhone', minWidth: 150, maxlength: 20 }, + { label: '邮箱', prop: 'email', minWidth: 200, maxlength: 100 }, + { label: '职务', prop: 'positionName', minWidth: 140, maxlength: 50 }, + { label: '是否默认', prop: 'isDefault', type: 'select', minWidth: 110 }, + { label: '备注', prop: 'remark', minWidth: 220, maxlength: 200 }, + ], + receiptColumns: [ + { label: '收款方名称', prop: 'accountName', minWidth: 180, maxlength: 100 }, + { label: '开户行名称', prop: 'bankName', minWidth: 180, maxlength: 100 }, + { label: '银行账号', prop: 'bankAccount', minWidth: 180, maxlength: 50 }, + { label: '注册电话', prop: 'registeredPhone', minWidth: 150, maxlength: 20 }, + { label: '注册地址', prop: 'registeredAddress', minWidth: 220, maxlength: 200 }, + { label: '纳税人识别号', prop: 'taxNo', minWidth: 180, maxlength: 30 }, + { label: '是否默认', prop: 'isDefault', type: 'select', minWidth: 110 }, + ], + invoiceColumns: [ + { label: '受票方名称', prop: 'invoiceTitle', minWidth: 180, maxlength: 100 }, + { label: '纳税人识别号', prop: 'taxNo', minWidth: 180, maxlength: 30 }, + { label: '开户行名称', prop: 'bankName', minWidth: 180, maxlength: 100 }, + { label: '注册电话', prop: 'registeredPhone', minWidth: 150, maxlength: 20 }, + { label: '银行账号', prop: 'bankAccount', minWidth: 180, maxlength: 50 }, + { label: '注册地址', prop: 'registeredAddress', minWidth: 220, maxlength: 200 }, + { label: '邮箱', prop: 'email', minWidth: 200, maxlength: 100 }, + { label: '收件人姓名', prop: 'receiverName', minWidth: 150, maxlength: 30 }, + { label: '收件人电话', prop: 'receiverPhone', minWidth: 150, maxlength: 20 }, + { label: '收件人地址', prop: 'receiverAddress', minWidth: 220, maxlength: 200 }, + { label: '是否默认', prop: 'isDefault', type: 'select', minWidth: 110 }, + ], + formRules: { + fullName: [{ required: true, message: '请输入客商全称', trigger: 'blur' }], + customerNature: [{ required: true, message: '请选择客商性质', trigger: 'change' }], + unifiedCreditCode: [ + { required: true, message: '请输入统一社会信用代码', trigger: 'blur' }, + { + pattern: /^[A-Z0-9]{18}$/, + message: '统一社会信用代码必须为18位大写字母或数字', + trigger: 'blur', + }, + ], + customerType: [{ required: true, message: '请选择客商类型', trigger: 'change' }], + legalPerson: [{ required: true, message: '请输入法人/负责人', trigger: 'blur' }], + contactPhone: [ + { required: true, message: '请输入联系电话', trigger: 'blur' }, + { pattern: /^1\d{10}$/, message: '联系电话必须为11位手机号', trigger: 'blur' }, + ], + deptName: [{ required: true, message: '请选择所属组织', trigger: 'change' }], + invoiceTaxRate: [{ validator: validateNonNegative, trigger: 'blur' }], + registeredCapital: [{ validator: validateNonNegative, trigger: 'blur' }], + maxCreditLimit: [{ validator: validateNonNegative, trigger: 'blur' }], + applyCreditLimit: [{ validator: validateNonNegative, trigger: 'blur' }], + registeredAddress: [{ max: 200, message: '地址最多200个字符', trigger: 'blur' }], + businessScope: [{ max: 500, message: '经营范围最多500个字符', trigger: 'blur' }], + remark: [{ max: 500, message: '备注最多500个字符', trigger: 'blur' }], + }, + option: { + height: 'auto', + calcHeight: 32, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + indexLabel: '序号', + addBtn: false, + viewBtn: false, + delBtn: false, + editBtn: false, + selection: true, + dialogClickModal: false, + menuWidth: 420, + column: [ + { label: '客商编号', prop: 'customerCode', slot: true, search: true, minWidth: 140 }, + { label: '客商简称', prop: 'shortName', search: true, minWidth: 150 }, + { label: '客商名称', prop: 'fullName', search: true, minWidth: 220, overHidden: true }, + { label: '客商类型', prop: 'customerType', search: true, minWidth: 140 }, + { + label: '客商性质', + prop: 'customerNature', + type: 'select', + search: true, + minWidth: 120, + dicData: [ + { label: '企业', value: '企业' }, + { label: '个人', value: '个人' }, + { label: '事业单位', value: '事业单位' }, + ], + }, + { label: '统一信用代码', prop: 'unifiedCreditCode', search: true, minWidth: 190 }, + { label: '所属组织', prop: 'deptName', search: true, minWidth: 180 }, + { + label: '准入类型', + prop: 'accessType', + slot: true, + type: 'select', + search: true, + minWidth: 120, + dicData: [ + { label: '临时客商', value: 'temporary' }, + { label: '正式客商', value: 'formal' }, + ], + }, + { + label: '审批状态', + prop: 'approvalStatus', + slot: true, + type: 'select', + search: true, + minWidth: 130, + dicData: [ + { label: '草稿', value: 'draft' }, + { label: '审核中', value: 'reviewing' }, + { label: '审核通过', value: 'approved' }, + { label: '审核不通过', value: 'rejected' }, + ], + }, + { label: '当前节点', prop: 'currentNode', minWidth: 150 }, + { label: '当前处理人', prop: 'currentProcessor', minWidth: 150 }, + { + label: '审核通过时间', + prop: 'approvedTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + minWidth: 170, + }, + { + label: '状态', + prop: 'status', + slot: true, + type: 'select', + search: true, + dataType: 'number', + minWidth: 100, + dicData: [ + { label: '启用', value: 1 }, + { label: '停用', value: 2 }, + ], + }, + { + label: '创建开始时间', + prop: 'createTimeStart', + type: 'date', + format: 'YYYY-MM-DD 00:00:00', + valueFormat: 'YYYY-MM-DD 00:00:00', + search: true, + hide: true, + display: false, + }, + { + label: '创建结束时间', + prop: 'createTimeEnd', + type: 'date', + format: 'YYYY-MM-DD 23:59:59', + valueFormat: 'YYYY-MM-DD 23:59:59', + search: true, + hide: true, + display: false, + }, + ], + }, + }; + }, + created() { + this.initDeptTree(); + this.initCustomerTypes(); + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: false, + }; + }, + ids() { + let ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + dialogTitle() { + if (this.readonly) return '查看客商档案'; + return this.archiveForm.id ? '编辑客商档案' : '新增客商档案'; + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission[code], false); + }, + emptyArchive() { + return { + accessType: 'temporary', + approvalStatus: 'draft', + status: 1, + contacts: [], + receiptAccounts: [], + invoices: [], + scores: [], + changeRecords: [], + }; + }, + emptyContact() { + return { contactName: '', contactPhone: '', email: '', positionName: '', isDefault: 0, remark: '' }; + }, + emptyReceiptAccount() { + return { + accountName: '', + bankName: '', + bankAccount: '', + registeredPhone: '', + registeredAddress: '', + taxNo: '', + isDefault: 0, + }; + }, + emptyInvoice() { + return { + invoiceTitle: '', + taxNo: '', + bankName: '', + registeredPhone: '', + bankAccount: '', + registeredAddress: '', + email: '', + receiverName: '', + receiverPhone: '', + receiverAddress: '', + isDefault: 0, + }; + }, + initDeptTree() { + getDeptTree(this.userInfo.tenantId).then(res => { + this.deptOptions = this.flattenDept(res.data.data || []); + }); + }, + initCustomerTypes() { + getCustomerTypeList(1, 200, { status: 1 }).then(res => { + const records = res.data.data.records || []; + if (records.length) { + this.customerTypeOptions = records.map(item => ({ + label: item.name, + value: item.name, + })); + } + }); + }, + flattenDept(tree, level = 0) { + const result = []; + tree.forEach(item => { + result.push({ + label: `${' '.repeat(level)}${item.title || item.deptName || item.name}`, + value: item.id, + rawLabel: item.title || item.deptName || item.name, + }); + if (item.children && item.children.length) { + result.push(...this.flattenDept(item.children, level + 1)); + } + }); + return result; + }, + onDeptChange(value) { + const dept = this.deptOptions.find(item => item.value === value); + this.archiveForm.deptName = dept ? dept.rawLabel : ''; + this.$refs.archiveForm?.validateField('deptName'); + }, + parseAttachments(value) { + if (!value) return []; + if (Array.isArray(value)) return value; + try { + const list = JSON.parse(value); + return Array.isArray(list) ? list : []; + } catch (error) { + return String(value) + .split(',') + .map(item => ({ name: item.trim(), url: item.trim() })) + .filter(item => item.url); + } + }, + stringifyAttachments(list) { + const files = (list || []) + .map(item => ({ + name: String(item.name || '').trim(), + url: String(item.url || '').trim(), + })) + .filter(item => item.name || item.url); + return files.length ? JSON.stringify(files) : ''; + }, + addAttachment() { + this.qualificationFiles.push({ name: '', url: '' }); + }, + normalizeDetail(detail) { + return { + ...this.emptyArchive(), + ...detail, + contacts: detail.contacts || [], + receiptAccounts: detail.receiptAccounts || [], + invoices: detail.invoices || [], + scores: (detail.scores || []).map(this.normalizeScore), + changeRecords: detail.changeRecords || [], + }; + }, + normalizeScore(score) { + return { + scoreDate: this.$dayjs().format('YYYY-MM-DD'), + selfStatus: '未完成', + reviewStatus: '未完成', + details: [], + ...score, + details: score.details || [], + }; + }, + openArchive(row, readonly = false) { + this.readonly = readonly; + this.activeTab = 'scores'; + if (row && row.id) { + getDetail(row.id).then(res => { + this.archiveForm = this.normalizeDetail(res.data.data); + this.qualificationFiles = this.parseAttachments(this.archiveForm.qualificationAttachments); + this.archiveBox = true; + }); + return; + } + this.archiveForm = this.emptyArchive(); + this.qualificationFiles = []; + this.archiveBox = true; + }, + resetArchive() { + this.readonly = false; + this.archiveForm = this.emptyArchive(); + this.qualificationFiles = []; + this.currentScore = { details: [] }; + this.scoreBox = false; + this.$refs.archiveForm?.clearValidate(); + }, + validateFormalForApproval(archive) { + if (archive.accessType !== 'formal') return true; + if (!archive.qualificationAttachments) { + this.$message.warning('正式客商提交审核前必须维护资质附件'); + return false; + } + const hasCompletedScore = (archive.scores || []).some( + item => item.selfStatus === '已完成' || item.reviewStatus === '已完成' || item.finalScore + ); + if (!hasCompletedScore) { + this.$message.warning('正式客商提交审核前必须完成信用评分'); + return false; + } + return true; + }, + normalizeArchive() { + const archive = JSON.parse(JSON.stringify(this.archiveForm)); + archive.qualificationAttachments = this.stringifyAttachments(this.qualificationFiles); + archive.contacts = (archive.contacts || []).filter(item => item.contactName || item.contactPhone); + archive.receiptAccounts = (archive.receiptAccounts || []).filter( + item => item.accountName || item.bankAccount + ); + archive.invoices = (archive.invoices || []).filter(item => item.invoiceTitle || item.taxNo); + archive.scores = (archive.scores || []).map(score => this.calculateScore(score)); + return archive; + }, + saveArchive() { + this.$refs.archiveForm.validate(valid => { + if (!valid) { + this.$message.warning('请先完整填写必填项'); + return; + } + submit(this.normalizeArchive()).then(() => { + this.archiveBox = false; + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }); + }, + addScore() { + getScoreTemplate().then(res => { + const score = this.normalizeScore(res.data.data); + if (!score.details || !score.details.length) { + this.$message.warning('当前评分量化表未配置评分项目'); + return; + } + this.archiveForm.scores.push(score); + this.activeTab = 'scores'; + }); + }, + openScore(row) { + this.currentScore = row; + this.scoreBox = true; + }, + parseScoreOptions(value) { + if (!value) return []; + if (Array.isArray(value)) return value; + try { + const options = JSON.parse(value); + return Array.isArray(options) ? options : []; + } catch (error) { + return []; + } + }, + scoreOptionChange(detail, optionValue) { + const option = this.parseScoreOptions(detail.optionsJson).find(item => item.value === optionValue); + const score = Number(option?.score || 0); + detail.selfScore = score; + detail.reviewScore = score; + }, + calculateScore(score) { + const details = score.details || []; + const selfScore = details.reduce((sum, item) => sum + Number(item.selfScore || 0), 0); + const reviewScore = details.reduce((sum, item) => sum + Number(item.reviewScore || 0), 0); + score.selfScore = Number(selfScore.toFixed(2)); + score.reviewScore = Number(reviewScore.toFixed(2)); + score.finalScore = Number((reviewScore || selfScore).toFixed(2)); + return score; + }, + finishScore(score) { + if (!score.details || !score.details.length) { + this.$message.warning('请先读取评分量化表'); + return; + } + if (score.details.some(item => !item.selectedOption)) { + this.$message.warning('请完整选择评分明细选项'); + return; + } + this.calculateScore(score); + score.selfStatus = '已完成'; + score.reviewStatus = '已完成'; + this.$message.success('评分已完成'); + }, + saveScoreDetail() { + this.calculateScore(this.currentScore); + this.scoreBox = false; + }, + rowDel(row) { + this.$confirm('仅草稿状态客商可删除,确定删除该数据?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + if (this.selectionList.some(item => item.approvalStatus !== 'draft')) { + this.$message.warning('仅草稿状态客商可删除'); + return; + } + this.$confirm('确定删除所选草稿客商?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.selectionClear(); + }); + }, + handleSubmitApproval(row) { + getDetail(row.id).then(res => { + const archive = this.normalizeDetail(res.data.data); + archive.qualificationAttachments = archive.qualificationAttachments || ''; + if (!this.validateFormalForApproval(archive)) return; + this.$confirm('是否提交客商准入审批?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => submitApproval(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '提交成功!' }); + }); + }); + }, + handleApprove(row) { + this.$confirm('是否确认审核通过?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => approve(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '审核通过!' }); + }); + }, + handleReject(row) { + this.$confirm('是否确认审核不通过?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => reject(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleStatus(row) { + const nextStatus = row.status === 1 ? 2 : 1; + const actionName = nextStatus === 1 ? '启用' : '停用'; + this.$confirm(`是否确认${actionName}该客商?`, '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => changeStatus(row.id, nextStatus)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + .then(res => { + const pageData = res.data.data; + this.page.total = pageData.total; + this.data = pageData.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleExport() { + this.$confirm('是否导出客商档案数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-transport/customer-archive/export-customer-archive', this.buildExportParams()) + .then(res => { + downloadXls(res.data, `客商档案${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + }, +}; +</script> + +<style lang="scss" scoped> +.customer-archive-page { + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } +} + +.archive-form { + :deep(.el-input-number), + :deep(.el-select), + :deep(.el-date-editor) { + width: 100%; + } +} + +.section-title { + margin: 16px 0 12px; + font-size: 18px; + font-weight: 700; + color: #303133; +} + +.section-head { + display: flex; + align-items: center; + justify-content: space-between; + margin: 18px 0 12px; +} + +.archive-tabs { + margin-top: 18px; +} + +.score-detail-table { + width: 100%; +} + +:deep(.archive-dialog .el-dialog__body) { + max-height: 72vh; + overflow: auto; +} +</style> diff --git a/src/views/vehicle/etc-record.vue b/src/views/vehicle/etc-record.vue new file mode 100644 index 0000000..af2b818 --- /dev/null +++ b/src/views/vehicle/etc-record.vue @@ -0,0 +1,413 @@ +<template> + <basic-container class="etc-record-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + :permission="permissionList" + :before-open="beforeOpen" + v-model="form" + ref="crud" + @row-update="rowUpdate" + @row-save="rowSave" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('etc_record_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('etc_record_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('etc_record_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('etc_record_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #vehicleNo="{ row, index }"> + <el-button type="primary" link @click="$refs.crud.rowView(row, index)"> + {{ row.vehicleNo }} + </el-button> + </template> + <template #vehicleNoForm> + <el-autocomplete + v-model="form.vehicleNo" + :fetch-suggestions="fetchVehicleOptions" + clearable + placeholder="输入车牌号模糊查询选择" + value-key="value" + class="etc-record-page__input" + /> + </template> + <template #attachments="{ row }"> + <span>{{ formatAttachments(row.attachments) }}</span> + </template> + </avue-crud> + <el-dialog title="ETC记录数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter"> + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { add, getDetail, getList, remove, update } from '@/api/vehicle/etc-record'; +import { getList as getVehicleList } from '@/api/transportCapacity/transport-vehicle'; +import { getDeptTree } from '@/api/system/dept'; +import { exportBlob } from '@/api/common'; +import { downloadXls } from '@/utils/util'; +import { getToken } from '@/utils/auth'; +import { mapGetters } from 'vuex'; +import { excelOption, option } from '@/option/vehicle/etc-record'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + return { + form: {}, + query: {}, + loading: true, + excelBox: false, + excelForm: {}, + option, + excelOption, + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + data: [], + }; + }, + created() { + this.initDeptTree(); + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: this.hasPermission('etc_record_add'), + viewBtn: this.hasPermission('etc_record_view'), + delBtn: this.hasPermission('etc_record_delete'), + editBtn: this.hasPermission('etc_record_edit'), + }; + }, + ids() { + const ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission[code], false); + }, + initDeptTree() { + getDeptTree(this.userInfo.tenantId).then(res => { + const column = this.findColumn(this.option.column, 'createDept'); + column.dicData = res.data.data; + }); + }, + fetchVehicleOptions(queryString, callback) { + getVehicleList(1, 20, { plateNo: queryString }) + .then(res => { + const records = res.data.data.records || []; + callback( + records.map(item => ({ + value: item.plateNo, + })) + ); + }) + .catch(() => callback([])); + }, + formatAttachments(value) { + if (!value) return ''; + if (Array.isArray(value)) return `${value.length} 个`; + if (typeof value !== 'string') return '1 个'; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? `${attachments.length} 个` : '1 个'; + } catch (error) { + return ( + value + .split(',') + .map(item => item.trim()) + .filter(Boolean).length + ' 个' + ); + } + }, + parseAttachments(value) { + if (!value || Array.isArray(value)) return value; + if (typeof value !== 'string') return []; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? attachments : []; + } catch (error) { + return value + .split(',') + .map(item => ({ name: item.trim(), url: item.trim() })) + .filter(item => item.url); + } + }, + stringifyAttachments(value) { + if (!value || typeof value === 'string') return value; + return JSON.stringify(value); + }, + isEmpty(value) { + return value === undefined || value === null || value === ''; + }, + normalizeRow(row) { + const values = { ...row }; + values.dataSource = values.dataSource || '手工录入'; + if (values.vehicleNo) { + values.vehicleNo = values.vehicleNo.trim().toUpperCase(); + } + if (values.etcCardNo) { + values.etcCardNo = values.etcCardNo.trim(); + } + values.attachments = this.stringifyAttachments(values.attachments); + return values; + }, + validateDecimal(value, label, required = false) { + if (this.isEmpty(value)) { + if (required) { + this.$message.warning(`请输入${label}`); + return false; + } + return true; + } + if (Number(value) < 0) { + this.$message.warning(`${label}不能小于 0`); + return false; + } + if (!/^\d+(\.\d{1,2})?$/.test(String(value))) { + this.$message.warning(`${label}最多保留 2 位小数`); + return false; + } + return true; + }, + validateRow(row) { + if (row.entryTime && row.exitTime && new Date(row.exitTime) <= new Date(row.entryTime)) { + this.$message.warning('出口时间应大于入口时间'); + return false; + } + if (!this.validateDecimal(row.transactionAmount, '交易金额', true)) return false; + if (row.remark && row.remark.length > 200) { + this.$message.warning('备注不能超过 200 字'); + return false; + } + return true; + }, + rowSave(row, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + add(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + update(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + beforeOpen(done, type) { + if (type === 'add') { + this.form = { dataSource: '手工录入' }; + } + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + const detail = res.data.data; + detail.attachments = this.parseAttachments(detail.attachments); + this.form = detail; + }); + } + done(); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出ETC记录数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-transport/etc-record/export-etc-record', this.buildExportParams()) + .then(res => { + downloadXls(res.data, `ETC记录${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob(`/blade-transport/etc-record/export-template?${this.website.tokenHeader}=${getToken()}`).then(res => { + downloadXls(res.data, 'ETC记录模板.xlsx'); + }); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.etc-record-page { + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } + + &__input { + width: 100%; + } +} +</style> diff --git a/src/views/vehicle/insurance-record.vue b/src/views/vehicle/insurance-record.vue new file mode 100644 index 0000000..7a58726 --- /dev/null +++ b/src/views/vehicle/insurance-record.vue @@ -0,0 +1,449 @@ +<template> + <basic-container class="insurance-record-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + :permission="permissionList" + :before-open="beforeOpen" + v-model="form" + ref="crud" + @row-update="rowUpdate" + @row-save="rowSave" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('insurance_record_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('insurance_record_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('insurance_record_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('insurance_record_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #vehicleNo="{ row, index }"> + <el-button type="primary" link @click="$refs.crud.rowView(row, index)"> + {{ row.vehicleNo }} + </el-button> + </template> + <template #vehicleNoForm> + <el-autocomplete + v-model="form.vehicleNo" + :fetch-suggestions="fetchVehicleOptions" + clearable + placeholder="输入车牌号/船号模糊查询选择" + value-key="value" + class="insurance-record-page__vehicle-input" + /> + </template> + <template #policyFileForm> + <div class="insurance-record-page__upload"> + <div class="insurance-record-page__upload-icon">OCR</div> + <div class="insurance-record-page__upload-text"> + <strong>上传图片,自动识别填写</strong> + <span>支持JPG、PNG、PDF上传</span> + </div> + <el-upload + :action="recognizeUrl" + :data="recognizeData" + :headers="uploadHeaders" + :show-file-list="false" + :on-success="handleRecognizeSuccess" + :on-error="handleRecognizeError" + accept=".jpg,.jpeg,.png,.pdf" + v-if="hasPermission('insurance_record_ocr')" + > + <el-button type="primary" plain>上传文件</el-button> + </el-upload> + </div> + </template> + </avue-crud> + <el-dialog title="保险记录数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter"> + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { add, getDetail, getList, remove, update } from '@/api/vehicle/insurance-record'; +import { getList as getVehicleList } from '@/api/transportCapacity/transport-vehicle'; +import { getList as getShipList } from '@/api/transportCapacity/transport-ship'; +import { getDeptTree } from '@/api/system/dept'; +import { exportBlob } from '@/api/common'; +import { downloadXls } from '@/utils/util'; +import { getToken } from '@/utils/auth'; +import { mapGetters } from 'vuex'; +import { excelOption, option } from '@/option/vehicle/insurance-record'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + return { + form: {}, + query: {}, + loading: true, + excelBox: false, + excelForm: {}, + option, + excelOption, + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + data: [], + }; + }, + created() { + this.initDeptTree(); + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: this.hasPermission('insurance_record_add'), + viewBtn: this.hasPermission('insurance_record_view'), + delBtn: this.hasPermission('insurance_record_delete'), + editBtn: this.hasPermission('insurance_record_edit'), + }; + }, + ids() { + const ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + recognizeUrl() { + return '/blade-transport/insurance-record/recognize'; + }, + recognizeData() { + return { + vehicleType: this.form.vehicleType || '车辆', + ocrTemplate: this.form.ocrTemplate, + }; + }, + uploadHeaders() { + return { + [this.website.tokenHeader]: getToken(), + }; + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission[code], false); + }, + initDeptTree() { + getDeptTree(this.userInfo.tenantId).then(res => { + const column = this.findColumn(this.option.column, 'createDept'); + column.dicData = res.data.data; + }); + }, + fetchVehicleOptions(queryString, callback) { + const vehicleType = this.form.vehicleType || '车辆'; + const request = vehicleType === '船舶' ? getShipList : getVehicleList; + const params = + vehicleType === '船舶' + ? { shipIdentifierNo: queryString } + : { plateNo: queryString }; + request(1, 20, params) + .then(res => { + const records = res.data.data.records || []; + callback( + records.map(item => ({ + value: vehicleType === '船舶' ? item.shipIdentifierNo || item.shipName : item.plateNo, + })) + ); + }) + .catch(() => callback([])); + }, + normalizeRow(row) { + const values = { ...row }; + if (values.vehicleNo) { + values.vehicleNo = values.vehicleNo.trim().toUpperCase(); + } + if (values.policyNo) { + values.policyNo = values.policyNo.trim(); + } + return values; + }, + validateRow(row) { + if (row.startDate && row.endDate && row.endDate < row.startDate) { + this.$message.warning('结束日期不能早于开始日期'); + return false; + } + if (Number(row.insuredAmount) < 0 || Number(row.premium) < 0) { + this.$message.warning('保额、保费不能小于 0'); + return false; + } + if (row.remark && row.remark.length > 200) { + this.$message.warning('备注最多 200 个字'); + return false; + } + return true; + }, + rowSave(row, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + add(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + update(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + beforeOpen(done, type) { + if (type === 'add') { + this.form.vehicleType = '车辆'; + this.form.ocrTemplate = '紫金-机动车交强险'; + } + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + this.form = res.data.data; + }); + } + done(); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出保险记录数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-transport/insurance-record/export-insurance-record', this.buildExportParams()) + .then(res => { + downloadXls(res.data, `保险记录${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob( + `/blade-transport/insurance-record/export-template?${this.website.tokenHeader}=${getToken()}` + ).then(res => { + downloadXls(res.data, '保险记录模板.xlsx'); + }); + }, + handleRecognizeSuccess(res) { + if (res && res.success && res.data) { + this.form = { + ...this.form, + ...res.data, + vehicleType: res.data.vehicleType || this.form.vehicleType || '车辆', + }; + this.$message.success('识别完成'); + } else { + this.$message.warning((res && res.msg) || '识别失败,请手动填写'); + } + }, + handleRecognizeError() { + this.$message.warning('识别失败,请手动填写'); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.insurance-record-page { + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } + + &__vehicle-input { + width: 100%; + } + + &__upload { + display: flex; + align-items: center; + gap: 18px; + min-height: 88px; + padding: 18px 24px; + border: 1px dashed #8c8c8c; + border-radius: 6px; + } + + &__upload-icon { + display: flex; + align-items: center; + justify-content: center; + width: 44px; + height: 44px; + color: #606266; + border: 2px solid #8c8c8c; + border-radius: 6px; + font-weight: 600; + } + + &__upload-text { + display: flex; + flex: 1; + flex-direction: column; + gap: 6px; + color: #303133; + + span { + color: #606266; + } + } +} +</style> diff --git a/src/views/vehicle/maintenance-plan.vue b/src/views/vehicle/maintenance-plan.vue new file mode 100644 index 0000000..f25cc82 --- /dev/null +++ b/src/views/vehicle/maintenance-plan.vue @@ -0,0 +1,602 @@ +<template> + <basic-container class="maintenance-plan-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + :permission="permissionList" + :before-open="beforeOpen" + v-model="form" + ref="crud" + @row-update="rowUpdate" + @row-save="rowSave" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('maintenance_plan_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('maintenance_plan_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('maintenance_plan_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('maintenance_plan_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #vehicleNo="{ row, index }"> + <el-button type="primary" link @click="$refs.crud.rowView(row, index)"> + {{ row.vehicleNo }} + </el-button> + </template> + <template #mileage="{ row }"> + <span>{{ formatMileage(row.mileage, row.mileageUnit) }}</span> + </template> + <template #nextMaintenanceMileage="{ row }"> + <span>{{ formatMileage(row.nextMaintenanceMileage, row.mileageUnit) }}</span> + </template> + <template #attachments="{ row }"> + <span>{{ formatAttachments(row.attachments) }}</span> + </template> + </avue-crud> + <el-dialog title="保养记录数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter"> + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { getList, getDetail, add, update, remove } from '@/api/vehicle/maintenance-plan'; +import { getDeptTree } from '@/api/system/dept'; +import { exportBlob } from '@/api/common'; +import { downloadXls } from '@/utils/util'; +import { formatUpdateUserName } from '@/utils/audit'; +import { getToken } from '@/utils/auth'; +import { mapGetters } from 'vuex'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + const validateNonNegative = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < 0) { + callback(new Error('不能小于 0')); + } else { + callback(); + } + }; + return { + form: {}, + query: {}, + loading: true, + excelBox: false, + excelForm: {}, + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + option: { + height: 'auto', + calcHeight: 32, + dialogWidth: 980, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + selection: true, + dialogClickModal: false, + menuWidth: 220, + column: [ + { + label: '车船类型', + prop: 'vehicleType', + type: 'radio', + minWidth: 110, + dicData: [ + { label: '车辆', value: '车辆' }, + { label: '船舶', value: '船舶' }, + ], + value: '车辆', + search: true, + rules: [{ required: true, message: '请选择车船类型', trigger: 'change' }], + }, + { + label: '车牌号/船号', + prop: 'vehicleNo', + slot: true, + search: true, + minWidth: 130, + rules: [ + { required: true, message: '请输入车牌号/船号', trigger: 'blur' }, + { max: 30, message: '最多 30 个字符', trigger: 'blur' }, + ], + }, + { + label: '保养人', + prop: 'maintainer', + rules: [{ max: 20, message: '最多 20 个字符', trigger: 'blur' }], + }, + { + label: '保养时间', + prop: 'maintenanceTime', + type: 'date', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + minWidth: 170, + rules: [{ required: true, message: '请选择保养时间', trigger: 'click' }], + }, + { + label: '里程/航程数', + prop: 'mileage', + type: 'number', + precision: 2, + minWidth: 130, + slot: true, + rules: [{ validator: validateNonNegative, trigger: 'blur' }], + }, + { + label: '里程单位', + prop: 'mileageUnit', + type: 'select', + dicData: [ + { label: '公里', value: '公里' }, + { label: '海里', value: '海里' }, + ], + value: '公里', + hide: true, + }, + { + label: '保养项目', + prop: 'maintenanceItem', + minWidth: 160, + rules: [{ max: 100, message: '最多 100 个字符', trigger: 'blur' }], + }, + { + label: '费用', + prop: 'cost', + type: 'number', + precision: 2, + rules: [ + { required: true, message: '请输入费用', trigger: 'blur' }, + { validator: validateNonNegative, trigger: 'blur' }, + ], + }, + { + label: '店名', + prop: 'storeName', + rules: [{ max: 50, message: '最多 50 个字符', trigger: 'blur' }], + }, + { + label: '联系电话', + prop: 'contactPhone', + minWidth: 150, + rules: [{ max: 20, message: '最多 20 个字符', trigger: 'blur' }], + }, + { + label: '地址', + prop: 'address', + minWidth: 180, + overHidden: true, + span: 24, + rules: [{ max: 100, message: '最多 100 个字符', trigger: 'blur' }], + }, + { + label: '下次保养时间', + prop: 'nextMaintenanceTime', + type: 'date', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + minWidth: 170, + }, + { + label: '下次保养里程/航程', + prop: 'nextMaintenanceMileage', + type: 'number', + precision: 2, + minWidth: 170, + slot: true, + rules: [{ validator: validateNonNegative, trigger: 'blur' }], + }, + { + label: '附件', + prop: 'attachments', + type: 'upload', + listType: 'text', + multiple: true, + accept: '.jpg,.jpeg,.png,.pdf', + propsHttp: { + res: 'data', + url: 'link', + name: 'name', + }, + action: '/blade-resource/oss/endpoint/put-file', + span: 24, + minWidth: 100, + slot: true, + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 4, + span: 24, + hide: true, + rules: [{ max: 500, message: '最多 500 个字符', trigger: 'blur' }], + }, + { + label: '创建时间', + prop: 'createTime', + type: 'date', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + viewDisplay: false, + display: false, + minWidth: 170, + }, + { + label: '创建开始时间', + prop: 'createTimeStart', + type: 'date', + format: 'YYYY-MM-DD 00:00:00', + valueFormat: 'YYYY-MM-DD 00:00:00', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建结束时间', + prop: 'createTimeEnd', + type: 'date', + format: 'YYYY-MM-DD 23:59:59', + valueFormat: 'YYYY-MM-DD 23:59:59', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '组织', + prop: 'createDept', + type: 'tree', + dicData: [], + props: { + label: 'title', + value: 'id', + }, + checkStrictly: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '更新人', + prop: 'updateUserName', + formatter: formatUpdateUserName, + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 180, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 170, + }, + ], + }, + excelOption: { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + action: '/blade-transport/maintenance-plan/import-maintenance-plan', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], + }, + data: [], + }; + }, + created() { + this.initDeptTree(); + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: this.hasPermission('maintenance_plan_add'), + viewBtn: this.hasPermission('maintenance_plan_view'), + delBtn: this.hasPermission('maintenance_plan_delete'), + editBtn: this.hasPermission('maintenance_plan_edit'), + }; + }, + ids() { + let ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission[code], false); + }, + formatMileage(value, unit) { + if (value === undefined || value === null || value === '') return ''; + return `${Math.max(Number(value), 0)} ${unit || '公里'}`; + }, + formatAttachments(value) { + if (!value) return ''; + if (Array.isArray(value)) return `${value.length} 个`; + if (typeof value !== 'string') return '1 个'; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? `${attachments.length} 个` : '1 个'; + } catch (error) { + return value + .split(',') + .map(item => item.trim()) + .filter(Boolean).length + ' 个'; + } + }, + parseAttachments(value) { + if (!value || Array.isArray(value)) return value; + if (typeof value !== 'string') return []; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? attachments : []; + } catch (error) { + return value + .split(',') + .map(item => ({ name: item.trim(), url: item.trim() })) + .filter(item => item.url); + } + }, + stringifyAttachments(value) { + if (!value || typeof value === 'string') return value; + return JSON.stringify(value); + }, + initDeptTree() { + getDeptTree(this.userInfo.tenantId).then(res => { + const column = this.findColumn(this.option.column, 'createDept'); + column.dicData = res.data.data; + }); + }, + normalizeRow(row) { + const values = { ...row }; + if (!values.mileageUnit) { + values.mileageUnit = values.vehicleType === '船舶' ? '海里' : '公里'; + } + values.attachments = this.stringifyAttachments(values.attachments); + return values; + }, + rowSave(row, done, loading) { + add(this.normalizeRow(row)).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + update(this.normalizeRow(row)).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + beforeOpen(done, type) { + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + const detail = res.data.data; + detail.attachments = this.parseAttachments(detail.attachments); + this.form = detail; + }); + } + done(); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出保养记录数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-transport/maintenance-plan/export-maintenance-plan', this.buildExportParams()) + .then(res => { + downloadXls(res.data, `保养记录${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob( + `/blade-transport/maintenance-plan/export-template?${this.website.tokenHeader}=${getToken()}` + ).then(res => { + downloadXls(res.data, '保养记录模板.xlsx'); + }); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.maintenance-plan-page { + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } +} +</style> diff --git a/src/views/vehicle/maintenance-record.vue b/src/views/vehicle/maintenance-record.vue new file mode 100644 index 0000000..7424864 --- /dev/null +++ b/src/views/vehicle/maintenance-record.vue @@ -0,0 +1,598 @@ +<template> + <basic-container class="maintenance-record-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + :permission="permissionList" + :before-open="beforeOpen" + v-model="form" + ref="crud" + @row-update="rowUpdate" + @row-save="rowSave" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('maintenance_record_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('maintenance_record_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('maintenance_record_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('maintenance_record_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #vehicleNo="{ row, index }"> + <el-button type="primary" link @click="$refs.crud.rowView(row, index)"> + {{ row.vehicleNo }} + </el-button> + </template> + <template #mileage="{ row }"> + <span>{{ formatMileage(row.mileage, row.mileageUnit) }}</span> + </template> + <template #attachments="{ row }"> + <span>{{ formatAttachments(row.attachments) }}</span> + </template> + </avue-crud> + <el-dialog title="维修记录数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter"> + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { getList, getDetail, add, update, remove } from '@/api/vehicle/maintenance-record'; +import { getDeptTree } from '@/api/system/dept'; +import { exportBlob } from '@/api/common'; +import { downloadXls } from '@/utils/util'; +import { formatUpdateUserName } from '@/utils/audit'; +import { getToken } from '@/utils/auth'; +import { mapGetters } from 'vuex'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + const validateNonNegative = (rule, value, callback) => { + if (value === undefined || value === null || value === '') { + callback(); + } else if (Number(value) < 0) { + callback(new Error('不能小于 0')); + } else { + callback(); + } + }; + return { + form: {}, + query: {}, + loading: true, + excelBox: false, + excelForm: {}, + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + option: { + height: 'auto', + calcHeight: 32, + dialogWidth: 980, + tip: false, + searchShow: true, + searchMenuSpan: 6, + border: true, + index: true, + viewBtn: true, + selection: true, + dialogClickModal: false, + menuWidth: 220, + column: [ + { + label: '车船类型', + prop: 'vehicleType', + type: 'radio', + minWidth: 110, + dicData: [ + { label: '车辆', value: '车辆' }, + { label: '船舶', value: '船舶' }, + ], + value: '车辆', + search: true, + rules: [{ required: true, message: '请选择车船类型', trigger: 'change' }], + }, + { + label: '车牌号/船号', + prop: 'vehicleNo', + slot: true, + search: true, + minWidth: 130, + rules: [ + { required: true, message: '请输入车牌号/船号', trigger: 'blur' }, + { max: 30, message: '最多 30 个字符', trigger: 'blur' }, + ], + }, + { + label: '维修人', + prop: 'maintainer', + rules: [{ max: 20, message: '最多 20 个字符', trigger: 'blur' }], + }, + { + label: '维修时间', + prop: 'maintenanceTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + minWidth: 170, + rules: [{ required: true, message: '请选择维修时间', trigger: 'click' }], + }, + { + label: '维修位置', + prop: 'location', + minWidth: 160, + rules: [{ max: 100, message: '最多 100 个字符', trigger: 'blur' }], + }, + { + label: '更换零件', + prop: 'replacedPart', + minWidth: 160, + overHidden: true, + rules: [{ max: 200, message: '最多 200 个字符', trigger: 'blur' }], + }, + { + label: '费用', + prop: 'cost', + type: 'number', + precision: 2, + rules: [ + { required: true, message: '请输入费用', trigger: 'blur' }, + { validator: validateNonNegative, trigger: 'blur' }, + ], + }, + { + label: '维修单位', + prop: 'company', + minWidth: 180, + rules: [{ max: 50, message: '最多 50 个字符', trigger: 'blur' }], + }, + { + label: '联系方式', + prop: 'contact', + minWidth: 150, + rules: [{ max: 20, message: '最多 20 个字符', trigger: 'blur' }], + }, + { + label: '出厂时间', + prop: 'factoryTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + minWidth: 170, + }, + { + label: '里程/航程数', + prop: 'mileage', + type: 'number', + precision: 2, + minWidth: 130, + slot: true, + rules: [{ validator: validateNonNegative, trigger: 'blur' }], + }, + { + label: '里程单位', + prop: 'mileageUnit', + type: 'select', + dicData: [ + { label: '公里', value: '公里' }, + { label: '海里', value: '海里' }, + ], + value: '公里', + hide: true, + }, + { + label: '地址', + prop: 'address', + minWidth: 180, + overHidden: true, + span: 24, + rules: [{ max: 100, message: '最多 100 个字符', trigger: 'blur' }], + }, + { + label: '附件', + prop: 'attachments', + type: 'upload', + listType: 'text', + multiple: true, + accept: '.jpg,.jpeg,.png,.pdf', + propsHttp: { + res: 'data', + url: 'link', + name: 'name', + }, + action: '/blade-resource/oss/endpoint/put-file', + span: 24, + minWidth: 100, + slot: true, + }, + { + label: '备注', + prop: 'remark', + type: 'textarea', + minRows: 4, + span: 24, + hide: true, + rules: [{ max: 500, message: '最多 500 个字符', trigger: 'blur' }], + }, + { + label: '创建时间', + prop: 'createTime', + type: 'date', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + viewDisplay: false, + display: false, + minWidth: 170, + }, + { + label: '创建开始时间', + prop: 'createTimeStart', + type: 'date', + format: 'YYYY-MM-DD 00:00:00', + valueFormat: 'YYYY-MM-DD 00:00:00', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '创建结束时间', + prop: 'createTimeEnd', + type: 'date', + format: 'YYYY-MM-DD 23:59:59', + valueFormat: 'YYYY-MM-DD 23:59:59', + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '组织', + prop: 'createDept', + type: 'tree', + dicData: [], + props: { + label: 'title', + value: 'id', + }, + checkStrictly: true, + search: true, + hide: true, + addDisplay: false, + editDisplay: false, + viewDisplay: false, + }, + { + label: '更新人', + prop: 'updateUserName', + formatter: formatUpdateUserName, + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 180, + }, + { + label: '更新时间', + prop: 'updateTime', + type: 'datetime', + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'YYYY-MM-DD HH:mm:ss', + addDisplay: false, + editDisplay: false, + display: false, + minWidth: 170, + }, + ], + }, + excelOption: { + submitBtn: false, + emptyBtn: false, + column: [ + { + label: '模板上传', + prop: 'excelFile', + type: 'upload', + drag: true, + loadText: '模板上传中,请稍等', + span: 24, + propsHttp: { + res: 'data', + }, + tip: '请上传 .xls,.xlsx 标准格式文件', + action: '/blade-transport/maintenance-record/import-maintenance-record', + }, + { + label: '模板下载', + prop: 'excelTemplate', + formslot: true, + span: 24, + }, + ], + }, + data: [], + }; + }, + created() { + this.initDeptTree(); + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: this.hasPermission('maintenance_record_add'), + viewBtn: this.hasPermission('maintenance_record_view'), + delBtn: this.hasPermission('maintenance_record_delete'), + editBtn: this.hasPermission('maintenance_record_edit'), + }; + }, + ids() { + let ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission[code], false); + }, + formatMileage(value, unit) { + if (value === undefined || value === null || value === '') return ''; + return `${Math.max(Number(value), 0)} ${unit || '公里'}`; + }, + formatAttachments(value) { + if (!value) return ''; + if (Array.isArray(value)) return `${value.length} 个`; + if (typeof value !== 'string') return '1 个'; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? `${attachments.length} 个` : '1 个'; + } catch (error) { + return value + .split(',') + .map(item => item.trim()) + .filter(Boolean).length + ' 个'; + } + }, + parseAttachments(value) { + if (!value || Array.isArray(value)) return value; + if (typeof value !== 'string') return []; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? attachments : []; + } catch (error) { + return value + .split(',') + .map(item => ({ name: item.trim(), url: item.trim() })) + .filter(item => item.url); + } + }, + stringifyAttachments(value) { + if (!value || typeof value === 'string') return value; + return JSON.stringify(value); + }, + initDeptTree() { + getDeptTree(this.userInfo.tenantId).then(res => { + const column = this.findColumn(this.option.column, 'createDept'); + column.dicData = res.data.data; + }); + }, + normalizeRow(row) { + const values = { ...row }; + if (!values.mileageUnit) { + values.mileageUnit = values.vehicleType === '船舶' ? '海里' : '公里'; + } + values.attachments = this.stringifyAttachments(values.attachments); + return values; + }, + rowSave(row, done, loading) { + add(this.normalizeRow(row)).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + update(this.normalizeRow(row)).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + beforeOpen(done, type) { + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + const detail = res.data.data; + detail.attachments = this.parseAttachments(detail.attachments); + this.form = detail; + }); + } + done(); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出维修记录数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-transport/maintenance-record/export-maintenance-record', this.buildExportParams()) + .then(res => { + downloadXls(res.data, `维修记录${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob( + `/blade-transport/maintenance-record/export-template?${this.website.tokenHeader}=${getToken()}` + ).then(res => { + downloadXls(res.data, '维修记录模板.xlsx'); + }); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.maintenance-record-page { + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } +} +</style> diff --git a/src/views/vehicle/mileage-record.vue b/src/views/vehicle/mileage-record.vue new file mode 100644 index 0000000..d2c114f --- /dev/null +++ b/src/views/vehicle/mileage-record.vue @@ -0,0 +1,431 @@ +<template> + <basic-container class="mileage-record-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + :permission="permissionList" + :before-open="beforeOpen" + v-model="form" + ref="crud" + @row-update="rowUpdate" + @row-save="rowSave" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('mileage_record_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('mileage_record_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('mileage_record_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('mileage_record_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #vehicleNo="{ row, index }"> + <el-button type="primary" link @click="$refs.crud.rowView(row, index)"> + {{ row.vehicleNo }} + </el-button> + </template> + <template #vehicleNoForm> + <el-autocomplete + v-model="form.vehicleNo" + :fetch-suggestions="fetchVehicleOptions" + :disabled="Boolean(form.id)" + clearable + placeholder="输入车牌号模糊查询选择" + value-key="value" + class="mileage-record-page__input" + /> + </template> + <template #attachments="{ row }"> + <span>{{ formatAttachments(row.attachments) }}</span> + </template> + </avue-crud> + <el-dialog title="里程记录数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter"> + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { add, getDetail, getList, remove, update } from '@/api/vehicle/mileage-record'; +import { getList as getVehicleList } from '@/api/transportCapacity/transport-vehicle'; +import { getDeptTree } from '@/api/system/dept'; +import { exportBlob } from '@/api/common'; +import { downloadXls } from '@/utils/util'; +import { getToken } from '@/utils/auth'; +import { mapGetters } from 'vuex'; +import { excelOption, option } from '@/option/vehicle/mileage-record'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + return { + form: {}, + query: {}, + loading: true, + excelBox: false, + excelForm: {}, + option, + excelOption, + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + data: [], + }; + }, + created() { + this.initDeptTree(); + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: this.hasPermission('mileage_record_add'), + viewBtn: this.hasPermission('mileage_record_view'), + delBtn: this.hasPermission('mileage_record_delete'), + editBtn: this.hasPermission('mileage_record_edit'), + }; + }, + ids() { + const ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission[code], false); + }, + initDeptTree() { + getDeptTree(this.userInfo.tenantId).then(res => { + const column = this.findColumn(this.option.column, 'createDept'); + column.dicData = res.data.data; + }); + }, + fetchVehicleOptions(queryString, callback) { + getVehicleList(1, 20, { plateNo: queryString }) + .then(res => { + const records = res.data.data.records || []; + callback(records.map(item => ({ value: item.plateNo }))); + }) + .catch(() => callback([])); + }, + formatAttachments(value) { + if (!value) return ''; + if (Array.isArray(value)) return `${value.length} 个`; + if (typeof value !== 'string') return '1 个'; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? `${attachments.length} 个` : '1 个'; + } catch (error) { + return ( + value + .split(',') + .map(item => item.trim()) + .filter(Boolean).length + ' 个' + ); + } + }, + parseAttachments(value) { + if (!value || Array.isArray(value)) return value; + if (typeof value !== 'string') return []; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? attachments : []; + } catch (error) { + return value + .split(',') + .map(item => ({ name: item.trim(), url: item.trim() })) + .filter(item => item.url); + } + }, + stringifyAttachments(value) { + if (!value || typeof value === 'string') return value; + return JSON.stringify(value); + }, + isEmpty(value) { + return value === undefined || value === null || value === ''; + }, + toNumber(value) { + return this.isEmpty(value) ? null : Number(value); + }, + toMoney(value) { + return Math.round(Number(value) * 100) / 100; + }, + normalizeRow(row) { + const values = { ...row }; + if (values.vehicleNo) { + values.vehicleNo = values.vehicleNo.trim().toUpperCase(); + } + const previousMonthMileage = this.toNumber(values.previousMonthMileage); + const currentMonthMileage = this.toNumber(values.currentMonthMileage); + if (this.isEmpty(values.monthlyMileage) && previousMonthMileage !== null && currentMonthMileage !== null) { + values.monthlyMileage = this.toMoney(currentMonthMileage - previousMonthMileage); + } + values.attachments = this.stringifyAttachments(values.attachments); + return values; + }, + validateMileage(value, label) { + if (this.isEmpty(value)) { + return true; + } + if (Number(value) < 0) { + this.$message.warning(`${label}不能小于 0`); + return false; + } + if (!/^\d+(\.\d{1,2})?$/.test(String(value))) { + this.$message.warning(`${label}最多保留 2 位小数`); + return false; + } + return true; + }, + validateRow(row) { + const mileageFields = [ + ['previousMonthMileage', '上月统计里程'], + ['currentMonthMileage', '本月统计里程'], + ['monthlyMileage', '本月行驶里程'], + ['totalMileage', '累计行驶里程'], + ]; + if (!mileageFields.every(([prop, label]) => this.validateMileage(row[prop], label))) { + return false; + } + const previousMonthMileage = this.toNumber(row.previousMonthMileage); + const currentMonthMileage = this.toNumber(row.currentMonthMileage); + const monthlyMileage = this.toNumber(row.monthlyMileage); + const totalMileage = this.toNumber(row.totalMileage); + if ( + previousMonthMileage !== null && + currentMonthMileage !== null && + monthlyMileage !== null && + this.toMoney(currentMonthMileage - previousMonthMileage) !== this.toMoney(monthlyMileage) + ) { + this.$message.warning('本月行驶里程应等于本月统计里程减去上月统计里程'); + return false; + } + if (totalMileage !== null && currentMonthMileage !== null && totalMileage < currentMonthMileage) { + this.$message.warning('累计行驶里程应大于等于本月统计里程'); + return false; + } + return true; + }, + rowSave(row, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + add(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + update(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + beforeOpen(done, type) { + const vehicleNoColumn = this.findColumn(this.option.column, 'vehicleNo'); + vehicleNoColumn.disabled = type !== 'add'; + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + const detail = res.data.data; + detail.attachments = this.parseAttachments(detail.attachments); + this.form = detail; + }); + } + done(); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出里程记录数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-transport/mileage-record/export-mileage-record', this.buildExportParams()) + .then(res => { + downloadXls(res.data, `里程记录${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob(`/blade-transport/mileage-record/export-template?${this.website.tokenHeader}=${getToken()}`).then( + res => { + downloadXls(res.data, '里程记录模板.xlsx'); + } + ); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.mileage-record-page { + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } + + &__input { + width: 100%; + } +} +</style> diff --git a/src/views/vehicle/oil-electric-record.vue b/src/views/vehicle/oil-electric-record.vue new file mode 100644 index 0000000..8cface0 --- /dev/null +++ b/src/views/vehicle/oil-electric-record.vue @@ -0,0 +1,450 @@ +<template> + <basic-container class="oil-electric-record-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + :permission="permissionList" + :before-open="beforeOpen" + v-model="form" + ref="crud" + @row-update="rowUpdate" + @row-save="rowSave" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('oil_electric_record_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('oil_electric_record_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('oil_electric_record_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('oil_electric_record_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #vehicleNo="{ row, index }"> + <el-button type="primary" link @click="$refs.crud.rowView(row, index)"> + {{ row.vehicleNo }} + </el-button> + </template> + <template #vehicleNoForm> + <el-autocomplete + v-model="form.vehicleNo" + :fetch-suggestions="fetchVehicleOptions" + clearable + placeholder="输入车牌号/船号查询选择" + value-key="value" + class="oil-electric-record-page__input" + /> + </template> + <template #attachments="{ row }"> + <span>{{ formatAttachments(row.attachments) }}</span> + </template> + </avue-crud> + <el-dialog title="油电记录数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter"> + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { add, getDetail, getList, remove, update } from '@/api/vehicle/oil-electric-record'; +import { getList as getVehicleList } from '@/api/transportCapacity/transport-vehicle'; +import { getList as getShipList } from '@/api/transportCapacity/transport-ship'; +import { getDeptTree } from '@/api/system/dept'; +import { exportBlob } from '@/api/common'; +import { downloadXls } from '@/utils/util'; +import { getToken } from '@/utils/auth'; +import { mapGetters } from 'vuex'; +import { excelOption, option } from '@/option/vehicle/oil-electric-record'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + return { + form: {}, + query: {}, + loading: true, + excelBox: false, + excelForm: {}, + option, + excelOption, + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + data: [], + }; + }, + created() { + this.initDeptTree(); + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: this.hasPermission('oil_electric_record_add'), + viewBtn: this.hasPermission('oil_electric_record_view'), + delBtn: this.hasPermission('oil_electric_record_delete'), + editBtn: this.hasPermission('oil_electric_record_edit'), + }; + }, + ids() { + const ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + watch: { + 'form.vehicleType': { + handler() { + this.updateVehicleType(); + }, + immediate: true, + }, + 'form.feeType': { + handler(value) { + this.updateFeeType(value || '加油'); + }, + immediate: true, + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission[code], false); + }, + initDeptTree() { + getDeptTree(this.userInfo.tenantId).then(res => { + const column = this.findColumn(this.option.column, 'createDept'); + column.dicData = res.data.data; + }); + }, + updateVehicleType() { + if (!this.form.id && this.form.vehicleNo) { + this.form.vehicleNo = ''; + } + }, + updateFeeType(feeType) { + const oilProductColumn = this.findColumn(this.option.column, 'oilProduct'); + const unitPriceColumn = this.findColumn(this.option.column, 'unitPrice'); + oilProductColumn.display = feeType !== '充电'; + unitPriceColumn.append = feeType === '充电' ? '元/度' : '元/升'; + if (feeType === '充电') { + this.form.oilProduct = undefined; + } + }, + fetchVehicleOptions(queryString, callback) { + const vehicleType = this.form.vehicleType || '车辆'; + const request = vehicleType === '船舶' ? getShipList : getVehicleList; + const params = + vehicleType === '船舶' ? { shipIdentifierNo: queryString } : { plateNo: queryString }; + request(1, 20, params) + .then(res => { + const records = res.data.data.records || []; + callback( + records.map(item => ({ + value: vehicleType === '船舶' ? item.shipIdentifierNo || item.shipName : item.plateNo, + })) + ); + }) + .catch(() => callback([])); + }, + formatAttachments(value) { + if (!value) return ''; + if (Array.isArray(value)) return `${value.length} 个`; + if (typeof value !== 'string') return '1 个'; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? `${attachments.length} 个` : '1 个'; + } catch (error) { + return ( + value + .split(',') + .map(item => item.trim()) + .filter(Boolean).length + ' 个' + ); + } + }, + parseAttachments(value) { + if (!value || Array.isArray(value)) return value; + if (typeof value !== 'string') return []; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? attachments : []; + } catch (error) { + return value + .split(',') + .map(item => ({ name: item.trim(), url: item.trim() })) + .filter(item => item.url); + } + }, + stringifyAttachments(value) { + if (!value || typeof value === 'string') return value; + return JSON.stringify(value); + }, + isEmpty(value) { + return value === undefined || value === null || value === ''; + }, + normalizeRow(row) { + const values = { ...row }; + values.vehicleType = values.vehicleType || '车辆'; + values.dataSource = values.dataSource || '手工录入'; + if (values.vehicleNo) { + values.vehicleNo = values.vehicleType === '船舶' ? values.vehicleNo.trim() : values.vehicleNo.trim().toUpperCase(); + } + if (values.feeType === '充电') { + values.oilProduct = undefined; + } + values.attachments = this.stringifyAttachments(values.attachments); + return values; + }, + validateDecimal(value, label, required = false) { + if (this.isEmpty(value)) { + if (required) { + this.$message.warning(`请输入${label}`); + return false; + } + return true; + } + if (Number(value) < 0) { + this.$message.warning(`${label}不能小于 0`); + return false; + } + if (!/^\d+(\.\d{1,2})?$/.test(String(value))) { + this.$message.warning(`${label}最多保留 2 位小数`); + return false; + } + return true; + }, + validateRow(row) { + if (!this.validateDecimal(row.transactionAmount, '交易金额', true)) return false; + if (!this.validateDecimal(row.quantity, '数量')) return false; + if (!this.validateDecimal(row.unitPrice, '单价')) return false; + if (!this.validateDecimal(row.balance, '余额')) return false; + if (row.remark && row.remark.length > 200) { + this.$message.warning('备注不能超过 200 字'); + return false; + } + return true; + }, + rowSave(row, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + add(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + update(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + beforeOpen(done, type) { + if (type === 'add') { + this.form = { vehicleType: '车辆', feeType: '加油', dataSource: '手工录入' }; + this.updateFeeType('加油'); + } + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + const detail = res.data.data; + detail.attachments = this.parseAttachments(detail.attachments); + this.form = detail; + this.updateFeeType(detail.feeType); + }); + } + done(); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出油电记录数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-transport/oil-electric-record/export-oil-electric-record', this.buildExportParams()) + .then(res => { + downloadXls(res.data, `油电记录${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob(`/blade-transport/oil-electric-record/export-template?${this.website.tokenHeader}=${getToken()}`).then( + res => { + downloadXls(res.data, '油电记录模板.xlsx'); + } + ); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.oil-electric-record-page { + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } + + &__input { + width: 100%; + } +} +</style> diff --git a/src/views/vehicle/other-expense-record.vue b/src/views/vehicle/other-expense-record.vue new file mode 100644 index 0000000..c2c57a3 --- /dev/null +++ b/src/views/vehicle/other-expense-record.vue @@ -0,0 +1,441 @@ +<template> + <basic-container class="other-expense-record-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + :permission="permissionList" + :before-open="beforeOpen" + v-model="form" + ref="crud" + @row-update="rowUpdate" + @row-save="rowSave" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('other_expense_record_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('other_expense_record_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('other_expense_record_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('other_expense_record_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #vehicleNo="{ row, index }"> + <el-button type="primary" link @click="$refs.crud.rowView(row, index)"> + {{ row.vehicleNo }} + </el-button> + </template> + <template #vehicleNoForm> + <el-autocomplete + v-model="form.vehicleNo" + :fetch-suggestions="fetchVehicleOptions" + clearable + placeholder="输入车牌号/船号查询选择" + value-key="value" + class="other-expense-record-page__input" + /> + </template> + <template #attachments="{ row }"> + <span>{{ formatAttachments(row.attachments) }}</span> + </template> + </avue-crud> + <el-dialog title="其他费用记录数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter"> + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { add, getDetail, getList, remove, update } from '@/api/vehicle/other-expense-record'; +import { getList as getVehicleList } from '@/api/transportCapacity/transport-vehicle'; +import { getList as getShipList } from '@/api/transportCapacity/transport-ship'; +import { getDeptTree } from '@/api/system/dept'; +import { exportBlob } from '@/api/common'; +import { downloadXls } from '@/utils/util'; +import { getToken } from '@/utils/auth'; +import { mapGetters } from 'vuex'; +import { excelOption, option } from '@/option/vehicle/other-expense-record'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + return { + form: {}, + query: {}, + loading: true, + excelBox: false, + excelForm: {}, + option, + excelOption, + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + data: [], + }; + }, + created() { + this.initDeptTree(); + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: this.hasPermission('other_expense_record_add'), + viewBtn: this.hasPermission('other_expense_record_view'), + delBtn: this.hasPermission('other_expense_record_delete'), + editBtn: this.hasPermission('other_expense_record_edit'), + }; + }, + ids() { + const ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + watch: { + 'form.vehicleType': { + handler() { + this.updateVehicleType(); + }, + immediate: true, + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission[code], false); + }, + initDeptTree() { + getDeptTree(this.userInfo.tenantId).then(res => { + const column = this.findColumn(this.option.column, 'createDept'); + column.dicData = res.data.data; + }); + }, + updateVehicleType() { + if (!this.form.id && this.form.vehicleNo) { + this.form.vehicleNo = ''; + } + }, + fetchVehicleOptions(queryString, callback) { + const vehicleType = this.form.vehicleType || '车辆'; + const request = vehicleType === '船舶' ? getShipList : getVehicleList; + const params = + vehicleType === '船舶' ? { shipIdentifierNo: queryString } : { plateNo: queryString }; + request(1, 20, params) + .then(res => { + const records = res.data.data.records || []; + callback( + records.map(item => ({ + value: vehicleType === '船舶' ? item.shipIdentifierNo || item.shipName : item.plateNo, + })) + ); + }) + .catch(() => callback([])); + }, + formatAttachments(value) { + if (!value) return ''; + if (Array.isArray(value)) return `${value.length} 个`; + if (typeof value !== 'string') return '1 个'; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? `${attachments.length} 个` : '1 个'; + } catch (error) { + return ( + value + .split(',') + .map(item => item.trim()) + .filter(Boolean).length + ' 个' + ); + } + }, + parseAttachments(value) { + if (!value || Array.isArray(value)) return value; + if (typeof value !== 'string') return []; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? attachments : []; + } catch (error) { + return value + .split(',') + .map(item => ({ name: item.trim(), url: item.trim() })) + .filter(item => item.url); + } + }, + stringifyAttachments(value) { + if (!value || typeof value === 'string') return value; + return JSON.stringify(value); + }, + isEmpty(value) { + return value === undefined || value === null || value === ''; + }, + normalizeRow(row) { + const values = { ...row }; + values.vehicleType = values.vehicleType || '车辆'; + values.dataSource = values.dataSource || '手工录入'; + if (values.vehicleNo) { + values.vehicleNo = values.vehicleType === '船舶' ? values.vehicleNo.trim() : values.vehicleNo.trim().toUpperCase(); + } + values.attachments = this.stringifyAttachments(values.attachments); + return values; + }, + validateDecimal(value, label, required = false) { + if (this.isEmpty(value)) { + if (required) { + this.$message.warning(`请输入${label}`); + return false; + } + return true; + } + if (Number(value) < 0) { + this.$message.warning(`${label}不能小于 0`); + return false; + } + if (!/^\d+(\.\d{1,2})?$/.test(String(value))) { + this.$message.warning(`${label}最多保留 2 位小数`); + return false; + } + return true; + }, + validateRow(row) { + if (!this.validateDecimal(row.amount, '金额', true)) return false; + if (row.remark && row.remark.length > 200) { + this.$message.warning('备注不能超过 200 字'); + return false; + } + return true; + }, + rowSave(row, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + add(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + update(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + beforeOpen(done, type) { + if (type === 'add') { + this.form = { + vehicleType: '车辆', + expenseDate: this.$dayjs().format('YYYY-MM-DD'), + dataSource: '手工录入', + }; + } + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + const detail = res.data.data; + detail.attachments = this.parseAttachments(detail.attachments); + this.form = detail; + }); + } + done(); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + buildQuery(params = {}) { + const { expenseDateRange } = this.query; + const values = { ...params, ...this.query }; + if (expenseDateRange) { + values.expenseDateStart = expenseDateRange[0]; + values.expenseDateEnd = expenseDateRange[1]; + values.expenseDateRange = null; + } + return values; + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, this.buildQuery(params)) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出其他费用记录数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-transport/other-expense-record/export-other-expense-record', this.buildExportParams()) + .then(res => { + downloadXls(res.data, `其他费用记录${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.buildQuery(), + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob(`/blade-transport/other-expense-record/export-template?${this.website.tokenHeader}=${getToken()}`).then( + res => { + downloadXls(res.data, '其他费用记录模板.xlsx'); + } + ); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.other-expense-record-page { + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } + + &__input { + width: 100%; + } +} +</style> diff --git a/src/views/vehicle/tire-replacement-record.vue b/src/views/vehicle/tire-replacement-record.vue new file mode 100644 index 0000000..08ce24e --- /dev/null +++ b/src/views/vehicle/tire-replacement-record.vue @@ -0,0 +1,393 @@ +<template> + <basic-container class="tire-replacement-record-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + :permission="permissionList" + :before-open="beforeOpen" + v-model="form" + ref="crud" + @row-update="rowUpdate" + @row-save="rowSave" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('tire_replacement_record_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('tire_replacement_record_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('tire_replacement_record_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('tire_replacement_record_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #vehicleNo="{ row, index }"> + <el-button type="primary" link @click="$refs.crud.rowView(row, index)"> + {{ row.vehicleNo }} + </el-button> + </template> + <template #vehicleNoForm> + <el-autocomplete + v-model="form.vehicleNo" + :fetch-suggestions="fetchVehicleOptions" + clearable + placeholder="请输入关键字" + value-key="value" + class="tire-replacement-record-page__input" + /> + </template> + <template #attachments="{ row }"> + <span>{{ formatAttachments(row.attachments) }}</span> + </template> + </avue-crud> + <el-dialog title="换胎记录数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter"> + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { add, getDetail, getList, remove, update } from '@/api/vehicle/tire-replacement-record'; +import { getList as getVehicleList } from '@/api/transportCapacity/transport-vehicle'; +import { getDeptTree } from '@/api/system/dept'; +import { exportBlob } from '@/api/common'; +import { downloadXls } from '@/utils/util'; +import { getToken } from '@/utils/auth'; +import { mapGetters } from 'vuex'; +import { excelOption, option } from '@/option/vehicle/tire-replacement-record'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + return { + form: {}, + query: {}, + loading: true, + excelBox: false, + excelForm: {}, + option, + excelOption, + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + data: [], + }; + }, + created() { + this.initDeptTree(); + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: this.hasPermission('tire_replacement_record_add'), + viewBtn: this.hasPermission('tire_replacement_record_view'), + delBtn: this.hasPermission('tire_replacement_record_delete'), + editBtn: this.hasPermission('tire_replacement_record_edit'), + }; + }, + ids() { + const ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission[code], false); + }, + initDeptTree() { + getDeptTree(this.userInfo.tenantId).then(res => { + const column = this.findColumn(this.option.column, 'createDept'); + column.dicData = res.data.data; + }); + }, + fetchVehicleOptions(queryString, callback) { + getVehicleList(1, 20, { plateNo: queryString }) + .then(res => { + const records = res.data.data.records || []; + callback(records.map(item => ({ value: item.plateNo }))); + }) + .catch(() => callback([])); + }, + formatAttachments(value) { + if (!value) return ''; + if (Array.isArray(value)) return `${value.length} 个`; + if (typeof value !== 'string') return '1 个'; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? `${attachments.length} 个` : '1 个'; + } catch (error) { + return ( + value + .split(',') + .map(item => item.trim()) + .filter(Boolean).length + ' 个' + ); + } + }, + parseAttachments(value) { + if (!value || Array.isArray(value)) return value; + if (typeof value !== 'string') return []; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? attachments : []; + } catch (error) { + return value + .split(',') + .map(item => ({ name: item.trim(), url: item.trim() })) + .filter(item => item.url); + } + }, + stringifyAttachments(value) { + if (!value || typeof value === 'string') return value; + return JSON.stringify(value); + }, + normalizeRow(row) { + const values = { ...row }; + if (values.vehicleNo) { + values.vehicleNo = values.vehicleNo.trim().toUpperCase(); + } + values.attachments = this.stringifyAttachments(values.attachments); + return values; + }, + validateRow(row) { + if (Number(row.replacementCost) < 0) { + this.$message.warning('换胎费用不能小于 0'); + return false; + } + if ( + row.tireQuantity !== undefined && + row.tireQuantity !== null && + row.tireQuantity !== '' && + (!Number.isInteger(Number(row.tireQuantity)) || Number(row.tireQuantity) <= 0) + ) { + this.$message.warning('换胎数量必须为正整数'); + return false; + } + return true; + }, + rowSave(row, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + add(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + update(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + beforeOpen(done, type) { + if (type === 'add') { + this.form = {}; + } + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + const detail = res.data.data; + detail.attachments = this.parseAttachments(detail.attachments); + this.form = detail; + }); + } + done(); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出换胎记录数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob( + '/blade-transport/tire-replacement-record/export-tire-replacement-record', + this.buildExportParams() + ) + .then(res => { + downloadXls(res.data, `换胎记录${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob( + `/blade-transport/tire-replacement-record/export-template?${this.website.tokenHeader}=${getToken()}` + ).then(res => { + downloadXls(res.data, '换胎记录模板.xlsx'); + }); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.tire-replacement-record-page { + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } + + &__input { + width: 100%; + } +} +</style> diff --git a/src/views/vehicle/transport-change-record.vue b/src/views/vehicle/transport-change-record.vue new file mode 100644 index 0000000..3f835d5 --- /dev/null +++ b/src/views/vehicle/transport-change-record.vue @@ -0,0 +1,411 @@ +<template> + <basic-container class="transport-change-record-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + :permission="permissionList" + :before-open="beforeOpen" + v-model="form" + ref="crud" + @row-update="rowUpdate" + @row-save="rowSave" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('transport_change_record_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('transport_change_record_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('transport_change_record_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('transport_change_record_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #vehicleNo="{ row, index }"> + <el-button v-if="row.vehicleNo" type="primary" link @click="$refs.crud.rowView(row, index)"> + {{ row.vehicleNo }} + </el-button> + </template> + <template #vehicleNoForm> + <el-autocomplete + v-model="form.vehicleNo" + :fetch-suggestions="fetchVehicleOptions" + clearable + placeholder="输入车牌号/船号模糊查询选择" + value-key="value" + class="transport-change-record-page__input" + /> + </template> + <template #attachments="{ row }"> + <span>{{ formatAttachments(row.attachments) }}</span> + </template> + </avue-crud> + <el-dialog title="变更记录数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter"> + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { add, getDetail, getList, remove, update } from '@/api/vehicle/transport-change-record'; +import { getList as getVehicleList } from '@/api/transportCapacity/transport-vehicle'; +import { getList as getShipList } from '@/api/transportCapacity/transport-ship'; +import { getDeptTree } from '@/api/system/dept'; +import { exportBlob } from '@/api/common'; +import { downloadXls } from '@/utils/util'; +import { getToken } from '@/utils/auth'; +import { mapGetters } from 'vuex'; +import { excelOption, option } from '@/option/vehicle/transport-change-record'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + return { + form: {}, + query: {}, + loading: true, + excelBox: false, + excelForm: {}, + option, + excelOption, + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + data: [], + }; + }, + created() { + this.initDeptTree(); + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: this.hasPermission('transport_change_record_add'), + viewBtn: this.hasPermission('transport_change_record_view'), + delBtn: this.hasPermission('transport_change_record_delete'), + editBtn: this.hasPermission('transport_change_record_edit'), + }; + }, + ids() { + const ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + watch: { + 'form.vehicleType': { + handler(value) { + this.updateVehicleType(value || '车辆'); + }, + immediate: true, + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission[code], false); + }, + initDeptTree() { + getDeptTree(this.userInfo.tenantId).then(res => { + const column = this.findColumn(this.option.column, 'createDept'); + column.dicData = res.data.data; + }); + }, + updateVehicleType() { + if (!this.form.id && this.form.vehicleNo) { + this.form.vehicleNo = ''; + } + }, + fetchVehicleOptions(queryString, callback) { + const vehicleType = this.form.vehicleType || '车辆'; + const request = vehicleType === '船舶' ? getShipList : getVehicleList; + const params = + vehicleType === '船舶' ? { shipIdentifierNo: queryString } : { plateNo: queryString }; + request(1, 20, params) + .then(res => { + const records = res.data.data.records || []; + callback( + records.map(item => ({ + value: vehicleType === '船舶' ? item.shipIdentifierNo || item.shipName : item.plateNo, + })) + ); + }) + .catch(() => callback([])); + }, + formatAttachments(value) { + if (!value) return ''; + if (Array.isArray(value)) return `${value.length} 个`; + if (typeof value !== 'string') return '1 个'; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? `${attachments.length} 个` : '1 个'; + } catch (error) { + return ( + value + .split(',') + .map(item => item.trim()) + .filter(Boolean).length + ' 个' + ); + } + }, + parseAttachments(value) { + if (!value || Array.isArray(value)) return value; + if (typeof value !== 'string') return []; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? attachments : []; + } catch (error) { + return value + .split(',') + .map(item => ({ name: item.trim(), url: item.trim() })) + .filter(item => item.url); + } + }, + stringifyAttachments(value) { + if (!value || typeof value === 'string') return value; + return JSON.stringify(value); + }, + normalizeRow(row) { + const values = { ...row }; + values.vehicleType = values.vehicleType || '车辆'; + if (values.vehicleNo) { + values.vehicleNo = values.vehicleType === '船舶' ? values.vehicleNo.trim() : values.vehicleNo.trim().toUpperCase(); + } + values.attachments = this.stringifyAttachments(values.attachments); + return values; + }, + validateRow(row) { + if (row.changeContent && row.changeContent.length > 200) { + this.$message.warning('变更内容不能超过 200 字'); + return false; + } + if (row.remark && row.remark.length > 200) { + this.$message.warning('备注不能超过 200 字'); + return false; + } + return true; + }, + rowSave(row, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + add(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + update(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + beforeOpen(done, type) { + if (type === 'add') { + this.form = { vehicleType: '车辆' }; + } + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + const detail = res.data.data; + detail.attachments = this.parseAttachments(detail.attachments); + this.form = detail; + }); + } + done(); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出变更记录数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob( + '/blade-transport/transport-change-record/export-transport-change-record', + this.buildExportParams() + ) + .then(res => { + downloadXls(res.data, `变更记录${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob( + `/blade-transport/transport-change-record/export-template?${this.website.tokenHeader}=${getToken()}` + ).then(res => { + downloadXls(res.data, '变更记录模板.xlsx'); + }); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.transport-change-record-page { + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } + + &__input { + width: 100%; + } +} +</style> diff --git a/src/views/vehicle/violation-record.vue b/src/views/vehicle/violation-record.vue new file mode 100644 index 0000000..ff951ff --- /dev/null +++ b/src/views/vehicle/violation-record.vue @@ -0,0 +1,490 @@ +<template> + <basic-container class="violation-record-page"> + <avue-crud + :option="option" + :table-loading="loading" + :data="data" + v-model:page="page" + :permission="permissionList" + :before-open="beforeOpen" + v-model="form" + ref="crud" + @row-update="rowUpdate" + @row-save="rowSave" + @row-del="rowDel" + @search-change="searchChange" + @search-reset="searchReset" + @selection-change="selectionChange" + @current-change="currentChange" + @size-change="sizeChange" + @refresh-change="refreshChange" + @on-load="onLoad" + > + <template #menu-left> + <el-button + type="primary" + icon="el-icon-upload" + plain + v-if="hasPermission('violation_record_import')" + @click="handleImport" + >批量导入 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('violation_record_template')" + @click="handleTemplate" + >下载模板 + </el-button> + <el-button + type="primary" + icon="el-icon-download" + plain + v-if="hasPermission('violation_record_export')" + @click="handleExport" + >批量导出 + </el-button> + <el-button + type="danger" + icon="el-icon-delete" + plain + v-if="hasPermission('violation_record_delete')" + @click="handleDelete" + >批量删除 + </el-button> + </template> + <template #vehicleNo="{ row, index }"> + <el-button type="primary" link @click="$refs.crud.rowView(row, index)"> + {{ row.vehicleNo }} + </el-button> + </template> + <template #vehicleNoForm> + <el-autocomplete + v-model="form.vehicleNo" + :fetch-suggestions="fetchVehicleOptions" + clearable + placeholder="输入车牌号/船号模糊查询选择" + value-key="value" + class="violation-record-page__input" + /> + </template> + <template #driverNameForm> + <el-autocomplete + v-if="form.vehicleType !== '船舶'" + v-model="form.driverName" + :fetch-suggestions="fetchDriverOptions" + clearable + placeholder="输入驾驶人模糊查询选择" + value-key="value" + class="violation-record-page__input" + /> + <el-input v-else v-model="form.driverName" clearable maxlength="20" placeholder="请输入船长" /> + </template> + <template #processStatus="{ row }"> + <span :class="row.processStatus === '未处理' ? 'violation-record-page__danger' : ''"> + {{ row.processStatus }} + </span> + </template> + <template #attachments="{ row }"> + <span>{{ formatAttachments(row.attachments) }}</span> + </template> + </avue-crud> + <el-dialog title="违章记录数据导入" append-to-body v-model="excelBox" width="555px"> + <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter"> + <template #excelTemplate> + <el-button type="primary" @click="handleTemplate"> + 点击下载<i class="el-icon-download el-icon--right"></i> + </el-button> + </template> + </avue-form> + </el-dialog> + </basic-container> +</template> + +<script> +import { add, getDetail, getList, remove, update } from '@/api/vehicle/violation-record'; +import { getList as getVehicleList } from '@/api/transportCapacity/transport-vehicle'; +import { getList as getShipList } from '@/api/transportCapacity/transport-ship'; +import { getList as getDriverList } from '@/api/transportCapacity/driver'; +import { getDeptTree } from '@/api/system/dept'; +import { exportBlob } from '@/api/common'; +import { downloadXls } from '@/utils/util'; +import { getToken } from '@/utils/auth'; +import { mapGetters } from 'vuex'; +import { excelOption, option } from '@/option/vehicle/violation-record'; +import NProgress from 'nprogress'; +import 'nprogress/nprogress.css'; + +export default { + data() { + return { + form: {}, + query: {}, + loading: true, + excelBox: false, + excelForm: {}, + option, + excelOption, + page: { + pageSize: 10, + pageSizes: [10, 20, 50, 100], + currentPage: 1, + total: 0, + }, + selectionList: [], + data: [], + }; + }, + created() { + this.initDeptTree(); + }, + computed: { + ...mapGetters(['permission', 'userInfo']), + isAdmin() { + const authority = this.userInfo.authority || ''; + return authority.includes('admin'); + }, + permissionList() { + return { + addBtn: this.hasPermission('violation_record_add'), + viewBtn: this.hasPermission('violation_record_view'), + delBtn: this.hasPermission('violation_record_delete'), + editBtn: this.hasPermission('violation_record_edit'), + }; + }, + ids() { + const ids = []; + this.selectionList.forEach(ele => { + ids.push(ele.id); + }); + return ids.join(','); + }, + }, + watch: { + 'form.vehicleType': { + handler(value) { + this.updateVehicleTypeDisplays(value || '车辆'); + }, + immediate: true, + }, + 'form.processStatus': { + handler(value) { + this.updateProcessResultDisplay(value || '已处理'); + }, + immediate: true, + }, + }, + methods: { + hasPermission(code) { + return this.isAdmin || this.validData(this.permission[code], false); + }, + initDeptTree() { + getDeptTree(this.userInfo.tenantId).then(res => { + const column = this.findColumn(this.option.column, 'createDept'); + column.dicData = res.data.data; + }); + }, + updateVehicleTypeDisplays(vehicleType) { + const vehicleTypeColumn = this.findColumn(this.option.column, 'vehicleType'); + const driverColumn = this.findColumn(this.option.column, 'driverName'); + const typeColumn = this.findColumn(this.option.column, 'violationType'); + const itemColumn = this.findColumn(this.option.column, 'violationItem'); + driverColumn.label = vehicleType === '船舶' ? '船长' : '驾驶人'; + typeColumn.display = vehicleType !== '船舶'; + itemColumn.display = vehicleType === '船舶'; + vehicleTypeColumn.disabled = Boolean(this.form.id); + if (vehicleType === '船舶') { + this.form.violationType = undefined; + } else { + this.form.violationItem = undefined; + } + }, + updateProcessResultDisplay(processStatus) { + const column = this.findColumn(this.option.column, 'processResult'); + column.display = processStatus !== '未处理'; + if (processStatus === '未处理') { + this.form.processResult = undefined; + } + }, + fetchVehicleOptions(queryString, callback) { + const vehicleType = this.form.vehicleType || '车辆'; + const request = vehicleType === '船舶' ? getShipList : getVehicleList; + const params = + vehicleType === '船舶' + ? { shipIdentifierNo: queryString } + : { plateNo: queryString }; + request(1, 20, params) + .then(res => { + const records = res.data.data.records || []; + callback( + records.map(item => ({ + value: vehicleType === '船舶' ? item.shipIdentifierNo || item.shipName : item.plateNo, + })) + ); + }) + .catch(() => callback([])); + }, + fetchDriverOptions(queryString, callback) { + getDriverList(1, 20, { driverName: queryString }) + .then(res => { + const records = res.data.data.records || []; + callback(records.map(item => ({ value: item.driverName }))); + }) + .catch(() => callback([])); + }, + formatAttachments(value) { + if (!value) return ''; + if (Array.isArray(value)) return `${value.length} 个`; + if (typeof value !== 'string') return '1 个'; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? `${attachments.length} 个` : '1 个'; + } catch (error) { + return ( + value + .split(',') + .map(item => item.trim()) + .filter(Boolean).length + ' 个' + ); + } + }, + parseAttachments(value) { + if (!value || Array.isArray(value)) return value; + if (typeof value !== 'string') return []; + try { + const attachments = JSON.parse(value); + return Array.isArray(attachments) ? attachments : []; + } catch (error) { + return value + .split(',') + .map(item => ({ name: item.trim(), url: item.trim() })) + .filter(item => item.url); + } + }, + stringifyAttachments(value) { + if (!value || typeof value === 'string') return value; + return JSON.stringify(value); + }, + normalizeRow(row) { + const values = { ...row }; + values.vehicleType = values.vehicleType || '车辆'; + values.processStatus = values.processStatus || '已处理'; + if (values.vehicleNo) { + values.vehicleNo = values.vehicleNo.trim().toUpperCase(); + } + if (values.processStatus === '未处理') { + values.processResult = undefined; + } + if (values.vehicleType === '船舶') { + values.violationType = undefined; + } else { + values.violationItem = undefined; + } + values.attachments = this.stringifyAttachments(values.attachments); + return values; + }, + validateRow(row) { + if (row.violationTime && new Date(row.violationTime.replace(/-/g, '/')).getTime() > Date.now()) { + this.$message.warning('时间不能超过当前时间'); + return false; + } + if (Number(row.fineAmount) < 0) { + this.$message.warning('被罚金额不能小于 0'); + return false; + } + if ( + row.deductPoints !== undefined && + row.deductPoints !== null && + row.deductPoints !== '' && + (!Number.isInteger(Number(row.deductPoints)) || + Number(row.deductPoints) < 0 || + Number(row.deductPoints) > 15) + ) { + this.$message.warning('被扣分数范围为 0-15 分'); + return false; + } + return true; + }, + rowSave(row, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + add(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowUpdate(row, index, done, loading) { + const values = this.normalizeRow(row); + if (!this.validateRow(values)) { + loading(); + return; + } + update(values).then( + () => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + done(); + }, + error => { + window.console.log(error); + loading(); + } + ); + }, + rowDel(row) { + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(row.id)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + }); + }, + handleDelete() { + if (this.selectionList.length === 0) { + this.$message.warning('请选择至少一条数据'); + return; + } + this.$confirm('确定将选择数据删除?', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then(() => remove(this.ids)) + .then(() => { + this.onLoad(this.page); + this.$message({ type: 'success', message: '操作成功!' }); + this.$refs.crud.toggleSelection(); + }); + }, + beforeOpen(done, type) { + if (type === 'add') { + this.form = { + vehicleType: '车辆', + processStatus: '已处理', + }; + this.updateVehicleTypeDisplays('车辆'); + this.updateProcessResultDisplay('已处理'); + } + if (['edit', 'view'].includes(type)) { + getDetail(this.form.id).then(res => { + const detail = res.data.data; + detail.attachments = this.parseAttachments(detail.attachments); + this.form = detail; + this.updateVehicleTypeDisplays(detail.vehicleType); + this.updateProcessResultDisplay(detail.processStatus); + }); + } + done(); + }, + searchReset() { + this.query = {}; + this.onLoad(this.page); + }, + searchChange(params, done) { + this.query = params; + this.page.currentPage = 1; + this.onLoad(this.page, params); + done(); + }, + selectionChange(list) { + this.selectionList = list; + }, + selectionClear() { + this.selectionList = []; + this.$refs.crud.toggleSelection(); + }, + currentChange(currentPage) { + this.page.currentPage = currentPage; + }, + sizeChange(pageSize) { + this.page.pageSize = pageSize; + }, + refreshChange() { + this.onLoad(this.page, this.query); + }, + onLoad(page, params = {}) { + this.loading = true; + getList(page.currentPage, page.pageSize, { ...params, ...this.query }) + .then(res => { + const data = res.data.data; + this.page.total = data.total; + this.data = data.records; + this.selectionClear(); + }) + .finally(() => { + this.loading = false; + }); + }, + handleImport() { + this.excelBox = true; + }, + uploadAfter(res, done) { + this.excelBox = false; + this.onLoad(this.page); + done(); + }, + handleExport() { + this.$confirm('是否导出违章记录数据?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }).then(() => { + NProgress.start(); + exportBlob('/blade-transport/violation-record/export-violation-record', this.buildExportParams()) + .then(res => { + downloadXls(res.data, `违章记录${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`); + }) + .finally(() => { + NProgress.done(); + }); + }); + }, + buildExportParams() { + return { + ...this.query, + ids: this.ids, + [this.website.tokenHeader]: getToken(), + }; + }, + handleTemplate() { + exportBlob( + `/blade-transport/violation-record/export-template?${this.website.tokenHeader}=${getToken()}` + ).then(res => { + downloadXls(res.data, '违章记录模板.xlsx'); + }); + }, + }, +}; +</script> + +<style lang="scss" scoped> +.violation-record-page { + :deep(.el-table th .cell), + :deep(.el-table td .cell) { + white-space: nowrap; + } + + &__input { + width: 100%; + } + + &__danger { + color: #f56c6c; + } +} +</style> diff --git a/常用地址需求卡.md b/常用地址需求卡.md new file mode 100644 index 0000000..6bb05e2 --- /dev/null +++ b/常用地址需求卡.md @@ -0,0 +1,115 @@ +# 常用地址需求卡 + +REQ-ADDR-01 模块入口与访问权限 + +- 功能点:支持具备常用地址功能权限的账号从基础数据进入常用地址列表页面,查看权限范围内的地址主数据。 +- 异常与边界:①账号无该模块权限时不展示入口或禁止进入页面;②账号权限被调整后再次进入页面应按最新权限判断;③进入页面失败时保留在当前可访问页面并给出明确提示。 +- 反例:①不允许无权限账号直接访问常用地址页面;②不允许绕过基础数据菜单进入未授权模块;③不允许权限失效后继续操作历史打开页面中的数据。 + +REQ-ADDR-02 条件查询 + +- 功能点:支持按地址名称、类型、详细地址、行政区划、站点编码、组织、联系人、联系方式筛选常用地址数据。 +- 异常与边界:①未输入查询条件时默认查询权限范围内全部数据;②地址名称、详细地址、行政区划、联系人、联系方式按模糊匹配查询;③类型、组织按下拉选择值精确匹配,站点编码按精确匹配查询。 +- 反例:①不允许类型条件出现常规、港口/码头、铁路车站、空港机场之外的值;②不允许站点编码输入空格后被当作有效编码查询;③不允许普通用户通过组织条件越权修改其他组织数据。 + +REQ-ADDR-03 查询重置 + +- 功能点:支持一键重置查询条件,清空用户已输入的筛选项并恢复默认组织范围。 +- 异常与边界:①点击重置后地址名称、类型、详细地址、行政区划、站点编码、联系人、联系方式恢复为空或全部;②组织条件恢复为当前用户所属组织默认值;③重置后列表按默认条件重新加载。 +- 反例:①不允许重置后残留上一次的文本查询条件;②不允许重置后组织范围变成未授权组织;③不允许只清空界面条件但列表仍按旧条件展示。 + +REQ-ADDR-04 列表展示 + +- 功能点:支持分页展示常用地址列表,展示序号、地址名称、地址编号、类型、站点编码、详细地址、经纬度、行政区划、联系人、联系方式、组织、备注、更新时间、创建时间和操作。 +- 异常与边界:①进入页面默认展示当前组织全部数据,并按更新时间降序排列;②列表默认每页 10 条,支持切换 20、50、100 条每页;③常规类型站点编码显示为“/”,其他类型显示对应主数据编码。 +- 反例:①不允许列表直接展示 createUser、updateUser 等用户 ID 字段;②不允许常规地址展示虚假的站点编码;③不允许分页切换后丢失当前查询条件。 + +REQ-ADDR-05 组织数据范围 + +- 功能点:支持通过组织字段控制数据权限,普通用户默认查看当前组织数据,可按权限切换查看全部组织只读数据。 +- 异常与边界:①当前组织为空或组织权限异常时应阻止查询并提示;②切换组织范围后列表、分页和导出均按新范围生效;③查看全部组织数据时非本组织或无操作权限的数据仅允许查看。 +- 反例:①不允许普通用户编辑或删除无权限组织的数据;②不允许通过手动构造组织条件获取未授权数据;③不允许导出超出当前组织权限范围的数据。 + +REQ-ADDR-06 新增常规地址 + +- 功能点:支持手工新增常规地址,录入地址类型、地址名称、联系人、联系方式、详细地址、行政区划、经纬度和备注等信息。 +- 异常与边界:①类型、地址名称、详细地址为必填项,缺失时阻止提交并提示;②经纬度通过地图选点产生,提交时经度保留 6 位且范围为 -180 到 180,纬度保留 6 位且范围为 -90 到 90;③提交失败时保留用户已录入内容,便于修正后重新提交。 +- 反例:①不允许新增没有地址名称的常规地址;②不允许手工录入超出范围的经纬度,如经度 181 或纬度 -91;③不允许备注超过 200 个字后仍提交。 + +REQ-ADDR-07 新增港口/码头地址 + +- 功能点:支持从港口/码头主数据选择记录生成常用地址,自动带出地址名称、详细地址、行政区划、站点编码和经纬度信息。 +- 异常与边界:①未选择港口/码头主数据时阻止提交;②选择后地址名称默认填充港口/码头名称且允许修改;③站点编码自动带出港口/码头编码且不可修改。 +- 反例:①不允许把港口/码头地址的站点编码改成其他编码;②不允许选择不存在或已失效的港口/码头主数据;③不允许港口/码头类型提交为常规地址的“/”站点编码。 + +REQ-ADDR-08 新增铁路车站地址 + +- 功能点:支持从铁路车站主数据选择记录生成常用地址,自动带出地址名称、详细地址、行政区划、站点编码和经纬度信息。 +- 异常与边界:①未选择铁路车站主数据时阻止提交;②选择后地址名称默认填充车站名称且允许修改;③站点编码自动带出铁路车站编码且不可修改。 +- 反例:①不允许铁路车站类型使用港口码头或机场编码;②不允许手工伪造车站编码完成提交;③不允许已被主数据删除或停用的车站继续作为新增来源。 + +REQ-ADDR-09 新增空港机场地址 + +- 功能点:支持从空港机场主数据选择记录生成常用地址,自动带出地址名称、详细地址、行政区划、站点编码和经纬度信息。 +- 异常与边界:①未选择空港机场主数据时阻止提交;②选择后地址名称默认填充机场名称且允许修改;③站点编码自动带出机场编码且不可修改。 +- 反例:①不允许空港机场类型使用常规地址的“/”站点编码;②不允许将铁路车站编码作为机场站点编码;③不允许选择不存在或已失效的机场主数据。 + +REQ-ADDR-10 地址编号生成 + +- 功能点:系统为每条常用地址自动生成全局唯一地址编号,编号以 DZ 开头并按 5 位流水号递增。 +- 异常与边界:①新增提交时由系统生成地址编号,用户无需录入;②并发新增时应保证地址编号不重复;③编辑地址时保留原地址编号不重新生成。 +- 反例:①不允许用户手工填写地址编号;②不允许出现两个地址共用同一地址编号;③不允许编辑保存后地址编号从 DZ00001 变成新的流水号。 + +REQ-ADDR-11 地图选点与地址回填 + +- 功能点:常规地址支持通过地图组件搜索和手动选点,自动回填详细地址、行政区划、经度和纬度。 +- 异常与边界:①地图搜索无结果时保持当前输入内容并提示无匹配地址;②用户重新选点后应覆盖原经纬度和地址回填信息;③地图组件加载失败时应提示用户稍后重试或重新打开弹窗。 +- 反例:①不允许未选点时生成无效经纬度;②不允许经纬度弹窗字段前台不展示却后台不记录;③不允许详细地址与经纬度明显来自两次不同选点结果。 + +REQ-ADDR-12 查看地址详情 + +- 功能点:支持在操作列查看单条常用地址详情,展示该地址的基础信息、组织信息、地址信息和创建更新时间。 +- 异常与边界:①无查看权限时隐藏查看入口或禁止打开;②记录已被删除时提示数据不存在并刷新列表;③查看全部组织数据时详情页保持只读。 +- 反例:①不允许查看详情时进入可编辑状态;②不允许详情页展示用户 ID 代替组织或人员名称;③不允许已删除记录仍显示为可查看有效数据。 + +REQ-ADDR-13 编辑常用地址 + +- 功能点:支持编辑权限范围内的常用地址,维护地址名称、联系人、联系方式、详细地址、行政区划、经纬度和备注等信息。 +- 异常与边界:①无编辑权限或非可编辑组织数据时禁止编辑;②站点编码按地址类型规则控制,常规地址显示“/”,港口/码头、铁路车站、空港机场自动带出且不可修改;③保存成功后刷新列表并保留当前分页和查询条件。 +- 反例:①不允许编辑时修改地址编号;②不允许把港口/码头地址直接改成机场编码但仍保留港口信息;③不允许备注超过 200 个字后仍保存。 + +REQ-ADDR-14 单条删除 + +- 功能点:支持在操作列删除单条常用地址,删除前进行二次确认并校验是否被业务数据引用。 +- 异常与边界:①点击删除后弹出确认提示,用户取消时不删除数据;②删除前若已被业务数据引用则提示不可删除并保持原数据;③删除成功后刷新列表并提示删除成功。 +- 反例:①不允许未确认直接删除地址;②不允许删除已被业务单据引用的地址;③不允许无删除权限用户看到或触发删除操作。 + +REQ-ADDR-15 批量删除 + +- 功能点:支持勾选多条常用地址后批量删除,删除前进行二次确认并逐一校验业务引用关系。 +- 异常与边界:①未勾选数据时点击批量删除应提示先选择数据;②确认删除前系统逐条校验引用状态,已引用记录从删除队列跳过并提示;③删除完成后刷新列表并提示成功删除条数和因引用跳过条数。 +- 反例:①不允许批量删除时删除未被勾选的数据;②不允许因部分记录被引用导致所有可删除记录都无法删除;③不允许越权批量删除其他组织数据。 + +REQ-ADDR-16 批量导出 + +- 功能点:支持批量导出常用地址数据,勾选多行时导出勾选数据,未勾选时按当前查询条件导出全部匹配数据。 +- 异常与边界:①导出字段与列表展示字段保持一致;②导出范围受当前查询条件和组织权限限制;③导出失败时提示失败原因,不清空当前查询条件和勾选状态。 +- 反例:①不允许导出超出当前权限范围的数据;②不允许导出文件缺少列表中的关键业务字段;③不允许未勾选时忽略当前查询条件导出全库数据。 + +REQ-ADDR-17 操作列权限控制 + +- 功能点:列表操作列固定支持查看、编辑、删除,并根据用户权限和数据范围决定按钮展示或可用状态。 +- 异常与边界:①无查看权限时不展示查看操作;②无编辑或删除权限时隐藏对应操作;③只读组织数据仅保留查看,不允许编辑和删除。 +- 反例:①不允许前端显示了无权限按钮但点击后才提示失败;②不允许只读数据出现编辑入口;③不允许批量按钮绕过行级权限控制。 + +## 通用规则 + +- 常用地址类型固定为常规地址、港口/码头、铁路车站、空港机场,新增和查询不得使用其他类型。 +- 地址编号由系统自动生成,全局唯一,格式为 DZ 开头加 5 位递增流水号,用户不可手工录入或修改。 +- 常规地址通过地图选点生成详细地址、行政区划、经度和纬度;经度、纬度后台记录并在列表展示,保留 6 位小数。 +- 港口/码头、铁路车站、空港机场地址从对应主数据选择生成,站点编码自动带出且不可修改,地址名称可在默认带出后调整。 +- 列表默认按更新时间降序展示,默认每页 10 条,支持 20、50、100 条每页。 +- 组织字段作为数据权限字段,普通用户默认查看当前组织数据,查看全部组织数据时按权限只读展示。 +- 删除前必须校验是否被业务数据引用,已引用的记录不允许删除;批量删除时已引用记录跳过并提示。 +- 备注类字段最多 200 个字,超过限制时前端阻止提交并给出明确提示。 +- 用户可见场景不得直接展示 createUser、updateUser 等用户 ID 字段;涉及人员展示时优先使用姓名字段。 diff --git a/模块需求卡生成规范.md b/模块需求卡生成规范.md new file mode 100644 index 0000000..7fc3dc2 --- /dev/null +++ b/模块需求卡生成规范.md @@ -0,0 +1,183 @@ +# 模块需求卡生成规范 + +本规范用于后续生成各业务模块需求卡,统一采用 `港口码头主数据需求卡.md` 的非表格条目式格式。需求卡应便于产品、前端、后端、测试共同理解,重点描述功能行为、异常边界和反例,不写成测试用例表格。 + +## 一、文件命名 + +- 文件名格式:`{模块名称}需求卡.md` +- 示例:`港口码头主数据需求卡.md`、`币种汇率管理需求卡.md` +- 模块名称应使用业务侧可识别名称,避免仅使用接口名、表名或英文缩写。 + +## 二、文档结构 + +需求卡固定包含以下结构: + +```md +# {模块名称}需求卡 + +REQ-{模块编码}-01 {功能标题} + +- 功能点:{对该功能的简要概括描述} +- 异常与边界:①{异常或边界 1};②{异常或边界 2};③{异常或边界 3}。 +- 反例:①{不允许的规则或错误用法 1};②{不允许的规则或错误用法 2};③{不允许的规则或错误用法 3}。 + +REQ-{模块编码}-02 {功能标题} + +- 功能点:{对该功能的简要概括描述} +- 异常与边界:①{异常或边界 1};②{异常或边界 2}。 +- 反例:①{不允许的规则或错误用法 1};②{不允许的规则或错误用法 2}。 + +## 通用规则 + +- {模块通用规则 1} +- {模块通用规则 2} +- {模块通用规则 3} +``` + +## 三、编号规则 + +- 每个功能描述使用 `REQ-{模块编码}-{两位序号}`。 +- `{模块编码}` 使用 3 到 8 位大写英文,优先取模块英文简称。 +- 序号从 `01` 开始递增,不跳号。 +- 同一模块内编号不得重复。 + +示例: + +- 港口/码头主数据:`REQ-PORT-01` +- 币种汇率管理:`REQ-CURR-01` +- 车辆管理:`REQ-VEH-01` + +## 四、功能拆分规则 + +功能拆分应围绕用户可感知的业务能力展开,一个编号只描述一个清晰功能点。 + +优先拆分以下类型: + +- 列表展示 +- 条件查询 +- 新增或手工录入 +- 编辑或更新 +- 启用 +- 停用 +- 删除或禁止删除 +- 批量导入 +- 模板下载 +- 批量导出 +- 状态流转 +- 编码或唯一性规则 +- 必填和格式校验 +- 业务关联校验 +- 权限控制 +- 审计追踪 + +不得把多个互相独立的操作硬塞进同一个需求项。例如“新增、编辑、删除”应拆成多个 `REQ`,除非它们确实共享同一套规则且业务风险很低。 + +## 五、字段写作规范 + +### 1. 功能点 + +用于描述该功能“做什么”,要求简短、明确、面向业务。 + +写法要求: + +- 使用一句话概括功能。 +- 说明操作对象和业务目的。 +- 可列出关键字段,但不要堆砌全部数据库字段。 +- 不写技术实现细节,例如组件名、接口路径、方法名。 + +推荐写法: + +- `功能点:支持手工新增港口主数据,录入港口编码、港口名称、所属城市、经纬度、备注等信息,默认数据来源为手工导入,默认状态为启用。` + +不推荐写法: + +- `功能点:调用 /submit 接口保存表单。` +- `功能点:点击按钮打开弹窗,然后 avue-crud 触发 rowSave。` + +### 2. 异常与边界 + +用于描述系统遇到异常、极端输入、权限限制、业务冲突时应如何处理。 + +写法要求: + +- 使用 `①②③` 分点描述。 +- 每点应描述“条件 + 处理方式”。 +- 优先覆盖必填、格式、范围、重复、引用、权限、接口失败、文件格式、状态冲突等场景。 +- 不只写“提示错误”,要尽量说明何时提示、是否阻止提交、是否刷新列表、是否保持原状态。 + +推荐写法: + +- `异常与边界:①编码为空时阻止提交并提示;②重复编码时由后端校验并返回明确原因;③接口提交失败时保留用户输入,方便修正后重新提交。` + +不推荐写法: + +- `异常与边界:报错。` +- `异常与边界:需要校验。` + +### 3. 反例 + +用于描述明确不允许发生的行为、错误用法或违反规则的输入。 + +写法要求: + +- 使用 `①②③` 分点描述。 +- 反例应直接表达“不允许什么”。 +- 可以写非法输入示例,如 `CNSH1`、`-1`、`181`。 +- 反例不写系统应如何处理,处理方式放在“异常与边界”。 + +推荐写法: + +- `反例:①录入无上级港口的码头;②将 CNSHG 作为码头编码;③上级港口为 CNSHG 时录入 CNNGB-CT1。` + +不推荐写法: + +- `反例:用户乱填。` +- `反例:后台报错。` + +## 六、通用规则写作规范 + +文末必须保留 `## 通用规则`,用于汇总跨多个功能项重复出现的模块级规则。 + +通用规则适合放: + +- 编码规则 +- 必填规则 +- 金额、经纬度、备注等统一校验 +- 数据来源规则 +- 启停和删除约束 +- 权限和审计约束 +- 新增、更新、导入后刷新规则 + +通用规则不应替代具体功能项。若某规则会影响具体操作,应同时在对应 `REQ` 的“异常与边界”或“反例”中体现。 + +## 七、内容约束 + +- 不使用表格。 +- 不写测试步骤、预期结果、测试数据列。 +- 不写接口路径、组件名、代码方法名,除非用户明确要求。 +- 不写冗长背景介绍,首屏直接进入需求卡内容。 +- 不凭空增加用户未提及且现有业务无法推断的复杂能力。 +- 当需求明确“不支持删除”时,应单独拆出“禁止删除”需求项,并在通用规则中再次强调。 +- 当涉及导入时,通常需要同时拆出“批量导入”和“模板下载”。 +- 当涉及状态时,通常需要分别拆出“启用”和“停用”。 +- 当涉及用户可见审计字段时,优先使用姓名字段,避免直接展示用户 ID。 + +## 八、生成流程 + +1. 先理解用户提供的模块说明和现有参考需求卡。 +2. 梳理模块核心对象、关键字段、数据来源、允许操作、不允许操作。 +3. 按业务能力拆分 `REQ` 编号。 +4. 为每个 `REQ` 编写三行:功能点、异常与边界、反例。 +5. 汇总重复规则到 `## 通用规则`。 +6. 检查是否误用表格、是否遗漏用户强调的禁止项、是否出现互相矛盾描述。 + +## 九、质量检查清单 + +- 每个 `REQ` 是否只有一个明确功能主题。 +- 每个 `REQ` 是否都有功能点、异常与边界、反例。 +- 异常与边界是否包含处理方式,而不只是问题名称。 +- 反例是否使用“不允许”口径。 +- 编号是否连续且无重复。 +- 是否覆盖新增、更新、导入、导出、启停、权限、审计等常见管理功能。 +- 是否把用户明确禁止的能力写成了可用能力。 +- 是否保持非表格格式。