Merge branch 'yxh' of http://116.62.18.175:6699/r/~yxh/opo-web
| | |
| | | ## å¼å |
| | | |
| | | > æ¬ç®å½ `opo-web/` å³ PC åç«¯å·¥ç¨æ ¹ç®å½ï¼åè¥ä¾æ¨¡æ¿å为 `ruoyi-ui`ï¼æ¤å¤å·²æ¹åï¼ã |
| | | > 以ä¸å½ä»¤**åå¨ `opo-web/` 䏿§è¡**ã |
| | | |
| | | ```bash |
| | | # å
éé¡¹ç® |
| | | git clone https://gitee.com/y_project/RuoYi-Vue |
| | | |
| | | # è¿å
¥é¡¹ç®ç®å½ |
| | | cd ruoyi-ui |
| | | |
| | | # å®è£
ä¾èµ |
| | | npm install |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | #!/usr/bin/env node |
| | | /** |
| | | * éé¢ç²¾åº¦æ£æ¥ï¼é²å¤åé¨ç¦ï¼ |
| | | * |
| | | * èæ¯ï¼é颿µ®ç¹ç´¯å 卿¬é¡¹ç®åå¤å¼å线ä¸é®é¢ï¼å
¸åçç¶æ¯ |
| | | * ãå计对ä¸ä¸ããåºç° -0.00ããéé¢å¸¦ä¸é¿ä¸²å°æ°ããæ ¹å æ¯ JS ç Number |
| | | * æ¯ IEEE-754 å精度浮ç¹ï¼å¯¹ 2 ä½å°æ°éé¢å + - * ä¼å¼å
¥äºè¿å¶èå
¥è¯¯å·®ï¼ |
| | | * ä¸è¯¯å·®ä¼éæç»æ¡æ°ç´¯ç§¯ï¼å®æµçº¦ 39% ç夿ç»ç»åä¼åºç°å°¾å·®ï¼ã |
| | | * |
| | | * å æ¤çº¦å®ï¼éé¢è¿ç®ä¸å¾ä½¿ç¨ @/utils/moneyï¼å
é¨åºäº decimal.jsï¼åè¿å¶ç²¾ç¡®è¿ç®ï¼ã |
| | | * |
| | | * æ¬èæ¬æ«æ src ä¸ç .js / .vueï¼æ¾åºãç似对éé¢åæµ®ç¹ç´¯å ãç忳并æ¥ééåºï¼ |
| | | * ä»¥ä¾¿å¨æäº¤åæ¦ä½åå½ã建议æå° pre-commit æ CIã |
| | | * |
| | | * ç¨æ³ï¼ |
| | | * node build/checkMoney.js |
| | | * æ npm run check:money |
| | | * |
| | | * è¥ç¡®è®¤æå¤æ¯è¯¯æ¥ï¼ä¾å¦ç´¯å ç䏿¯éé¢ï¼èæ¯æ°éã天æ°çï¼ï¼ |
| | | * å¨è¯¥è¡ä¸æ¹å 注éï¼// money-check-ignore |
| | | */ |
| | | const fs = require("fs"); |
| | | const path = require("path"); |
| | | |
| | | const SRC_DIR = path.resolve(__dirname, "../src"); |
| | | const IGNORE_COMMENT = "money-check-ignore"; |
| | | |
| | | // å±é©åæ³ï¼å¯¹ parseFloat ç»æåç´¯å ï¼æä»¥ parseFloat ç¸ä¹ååä¸ç´¯å |
| | | const RULES = [ |
| | | { |
| | | id: "float-accumulate", |
| | | // å½¢å¦ totalFee += parseFloat(...) |
| | | pattern: /\+=\s*parseFloat\s*\(/, |
| | | message: "对 parseFloat ç»æåç´¯å ï¼éé¢ä¼ç´¯ç§¯æµ®ç¹è¯¯å·®" |
| | | }, |
| | | { |
| | | id: "float-subtract-assign", |
| | | // å½¢å¦ totalFee -= parseFloat(...) |
| | | pattern: /-=\s*parseFloat\s*\(/, |
| | | message: "对 parseFloat ç»æååæ³ç´¯å ï¼éé¢ä¼ç´¯ç§¯æµ®ç¹è¯¯å·®" |
| | | }, |
| | | { |
| | | id: "float-text-math", |
| | | // å½¢å¦ a = (parseFloat(x) - parseFloat(y)).toFixed(2) |
| | | pattern: /=\s*\(?\s*parseFloat\s*\([^)]*\)\s*[-+*]\s*parseFloat\s*\(/, |
| | | message: "parseFloat ä¹é´ç´æ¥åç®æ¯è¿ç®åæ ¼å¼åï¼ç»æå¯è½å¸¦æµ®ç¹å°¾å·®" |
| | | } |
| | | ]; |
| | | |
| | | // æé¤ç¬¬ä¸æ¹åºä¸æå»ºäº§ç©ï¼ä»
æ£æ¥ä¸å¡æºç |
| | | const EXCLUDE_DIRS = [ |
| | | path.join(SRC_DIR, "echarts"), // echarts ç¬¬ä¸æ¹åºæºç |
| | | path.join(SRC_DIR, "assets") |
| | | ]; |
| | | |
| | | // å
许çåæ³ï¼è¿äºæ¯å¯¹å个å¼çåæ³æ§/é¶å¼æ ¡éªï¼ä¸ææç´¯å ï¼ä¸ä¼æ¾å¤§è¯¯å·® |
| | | const ALLOW = [/parseFloat\([^)]*\)\s*==\s*0/, /parseFloat\([^)]*\)\s*!=\s*0/]; |
| | | |
| | | function walk(dir, out) { |
| | | for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { |
| | | const full = path.join(dir, entry.name); |
| | | if (entry.isDirectory()) { |
| | | if (entry.name === "node_modules") continue; |
| | | if (EXCLUDE_DIRS.indexOf(full) >= 0) continue; |
| | | walk(full, out); |
| | | } else if (/\.(js|vue)$/.test(entry.name)) { |
| | | out.push(full); |
| | | } |
| | | } |
| | | return out; |
| | | } |
| | | |
| | | function checkFile(file) { |
| | | const lines = fs.readFileSync(file, "utf8").split(/\r?\n/); |
| | | const hits = []; |
| | | let inBlockComment = false; |
| | | |
| | | lines.forEach((line, idx) => { |
| | | const code = line.trim(); |
| | | |
| | | // è·è¸ªè·¨è¡å注éï¼å注éä¸ç代ç ä¸å䏿£æ¥ï¼é¿å
对已注éæç代ç 误æ¥ï¼ |
| | | if (inBlockComment) { |
| | | if (code.indexOf("*/") >= 0) inBlockComment = false; |
| | | return; |
| | | } |
| | | if (code.indexOf("/*") === 0) { |
| | | if (code.indexOf("*/") < 0) inBlockComment = true; |
| | | return; |
| | | } |
| | | // è¡æ³¨é |
| | | if (code.indexOf("//") === 0 || code.indexOf("*") === 0) return; |
| | | // å
许çåæ³ï¼å个å¼çåæ³æ§/é¶å¼æ ¡éª |
| | | if (ALLOW.some((re) => re.test(line))) return; |
| | | // æ¾å¼è¯¯æ¥æ è®° |
| | | const prev = idx > 0 ? lines[idx - 1] : ""; |
| | | if (prev.indexOf(IGNORE_COMMENT) >= 0) return; |
| | | |
| | | RULES.forEach((rule) => { |
| | | if (rule.pattern.test(line)) { |
| | | hits.push({ line: idx + 1, id: rule.id, message: rule.message, code: code.slice(0, 120) }); |
| | | } |
| | | }); |
| | | }); |
| | | |
| | | return hits; |
| | | } |
| | | |
| | | function main() { |
| | | if (!fs.existsSync(SRC_DIR)) { |
| | | console.error(`æ¾ä¸å°æºç ç®å½ï¼${SRC_DIR}`); |
| | | process.exit(1); |
| | | } |
| | | |
| | | const files = walk(SRC_DIR, []); |
| | | let total = 0; |
| | | const report = []; |
| | | |
| | | files.forEach((file) => { |
| | | const hits = checkFile(file); |
| | | if (hits.length) { |
| | | total += hits.length; |
| | | report.push({ file: path.relative(path.resolve(__dirname, ".."), file), hits }); |
| | | } |
| | | }); |
| | | |
| | | if (total === 0) { |
| | | console.log(`éé¢ç²¾åº¦æ£æ¥éè¿ï¼å·²æ«æ ${files.length} 个æä»¶ï¼`); |
| | | process.exit(0); |
| | | } |
| | | |
| | | console.error("éé¢ç²¾åº¦æ£æ¥æªéè¿ï¼åç°çä¼¼é颿µ®ç¹ç´¯å \n"); |
| | | report.forEach(({ file, hits }) => { |
| | | console.error(` ${file}`); |
| | | hits.forEach((h) => { |
| | | console.error(` L${h.line} [${h.id}] ${h.message}`); |
| | | console.error(` ${h.code}`); |
| | | }); |
| | | console.error(""); |
| | | }); |
| | | console.error("请æ¹ç¨ @/utils/money æä¾çæ¹æ³ï¼ä¾å¦ï¼"); |
| | | console.error(' import { moneySum, moneyAdd, moneyMul, moneyRound } from "@/utils/money";'); |
| | | console.error(" const total = moneyRound(moneySum(list, \"amount\"));"); |
| | | console.error(" éé¢ç¸çæ¯è¾ç¨ moneyEq()ï¼ä¸è¦ç¨ parseFloat(...) == æ ===ã"); |
| | | console.error(" ç¡®å±è¯¯æ¥æ¶ï¼å¨è¯¥è¡ä¸æ¹å 注é // money-check-ignore"); |
| | | process.exit(1); |
| | | } |
| | | |
| | | main(); |
| | |
| | | "author": "æµæ±äº¥å°æ¶ä¿¡æ¯ç§ææéå
¬å¸", |
| | | "license": "MIT", |
| | | "scripts": { |
| | | "dev": "vue-cli-service serve", |
| | | "serve": "vue-cli-service serve", |
| | | "build": "vue-cli-service build", |
| | | "build:stage": "vue-cli-service build --mode staging", |
| | | "preview": "node build/index.js --preview", |
| | | "lint": "eslint --ext .js,.vue src" |
| | | "lint": "eslint --ext .js,.vue src", |
| | | "check:money": "node build/checkMoney.js" |
| | | }, |
| | | "husky": { |
| | | "hooks": { |
| | |
| | | } |
| | | |
| | | #loader-wrapper .load_title { |
| | | font-family: 'Open Sans'; |
| | | font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif; |
| | | color: #FFF; |
| | | font-size: 19px; |
| | | width: 100%; |
| | |
| | | }) |
| | | } |
| | | |
| | | // ä¸å®¶å³å¡è´¹ï¼ä¿ååçè´¹ç¨æ§å¶æ ¡éªï¼å¹²è·ï¼ä¸è½åºï¼ |
| | | // è¿å { errors: [黿æ§ä¿¡æ¯], warnings: [æç¤ºä¿¡æ¯], blocked: æ¯å¦é»æ } |
| | | export function validateExpertFee(data) { |
| | | return request({ |
| | | url: '/project/fund/validateExpertFee', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // 伦çä¸å®¶è´¹æå° |
| | | export function getdownloadLL(id) { |
| | | return request({ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | // æ¥è¯¢å¨å®å»å¤åè¡¨ï¼æ°æ®æºï¼è§å¾ v_service_donateorgan_registerï¼ |
| | | export function listRegister(query) { |
| | | return request({ |
| | | url: '/project/register/list', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢å¨å®å»å¤è¯¦ç» |
| | | export function getRegister(id) { |
| | | return request({ |
| | | url: '/project/register/' + id, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // 导åºå¨å®å»å¤å表 |
| | | export function exportRegister(query) { |
| | | return request({ |
| | | url: '/project/register/export', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // ============================================================ |
| | | // ç»ä»¶é»è®¤å¤è§ï¼éæä»¤çå±ï¼ |
| | | // ------------------------------------------------------------ |
| | | // ç®çï¼ä¸æ¹ä»»ä½ä¸å¡é¡µé¢æ¨¡æ¿ï¼ç¨å
¨å±æ ·å¼æ Element çé»è®¤è§æ |
| | | // ç»ä¸æ"ç´§åãæ¸
ç½ãä¸ä¸"çä¸å¥ã |
| | | // éç¹ï¼è¡¨æ ¼ï¼æé©¬çº¹/å»ç«çº¿/表头åºè²ï¼ã表åãæé®ãå¼¹çªãæ ç¾ã |
| | | // 顺åºï¼å¿
é¡»æäº element-ui ä¸ ruoyi.scssï¼è§ main.jsï¼ã |
| | | // ============================================================ |
| | | |
| | | // ---------- å
¨å±æç ---------- |
| | | body { |
| | | font-family: var(--opo-font-family-base); |
| | | font-size: var(--opo-font-size-base); |
| | | color: var(--opo-text-primary); |
| | | background-color: var(--opo-bg-page); |
| | | } |
| | | |
| | | // è¦ç index.scss éç label { font-weight: 700 } |
| | | label { |
| | | font-weight: 400; |
| | | } |
| | | |
| | | .app-container { |
| | | // 2026-10-22ï¼ç»ä¸æ¶ç´§ä¸º 8/12/12ï¼å 12/16ï¼ï¼å
¨ç«å表页ä¸è´ |
| | | padding: 8px 12px 12px; |
| | | } |
| | | |
| | | // æ°åç±»åæ®µï¼éé¢/ç¼å·/身份è¯ï¼å¯ç¨æ¤ç±»è·å¾ç宽æ°å |
| | | .opo-number { |
| | | font-family: var(--opo-font-family-number); |
| | | font-variant-numeric: tabular-nums; |
| | | } |
| | | |
| | | // ---------- è¡¨æ ¼ ---------- |
| | | // 2026-10-22ï¼æ°æ®è¡åå·ä¸è¡¨å¤´ç»ä¸ï¼14px / 常è§åéï¼ |
| | | // 注æï¼å
¨å± size=small ä¼è®©æ¯ä¸ªè¡¨æ ¼å¸¦ä¸ .el-table--smallï¼ |
| | | // Element ç¨å®æåå·åå 12pxãåå
æ ¼ padding åå 8pxï¼ |
| | | // æä»¥è¿éå¿
须忶æé«éæ©å¨ç¹å¼æ§ï¼å¦åä¼è¢«ååå»ã |
| | | .el-table, |
| | | .el-table.el-table--small, |
| | | .el-table.el-table--medium, |
| | | .el-table.el-table--mini, |
| | | .el-table.el-table--large { |
| | | color: var(--opo-text-primary); |
| | | font-size: var(--opo-font-size-sm); |
| | | } |
| | | |
| | | .el-table { |
| | | th, |
| | | th.el-table__cell { |
| | | background-color: var(--opo-bg-thead) !important; |
| | | color: var(--opo-text-primary); |
| | | // 表头ä¸å ç²ï¼2026-10-22 åé¦ï¼ |
| | | font-weight: 400; |
| | | font-size: var(--opo-font-size-sm); |
| | | height: 40px; |
| | | padding: 0; |
| | | } |
| | | |
| | | td, |
| | | td.el-table__cell, |
| | | &.el-table--small td.el-table__cell, |
| | | &.el-table--medium td.el-table__cell, |
| | | &.el-table--mini td.el-table__cell { |
| | | padding: 9px 0; |
| | | // è¡åé线ï¼2026-10-22 åå æ·±ä¸æ¡£ï¼ |
| | | border-bottom: 1px solid var(--opo-table-border, #c8cfd8); |
| | | } |
| | | |
| | | // è¡¨æ ¼åºé¨é£æ¡çº¿ |
| | | &::before { |
| | | background-color: var(--opo-table-border, #c8cfd8); |
| | | } |
| | | |
| | | // 带边æ¡çè¡¨æ ¼ï¼å¤æ¡çº¿ |
| | | &.el-table--border { |
| | | border-color: var(--opo-table-border, #c8cfd8); |
| | | } |
| | | |
| | | .cell { |
| | | line-height: 23px; |
| | | } |
| | | |
| | | // 表头ä¸å
容åºçåéçº¿ï¼æ¯è¡çº¿åæ·±ä¸ç¹ï¼ä½ä¸ºåçï¼ |
| | | .el-table__header-wrapper th { |
| | | border-bottom: 1px solid var(--opo-table-border-strong, #b7c0cc); |
| | | } |
| | | |
| | | // æé©¬çº¹ï¼ç¨ CSS å®ç°ï¼æ éç» 162 ä¸ªè¡¨æ ¼é个å stripe 屿§ |
| | | .el-table__body tr:nth-child(2n) > td, |
| | | .el-table__body tr:nth-child(2n) > td.el-table__cell { |
| | | background-color: var(--opo-bg-stripe); |
| | | } |
| | | |
| | | // é¼ æ è¡é«äº®ï¼è¦çæé©¬çº¹ï¼Element é»è®¤ hover è²åç°ï¼ |
| | | .el-table__body tr:hover > td, |
| | | .el-table__body tr:hover > td.el-table__cell { |
| | | background-color: var(--opo-primary-light-95, #f5f9fd); |
| | | } |
| | | |
| | | // 廿ç«çº¿ï¼border 屿§ä»ä¿ç卿¨¡æ¿éï¼è¿éåªè®©å®å¨è§è§ä¸æ¶å¤± |
| | | &.el-table--border td, |
| | | &.el-table--border th, |
| | | &.el-table--border th.el-table__cell, |
| | | &.el-table--border td.el-table__cell { |
| | | border-right: none; |
| | | } |
| | | |
| | | &.el-table--border::after, |
| | | &.el-table--group::after { |
| | | display: none; |
| | | } |
| | | |
| | | .el-table__empty-text { |
| | | color: var(--opo-text-placeholder); |
| | | font-size: var(--opo-font-size-sm); |
| | | } |
| | | } |
| | | |
| | | // éè¦"å¼ºç½æ ¼çº¿"çæç»å½å
¥è¡¨ï¼æ¨¡æ¿ä¸å class="table-bordered" å³å¯æ¢å¤ |
| | | .el-table.table-bordered { |
| | | border: 1px solid var(--opo-table-border, #c8cfd8); |
| | | |
| | | td, |
| | | th, |
| | | td.el-table__cell, |
| | | th.el-table__cell { |
| | | border-right: 1px solid var(--opo-table-border, #c8cfd8); |
| | | } |
| | | } |
| | | |
| | | // è¡¨æ ¼å
æé®æ´ç´§åï¼é¿å
æè¡æé« |
| | | .el-table .el-button--mini, |
| | | .el-table .el-button--small { |
| | | padding: 5px 8px; |
| | | } |
| | | |
| | | // ---------- 表å ---------- |
| | | // æ¥è¯¢æ¡ä»¶/è¡¨åæ´ä½æ¶ç´§ï¼Element é»è®¤ margin-bottom 22pxï¼è¡è·ææ¾å大 |
| | | .el-form-item { |
| | | margin-bottom: 12px; |
| | | |
| | | &__label { |
| | | font-weight: 400; |
| | | color: var(--opo-text-regular); |
| | | // æ ç¾ä¿æ 14pxï¼æ¥è¯¢åºå¤§éä½¿ç¨ label-width="68px"/"70px"ï¼ |
| | | // æ ç¾è¥éæ£æåå° 16pxï¼4 个åï¼å¦"æç®æ¡ä¾"ï¼å°±ä¼æ¢è¡ãè¡é«ç¿»å |
| | | font-size: var(--opo-font-size-sm); |
| | | padding-right: 8px; |
| | | line-height: 32px; |
| | | } |
| | | |
| | | &__content { |
| | | line-height: 32px; |
| | | min-height: 32px; |
| | | } |
| | | |
| | | &.is-required:not(.is-no-asterisk) > .el-form-item__label:before { |
| | | color: var(--opo-danger); |
| | | } |
| | | |
| | | &__error { |
| | | font-size: var(--opo-font-size-xs); |
| | | line-height: 1.4; |
| | | padding-top: 2px; |
| | | } |
| | | } |
| | | |
| | | // 横åæåçæ¥è¯¢æ¡ä»¶åç´§å䏿¡£ |
| | | .el-form--inline .el-form-item { |
| | | margin-right: 12px; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | // ---------- ç´§åæ¥è¯¢åºï¼opt-inï¼ ---------- |
| | | // ç¨æ³ï¼ç»æ¥è¯¢ç¨ç el-form å class="opo-query-form"ï¼å表页ç»ä¸çº¦å®ï¼ |
| | | // è¡è· 8â4pxãæ ç¾ä¸æ§ä»¶å¯¹é½ãæåä¸è¡ï¼æç´¢/éç½®ï¼å»æä¸è¾¹è· |
| | | .opo-query-form { |
| | | // æ¥è¯¢æ¡ä»¶ä¸ä¸æ¹"æ°å¢/导åº"å·¥å
·æ ï¼å¯¹è¡¨æ ¼çæä½ï¼ä¹é´çåºé´è· |
| | | margin-bottom: 12px; |
| | | |
| | | .el-form-item { |
| | | margin-right: 8px; |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .el-form-item__label { |
| | | line-height: 32px; |
| | | padding-right: 6px; |
| | | } |
| | | |
| | | .el-form-item__content { |
| | | line-height: 32px; |
| | | min-height: 32px; |
| | | } |
| | | |
| | | // æåä¸è¡é常æ¯"æç´¢/éç½®"ï¼ä¸åé¢å¤çç½ |
| | | > .el-row:last-child .el-form-item { |
| | | margin-bottom: 0; |
| | | } |
| | | } |
| | | |
| | | // ç´§è·æ¥è¯¢åºä¹åçå·¥å
·æ è¡ï¼æ°å¢/导åºï¼ï¼è´´è¿è¡¨æ ¼ï¼ä¸æ¥è¯¢åºç± margin-bottom éå¼ |
| | | .opo-query-form + .el-row.mb8 { |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | // 页é¢éçæ¥è¯¢åºå¸¸å
å¨å¡çæ el-row ä¸ï¼å»æå¤ä½çå¤å±çç½ |
| | | .el-card__body > .el-form:first-child, |
| | | .el-card__body > .el-row:first-child .el-form { |
| | | margin-bottom: 0; |
| | | } |
| | | |
| | | .el-input__inner, |
| | | .el-textarea__inner { |
| | | border-radius: var(--opo-radius-base); |
| | | color: var(--opo-text-primary); |
| | | |
| | | &::placeholder { |
| | | color: var(--opo-text-placeholder); |
| | | } |
| | | } |
| | | |
| | | // ---------- æé® ---------- |
| | | .el-button { |
| | | border-radius: var(--opo-radius-base); |
| | | font-weight: 400; |
| | | |
| | | [class*='el-icon-'] + span { |
| | | margin-left: 4px; |
| | | } |
| | | } |
| | | |
| | | // å°/è¿·ä½ æé®çåå·å¨ Element éæ¯ç¡¬ç¼ç 12pxï¼éæ£æä¸èµ·ä¸è°ï¼2026-10-22 å大ä¸å· â 16pxï¼ |
| | | .el-button--small, |
| | | .el-button--mini { |
| | | font-size: var(--opo-font-size-base); |
| | | } |
| | | |
| | | // ---------- å¼¹çª ---------- |
| | | .el-dialog { |
| | | border-radius: var(--opo-radius-lg); |
| | | box-shadow: var(--opo-shadow-lg); |
| | | overflow: hidden; |
| | | |
| | | &__header { |
| | | padding: 16px 20px 12px; |
| | | border-bottom: 1px solid var(--opo-border-light); |
| | | } |
| | | |
| | | &__title { |
| | | font-size: var(--opo-font-size-lg); |
| | | font-weight: 600; |
| | | color: var(--opo-text-primary); |
| | | } |
| | | |
| | | &__body { |
| | | padding: 16px 20px; |
| | | color: var(--opo-text-regular); |
| | | } |
| | | |
| | | &__footer { |
| | | padding: 12px 20px 16px; |
| | | border-top: 1px solid var(--opo-border-light); |
| | | } |
| | | } |
| | | |
| | | .el-drawer__header { |
| | | padding: 16px 20px; |
| | | margin-bottom: 0; |
| | | border-bottom: 1px solid var(--opo-border-light); |
| | | color: var(--opo-text-primary); |
| | | font-weight: 600; |
| | | } |
| | | |
| | | // ---------- æ ç¾ ---------- |
| | | .el-tag { |
| | | border-radius: var(--opo-radius-sm); |
| | | font-size: var(--opo-font-size-xs); |
| | | } |
| | | |
| | | // ---------- å¡ç ---------- |
| | | .el-card { |
| | | border-radius: var(--opo-radius-lg); |
| | | border-color: var(--opo-border-light); |
| | | box-shadow: var(--opo-shadow-sm) !important; |
| | | |
| | | &__header { |
| | | padding: 14px 16px 10px; |
| | | border-bottom: 1px solid var(--opo-border-light); |
| | | font-weight: 600; |
| | | color: var(--opo-text-primary); |
| | | } |
| | | |
| | | &__body { |
| | | padding: 12px 16px; |
| | | } |
| | | } |
| | | |
| | | // ---------- å页 ---------- |
| | | // Element æå页æååæ» 13pxãåé 700ï¼å 16px çè¡¨æ ¼æ£æä¸æ â ç»ä¸ 14px/å¸¸è§ |
| | | .el-pagination { |
| | | font-weight: 400; |
| | | color: var(--opo-text-regular); |
| | | font-size: var(--opo-font-size-sm); |
| | | |
| | | button, |
| | | span:not([class*='suffix']) { |
| | | font-size: var(--opo-font-size-sm); |
| | | } |
| | | |
| | | .el-pager li { |
| | | font-size: var(--opo-font-size-sm); |
| | | } |
| | | } |
| | | |
| | | .pagination-container { |
| | | margin-top: 12px; |
| | | height: auto; |
| | | padding: 8px 16px !important; |
| | | } |
| | | |
| | | // ---------- é¢å
å± / é¡µç¾ ---------- |
| | | .el-breadcrumb { |
| | | font-size: var(--opo-font-size-sm); |
| | | |
| | | &__inner, |
| | | &__inner a { |
| | | font-weight: 400 !important; |
| | | color: var(--opo-text-secondary); |
| | | } |
| | | |
| | | &__item:last-child .el-breadcrumb__inner { |
| | | color: var(--opo-text-primary); |
| | | } |
| | | } |
| | | |
| | | // ---------- æç¤º / æ¶æ¯ ---------- |
| | | .el-message { |
| | | border-radius: var(--opo-radius-base); |
| | | box-shadow: var(--opo-shadow-md); |
| | | } |
| | | |
| | | .el-tooltip__popper { |
| | | font-size: var(--opo-font-size-xs); |
| | | } |
| | | |
| | | // ---------- æ»å¨æ¡ï¼è§æç»èï¼ ---------- |
| | | ::-webkit-scrollbar { |
| | | width: 8px; |
| | | height: 8px; |
| | | } |
| | | |
| | | ::-webkit-scrollbar-thumb { |
| | | background-color: rgba(0, 0, 0, 0.18); |
| | | border-radius: var(--opo-radius-pill); |
| | | |
| | | &:hover { |
| | | background-color: rgba(0, 0, 0, 0.28); |
| | | } |
| | | } |
| | | |
| | | ::-webkit-scrollbar-track { |
| | | background-color: transparent; |
| | | } |
| | |
| | | /** |
| | | * I think element-ui's default theme color is too light for long-term use. |
| | | * So I modified the default color and you can modify it to your liking. |
| | | **/ |
| | | * Element UI 主é¢åéï¼ç¼è¯æï¼ |
| | | * ------------------------------------------------------------ |
| | | * åç主è²ï¼åèª src/assets/logo/OPO_Logo.png åç¯é #0E768F |
| | | * å±é©è²ï¼ åèªåå¾å¿å½¢ç«çº¢ #CD1D4Eï¼ç½å对æ¯åº¦ 5.41ï¼ä¼äºå #F56C6C ç 3.4ï¼ |
| | | * |
| | | * 说æï¼è¿éå³å®"ç¼è¯è¿ CSS çé»è®¤ç®è¤"ï¼ |
| | | * è¿è¡æ¶æ¢è¤ç± assets/styles/theme-runtime.scss + utils/theme.js è´è´£ï¼ |
| | | * äºè
éè¿ CSS åé --opo-primary* è¡æ¥ã |
| | | */ |
| | | |
| | | /* theme color */ |
| | | $--color-primary: #1890ff; |
| | | $--color-success: #13ce66; |
| | | $--color-warning: #ffba00; |
| | | $--color-danger: #ff4949; |
| | | // $--color-info: #1E1E1E; |
| | | /* ---------- 主é¢è² ---------- */ |
| | | $--color-primary: #0E768F; |
| | | $--color-success: #67C23A; |
| | | $--color-warning: #E6A23C; |
| | | $--color-danger: #CD1D4E; |
| | | $--color-info: #909399; |
| | | |
| | | /* ---------- æå ---------- */ |
| | | $--color-text-primary: #1F2937; |
| | | $--color-text-regular: #4B5563; |
| | | $--color-text-secondary: #6B7280; |
| | | $--color-text-placeholder: #9CA3AF; |
| | | |
| | | /* ---------- è¾¹æ¡ ---------- */ |
| | | $--border-color-base: #E5E7EB; |
| | | $--border-color-light: #F0F2F5; |
| | | $--border-color-lighter: #F5F7FA; |
| | | $--border-color-extra-light: #FAFBFC; |
| | | |
| | | /* ---------- èæ¯ ---------- */ |
| | | $--background-color-base: #F5F7FA; |
| | | |
| | | /* ---------- åè§ ---------- */ |
| | | $--border-radius-base: 4px; |
| | | $--border-radius-small: 2px; |
| | | |
| | | /* ---------- åå·ï¼2026-10-22 æ´ä½ä¸è°ä¸å·ï¼ ---------- */ |
| | | $--font-size-extra-large: 22px; |
| | | $--font-size-large: 20px; |
| | | $--font-size-medium: 18px; |
| | | $--font-size-base: 16px; |
| | | $--font-size-small: 14px; |
| | | $--font-size-extra-small: 13px; |
| | | |
| | | /* æé®åå·é»è®¤å¨å°å°ºå¯¸é被硬ç¼ç æ 12pxï¼ä¸å¹¶ä¸è° */ |
| | | $--button-font-size: 16px; |
| | | $--button-medium-font-size: 16px; |
| | | $--button-small-font-size: 14px; |
| | | $--button-mini-font-size: 14px; |
| | | |
| | | /* ä¾§è¾¹æ èååå·ï¼2026-10-22 ç± 18px åè°ä¸å·ï¼ */ |
| | | $--menu-item-font-size: 16px; |
| | | |
| | | $--button-font-weight: 400; |
| | | |
| | | // $--color-text-regular: #1f2d3d; |
| | | |
| | | $--border-color-light: #dfe4ed; |
| | | $--border-color-lighter: #e6ebf5; |
| | | |
| | | $--table-border:1px solid#dfe6ec; |
| | | /* ---------- è¡¨æ ¼ ---------- */ |
| | | $--table-border: 1px solid #E5E7EB; |
| | | |
| | | /* icon font path, required */ |
| | | $--font-path: '~element-ui/lib/theme-chalk/fonts'; |
| | |
| | | -moz-osx-font-smoothing: grayscale; |
| | | -webkit-font-smoothing: antialiased; |
| | | text-rendering: optimizeLegibility; |
| | | font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; |
| | | font-family: $opo-font-family-base; |
| | | } |
| | | |
| | | // è¡¨åæ ç¾ä¸åå
¨å±å ç²ï¼åæ¥ 700 让ææé¡µé¢æ¾å¾å¾"é"ï¼ |
| | | label { |
| | | font-weight: 700; |
| | | font-weight: 400; |
| | | } |
| | | |
| | | html { |
| | |
| | | border-radius: 2px; |
| | | display: block; |
| | | line-height: 32px; |
| | | font-size: 16px; |
| | | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; |
| | | font-size: $opo-font-size-lg; |
| | | font-family: $opo-font-family-base; |
| | | color: #2c3e50; |
| | | -webkit-font-smoothing: antialiased; |
| | | -moz-osx-font-smoothing: grayscale; |
| | |
| | | * Copyright (c) 2019 ruoyi |
| | | */ |
| | | |
| | | /* 设计令çï¼æ¬æä»¶ä¸ºç¬ç«å
¥å£ï¼éèªè¡å¼å
¥åéï¼ */ |
| | | @import './tokens.scss'; |
| | | |
| | | /** åºç¡éç¨ **/ |
| | | .pt5 { |
| | | padding-top: 5px; |
| | |
| | | .el-table__header-wrapper, .el-table__fixed-header-wrapper { |
| | | th { |
| | | word-break: break-word; |
| | | background-color: #f8f8f9; |
| | | color: #515a6e; |
| | | background-color: $opo-bg-thead; |
| | | color: $opo-text-primary; |
| | | height: 40px; |
| | | font-size: 13px; |
| | | font-size: $opo-font-size-sm; |
| | | } |
| | | } |
| | | .el-table__body-wrapper { |
| | |
| | | /** è¡¨æ ¼æ´å¤æä½ä¸ææ ·å¼ */ |
| | | .el-table .el-dropdown-link { |
| | | cursor: pointer; |
| | | color: #409EFF; |
| | | color: var(--opo-primary, #0E768F); |
| | | margin-left: 5px; |
| | | } |
| | | |
| | |
| | | width: 100% !important; |
| | | } |
| | | |
| | | // èååå·ï¼æ¯æ£æå¤§ä¸¤å·ï¼æ£æ 16px â èå 18pxï¼ |
| | | .el-menu-item, |
| | | .el-submenu__title { |
| | | font-size: $opo-font-size-menu; |
| | | } |
| | | |
| | | .el-menu-item, .el-submenu__title { |
| | | overflow: hidden !important; |
| | | text-overflow: ellipsis !important; |
| | | white-space: nowrap !important; |
| | | } |
| | | |
| | | // menu hover |
| | | // menu hoverï¼æ·±è²åºä¸ç¨éç½ï¼åæ¥ rgba(0,0,0,.06) 卿·±è²ä¸çä¸åºæ¥ï¼ |
| | | .submenu-title-noDropdown, |
| | | .el-submenu__title { |
| | | &:hover { |
| | | background-color: rgba(0, 0, 0, 0.06) !important; |
| | | background-color: rgba(255, 255, 255, 0.08) !important; |
| | | } |
| | | } |
| | | |
| | |
| | | min-width: $base-sidebar-width !important; |
| | | |
| | | &:hover { |
| | | background-color: rgba(0, 0, 0, 0.06) !important; |
| | | background-color: rgba(255, 255, 255, 0.08) !important; |
| | | } |
| | | } |
| | | |
| | |
| | | &:hover { |
| | | background-color: $base-sub-menu-hover !important; |
| | | } |
| | | } |
| | | |
| | | // ---- å½åéä¸èåé«äº® ---- |
| | | // åç¶ï¼Element ç¼è¯åºç .el-menu-item.is-active æ¯ä¸»è²æåï¼ |
| | | // å¨åæ ·æ¯éè²çæ·±è²ä¾§è¾¹æ ä¸å ä¹çä¸è§ â æ¹ä¸º"åçéå®åº + ç½å + 左侧亮æ¡" |
| | | & .el-menu-item.is-active { |
| | | position: relative; |
| | | color: #ffffff !important; |
| | | background-color: $opo-primary !important; |
| | | font-weight: 500; |
| | | |
| | | &::before { |
| | | content: ''; |
| | | position: absolute; |
| | | left: 0; |
| | | top: 0; |
| | | bottom: 0; |
| | | width: 3px; |
| | | background-color: #ffffff; |
| | | } |
| | | |
| | | &:hover { |
| | | background-color: $opo-primary !important; |
| | | } |
| | | } |
| | | |
| | | // ç¶çº§åç»åªæ¯"å
å«éä¸é¡¹"ï¼ç¨å¼±ä¸ç¹çåºè²ï¼é¿å
åå¶å项䏿 ·é |
| | | & .el-submenu.is-active > .el-submenu__title { |
| | | background-color: rgba(255, 255, 255, 0.1) !important; |
| | | color: #ffffff !important; |
| | | } |
| | | } |
| | | |
| | |
| | | .nest-menu .el-submenu>.el-submenu__title, |
| | | .el-menu-item { |
| | | &:hover { |
| | | // you can use $subMenuHover |
| | | background-color: rgba(0, 0, 0, 0.06) !important; |
| | | // æ·±è²èåç¨éç½è¦ç |
| | | background-color: rgba(255, 255, 255, 0.08) !important; |
| | | } |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // ============================================================ |
| | | // è¿è¡æ¶ä¸»é¢å±ï¼CSS åéæ¶è´¹æ¹ï¼ |
| | | // ------------------------------------------------------------ |
| | | // Element UI 2.x ç主é¢è²æ¯ SCSS ç¼è¯æå¸¸éï¼æ æ³å¨è¿è¡æ¶ä¿®æ¹ã |
| | | // æ¬æä»¶ä¸æ¹ Element æºç ï¼åª"éåç¨å°ä¸»è²çéæ©å¨"ï¼å¼æ¹ä¸º |
| | | // var(--opo-primary*)ï¼è¿äºåéç± utils/theme.js å¨åæ¢ç®è¤æ¶åå
¥ |
| | | // :rootï¼å æ¤æ¢è¤æ ééæ°ç¼è¯ãæ éå·æ°é¡µé¢ã |
| | | // |
| | | // è¦ç顺åºå¾å
³é®ï¼æ¬æä»¶å¿
é¡»å¨ element-ui ä¸ ruoyi.scss ä¹åå¼å
¥ |
| | | // ï¼è§ main.js ç import 顺åºï¼ã |
| | | // è¦çèå´ï¼æé®/龿¥/è¾å
¥/åéå¤éå¼å
³/Tabs/å页/è¡¨æ ¼/æ¥éª¤æ¡/ |
| | | // æ¥æ/䏿/å è½½/è¿åº¦ï¼å
¶ä½ç»ä»¶æéè¡¥å
ã |
| | | // ============================================================ |
| | | |
| | | $opo-fallback: #0E768F; |
| | | |
| | | // ---------- æé® ---------- |
| | | .el-button--primary { |
| | | background-color: var(--opo-primary, #{$opo-fallback}); |
| | | border-color: var(--opo-primary, #{$opo-fallback}); |
| | | color: #fff; |
| | | |
| | | &:hover, |
| | | &:focus { |
| | | background-color: var(--opo-primary-hover, #{$opo-fallback}); |
| | | border-color: var(--opo-primary-hover, #{$opo-fallback}); |
| | | color: #fff; |
| | | } |
| | | |
| | | &:active { |
| | | background-color: var(--opo-primary-active, #{$opo-fallback}); |
| | | border-color: var(--opo-primary-active, #{$opo-fallback}); |
| | | color: #fff; |
| | | } |
| | | |
| | | &.is-disabled, |
| | | &.is-disabled:hover, |
| | | &.is-disabled:focus, |
| | | &.is-disabled:active { |
| | | background-color: var(--opo-primary-light-5, #{$opo-fallback}); |
| | | border-color: var(--opo-primary-light-5, #{$opo-fallback}); |
| | | color: #fff; |
| | | } |
| | | |
| | | &.is-plain { |
| | | background-color: var(--opo-primary-light-9, #fff); |
| | | border-color: var(--opo-primary-light-5, #{$opo-fallback}); |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | |
| | | &:hover, |
| | | &:focus, |
| | | &:active { |
| | | background-color: var(--opo-primary, #{$opo-fallback}); |
| | | border-color: var(--opo-primary, #{$opo-fallback}); |
| | | color: #fff; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .el-button--text { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | |
| | | &:hover, |
| | | &:focus { |
| | | color: var(--opo-primary-hover, #{$opo-fallback}); |
| | | } |
| | | |
| | | &.is-disabled, |
| | | &.is-disabled:hover { |
| | | color: var(--opo-primary-light-5, #{$opo-fallback}); |
| | | } |
| | | } |
| | | |
| | | // é»è®¤æé® hover æ¶éåºåçè²ï¼åæ¥æ¯ä¸çç°ï¼ |
| | | .el-button--default:hover, |
| | | .el-button--default:focus { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | border-color: var(--opo-primary-light-5, #{$opo-fallback}); |
| | | background-color: var(--opo-primary-light-9, #fff); |
| | | } |
| | | |
| | | // ---------- 龿¥ ---------- |
| | | .el-link.el-link--primary { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | |
| | | &:hover { |
| | | color: var(--opo-primary-light-3, #{$opo-fallback}); |
| | | } |
| | | } |
| | | |
| | | // ---------- è¾å
¥ç±» ---------- |
| | | .el-input__inner:focus, |
| | | .el-textarea__inner:focus, |
| | | .el-input__inner:hover { |
| | | border-color: var(--opo-primary-light-5, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-input__inner:focus, |
| | | .el-textarea__inner:focus { |
| | | border-color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-select .el-input.is-focus .el-input__inner, |
| | | .el-select .el-input__inner:focus { |
| | | border-color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-select-dropdown__item.selected { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .el-input-number__decrease:hover, |
| | | .el-input-number__increase:hover { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | // ---------- åé / å¤é ---------- |
| | | .el-radio__input.is-checked .el-radio__inner, |
| | | .el-checkbox__input.is-checked .el-checkbox__inner, |
| | | .el-checkbox__input.is-indeterminate .el-checkbox__inner { |
| | | border-color: var(--opo-primary, #{$opo-fallback}); |
| | | background-color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-radio__input.is-checked + .el-radio__label, |
| | | .el-checkbox__input.is-checked + .el-checkbox__label { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-radio-button__orig-radio:checked + .el-radio-button__inner, |
| | | .el-checkbox-button__orig-radio:checked + .el-checkbox-button__inner { |
| | | background-color: var(--opo-primary, #{$opo-fallback}); |
| | | border-color: var(--opo-primary, #{$opo-fallback}); |
| | | box-shadow: -1px 0 0 0 var(--opo-primary, #{$opo-fallback}); |
| | | color: #fff; |
| | | } |
| | | |
| | | // ---------- å¼å
³ ---------- |
| | | .el-switch.is-checked .el-switch__core { |
| | | border-color: var(--opo-primary, #{$opo-fallback}); |
| | | background-color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | // ---------- Tabs ---------- |
| | | .el-tabs__item.is-active, |
| | | .el-tabs__item:hover { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-tabs__active-bar { |
| | | background-color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-tabs--border-card > .el-tabs__header .el-tabs__item.is-active { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | border-bottom-color: transparent; |
| | | } |
| | | |
| | | // ---------- å页 ---------- |
| | | .el-pager li.active, |
| | | .el-pager li:hover { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-pagination.is-background .el-pager li:not(.disabled).active { |
| | | background-color: var(--opo-primary, #{$opo-fallback}); |
| | | color: #fff; |
| | | } |
| | | |
| | | .el-pagination button:hover { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | // ---------- è¡¨æ ¼ ---------- |
| | | .el-table .ascending .sort-caret.ascending { |
| | | border-bottom-color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-table .descending .sort-caret.descending { |
| | | border-top-color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-table__body tr.current-row > td { |
| | | background-color: var(--opo-primary-light-9, #fff) !important; |
| | | } |
| | | |
| | | .el-table--enable-row-hover .el-table__body tr:hover > td { |
| | | background-color: var(--opo-primary-light-95, #f5f9fd) !important; |
| | | } |
| | | |
| | | // ---------- æ¥éª¤æ¡ ---------- |
| | | .el-step__head.is-process { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | border-color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-step__title.is-process { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .el-step__head.is-finish { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | border-color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-step__title.is-finish { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | // ---------- æ¥æ / æ¶é´ ---------- |
| | | .el-date-table td.today span { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | font-weight: 700; |
| | | } |
| | | |
| | | .el-date-table td.current:not(.disabled) span { |
| | | background-color: var(--opo-primary, #{$opo-fallback}); |
| | | color: #fff; |
| | | } |
| | | |
| | | .el-date-table td.available:hover { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-date-picker__header-label.active, |
| | | .el-date-picker__header-label:hover { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | // ---------- 䏿 / å¼¹åºèåï¼åªä½ç¨äºå¼¹åºå±ï¼é¿å
影忷±è²ä¾§è¾¹æ ï¼ ---------- |
| | | .el-dropdown-menu__item:not(.is-disabled):hover, |
| | | .el-dropdown-menu__item:focus { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | background-color: var(--opo-primary-light-9, #fff); |
| | | } |
| | | |
| | | .el-menu--popup .el-menu-item.is-active, |
| | | .el-menu--popup .el-menu-item:hover { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | // ---------- 级è ---------- |
| | | .el-cascader .el-input.is-focus .el-input__inner { |
| | | border-color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-cascader-node.in-active-path, |
| | | .el-cascader-node.is-active { |
| | | color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | // ---------- å è½½ / è¿åº¦ ---------- |
| | | .el-loading-spinner .path { |
| | | stroke: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-progress-bar__inner { |
| | | background-color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | // ---------- æ»å ---------- |
| | | .el-slider__bar { |
| | | background-color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| | | |
| | | .el-slider__button { |
| | | border-color: var(--opo-primary, #{$opo-fallback}); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /* ============================================================ |
| | | * 设计令ç · CSS èªå®ä¹å±æ§ |
| | | * è¿è¡æ¶æ¢è¤åªéæ¹å¨ --opo-primary åå
¶æ´¾çè²é¶ï¼ç± utils/theme.js 注å
¥ï¼ |
| | | * è¿éç弿¯"åçé"é»è®¤å¼ï¼JS 注å
¥ç inline style ä¼è¦ç :root |
| | | * ============================================================ */ |
| | | :root { |
| | | /* åçè²ï¼é»è®¤ï¼OPO_Logo åç¯éï¼ */ |
| | | --opo-primary: #0E768F; |
| | | --opo-primary-hover: #0D6A81; |
| | | --opo-primary-active: #0B5E72; |
| | | --opo-primary-light-3: #569FB1; |
| | | --opo-primary-light-5: #87BBC7; |
| | | --opo-primary-light-7: #B7D6DD; |
| | | --opo-primary-light-8: #CFE4E9; |
| | | --opo-primary-light-9: #E7F1F4; |
| | | --opo-primary-light-95: #F3F8F9; |
| | | --opo-primary-dark-2: #0B5E72; |
| | | |
| | | /* è¯ä¹è² */ |
| | | --opo-success: #67C23A; |
| | | --opo-success-light: #F0F9EB; |
| | | --opo-warning: #E6A23C; |
| | | --opo-warning-light: #FDF6EC; |
| | | --opo-danger: #CD1D4E; |
| | | --opo-danger-light: #FBEBEF; |
| | | --opo-info: #909399; |
| | | --opo-info-light: #F4F4F5; |
| | | |
| | | /* 䏿§è² */ |
| | | --opo-text-primary: #1F2937; |
| | | --opo-text-regular: #4B5563; |
| | | --opo-text-secondary: #6B7280; |
| | | --opo-text-placeholder: #9CA3AF; |
| | | --opo-border-base: #E5E7EB; |
| | | --opo-border-light: #F0F2F5; |
| | | --opo-border-lighter: #F5F7FA; |
| | | --opo-bg-page: #F5F7FA; |
| | | --opo-bg-card: #FFFFFF; |
| | | --opo-bg-hover: #F5F9FD; |
| | | --opo-bg-stripe: #FAFBFC; |
| | | --opo-bg-thead: #F5F7FA; |
| | | |
| | | /* è¡¨æ ¼æ¡çº¿ï¼æ¯éç¨è¾¹æ¡æ´æ·±ï¼ */ |
| | | --opo-table-border: #C8CFD8; |
| | | --opo-table-border-strong: #B7C0CC; |
| | | |
| | | /* ä¾§è¾¹æ */ |
| | | --opo-sidebar-bg: #0A4655; |
| | | --opo-sidebar-sub-bg: #083B47; |
| | | --opo-sidebar-hover: rgba(14, 118, 143, 0.28); |
| | | --opo-sidebar-text: rgba(255, 255, 255, 0.72); |
| | | --opo-sidebar-text-active: #FFFFFF; |
| | | |
| | | /* åå·ï¼2026-10-22 æ´ä½ä¸è°ä¸å·ï¼æ£æ 14â16ï¼ */ |
| | | --opo-font-size-display: 34px; |
| | | --opo-font-size-h1: 26px; |
| | | --opo-font-size-h2: 20px; |
| | | --opo-font-size-lg: 18px; |
| | | --opo-font-size-base: 16px; |
| | | --opo-font-size-sm: 14px; |
| | | --opo-font-size-xs: 13px; |
| | | --opo-font-size-menu: 16px; |
| | | |
| | | /* åä½ï¼ä¸è¦ç¨ -apple-system æå¤´ï¼Windows ä¸ä¼åæ Segoe UIï¼æ°åæ¾å°ï¼ */ |
| | | --opo-font-family-base: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软é
é»", |
| | | "Helvetica Neue", Arial, sans-serif; |
| | | --opo-font-family-number: "DIN Alternate", "SF Mono", "Roboto Mono", Consolas, "Courier New", monospace; |
| | | |
| | | /* é´è· */ |
| | | --opo-space-1: 4px; |
| | | --opo-space-2: 8px; |
| | | --opo-space-3: 12px; |
| | | --opo-space-4: 16px; |
| | | --opo-space-5: 24px; |
| | | --opo-space-6: 32px; |
| | | |
| | | /* åè§ */ |
| | | --opo-radius-sm: 2px; |
| | | --opo-radius-base: 4px; |
| | | --opo-radius-lg: 8px; |
| | | --opo-radius-pill: 999px; |
| | | |
| | | /* é´å½± */ |
| | | --opo-shadow-sm: 0 1px 2px rgba(16, 24, 40, 0.06); |
| | | --opo-shadow-md: 0 4px 12px rgba(16, 24, 40, 0.08); |
| | | --opo-shadow-lg: 0 12px 32px rgba(16, 24, 40, 0.12); |
| | | |
| | | /* æ§ä»¶é«åº¦ */ |
| | | --opo-control-height-small: 32px; |
| | | --opo-control-height-base: 36px; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // ============================================================ |
| | | // 设计令çï¼Design Tokensï¼Â· SCSS åé |
| | | // åçè²åèª src/assets/logo/OPO_Logo.png åç¯é #0E768F |
| | | // 说æè§ï¼æ¹æ¡-å端çé¢è§è§ä¼åæ¹æ¡.md |
| | | // 约å®ï¼ä¸å¡æ ·å¼ä¸å¾å¼ç¨è¿éçåéï¼ç¦æ¢åå裸è²å¼ |
| | | // ============================================================ |
| | | |
| | | // ---------- åçè²ï¼éï¼ ---------- |
| | | $opo-primary: #0E768F; |
| | | $opo-primary-hover: #0D6A81; |
| | | $opo-primary-active: #0B5E72; |
| | | $opo-primary-light-3: #569FB1; |
| | | $opo-primary-light-5: #87BBC7; |
| | | $opo-primary-light-7: #B7D6DD; |
| | | $opo-primary-light-8: #CFE4E9; |
| | | $opo-primary-light-9: #E7F1F4; |
| | | $opo-primary-light-95: #F3F8F9; |
| | | $opo-primary-dark-2: #0B5E72; |
| | | |
| | | // ---------- è¯ä¹è² ---------- |
| | | $opo-success: #67C23A; |
| | | $opo-success-light: #F0F9EB; |
| | | $opo-warning: #E6A23C; |
| | | $opo-warning-light: #FDF6EC; |
| | | $opo-danger: #CD1D4E; |
| | | $opo-danger-light: #FBEBEF; |
| | | $opo-info: #909399; |
| | | $opo-info-light: #F4F4F5; |
| | | |
| | | // ---------- 䏿§è² ---------- |
| | | $opo-text-primary: #1F2937; |
| | | $opo-text-regular: #4B5563; |
| | | $opo-text-secondary: #6B7280; |
| | | $opo-text-placeholder: #9CA3AF; |
| | | $opo-border-base: #E5E7EB; |
| | | $opo-border-light: #F0F2F5; |
| | | $opo-border-lighter: #F5F7FA; |
| | | $opo-bg-page: #F5F7FA; |
| | | $opo-bg-card: #FFFFFF; |
| | | $opo-bg-hover: #F5F9FD; |
| | | $opo-bg-stripe: #FAFBFC; |
| | | $opo-bg-thead: #F5F7FA; |
| | | |
| | | // ---------- è¡¨æ ¼æ¡çº¿ï¼æ¯éç¨è¾¹æ¡æ´æ·±ï¼ä¾¿äºçæ¸
åå/åè¡ï¼ ---------- |
| | | $opo-table-border: #C8CFD8; |
| | | $opo-table-border-strong: #B7C0CC; |
| | | |
| | | // ---------- ä¾§è¾¹æ ï¼ä¸åçéåæï¼ ---------- |
| | | $opo-sidebar-bg: #0A4655; |
| | | $opo-sidebar-sub-bg: #083B47; |
| | | $opo-sidebar-hover: rgba(14, 118, 143, 0.28); |
| | | $opo-sidebar-text: rgba(255, 255, 255, 0.72); |
| | | $opo-sidebar-text-active: #FFFFFF; |
| | | |
| | | // ---------- åå·ï¼2026-10-22 æ´ä½ä¸è°ä¸å·ï¼æ£æ 14â16ï¼ ---------- |
| | | $opo-font-size-display: 34px; |
| | | $opo-font-size-h1: 26px; |
| | | $opo-font-size-h2: 20px; |
| | | $opo-font-size-lg: 18px; |
| | | $opo-font-size-base: 16px; |
| | | $opo-font-size-sm: 14px; |
| | | $opo-font-size-xs: 13px; |
| | | $opo-font-size-menu: 16px; // ä¾§è¾¹æ èåï¼2026-10-22 ç± 18px åè°ä¸å·ï¼ |
| | | |
| | | // ---------- è¡é« ---------- |
| | | $opo-line-height-base: 22px; |
| | | $opo-line-height-heading: 1.3; |
| | | |
| | | // ---------- åä½ ---------- |
| | | // 注æï¼ä¸è¦ç¨ -apple-system / BlinkMacSystemFont æå¤´ââWindows ä¸ Chrome ä¼è§£ææ Segoe UIï¼ |
| | | // å¯¼è´æ°å/è±æèµ° Segoe UIï¼æ¯ä¸æç»ãæ¾å°ï¼ï¼ä¸æåé微软é
é»ï¼åä¸è¡éåå·è§æä¸ä¸è´ã |
| | | // è¿éæ"平尿åç¨ã没æåéå°å¾®è½¯é
é»"ç顺åºï¼ä¿è¯ä¸è±æåæã |
| | | $opo-font-family-base: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软é
é»", |
| | | "Helvetica Neue", Arial, sans-serif; |
| | | $opo-font-family-number: "DIN Alternate", "SF Mono", "Roboto Mono", Consolas, "Courier New", monospace; |
| | | |
| | | // ---------- é´è·ï¼8 ç¹æ
æ ¼ï¼ ---------- |
| | | $opo-space-1: 4px; |
| | | $opo-space-2: 8px; |
| | | $opo-space-3: 12px; |
| | | $opo-space-4: 16px; |
| | | $opo-space-5: 24px; |
| | | $opo-space-6: 32px; |
| | | |
| | | // ---------- åè§ ---------- |
| | | $opo-radius-sm: 2px; |
| | | $opo-radius-base: 4px; |
| | | $opo-radius-lg: 8px; |
| | | $opo-radius-pill: 999px; |
| | | |
| | | // ---------- é´å½± ---------- |
| | | $opo-shadow-sm: 0 1px 2px rgba(16, 24, 40, 0.06); |
| | | $opo-shadow-md: 0 4px 12px rgba(16, 24, 40, 0.08); |
| | | $opo-shadow-lg: 0 12px 32px rgba(16, 24, 40, 0.12); |
| | | |
| | | // ---------- æ§ä»¶é«åº¦ ---------- |
| | | $opo-control-height-small: 32px; |
| | | $opo-control-height-base: 36px; |
| | |
| | | // 设计令çï¼é¢è²/åå·/é´è·/åè§/é´å½±/åä½çå¯ä¸æ¥æºï¼ |
| | | @import './tokens.scss'; |
| | | |
| | | // base color |
| | | $blue:#324157; |
| | | $light-blue:#3A71A8; |
| | |
| | | |
| | | // é»è®¤èå主é¢é£æ ¼ |
| | | //èååä½é¢è² |
| | | $base-menu-color:#fff; |
| | | $base-menu-color:$opo-sidebar-text; |
| | | //éå®ååè¡¨æ¶æå¨å表çåä½é¢è² |
| | | // f4f4f5 |
| | | $base-menu-color-active:#fff; |
| | | //æ´ä½èæ¯é¢è²#0187B1 |
| | | $base-menu-background:#394d74; |
| | | $base-menu-color-active:$opo-sidebar-text-active; |
| | | //æ´ä½èæ¯é¢è²ï¼ä¸åçéåæçæ·±éï¼ |
| | | $base-menu-background:$opo-sidebar-bg; |
| | | //æ é¢åä½é¢è² |
| | | $base-logo-title-color: #ffffff; |
| | | // |
| | | $base-menu-light-color:rgba(0,0,0,.70); |
| | | $base-menu-light-background:#ffffff; |
| | | $base-logo-light-title-color: #001529; |
| | | //åè¡¨èæ¯é¢è²1f2d3d |
| | | $base-sub-menu-background:#394d74; |
| | | // |
| | | $base-sub-menu-hover:#a76ac3; |
| | | //åè¡¨èæ¯é¢è² |
| | | $base-sub-menu-background:$opo-sidebar-sub-bg; |
| | | //åè忬åè²ï¼åæ¥æ¯æ å
³èçç´«è² #a76ac3ï¼ |
| | | $base-sub-menu-hover:$opo-sidebar-hover; |
| | | |
| | | // èªå®ä¹æè²èå飿 ¼ |
| | | /** |
| | |
| | | $base-sub-menu-hover:#001528; |
| | | */ |
| | | |
| | | $base-sidebar-width: 200px; |
| | | $base-sidebar-width: 220px; |
| | | |
| | | // the :export directive is the magic sauce for webpack |
| | | // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass |
| | |
| | | <template> |
| | | <el-color-picker |
| | | v-model="theme" |
| | | :predefine="['#409EFF', '#1890ff', '#304156','#212121','#11a983', '#13c2c2', '#6959CD', '#f5222d', ]" |
| | | :predefine="['#0E768F', '#CD1D4E', '#409EFF', '#1B8E70', '#7B61FF', '#E6843C', '#304156', '#212121']" |
| | | class="theme-picker" |
| | | popper-class="theme-picker-dropdown" |
| | | /> |
| | |
| | | |
| | | methods: { |
| | | async setTheme(val) { |
| | | const oldVal = this.chalk ? this.theme : ORIGINAL_THEME |
| | | if (typeof val !== 'string') return |
| | | // å
éç¥å¤å±ï¼ä¸»é¢è²ç± CSS åéå±ï¼utils/theme.jsï¼ç«å³çæã |
| | | // 忥çå®ç°è¦ç CDN æå theme-chalk å®æåæ emitï¼å
ç½æä¸å° unpkg |
| | | // æ¶ Promise æ°¸ä¸ resolveï¼å¯¼è´"æ¹ä¸»é¢æ²¡æä»»ä½ååº"ã |
| | | this.$emit('change', val) |
| | | const oldVal = this.chalk ? this.theme : ORIGINAL_THEME |
| | | const themeCluster = this.getThemeCluster(val.replace('#', '')) |
| | | const originalCluster = this.getThemeCluster(oldVal.replace('#', '')) |
| | | |
| | |
| | | if (typeof innerText !== 'string') return |
| | | style.innerText = this.updateStyle(innerText, originalCluster, themeCluster) |
| | | }) |
| | | |
| | | this.$emit('change', val) |
| | | }, |
| | | |
| | | updateStyle(style, oldCluster, newCluster) { |
| | |
| | | getCSSString(url, variable) { |
| | | return new Promise(resolve => { |
| | | const xhr = new XMLHttpRequest() |
| | | const done = () => resolve() |
| | | xhr.onreadystatechange = () => { |
| | | if (xhr.readyState === 4 && xhr.status === 200) { |
| | | this[variable] = xhr.responseText.replace(/@font-face{[^}]+}/, '') |
| | | if (xhr.readyState === 4) { |
| | | if (xhr.status === 200) { |
| | | this[variable] = xhr.responseText.replace(/@font-face{[^}]+}/, '') |
| | | } |
| | | resolve() |
| | | } |
| | | } |
| | | // å
ç½/æ å¤ç½æ¶å¿«é失败ï¼é¿å
Promise æ¬æå¯¼è´æ¢è¤å¡ä½ |
| | | xhr.onerror = done |
| | | xhr.ontimeout = done |
| | | xhr.timeout = 4000 |
| | | xhr.open('GET', url) |
| | | xhr.send() |
| | | }) |
| | |
| | | <span>主é¢é¢è²</span> |
| | | <theme-picker style="float: right;height: 26px;margin: -3px 8px 0 0;" @change="themeChange" /> |
| | | </div> |
| | | |
| | | <div class="drawer-item"> |
| | | <span>é¢è®¾ç®è¤</span> |
| | | <div class="opo-preset-list"> |
| | | <span |
| | | v-for="p in presets" |
| | | :key="p.color" |
| | | class="opo-preset-item" |
| | | :class="{ 'is-active': isCurrent(p.color) }" |
| | | :style="{ backgroundColor: p.color }" |
| | | :title="p.name" |
| | | @click="themeChange(p.color)" |
| | | /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <el-divider/> |
| | |
| | | |
| | | <script> |
| | | import ThemePicker from '@/components/ThemePicker' |
| | | import { PRESETS, applyTheme, setStoredTheme } from '@/utils/theme' |
| | | |
| | | export default { |
| | | components: { ThemePicker }, |
| | | data() { |
| | | return { |
| | | theme: this.$store.state.settings.theme, |
| | | sideTheme: this.$store.state.settings.sideTheme |
| | | sideTheme: this.$store.state.settings.sideTheme, |
| | | presets: PRESETS |
| | | }; |
| | | }, |
| | | computed: { |
| | |
| | | }, |
| | | }, |
| | | methods: { |
| | | isCurrent(color) { |
| | | return !!this.theme && String(this.theme).toUpperCase() === String(color).toUpperCase(); |
| | | }, |
| | | themeChange(val) { |
| | | this.$store.dispatch('settings/changeSetting', { |
| | | key: 'theme', |
| | | value: val |
| | | }) |
| | | this.theme = val; |
| | | // ç«å³çæå¹¶è®°ä½ï¼ä¸ä¾èµ ThemePicker ä» CDN æå theme-chalk |
| | | applyTheme(val); |
| | | setStoredTheme(val); |
| | | }, |
| | | handleTheme(val) { |
| | | this.$store.dispatch('settings/changeSetting', { |
| | |
| | | .drawer-switch { |
| | | float: right |
| | | } |
| | | |
| | | // é¢è®¾ç®è¤è²å |
| | | .opo-preset-list { |
| | | display: flex; |
| | | align-items: center; |
| | | flex-wrap: wrap; |
| | | margin-top: 8px; |
| | | } |
| | | |
| | | .opo-preset-item { |
| | | display: inline-block; |
| | | width: 22px; |
| | | height: 22px; |
| | | margin-right: 10px; |
| | | border-radius: 4px; |
| | | cursor: pointer; |
| | | border: 2px solid transparent; |
| | | box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.08); |
| | | |
| | | &.is-active { |
| | | border-color: #1F2937; |
| | | box-shadow: 0 0 0 2px rgba(31, 41, 55, 0.18); |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}"> |
| | | <div :class="classObj" class="app-wrapper"> |
| | | <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/> |
| | | <sidebar class="sidebar-container"/> |
| | | <div :class="{hasTagsView:needTagsView}" class="main-container"> |
| | |
| | | import ResizeMixin from './mixin/ResizeHandler' |
| | | import { mapState } from 'vuex' |
| | | import variables from '@/assets/styles/variables.scss' |
| | | import { applyTheme, setStoredTheme } from '@/utils/theme' |
| | | |
| | | export default { |
| | | name: 'Layout', |
| | |
| | | return variables; |
| | | } |
| | | }, |
| | | created() { |
| | | // è¿å
¥ Layout æ¶åºç¨å½å主é¢è²ï¼å¹¶è®°ä½éæ©ï¼ |
| | | this.applyCurrentTheme() |
| | | }, |
| | | watch: { |
| | | theme(val) { |
| | | this.applyCurrentTheme() |
| | | setStoredTheme(val) |
| | | } |
| | | }, |
| | | methods: { |
| | | applyCurrentTheme() { |
| | | applyTheme(this.theme) |
| | | }, |
| | | handleClickOutside() { |
| | | this.$store.dispatch('app/closeSideBar', { withoutAnimation: false }) |
| | | } |
| | |
| | | import Cookies from 'js-cookie' |
| | | |
| | | import Element from 'element-ui' |
| | | import '@/assets/styles/tokens.css' // 设计令çï¼CSS åéï¼ä¾è¿è¡æ¶æ¢è¤ï¼ |
| | | import './assets/styles/element-variables.scss' |
| | | |
| | | import '@/assets/styles/index.scss' // global css |
| | | import '@/assets/styles/ruoyi.scss' // ruoyi css |
| | | // è¿è¡æ¶ä¸»é¢å± + ç»ä»¶é»è®¤å¤è§ï¼å¿
é¡»æäº element-ui ä¸ ruoyi.scssï¼å¦åè¦çä¸çæ |
| | | import '@/assets/styles/theme-runtime.scss' |
| | | import '@/assets/styles/element-override.scss' |
| | | import App from './App' |
| | | import store from './store' |
| | | import router from './router' |
| | |
| | | import { getConfigKey } from "@/api/system/config"; |
| | | import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi"; |
| | | import dataV from '@jiaminghi/data-view';//dataV |
| | | // 主é¢è²è¿è¡æ¶ï¼CSS åéæ³¨å
¥ï¼ |
| | | import { applyTheme, getStoredTheme, DEFAULT_PRIMARY } from '@/utils/theme' |
| | | // å页ç»ä»¶ |
| | | import Pagination from "@/components/Pagination"; |
| | | // èªå®ä¹è¡¨æ ¼å·¥å
·ç»ä»¶ |
| | |
| | | */ |
| | | |
| | | Vue.use(Element, { |
| | | size: Cookies.get('size') || 'medium' // set element-ui default size |
| | | size: Cookies.get('size') || 'small' // set element-ui default sizeï¼å mediumï¼æ¹ä¸º small æåä¿¡æ¯å¯åº¦ï¼ |
| | | }) |
| | | |
| | | // å¯å¨å³åºç¨å·²ä¿åç主é¢è²ï¼ç»å½é¡µçä¸ä½¿ç¨ Layout ç页é¢ä¹è½çæï¼ |
| | | applyTheme(getStoredTheme() || DEFAULT_PRIMARY) |
| | | |
| | | Vue.config.productionTip = false |
| | | |
| | | new Vue({ |
| | |
| | | sideTheme: 'theme-dark', |
| | | |
| | | /** |
| | | * æ¯å¦ç³»ç»å¸å±é
ç½® |
| | | * æ¯å¦ç³»ç»å¸å±é
ç½®ï¼å³ä¸è§é½¿è½®é¢æ¿ï¼ |
| | | * å为 falseï¼å¯¼è´"主é¢é¢è² / é¢è®¾ç®è¤"å
¥å£å¯¹ç¨æ·ä¸å¯è§ â æ¹ä¸º true |
| | | */ |
| | | showSettings: false, |
| | | showSettings: true, |
| | | |
| | | /** |
| | | * æ¯å¦æ¾ç¤ºé¡¶é¨å¯¼èª |
| | |
| | | * The default is only used in the production env |
| | | * If you want to also use it in dev, you can pass ['production', 'development'] |
| | | */ |
| | | errorLog: 'production', |
| | | // vscodeé»è®¤å¯ç¨äºæ ¹æ®æä»¶ç±»åèªå¨è®¾ç½®tabsizeçé项 |
| | | |
| | | "editor.detectIndentation": false, |
| | | |
| | | // éæ°è®¾å®tabsize |
| | | |
| | | "editor.tabSize": 2, |
| | | |
| | | // #æ¯æ¬¡ä¿åçæ¶åèªå¨æ ¼å¼å |
| | | |
| | | "editor.formatOnSave": true, |
| | | |
| | | // #æ¯æ¬¡ä¿åçæ¶åå°ä»£ç æeslintæ ¼å¼è¿è¡ä¿®å¤ |
| | | |
| | | "eslint.autoFixOnSave": true, |
| | | |
| | | "tslint.autoFixOnSave": true, |
| | | |
| | | // æ·»å vue æ¯æ |
| | | |
| | | "eslint.validate": [ |
| | | |
| | | "javascript", |
| | | |
| | | "javascriptreact", |
| | | |
| | | { |
| | | |
| | | "language": "vue", |
| | | |
| | | "autoFix": true |
| | | |
| | | } |
| | | |
| | | ], |
| | | |
| | | // #廿代ç ç»å°¾çåå· |
| | | |
| | | "prettier.semi": true, |
| | | |
| | | // #使ç¨å¸¦å¼å·æ¿ä»£åå¼å· |
| | | |
| | | "prettier.singleQuote": true, |
| | | |
| | | // #è®©å½æ°(å)ååé¢çæ¬å·ä¹é´å ä¸ªç©ºæ ¼ |
| | | |
| | | "javascript.format.insertSpaceBeforeFunctionParenthesis": true, |
| | | |
| | | // #è¿ä¸ªæç¨æ·èªèº«ä¹ æ¯éæ© |
| | | |
| | | "vetur.format.defaultFormatter.html": "js-beautify-html", |
| | | |
| | | // #让vueä¸çjsæç¼è¾å¨èªå¸¦çtsæ ¼å¼è¿è¡æ ¼å¼å |
| | | |
| | | "vetur.format.defaultFormatter.js": "vscode-typescript", |
| | | |
| | | "vetur.format.defaultFormatterOptions": { |
| | | |
| | | "js-beautify-html": { |
| | | |
| | | "wrap_attributes": "force-aligned" |
| | | |
| | | // #vueç»ä»¶ä¸htmlä»£ç æ ¼å¼åæ ·å¼ |
| | | |
| | | } |
| | | |
| | | }, |
| | | |
| | | // æ ¼å¼åstylus, éå®è£
Manta's Stylus Supremacyæä»¶ |
| | | |
| | | "stylusSupremacy.insertColons": false, // æ¯å¦æå
¥åå· |
| | | |
| | | "stylusSupremacy.insertSemicolons": false, // æ¯å¦æå
¥å好 |
| | | |
| | | "stylusSupremacy.insertBraces": false, // æ¯å¦æå
¥å¤§æ¬å· |
| | | |
| | | "stylusSupremacy.insertNewLineAroundImports": false, // importä¹åæ¯å¦æ¢è¡ |
| | | |
| | | "stylusSupremacy.insertNewLineAroundBlocks": false, |
| | | |
| | | "javascript.format.insertSpaceAfterConstructor": true // ä¸¤ä¸ªéæ©å¨ä¸æ¯å¦æ¢è¡ |
| | | errorLog: 'production' |
| | | } |
| | | |
| | |
| | | import defaultSettings from '@/settings' |
| | | import { DEFAULT_PRIMARY, getStoredTheme } from '@/utils/theme' |
| | | |
| | | const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dynamicTitle } = defaultSettings |
| | | |
| | | const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || '' |
| | | const state = { |
| | | title: '', |
| | | theme: storageSetting.theme || '#409EFF', |
| | | theme: storageSetting.theme || getStoredTheme() || DEFAULT_PRIMARY, |
| | | sideTheme: storageSetting.sideTheme || sideTheme, |
| | | showSettings: showSettings, |
| | | topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav, |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * æ¥éåéä»¶æä»¶åè§èæ ¡éªï¼2026-10-15ï¼ |
| | | * |
| | | * ä¸å¡å£å¾ï¼ä¸å¡æ¹ç¡®è®¤ï¼ï¼ |
| | | * 1. å¿
é¡»å
å«ä¸æï¼è³å° 1 个æ±åï¼ââ"为æ¹ä¾¿æ¥éªéä»¶ï¼è¯·ç¨ä¸æè§èå½åéä»¶ï¼" |
| | | * 2. 廿æ©å±ååçä¸»å¹²ï¼æå符æ°è®¡ç®ä¸è½è¶
è¿ 20 个åââ"为æ¹ä¾¿æ¥éªéä»¶ï¼éä»¶ååé¿åº¦ä¸è½è¶
è¿20个åï¼" |
| | | * 3. ä¸è½å
å«ç©ºæ ¼å / \ : * ? " < > | # % çç¹æ®å符 |
| | | * 4. å䏿ç»è¡å
ä¸è½éåï¼æ¯è¾æ¶å¿½ç¥æ©å±å大å°åä¸é¦å°¾ç©ºæ ¼ï¼ |
| | | * |
| | | * 使ç¨åºæ¯ï¼ |
| | | * - ä¸ä¼ æååè°ï¼ä¸åæ ¼ â å¼¹æç¤ºä¸ä¸å å
¥åè¡¨ï¼ |
| | | * - ä¿å/æäº¤åï¼è°ç¨ checkDetails ç»ä¸æ ¡éªï¼ä¸åæ ¼åæ¦ä¸ä¸å
许ä¿åï¼ |
| | | * - å端ä¿åæ¥å£å¦æåå£å¾çäºæ¬¡æ ¡éªï¼é²æ¢ç»è¿å端ï¼ã |
| | | */ |
| | | |
| | | /** 主干ï¼å»æ©å±åï¼æå¤§åç¬¦æ° */ |
| | | export const MAX_MAIN_LENGTH = 20; |
| | | |
| | | /** æ±å */ |
| | | const RE_CHINESE = /[\u4e00-\u9fa5]/; |
| | | |
| | | /** éæ³å符ï¼ç©ºæ ¼ï¼å«å类空ç½ï¼+ / \ : * ? " < > | # % */ |
| | | const RE_ILLEGAL = /[\s/\\:*?"<>|#%]/; |
| | | |
| | | export const MSG_NO_CHINESE = "为æ¹ä¾¿æ¥éªéä»¶ï¼è¯·ç¨ä¸æè§èå½åéä»¶ï¼"; |
| | | export const MSG_TOO_LONG = "为æ¹ä¾¿æ¥éªéä»¶ï¼éä»¶ååé¿åº¦ä¸è½è¶
è¿20个åï¼"; |
| | | export const MSG_ILLEGAL = '为æ¹ä¾¿æ¥éªéä»¶ï¼éä»¶åä¸è½å
å«ç©ºæ ¼å / \\ : * ? " < > | # % çç¹æ®å符ï¼'; |
| | | export const MSG_DUPLICATE = "为æ¹ä¾¿æ¥éªéä»¶ï¼åä¸è¡å
ä¸è½æéåçéä»¶ï¼"; |
| | | |
| | | /** |
| | | * å主干ï¼å»ææåä¸ä¸ªæ©å±åï¼ |
| | | * @param {string} fileName åå§æä»¶å |
| | | * @returns {string} 主干 |
| | | */ |
| | | export function mainName(fileName) { |
| | | const s = (fileName || "").trim(); |
| | | const i = s.lastIndexOf("."); |
| | | return i > 0 ? s.substring(0, i) : s; |
| | | } |
| | | |
| | | /** |
| | | * å个æä»¶åæ ¡éª |
| | | * @param {string} fileName åå§æä»¶å |
| | | * @returns {{ok: boolean, msg: string, main: string}} |
| | | */ |
| | | export function checkFileName(fileName) { |
| | | const name = (fileName || "").trim(); |
| | | if (!name) { |
| | | return { ok: false, msg: MSG_NO_CHINESE, main: "" }; |
| | | } |
| | | if (RE_ILLEGAL.test(name)) { |
| | | return { ok: false, msg: MSG_ILLEGAL, main: mainName(name) }; |
| | | } |
| | | const main = mainName(name); |
| | | if (!RE_CHINESE.test(main)) { |
| | | return { ok: false, msg: MSG_NO_CHINESE, main }; |
| | | } |
| | | // æå符æ°è®¡ï¼ç¨æ©å±è¿ç®ç¬¦æç ç¹è®¡æ°ï¼ä¸æ/忝/æ°å/å
¨è§å计 1ï¼ |
| | | if ([...main].length > MAX_MAIN_LENGTH) { |
| | | return { ok: false, msg: MSG_TOO_LONG, main }; |
| | | } |
| | | return { ok: true, msg: "", main }; |
| | | } |
| | | |
| | | /** åé件项æ¾ç¤ºåï¼ä¸å页é¢å段åå¯è½æ¯ name / fileNameï¼åä¸å°å°±è¿å空串表示"ä¸å¤æ"ï¼ */ |
| | | function itemName(item) { |
| | | if (!item) return ""; |
| | | if (typeof item === "string") return item; |
| | | return item.name || item.fileName || ""; |
| | | } |
| | | |
| | | /** |
| | | * ä¸ç»éä»¶æ ¡éªï¼å«åè¡éåï¼ |
| | | * @param {Array} list éä»¶æ°ç»ï¼å
ç´ å½¢å¦ {name, url} |
| | | * @returns {{ok: boolean, msg: string, index: number}} |
| | | */ |
| | | export function checkFileList(list) { |
| | | const arr = list || []; |
| | | const seen = {}; |
| | | for (let i = 0; i < arr.length; i++) { |
| | | const name = itemName(arr[i]); |
| | | if (!name) continue; // åä¸å°åæä»¶ååä¸å¤æï¼é¿å
è¯¯æ¦ |
| | | const r = checkFileName(name); |
| | | if (!r.ok) { |
| | | return { ok: false, msg: r.msg, index: i }; |
| | | } |
| | | const key = name.trim().toLowerCase(); |
| | | if (seen[key]) { |
| | | return { ok: false, msg: MSG_DUPLICATE, index: i }; |
| | | } |
| | | seen[key] = true; |
| | | } |
| | | return { ok: true, msg: "", index: -1 }; |
| | | } |
| | | |
| | | /** |
| | | * ä¿ååæ ¡éªæ´åæç»ï¼å票 + éä»¶ï¼ |
| | | * @param {Array} details æç»è¡æ°ç»ï¼è¡å
å« invoicefilesList / annexfilesListï¼æ°ç»ï¼ |
| | | * @returns {{ok: boolean, msg: string}} |
| | | */ |
| | | export function checkDetails(details) { |
| | | const rows = details || []; |
| | | for (let i = 0; i < rows.length; i++) { |
| | | const groups = [ |
| | | { label: "å票", list: rows[i] && rows[i].invoicefilesList }, |
| | | { label: "éä»¶", list: rows[i] && rows[i].annexfilesList } |
| | | ]; |
| | | for (let g = 0; g < groups.length; g++) { |
| | | const arr = groups[g].list || []; |
| | | const seen = {}; |
| | | for (let j = 0; j < arr.length; j++) { |
| | | const name = itemName(arr[j]); |
| | | if (!name) continue; |
| | | const r = checkFileName(name); |
| | | if (!r.ok) { |
| | | return { |
| | | ok: false, |
| | | msg: |
| | | "éä»¶æä»¶åä¸ç¬¦åè¦æ±ï¼æ æ³ä¿åï¼ç¬¬" + (i + 1) + "è¡ç¬¬" + (j + 1) + |
| | | "个ï¼" + name + "ï¼ââ" + r.msg |
| | | }; |
| | | } |
| | | const key = name.trim().toLowerCase(); |
| | | if (seen[key]) { |
| | | return { |
| | | ok: false, |
| | | msg: |
| | | "éä»¶æä»¶åä¸ç¬¦åè¦æ±ï¼æ æ³ä¿åï¼ç¬¬" + (i + 1) + "è¡ç¬¬" + (j + 1) + |
| | | "个ï¼" + name + "ï¼ââ" + MSG_DUPLICATE |
| | | }; |
| | | } |
| | | seen[key] = true; |
| | | } |
| | | } |
| | | } |
| | | return { ok: true, msg: "" }; |
| | | } |
| | | |
| | | /** |
| | | * æ´åéææéä»¶ï¼ä¸åè¡ï¼çæå¹³æ ¡éªï¼ä¾åªæå个æä»¶å表ç页é¢ä½¿ç¨ |
| | | * @param {Array} lists å¤ä¸ªéä»¶æ°ç» |
| | | * @returns {{ok: boolean, msg: string}} |
| | | */ |
| | | export function checkAllLists(lists) { |
| | | const all = lists || []; |
| | | for (let i = 0; i < all.length; i++) { |
| | | const r = checkFileList(all[i]); |
| | | if (!r.ok) { |
| | | return { ok: false, msg: r.msg }; |
| | | } |
| | | } |
| | | return { ok: true, msg: "" }; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * éé¢è®¡ç®å·¥å
· |
| | | * |
| | | * èæ¯ï¼æ¬ç³»ç»éé¢ä¸å¾ä»¥ãå
ã为åä½ãä¿ç 2 ä½å°æ°ï¼å±è´¢å¡æ°æ®ã |
| | | * JS ç Number æ¯ IEEE-754 å精度浮ç¹ï¼ç´æ¥åå åä¹ä¼å¼å
¥äºè¿å¶èå
¥è¯¯å·®ï¼ |
| | | * å
¸å表ç°ï¼ |
| | | * 0.1 + 0.2 -> 0.30000000000000004 |
| | | * 1.1 * 3 -> 3.3000000000000003 |
| | | * 0.3 - 0.2 - 0.1 -> -2.7755575615628914e-17 ï¼éè´¹/æ£ç¨ç¸ååæ®çå°¾å·®ï¼ |
| | | * è¿ç±»å°¾å·®å¯¼è´ãå计对ä¸ä¸ããé颿¾ç¤ºä¸º -0ããç¸çå¤æå¤±è´¥ãç线ä¸é®é¢ï¼ |
| | | * ä¸ä¼éåæ®æµè½¬è¢«åå
¥æ°æ®åºï¼äºåé¾ä»¥è¿½æº¯ã |
| | | * |
| | | * å æ¤ï¼ææéé¢è¿ç®ç»ä¸èµ°æ¬æ¨¡åï¼ç¦æ¢ç´æ¥å¯¹éé¢ä½¿ç¨ + - * / ä¸ parseFloat ç´¯å ã |
| | | * å
é¨åºäº decimal.jsï¼package.json å·²å¼å
¥ï¼ï¼ä¿è¯åè¿å¶ç²¾ç¡®è¿ç®ã |
| | | * |
| | | * ç¨æ³ç¤ºä¾ï¼ |
| | | * import { moneySum, moneyMul, moneySub, moneyRound, moneyEq } from "@/utils/money"; |
| | | * |
| | | * // ç´¯å æç»ï¼è¿æ»¤éæ°åä¸ç©ºå¼ï¼ä¸ä¼æ NaN ä¼ æç»åè®¡ï¼ |
| | | * const total = moneySum(this.rbDetails, "amount"); |
| | | * |
| | | * // åä»· Ã æ°é |
| | | * const preTax = moneyMul(row.price, row.quantity); |
| | | * |
| | | * // ç¨å - æ£ç¨ = ç¨å |
| | | * const afterTax = moneySub(row.amount, row.taxamount); |
| | | * |
| | | * // è½åº/å±ç¤ºåç»ä¸ä¿ç 2 ä½ï¼åèäºå
¥ï¼ |
| | | * this.form.amountrequested = moneyRound(total); |
| | | * |
| | | * // é颿¯è¾ï¼å¿ç¨ == / === æ parseFloat åç¸åï¼ |
| | | * if (!moneyEq(sumOfPayees, this.form.amountrequested)) { ... } |
| | | */ |
| | | import Decimal from 'decimal.js' |
| | | |
| | | /** éé¢ä¿çå°æ°ä½ */ |
| | | export const MONEY_SCALE = 2 |
| | | |
| | | /** |
| | | * 转为 Decimalï¼æ æ³è¯å«çå¼ï¼ç©ºä¸²/undefined/null/NaN/éæ°åï¼ä¸å¾æ 0 å¤çã |
| | | * æ 0 å¤çèéæéï¼æ¯ä¸ºäºä¿ææ¢æé¡µé¢ã!isNaN(parseFloat(x)) æç´¯å ãçè¡ä¸ºï¼ |
| | | * åæ¶é¿å
NaN æ±¡ææ´æ¡å计é¾ã |
| | | * |
| | | * @param {string|number|Decimal|null|undefined} value |
| | | * @returns {Decimal} |
| | | */ |
| | | export function toMoney(value) { |
| | | if (value === null || value === undefined || value === '') { |
| | | return new Decimal(0) |
| | | } |
| | | if (value instanceof Decimal) { |
| | | return value |
| | | } |
| | | let d |
| | | try { |
| | | d = new Decimal(value) |
| | | } catch (e) { |
| | | return new Decimal(0) |
| | | } |
| | | return d.isFinite() ? d : new Decimal(0) |
| | | } |
| | | |
| | | /** |
| | | * 夿æ¯å¦ä¸ºææéé¢ï¼å¯åä¸è®¡ç®ï¼ãç¨äºåæ¬ !isNaN(parseFloat(x)) çæ ¡éªåºæ¯ã |
| | | * |
| | | * @param {*} value |
| | | * @returns {boolean} |
| | | */ |
| | | export function isValidMoney(value) { |
| | | if (value === null || value === undefined || value === '') { |
| | | return false |
| | | } |
| | | if (value instanceof Decimal) { |
| | | return value.isFinite() |
| | | } |
| | | if (typeof value === 'number') { |
| | | return Number.isFinite(value) |
| | | } |
| | | const s = String(value).trim() |
| | | if (s === '') { |
| | | return false |
| | | } |
| | | try { |
| | | return new Decimal(s).isFinite() |
| | | } catch (e) { |
| | | return false |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * ç´¯å æ±åã |
| | | * |
| | | * @param {Array} list å¾
ç´¯å çæ°ç» |
| | | * @param {string|Function} [selector] åéé¢çæ¹å¼ï¼ |
| | | * å符串 -> å该项çè¯¥å±æ§åï¼å¦ "amount"ï¼ |
| | | * 彿° -> ç¨è¿åå¼ï¼å¦ (item) => item.detail && item.detail.amountï¼ |
| | | * çç¥ -> ç´æ¥ç´¯å æ°ç»å
ç´ æ¬èº«ã |
| | | * @returns {number} æ±åç»æï¼Numberï¼ä¾¿äºèµå¼ç»è¡¨ååæ®µï¼ |
| | | */ |
| | | export function moneySum(list, selector) { |
| | | if (!Array.isArray(list) || list.length === 0) { |
| | | return 0 |
| | | } |
| | | let acc = new Decimal(0) |
| | | for (let i = 0; i < list.length; i++) { |
| | | const raw = |
| | | selector === undefined |
| | | ? list[i] |
| | | : typeof selector === 'function' |
| | | ? selector(list[i]) |
| | | : list[i][selector] |
| | | acc = acc.plus(toMoney(raw)) |
| | | } |
| | | return acc.toNumber() |
| | | } |
| | | |
| | | /** |
| | | * æ±ååä¿ç 2 ä½å°æ°ï¼ä¼å
å¨å±ç¤º/è½åºæ¶ä½¿ç¨ï¼ã |
| | | */ |
| | | export function moneySumRound(list, selector) { |
| | | return roundNumber(moneySum(list, selector)) |
| | | } |
| | | |
| | | /** |
| | | * ç²¾ç¡®å æ³ãæ¯æå¤åæ°ææ°ç»ï¼moneyAdd(1.1, 2.2) / moneyAdd([1.1, 2.2]) |
| | | */ |
| | | export function moneyAdd(...args) { |
| | | const list = args.length === 1 && Array.isArray(args[0]) ? args[0] : args |
| | | let acc = new Decimal(0) |
| | | list.forEach((v) => { |
| | | acc = acc.plus(toMoney(v)) |
| | | }) |
| | | return acc.toNumber() |
| | | } |
| | | |
| | | /** |
| | | * ç²¾ç¡®åæ³ a - bï¼å¯ä¼ å¤ä¸ªï¼a - b - cï¼ |
| | | */ |
| | | export function moneySub(a, ...rest) { |
| | | let acc = toMoney(a) |
| | | rest.forEach((v) => { |
| | | acc = acc.minus(toMoney(v)) |
| | | }) |
| | | return acc.toNumber() |
| | | } |
| | | |
| | | /** |
| | | * ç²¾ç¡®ä¹æ³ï¼åä»· à æ°éãéé¢ Ã ç¨çï¼ |
| | | */ |
| | | export function moneyMul(a, ...rest) { |
| | | let acc = toMoney(a) |
| | | rest.forEach((v) => { |
| | | acc = acc.times(toMoney(v)) |
| | | }) |
| | | return acc.toNumber() |
| | | } |
| | | |
| | | /** |
| | | * ç²¾ç¡®é¤æ³ï¼éé¢ Ã· æ°éï¼ï¼divideBy 为 0 æ¶è¿å 0ï¼ä¸äº§ç Infinity |
| | | */ |
| | | export function moneyDiv(a, b) { |
| | | const divisor = toMoney(b) |
| | | if (divisor.isZero()) { |
| | | return 0 |
| | | } |
| | | return toMoney(a).div(divisor).toNumber() |
| | | } |
| | | |
| | | /** |
| | | * é颿¯å¦ç¸çï¼åè¿å¶ç²¾ç¡®æ¯è¾ï¼ä¸åæµ®ç¹å°¾å·®å½±åï¼ã |
| | | * ä¼èªå¨å½ä¸åå° 2 ä½ï¼é¿å
100 ä¸ 100.001 è¿ç±»è¾¹ç误å¤ã |
| | | * |
| | | * @returns {boolean} |
| | | */ |
| | | export function moneyEq(a, b) { |
| | | return roundDecimal(a).eq(roundDecimal(b)) |
| | | } |
| | | |
| | | /** |
| | | * éé¢å¤§å°æ¯è¾ï¼a > b è¿å 1ï¼a < b è¿å -1ï¼ç¸çè¿å 0 |
| | | */ |
| | | export function moneyCmp(a, b) { |
| | | return roundDecimal(a).cmp(roundDecimal(b)) |
| | | } |
| | | |
| | | /** |
| | | * ä¿ç 2 ä½å°æ°å¹¶è¿å Numberï¼åèäºå
¥ï¼ROUND_HALF_UPï¼ã |
| | | * ç¨äºèµå¼ç»è¡¨ååæ®µãåä¸å端交äºã |
| | | * |
| | | * @param {*} value |
| | | * @param {number} [scale=2] |
| | | * @returns {number} |
| | | */ |
| | | export function moneyRound(value, scale = MONEY_SCALE) { |
| | | return roundDecimal(value, scale).toNumber() |
| | | } |
| | | |
| | | /** |
| | | * ä¿ç 2 ä½å°æ°å¹¶è¿åå符串ï¼ç¨äºéé¢å±ç¤ºï¼é¿å
大颿¶åºç°ç§å¦è®¡æ°æ³ï¼ã |
| | | * |
| | | * @param {*} value |
| | | * @param {number} [scale=2] |
| | | * @returns {string} |
| | | */ |
| | | export function moneyText(value, scale = MONEY_SCALE) { |
| | | return roundDecimal(value, scale).toFixed(scale) |
| | | } |
| | | |
| | | /** |
| | | * ä¿ç 2 ä½å°æ°å¹¶è¿å Decimalï¼ä¾åç»ç»§ç»ç²¾ç¡®è¿ç® |
| | | */ |
| | | export function moneyDecimal(value, scale = MONEY_SCALE) { |
| | | return roundDecimal(value, scale) |
| | | } |
| | | |
| | | function roundDecimal(value, scale = MONEY_SCALE) { |
| | | return toMoney(value).toDecimalPlaces(scale, Decimal.ROUND_HALF_UP) |
| | | } |
| | | |
| | | // moneySum å
é¨å·²è¿å Numberï¼è¿éç»ä¸èµ°åä¸å¥åèäºå
¥ |
| | | function roundNumber(value) { |
| | | return roundDecimal(value).toNumber() |
| | | } |
| | | |
| | | export default { |
| | | MONEY_SCALE, |
| | | toMoney, |
| | | isValidMoney, |
| | | moneySum, |
| | | moneySumRound, |
| | | moneyAdd, |
| | | moneySub, |
| | | moneyMul, |
| | | moneyDiv, |
| | | moneyEq, |
| | | moneyCmp, |
| | | moneyRound, |
| | | moneyText, |
| | | moneyDecimal |
| | | } |
| | |
| | | console.log('err' + error) |
| | | let { message } = error; |
| | | if (message == "Network Error") { |
| | | // message = "å端æ¥å£è¿æ¥å¼å¸¸"; |
| | | console.log("Network Erro",message); |
| | | message = "å端æ¥å£è¿æ¥å¼å¸¸"; |
| | | } |
| | | else if (message.includes("timeout")) { |
| | | // message = "ç³»ç»æ¥å£è¯·æ±è¶
æ¶"; |
| | | console.log("timeout",message); |
| | | message = "ç³»ç»æ¥å£è¯·æ±è¶
æ¶"; |
| | | } |
| | | else if (message.includes("Request failed with status code")) { |
| | | // message = "ç³»ç»æ¥å£" + message.substr(message.length - 3) + "å¼å¸¸"; |
| | | console.log("Request failed with status code",message); |
| | | // ä¼å
å±ç¤ºå端è¿åçå
·ä½åå ï¼å¦"å»é¢ååç³»ç»æ¥æ¶å¤±è´¥ï¼æ¬æ¬¡å®¡æ¹æªçæï¼è¯·ç¨å鿰审æ¹"ï¼ |
| | | const data = error.response && error.response.data; |
| | | const backendMsg = data && (data.msg || data.message); |
| | | message = backendMsg || ("ç³»ç»æ¥å£" + message.substr(message.length - 3) + "å¼å¸¸"); |
| | | } |
| | | // Message({ |
| | | // message: message, |
| | | // type: 'error', |
| | | // duration: 10* 1000 |
| | | // }) |
| | | // 2026-10-09 æ¢å¤é误æç¤ºï¼åæ¥è¿éæ¯æ³¨éç¶æï¼å¯¼è´è¯·æ±åç HTTP 级éè¯¯æ¶ |
| | | // 页é¢ä»ä¹é½ä¸æç¤ºï¼è°ç¨æ¹ç .then ä¸ä¼æ§è¡ï¼ï¼ç¨æ·çä¸å°å¤±è´¥åå |
| | | Message({ |
| | | message: message, |
| | | type: 'error', |
| | | duration: 5 * 1000 |
| | | }) |
| | | return Promise.reject(error) |
| | | } |
| | | ) |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * 主é¢è²è¿è¡æ¶è®¡ç®ä¸åºç¨ |
| | | * --------------------------------------------------------------- |
| | | * èæ¯ï¼Element UI 2.x ç主é¢è²æ¯ SCSS ç¼è¯æå¸¸éï¼è¿è¡æ¶æ æ³æ¹å¨ï¼ |
| | | * åæ ThemePicker ä¾èµ unpkg CDN æå theme-chalk ååç¬¦ä¸²æ¿æ¢ï¼ |
| | | * å
ç½ç¯å¢æä¸å° CSSï¼å¯¼è´"æ¹ä¸»é¢æ²¡ååº"ã |
| | | * åæ³ï¼ç±ä»»æä¸»è²æ¨åºä¸å¥è²é¶ï¼hover / active / light-3~95ï¼ï¼ |
| | | * åå
¥ :root ç CSS åéï¼theme-runtime.scss ç¨ var() æ¶è´¹è¿äºåéï¼ |
| | | * ä»èå®ç°"䏿¬¡ç¼è¯ãè¿è¡æ¶æ¢è¤ã页é¢ä¸å·æ°"ã |
| | | */ |
| | | |
| | | /** é»è®¤ä¸»è²ï¼OPO_Logo.png åç¯é */ |
| | | export const DEFAULT_PRIMARY = '#0E768F' |
| | | |
| | | /** localStorage é®ï¼ä¸å¸å±è®¾ç½®åå¼ï¼é¿å
äºç¸è¦çï¼ */ |
| | | const STORAGE_KEY = 'opo-theme' |
| | | |
| | | /** é¢è®¾ç®è¤ */ |
| | | export const PRESETS = [ |
| | | { name: 'åçé', color: '#0E768F' }, |
| | | { name: 'ç«çº¢', color: '#CD1D4E' }, |
| | | { name: 'Element è', color: '#409EFF' }, |
| | | { name: 'å¶è½ç»¿', color: '#1B8E70' }, |
| | | { name: 'ç´«', color: '#7B61FF' }, |
| | | { name: 'æ©', color: '#E6843C' } |
| | | ] |
| | | |
| | | const WHITE = [255, 255, 255] |
| | | const BLACK = [0, 0, 0] |
| | | |
| | | function clamp(v) { |
| | | return Math.max(0, Math.min(255, Math.round(v))) |
| | | } |
| | | |
| | | /** #abc / #aabbcc â [r,g,b]ï¼éæ³è¿å null */ |
| | | export function hexToRgb(hex) { |
| | | if (typeof hex !== 'string') return null |
| | | let h = hex.trim().replace(/^#/, '') |
| | | if (h.length === 3) { |
| | | h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2] |
| | | } |
| | | if (!/^[0-9a-fA-F]{6}$/.test(h)) return null |
| | | return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)] |
| | | } |
| | | |
| | | /** [r,g,b] â #RRGGBB */ |
| | | export function rgbToHex(rgb) { |
| | | return ( |
| | | '#' + |
| | | rgb |
| | | .map(function (v) { |
| | | const s = clamp(v).toString(16) |
| | | return s.length === 1 ? '0' + s : s |
| | | }) |
| | | .join('') |
| | | .toUpperCase() |
| | | ) |
| | | } |
| | | |
| | | /** |
| | | * æ··è²ï¼weight ä¸ºç®æ è²å æ¯ï¼0~1ï¼ |
| | | * mix([14,118,143], WHITE, 0.3) â 30% ç½ + 70% ä¸»è² |
| | | */ |
| | | export function mix(rgb, target, weight) { |
| | | const w = Math.max(0, Math.min(1, weight)) |
| | | return [ |
| | | clamp(rgb[0] * (1 - w) + target[0] * w), |
| | | clamp(rgb[1] * (1 - w) + target[1] * w), |
| | | clamp(rgb[2] * (1 - w) + target[2] * w) |
| | | ] |
| | | } |
| | | |
| | | function channelLum(v) { |
| | | const c = v / 255 |
| | | return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4) |
| | | } |
| | | |
| | | /** ç¸å¯¹äº®åº¦ï¼WCAGï¼ */ |
| | | export function luminance(rgb) { |
| | | return 0.2126 * channelLum(rgb[0]) + 0.7152 * channelLum(rgb[1]) + 0.0722 * channelLum(rgb[2]) |
| | | } |
| | | |
| | | /** ä¸ç½è²ç对æ¯åº¦ï¼ç¨äºå¤æç½åæ¯å¦å¯è¯» */ |
| | | export function contrastWithWhite(rgb) { |
| | | return 1.05 / (luminance(rgb) + 0.05) |
| | | } |
| | | |
| | | /** |
| | | * ç±ä¸»è²æ¨å
¨å¥è²é¶ |
| | | * æ·±è²ä¸»è²ï¼äº®åº¦ä½ï¼hover ç¨"å æ·±"ï¼æµ
è²ä¸»è² hover ç¨"åæµ
"ï¼ |
| | | * ä¿è¯ hover æçç½å对æ¯åº¦ä¸ä¼æä¸å»ã |
| | | */ |
| | | export function buildScale(primary) { |
| | | const base = hexToRgb(primary) || hexToRgb(DEFAULT_PRIMARY) |
| | | const isDark = luminance(base) < 0.4 |
| | | |
| | | const hover = isDark ? mix(base, BLACK, 0.1) : mix(base, WHITE, 0.2) |
| | | const active = isDark ? mix(base, BLACK, 0.2) : mix(base, WHITE, 0.32) |
| | | |
| | | return { |
| | | primary: rgbToHex(base), |
| | | hover: rgbToHex(hover), |
| | | active: rgbToHex(active), |
| | | light3: rgbToHex(mix(base, WHITE, 0.3)), |
| | | light5: rgbToHex(mix(base, WHITE, 0.5)), |
| | | light7: rgbToHex(mix(base, WHITE, 0.7)), |
| | | light8: rgbToHex(mix(base, WHITE, 0.8)), |
| | | light9: rgbToHex(mix(base, WHITE, 0.9)), |
| | | light95: rgbToHex(mix(base, WHITE, 0.95)), |
| | | dark2: rgbToHex(mix(base, BLACK, 0.2)), |
| | | isDark: isDark, |
| | | contrastWithWhite: Number(contrastWithWhite(base).toFixed(2)) |
| | | } |
| | | } |
| | | |
| | | /** æè²é¶åå
¥ :root ç CSS åéï¼theme-runtime.scss æ¶è´¹ï¼ */ |
| | | export function applyTheme(primary) { |
| | | const scale = buildScale(primary || DEFAULT_PRIMARY) |
| | | if (typeof document === 'undefined') return scale |
| | | |
| | | const root = document.documentElement |
| | | const map = { |
| | | '--opo-primary': scale.primary, |
| | | '--opo-primary-hover': scale.hover, |
| | | '--opo-primary-active': scale.active, |
| | | '--opo-primary-light-3': scale.light3, |
| | | '--opo-primary-light-5': scale.light5, |
| | | '--opo-primary-light-7': scale.light7, |
| | | '--opo-primary-light-8': scale.light8, |
| | | '--opo-primary-light-9': scale.light9, |
| | | '--opo-primary-light-95': scale.light95, |
| | | '--opo-primary-dark-2': scale.dark2 |
| | | } |
| | | Object.keys(map).forEach(function (k) { |
| | | root.style.setProperty(k, map[k]) |
| | | }) |
| | | // ä¾ä¸ªå«éè¦ç¥é"å½åæ¯å¦æ·±è²ä¸»è²"çåºæ¯ä½¿ç¨ |
| | | root.setAttribute('data-opo-dark-primary', scale.isDark ? '1' : '0') |
| | | return scale |
| | | } |
| | | |
| | | /** 读å䏿¬¡éæ©çä¸»è² */ |
| | | export function getStoredTheme() { |
| | | try { |
| | | return localStorage.getItem(STORAGE_KEY) |
| | | } catch (e) { |
| | | return null |
| | | } |
| | | } |
| | | |
| | | /** è®°ä½éæ© */ |
| | | export function setStoredTheme(color) { |
| | | try { |
| | | localStorage.setItem(STORAGE_KEY, color) |
| | | } catch (e) { |
| | | /* 忽ç¥éç§æ¨¡å¼çå¼å¸¸ */ |
| | | } |
| | | } |
| | | |
| | | export default { |
| | | DEFAULT_PRIMARY: DEFAULT_PRIMARY, |
| | | PRESETS: PRESETS, |
| | | applyTheme: applyTheme, |
| | | buildScale: buildScale, |
| | | getStoredTheme: getStoredTheme, |
| | | setStoredTheme: setStoredTheme, |
| | | hexToRgb: hexToRgb, |
| | | rgbToHex: rgbToHex, |
| | | mix: mix, |
| | | luminance: luminance, |
| | | contrastWithWhite: contrastWithWhite |
| | | } |
| | |
| | | data() { |
| | | return { |
| | | options: {}, |
| | | // èªå¨è½®æå®æ¶å¨å¥æï¼ä¸æ¸
çä¼å¨ç»ä»¶éæ¯åç»§ç»è§¦åï¼å¯¼è´å¯¹å·²éæ¯å®ä¾æä½ |
| | | intervalId: null, |
| | | }; |
| | | }, |
| | | beforeDestroy() { |
| | | if (this.intervalId !== null) { |
| | | clearInterval(this.intervalId); |
| | | this.intervalId = null; |
| | | } |
| | | }, |
| | | components: { |
| | | Echart, |
| | | }, |
| | |
| | | data() { |
| | | return { |
| | | options: {}, |
| | | // èªå¨è½®æå®æ¶å¨å¥æï¼ä¸æ¸
çä¼å¨ç»ä»¶éæ¯åç»§ç»è§¦åï¼å¯¼è´å¯¹å·²éæ¯å®ä¾æä½ |
| | | intervalId: null, |
| | | }; |
| | | }, |
| | | beforeDestroy() { |
| | | if (this.intervalId !== null) { |
| | | clearInterval(this.intervalId); |
| | | this.intervalId = null; |
| | | } |
| | | }, |
| | | components: { |
| | | Echart, |
| | | }, |
| | |
| | | data() { |
| | | return { |
| | | options: {}, |
| | | // èªå¨è½®æå®æ¶å¨å¥æï¼ä¸æ¸
çä¼å¨ç»ä»¶éæ¯åç»§ç»è§¦åï¼å¯¼è´å¯¹å·²éæ¯å®ä¾æä½ |
| | | intervalId: null, |
| | | }; |
| | | }, |
| | | beforeDestroy() { |
| | | if (this.intervalId !== null) { |
| | | clearInterval(this.intervalId); |
| | | this.intervalId = null; |
| | | } |
| | | }, |
| | | components: { |
| | | Echart, |
| | | }, |
| | |
| | | data() { |
| | | return { |
| | | options: {}, |
| | | // èªå¨è½®æå®æ¶å¨å¥æï¼ä¸æ¸
çä¼å¨ç»ä»¶éæ¯åç»§ç»è§¦åï¼å¯¼è´å¯¹å·²éæ¯å®ä¾æä½ |
| | | intervalId: null, |
| | | }; |
| | | }, |
| | | beforeDestroy() { |
| | | if (this.intervalId !== null) { |
| | | clearInterval(this.intervalId); |
| | | this.intervalId = null; |
| | | } |
| | | }, |
| | | components: { |
| | | Echart, |
| | | }, |
| | |
| | | data() { |
| | | return { |
| | | options: {}, |
| | | // èªå¨è½®æå®æ¶å¨å¥æï¼ä¸æ¸
çä¼å¨ç»ä»¶éæ¯åç»§ç»è§¦åï¼å¯¼è´å¯¹å·²éæ¯å®ä¾æä½ |
| | | intervalId: null, |
| | | }; |
| | | }, |
| | | beforeDestroy() { |
| | | if (this.intervalId !== null) { |
| | | clearInterval(this.intervalId); |
| | | this.intervalId = null; |
| | | } |
| | | }, |
| | | components: { |
| | | Echart, |
| | | }, |
| | |
| | | data() { |
| | | return { |
| | | options: {}, |
| | | // èªå¨è½®æå®æ¶å¨å¥æï¼ä¸æ¸
çä¼å¨ç»ä»¶éæ¯åç»§ç»è§¦åï¼å¯¼è´å¯¹å·²éæ¯å®ä¾æä½ |
| | | intervalId: null, |
| | | }; |
| | | }, |
| | | beforeDestroy() { |
| | | if (this.intervalId !== null) { |
| | | clearInterval(this.intervalId); |
| | | this.intervalId = null; |
| | | } |
| | | }, |
| | | components: { |
| | | Echart, |
| | | }, |
| | |
| | | data() { |
| | | return { |
| | | options: {}, |
| | | // èªå¨è½®æå®æ¶å¨å¥æï¼ä¸æ¸
çä¼å¨ç»ä»¶éæ¯åç»§ç»è§¦åï¼å¯¼è´å¯¹å·²éæ¯å®ä¾æä½ |
| | | intervalId: null, |
| | | }; |
| | | }, |
| | | beforeDestroy() { |
| | | if (this.intervalId !== null) { |
| | | clearInterval(this.intervalId); |
| | | this.intervalId = null; |
| | | } |
| | | }, |
| | | components: { |
| | | Echart, |
| | | }, |
| | |
| | | }, |
| | | data() { |
| | | return { |
| | | options: {} |
| | | options: {}, |
| | | // èªå¨è½®æå®æ¶å¨å¥æï¼ä¸æ¸
çä¼å¨ç»ä»¶éæ¯åç»§ç»è§¦åï¼å¯¼è´å¯¹å·²éæ¯å®ä¾æä½ |
| | | intervalId: null |
| | | }; |
| | | }, |
| | | beforeDestroy() { |
| | | if (this.intervalId !== null) { |
| | | clearInterval(this.intervalId); |
| | | this.intervalId = null; |
| | | } |
| | | }, |
| | | components: { |
| | | Echart |
| | | }, |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="ä»»å¡åç§°" prop="jobName"> |
| | | <el-input |
| | | v-model="queryParams.jobName" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="ä»»å¡åç§°" prop="jobName"> |
| | | <el-input |
| | | v-model="queryParams.jobName" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="ç»å½å°å" prop="ipaddr"> |
| | | <el-input |
| | | v-model="queryParams.ipaddr" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" label-width="68px"> |
| | | <el-form-item label="ç»å½å°å" prop="ipaddr"> |
| | | <el-input |
| | | v-model="queryParams.ipaddr" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="ç³»ç»æ¨¡å" prop="title"> |
| | | <el-input |
| | | v-model="queryParams.title" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | this.queryParams.reporterno = this.reportervalue; |
| | | } |
| | | |
| | | if (this.starttime != "") { |
| | | this.queryParams.starttime = this.starttime; |
| | | } else { |
| | | this.queryParams.starttime = ""; |
| | | } |
| | | if (this.endtime != "") { |
| | | this.queryParams.endtime = this.endtime; |
| | | } else { |
| | | this.queryParams.endtime = ""; |
| | | } |
| | | // æªéæ¶é´èå´æ¶ä¼ nullï¼ç©ºä¸²ä¼è®©å端æ¼åº `donatetime >= ''`ï¼ |
| | | // MySQL ä¸¥æ ¼æ¨¡å¼ä¼æ¥ Incorrect DATETIME value: ''ï¼è§ CHANGELOG 2026-10-22ï¼ |
| | | this.queryParams.starttime = this.starttime || null; |
| | | this.queryParams.endtime = this.endtime || null; |
| | | console.log(this.queryParams); |
| | | |
| | | listDonationProcess(this.queryParams).then(response => { |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="uploadtime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="è¯·éæ©ä¸ä¼ æ¶é´" |
| | | > |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="æ¶ç人å§å 家屿ä¸å®¶" prop="beneficiaryname"> |
| | | <el-input |
| | | v-model="queryParams.beneficiaryname" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | size="small" |
| | | style="width: 220px" |
| | | v-model="form.uploadtime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | > |
| | | </el-date-picker> |
| | |
| | | <el-input v-model="form.fileurl" placeholder="请è¾å
¥æä»¶å°å" /> |
| | | </el-form-item> --> |
| | | <el-form-item label="æä»¶ä¸ä¼ " align="left" prop="fileurl"> |
| | | <!-- <file-upload ref="fileUpload" :fileType=fileType :limit="1" :on-success="handleUploadSuccess"></file-upload> --> |
| | | <el-upload |
| | | size="mini" |
| | | class="upload-demo" |
| | |
| | | fileurl: null, |
| | | status: null, |
| | | }, |
| | | fileType: ["png", "jpg", "jpeg", "doc", "xls", "ppt", "txt", "pdf"], |
| | | // 表ååæ° |
| | | form: {}, |
| | | // è¡¨åæ ¡éª |
| | |
| | | //æä»¶å表 |
| | | fileList: [], |
| | | baseUrl: process.env.VUE_APP_BASE_API, |
| | | // ä¸ä¼ çå¾çæå¡å¨å°å |
| | | uploadFileUrl: process.env.VUE_APP_BASE_API + "/common/upload", |
| | | // æ¿çæä»¶ä¸ä¼ æ¥å£ï¼2026-10-09ï¼æ¹ç¨æ¨¡åä¸å±æ¥å£ï¼å
许任ææä»¶ç±»åï¼ |
| | | // éç¨ /common/upload 仿æ©å±åç½ååæ ¡éªï¼ä¸éç¨äºæ¬æ¨¡åï¼ |
| | | uploadFileUrl: process.env.VUE_APP_BASE_API + "/project/documentfiles/upload", |
| | | //ä¸ä¼ é件请æ±å¤´ |
| | | headers: { |
| | | Authorization: "Bearer " + getToken(), |
| | |
| | | download() { |
| | | let list = this.fileList; |
| | | if (list.length > 0) { |
| | | let downUrl = list[0].url; |
| | | const link = document.createElement("a"); |
| | | link.href = this.baseUrl + downUrl; |
| | | link.setAttribute("download", this.getFileName(list[0].name)); |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | this.saveFile(list[0].url, this.getFileName(list[0].name, list[0].url)); |
| | | } else { |
| | | this.$modal.msgWarning("æªè·åå°æä»¶å°åï¼è¯·ç¡®è®¤"); |
| | | } |
| | | }, |
| | | handleDownload(row) { |
| | | if (row.fileurl != "" && row.fileurl != null) { |
| | | const link = document.createElement("a"); |
| | | link.href = this.baseUrl + row.fileurl; |
| | | link.setAttribute("download", this.getFileName(row.fileurl)); |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | this.saveFile( |
| | | row.fileurl, |
| | | this.getFileName(row.filename, row.fileurl, row.filename) |
| | | ); |
| | | } else { |
| | | this.$modal.msgWarning("æªè·åå°æä»¶å°åï¼è¯·ç¡®è®¤"); |
| | | } |
| | | }, |
| | | // è·åæä»¶åç§° |
| | | getFileName(name) { |
| | | if (name.lastIndexOf("/") > -1) { |
| | | return name.slice(name.lastIndexOf("/") + 1).toLowerCase(); |
| | | } else { |
| | | return ""; |
| | | |
| | | /** |
| | | * ä¸è½½æä»¶ï¼å¿
须另鴿ï¼ã |
| | | * |
| | | * èæ¯ï¼/profile/** éæèµæºæªå¨ SecurityConfig 䏿¾è¡ï¼anyRequest().authenticated()ï¼ï¼ |
| | | * èå端 TokenService åªä»è¯·æ±å¤´ Authorization å tokenã |
| | | * å æ¤ç¨ <a href> ç´æ¥è·³è½¬ä¸è½½ä¸ä¼æºå¸¦ tokenï¼æå¡ç«¯è¿å 401ï¼è¡¨ç°ä¸ºâç¹ä¸è½½æ²¡ååº/ä¸ä¸å°æä»¶âã |
| | | * è¿éæ¹ä¸º fetch 带 Authorization 头ååæä»¶æµï¼åç¨ blob æ¬å°å¦åã |
| | | * |
| | | * @param {string} fileUrl æä»¶å°åï¼åºä¸åçæ¯ /profile/upload/... ç¸å¯¹è·¯å¾ï¼ |
| | | * @param {string} fileName å¦å为çæä»¶å |
| | | */ |
| | | saveFile(fileUrl, fileName) { |
| | | if (!fileUrl) { |
| | | this.$modal.msgWarning("æªè·åå°æä»¶å°åï¼è¯·ç¡®è®¤"); |
| | | return; |
| | | } |
| | | // å
¼å®¹å岿°æ®ä¸å·²æ¯ç»å¯¹å°åçæ
åµï¼é¿å
é夿¼æ¥ |
| | | const isAbsolute = /^https?:\/\//i.test(fileUrl); |
| | | const url = isAbsolute ? fileUrl : this.baseUrl + fileUrl; |
| | | |
| | | this.$modal.loading("æ£å¨ä¸è½½æä»¶ï¼è¯·èå¿çå¾
ï¼"); |
| | | fetch(url, { |
| | | method: "get", |
| | | headers: { Authorization: "Bearer " + getToken() }, |
| | | }) |
| | | .then((response) => { |
| | | if (!response.ok) { |
| | | // 401/403/404 å¿
é¡»æ¾å¼æç¤ºï¼å¦åä¼ä¸å°ä¸ä¸ªå
容为é误页çæä»¶ |
| | | throw new Error("HTTP " + response.status); |
| | | } |
| | | return response.blob(); |
| | | }) |
| | | .then((blob) => { |
| | | const blobUrl = window.URL.createObjectURL(blob); |
| | | const link = document.createElement("a"); |
| | | link.href = blobUrl; |
| | | link.setAttribute("download", fileName || "ä¸è½½æä»¶"); |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | document.body.removeChild(link); |
| | | window.URL.revokeObjectURL(blobUrl); |
| | | }) |
| | | .catch((err) => { |
| | | console.error("æä»¶ä¸è½½å¤±è´¥ï¼" + url, err); |
| | | this.$modal.msgError("æä»¶ä¸è½½å¤±è´¥ï¼è¯·ç¡®è®¤æä»¶æ¯å¦å卿ç»å½æ¯å¦è¿æ"); |
| | | }) |
| | | .finally(() => { |
| | | this.$modal.closeLoading(); |
| | | }); |
| | | }, |
| | | |
| | | /** |
| | | * è·åå¦å为çæä»¶åã |
| | | * |
| | | * ä¼å
级ï¼å¸¦æ©å±åçåå§æä»¶å > æä»¶å°åæ«æ®µ > ææ¡£æ é¢ã |
| | | * 乿以ä¸ç´æ¥ç¨ form.filenameï¼è¯¥å段å¨è¡¨åä¸å¯æå·¥ç¼è¾ï¼å¦â人ä½å¨å®ç§»æ¤æ¡ä¾âï¼ï¼ |
| | | * ä¸å¸¦æ©å±åï¼ç´æ¥ç¨ä½å¦ååä¼å¯¼è´ç³»ç»æ æ³è¯å«æå¼æ¹å¼ã |
| | | * |
| | | * @param {string} storedName åå§æä»¶åï¼å¦ form.filename ä¸åç xxx.docxï¼ |
| | | * @param {string} fileUrl æä»¶å°å |
| | | * @param {string} title å¤ç¨åç§°ï¼ææ¡£æ é¢ï¼ |
| | | */ |
| | | getFileName(storedName, fileUrl, title) { |
| | | const hasExt = (name) => !!name && name.lastIndexOf(".") > -1; |
| | | |
| | | if (hasExt(storedName)) { |
| | | return storedName; |
| | | } |
| | | |
| | | const source = fileUrl || ""; |
| | | if (source.lastIndexOf("/") > -1) { |
| | | const fromUrl = source.slice(source.lastIndexOf("/") + 1); |
| | | if (fromUrl) { |
| | | return fromUrl; |
| | | } |
| | | } |
| | | |
| | | return title || storedName || "ä¸è½½æä»¶"; |
| | | }, |
| | | |
| | | //æä»¶ä¸ä¼ æååè° |
| | |
| | | this.$modal.msgSuccess(response.msg); |
| | | this.fileList.push({ name: response.fileName, url: response.fileName }); |
| | | } else { |
| | | console.log(response.msg);; |
| | | // 2026-10-09ï¼ä¸ä¼ 失败å¿
é¡»æç¤ºãåæ¥åª console.logï¼ç¨æ·çä¸å°å¤±è´¥åå ï¼è¡¨ç°ä¸º"ç¹äºæ²¡ååº"ï¼ |
| | | this.$modal.msgError(response.msg || "ä¸ä¼ 失败ï¼è¯·éè¯"); |
| | | } |
| | | //console.log("ä¸ä¼ æä»¶åï¼" + JSON.stringify(this.fileList)); |
| | | }, |
| | |
| | | handleExceed() { |
| | | this.$message.error(`ä¸ä¼ æä»¶æ°éå·²è¶
è¿!`); |
| | | }, |
| | | // ä¸ä¼ 失败 |
| | | // ä¸ä¼ 失败ï¼HTTP å±é误ï¼å¦ç»å½è¿æãç½ç»å¼å¸¸ï¼ |
| | | handleUploadError(err) { |
| | | this.$message.error("ä¸ä¼ 失败, 请éè¯" + JSON.stringify(err)); |
| | | const msg = (err && (err.msg || err.message)) || ""; |
| | | this.$modal.msgError("ä¸ä¼ 失败ï¼è¯·éè¯" + (msg ? "ï¼" + msg : "")); |
| | | }, |
| | | }, |
| | | }; |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-form-item label="éä»¶ç¼å·" prop="annexno"> |
| | |
| | | <el-form |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | class="opo-query-form" |
| | | :inline="true" |
| | | v-show="showSearch" |
| | | label-width="70px" |
| | | > |
| | | <el-row :gutter="8"> |
| | | <el-col :span="5"> |
| | | <el-form-item label="å§å" prop="name"> |
| | | <el-form-item label="æç®è
" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | | placeholder="请è¾å
¥å§å" |
| | | placeholder="请è¾å
¥æç®è
å§å" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="9"> |
| | | <el-form-item label="æ¡ä¾æ¶é´"> |
| | | <el-date-picker |
| | | style="width: 100%" |
| | | v-model="selecttime" |
| | | type="monthrange" |
| | | range-separator="è³" |
| | | start-placeholder="å¼å§æä»½" |
| | | end-placeholder="ç»ææä»½" |
| | | value-format="yyyy-MM-dd" |
| | | @change="getTimeList" |
| | | <el-col :span="6"> |
| | | <el-form-item label="æ¥å人"> |
| | | <el-select |
| | | v-model="queryParams.reporterno" |
| | | placeholder="è¯·éæ©æ¥å人" |
| | | > |
| | | </el-date-picker> |
| | | <el-option |
| | | v-for="item in reportlist" |
| | | :key="item.index" |
| | | :label="item.reportername" |
| | | :value="item.reporterno" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="8"> |
| | | <el-col :span="5"> |
| | | <el-col :span="6"> |
| | | <el-form-item label="æç®è¿åº¦" prop="workflow"> |
| | | <el-select |
| | | v-model="queryParams.workflow" |
| | |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="5"> |
| | | <el-form-item label="æ¥å人"> |
| | | <el-select |
| | | v-model="queryParams.reporterno" |
| | | placeholder="è¯·éæ©æ¥å人" |
| | | <el-col :span="9"> |
| | | <el-form-item label="æ¡ä¾æ¶é´"> |
| | | <el-date-picker |
| | | style="width: 100%" |
| | | v-model="selecttime" |
| | | type="monthrange" |
| | | range-separator="è³" |
| | | start-placeholder="å¼å§æä»½" |
| | | end-placeholder="ç»ææä»½" |
| | | value-format="yyyy-MM-dd" |
| | | @change="getTimeList" |
| | | > |
| | | <el-option |
| | | v-for="item in reportlist" |
| | | :key="item.index" |
| | | :label="item.reportername" |
| | | :value="item.reporterno" |
| | | > |
| | | </el-option> |
| | | </el-select> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="5"> |
| | | |
| | | <el-col :span="6"> |
| | | <el-form-item label="æ¯å¦ç»æ¢"> |
| | | <el-select |
| | | v-model="queryParams.terminationCase" |
| | |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="9"> |
| | | <el-form-item label="ç±è´¯"> |
| | | <div> |
| | | <li_area_select |
| | | ref="areaSelect" |
| | | v-model="searchAddress" |
| | | ></li_area_select> |
| | | </div> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="4"> |
| | | <!-- æç´¢/éç½®ç´§è·æ¥è¯¢æ¡ä»¶ï¼ä¸"æ¡ä¾è¯ä¼°"页ä¸è´ï¼ --> |
| | | <el-col :span="6"> |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | |
| | | label="æç®ç¼å·" |
| | | align="center" |
| | | prop="donorno" |
| | | width="200" |
| | | width="100" |
| | | /> |
| | | <el-table-column label="å§å" align="center" prop="name" width="100" /> |
| | | <el-table-column label="æ§å«" align="center" prop="sex" width="100"> |
| | |
| | | <el-table-column |
| | | label="å»çæºæ" |
| | | align="center" |
| | | prop="treatmenthospitalname" |
| | | prop="treatmenthospitalname" width="220" |
| | | /> |
| | | <el-table-column label="è¡å" align="center" prop="bloodtype" width="100"> |
| | | <el-table-column label="è¡å" align="center" prop="bloodtype" width="80"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_BloodType" |
| | |
| | | prop="reportername" |
| | | width="100" |
| | | /> |
| | | <!-- |
| | | |
| | | <el-table-column |
| | | label="ç°æå¨å°å¸" |
| | | align="center" |
| | |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | --> |
| | | |
| | | <el-table-column |
| | | label="æç®è¿åº¦" |
| | | align="center" |
| | |
| | | label="æä½" |
| | | align="center" |
| | | class-name="small-padding fixed-width" |
| | | fixed="right" |
| | | fixed="right" width="200" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | |
| | | size="small" |
| | | style="width: 190px" |
| | | v-model="form.contacttime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©æ¥åæ¶é´" |
| | | > |
| | |
| | | size="small" |
| | | style="width: 190px" |
| | | v-model="form.reporttime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©æ¥åæ¶é´" |
| | | > |
| | |
| | | this.queryParams.reportno = this.reportervalue; |
| | | } |
| | | |
| | | if (this.starttime != "") { |
| | | this.queryParams.starttime = this.starttime; |
| | | } else { |
| | | this.queryParams.starttime = ""; |
| | | } |
| | | if (this.endtime != "") { |
| | | this.queryParams.endtime = this.endtime; |
| | | } else { |
| | | this.queryParams.endtime = ""; |
| | | } |
| | | this.queryParams.residenceprovince = this.$refs.areaSelect.getSheng(); |
| | | this.queryParams.residencecity = this.$refs.areaSelect.getShi(); |
| | | this.queryParams.residencetown = this.$refs.areaSelect.getQu(); |
| | | // æªéæ©æ¶é´èå´æ¶å¿
é¡»ä¼ nullï¼ä¼ 空串ä¼è®©å端æ¼åº `donatetime >= ''`ï¼ |
| | | // MySQL ä¸¥æ ¼æ¨¡å¼ä¼æ¥ Incorrect DATETIME value: ''ï¼å¯¼è´å表æ¥ä¸åºæ¥ã |
| | | // request.js åªä¼æ¼æ¥é null/undefined çåæ°ï¼æä»¥ null çäº"ä¸å¸¦è¯¥æ¡ä»¶"ã |
| | | this.queryParams.starttime = this.starttime || null; |
| | | this.queryParams.endtime = this.endtime || null; |
| | | // æ¥è¯¢æ¡ä»¶éç"ç±è´¯"已移é¤ï¼ä¸åä» areaSelect ç»ä»¶åå¼ï¼ |
| | | // 置空以æ¸
æå¯è½æ®ççæ§æ¡ä»¶ï¼åæ°ä¸º null æ¶ä¸ä¼è¢«æ¼è¿è¯·æ±ï¼ |
| | | this.queryParams.residenceprovince = null; |
| | | this.queryParams.residencecity = null; |
| | | this.queryParams.residencetown = null; |
| | | console.log(this.queryParams); |
| | | |
| | | listDonatebaseinfo(this.queryParams).then(response => { |
| | |
| | | </script> |
| | | |
| | | <style scoped> |
| | | /* æ¥è¯¢åºè¡è·ã页é¢å
è¾¹è·ãå·¥å
·æ é´è·å·²æå为å
¨å±è§åï¼.opo-query-form / .app-containerï¼ï¼æ¤å¤ä¸ååç¬è¦ç */ |
| | | ::v-deep .el-dialog__header { |
| | | padding-top: 40px !important; |
| | | margin: auto !important; |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | clearable |
| | | style="width: 100%" |
| | | v-model="form.createTime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="ç³è¯·æ¥æ" |
| | | > |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="form.completetime" |
| | | type="date" |
| | | value-format="yyyy-MM-dd hh:mm:ss" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="鿩宿æ¶é´" |
| | | > |
| | | </el-date-picker> |
| | |
| | | size="small" |
| | | style="width: 90%" |
| | | v-model="scope.row.transplanttime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©å¨å®ç§»æ¤æ¶é´" |
| | | > |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="form.completetime" |
| | | type="date" |
| | | value-format="yyyy-MM-dd hh:mm:ss" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="鿩宿æ¶é´" |
| | | > |
| | | </el-date-picker> |
| | |
| | | size="small" |
| | | style="width: 90%" |
| | | v-model="scope.row.transplanttime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©å¨å®è·åæ¶é´" |
| | | > |
| | |
| | | // this.queryParams.residenceprovince = this.$refs.areaSelect.getSheng(); |
| | | // this.queryParams.residencecity = this.$refs.areaSelect.getShi(); |
| | | // this.queryParams.residencetown = this.$refs.areaSelect.getQu(); |
| | | if (this.starttime != "") { |
| | | this.queryParams.starttime = this.starttime; |
| | | } else { |
| | | this.queryParams.starttime = ""; |
| | | } |
| | | if (this.endtime != "") { |
| | | this.queryParams.endtime = this.endtime; |
| | | } else { |
| | | this.queryParams.endtime = ""; |
| | | } |
| | | // æªéæ¶é´èå´æ¶ä¼ nullï¼ç©ºä¸²ä¼è®©å端æ¼åº `donatetime >= ''`ï¼ |
| | | // MySQL ä¸¥æ ¼æ¨¡å¼ä¼æ¥ Incorrect DATETIME value: ''ï¼è§ CHANGELOG 2026-10-22ï¼ |
| | | this.queryParams.starttime = this.starttime || null; |
| | | this.queryParams.endtime = this.endtime || null; |
| | | // this.queryParams.residenceprovince = this.$refs.areaSelect.getSheng(); |
| | | // this.queryParams.residencecity = this.$refs.areaSelect.getShi(); |
| | | // this.queryParams.residencetown = this.$refs.areaSelect.getQu(); |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="form.followuptime" |
| | | type="date" |
| | | value-format="yyyy-MM-dd hh:mm:ss" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©é访æ¶é´" |
| | | > |
| | | </el-date-picker> |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="70px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="70px"> |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-form-item label="å¨å®åç§°" prop="organno"> |
| | |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è·åæ¶é´" prop="organgettime"> |
| | | <el-date-picker clearable size="medium" v-model="form.organgettime" type="date" disabled |
| | | <el-date-picker clearable size="medium" v-model="form.organgettime" type="date" format="yyyy-MM-dd" disabled |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="éæ©å¨å®è·åæ¶é´"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç§»æ¤æ¶é´" prop="transplanttime"> |
| | | <el-date-picker clearable size="medium" v-model="form.transplanttime" type="date" |
| | | <el-date-picker clearable size="medium" v-model="form.transplanttime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="éæ©ç§»æ¤æ¶é´" disabled> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="form.birthday" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | style="width: 174px" |
| | | value-format="yyyy:MM:dd HH:mm:ss" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©åºçæ¥æ" |
| | | > |
| | | </el-date-picker> |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="form.reporttime" |
| | | type="date" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©æ¥åæ¶é´" |
| | | > |
| | | </el-date-picker> |
| | |
| | | // this.queryParams.residenceprovince = this.$refs.areaSelect.getSheng(); |
| | | // this.queryParams.residencecity = this.$refs.areaSelect.getShi(); |
| | | // this.queryParams.residencetown = this.$refs.areaSelect.getQu(); |
| | | if (this.starttime != "") { |
| | | this.queryParams.starttime = this.starttime; |
| | | } else { |
| | | this.queryParams.starttime = ""; |
| | | } |
| | | if (this.endtime != "") { |
| | | this.queryParams.endtime = this.endtime; |
| | | } else { |
| | | this.queryParams.endtime = ""; |
| | | } |
| | | // æªéæ¶é´èå´æ¶ä¼ nullï¼ç©ºä¸²ä¼è®©å端æ¼åº `donatetime >= ''`ï¼ |
| | | // MySQL ä¸¥æ ¼æ¨¡å¼ä¼æ¥ Incorrect DATETIME value: ''ï¼è§ CHANGELOG 2026-10-22ï¼ |
| | | this.queryParams.starttime = this.starttime || null; |
| | | this.queryParams.endtime = this.endtime || null; |
| | | listDonatebaseinfo(this.queryParams).then((response) => { |
| | | console.log("getlist", response.rows); |
| | | this.donatebaseinfoList = response.rows; |
| | |
| | | <div class="left-course" :class="{ 'left-collapsed': isLeftCollapsed }"> |
| | | <div class="postfilx"> |
| | | <div class="title"> |
| | | å·¥ä½è¿ç¨ |
| | | æ¡ä¾è¿ç¨ |
| | | <el-button |
| | | class="collapse-btn" |
| | | @click="toggleLeftCollapse" |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="form.reporttime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©æ¥åæ¥æ" |
| | | > |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="form.birthday" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©åºçæ¥æ" |
| | | > |
| | |
| | | size="small" |
| | | style="width: 190px" |
| | | v-model="form.contacttime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©æ¥åæ¶é´" |
| | | > |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="medicineform.hospitalassesstime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©é¢çº§è¯ä¼°æ¶é´" |
| | | > |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="medicineform.provincialassesstime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©ç级è¯ä¼°æ¶é´" |
| | | > |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="medicineform.coreteamassesstime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="è¯ä¼°æ¶é´" |
| | | > |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="ethicform.conclusiontime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©ç»è®ºæ¶é´" |
| | | > |
| | |
| | | size="small" |
| | | style="width: 100%" |
| | | v-model="scope.row.applicanttime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©åé
æ¥æ¶æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="witnessform.deathtime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©æ»äº¡æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="witnessform.operationbegtime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©ææ¯å¼å§æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="witnessform.operationendtime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©ææ¯ç»ææ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="witnessform.coordinatorInOperating" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©ææ¯å¼å§æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="witnessform.coordinatorOutOperating" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©ææ¯ç»ææ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="witnessform.coordinatorSignTime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©ææ¯ç»ææ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="witnessform.abdominalaortacannulatime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©è
¹ä¸»å¨èæç®¡æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="witnessform.abdominalaortaperfusiontime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©è
¹ä¸»å¨èçæ³¨æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="witnessform.portalveincannulatime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©é¨éèèæç®¡æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="witnessform.portalveinperfusiontime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©é¨éèçæ³¨æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="witnessform.pulmonaryarterycannulatime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©é¨éèæç®¡æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="witnessform.pulmonaryarteryperfusiontime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©é¨éèçæ³¨æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="witnessform.aortacannulatime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="鿩䏻å¨èæç®¡æ¶é´" |
| | | > |
| | | </el-date-picker> |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="witnessform.aortaperfusiontime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="鿩䏻å¨èçæ³¨æ¶é´" |
| | | > |
| | | </el-date-picker> |
| | |
| | | size="small" |
| | | style="width: 100%" |
| | | v-model="scope.row.organStartTime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="请è¾å
¥è·åå¼å§æ¶é´" |
| | | > |
| | |
| | | size="small" |
| | | style="width: 100%" |
| | | v-model="scope.row.organgettime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="请è¾å
¥å¨å®ç¦»ä½æ¶é´" |
| | | > |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="accomplishform.completetime" |
| | | type="date" |
| | | value-format="yyyy-MM-dd hh:mm:ss" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="鿩宿æ¶é´" |
| | | > |
| | | </el-date-picker> |
| | |
| | | this.isLeftCollapsed = !this.isLeftCollapsed; |
| | | }, |
| | | /** ä¿å主表æé® */ |
| | | submitForm() { |
| | | submitForm(fromProcess) { |
| | | // ä¿åé²éï¼é"æµç¨æ¨è¿"触åçä¿åï¼2 ç§å
çéå¤ç¹å»ç´æ¥å¿½ç¥ï¼é²æ¢é夿å
¥ï¼ |
| | | if (!fromProcess && !this.canSave()) { |
| | | this.$modal.msgWarning("请å¿éå¤æäº¤"); |
| | | return; |
| | | } |
| | | this.$refs["form"].validate(valid => { |
| | | console.log("æäº¤çæ°æ®ä»¬ï¼", this.form); |
| | | if (valid) { |
| | |
| | | "YYYY-MM-DD HH:mm:ss" |
| | | ); |
| | | |
| | | this.form.diseasetype = this.form.diseasetype.join(","); |
| | | |
| | | this.form.infectious = this.form.infectious.join(","); |
| | | this.form.selfwill = this.form.selfwill.join(","); |
| | | this.form.othercases = this.form.othercases.join(","); |
| | | this.form.infosources = this.form.infosources.join(","); |
| | | this.form.kinship = this.form.kinship.join(","); |
| | | this.form.patientstate = this.form.patientstate.join(","); |
| | | // å¤éåæ®µè½¬å符串ï¼å¹çå¤çï¼å·²æ¯å符串æ¶ä¿æåæ ·ï¼ï¼ |
| | | // é¿å
"ä¿åæååæªéæ°å è½½åæ¬¡ä¿å"æ¶æ join is not a function |
| | | [ |
| | | "diseasetype", |
| | | "infectious", |
| | | "selfwill", |
| | | "othercases", |
| | | "infosources", |
| | | "kinship", |
| | | "patientstate" |
| | | ].forEach(key => { |
| | | if (Array.isArray(this.form[key])) { |
| | | this.form[key] = this.form[key].join(","); |
| | | } |
| | | }); |
| | | this.form.registerprovince = this.$refs.registerSelect.getSheng(); |
| | | this.form.registerprovincename = this.registerAddresss.sheng; |
| | | |
| | |
| | | }, |
| | | // ä¿åäºçº§è¡¨æé® |
| | | Savethedetails() { |
| | | // ä¿åé²éï¼2 ç§å
çéå¤ç¹å»ç´æ¥å¿½ç¥ï¼é²æ¢é夿å
¥ï¼ |
| | | if (!this.canSave()) { |
| | | this.$modal.msgWarning("请å¿éå¤æäº¤"); |
| | | return; |
| | | } |
| | | console.log(this.actives); |
| | | if (this.actives == 1) { |
| | | this.medicineform.infoid = this.infoid; |
| | |
| | | updateMedicalevaluation(this.medicineform).then(response => { |
| | | this.$modal.msgSuccess("å»å¦è¯ä¼°ä¿¡æ¯ä¿®æ¹æå"); |
| | | this.$modal.closeLoading(); |
| | | this.Processvalidation(); |
| | | }); |
| | | } else { |
| | | addMedicalevaluation(this.medicineform).then(response => { |
| | | // å填主é®ï¼å¦å䏿¬¡ä¿åä»èµ°"æ°å¢"ï¼ä¼äº§çéå¤è¡ |
| | | if (response && response.data && response.data.id) { |
| | | this.medicineform.id = response.data.id; |
| | | } |
| | | this.$modal.msgSuccess("å»å¦è¯ä¼°ä¿¡æ¯æ°å¢æå"); |
| | | this.$modal.closeLoading(); |
| | | this.Processvalidation(); |
| | | }); |
| | | } |
| | | this.Processvalidation(); |
| | | } |
| | | }); |
| | | } else if (this.actives == 2) { |
| | |
| | | updateRelativesconfirmation(this.affirmform).then(response => { |
| | | this.$modal.msgSuccess("æç®ç¡®è®¤ä¿¡æ¯ä¿®æ¹æå"); |
| | | this.$modal.closeLoading(); |
| | | this.Processvalidation(); |
| | | }); |
| | | } else { |
| | | this.affirmform.residenceprovincename = this.defultAddresss.sheng; |
| | | this.affirmform.residencecityname = this.defultAddresss.shi; |
| | | this.affirmform.residencetownname = this.defultAddresss.qu; |
| | | addRelativesconfirmation(this.affirmform).then(response => { |
| | | // å填主é®ï¼å¦å䏿¬¡ä¿åä»èµ°"æ°å¢"ï¼ä¼äº§çéå¤è¡ |
| | | if (response && response.data && response.data.id) { |
| | | this.affirmform.id = response.data.id; |
| | | } |
| | | this.$modal.msgSuccess("æç®ç¡®è®¤ä¿¡æ¯æ°å¢æå"); |
| | | this.$modal.closeLoading(); |
| | | this.Processvalidation(); |
| | | }); |
| | | } |
| | | this.Processvalidation(); |
| | | } |
| | | }); |
| | | } else if (this.actives == 3) { |
| | |
| | | updateEthicalreviewopinions(this.ethicform).then(res => { |
| | | this.$modal.msgSuccess("伦ç审æ¥ä¿¡æ¯ä¿®æ¹æå"); |
| | | this.$modal.closeLoading(); |
| | | this.Processvalidation(); |
| | | }); |
| | | } else { |
| | | //addDonateflowchart(this.ethicform).then(response => { |
| | | addEthicalreviewopinions(this.ethicform).then(res => { |
| | | // å填主é®ï¼å¦å䏿¬¡ä¿åä»èµ°"æ°å¢"ï¼ä¼äº§çéå¤è¡ |
| | | if (res && res.data && res.data.id) { |
| | | this.ethicform.id = res.data.id; |
| | | } |
| | | this.$modal.msgSuccess("伦ç审æ¥ä¿¡æ¯æ°å¢æå"); |
| | | this.$modal.closeLoading(); |
| | | this.Processvalidation(); |
| | | }); |
| | | } |
| | | this.Processvalidation(); |
| | | } |
| | | }); |
| | | } else if (this.actives == 4) { |
| | |
| | | } |
| | | }); |
| | | saveDonateorgan(this.allocateddata).then(res => { |
| | | // å填主é®ï¼å端已æ"å䏿¡ä¾åä¸å¨å®"å upsertï¼åå¡«åå端ä¸ä¼å误å¤ä¸ºæ°å¢ |
| | | if (res && res.data && res.data.length === this.allocateddata.length) { |
| | | res.data.forEach((row, i) => { |
| | | this.allocateddata[i].id = row.id; |
| | | }); |
| | | } |
| | | if (res.code == 200) { |
| | | this.$modal.msgSuccess("å¨å®æç®åé
ä¿¡æ¯ä¿åæåï¼"); |
| | | this.$modal.closeLoading(); |
| | |
| | | }); |
| | | //ä¿åå¨å®è·åè¡¨æ°æ® |
| | | saveDonationwitnessorgan(this.procureddata).then(res => { |
| | | if (res == 200) { |
| | | if (res && res.data && res.data.length === this.procureddata.length) { |
| | | res.data.forEach((row, i) => { |
| | | this.procureddata[i].id = row.id; |
| | | }); |
| | | } |
| | | if (res.code == 200) { |
| | | this.$modal.msgSuccess("æç®å¨å®è·åä¿¡æ¯ä¿åæåï¼"); |
| | | } |
| | | this.$modal.closeLoading(); |
| | |
| | | } else { |
| | | addDonationwitness(this.witnessform).then(response => { |
| | | if (response.code === 200) { |
| | | // å填主é®ï¼å¦å䏿¬¡ä¿åä»èµ°"æ°å¢" |
| | | if (response.data && response.data.id) { |
| | | this.witnessform.id = response.data.id; |
| | | } |
| | | this.$modal.msgSuccess("è·åè§è¯ä¿¡æ¯æ°å¢æå"); |
| | | this.form.donationcategory = this.witnessform.donationcategory; |
| | | let data = JSON.parse(JSON.stringify(this.form)); |
| | |
| | | }); |
| | | //ä¿åå¨å®è·åè¡¨æ°æ® |
| | | saveDonationwitnessorgan(this.procureddata).then(res => { |
| | | if (res == 200) { |
| | | if (res && res.data && res.data.length === this.procureddata.length) { |
| | | res.data.forEach((row, i) => { |
| | | this.procureddata[i].id = row.id; |
| | | }); |
| | | } |
| | | if (res.code == 200) { |
| | | this.$modal.msgSuccess("æç®å¨å®è·åä¿¡æ¯ä¿åæåï¼"); |
| | | } |
| | | this.$modal.closeLoading(); |
| | |
| | | updateDonatecompletioninfo(this.accomplishform).then(response => { |
| | | this.$modal.msgSuccess("宿ç»è®°ä¿¡æ¯ä¿®æ¹æå"); |
| | | saveDonatecomporgan(this.transplantdata).then(res => { |
| | | if (res == 200) { |
| | | if (res && res.data && res.data.length === this.transplantdata.length) { |
| | | res.data.forEach((row, i) => { |
| | | this.transplantdata[i].id = row.id; |
| | | }); |
| | | } |
| | | if (res.code == 200) { |
| | | this.$modal.msgSuccess("æç®å¨å®ç»è®°ä¿¡æ¯ä¿åæåï¼"); |
| | | } else { |
| | | this.$modal.msgSuccess(res.msg); |
| | |
| | | }); |
| | | } else { |
| | | addDonatecompletioninfo(this.accomplishform).then(response => { |
| | | // å填主é®ï¼å¦å䏿¬¡ä¿åä»èµ°"æ°å¢" |
| | | if (response && response.data && response.data.id) { |
| | | this.accomplishform.id = response.data.id; |
| | | } |
| | | this.$modal.msgSuccess("宿ç»è®°æå"); |
| | | saveDonatecomporgan(this.transplantdata).then(res => { |
| | | if (res && res.data && res.data.length === this.transplantdata.length) { |
| | | res.data.forEach((row, i) => { |
| | | this.transplantdata[i].id = row.id; |
| | | }); |
| | | } |
| | | if (res.code == 200) { |
| | | this.$modal.msgSuccess("æç®å¨å®ç»è®°ä¿¡æ¯ä¿åæåï¼"); |
| | | } else { |
| | |
| | | console.log("å·²å°è¾¾æå¤§å¼"); |
| | | } |
| | | }, |
| | | // ä¿åé²éï¼2 ç§å
éå¤ç¹å»è§ä¸ºéå¤æäº¤ |
| | | canSave() { |
| | | const now = Date.now(); |
| | | if (this.saveLockAt && now - this.saveLockAt < 2000) { |
| | | return false; |
| | | } |
| | | this.saveLockAt = now; |
| | | return true; |
| | | }, |
| | | // æ´æ¹è¿ç¨æéª |
| | | Processvalidation() { |
| | | if (this.form.workflow + 1 == this.actives) { |
| | |
| | | this.form.workflow++; |
| | | } else { |
| | | } |
| | | this.submitForm(); |
| | | // this.GetAttacheddata(); |
| | | // ç±"ä¿åäºçº§è¡¨"触åçä¿åï¼ä¸åä¸é²éï¼å¦åä¼è¢« canSave æ¦æï¼ |
| | | this.submitForm(true); |
| | | } else if (this.form.workflow > this.actives) { |
| | | this.submitForm(); |
| | | // Modifydonationattachment(this.donatelist).then(res => {}); |
| | | // this.GetAttacheddata(); |
| | | this.submitForm(true); |
| | | } else { |
| | | this.submitForm(); |
| | | // this.$modal.msgWarning("请å
宿å鍿¥éª¤"); |
| | | this.submitForm(true); |
| | | return; |
| | | } |
| | | }, |
| | |
| | | <style lang="scss" scoped> |
| | | .particularsdiv { |
| | | display: flex; |
| | | background-color: #f5f7fa; |
| | | background-color: var(--opo-bg-page, #f5f7fa); |
| | | height: 100vh; |
| | | overflow: hidden; |
| | | transition: all 0.3s ease; |
| | | |
| | | // 左侧工ä½è¿ç¨æ |
| | | // 左侧工ä½è¿ç¨æ ï¼2026-10-22ï¼å»æåºè²ï¼åªç䏿¡åéçº¿ï¼æ 颿忹åçéï¼ |
| | | .left-course { |
| | | background: #fff; |
| | | background: transparent; |
| | | width: 220px; |
| | | min-width: 220px; |
| | | text-align: center; |
| | | margin: 0; |
| | | padding: 0; |
| | | height: 100%; |
| | | box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1); |
| | | border-right: 1px solid var(--opo-border-base, #e5e7eb); |
| | | transition: all 0.3s ease; |
| | | position: relative; |
| | | z-index: 100; |
| | |
| | | flex-direction: column; |
| | | |
| | | .title { |
| | | background: #22a2c3; |
| | | background: transparent; |
| | | margin-bottom: 0; |
| | | padding: 15px 10px; |
| | | color: #fff; |
| | | color: var(--opo-primary, #0e768f); |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | display: flex; |
| | |
| | | transition: all 0.3s ease; |
| | | min-height: 54px; // ç¡®ä¿æ é¢åºåæåºå®é«åº¦ |
| | | box-sizing: border-box; |
| | | border-bottom: 1px solid var(--opo-border-base, #e5e7eb); |
| | | |
| | | .collapse-btn { |
| | | background: rgba(255, 255, 255, 0.2); |
| | | border: none; |
| | | color: #fff; |
| | | // æ é¢åºè²å»æåï¼æé®æ¹ä¸ºæµ
éæè¾¹é£æ ¼ï¼é¿å
ç½åºç½åçä¸è§ |
| | | background: var(--opo-primary-light-9, #e7f1f4); |
| | | border: 1px solid var(--opo-primary-light-7, #b7d6dd); |
| | | color: var(--opo-primary, #0e768f); |
| | | width: 32px; // ç¨å¾®å¢å¤§ç¡®ä¿å¯ç¹å»åºå |
| | | height: 32px; |
| | | padding: 0; |
| | |
| | | flex-shrink: 0; // 鲿¢æé®è¢«å缩 |
| | | |
| | | &:hover { |
| | | background: rgba(255, 255, 255, 0.3); |
| | | background: var(--opo-primary-light-7, #b7d6dd); |
| | | border-color: var(--opo-primary, #0e768f); |
| | | transform: scale(1.1); |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | // æ¥éª¤æ ·å¼ä¼å |
| | | // æ¥éª¤æ ·å¼ä¼åï¼é
è²ç»ä¸å°ç³»ç»åçè²ï¼teal #0E768Fï¼ |
| | | ::v-deep .el-steps { |
| | | &.el-steps--vertical { |
| | | height: 100%; |
| | |
| | | |
| | | .el-step__head { |
| | | &.is-finish { |
| | | color: #22a2c3; |
| | | border-color: #22a2c3; |
| | | color: var(--opo-primary, #0e768f); |
| | | border-color: var(--opo-primary, #0e768f); |
| | | } |
| | | } |
| | | |
| | | .el-step__title { |
| | | font-size: 14px; |
| | | font-size: var(--opo-font-size-sm); |
| | | font-weight: 600; |
| | | |
| | | &.is-finish { |
| | | color: #22a2c3; |
| | | color: var(--opo-primary, #0e768f); |
| | | } |
| | | } |
| | | |
| | | .el-step__description { |
| | | font-size: 12px; |
| | | color: #666; |
| | | font-size: var(--opo-font-size-xs); |
| | | // æè¿°æåç»ä¸ç¨ä¸æ§ç°ï¼é¿å
æ´å颿¿è¢«åçè²æ·¹æ²¡ |
| | | color: var(--opo-text-secondary, #6b7280); |
| | | line-height: 1.5; |
| | | |
| | | &.is-finish { |
| | | color: #22a2c3; |
| | | color: var(--opo-text-regular, #4b5563); |
| | | } |
| | | |
| | | p { |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="form.deathtime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©æ»äº¡æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="form.operationbegtime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©ææ¯å¼å§æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="form.operationendtime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©ææ¯ç»ææ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="form.abdominalaortacannulatime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©è
¹ä¸»å¨èæç®¡æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="form.abdominalaortaperfusiontime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©è
¹ä¸»å¨èçæ³¨æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="form.portalveincannulatime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©é¨éèèæç®¡æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="form.portalveinperfusiontime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©é¨éèçæ³¨æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="form.pulmonaryarterycannulatime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©é¨éèæç®¡æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="form.pulmonaryarteryperfusiontime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©é¨éèçæ³¨æ¶é´" |
| | | > |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="form.aortacannulatime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="鿩䏻å¨èçæ³¨æ¶é´" |
| | | > |
| | | </el-date-picker> |
| | |
| | | <el-date-picker |
| | | clearable |
| | | v-model="form.aortaperfusiontime" |
| | | type="datetime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="鿩䏻å¨èçæ³¨æ¶é´" |
| | | > |
| | | </el-date-picker> |
| | |
| | | size="small" |
| | | style="width: 100%" |
| | | v-model="scope.row.organgettime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©å¨å®è·åæ¶é´" |
| | | > |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="120px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="120px"> |
| | | <el-form-item label="æç®å§å" prop="name"> |
| | | <el-input v-model="queryParams.name" placeholder="请è¾å
¥å§å" clearable size="small" |
| | | @keyup.enter.native="handleQuery" /> |
| | |
| | | </el-table-column> |
| | | <el-table-column prop="amounttime" align="center" label="æ¥æ¶æ¶é´" width="120"> |
| | | <template slot-scope="scope"> |
| | | <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.amounttime" type="date" |
| | | <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.amounttime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="æ¥æ¶æ¶é´"> |
| | | </el-date-picker> </template> |
| | | </el-table-column> |
| | |
| | | </el-table-column> |
| | | <el-table-column prop="amounttime" align="center" label="æ¶æ¬¾æ¶é´" width="120"> |
| | | <template slot-scope="scope"> |
| | | <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.amounttime" type="date" |
| | | <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.amounttime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="æ¶æ¬¾æ¶é´" @blur="getdays(scope.row)"> |
| | | </el-date-picker> </template> |
| | | </el-table-column> |
| | |
| | | size="small" |
| | | style="width: 100%" |
| | | v-model="scope.row.amounttime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="宿¶æ¶é´" |
| | | > |
| | |
| | | size="small" |
| | | style="width: 100%" |
| | | v-model="scope.row.organtime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="ç§»æ¤æ¶é´" |
| | | > |
| | |
| | | import Li_area_select from "@/components/Address"; |
| | | import { getUserProfile } from "@/api/system/user"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { moneySum, moneyRound } from "@/utils/money"; |
| | | import debounce from "lodash/debounce"; |
| | | export default { |
| | | components: { |
| | |
| | | submitForm: debounce(function(data) { |
| | | this.$refs["form"].validate(valid => { |
| | | if (valid) { |
| | | //æ ¡éªãè´¹ç¨å计 |
| | | let ChargeSum = 0; |
| | | let ChargeamountSum = 0; |
| | | //æ ¡éªãè´¹ç¨å计ï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ |
| | | let organname = ""; |
| | | |
| | | try { |
| | | for (let i = 0; i < this.donorchargeorgans.length; i++) { |
| | | organname += this.donorchargeorgans[i].organname + ","; |
| | | if (!isNaN(parseFloat(this.donorchargeorgans[i].organcharge))) { |
| | | ChargeSum += parseFloat(this.donorchargeorgans[i].organcharge); |
| | | } |
| | | if (!isNaN(parseFloat(this.donorchargeorgans[i].amount))) { |
| | | ChargeamountSum += parseFloat(this.donorchargeorgans[i].amount); |
| | | } |
| | | } |
| | | this.form.donateorgan = organname.substring( |
| | | 0, |
| | | organname.lastIndexOf(",") |
| | | ); |
| | | this.form.chargeamount = ChargeSum.toFixed(2); |
| | | this.form.chargeamounted = ChargeamountSum.toFixed(2); |
| | | this.form.chargeamount = moneyRound( |
| | | moneySum(this.donorchargeorgans, "organcharge") |
| | | ).toFixed(2); |
| | | this.form.chargeamounted = moneyRound( |
| | | moneySum(this.donorchargeorgans, "amount") |
| | | ).toFixed(2); |
| | | } catch {} |
| | | |
| | | //ä¿å |
| | |
| | | }); |
| | | }, 500), |
| | | |
| | | //计ç®è´¹ç¨å计 |
| | | //计ç®è´¹ç¨å计ï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ |
| | | chargeSum() { |
| | | let ChargeSum = 0; |
| | | let ChargeamountSum = 0; |
| | | |
| | | //è´¹ç¨å计 |
| | | try { |
| | | for (let i = 0; i < this.donorchargeorgans.length; i++) { |
| | | if (!isNaN(parseFloat(this.donorchargeorgans[i].organcharge))) { |
| | | ChargeSum += parseFloat(this.donorchargeorgans[i].organcharge); |
| | | } |
| | | if (!isNaN(parseFloat(this.donorchargeorgans[i].amount))) { |
| | | ChargeamountSum += parseFloat(this.donorchargeorgans[i].amount); |
| | | } |
| | | } |
| | | |
| | | this.form.chargeamount = ChargeSum.toFixed(2); |
| | | this.form.chargeamounted = ChargeamountSum.toFixed(2); |
| | | this.form.chargeamount = moneyRound( |
| | | moneySum(this.donorchargeorgans, "organcharge") |
| | | ).toFixed(2); |
| | | this.form.chargeamounted = moneyRound( |
| | | moneySum(this.donorchargeorgans, "amount") |
| | | ).toFixed(2); |
| | | } catch {} |
| | | }, |
| | | |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="å¨å®ç¼ç " prop="organcode"> |
| | | <el-input |
| | | v-model="queryParams.organcode" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="form.createTime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©ç»è®ºæ¶é´" |
| | | > |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px"> |
| | | |
| | | <el-form-item label="è´¦å·ç±»å«" prop="usertype"> |
| | | <el-select v-model="queryParams.usertype" placeholder="è¯·éæ©è´¦å·ç±»å«" clearable size="small"> |
| | |
| | | |
| | | <el-table v-loading="loading" :data="externalpersonList" @selection-change="handleSelectionChange"> |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="è´¦å·ç±»å«" align="center" prop="usertype"> |
| | | <el-table-column label="è´¦å·ç±»å«" align="center" prop="usertype" width="220"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag :options="dict.type.sys_UserType" :value="scope.row.usertype" /> |
| | | <dict-tag v-for="t in splitUserType(scope.row.usertype)" :key="t" |
| | | :options="dict.type.sys_UserType" :value="t" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="è´¦å·ç¼å·" align="center" prop="userno" /> |
| | |
| | | <el-form ref="form" :model="form" :rules="rules" label-width="120px"> |
| | | <el-row> |
| | | <el-col :span="12"><el-form-item label="è´¦å·ç±»å«" prop="usertype"> |
| | | <el-select v-model="form.usertype" placeholder="è¯·éæ©è´¦å·ç±»å«"> |
| | | <el-select v-model="form.usertype" multiple collapse-tags placeholder="è¯·éæ©è´¦å·ç±»å«ï¼å¯å¤éï¼"> |
| | | <el-option v-for="dict in dict.type.sys_UserType" :key="dict.value" :label="dict.label" |
| | | :value="dict.value"></el-option> |
| | | </el-select> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å¯ç¨ç¶æ" prop="userstatus" :disabled="ismanager == false"> |
| | | <el-radio-group v-model="form.userstatus"> |
| | | <el-form-item label="å¯ç¨ç¶æ" prop="userstatus" > |
| | | <el-radio-group v-model="form.userstatus" :disabled="!ismanager"> |
| | | <el-radio v-for="dict in dict.type.sys_0_1" :key="dict.value" :label="parseInt(dict.value)">{{ |
| | | dict.label |
| | | }}</el-radio> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row v-if="form.usertype != 'org'"> |
| | | <el-row v-if="!isUnitForm"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="身份è¯å·" prop="idcardno"> |
| | | <el-input v-model="form.idcardno" placeholder="请è¾å
¥èº«ä»½è¯å·" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row v-if="form.usertype != 'org'"><el-col :span="12"> |
| | | <el-row v-if="!isUnitForm"><el-col :span="12"> |
| | | <el-form-item label="æ§å«" prop="sex"> |
| | | <el-select v-model="form.sex" placeholder="è¯·éæ©æ§å«"> |
| | | <el-option v-for="dict in dict.type.sys_user_sex" :key="dict.value" :label="dict.label" |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row v-if="form.usertype != 'org'"> |
| | | <el-row v-if="!isUnitForm"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æå¨åä½" prop="unitname"> |
| | | <el-select v-model="form.unitno" placeholder="æå¨åä½" clearable filterable allow-create style="width: 100%"> |
| | |
| | | usertype: null |
| | | }, |
| | | |
| | | //æ¯å¦æ¯ä¸å®¶è´¹çOPO审æ¹äººå |
| | | ismanager: false, |
| | | |
| | | // æ¥è¯¢ææ°åºå·åæ° |
| | | seqnoParams: { |
| | | businessType: "externalperson", |
| | |
| | | { required: true, message: "请è¾å
¥è´¦æ·åç§°", trigger: "blur" } |
| | | ], |
| | | idcardno: [ |
| | | { required: true, message: "请è¾å
¥èº«ä»½è¯å·ç ", trigger: "blur" } |
| | | { |
| | | //è´¦å·ç±»å«ä¸º"å使ºæ"æ¶æ é身份è¯å· |
| | | validator: (rule, value, callback) => { |
| | | if (this.hasUserType(this.form.usertype, "org")) { |
| | | return callback(); |
| | | } |
| | | if (!value || !String(value).trim()) { |
| | | return callback(new Error("请è¾å
¥èº«ä»½è¯å·ç ")); |
| | | } |
| | | return callback(); |
| | | }, |
| | | trigger: "blur" |
| | | } |
| | | ], |
| | | bankcardno: [ |
| | | { required: true, message: "请è¾å
¥é¶è¡è´¦å·", trigger: "blur" } |
| | |
| | | depositbank: [ |
| | | { required: true, message: "请è¾å
¥å¼æ·é¶è¡", trigger: "blur" } |
| | | ] |
| | | }, |
| | | //æ¯å¦æ¯ä¸å®¶è´¹çOPO审æ¹äººå |
| | | ismanager: false |
| | | }, |
| | | }; |
| | | }, |
| | | computed: { |
| | | /** è¡¨åæ¯å¦éæ©äº"å使ºæ"ï¼è´¦å·ç±»å«ä¸ºå¤å¼ï¼å« org å³ä¸ºåä½ï¼ */ |
| | | isUnitForm() { |
| | | return this.hasUserType(this.form.usertype, "org"); |
| | | } |
| | | }, |
| | | created() { |
| | | this.getUserProfile(); |
| | |
| | | methods: { |
| | | //è·åå½åç¨æ·ä¿¡æ¯ |
| | | getUserProfile() { |
| | | getUserProfile().then(res => { |
| | | if ( |
| | | res.data.userName == "admin" || |
| | | res.data.userName == "053" || |
| | | res.data.userName == "047" |
| | | ) { |
| | | this.ismanager = true; |
| | | } else { |
| | | this.ismanager = false; |
| | | } |
| | | getUserProfile().then(res => { |
| | | const managerList = ["admin", "048", "047"]; |
| | | this.ismanager = managerList.includes(res.data.userName); |
| | | }); |
| | | }, |
| | | |
| | | /** 人åç±»åï¼å¤å¼ï¼éå·åéï¼è½¬æ°ç» */ |
| | | splitUserType(usertype) { |
| | | if (!usertype) { |
| | | return []; |
| | | } |
| | | if (Array.isArray(usertype)) { |
| | | return usertype; |
| | | } |
| | | return String(usertype) |
| | | .split(",") |
| | | .map(t => t.trim()) |
| | | .filter(t => t); |
| | | }, |
| | | /** 人åç±»åæ°ç»è½¬éå·åéå符串 */ |
| | | joinUserType(usertype) { |
| | | return Array.isArray(usertype) ? usertype.join(",") : usertype; |
| | | }, |
| | | /** 人åç±»åæ¯å¦å
嫿å®ç±»åï¼å¦ org = å使ºæï¼ */ |
| | | hasUserType(usertype, code) { |
| | | return this.splitUserType(usertype).indexOf(code) > -1; |
| | | }, |
| | | |
| | | /** æ¥è¯¢åä½ã人åè´¦å·å表 */ |
| | |
| | | userno: null, |
| | | username: null, |
| | | userstatus: 0, |
| | | usertype: null, |
| | | usertype: [], |
| | | personnelunitno: null, |
| | | delFlag: null, |
| | | createBy: null, |
| | |
| | | const id = row.id || this.ids; |
| | | getExternalperson(id).then(response => { |
| | | this.form = response.data; |
| | | //è´¦å·ç±»å«ä¸ºå¤å¼ï¼éå·åéï¼ï¼è¡¨åç¨æ°ç»åæ¾ |
| | | this.form.usertype = this.splitUserType(response.data.usertype); |
| | | this.open = true; |
| | | this.title = "人å/åä½è´¦å·ä¿¡æ¯ä¿®æ¹"; |
| | | }); |
| | |
| | | if (res.organizationid == this.form.unitno) |
| | | this.form.unitname = res.organizationname; |
| | | }); |
| | | //è´¦å·ç±»å«ä¸ºå¤å¼ï¼æäº¤å转åéå·åéçå符串 |
| | | this.form.usertype = this.joinUserType(this.form.usertype); |
| | | console.log(this.form); |
| | | if (this.form.id != null) { |
| | | updateExternalperson(this.form).then(response => { |
| | |
| | | this.getList(); |
| | | }); |
| | | } else { |
| | | //æ£æ¥èº«ä»½è¯å¯ä¸ |
| | | getInfoByIDCardNo(this.form.idcardno).then(res => { |
| | | if (res.data.length > 1) { |
| | | this.$modal.msgWarning("身份è¯å·ä¿¡æ¯å·²è¢«ç»è®°ï¼è¯·æ£æ¥èº«ä»½è¯å·ï¼" |
| | | ); |
| | | return; |
| | | } |
| | | |
| | | //ä¿åä¿¡æ¯ |
| | | //ä¿åä¿¡æ¯ï¼åä½è´¦å·æ²¡æèº«ä»½è¯å·ï¼è·³è¿èº«ä»½è¯æ¥éï¼ |
| | | const saveNew = () => { |
| | | getOnlyCode(this.seqnoParams).then(res => { |
| | | this.form.userno = res.data.currentvalue; |
| | | |
| | |
| | | this.getList(); |
| | | }); |
| | | }); |
| | | }; |
| | | |
| | | if (!this.form.idcardno || !String(this.form.idcardno).trim()) { |
| | | saveNew(); |
| | | return; |
| | | } |
| | | |
| | | //æ£æ¥èº«ä»½è¯å¯ä¸ |
| | | getInfoByIDCardNo(this.form.idcardno).then(res => { |
| | | if (res.data.length > 1) { |
| | | this.$modal.msgWarning("身份è¯å·ä¿¡æ¯å·²è¢«ç»è®°ï¼è¯·æ£æ¥èº«ä»½è¯å·ï¼" |
| | | ); |
| | | return; |
| | | } |
| | | saveNew(); |
| | | }); |
| | | } |
| | | } |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="项ç®ç±»å" prop="itemtype"> |
| | | <el-select v-model="queryParams.itemtype" placeholder="è¯·éæ©é¡¹ç®ç±»å" clearable size="small"> |
| | | <el-option v-for="dict in dict.type.sys_ConsolationType" :key="dict.value" :label="dict.label" |
| | |
| | | </el-col> |
| | | <el-col :span="5"> |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="applyTime"> |
| | | <el-date-picker clearable :disabled="true" style="width: 100%" v-model="form.applyTime" type="date" |
| | | <el-date-picker clearable :disabled="true" style="width: 100%" v-model="form.applyTime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="æ¥ æ"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | |
| | | <el-form-item label="æç®æ¡ä¾" prop="name"> |
| | | <el-input :disabled="true" v-model="form.donorname" placeholder="请è¾å
¥æç®è
å§å" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="4"> |
| | | <div style="margin-left: 10px;"> |
| | | <dict-tag |
| | | :options="dict.type.sys_DonationStatus" |
| | | :value="form.invoicecount" |
| | | /> |
| | | </div> |
| | | </el-col> |
| | | </el-col> |
| | | <el-col :span="10"> |
| | | <el-form-item label="ç³è¯·è¯´æ" prop="remark"> |
| | | <el-input v-model="form.remark" placeholder="ç³è¯·è¯´æ" /> |
| | |
| | | v-if="businessType == '1' || businessType == '2'"> |
| | | <template slot-scope="scope"> |
| | | <el-form-item label-width="0"> |
| | | <el-input :disabled="userprofile.nickName != 'éæ
å'" v-model.number="scope.row.idcardno" |
| | | @input="tableParValueChange1(scope.row)" placeholder="身份è¯å·" /> |
| | | <el-input :disabled="userprofile.nickName != 'éæ
å' || scope.row.isunit == 1" |
| | | :placeholder="scope.row.isunit == 1 ? 'å使 éå¡«å' : '身份è¯å·'" |
| | | v-model.number="scope.row.idcardno" @input="tableParValueChange1(scope.row)" /> |
| | | </el-form-item> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | </el-dialog> |
| | | |
| | | <!-- æ¹ééå --> |
| | | <el-dialog title="æ¹éçææç»ä¿¡æ¯" :visible.sync="batchdialogVisible" width="30%"> |
| | | <el-dialog title="æ¹éçææç»ä¿¡æ¯" :visible.sync="batchdialogVisible" width="35%"> |
| | | <div style="margin-bottom: 12px"> |
| | | <el-input v-model="personKeyword" clearable size="small" prefix-icon="el-icon-search" |
| | | placeholder="è¾å
¥ å§å / åä½ / å·¥å· / 身份è¯å4ä½ çæ¥" style="width: 330px" /> |
| | | <span style="margin-left: 10px; color: #909399; font-size: 12px">å
± {{ filteredCityOptions.length }} 人</span> |
| | | </div> |
| | | <div style="max-height: 300px; overflow-y: auto"> |
| | | <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange">å
¨é</el-checkbox> |
| | | <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange">å
¨éï¼å½åçæ¥ç»æï¼</el-checkbox> |
| | | <div style="margin: 15px 0;"></div> |
| | | <el-checkbox-group v-model="checkedCities" @change="handleCheckedCitiesChange"> |
| | | <el-checkbox border v-for="city in cityOptions" :label="city" :key="city.reportNo">{{ city.reportName |
| | | }}</el-checkbox> |
| | | <el-checkbox border v-for="city in filteredCityOptions" :label="city" |
| | | :key="city.reportNo + '_' + city.reportName">{{ city.reportName |
| | | }}{{ city.unitname ? " · " + city.unitname : "" }}</el-checkbox> |
| | | </el-checkbox-group> |
| | | </div> |
| | | |
| | |
| | | addorupdateFund, |
| | | ManualCalculation, |
| | | getdetailsByItemId, |
| | | validateExpertFee, |
| | | listbypower |
| | | } from "@/api/project/fund"; |
| | | |
| | |
| | | import Li_area_select from "@/components/Address"; |
| | | import OrgSelecter from "@/views/project/components/orgselect"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { moneySum, moneyMul, moneySub, moneyRound } from "@/utils/money"; |
| | | import { checkFileName, checkDetails } from "@/utils/fileNameCheck"; |
| | | import CustomImageViewer from "@/components/CustomImageViewer"; // æ ¹æ®ä½ çè·¯å¾è°æ´ |
| | | |
| | | export default { |
| | |
| | | return callback(); |
| | | } |
| | | const regex = /^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}([0-9]|X)$/; |
| | | if (regex.test(value)) { |
| | | } else { |
| | | callback(new Error("身份è¯å·ç æ ¼å¼é误")); |
| | | // 2026-10-19ï¼æ ¼å¼ä¸åæ³ç«å³æ©éãåæ¥åæ if/else ä½ else éæ²¡æ returnï¼ |
| | | // ä¼ç»§ç»å¾ä¸èµ°å¼æ¥æ¥éï¼å¯¼è´ callback 被è°ç¨ä¸¤æ¬¡ã"身份è¯å·ç æ ¼å¼é误"被åç»ç»æè¦çã |
| | | if (!regex.test(value)) { |
| | | return callback(new Error("身份è¯å·ç æ ¼å¼é误")); |
| | | } |
| | | |
| | | // 2. è°ç¨å端æ¥å£è¿è¡é夿§æ ¡éª |
| | |
| | | // ç½ç»è¯·æ±å¤´ |
| | | Networkheader: null, |
| | | batchdialogVisible: false, |
| | | //æ¹éå½å
¥å¼¹æ¡ççæ¥å
³é®å |
| | | personKeyword: "", |
| | | itemlist: [], |
| | | cityOptions: [], |
| | | checkAll: false, |
| | |
| | | }, |
| | | |
| | | dialogrules: { |
| | | // 2026-10-19ï¼è´¦æ·åç§°ï¼è´¦æ·æ¥æº=ä»è´¦æ·åº æ¶ç䏿ï¼ä¹æ¯å¿
è¾é¡¹ |
| | | accountname: [ |
| | | { required: true, message: "è¯·éæ©è´¦æ·åç§°", trigger: "change" } |
| | | ], |
| | | usertype: [ |
| | | { required: true, message: "请è¾å
¥è´¦æ·ç±»å", trigger: "blur" } |
| | | ], |
| | |
| | | ], |
| | | unitTaxNo: [{ required: true, message: "请è¾å
¥ç¨å·", trigger: "blur" }], |
| | | idcardno: [ |
| | | { required: true, message: '请è¾å
¥èº«ä»½è¯å·', trigger: 'blur' }, |
| | | { |
| | | // 2026-10-19ï¼å required æ è®°åªä¸ºè®© el-form-item æ åºå¿
è¾æå·ï¼Element ç isRequired åªè®¤ rule.requiredï¼ã |
| | | // æ¬è§å带 validatorï¼async-validator ç getValidationMethod ä¼ç´æ¥è¿å该 validatorãè·³è¿å
建 required æ£æ¥ï¼ |
| | | // æä»¥æ ¡éªè¡ä¸ºä¸æ¹å¨åå®å
¨ä¸è´ï¼å¦å¤**ä¸è½å message**ï¼å¦åä¼è¦çä¸é¢èªå®ä¹ validator çæ¥éææ¡ã |
| | | required: true, |
| | | // è´¦æ·ç±»åéæ©"å使ºæ"æ¶ä¸éè¦èº«ä»½è¯å· |
| | | validator: (rule, value, callback) => { |
| | | if (this.hasUserType(this.accountselectform.usertype, "org")) { |
| | | return callback(); |
| | | } |
| | | if (!value || !String(value).trim()) { |
| | | return callback(new Error("请è¾å
¥èº«ä»½è¯å·")); |
| | | } |
| | | return callback(); |
| | | }, |
| | | trigger: "blur" |
| | | }, |
| | | // æ·»å èªå®ä¹æ ¡éªè§å |
| | | { validator: validateIdCard, trigger: 'blur' } |
| | | ], |
| | |
| | | }, |
| | | |
| | | //çå¬å±æ§ 类似äºdataæ¦å¿µ |
| | | computed: {}, |
| | | computed: { |
| | | //æ¹éå½å
¥å¼¹æ¡ï¼æå
³é®åï¼å§å/åä½/å·¥å·/身份è¯å4ä½ï¼çæ¥åçåé人 |
| | | filteredCityOptions() { |
| | | const kw = (this.personKeyword || "").trim().toLowerCase(); |
| | | if (!kw) { |
| | | return this.cityOptions; |
| | | } |
| | | return this.cityOptions.filter(item => this.personMatchKeyword(item, kw)); |
| | | } |
| | | }, |
| | | //çæ§dataä¸çæ°æ®åå |
| | | watch: {}, |
| | | //æ¹æ³éå |
| | |
| | | }, |
| | | /** æäº¤æé® */ |
| | | submitForm: debounce(function () { |
| | | // 2026-10-15ï¼ä¿ååéä»¶æä»¶åè§èæ ¡éªï¼ä»
æ°å¢åæ®ï¼èåæ®çåå²éä»¶ç±å端æ"åªæ ¡éªæ¬æ¬¡åæ´"æ¾è¡ï¼ |
| | | if (!this.checkDetailFileNames()) { |
| | | return; |
| | | } |
| | | |
| | | if (!this.randomnumber) { |
| | | this.randomnumber = this.generateRandomString(9); |
| | | this.form.randomnumber = this.randomnumber; |
| | |
| | | this.$refs["form"].validate(valid => { |
| | | if (valid) { |
| | | this.formData = this.form; |
| | | |
| | | // ä¸å®¶å³å¡è´¹ä¸ç¨ï¼9 æ¡è´¹ç¨æ§å¶è§åæ ¡éªï¼æ ¡éªä¸éè¿ä¸å
许ä¿åï¼ |
| | | if (this.businessType == "1") { |
| | | this.$modal.loading("æ£å¨æ ¡éªä¸å®¶å³å¡è´¹ç¨ï¼è¯·ç¨åï¼"); |
| | | this.checkExpertFeeRules("ä¿å").then((allowed) => { |
| | | this.$modal.closeLoading(); |
| | | if (allowed) { |
| | | this.doSubmitForm(); |
| | | } |
| | | }); |
| | | return; |
| | | } |
| | | |
| | | this.doSubmitForm(); |
| | | } |
| | | }); |
| | | }, 500), |
| | | |
| | | /** |
| | | * ä¿åç³è¯·åçå®é
è½åºé»è¾ã |
| | | * |
| | | * ä» submitForm 䏿åºï¼ä¾¿äºå¨ä¸å®¶å³å¡è´¹è§åæ ¡éªéè¿ååæ§è¡ï¼ |
| | | * å
¶ä»ä¸å¡ç±»åç± submitForm ç´æ¥è°ç¨ï¼è¡ä¸ºä¸æååä¸è´ã |
| | | */ |
| | | doSubmitForm() { |
| | | |
| | | //ä¿ååæ ¡éªæ°æ® |
| | | for (let k = 0; k < this.rbDetails.length; k++) { |
| | |
| | | let tempDetail = this.rbDetails[j]; |
| | | if ( |
| | | isNaN(parseFloat(tempDetail.amount)) || |
| | | parseFloat(tempDetail.amount) == 0 |
| | | moneyRound(tempDetail.amount) == 0 |
| | | ) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼ç¬¬" + |
| | |
| | | let tempDetail = this.rbDetails[j]; |
| | | if ( |
| | | isNaN(parseFloat(tempDetail.amount)) || |
| | | parseFloat(tempDetail.amount) == 0 |
| | | moneyRound(tempDetail.amount) == 0 |
| | | ) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼ç¬¬" + |
| | |
| | | } |
| | | if ( |
| | | isNaN(parseFloat(tempDetail.taxamount)) || |
| | | parseFloat(tempDetail.taxamount) == 0 |
| | | moneyRound(tempDetail.taxamount) == 0 |
| | | ) { |
| | | tempDetail.taxedamount = parseFloat(tempDetail.amount); |
| | | } else { |
| | |
| | | //å
³éçªå£ |
| | | this.loading = false; |
| | | // this.getfundList(); |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * ä¸å®¶å³å¡è´¹ 9 æ¡è´¹ç¨æ§å¶è§åæ ¡éªï¼æäº¤åæ¦æªï¼ã |
| | | * |
| | | * éç¨èå´ï¼businessType === '1'ï¼ä¸å®¶å³å¡è´¹ç³è¯·åï¼ï¼ä¸å端 applytype === '1' 对åºã |
| | | * å
¶ä»ä¸å¡ç±»åï¼ä¼¦çä¸å®¶è´¹ãå»å¦ææ¬ãåå
¬è´¹ç¨ï¼ä¸æ ¡éªï¼ç´æ¥æ¾è¡ã |
| | | * |
| | | * æ ¡éªå£å¾ï¼åä¸æç®æ¡ä¾ infoid ä¸ç´¯è®¡ï¼ç±å端ç»ä¸å®ç°ï¼ |
| | | * errors 黿åï¼æç¤ºè¿åçå
·ä½è§åï¼ä¸å
许继ç»ä¿å/å®¡æ ¸ |
| | | * warnings æç¤ºåï¼ä»
æéç»å人å¤çï¼è§å 5ã6ï¼ï¼éäºæ¬¡ç¡®è®¤åæç»§ç» |
| | | * |
| | | * @param {string} action å½åå¨ä½ï¼ç¨äºæ¼æ¥æç¤ºææ¡ï¼å¦âä¿åââæäº¤å®¡æ ¸âï¼ |
| | | * @returns {Promise<boolean>} true å
许继ç»ï¼false 黿¢ç»§ç» |
| | | */ |
| | | checkExpertFeeRules(action) { |
| | | if (this.businessType != "1") { |
| | | return Promise.resolve(true); |
| | | } |
| | | // å端æãæ¡ä¾å
å·²æåæ® + æ¬æ¬¡æäº¤æç»ãå并计ç®ï¼ç¡®ä¿å°æªè½åºçæç»ä¹å䏿 ¡éª |
| | | const payload = Object.assign({}, this.form, { |
| | | applytype: this.form.applytype || "1", |
| | | serviceFunddetails: this.rbDetails, |
| | | }); |
| | | }, 500), |
| | | // ææ¥ç¨ï¼è½ç´æ¥ä»æ§å¶å°çå°å°åºéäºä»ä¹ï¼ä»¥åå端å¤å®äºä»ä¹ |
| | | console.log("[ä¸å®¶è´¹æ ¡éª] æäº¤æ ¡éª", action, { |
| | | businessType: this.businessType, |
| | | applytype: payload.applytype, |
| | | infoid: payload.infoid, |
| | | fundId: payload.id, |
| | | æç»: (this.rbDetails || []).map((d) => ({ |
| | | itemid: d.itemid, |
| | | amount: d.amount, |
| | | taxedamount: d.taxedamount, |
| | | åºæ¯: d.servicesscopename, |
| | | })), |
| | | }); |
| | | |
| | | return validateExpertFee(payload) |
| | | .then((res) => { |
| | | const errors = (res && res.errors) || []; |
| | | const warnings = (res && res.warnings) || []; |
| | | console.log("[ä¸å®¶è´¹æ ¡éª] å端è¿å", { errors, warnings }); |
| | | |
| | | // 1) 黿åï¼ååºè¿åçå
·ä½è§åï¼ä¸å
è®¸ç»§ç» |
| | | // ç¨å¼¹çªèéè½»æç¤ºï¼é误å¯è½æå¤æ¡ï¼è½»æç¤ºä¼æ¤æä¸è¡ä¸å¾å¿«æ¶å¤± |
| | | if (errors.length > 0) { |
| | | this.$modal.alertError( |
| | | "ä¸å®¶å³å¡è´¹ç¨ä¸ç¬¦å以ä¸è§å®ï¼æ æ³" + |
| | | action + |
| | | "ï¼\n\n" + |
| | | errors.map((msg, i) => i + 1 + ". " + msg).join("\n\n") |
| | | ); |
| | | return false; |
| | | } |
| | | |
| | | // 2) æç¤ºåï¼éç»å人确认åæè½ç»§ç»ï¼å½åè§å 5ã6 å·²æ¹ä¸ºç¡¬æ¦æªï¼æ¤åæ¯ä¿çå¤ç¨ï¼ |
| | | if (warnings.length > 0) { |
| | | const confirmText = |
| | | "ä¸å®¶å³å¡è´¹ç¨åå¨ä»¥ä¸é®é¢ï¼è¯·ç¡®è®¤æ¯å¦ç»§ç»" + |
| | | action + |
| | | "ï¼\n\n" + |
| | | warnings.map((msg, i) => i + 1 + ". " + msg).join("\n\n"); |
| | | return this.$modal |
| | | .confirm(confirmText) |
| | | .then(() => true) |
| | | .catch(() => false); |
| | | } |
| | | |
| | | return true; |
| | | }) |
| | | .catch((err) => { |
| | | // æ¥å£å¼å¸¸æ¶æâä¸é»æâå¤çï¼é¿å
æ ¡éªæå¡ä¸å¯ç¨å¯¼è´å®å
¨æ æ³æ¥éï¼ |
| | | // å端 addOrUpdateNew / checkFund ä»æåæ ·çç¡¬æ¦æªå
åºã |
| | | console.error("ä¸å®¶å³å¡è´¹è§åæ ¡éªæ¥å£è°ç¨å¤±è´¥", err); |
| | | return true; |
| | | }); |
| | | }, |
| | | |
| | | checksubmit() { |
| | | //æ£æ¥æ¯å¦æ¶å°çº¸è´¨ææ |
| | |
| | | return; |
| | | } |
| | | |
| | | this.Savenow(); |
| | | console.log("ä¿å并审æ¹"); |
| | | // ä¸å®¶å³å¡è´¹ä¸ç¨ï¼9 æ¡è´¹ç¨æ§å¶è§åæ ¡éªï¼ä»
å®¡æ ¸éè¿æ¶æ¦æªï¼ |
| | | const needExpertFeeCheck = this.checkObj.flowlevelone == 1; |
| | | const expertFeePromise = needExpertFeeCheck |
| | | ? this.checkExpertFeeRules("æäº¤å®¡æ ¸") |
| | | : Promise.resolve(true); |
| | | |
| | | expertFeePromise.then((allowed) => { |
| | | if (!allowed) { |
| | | return; |
| | | } |
| | | this.Savenow(); |
| | | console.log("ä¿å并审æ¹"); |
| | | }); |
| | | }, |
| | | |
| | | // è¿ç»å®¡æ¹ï¼è·åå½åä¸å¡ç±»åä¸çå¾
审æ¹å表 |
| | |
| | | }); |
| | | }, |
| | | |
| | | /** 人åç±»åï¼å¤å¼ï¼éå·åéï¼æ¯å¦å
嫿å®ç±»åï¼org = å使ºæ */ |
| | | hasUserType(usertype, code) { |
| | | if (!usertype) { |
| | | return false; |
| | | } |
| | | return ( |
| | | String(usertype) |
| | | .split(",") |
| | | .map(t => t.trim()) |
| | | .indexOf(code) > -1 |
| | | ); |
| | | }, |
| | | /** åç人/è´¦æ·æ¯å¦ä¸º"åä½"ï¼äººåç±»åå« orgï¼ */ |
| | | //è·åä¸å®¶ãå使ºæçè´¦æ·å表 |
| | | getAccountList() { |
| | | listExternalperson().then(res => { |
| | |
| | | for (let j = 0; j < res.rows.length; j++) { |
| | | //åä½è´¦å·å表 |
| | | if (res.rows[j].userstatus == "1") { |
| | | if (res.rows[j].usertype == "org") { |
| | | if (this.hasUserType(res.rows[j].usertype, "org")) { |
| | | this.accountlist.push({ |
| | | id: res.rows[j].id, |
| | | userno: res.rows[j].userno, |
| | |
| | | bankcardno: res.rows[j].bankcardno, |
| | | unitno: res.rows[j].unitno, |
| | | unitname: res.rows[j].unitname, |
| | | usertype: res.rows[j].usertype, |
| | | userid: |
| | | res.rows[j].username + "ï¼" + res.rows[j].bankcardno + "ï¼" |
| | | }); |
| | |
| | | bankcardno: res.rows[j].bankcardno, |
| | | unitno: res.rows[j].unitno, |
| | | unitname: res.rows[j].unitname, |
| | | usertype: res.rows[j].usertype, |
| | | userid: |
| | | res.rows[j].username + "ï¼" + res.rows[j].idcardno + "ï¼" |
| | | }); |
| | |
| | | |
| | | //计ç®ä¸ªç¨ï¼type(A:å·²ç¥ç¨åéé¢ï¼è®¡ç®ç¨åéé¢ï¼Bï¼å·²ç¥ç¨åéé¢ï¼è®¡ç®ç¨åéé¢) |
| | | calculateTax(row, type) { |
| | | let targetValue = 0; |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | if (!this.rbDetails[i].amount) { |
| | | this.rbDetails[i].amount = 0; |
| | | } |
| | | targetValue += parseFloat(this.rbDetails[i].amount); // å设æ¯ä¸ªå¯¹è±¡ä¸çç¹å®å¼åå¨å¨'specificValue'屿§ä¸ |
| | | } |
| | | this.form.pretaxcost = targetValue; |
| | | // å计éé¢å¿
须精确累å ï¼å¦åä¼åå
¥ form.pretaxcost å¹¶è½åº |
| | | this.form.pretaxcost = moneySum(this.rbDetails, "amount"); |
| | | }, |
| | | |
| | | //导å
¥ææé¡¹ç® |
| | |
| | | }, |
| | | // æ¥åæéç«å»ä¿å |
| | | Savenow() { |
| | | // 2026-10-15ï¼ä¿ååéä»¶æä»¶åè§èæ ¡éªï¼ä»
æ°å¢åæ®ï¼èåæ®çåå²éä»¶ç±å端æ"åªæ ¡éªæ¬æ¬¡åæ´"æ¾è¡ï¼ |
| | | if (!this.checkDetailFileNames()) { |
| | | return; |
| | | } |
| | | |
| | | if (!this.randomnumber) { |
| | | this.randomnumber = this.generateRandomString(9); |
| | | this.form.randomnumber = this.randomnumber; |
| | |
| | | this.Savereminder = false; |
| | | this.Reminderquantity = 0; |
| | | this.totalquantity = 0; |
| | | this.$refs["form"].validate(valid => { |
| | | if (valid) { |
| | | this.formData = this.form; |
| | | |
| | | //ä¿ååæ ¡éªæ°æ® |
| | | for (let k = 0; k < this.rbDetails.length; k++) { |
| | | let tempDetail = this.rbDetails[k]; |
| | | if (tempDetail.itemid == null) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼ç¬¬" + |
| | | (k + 1).toString() + |
| | | "è¡çæå¡é¡¹ç®æªéæ©ï¼è¯·å
éæ©æå¡é¡¹ç®ååæäº¤ä¿åï¼" |
| | | ); |
| | | return; |
| | | } |
| | | |
| | | if (this.businessType == "1") { |
| | | if (tempDetail.servicesscope == null) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼ç¬¬" + |
| | | (k + 1).toString() + |
| | | "è¡çè´¹ç¨è¯´ææªéæ©,è¯·éæ©è´¹ç¨è¯´æååæäº¤ä¿åï¼" |
| | | ); |
| | | return; |
| | | } |
| | | |
| | | if (tempDetail.beneficiaryno == null) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼ç¬¬" + |
| | | (k + 1).toString() + |
| | | "è¡ç人åå§å为空,è¯·éæ©äººåååæäº¤ä¿åï¼" |
| | | ); |
| | | return; |
| | | } |
| | | if (tempDetail.unitname == null) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼ç¬¬" + |
| | | (k + 1).toString() + |
| | | "è¡çä¸å®¶åä½ä¸ºç©º,è¯·éæ©åä½ååæäº¤ä¿åï¼" |
| | | ); |
| | | return; |
| | | } |
| | | } |
| | | } |
| | | |
| | | //å¤çæç» |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | let tempDetail = this.rbDetails[i]; |
| | | //è·åæå¡é¡¹ç®æç» |
| | | let tempitemlist = tempDetail.itemlist; |
| | | let itemIndex = tempitemlist.findIndex( |
| | | item => tempDetail.itemid == item.id |
| | | ); |
| | | if (itemIndex > -1) { |
| | | tempDetail.itemname = tempitemlist[itemIndex].itemName; |
| | | tempDetail.itemid = tempitemlist[itemIndex].id; |
| | | } |
| | | |
| | | //è·åapplytypenameãæå¡è´¹ç¨å¤§ç±» |
| | | let applytypeIndex = this.rowfeeItemTypes.findIndex( |
| | | item => tempDetail.applytype == item.value |
| | | ); |
| | | if (applytypeIndex > -1) { |
| | | tempDetail.applytypename = this.rowfeeItemTypes[ |
| | | applytypeIndex |
| | | ].label; |
| | | tempDetail.subjecttype = this.rowfeeItemTypes[ |
| | | applytypeIndex |
| | | ].subjecttype; |
| | | tempDetail.subjecttypename = this.rowfeeItemTypes[ |
| | | applytypeIndex |
| | | ].subjecttypename; |
| | | } |
| | | this.rbDetails[i] = tempDetail; |
| | | } |
| | | //计ç®å½åè¡æ¥éå
容费ç¨å计ï¼ç¨åéé¢ï¼amountï¼ãæ£ç¨éé¢ï¼taxamountï¼ãç¨åéé¢ï¼taxedamountï¼ |
| | | if (this.businessType == "2") { |
| | | for (let j = 0; j < this.rbDetails.length; j++) { |
| | | let tempDetail = this.rbDetails[j]; |
| | | if ( |
| | | isNaN(parseFloat(tempDetail.amount)) || |
| | | parseFloat(tempDetail.amount) == 0 |
| | | ) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼ç¬¬" + |
| | | (j + 1).toString() + |
| | | "è¡çé颿ªè¾å
¥ï¼è¯·å
è¾å
¥éé¢ååæäº¤ä¿åï¼" |
| | | ); |
| | | return; |
| | | } |
| | | } |
| | | } else if (this.businessType == "3" || this.businessType == "4") { |
| | | for (let j = 0; j < this.rbDetails.length; j++) { |
| | | let tempDetail = this.rbDetails[j]; |
| | | if ( |
| | | isNaN(parseFloat(tempDetail.amount)) || |
| | | parseFloat(tempDetail.amount) == 0 |
| | | ) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼ç¬¬" + |
| | | (j + 1).toString() + |
| | | "è¡çé颿ªè¾å
¥ï¼è¯·å
è¾å
¥éé¢ååæäº¤ä¿åï¼" |
| | | ); |
| | | return; |
| | | } |
| | | if ( |
| | | isNaN(parseFloat(tempDetail.taxamount)) || |
| | | parseFloat(tempDetail.taxamount) == 0 |
| | | ) { |
| | | tempDetail.taxedamount = parseFloat(tempDetail.amount); |
| | | } else { |
| | | tempDetail.taxedamount = |
| | | parseFloat(tempDetail.amount) + |
| | | parseFloat(tempDetail.taxamount); |
| | | } |
| | | } |
| | | } |
| | | |
| | | //ä¿åæ°æ® |
| | | this.loading = true; |
| | | this.form.serviceFunddetails = 0; |
| | | this.rbDetails.map(item => { |
| | | this.form.serviceFunddetails += item.amount; |
| | | }); |
| | | this.form.serviceFunddetails = this.rbDetails; |
| | | |
| | | if (this.form.id != null) { |
| | | } else { |
| | | this.form.recordstatus = -1; |
| | | } |
| | | |
| | | addorupdateFund(this.form).then(response => { |
| | | if (response.code === 200) { |
| | | this.$modal.msgSuccess("ç³è¯·åä¿åæåï¼"); |
| | | // éæéç¶æä¸æ§è¡å®¡æ¹è§£å³å¼æ¥è°ç¨å»¶è¿é®é¢ |
| | | if (!this.Savereminder) { |
| | | let checkFundObj = { |
| | | // fundid: this.checkObj.fundid, |
| | | fundid: this.curId, |
| | | flowconclusion: this.checkObj.flowlevelone, |
| | | flowcontent: this.checkObj.flowconclusion |
| | | }; |
| | | this.$modal.loading("æ£å¨æäº¤å®¡æ ¸ï¼è¯·ç¨åï¼"); |
| | | checkfund(checkFundObj).then(res => { |
| | | if (res.code == 200) { |
| | | //å
³éçªå£ |
| | | this.$modal.closeLoading(); |
| | | this.$modal.msgSuccess("å®¡æ ¸å®æ!"); |
| | | // è¿ç»å®¡æ¹ï¼è¯¢é®æ¯å¦ç»§ç»å®¡æ¹ä¸ä¸å |
| | | this.continueOrExit(); |
| | | } else { |
| | | this.$modal.closeLoading(); |
| | | |
| | | if (res.msg) { |
| | | this.$modal.msgError("æä½å¤±è¯¯"); |
| | | } else { |
| | | this.$modal.msgError(res.msg); |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | this.Getnetworkheader(); |
| | | this.getroute(); |
| | | this.getAccountList(); |
| | | this.getUserList(); |
| | | this.getUserProfile(); |
| | | } else { |
| | | this.$modal.msgError("ç³è¯·åä¿å失败ï¼" + response.msg); |
| | | } |
| | | }); |
| | | |
| | | //å
³éçªå£ |
| | | this.loading = false; |
| | | // this.getfundList(); |
| | | // ä¸å®¶å³å¡è´¹ä¸ç¨ï¼9 æ¡è´¹ç¨æ§å¶è§åæ ¡éªï¼æ ¡éªä¸éè¿ä¸å
许è½åºï¼ |
| | | this.checkExpertFeeRules("ä¿å").then((allowed) => { |
| | | if (!allowed) { |
| | | return; |
| | | } |
| | | |
| | | this.$refs["form"].validate(valid => { |
| | | if (valid) { |
| | | this.formData = this.form; |
| | | |
| | | //ä¿ååæ ¡éªæ°æ® |
| | | for (let k = 0; k < this.rbDetails.length; k++) { |
| | | let tempDetail = this.rbDetails[k]; |
| | | if (tempDetail.itemid == null) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼ç¬¬" + |
| | | (k + 1).toString() + |
| | | "è¡çæå¡é¡¹ç®æªéæ©ï¼è¯·å
éæ©æå¡é¡¹ç®ååæäº¤ä¿åï¼" |
| | | ); |
| | | return; |
| | | } |
| | | |
| | | if (this.businessType == "1") { |
| | | if (tempDetail.servicesscope == null) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼ç¬¬" + |
| | | (k + 1).toString() + |
| | | "è¡çè´¹ç¨è¯´ææªéæ©,è¯·éæ©è´¹ç¨è¯´æååæäº¤ä¿åï¼" |
| | | ); |
| | | return; |
| | | } |
| | | |
| | | if (tempDetail.beneficiaryno == null) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼ç¬¬" + |
| | | (k + 1).toString() + |
| | | "è¡ç人åå§å为空,è¯·éæ©äººåååæäº¤ä¿åï¼" |
| | | ); |
| | | return; |
| | | } |
| | | if (tempDetail.unitname == null) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼ç¬¬" + |
| | | (k + 1).toString() + |
| | | "è¡çä¸å®¶åä½ä¸ºç©º,è¯·éæ©åä½ååæäº¤ä¿åï¼" |
| | | ); |
| | | return; |
| | | } |
| | | } |
| | | } |
| | | |
| | | //å¤çæç» |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | let tempDetail = this.rbDetails[i]; |
| | | //è·åæå¡é¡¹ç®æç» |
| | | let tempitemlist = tempDetail.itemlist; |
| | | let itemIndex = tempitemlist.findIndex( |
| | | item => tempDetail.itemid == item.id |
| | | ); |
| | | if (itemIndex > -1) { |
| | | tempDetail.itemname = tempitemlist[itemIndex].itemName; |
| | | tempDetail.itemid = tempitemlist[itemIndex].id; |
| | | } |
| | | |
| | | //è·åapplytypenameãæå¡è´¹ç¨å¤§ç±» |
| | | let applytypeIndex = this.rowfeeItemTypes.findIndex( |
| | | item => tempDetail.applytype == item.value |
| | | ); |
| | | if (applytypeIndex > -1) { |
| | | tempDetail.applytypename = this.rowfeeItemTypes[ |
| | | applytypeIndex |
| | | ].label; |
| | | tempDetail.subjecttype = this.rowfeeItemTypes[ |
| | | applytypeIndex |
| | | ].subjecttype; |
| | | tempDetail.subjecttypename = this.rowfeeItemTypes[ |
| | | applytypeIndex |
| | | ].subjecttypename; |
| | | } |
| | | this.rbDetails[i] = tempDetail; |
| | | } |
| | | //计ç®å½åè¡æ¥éå
容费ç¨å计ï¼ç¨åéé¢ï¼amountï¼ãæ£ç¨éé¢ï¼taxamountï¼ãç¨åéé¢ï¼taxedamountï¼ |
| | | if (this.businessType == "2") { |
| | | for (let j = 0; j < this.rbDetails.length; j++) { |
| | | let tempDetail = this.rbDetails[j]; |
| | | if ( |
| | | isNaN(parseFloat(tempDetail.amount)) || |
| | | moneyRound(tempDetail.amount) == 0 |
| | | ) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼ç¬¬" + |
| | | (j + 1).toString() + |
| | | "è¡çé颿ªè¾å
¥ï¼è¯·å
è¾å
¥éé¢ååæäº¤ä¿åï¼" |
| | | ); |
| | | return; |
| | | } |
| | | } |
| | | } else if (this.businessType == "3" || this.businessType == "4") { |
| | | for (let j = 0; j < this.rbDetails.length; j++) { |
| | | let tempDetail = this.rbDetails[j]; |
| | | if ( |
| | | isNaN(parseFloat(tempDetail.amount)) || |
| | | moneyRound(tempDetail.amount) == 0 |
| | | ) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼ç¬¬" + |
| | | (j + 1).toString() + |
| | | "è¡çé颿ªè¾å
¥ï¼è¯·å
è¾å
¥éé¢ååæäº¤ä¿åï¼" |
| | | ); |
| | | return; |
| | | } |
| | | if ( |
| | | isNaN(parseFloat(tempDetail.taxamount)) || |
| | | moneyRound(tempDetail.taxamount) == 0 |
| | | ) { |
| | | tempDetail.taxedamount = parseFloat(tempDetail.amount); |
| | | } else { |
| | | tempDetail.taxedamount = |
| | | parseFloat(tempDetail.amount) + |
| | | parseFloat(tempDetail.taxamount); |
| | | } |
| | | } |
| | | } |
| | | |
| | | //ä¿åæ°æ® |
| | | this.loading = true; |
| | | this.form.serviceFunddetails = 0; |
| | | this.rbDetails.map(item => { |
| | | this.form.serviceFunddetails += item.amount; |
| | | }); |
| | | this.form.serviceFunddetails = this.rbDetails; |
| | | |
| | | if (this.form.id != null) { |
| | | } else { |
| | | this.form.recordstatus = -1; |
| | | } |
| | | |
| | | addorupdateFund(this.form).then(response => { |
| | | if (response.code === 200) { |
| | | this.$modal.msgSuccess("ç³è¯·åä¿åæåï¼"); |
| | | // éæéç¶æä¸æ§è¡å®¡æ¹è§£å³å¼æ¥è°ç¨å»¶è¿é®é¢ |
| | | if (!this.Savereminder) { |
| | | let checkFundObj = { |
| | | // fundid: this.checkObj.fundid, |
| | | fundid: this.curId, |
| | | flowconclusion: this.checkObj.flowlevelone, |
| | | flowcontent: this.checkObj.flowconclusion |
| | | }; |
| | | this.$modal.loading("æ£å¨æäº¤å®¡æ ¸ï¼è¯·ç¨åï¼"); |
| | | checkfund(checkFundObj).then(res => { |
| | | if (res.code == 200) { |
| | | //å
³éçªå£ |
| | | this.$modal.closeLoading(); |
| | | this.$modal.msgSuccess("å®¡æ ¸å®æ!"); |
| | | // è¿ç»å®¡æ¹ï¼è¯¢é®æ¯å¦ç»§ç»å®¡æ¹ä¸ä¸å |
| | | this.continueOrExit(); |
| | | } else { |
| | | this.$modal.closeLoading(); |
| | | |
| | | this.$modal.msgError(res.msg || "æä½å¤±è´¥"); |
| | | } |
| | | }); |
| | | } |
| | | this.Getnetworkheader(); |
| | | this.getroute(); |
| | | this.getAccountList(); |
| | | this.getUserList(); |
| | | this.getUserProfile(); |
| | | } else { |
| | | this.$modal.msgError("ç³è¯·åä¿å失败ï¼" + response.msg); |
| | | } |
| | | }); |
| | | |
| | | //å
³éçªå£ |
| | | this.loading = false; |
| | | // this.getfundList(); |
| | | } |
| | | }); |
| | | }); |
| | | }, |
| | | handleCheckAllChange(val) { |
| | | this.checkedCities = val ? this.cityOptions : []; |
| | | this.checkedCities = val ? this.filteredCityOptions.slice() : []; |
| | | this.isIndeterminate = false; |
| | | }, |
| | | handleCheckedCitiesChange(value) { |
| | | let checkedCount = value.length; |
| | | this.checkAll = checkedCount === this.cityOptions.length; |
| | | this.checkAll = |
| | | this.filteredCityOptions.length > 0 && |
| | | checkedCount === this.filteredCityOptions.length; |
| | | this.isIndeterminate = |
| | | checkedCount > 0 && checkedCount < this.cityOptions.length; |
| | | checkedCount > 0 && checkedCount < this.filteredCityOptions.length; |
| | | }, |
| | | // æå¨è®¡ç® |
| | | Manualcalculationfn() { |
| | |
| | | // æ¹éå½å
¥ç¹å» |
| | | Batchentry() { |
| | | // ethical |
| | | this.personKeyword = ""; |
| | | this.checkedCities = []; |
| | | this.checkAll = false; |
| | | this.isIndeterminate = false; |
| | | listReportname("ethical").then(res => { |
| | | this.cityOptions = res.data; |
| | | }); |
| | | this.batchdialogVisible = true; |
| | | }, |
| | | /** |
| | | * æç»è¡æ¯å¦ä¸ºã空记å½ãï¼æå¡é¡¹ç®ãä¸å®¶ãä¸å®¶æå¨åä½ æ¯å¦é½ä¸ºç©º |
| | | * ç¨äºæ¹éå½å
¥ä¸å®¶æ¶å¤æ"å¤ç¨æåä¸è¡"è¿æ¯"è¿½å æ°è¡" |
| | | */ |
| | | isBlankDetailRow(row) { |
| | | if (!row) { |
| | | return false; |
| | | } |
| | | const isEmpty = v => |
| | | v === null || v === undefined || String(v).trim() === ""; |
| | | return ( |
| | | isEmpty(row.itemid) && |
| | | isEmpty(row.beneficiaryname) && |
| | | isEmpty(row.unitno) && |
| | | isEmpty(row.unitname) |
| | | ); |
| | | }, |
| | | /** æ¹éå½å
¥å¼¹æ¡ï¼å§å/åä½/å·¥å·/身份è¯å4ä½ å½ä¸å¤æ */ |
| | | personMatchKeyword(item, kw) { |
| | | const idcard = String(item.idcrad || ""); |
| | | return ( |
| | | String(item.reportName || "") |
| | | .toLowerCase() |
| | | .indexOf(kw) > -1 || |
| | | String(item.unitname || "") |
| | | .toLowerCase() |
| | | .indexOf(kw) > -1 || |
| | | String(item.reportNo || "") |
| | | .toLowerCase() |
| | | .indexOf(kw) > -1 || |
| | | (idcard.length >= 4 && idcard.slice(-4).indexOf(kw) > -1) |
| | | ); |
| | | }, |
| | | // 确认å½å
¥ |
| | | BatchentryFn() { |
| | | // æç»ä¸å·²æç人åå§åï¼ç¨äºé夿é |
| | | const existed = {}; |
| | | this.rbDetails.forEach(row => { |
| | | if (row.beneficiaryname) { |
| | | existed[String(row.beneficiaryname).trim()] = true; |
| | | } |
| | | }); |
| | | |
| | | // 2026-10-22ï¼ä¿®æ£"导å
¥åè¡¨æ ¼å¤åºä¸è¡ç©ºè®°å½"ã |
| | | // è§åï¼å
çæå䏿¡è®°å½ï¼è¥å®ç"æå¡é¡¹ç® / ä¸å®¶ / ä¸å®¶æå¨åä½"齿¯ç©ºçï¼ |
| | | // è¯´ææ¯ä¸æ¡ç©ºè®°å½ï¼å°±ä»è¿ä¸è¡å¼å§å¡«ï¼å¦åè¿½å æ°è¡ã |
| | | let writeIndex = this.rbDetails.length; |
| | | if ( |
| | | writeIndex > 0 && |
| | | this.isBlankDetailRow(this.rbDetails[writeIndex - 1]) |
| | | ) { |
| | | writeIndex -= 1; |
| | | } |
| | | |
| | | const duplicated = []; |
| | | this.checkedCities.forEach(item => { |
| | | const nameKey = String(item.reportName || "").trim(); |
| | | if (nameKey && existed[nameKey]) { |
| | | duplicated.push(item.reportName); |
| | | return; |
| | | } |
| | | if (nameKey) { |
| | | existed[nameKey] = true; |
| | | } |
| | | let rowData = { |
| | | orderno: null, |
| | | fundid: null, |
| | | beneficiaryname: item.reportName, |
| | | beneficiaryno: item.reportNo, |
| | | isunit: 0, |
| | | unitname: item.unitname, |
| | | unitno: null, |
| | | uintuserno: null, |
| | |
| | | annexfiles: null |
| | | }; |
| | | |
| | | this.rbDetails.push(rowData); |
| | | if (writeIndex < this.rbDetails.length) { |
| | | // å¤ç¨æå飿¡ç©ºè®°å½ |
| | | this.rbDetails.splice(writeIndex, 1, rowData); |
| | | } else { |
| | | this.rbDetails.push(rowData); |
| | | } |
| | | writeIndex++; |
| | | }); |
| | | for (let i = 0; i < this.checkedCities.length + 1; i++) { |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | this.rbDetails[i].orderno = i + 1; |
| | | } |
| | | this.calculateTax(); |
| | | this.batchdialogVisible = false; |
| | | this.checkedCities = []; |
| | | if (duplicated.length) { |
| | | this.$modal.msgWarning( |
| | | "以ä¸äººå卿ç»ä¸å·²åå¨ï¼å·²è·³è¿é夿·»å ï¼" + duplicated.join("ã") |
| | | ); |
| | | } |
| | | }, |
| | | //æ°å¢ä¸è¡ |
| | | addRow(rowIndex) { |
| | |
| | | fundid: null, |
| | | beneficiaryname: null, |
| | | beneficiaryno: null, |
| | | isunit: 0, |
| | | unitname: null, |
| | | itemdescribe: null, |
| | | unitno: null, |
| | |
| | | }); |
| | | //å
¨é¨å é¤åæ·»å 䏿¡æ°è¡ |
| | | }, |
| | | //è®¡ç®æ»éé¢ |
| | | //è®¡ç®æ»éé¢ï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ç¦æ¢ parseFloat ç´¯å ï¼ |
| | | sumTotalFee(row) { |
| | | let allSum = 0; |
| | | const detailsArr = []; |
| | | if (this.form.applytype != null) { |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | const detail = this.rbDetails[i]; |
| | | let totalFee = 0; |
| | | let taxFee = 0; |
| | | if (this.form.applytype == 1 || this.form.applytype == 2) { |
| | | //计ç®å½åæ¥éå
容费ç¨å计 |
| | | if (!isNaN(parseFloat(this.rbDetails[i].amount))) { |
| | | totalFee += parseFloat(this.rbDetails[i].amount); |
| | | taxFee += parseFloat(this.rbDetails[i].amount); |
| | | //计ç®å½åæ¥éå
容费ç¨å计ï¼ç¨å - æ£ç¨ |
| | | if (!isNaN(parseFloat(detail.amount))) { |
| | | totalFee = moneySub(totalFee, -parseFloat(detail.amount)); |
| | | taxFee = moneySub(taxFee, -parseFloat(detail.amount)); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].taxamount))) { |
| | | totalFee -= parseFloat(this.rbDetails[i].taxamount); |
| | | taxFee -= parseFloat(this.rbDetails[i].taxamount); |
| | | if (!isNaN(parseFloat(detail.taxamount))) { |
| | | totalFee = moneySub(totalFee, detail.taxamount); |
| | | taxFee = moneySub(taxFee, detail.taxamount); |
| | | } |
| | | } else if (this.form.applytype == 3 || this.form.applytype == 4) { |
| | | //åä»·*æ°é=ç¨åéé¢ |
| | | if ( |
| | | !isNaN(parseFloat(this.rbDetails[i].price)) && |
| | | !isNaN(parseFloat(this.rbDetails[i].quantity)) |
| | | !isNaN(parseFloat(detail.price)) && |
| | | !isNaN(parseFloat(detail.quantity)) |
| | | ) { |
| | | totalFee += |
| | | parseFloat(this.rbDetails[i].price) * |
| | | parseFloat(this.rbDetails[i].quantity); |
| | | this.rbDetails[i].amount = totalFee; |
| | | totalFee = moneyMul(detail.price, detail.quantity); |
| | | detail.amount = totalFee; |
| | | } |
| | | } |
| | | |
| | |
| | | // this.rbDetails[i].taxedamount = taxFee.toFixed(2); |
| | | // } |
| | | |
| | | allSum += totalFee; |
| | | detailsArr.push(totalFee); |
| | | } |
| | | } |
| | | const allSum = moneyRound(moneySum(detailsArr)); |
| | | // this.form.amountrequested = allSum.toFixed(2); |
| | | // this.$forceUpdate(); |
| | | }, |
| | |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * 2026-10-15ï¼ä¸ä¼ æ¶æ ¡éªéä»¶æä»¶åï¼ä¸å¡è¦æ±ï¼ä¸åæ ¼ç«å³æç¤ºä¸ä¸å å
¥å表ï¼ã |
| | | * è§åä¸å端 AttachmentNameValidator åå£å¾ï¼å¿
é¡»å«ä¸æ / 廿æ©å±åå主干 â¤20 å / |
| | | * ä¸å«ç©ºæ ¼å / \ : * ? " < > | # % çç¹æ®å符ã |
| | | */ |
| | | checkUploadFileName(file) { |
| | | const raw = file && file.raw ? file.raw.name : file && file.name; |
| | | const r = checkFileName(raw); |
| | | if (!r.ok) { |
| | | this.$modal.msgError(r.msg); |
| | | return false; |
| | | } |
| | | return true; |
| | | }, |
| | | |
| | | /** |
| | | * 2026-10-15ï¼ä¿ååæ ¡éªæ´åæç»éä»¶æä»¶åï¼å«åä¸è¡å
éåï¼ã |
| | | * å£å¾ï¼ä¸å¡ç¡®è®¤ï¼ï¼åªæ ¡éª"æ¬æ¬¡åæ´"çéä»¶ââèåæ®éå·²åå¨çä¸åè§éä»¶åä¸è½æä¿å塿» |
| | | * ï¼å¦åèåæ®æ¹ä¸ä¸ªéé¢é½åä¸è¿å»ï¼ãå端æ id 读æ§è®°å½æ¾è¡åå²éä»¶ï¼å端æ¿ä¸å°"åªäºæ¯åå²" |
| | | * çæå¨ä¿¡æ¯ï¼å æ¤**ä»
æ°å¢åæ®**åä¿å忦æªï¼ç¼è¾èåæ®æ¶æ°å¢çä¸åè§éä»¶ç±åç«¯äºæ¬¡æ ¡éªæ¦ä¸ã |
| | | */ |
| | | checkDetailFileNames() { |
| | | if (this.form && this.form.id) { |
| | | return true; |
| | | } |
| | | const c = checkDetails(this.rbDetails); |
| | | if (!c.ok) { |
| | | this.$modal.msgError(c.msg); |
| | | return false; |
| | | } |
| | | return true; |
| | | }, |
| | | |
| | | uploadSccess(response, file, fileList) { |
| | | if (!this.checkUploadFileName(file)) { |
| | | return; |
| | | } |
| | | this.rbDetails; |
| | | const config = { |
| | | headers: { Authorization: "Bearer " + this.ICDtoken } |
| | |
| | | //ä¸å®¶/å»çæºæ/è´¹ç¨æ¥éæºæéæ© |
| | | confirmSelectionDialog() { |
| | | this.$refs["accountselectform"].validate(valid => { |
| | | // 2026-10-19ï¼åæ¥æ²¡æå¤æ validï¼æ ¡éªå¤±è´¥ä¹ç
§æ ·å¾ä¸èµ°ãç
§æ ·ä¿åï¼æå·/红åå½¢åèè®¾ï¼ |
| | | if (!valid) { |
| | | return; |
| | | } |
| | | let tempIndex = this.accountselectform.index; |
| | | if (this.selectionType == "account") { |
| | | if (this.accountfrom == "1") { |
| | |
| | | this.rbDetails[tempIndex].phone = res.telephone; |
| | | |
| | | if (res.usertype == "org") { |
| | | this.$set(this.rbDetails[tempIndex], "isunit", 1); |
| | | this.rbDetails[tempIndex].idcardno = ""; |
| | | this.rbDetails[tempIndex].title = ""; |
| | | this.rbDetails[tempIndex].unitno = ""; |
| | | this.rbDetails[tempIndex].unitname = ""; |
| | | } else { |
| | | this.$set(this.rbDetails[tempIndex], "isunit", 0); |
| | | this.rbDetails[tempIndex].idcardno = res.idcardno; |
| | | this.rbDetails[tempIndex].title = res.title; |
| | | this.rbDetails[tempIndex].unitno = parseInt(res.unitno); |
| | |
| | | this.rbDetails[tempIndex].bankcardno = res.bankcardno; |
| | | this.rbDetails[tempIndex].phone = res.telephone; |
| | | |
| | | if (res.usertype == "org") { |
| | | if (this.hasUserType(res.usertype, "org")) { |
| | | this.$set(this.rbDetails[tempIndex], "isunit", 1); |
| | | this.rbDetails[tempIndex].idcardno = ""; |
| | | this.rbDetails[tempIndex].title = ""; |
| | | this.rbDetails[tempIndex].unitno = ""; |
| | | this.rbDetails[tempIndex].unitname = ""; |
| | | } else { |
| | | this.$set(this.rbDetails[tempIndex], "isunit", 0); |
| | | this.rbDetails[tempIndex].idcardno = res.idcardno; |
| | | this.rbDetails[tempIndex].title = res.title; |
| | | this.rbDetails[tempIndex].unitno = parseInt(res.unitno); |
| | |
| | | |
| | | //çå½å¨æ - æè½½å®æï¼å¯ä»¥è®¿é®DOMå
ç´ ï¼ |
| | | mounted() { |
| | | window.addEventListener("beforeunload", e => this.beforeunloadHandler(e)); |
| | | // åä½åä¸ä¸ªå¼ç¨ï¼å¦å removeEventListener ä¼ æ°ç®å¤´å½æ°æ æ³çæ£ç§»é¤ï¼ä¼æ³æ¼çå¬å¨ |
| | | this._beforeUnloadHandler = e => this.beforeunloadHandler(e); |
| | | window.addEventListener("beforeunload", this._beforeUnloadHandler); |
| | | this.getUserList(); |
| | | let apiaccountselectform = this.accountselectform; |
| | | let apiform = this.form; |
| | |
| | | updated() { }, //çå½å¨æ - æ´æ°ä¹å |
| | | beforeDestroy() { }, //çå½å¨æ - 鿝ä¹å |
| | | destroyed() { |
| | | window.removeEventListener("beforeunload", e => this.beforeunloadFn(e)); |
| | | if (this._beforeUnloadHandler) { |
| | | window.removeEventListener("beforeunload", this._beforeUnloadHandler); |
| | | this._beforeUnloadHandler = null; |
| | | } |
| | | }, //çå½å¨æ - 鿝宿 |
| | | activated() { } //妿页颿keep-aliveç¼ååè½ï¼è¿ä¸ªå½æ°ä¼è§¦å |
| | | }; |
| | |
| | | clearable |
| | | style="width: 100%" |
| | | v-model="form.createTime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="ç³è¯·æ¥æ" |
| | | > |
| | |
| | | import Li_area_select from "@/components/Address"; |
| | | import OrgSelecter from "@/views/project/components/orgselect"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { moneySum, moneyAdd, moneySub, moneyMul, moneyRound } from "@/utils/money"; |
| | | import { checkFileName, checkDetails } from "@/utils/fileNameCheck"; |
| | | |
| | | export default { |
| | | //importå¼å
¥çç»ä»¶éè¦æ³¨å
¥å°å¯¹è±¡ä¸æè½ä½¿ç¨ |
| | |
| | | }, |
| | | /** æäº¤æé® */ |
| | | submitForm: debounce(function() { |
| | | // 2026-10-15ï¼ä¿ååéä»¶æä»¶åè§èæ ¡éªï¼ä»
æ°å¢åæ®ï¼èåæ®çåå²éä»¶ç±å端æ"åªæ ¡éªæ¬æ¬¡åæ´"æ¾è¡ï¼ |
| | | if (!this.checkDetailFileNames()) { |
| | | return; |
| | | } |
| | | |
| | | if (!this.randomnumber) { |
| | | this.randomnumber = this.generateRandomString(9); |
| | | this.form.randomnumber = this.randomnumber; |
| | |
| | | this.$store.dispatch("tagsView/delView", this.$route); |
| | | this.$router.go(-1); |
| | | } else { |
| | | if (res.msg) { |
| | | this.$modal.msgError("æä½å¤±è¯¯"); |
| | | } else { |
| | | this.$modal.msgError(res.msg); |
| | | } |
| | | this.$modal.msgError(res.msg || "æä½å¤±è´¥"); |
| | | } |
| | | }); |
| | | }, |
| | |
| | | }, |
| | | // æ¥åæéç«å»ä¿å |
| | | Savenow() { |
| | | // 2026-10-15ï¼ä¿ååéä»¶æä»¶åè§èæ ¡éªï¼ä»
æ°å¢åæ®ï¼èåæ®çåå²éä»¶ç±å端æ"åªæ ¡éªæ¬æ¬¡åæ´"æ¾è¡ï¼ |
| | | if (!this.checkDetailFileNames()) { |
| | | return; |
| | | } |
| | | |
| | | if (!this.randomnumber) { |
| | | this.randomnumber = this.generateRandomString(9); |
| | | this.form.randomnumber = this.randomnumber; |
| | |
| | | } |
| | | }, |
| | | |
| | | //è®¡ç®æ»éé¢ |
| | | //è®¡ç®æ»éé¢ï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ |
| | | sumTotalFee(row) { |
| | | let allSum = 0; |
| | | const detailsArr = []; |
| | | if (this.form.applytype != null) { |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | const detail = this.rbDetails[i]; |
| | | let totalFee = 0; |
| | | let taxFee = 0; |
| | | if (this.form.applytype == 1 || this.form.applytype == 2) { |
| | | //计ç®å½åæ¥éå
容费ç¨å计 |
| | | if (!isNaN(parseFloat(this.rbDetails[i].amount))) { |
| | | totalFee += parseFloat(this.rbDetails[i].amount); |
| | | taxFee += parseFloat(this.rbDetails[i].amount); |
| | | //计ç®å½åæ¥éå
容费ç¨å计ï¼ç¨å - æ£ç¨ |
| | | if (!isNaN(parseFloat(detail.amount))) { |
| | | totalFee = moneyAdd(totalFee, detail.amount); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].taxamount))) { |
| | | totalFee -= parseFloat(this.rbDetails[i].taxamount); |
| | | taxFee -= parseFloat(this.rbDetails[i].taxamount); |
| | | if (!isNaN(parseFloat(detail.taxamount))) { |
| | | totalFee = moneySub(totalFee, detail.taxamount); |
| | | } |
| | | } else if (this.form.applytype == 3 || this.form.applytype == 4) { |
| | | //åä»·*æ°é=ç¨åéé¢ |
| | | if ( |
| | | !isNaN(parseFloat(this.rbDetails[i].price)) && |
| | | !isNaN(parseFloat(this.rbDetails[i].quantity)) |
| | | !isNaN(parseFloat(detail.price)) && |
| | | !isNaN(parseFloat(detail.quantity)) |
| | | ) { |
| | | totalFee += |
| | | parseFloat(this.rbDetails[i].price) * |
| | | parseFloat(this.rbDetails[i].quantity); |
| | | totalFee = moneyMul(detail.price, detail.quantity); |
| | | this.rbDetails[i].amount = totalFee; |
| | | } |
| | | } |
| | |
| | | // this.rbDetails[i].taxedamount = taxFee.toFixed(2); |
| | | // } |
| | | |
| | | allSum += totalFee; |
| | | detailsArr.push(totalFee); |
| | | } |
| | | } |
| | | // this.form.amountrequested = allSum.toFixed(2); |
| | | // this.form.amountrequested = moneyRound(moneySum(detailsArr)).toFixed(2); |
| | | // this.$forceUpdate(); |
| | | }, |
| | | |
| | |
| | | // console.log(response.msg); |
| | | // } |
| | | // }, |
| | | /** |
| | | * 2026-10-15ï¼ä¸ä¼ æ¶æ ¡éªéä»¶æä»¶åï¼ä¸å¡è¦æ±ï¼ä¸åæ ¼ç«å³æç¤ºä¸ä¸å å
¥å表ï¼ã |
| | | * è§åä¸å端 AttachmentNameValidator åå£å¾ï¼å¿
é¡»å«ä¸æ / 廿æ©å±åå主干 â¤20 å / |
| | | * ä¸å«ç©ºæ ¼å / \ : * ? " < > | # % çç¹æ®å符ã |
| | | */ |
| | | checkUploadFileName(file) { |
| | | const raw = file && file.raw ? file.raw.name : file && file.name; |
| | | const r = checkFileName(raw); |
| | | if (!r.ok) { |
| | | this.$modal.msgError(r.msg); |
| | | return false; |
| | | } |
| | | return true; |
| | | }, |
| | | |
| | | /** |
| | | * 2026-10-15ï¼ä¿ååæ ¡éªæ´åæç»éä»¶æä»¶åï¼å«åä¸è¡å
éåï¼ã |
| | | * å£å¾ï¼ä¸å¡ç¡®è®¤ï¼ï¼åªæ ¡éª"æ¬æ¬¡åæ´"çéä»¶ââèåæ®éå·²åå¨çä¸åè§éä»¶åä¸è½æä¿å塿» |
| | | * ï¼å¦åèåæ®æ¹ä¸ä¸ªéé¢é½åä¸è¿å»ï¼ãå端æ id 读æ§è®°å½æ¾è¡åå²éä»¶ï¼å端æ¿ä¸å°"åªäºæ¯åå²" |
| | | * çæå¨ä¿¡æ¯ï¼å æ¤**ä»
æ°å¢åæ®**åä¿å忦æªï¼ç¼è¾èåæ®æ¶æ°å¢çä¸åè§éä»¶ç±åç«¯äºæ¬¡æ ¡éªæ¦ä¸ã |
| | | */ |
| | | checkDetailFileNames() { |
| | | if (this.form && this.form.id) { |
| | | return true; |
| | | } |
| | | const c = checkDetails(this.rbDetails); |
| | | if (!c.ok) { |
| | | this.$modal.msgError(c.msg); |
| | | return false; |
| | | } |
| | | return true; |
| | | }, |
| | | |
| | | uploadSccess(response, file, fileList) { |
| | | if (!this.checkUploadFileName(file)) { |
| | | return; |
| | | } |
| | | this.rbDetails; |
| | | |
| | | //è·å票æ®ä¿¡æ¯ä½ç½® |
| | |
| | | |
| | | //çå½å¨æ - æè½½å®æï¼å¯ä»¥è®¿é®DOMå
ç´ ï¼ |
| | | mounted() { |
| | | window.addEventListener("beforeunload", e => this.beforeunloadHandler(e)); |
| | | // åä½åä¸ä¸ªå¼ç¨ï¼å¦å removeEventListener ä¼ æ°ç®å¤´å½æ°æ æ³çæ£ç§»é¤ï¼ä¼æ³æ¼çå¬å¨ |
| | | this._beforeUnloadHandler = e => this.beforeunloadHandler(e); |
| | | window.addEventListener("beforeunload", this._beforeUnloadHandler); |
| | | this.getUserList(); |
| | | this.getUserProfile(); |
| | | let apifunddetailForm = this.funddetailForm; |
| | | let apiform = this.form; |
| | | console.log(apiform); |
| | | console.log(apifunddetailForm); |
| | | |
| | | // this.getFeeUnitList(); |
| | | }, |
| | |
| | | beforeMount() {}, //çå½å¨æ - æè½½ä¹å |
| | | beforeUpdate() {}, //çå½å¨æ - æ´æ°ä¹å |
| | | updated() {}, //çå½å¨æ - æ´æ°ä¹å |
| | | beforeDestroy() {}, //çå½å¨æ - 鿝ä¹å |
| | | beforeDestroy() { |
| | | if (this._beforeUnloadHandler) { |
| | | window.removeEventListener("beforeunload", this._beforeUnloadHandler); |
| | | this._beforeUnloadHandler = null; |
| | | } |
| | | }, //çå½å¨æ - 鿝ä¹å |
| | | destroyed() {}, //çå½å¨æ - 鿝宿 |
| | | activated() {} //妿页颿keep-aliveç¼ååè½ï¼è¿ä¸ªå½æ°ä¼è§¦å |
| | | }; |
| | |
| | | <!-- --> |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | | label-width="70px" |
| | | > |
| | | <el-row align="left"> |
| | | <el-col :span="6"> |
| | | <el-form-item label="å§å" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | | placeholder="请è¾å
¥å§å" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="æç®è¿åº¦" prop="recordstate"> |
| | | <el-select |
| | | v-model="queryParams.recordstate" |
| | | placeholder="è¯·éæ©è®°å½ç¶æ" |
| | | clearable |
| | | size="small" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_DonationStatus" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="æç®è
" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.donorname" |
| | | placeholder="请è¾å
¥æç®è
å§å" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="mini" |
| | | @click="handleQuery" |
| | | >æç´¢</el-button |
| | | > |
| | | <el-button icon="el-icon-refresh" size="mini" @click="resetQuery" |
| | | >éç½®</el-button |
| | | > |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-card shadow="never"> |
| | | <!-- æç®æ¡ä¾å表 --> |
| | | <el-row> |
| | | <el-col :span="10"> |
| | | <el-row type="flex" :gutter="10" align="right" class="mb8"> |
| | | </el-row> |
| | | </el-col> |
| | | </el-row> |
| | | <el-table |
| | | v-loading="loading" |
| | | border |
| | | highlight-current-row |
| | | :data="donatebaseinfoList" |
| | | @row-click="selectDonotor" |
| | | > |
| | | <!-- <el-table-column label="æç®ç¼å·" align="center" prop="donorno" /> --> |
| | | <el-table-column label="æç®è¿åº¦" align="center" prop="recordstate"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_DonationStatus" |
| | | :value="scope.row.recordstate" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å§å" align="center" prop="name" /> |
| | | </el-table> |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | small |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getBaseInfoList" |
| | | /> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="18"> |
| | | <el-col :span="24"> |
| | | <el-card shadow="naver"> |
| | | <el-form ref="infoform" label-width="100px"> |
| | | <el-row :gutter="4" align="right" class="mb8"> |
| | | <el-col :span="9"> |
| | | <el-form-item label="æç®ç¼å·"> |
| | | <el-input |
| | | v-model="curCase.donorno" |
| | | :disabled="true" |
| | | ></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="9"> |
| | | <el-form-item label="å§å"> |
| | | <el-input v-model="curCase.name" :disabled="true"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <!-- æ¥éåçéï¼æç®è
ã审æ¹ç¶æ --> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="fundQueryParam" |
| | | ref="fundQueryForm" |
| | | :inline="true" |
| | | label-width="82px" |
| | | > |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-form-item label="æç®è
" prop="donorname"> |
| | | <el-input |
| | | v-model="fundQueryParam.donorname" |
| | | placeholder="请è¾å
¥æç®è
å§å" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQueryFund" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="审æ¹ç¶æ" prop="recordstatus"> |
| | | <el-select |
| | | v-model="fundQueryParam.recordstatus" |
| | | placeholder="è¯·éæ©å®¡æ¹ç¶æ" |
| | | clearable |
| | | size="small" |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_recordstatus" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="Number(dict.value)" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label-width="10px"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="small" |
| | | @click="handleQueryFund" |
| | | >æç´¢</el-button |
| | | > |
| | | <el-button |
| | | icon="el-icon-refresh" |
| | | size="small" |
| | | @click="resetFundQuery" |
| | | >éç½®</el-button |
| | | > |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æç®è
" |
| | | align="center" |
| | | prop="donorname" |
| | | width="110px" |
| | | show-overflow-tooltip |
| | | /> |
| | | <!-- |
| | | <el-table-column label="èç³»çµè¯" align="center" prop="phone" width="150px" /> |
| | | <el-table-column label="å·¥ä½åä½" align="center" prop="unitname" width="220px" /> |
| | |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <!-- æªéæ©æ¡ä¾æ¶å±ç¤ºè¯¥ç»å½äººå
¨é¨ä¼¦ç审æ¥åæ®ï¼è¶
è¿ä¸é¡µå¯ç¨å页翻ç --> |
| | | <pagination |
| | | v-show="fundTotal > 0" |
| | | :total="fundTotal" |
| | | small |
| | | :page.sync="fundQueryParam.pageNum" |
| | | :limit.sync="fundQueryParam.pageSize" |
| | | @pagination="listFundData" |
| | | /> |
| | | </el-row> |
| | | </el-form> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <!-- æ°å¢ç³è¯·ååå
éæ©æç®æ¡ä¾ï¼å左侧æ¡ä¾å表移å°è¿éï¼ --> |
| | | <el-dialog |
| | | title="éæ©æç®æ¡ä¾" |
| | | :visible.sync="caseDialogVisible" |
| | | width="760px" |
| | | append-to-body |
| | | > |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | | label-width="70px" |
| | | > |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å§å" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | | placeholder="请è¾å
¥å§å" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æç®è¿åº¦" prop="recordstate"> |
| | | <el-select |
| | | v-model="queryParams.recordstate" |
| | | placeholder="è¯·éæ©è®°å½ç¶æ" |
| | | clearable |
| | | size="small" |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_DonationStatus" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label-width="10px"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="small" |
| | | @click="handleQuery" |
| | | >æç´¢</el-button |
| | | > |
| | | <el-button icon="el-icon-refresh" size="small" @click="resetQuery" |
| | | >éç½®</el-button |
| | | > |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <el-table |
| | | ref="caseTable" |
| | | v-loading="loading" |
| | | border |
| | | height="380" |
| | | highlight-current-row |
| | | :data="donatebaseinfoList" |
| | | @row-click="selectDonotor" |
| | | > |
| | | <el-table-column label="æç®è¿åº¦" align="center" prop="recordstate"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_DonationStatus" |
| | | :value="scope.row.recordstate" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å§å" align="center" prop="name" /> |
| | | <el-table-column label="æä½" align="center" width="90"> |
| | | <template slot-scope="scope"> |
| | | <el-button type="text" size="mini" @click="selectDonotor(scope.row)" |
| | | >éæ©</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | small |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getBaseInfoList" |
| | | /> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button @click="caseDialogVisible = false">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | <!-- æ·»å æä¿®æ¹è´¹ç¨ç³è¯·å --> |
| | | <el-dialog |
| | |
| | | clearable |
| | | style="width: 100%" |
| | | v-model="form.applyTime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="ç³è¯·æ¥æ" |
| | | > |
| | |
| | | import { getUserProfile } from "@/api/system/user"; |
| | | import { listFundflow } from "@/api/project/fundflow"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { moneySum, moneyAdd, moneySub, moneyMul, moneyRound } from "@/utils/money"; |
| | | |
| | | export default { |
| | | //importå¼å
¥çç»ä»¶éè¦æ³¨å
¥å°å¯¹è±¡ä¸æè½ä½¿ç¨ |
| | |
| | | }, |
| | | fundQueryParam: { |
| | | pageNum: 1, |
| | | pageSize: 100, |
| | | pageSize: 10, |
| | | infoid: null, |
| | | applytype: "2", |
| | | createBy: null |
| | | createBy: null, |
| | | // æ¥éåç鿡件 |
| | | donorname: null, |
| | | recordstatus: null |
| | | }, |
| | | // å³ä¾§æ¥éåæ»æ°ï¼ç¨äºåé¡µï¼ |
| | | fundTotal: 0, |
| | | // ãéæ©æç®æ¡ä¾ãå¯¹è¯æ¡ï¼æ°å¢ç³è¯·åæ¶ä½¿ç¨ï¼ |
| | | caseDialogVisible: false, |
| | | casePickerMode: "", |
| | | // 表ååæ° |
| | | form: {}, |
| | | // è¡¨åæ ¡éª |
| | |
| | | }, |
| | | /** æ°å¢æé®æä½ */ |
| | | handleAdd() { |
| | | if (this.curCase.id) { |
| | | this.$router.push({ |
| | | path: "/finance/applyDetail/", |
| | | query: { |
| | | id: 0, |
| | | businessType: "2", |
| | | operationType: "add", |
| | | curCase: this.curCase |
| | | } |
| | | }); |
| | | } else { |
| | | const h = this.$createElement; |
| | | this.$message({ |
| | | message: h("p", null, [ |
| | | h("span", null, "请å¨å·¦è¾¹çæç®æ¡ä¾è¡¨éæ©éè¦æä½çæ¡ä¾ï¼") |
| | | ]) |
| | | }); |
| | | } |
| | | return; |
| | | // æ°å¢ç³è¯·åï¼å
å¼¹åºãéæ©æç®æ¡ä¾ãå¯¹è¯æ¡ |
| | | this.casePickerMode = "add"; |
| | | this.caseDialogVisible = true; |
| | | this.getBaseInfoList(); |
| | | }, |
| | | |
| | | if (this.curCase.id) { |
| | | this.istrue += 2; |
| | | this.reset(); |
| | | this.dialogOpen = true; |
| | | this.title = "æ·»å è´¹ç¨ç³è¯·"; |
| | | this.dialogType = "edit"; |
| | | this.queryParams.params = {}; |
| | | |
| | | this.form.infoid = this.curCase.id; |
| | | this.form.donorno = this.curCase.donorno; |
| | | this.form.donorname = this.curCase.name; |
| | | this.form.username = this.defaultperson.nickName; |
| | | this.form.userno = this.defaultperson.userName; |
| | | |
| | | this.form.deptmentname = this.defaultperson.dept.deptName; |
| | | this.form.deptmentno = this.defaultperson.dept.deptId; |
| | | this.form.managername = this.defaultperson.dept.leader; |
| | | // this.form.createTime = nowdate; |
| | | //this.open = true; |
| | | //this.initFundApplyForm(); |
| | | this.fundDetailArr = []; |
| | | this.fundflowList = []; |
| | | this.addRow(); |
| | | } else { |
| | | const h = this.$createElement; |
| | | this.$message({ |
| | | message: h("p", null, [h("span", null, "请å
éæ©å·¦æ¹æç®æ¡ä¾ ")]) |
| | | }); |
| | | } |
| | | /** æºå¸¦å·²éæ¡ä¾è·³è½¬å°ç³è¯·åå¡«å页 */ |
| | | goApplyAdd() { |
| | | this.$router.push({ |
| | | path: "/finance/applyDetail/", |
| | | query: { |
| | | id: 0, |
| | | businessType: "2", |
| | | operationType: "add", |
| | | curCase: this.curCase |
| | | } |
| | | }); |
| | | }, |
| | | /** ä¿®æ¹æé®æä½ */ |
| | | handleUpdate(row) { |
| | |
| | | // } catch { |
| | | // tempDetail.unitname = tempDetail.unitno; |
| | | // } |
| | | if (!isNaN(parseFloat(tempDetail.amount))) { |
| | | totalPreTaxAmount += parseFloat(tempDetail.amount); |
| | | totalAmount += parseFloat(tempDetail.amount); |
| | | } |
| | | if (!isNaN(parseFloat(tempDetail.taxedamount))) { |
| | | totalAfterTaxAmount += parseFloat(tempDetail.taxedamount); |
| | | totalAmount += parseFloat(tempDetail.taxedamount); |
| | | } |
| | | } |
| | | //éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ç¦æ¢ parseFloat ç´¯å |
| | | totalPreTaxAmount = moneySum(this.fundDetailArr, "amount"); |
| | | totalAfterTaxAmount = moneySum(this.fundDetailArr, "taxedamount"); |
| | | totalAmount = moneyAdd(totalPreTaxAmount, totalAfterTaxAmount); |
| | | try { |
| | | this.form.unitname = this.$refs.orgSelecter.getOptionByValue( |
| | | this.form.unitno |
| | |
| | | //ç¹å»æç®æ¡ä¾åè¡¨è§¦åæ¹æ³ |
| | | selectDonotor(row, column, event) { |
| | | this.curCase = row; |
| | | this.getfundList(); |
| | | if (this.casePickerMode === "add") { |
| | | // ä»ãæ°å¢ç³è¯·åãè¿å
¥ï¼é宿¡ä¾ç´æ¥è·³å°ç³è¯·åå¡«å页 |
| | | this.casePickerMode = ""; |
| | | this.caseDialogVisible = false; |
| | | this.goApplyAdd(); |
| | | } |
| | | }, |
| | | |
| | | /** æå½å fundQueryParam æ¥è¯¢å³ä¾§æ¥éåå表 */ |
| | | listFundData() { |
| | | this.loading = true; |
| | | listFund(this.fundQueryParam).then(response => { |
| | | this.loading = false; |
| | | this.donateconsolationfundList = response.rows; |
| | | this.fundTotal = response.total; |
| | | }); |
| | | }, |
| | | |
| | | /** æ¥éåçéï¼æç´¢ */ |
| | | handleQueryFund() { |
| | | this.fundQueryParam.pageNum = 1; |
| | | this.listFundData(); |
| | | }, |
| | | |
| | | /** æ¥éåçéï¼éç½®ï¼æ¸
空æ¡ä»¶ä¸å·²éæ¡ä¾ï¼åå°è¯¥ç»å½äººå
¨é¨åæ®ï¼ */ |
| | | resetFundQuery() { |
| | | this.fundQueryParam.donorname = null; |
| | | this.fundQueryParam.recordstatus = null; |
| | | this.getAllfundList(); |
| | | }, |
| | | |
| | | /** æ£ç´¢å
¨é¨ï¼åæ¶æ¡ä¾éæ©ä¸çéæ¡ä»¶ï¼æ¥è¯¢å½åç»å½äººçå
¨é¨ä¼¦ç审æ¥åæ® */ |
| | | getAllfundList() { |
| | | this.curCase = {}; |
| | | if (this.$refs.caseTable) { |
| | | this.$refs.caseTable.setCurrentRow(); |
| | | } |
| | | this.reset(); |
| | | this.fundQueryParam.infoid = null; |
| | | this.fundQueryParam.donorname = null; |
| | | this.fundQueryParam.recordstatus = null; |
| | | this.fundQueryParam.pageNum = 1; |
| | | this.listFundData(); |
| | | }, |
| | | |
| | | //è·åæ¡ä¾ä¸å®¶è´¹ç¨ç³è¯·å |
| | | getfundList() { |
| | | this.loading = true; |
| | | this.reset(); |
| | | // é䏿¡ä¾åææ¡ä¾å±ç¤ºï¼åæ¶æ¸
æå表ç鿡件ï¼é¿å
两个æ¡ä»¶å å 导è´ç©ºå表 |
| | | this.fundQueryParam.donorname = null; |
| | | this.fundQueryParam.recordstatus = null; |
| | | this.fundQueryParam.infoid = this.curCase.id; |
| | | listFund(this.fundQueryParam).then(response => { |
| | | this.loading = false; |
| | | this.donateconsolationfundList = response.rows; |
| | | }); |
| | | this.fundQueryParam.pageNum = 1; |
| | | this.listFundData(); |
| | | }, |
| | | |
| | | select(row) { |
| | |
| | | }); |
| | | }, |
| | | |
| | | //è®¡ç®æ»éé¢ |
| | | //è®¡ç®æ»éé¢ï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ç¦æ¢ parseFloat ç´¯å ï¼ |
| | | sumTotalFee() { |
| | | let allSum = 0; |
| | | const detailsArr = []; |
| | | let preTaxSum = 0; |
| | | let taxedSum = 0; |
| | | if (this.form.applytype != null) { |
| | | for (let i = 0; i < this.fundDetailArr.length; i++) { |
| | | const detail = this.fundDetailArr[i]; |
| | | let totalFee = 0; |
| | | let taxFee = 0; |
| | | if (this.form.applytype == 1 || this.form.applytype == 2) { |
| | | //计ç®å½åæ¥éå
容费ç¨å计 |
| | | if (!isNaN(parseFloat(this.fundDetailArr[i].amount))) { |
| | | totalFee += parseFloat(this.fundDetailArr[i].amount); |
| | | taxFee += parseFloat(this.fundDetailArr[i].amount); |
| | | preTaxSum += parseFloat(this.fundDetailArr[i].amount); |
| | | //计ç®å½åæ¥éå
容费ç¨å计ï¼ç¨å - æ£ç¨ |
| | | if (!isNaN(parseFloat(detail.amount))) { |
| | | totalFee = moneyAdd(totalFee, detail.amount); |
| | | preTaxSum = moneyAdd(preTaxSum, detail.amount); |
| | | } |
| | | if (!isNaN(parseFloat(this.fundDetailArr[i].taxamount))) { |
| | | totalFee -= parseFloat(this.fundDetailArr[i].taxamount); |
| | | taxFee -= parseFloat(this.fundDetailArr[i].taxamount); |
| | | if (!isNaN(parseFloat(detail.taxamount))) { |
| | | totalFee = moneySub(totalFee, detail.taxamount); |
| | | } |
| | | //taxedamount |
| | | if (!isNaN(parseFloat(this.fundDetailArr[i].taxedamount))) { |
| | | taxedSum += parseFloat(this.fundDetailArr[i].taxedamount); |
| | | if (!isNaN(parseFloat(detail.taxedamount))) { |
| | | taxedSum = moneyAdd(taxedSum, detail.taxedamount); |
| | | } |
| | | } else if (this.form.applytype == 3) { |
| | | if ( |
| | | !isNaN(parseFloat(this.fundDetailArr[i].price)) && |
| | | !isNaN(parseFloat(this.fundDetailArr[i].quantity)) |
| | | !isNaN(parseFloat(detail.price)) && |
| | | !isNaN(parseFloat(detail.quantity)) |
| | | ) { |
| | | totalFee += |
| | | parseFloat(this.fundDetailArr[i].price) * |
| | | parseFloat(this.fundDetailArr[i].quantity); |
| | | totalFee = moneyMul(detail.price, detail.quantity); |
| | | } |
| | | } |
| | | // if (!isNaN(parseFloat(taxFee))) { |
| | | // this.fundDetailArr[i].taxedamount = taxFee.toFixed(2); |
| | | // } |
| | | allSum += totalFee; |
| | | detailsArr.push(totalFee); |
| | | } |
| | | } |
| | | this.form.amountrequested = allSum.toFixed(2); |
| | | this.form.pretaxcost = preTaxSum.toFixed(2); |
| | | this.form.taxedcost = taxedSum.toFixed(2); |
| | | this.form.amountrequested = moneyRound(moneySum(detailsArr)).toFixed(2); |
| | | this.form.pretaxcost = moneyRound(preTaxSum).toFixed(2); |
| | | this.form.taxedcost = moneyRound(taxedSum).toFixed(2); |
| | | this.$forceUpdate(); |
| | | }, |
| | | |
| | |
| | | //çå½å¨æ - åå»ºå®æï¼å¯ä»¥è®¿é®å½åthiså®ä¾ï¼ |
| | | created() { |
| | | this.getUnitList(); |
| | | this.getList(); |
| | | this.getBaseInfoList(); |
| | | // æ¡ä¾å表已移å
¥ãéæ©æç®æ¡ä¾ãå¯¹è¯æ¡ï¼æå¼å¯¹è¯æ¡æ¶åæ¥è¯¢ |
| | | this.getlistUser(); |
| | | this.getCurFundType(); |
| | | // é¦å±å±ç¤ºå½åç»å½äººçå
¨é¨ä¼¦ç审æ¥åæ® |
| | | this.getAllfundList(); |
| | | }, |
| | | //çå½å¨æ - æè½½å®æï¼å¯ä»¥è®¿é®DOMå
ç´ ï¼ |
| | | mounted() { |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-card shadow="never"> |
| | | <!-- æç®æ¡ä¾å表 --> |
| | | <el-row> |
| | | <el-col :span="10"> |
| | | <el-row type="flex" :gutter="10" align="right" class="mb8"> |
| | | </el-row> |
| | | </el-col> |
| | | </el-row> |
| | | <div> |
| | | <el-form |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | | label-width="70px" |
| | | > |
| | | <el-form-item label="å§å" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | | placeholder="请è¾å
¥å§å" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="æç®è¿åº¦" prop="recordstate"> |
| | | <el-select |
| | | v-model="queryParams.recordstate" |
| | | placeholder="è¯·éæ©è®°å½ç¶æ" |
| | | clearable |
| | | size="small" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_DonationStatus" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <div style="float: right; margin-bottom: 10px;"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="mini" |
| | | @click="handleQuery" |
| | | >æç´¢</el-button |
| | | > |
| | | <el-button |
| | | icon="el-icon-refresh" |
| | | size="mini" |
| | | @click="resetQuery" |
| | | >éç½®</el-button |
| | | > |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | <el-table |
| | | v-loading="loading" |
| | | highlight-current-row |
| | | :data="donatebaseinfoList" |
| | | @row-click="selectDonotor" |
| | | > |
| | | <!-- <el-table-column label="æç®ç¼å·" align="center" prop="donorno" /> --> |
| | | <el-table-column label="æç®è¿åº¦" align="center" prop="recordstate"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_DonationStatus" |
| | | :value="scope.row.recordstate" |
| | | :key="dict.value" |
| | | /> |
| | | <!-- :label="dict.label" --> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å§å" align="center" prop="name" /> |
| | | </el-table> |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | small |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getBaseInfoList" |
| | | /> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="18"> |
| | | <el-col :span="24"> |
| | | <el-card shadow="naver"> |
| | | <el-form ref="infoform" label-width="100px"> |
| | | <el-row :gutter="4" align="right" class="mb8"> |
| | | <el-col :span="7"> |
| | | <el-form-item label="æç®ç¼å·"> |
| | | <el-input |
| | | v-model="curCase.donorno" |
| | | :disabled="true" |
| | | ></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å§å"> |
| | | <el-input v-model="curCase.name" :disabled="true"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="3"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="mini" |
| | | @click="allgetfundList" |
| | | >æ£ç´¢å
¨é¨</el-button |
| | | > |
| | | </el-col> |
| | | </el-row> |
| | | <!-- æ¥éåçéï¼æç®è
ã审æ¹ç¶æ --> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="fundQueryParam" |
| | | ref="fundQueryForm" |
| | | :inline="true" |
| | | label-width="82px" |
| | | > |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-form-item label="æç®è
" prop="donorname"> |
| | | <el-input |
| | | v-model="fundQueryParam.donorname" |
| | | placeholder="请è¾å
¥æç®è
å§å" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQueryFund" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="审æ¹ç¶æ" prop="recordstatus"> |
| | | <el-select |
| | | v-model="fundQueryParam.recordstatus" |
| | | placeholder="è¯·éæ©å®¡æ¹ç¶æ" |
| | | clearable |
| | | size="small" |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_recordstatus" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="Number(dict.value)" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label-width="10px"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="small" |
| | | @click="handleQueryFund" |
| | | >æç´¢</el-button |
| | | > |
| | | <el-button |
| | | icon="el-icon-refresh" |
| | | size="small" |
| | | @click="resetFundQuery" |
| | | >éç½®</el-button |
| | | > |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | |
| | | <!-- v-hasPermi="['project:expretfund:download']" --> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- 2026-10-22ï¼æè¦æ±éèãåè½ãåï¼çº¿ä¸æ¥éï¼ï¼éè¦æ¶åæ¶æ³¨éå³å¯æ¢å¤ --> |
| | | <!-- |
| | | <el-table-column |
| | | fixed="right" |
| | | align="center" |
| | |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | --> |
| | | </el-table> |
| | | <!-- æªéæ©æ¡ä¾æ¶å±ç¤ºè¯¥ç»å½äººå
¨é¨ä¸å®¶å³å¡åæ®ï¼è¶
è¿ä¸é¡µå¯ç¨å页翻ç --> |
| | | <pagination |
| | | v-show="fundTotal > 0" |
| | | :total="fundTotal" |
| | | small |
| | | :page.sync="fundQueryParam.pageNum" |
| | | :limit.sync="fundQueryParam.pageSize" |
| | | @pagination="listFundData" |
| | | /> |
| | | </el-row> |
| | | </el-form> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <!-- æ°å¢ç³è¯·ååå
éæ©æç®æ¡ä¾ï¼å左侧æ¡ä¾å表移å°è¿éï¼ --> |
| | | <el-dialog |
| | | title="éæ©æç®æ¡ä¾" |
| | | :visible.sync="caseDialogVisible" |
| | | width="760px" |
| | | append-to-body |
| | | > |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | | label-width="70px" |
| | | > |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å§å" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | | placeholder="请è¾å
¥å§å" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æç®è¿åº¦" prop="recordstate"> |
| | | <el-select |
| | | v-model="queryParams.recordstate" |
| | | placeholder="è¯·éæ©è®°å½ç¶æ" |
| | | clearable |
| | | size="small" |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_DonationStatus" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label-width="10px"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="small" |
| | | @click="handleQuery" |
| | | >æç´¢</el-button |
| | | > |
| | | <el-button icon="el-icon-refresh" size="small" @click="resetQuery" |
| | | >éç½®</el-button |
| | | > |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <el-table |
| | | ref="caseTable" |
| | | v-loading="loading" |
| | | border |
| | | height="380" |
| | | highlight-current-row |
| | | :data="donatebaseinfoList" |
| | | @row-click="selectDonotor" |
| | | > |
| | | <el-table-column label="æç®è¿åº¦" align="center" prop="recordstate"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_DonationStatus" |
| | | :value="scope.row.recordstate" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å§å" align="center" prop="name" /> |
| | | <el-table-column label="æä½" align="center" width="90"> |
| | | <template slot-scope="scope"> |
| | | <el-button type="text" size="mini" @click="selectDonotor(scope.row)" |
| | | >éæ©</el-button |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | small |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getBaseInfoList" |
| | | /> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button @click="caseDialogVisible = false">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | |
| | | <!-- æ·»å æä¿®æ¹è´¹ç¨ç³è¯·å --> |
| | | <el-dialog |
| | |
| | | clearable |
| | | style="width: 100%" |
| | | v-model="form.applyTime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="ç³è¯·æ¥æ" |
| | | > |
| | |
| | | getdownloadYX, |
| | | getdownloadBX, |
| | | addorupdateFund, |
| | | getdetailsByItemId |
| | | getdetailsByItemId, |
| | | validateExpertFee |
| | | } from "@/api/project/fund"; |
| | | |
| | | import { |
| | |
| | | import OrgSelecter from "@/views/project/components/orgselect"; |
| | | import elementIcons from "../../../components/icons/element-icons"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { moneySum, moneyAdd, moneySub, moneyMul, moneyRound } from "@/utils/money"; |
| | | |
| | | export default { |
| | | //importå¼å
¥çç»ä»¶éè¦æ³¨å
¥å°å¯¹è±¡ä¸æè½ä½¿ç¨ |
| | |
| | | }, |
| | | fundQueryParam: { |
| | | pageNum: 1, |
| | | pageSize: 100, |
| | | pageSize: 10, |
| | | infoid: null, |
| | | applytype: "1", |
| | | createBy: null |
| | | createBy: null, |
| | | // æ¥éåç鿡件 |
| | | donorname: null, |
| | | recordstatus: null |
| | | }, |
| | | // å³ä¾§æ¥éåæ»æ°ï¼ç¨äºåé¡µï¼ |
| | | fundTotal: 0, |
| | | // 表ååæ° |
| | | form: {}, |
| | | //ææäººå表 |
| | |
| | | donatebaseinfoList: [], |
| | | //å½åéä¸æç®æ¡ä¾ |
| | | curCase: {}, |
| | | // ãéæ©æç®æ¡ä¾ãå¯¹è¯æ¡ï¼æ°å¢ç³è¯·åæ¶ä½¿ç¨ï¼ |
| | | caseDialogVisible: false, |
| | | casePickerMode: "", |
| | | //æ¯å¦æ¾ç¤ºè´¹ç¨ç³è¯·å¼¹çª |
| | | dialogOpen: false, |
| | | // title: "", |
| | |
| | | watch: {}, |
| | | //çå½å¨æ - åå»ºå®æï¼å¯ä»¥è®¿é®å½åthiså®ä¾ï¼ |
| | | created() { |
| | | this.getList(); |
| | | this.getBaseInfoList(); |
| | | // æ¡ä¾å表已移å
¥ãéæ©æç®æ¡ä¾ãå¯¹è¯æ¡ï¼æå¼å¯¹è¯æ¡æ¶åæ¥è¯¢ |
| | | this.getCurFundType(); |
| | | this.getUserList(); |
| | | this.getUnitList(); |
| | | // é¦å±å±ç¤ºå½åç»å½äººçå
¨é¨ä¸å®¶å³å¡åæ® |
| | | this.allgetfundList(); |
| | | }, |
| | | |
| | | //çå½å¨æ - æè½½å®æï¼å¯ä»¥è®¿é®DOMå
ç´ ï¼ |
| | |
| | | }); |
| | | }, |
| | | |
| | | /** æ°å¢æé®æä½ */ |
| | | /** æ°å¢æé®æä½ï¼å
å¼¹åºãéæ©æç®æ¡ä¾ãå¯¹è¯æ¡ */ |
| | | handleAdd() { |
| | | if (this.curCase.id) { |
| | | this.$router.push({ |
| | | path: "/finance/applyDetail/", |
| | | query: { |
| | | id: 0, |
| | | businessType: "1", |
| | | operationType: "add", |
| | | curCase: this.curCase |
| | | } |
| | | }); |
| | | } else { |
| | | const h = this.$createElement; |
| | | this.$message({ |
| | | message: h("p", null, [ |
| | | h("span", null, "请å¨å·¦è¾¹çæç®æ¡ä¾è¡¨éæ©éè¦æä½çæ¡ä¾ï¼") |
| | | ]) |
| | | }); |
| | | } |
| | | return; |
| | | this.casePickerMode = "add"; |
| | | this.caseDialogVisible = true; |
| | | this.getBaseInfoList(); |
| | | }, |
| | | |
| | | if (this.curCase.id) { |
| | | this.istrue += 2; |
| | | this.reset(); |
| | | this.queryParams.params = {}; |
| | | this.form.infoid = this.curCase.id; |
| | | this.form.donorno = this.curCase.donorno; |
| | | this.form.donorname = this.curCase.name; |
| | | |
| | | this.form.username = this.defaultperson.nickName; |
| | | this.form.userno = this.defaultperson.userName; |
| | | this.form.phone = this.defaultperson.phonenumber; |
| | | this.form.deptmentname = this.defaultperson.dept.deptName; |
| | | this.form.deptmentno = this.defaultperson.dept.deptId; |
| | | this.form.managername = this.defaultperson.dept.leader; |
| | | |
| | | // this.form.createTime = nowdate; |
| | | //this.open = true; |
| | | //this.initFundApplyForm(); |
| | | this.fundDetails = []; |
| | | this.addRow(); |
| | | this.dialogOpen = true; |
| | | this.dialogType = "edit"; |
| | | this.title = "è´¹ç¨ç³è¯·"; |
| | | } else { |
| | | const h = this.$createElement; |
| | | this.$message({ |
| | | message: h("p", null, [h("span", null, "请å
éæ©å·¦æ¹æç®æ¡ä¾ ")]) |
| | | }); |
| | | } |
| | | /** æºå¸¦å·²éæ¡ä¾è·³è½¬å°ç³è¯·åå¡«å页 */ |
| | | goApplyAdd() { |
| | | this.$router.push({ |
| | | path: "/finance/applyDetail/", |
| | | query: { |
| | | id: 0, |
| | | businessType: "1", |
| | | operationType: "add", |
| | | curCase: this.curCase |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | /** ä¿®æ¹æé®æä½ */ |
| | |
| | | // }); |
| | | } |
| | | |
| | | addorupdateFund(this.form).then(response => { |
| | | if (response.code === 200) { |
| | | this.selectDonotor(this.curCase); |
| | | this.$modal.msgSuccess("ä¸å®¶å³å¡è´¹ä¿åæåï¼"); |
| | | } else { |
| | | this.$modal.msgError("ä¸å®¶å³å¡è´¹ä¿å失败ï¼" + response.msg); |
| | | } |
| | | }); |
| | | // ä¿ååå
åä¸å®¶å³å¡è´¹ 9 æ¡è´¹ç¨æ§å¶æ ¡éªï¼å䏿¡ä¾ç´¯è®¡ï¼ |
| | | validateExpertFee(this.form).then(valid => { |
| | | const errors = (valid && valid.errors) || []; |
| | | const warnings = (valid && valid.warnings) || []; |
| | | |
| | | //å
³éçªå£ |
| | | this.loading = false; |
| | | this.dialogOpen = false; |
| | | // this.getfundList(); |
| | | this.getList(); |
| | | this.selectDonotor(this.curCase); |
| | | // warningsï¼è§å 5ã6ï¼ä»
æç¤ºï¼ä¸é»æä¿å |
| | | if (warnings.length > 0) { |
| | | this.$modal.msgWarning(warnings.join("ï¼")); |
| | | } |
| | | |
| | | // errors 黿ä¿åï¼ä¿ççªå£è®©ç»å人å
ä¿®æ£ |
| | | if (errors.length > 0) { |
| | | this.$modal.msgError(errors.join("ï¼")); |
| | | this.loading = false; |
| | | return; |
| | | } |
| | | |
| | | addorupdateFund(this.form).then(response => { |
| | | if (response.code === 200) { |
| | | //å
³éçªå£ |
| | | this.loading = false; |
| | | this.dialogOpen = false; |
| | | this.selectDonotor(this.curCase); |
| | | this.$modal.msgSuccess("ä¸å®¶å³å¡è´¹ä¿åæåï¼"); |
| | | this.getList(); |
| | | } else { |
| | | this.$modal.msgError("ä¸å®¶å³å¡è´¹ä¿å失败ï¼" + response.msg); |
| | | this.loading = false; |
| | | } |
| | | }); |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | |
| | | //ç¹å»æç®æ¡ä¾åè¡¨è§¦åæ¹æ³ |
| | | selectDonotor(row, column, event) { |
| | | this.curCase = row; |
| | | this.getfundList(); |
| | | if (this.casePickerMode === "add") { |
| | | // ä»ãæ°å¢ç³è¯·åãè¿å
¥ï¼é宿¡ä¾ç´æ¥è·³å°ç³è¯·åå¡«å页 |
| | | this.casePickerMode = ""; |
| | | this.caseDialogVisible = false; |
| | | this.goApplyAdd(); |
| | | } |
| | | }, |
| | | allgetfundList() { |
| | | this.loading = true; |
| | | // æ£ç´¢å
¨é¨ï¼åæ¶å·¦ä¾§æ¡ä¾éæ©ä¸çéæ¡ä»¶ï¼æ¥è¯¢å½åç»å½äººçå
¨é¨ä¸å®¶å³å¡åæ® |
| | | this.curCase = {}; |
| | | if (this.$refs.caseTable) { |
| | | this.$refs.caseTable.setCurrentRow(); |
| | | } |
| | | this.reset(); |
| | | this.fundQueryParam.infoid = null; |
| | | this.fundQueryParam.donorname = null; |
| | | this.fundQueryParam.recordstatus = null; |
| | | this.fundQueryParam.pageNum = 1; |
| | | this.listFundData(); |
| | | }, |
| | | /** æ¥éåçéï¼æç´¢ */ |
| | | handleQueryFund() { |
| | | this.fundQueryParam.pageNum = 1; |
| | | this.listFundData(); |
| | | }, |
| | | /** æ¥éåçéï¼éç½®ï¼æ¸
空æ¡ä»¶ä¸å·²éæ¡ä¾ï¼åå°è¯¥ç»å½äººå
¨é¨åæ®ï¼ */ |
| | | resetFundQuery() { |
| | | this.fundQueryParam.donorname = null; |
| | | this.fundQueryParam.recordstatus = null; |
| | | this.allgetfundList(); |
| | | }, |
| | | /** |
| | | * æå½å fundQueryParam æ¥è¯¢å³ä¾§æ¥éåå表 |
| | | * infoid 为空 = å½åç»å½äººçå
¨é¨è¯¥ç±»ååæ®ï¼æå¼ = æå®æ¡ä¾ |
| | | */ |
| | | listFundData() { |
| | | this.loading = true; |
| | | listFund(this.fundQueryParam).then(response => { |
| | | this.loading = false; |
| | | this.donateconsolationfundList = response.rows; |
| | | this.fundTotal = response.total; |
| | | }); |
| | | }, |
| | | getfundList() { |
| | | this.loading = true; |
| | | this.reset(); |
| | | // é䏿¡ä¾åææ¡ä¾å±ç¤ºï¼åæ¶æ¸
æå表ç鿡件ï¼é¿å
两个æ¡ä»¶å å 导è´ç©ºå表 |
| | | this.fundQueryParam.donorname = null; |
| | | this.fundQueryParam.recordstatus = null; |
| | | this.fundQueryParam.infoid = this.curCase.id; |
| | | listFund(this.fundQueryParam).then(response => { |
| | | this.loading = false; |
| | | this.donateconsolationfundList = response.rows; |
| | | }); |
| | | this.fundQueryParam.pageNum = 1; |
| | | this.listFundData(); |
| | | }, |
| | | |
| | | //导å
¥ææé¡¹ç® |
| | |
| | | //计ç®ä¸ªç¨ |
| | | calculateTax() {}, |
| | | |
| | | //è®¡ç®æ»éé¢ |
| | | //è®¡ç®æ»éé¢ï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ |
| | | sumTotalFee(row) { |
| | | let allSum = 0; |
| | | const detailsArr = []; |
| | | if (this.form.applytype != null) { |
| | | for (let i = 0; i < this.fundDetails.length; i++) { |
| | | const detail = this.fundDetails[i]; |
| | | let totalFee = 0; |
| | | let taxFee = 0; |
| | | if (this.form.applytype == 1 || this.form.applytype == 2) { |
| | | //计ç®å½åæ¥éå
容费ç¨å计 |
| | | if (!isNaN(parseFloat(this.fundDetails[i].amount))) { |
| | | totalFee += parseFloat(this.fundDetails[i].amount); |
| | | taxFee += parseFloat(this.fundDetails[i].amount); |
| | | //计ç®å½åæ¥éå
容费ç¨å计ï¼ç¨å - æ£ç¨ |
| | | if (!isNaN(parseFloat(detail.amount))) { |
| | | totalFee = moneyAdd(totalFee, detail.amount); |
| | | } |
| | | if (!isNaN(parseFloat(this.fundDetails[i].taxamount))) { |
| | | totalFee -= parseFloat(this.fundDetails[i].taxamount); |
| | | taxFee -= parseFloat(this.fundDetails[i].taxamount); |
| | | if (!isNaN(parseFloat(detail.taxamount))) { |
| | | totalFee = moneySub(totalFee, detail.taxamount); |
| | | } |
| | | } else if (this.form.applytype == 3) { |
| | | if ( |
| | | !isNaN(parseFloat(this.fundDetails[i].price)) && |
| | | !isNaN(parseFloat(this.fundDetails[i].quantity)) |
| | | !isNaN(parseFloat(detail.price)) && |
| | | !isNaN(parseFloat(detail.quantity)) |
| | | ) { |
| | | totalFee += |
| | | parseFloat(this.fundDetails[i].price) * |
| | | parseFloat(this.fundDetails[i].quantity); |
| | | totalFee = moneyMul(detail.price, detail.quantity); |
| | | } |
| | | } |
| | | |
| | | //ç¨åãç¨åéè¦ç¬ç«å½å
¥ |
| | | // if (!isNaN(parseFloat(taxFee))) { |
| | | // this.fundDetails[i].taxedamount = taxFee.toFixed(2); |
| | | // } |
| | | |
| | | allSum += totalFee; |
| | | detailsArr.push(totalFee); |
| | | } |
| | | } |
| | | // this.form.amountrequested = allSum.toFixed(2); |
| | | // å计ä»å¨ç¡®è®¤å£å¾åå¯ç¨ï¼å
ä¿è¯è®¡ç®æ¬èº«æ¯ç²¾ç¡®ç |
| | | // this.form.amountrequested = moneyRound(moneySum(detailsArr)).toFixed(2); |
| | | // this.$forceUpdate(); |
| | | }, |
| | | |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="æç®è
ç¼å·" prop="donorno"> |
| | | <el-input v-model="queryParams.donorno" placeholder="请è¾å
¥æç®è
ç¼å·" clearable size="small" |
| | | @keyup.enter.native="handleQuery" /> |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-card shadow="never"> |
| | | <!-- æç®æ¡ä¾å表 --> |
| | | <el-row> |
| | | <el-col :span="10"> |
| | | <el-row type="flex" :gutter="10" align="right" class="mb8"> |
| | | </el-row> |
| | | </el-col> |
| | | </el-row> |
| | | <div> |
| | | <el-form |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | | label-width="70px" |
| | | > |
| | | <el-form-item label="å§å" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | | placeholder="请è¾å
¥å§å" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="æç®è¿åº¦" prop="recordstate"> |
| | | <el-select |
| | | v-model="queryParams.recordstate" |
| | | placeholder="è¯·éæ©è®°å½ç¶æ" |
| | | clearable |
| | | size="small" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_DonationStatus" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <div style="float: right; margin-bottom: 10px;"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="mini" |
| | | @click="handleQuery" |
| | | >æç´¢</el-button |
| | | > |
| | | <el-button |
| | | icon="el-icon-refresh" |
| | | size="mini" |
| | | @click="resetQuery" |
| | | >éç½®</el-button |
| | | > |
| | | </div> |
| | | </el-form> |
| | | </div> |
| | | <el-table |
| | | v-loading="loading" |
| | | border |
| | | highlight-current-row |
| | | :data="donatebaseinfoList" |
| | | @row-click="selectDonotor" |
| | | > |
| | | <!-- <el-table-column label="æç®ç¼å·" align="center" prop="donorno" /> --> |
| | | <el-table-column label="æç®è¿åº¦" align="center" prop="recordstate"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_DonationStatus" |
| | | :value="scope.row.recordstate" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å§å" align="center" prop="name" /> |
| | | </el-table> |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | small |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getBaseInfoList" |
| | | /> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :span="18"> |
| | | <el-col :span="24"> |
| | | <el-card shadow="naver"> |
| | | <el-form ref="infoform" label-width="100px"> |
| | | <el-row :gutter="4" align="right" class="mb8"> |
| | | <el-col :span="9"> |
| | | <el-form-item label="æç®ç¼å·"> |
| | | <el-input |
| | | v-model="curCase.donorno" |
| | | :disabled="true" |
| | | ></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="9"> |
| | | <el-form-item label="å§å"> |
| | | <el-input v-model="curCase.name" :disabled="true"></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col> </el-col> |
| | | </el-row> |
| | | <!-- æ¥éåçéï¼æç®è
ã审æ¹ç¶æ --> |
| | | <el-form class="opo-query-form" :model="fundQueryParam" ref="fundQueryForm" :inline="true" |
| | | label-width="82px"> |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-form-item label="æç®è
" prop="donorname"> |
| | | <el-input v-model="fundQueryParam.donorname" placeholder="请è¾å
¥æç®è
å§å" clearable size="small" |
| | | @keyup.enter.native="handleQueryFund" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="审æ¹ç¶æ" prop="recordstatus"> |
| | | <el-select v-model="fundQueryParam.recordstatus" placeholder="è¯·éæ©å®¡æ¹ç¶æ" clearable size="small" |
| | | style="width: 100%"> |
| | | <el-option v-for="dict in dict.type.sys_recordstatus" :key="dict.value" :label="dict.label" |
| | | :value="Number(dict.value)" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label-width="10px"> |
| | | <el-button type="primary" icon="el-icon-search" size="small" @click="handleQueryFund">æç´¢</el-button> |
| | | <el-button icon="el-icon-refresh" size="small" @click="resetFundQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | icon="el-icon-plus" |
| | | size="mini" |
| | | @click="handleAdd" |
| | | v-hasPermi="['project:medicalfund:add']" |
| | | >æ°å¢ç³è¯·å</el-button |
| | | > |
| | | <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" |
| | | v-hasPermi="['project:medicalfund:add']">æ°å¢ç³è¯·å</el-button> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-table |
| | | v-loading="loading" |
| | | border |
| | | :data="donateconsolationfundList" |
| | | :row-class-name="rowClassName" |
| | | > |
| | | <el-table-column |
| | | label="ç³è¯·æ¥æ" |
| | | align="center" |
| | | prop="applyTime" |
| | | width="150px" |
| | | > |
| | | <el-table v-loading="loading" border :data="donateconsolationfundList" :row-class-name="rowClassName"> |
| | | <el-table-column label="ç³è¯·æ¥æ" align="center" prop="applyTime" width="150px"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ |
| | | parseTime(scope.row.applyTime, "{y}-{m}-{d}") |
| | | }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="ç³è¯·äºº" |
| | | align="center" |
| | | prop="username" |
| | | width="120px" |
| | | /> |
| | | <el-table-column |
| | | label="ç³è¯·éé¢" |
| | | align="center" |
| | | prop="pretaxcost" |
| | | width="200px" |
| | | /> |
| | | <el-table-column |
| | | label="æå±ç»å«" |
| | | align="center" |
| | | prop="deptmentname" |
| | | width="220px" |
| | | /> |
| | | <el-table-column |
| | | label="ç»é¿" |
| | | align="center" |
| | | prop="managername" |
| | | width="200px" |
| | | /> |
| | | <el-table-column |
| | | label="å®¡æ ¸ç¶æ" |
| | | align="center" |
| | | prop="recordstatus" |
| | | > |
| | | <el-table-column label="ç»å人" align="center" prop="username" width="120px" /> |
| | | <el-table-column label="ç³è¯·éé¢" align="center" prop="pretaxcost" width="200px" /> |
| | | <el-table-column label="å®¡æ ¸ç¶æ" align="center" prop="recordstatus"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_recordstatus" |
| | | :value="scope.row.recordstatus" |
| | | /> |
| | | <dict-tag :options="dict.type.sys_recordstatus" :value="scope.row.recordstatus" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="ææé¢å®¡ç¶æ" |
| | | width="140" |
| | | align="center" |
| | | prop="checkstatus" |
| | | > |
| | | <el-table-column label="ææé¢å®¡ç¶æ" width="140" align="center" prop="checkstatus"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_stage_type" |
| | | :value="scope.row.checkstatus" |
| | | /> |
| | | <dict-tag :options="dict.type.sys_stage_type" :value="scope.row.checkstatus" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æç®è
" align="center" prop="donorname" show-overflow-tooltip /> |
| | | <el-table-column label="æå±ç»å«" align="center" prop="deptmentname"/> |
| | | <el-table-column label="ç»é¿" align="center" prop="managername" /> |
| | | <!-- |
| | | <el-table-column label="èç³»çµè¯" align="center" prop="phone" width="150px" /> |
| | | <el-table-column label="å·¥ä½åä½" align="center" prop="unitname" width="150px" /> |
| | | --> |
| | | <el-table-column |
| | | label="æä½" |
| | | fixed="right" |
| | | align="center" |
| | | class-name="small-padding fixed-width" |
| | | width="280px" |
| | | > |
| | | <el-table-column label="æä½" fixed="right" align="center" class-name="small-padding fixed-width" |
| | | width="280px"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | v-if=" |
| | | scope.row.recordstatus == -1 || |
| | | scope.row.recordstatus == 1 |
| | | " |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-edit" |
| | | @click="handleup(scope.row)" |
| | | >䏿¥</el-button |
| | | > |
| | | <el-button |
| | | v-if=" |
| | | scope.row.recordstatus == -1 || |
| | | scope.row.recordstatus == 1 |
| | | " |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-edit" |
| | | @click="handleUpdate(scope.row)" |
| | | >ä¿®æ¹</el-button |
| | | > |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-view" |
| | | @click="handleDetail(scope.row)" |
| | | >æ¥ç</el-button |
| | | > |
| | | <el-button |
| | | v-if=" |
| | | scope.row.recordstatus == -1 || |
| | | scope.row.recordstatus == 1 |
| | | " |
| | | size="mini" |
| | | type="text" |
| | | @click="handleDelete(scope.row)" |
| | | ><span class="button-delete" |
| | | ><i class="el-icon-delete"></i>å é¤</span |
| | | ></el-button |
| | | > |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-download" |
| | | @click="mixExport(scope.row.id)" |
| | | >ä¸è½½</el-button |
| | | > |
| | | <el-button v-if=" |
| | | scope.row.recordstatus == -1 || |
| | | scope.row.recordstatus == 1 |
| | | " size="mini" type="text" icon="el-icon-edit" @click="handleup(scope.row)">䏿¥</el-button> |
| | | <el-button v-if=" |
| | | scope.row.recordstatus == -1 || |
| | | scope.row.recordstatus == 1 |
| | | " size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)">ä¿®æ¹</el-button> |
| | | <el-button size="mini" type="text" icon="el-icon-view" |
| | | @click="handleDetail(scope.row)">æ¥ç</el-button> |
| | | <el-button v-if=" |
| | | scope.row.recordstatus == -1 || |
| | | scope.row.recordstatus == 1 |
| | | " size="mini" type="text" @click="handleDelete(scope.row)"><span class="button-delete"><i |
| | | class="el-icon-delete"></i>å é¤</span></el-button> |
| | | <el-button size="mini" type="text" icon="el-icon-download" |
| | | @click="mixExport(scope.row.id)">ä¸è½½</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- 2026-10-22ï¼æè¦æ±éèãåè½ãåï¼çº¿ä¸æ¥éï¼ï¼éè¦æ¶åæ¶æ³¨éå³å¯æ¢å¤ --> |
| | | <!-- |
| | | <el-table-column |
| | | fixed="right" |
| | | align="center" |
| | |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | --> |
| | | </el-table> |
| | | <!-- æªéæ©æ¡ä¾æ¶å±ç¤ºè¯¥ç»å½äººå
¨é¨å»å¦ææ¬åæ®ï¼è¶
è¿ä¸é¡µå¯ç¨å页翻ç --> |
| | | <pagination v-show="fundTotal > 0" :total="fundTotal" small :page.sync="fundQueryParam.pageNum" |
| | | :limit.sync="fundQueryParam.pageSize" @pagination="listFundData" /> |
| | | </el-row> |
| | | </el-form> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <!-- æ°å¢ç³è¯·ååå
éæ©æç®æ¡ä¾ï¼å左侧æ¡ä¾å表移å°è¿éï¼ --> |
| | | <el-dialog title="éæ©æç®æ¡ä¾" :visible.sync="caseDialogVisible" width="760px" append-to-body> |
| | | <el-form class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" label-width="70px"> |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="å§å" prop="name"> |
| | | <el-input v-model="queryParams.name" placeholder="请è¾å
¥å§å" clearable size="small" |
| | | @keyup.enter.native="handleQuery" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æç®è¿åº¦" prop="recordstate"> |
| | | <el-select v-model="queryParams.recordstate" placeholder="è¯·éæ©è®°å½ç¶æ" clearable size="small" |
| | | style="width: 100%"> |
| | | <el-option v-for="dict in dict.type.sys_DonationStatus" :key="dict.value" :label="dict.label" |
| | | :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label-width="10px"> |
| | | <el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="el-icon-refresh" size="small" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <el-table ref="caseTable" v-loading="loading" border height="380" highlight-current-row :data="donatebaseinfoList" |
| | | @row-click="selectDonotor"> |
| | | <el-table-column label="æç®è¿åº¦" align="center" prop="recordstate"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag :options="dict.type.sys_DonationStatus" :value="scope.row.recordstate" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å§å" align="center" prop="name" /> |
| | | <el-table-column label="æä½" align="center" width="90"> |
| | | <template slot-scope="scope"> |
| | | <el-button type="text" size="mini" @click="selectDonotor(scope.row)">éæ©</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination v-show="total > 0" :total="total" small :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" @pagination="getBaseInfoList" /> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button @click="caseDialogVisible = false">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | import { getUserProfile } from "@/api/system/user"; |
| | | import { listFundflow } from "@/api/project/fundflow"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { moneySum, moneyAdd, moneySub, moneyMul, moneyRound } from "@/utils/money"; |
| | | |
| | | export default { |
| | | //importå¼å
¥çç»ä»¶éè¦æ³¨å
¥å°å¯¹è±¡ä¸æè½ä½¿ç¨ |
| | |
| | | |
| | | fundQueryParam: { |
| | | pageNum: 1, |
| | | pageSize: 100, |
| | | pageSize: 10, |
| | | infoid: null, |
| | | applytype: "3", |
| | | createBy: null |
| | | createBy: null, |
| | | // æ¥éåç鿡件 |
| | | donorname: null, |
| | | recordstatus: null |
| | | }, |
| | | // 表ååæ° |
| | | form: {}, |
| | |
| | | donatebaseinfoList: [], |
| | | //å½åéä¸æç®æ¡ä¾ |
| | | curCase: {}, |
| | | // ãéæ©æç®æ¡ä¾ãå¯¹è¯æ¡ï¼æ°å¢ç³è¯·åæ¶ä½¿ç¨ï¼ |
| | | caseDialogVisible: false, |
| | | casePickerMode: "", |
| | | //æ¯å¦æ¾ç¤ºè´¹ç¨ç³è¯·å¼¹çª |
| | | dialogOpen: false, |
| | | // title: "", |
| | |
| | | |
| | | // æç®äººéæ
°é®éè¡¨æ ¼æ°æ® |
| | | donateconsolationfundList: [], |
| | | // å³ä¾§æ¥éåæ»æ°ï¼ç¨äºåé¡µï¼ |
| | | fundTotal: 0, |
| | | |
| | | //æç»è®°å½ |
| | | fundDetails: [], |
| | |
| | | watch: {}, |
| | | //çå½å¨æ - åå»ºå®æï¼å¯ä»¥è®¿é®å½åthiså®ä¾ï¼ |
| | | created() { |
| | | this.getList(); |
| | | this.getBaseInfoList(); |
| | | // æ¡ä¾å表已移å
¥ãéæ©æç®æ¡ä¾ãå¯¹è¯æ¡ï¼æå¼å¯¹è¯æ¡æ¶åæ¥è¯¢ |
| | | this.getCurFundType(); |
| | | this.getlistUser(); |
| | | // this.getUnitList(); |
| | | // é¦å±å±ç¤ºå½åç»å½äººçå
¨é¨å»å¦ææ¬åæ® |
| | | this.getAllfundList(); |
| | | }, |
| | | |
| | | //çå½å¨æ - æè½½å®æï¼å¯ä»¥è®¿é®DOMå
ç´ ï¼ |
| | |
| | | this.getUsermsg(); |
| | | }, |
| | | |
| | | beforeCreate() {}, //çå½å¨æ - å建ä¹å |
| | | beforeMount() {}, //çå½å¨æ - æè½½ä¹å |
| | | beforeUpdate() {}, //çå½å¨æ - æ´æ°ä¹å |
| | | updated() {}, //çå½å¨æ - æ´æ°ä¹å |
| | | beforeDestroy() {}, //çå½å¨æ - 鿝ä¹å |
| | | destroyed() {}, //çå½å¨æ - 鿝宿 |
| | | activated() {}, //妿页颿keep-aliveç¼ååè½ï¼è¿ä¸ªå½æ°ä¼è§¦å |
| | | beforeCreate() { }, //çå½å¨æ - å建ä¹å |
| | | beforeMount() { }, //çå½å¨æ - æè½½ä¹å |
| | | beforeUpdate() { }, //çå½å¨æ - æ´æ°ä¹å |
| | | updated() { }, //çå½å¨æ - æ´æ°ä¹å |
| | | beforeDestroy() { }, //çå½å¨æ - 鿝ä¹å |
| | | destroyed() { }, //çå½å¨æ - 鿝宿 |
| | | activated() { }, //妿页颿keep-aliveç¼ååè½ï¼è¿ä¸ªå½æ°ä¼è§¦å |
| | | |
| | | //æ¹æ³éå |
| | | methods: { |
| | |
| | | this.queryParams.pageNum = 1; |
| | | this.getList(); |
| | | }, |
| | | /** éç½®æé®æä½ */ |
| | | /** éç½®æé®æä½ï¼æ¡ä¾éæ©å¯¹è¯æ¡å
çæ¡ä¾æ¥è¯¢ï¼ */ |
| | | resetQuery() { |
| | | this.daterangeReporttime = []; |
| | | |
| | |
| | | }); |
| | | }, |
| | | |
| | | /** æ°å¢æé®æä½ */ |
| | | /** æ°å¢æé®æä½ï¼å
å¼¹åºãéæ©æç®æ¡ä¾ãå¯¹è¯æ¡ */ |
| | | handleAdd() { |
| | | if (this.curCase.id) { |
| | | this.$router.push({ |
| | | path: "/finance/applyDetail/", |
| | | query: { |
| | | id: 0, |
| | | businessType: "3", |
| | | operationType: "add", |
| | | curCase: this.curCase, |
| | | } |
| | | }); |
| | | } else { |
| | | const h = this.$createElement; |
| | | this.$message({ |
| | | message: h("p", null, [ |
| | | h("span", null, "请å¨å·¦è¾¹çæç®æ¡ä¾è¡¨éæ©éè¦æä½çæ¡ä¾ï¼") |
| | | ]) |
| | | }); |
| | | } |
| | | return; |
| | | this.casePickerMode = "add"; |
| | | this.caseDialogVisible = true; |
| | | this.getBaseInfoList(); |
| | | }, |
| | | |
| | | if (this.curCase.id) { |
| | | this.istrue += 2; |
| | | this.reset(); |
| | | this.queryParams.params = {}; |
| | | this.form.donorno = this.curCase.donorno; |
| | | this.form.name = this.curCase.name; |
| | | this.form.infoid = this.curCase.id; |
| | | this.form.username = this.defaultperson.nickName; |
| | | this.form.userno = this.defaultperson.userName; |
| | | this.form.deptmentname = this.defaultperson.dept.deptName; |
| | | this.form.deptmentno = this.defaultperson.dept.deptId; |
| | | this.form.managername = this.defaultperson.dept.leader; |
| | | |
| | | // this.form.createTime = nowdate; |
| | | //this.open = true; |
| | | //this.initFundApplyForm(); |
| | | this.fundDetails = []; |
| | | this.addRow(); |
| | | this.dialogOpen = true; |
| | | this.title = "æ·»å è´¹ç¨ç³è¯·"; |
| | | this.dialogType = "edit"; |
| | | } else { |
| | | const h = this.$createElement; |
| | | this.$message({ |
| | | message: h("p", null, [h("span", null, "请å
éæ©å·¦æ¹æç®æ¡ä¾ ")]) |
| | | }); |
| | | } |
| | | /** æºå¸¦å·²éæ¡ä¾è·³è½¬å°ç³è¯·åå¡«å页 */ |
| | | goApplyAdd() { |
| | | this.$router.push({ |
| | | path: "/finance/applyDetail/", |
| | | query: { |
| | | id: 0, |
| | | businessType: "3", |
| | | operationType: "add", |
| | | curCase: this.curCase, |
| | | } |
| | | }); |
| | | }, |
| | | /** ä¿®æ¹æé®æä½ */ |
| | | handleUpdate(row) { |
| | |
| | | //éä»¶å¤ç |
| | | this.fileList = this.form.annexbankcard |
| | | ? this.form.annexbankcard |
| | | .split(",") |
| | | .map(item => ({ url: item, name: item })) |
| | | .split(",") |
| | | .map(item => ({ url: item, name: item })) |
| | | : []; |
| | | |
| | | getownFundDetail(id).then(async res => { |
| | |
| | | //éä»¶å¤ç |
| | | this.fileList = this.form.annexbankcard |
| | | ? this.form.annexbankcard |
| | | .split(",") |
| | | .map(item => ({ url: item, name: item })) |
| | | .split(",") |
| | | .map(item => ({ url: item, name: item })) |
| | | : []; |
| | | |
| | | listFundflow(listFundflowparams).then(res => { |
| | |
| | | const ids = row.id || this.ids; |
| | | this.$modal |
| | | .confirm("æ¯å¦ç¡®è®¤å é¤è¯¥è®°å½ï¼") |
| | | .then(function() { |
| | | .then(function () { |
| | | return delFund(ids); |
| | | }) |
| | | .then(() => { |
| | |
| | | this.getfundList(); |
| | | this.$modal.msgSuccess("å 餿å"); |
| | | }) |
| | | .catch(() => {}); |
| | | .catch(() => { }); |
| | | }, |
| | | |
| | | /** 䏿¥æé®æä½ */ |
| | |
| | | }); |
| | | }, |
| | | |
| | | //ç¹å»æç®æ¡ä¾åè¡¨è§¦åæ¹æ³ |
| | | //ç¹å»æç®æ¡ä¾åè¡¨è§¦åæ¹æ³ï¼æ¡ä¾å表已移å
¥ãéæ©æç®æ¡ä¾ãå¯¹è¯æ¡ï¼ |
| | | selectDonotor(row, column, event) { |
| | | this.curCase = row; |
| | | this.getfundList(); |
| | | if (this.casePickerMode === "add") { |
| | | // ä»ãæ°å¢ç³è¯·åãè¿å
¥ï¼é宿¡ä¾ç´æ¥è·³å°ç³è¯·åå¡«å页 |
| | | this.casePickerMode = ""; |
| | | this.caseDialogVisible = false; |
| | | this.goApplyAdd(); |
| | | } |
| | | }, |
| | | |
| | | getfundList() { |
| | | this.loading = true; |
| | | this.reset(); |
| | | // é䏿¡ä¾åææ¡ä¾å±ç¤ºï¼åæ¶æ¸
æå表ç鿡件ï¼é¿å
两个æ¡ä»¶å å 导è´ç©ºå表 |
| | | this.fundQueryParam.donorname = null; |
| | | this.fundQueryParam.recordstatus = null; |
| | | this.fundQueryParam.infoid = this.curCase.id; |
| | | this.fundQueryParam.pageNum = 1; |
| | | this.listFundData(); |
| | | }, |
| | | |
| | | /** |
| | | * æå½å fundQueryParam æ¥è¯¢å³ä¾§æ¥éåå表 |
| | | * infoid 为空 = å½åç»å½äººçå
¨é¨è¯¥ç±»ååæ®ï¼æå¼ = æå®æ¡ä¾ |
| | | */ |
| | | listFundData() { |
| | | this.loading = true; |
| | | listFund(this.fundQueryParam).then(response => { |
| | | this.loading = false; |
| | | this.donateconsolationfundList = response.rows; |
| | | this.fundTotal = response.total; |
| | | }); |
| | | }, |
| | | |
| | | /** æ¥éåçéï¼æç´¢ */ |
| | | handleQueryFund() { |
| | | this.fundQueryParam.pageNum = 1; |
| | | this.listFundData(); |
| | | }, |
| | | |
| | | /** æ¥éåçéï¼éç½®ï¼æ¸
空æ¡ä»¶ä¸å·²éæ¡ä¾ï¼åå°è¯¥ç»å½äººå
¨é¨åæ®ï¼ */ |
| | | resetFundQuery() { |
| | | this.fundQueryParam.donorname = null; |
| | | this.fundQueryParam.recordstatus = null; |
| | | this.getAllfundList(); |
| | | }, |
| | | |
| | | /** |
| | | * æ£ç´¢å
¨é¨ï¼åæ¶å·¦ä¾§æ¡ä¾éæ©ä¸çéæ¡ä»¶ï¼æ¥è¯¢å½åç»å½äººçå
¨é¨å»å¦ææ¬åæ® |
| | | */ |
| | | getAllfundList() { |
| | | this.curCase = {}; |
| | | // åæ¶æ¸
æå·¦ä¾§æ¡ä¾å表çé«äº®é䏿 |
| | | if (this.$refs.caseTable) { |
| | | this.$refs.caseTable.setCurrentRow(); |
| | | } |
| | | this.reset(); |
| | | this.fundQueryParam.infoid = null; |
| | | this.fundQueryParam.donorname = null; |
| | | this.fundQueryParam.recordstatus = null; |
| | | this.fundQueryParam.pageNum = 1; |
| | | this.listFundData(); |
| | | }, |
| | | |
| | | // åæ¶æé® |
| | |
| | | tempData.itemid = tempItemArr[itemIndex].id; |
| | | } |
| | | if (tempData.id > 0) { |
| | | updateFunddetail(tempData).then(response2 => {}); |
| | | updateFunddetail(tempData).then(response2 => { }); |
| | | } else { |
| | | addFunddetail(tempData).then(response2 => {}); |
| | | addFunddetail(tempData).then(response2 => { }); |
| | | } |
| | | } |
| | | }); |
| | |
| | | }); |
| | | }, |
| | | |
| | | //è®¡ç®æ»éé¢ |
| | | //è®¡ç®æ»éé¢ï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ç¦æ¢ parseFloat ç´¯å ï¼ |
| | | sumTotalFee(row) { |
| | | let allSum = 0; |
| | | const detailsArr = []; |
| | | if (this.form.applytype != null) { |
| | | for (let i = 0; i < this.fundDetails.length; i++) { |
| | | const detail = this.fundDetails[i]; |
| | | let totalFee = 0; |
| | | let taxFee = 0; |
| | | if (this.form.applytype == 1 || this.form.applytype == 2) { |
| | | //计ç®å½åæ¥éå
容费ç¨å计 |
| | | if (!isNaN(parseFloat(this.fundDetails[i].amount))) { |
| | | totalFee += parseFloat(this.fundDetails[i].amount); |
| | | taxFee += parseFloat(this.fundDetails[i].amount); |
| | | //计ç®å½åæ¥éå
容费ç¨å计ï¼ç¨å - æ£ç¨ |
| | | if (!isNaN(parseFloat(detail.amount))) { |
| | | totalFee = moneyAdd(totalFee, detail.amount); |
| | | taxFee = moneyAdd(taxFee, detail.amount); |
| | | } |
| | | if (!isNaN(parseFloat(this.fundDetails[i].taxamount))) { |
| | | totalFee -= parseFloat(this.fundDetails[i].taxamount); |
| | | taxFee -= parseFloat(this.fundDetails[i].taxamount); |
| | | if (!isNaN(parseFloat(detail.taxamount))) { |
| | | totalFee = moneySub(totalFee, detail.taxamount); |
| | | taxFee = moneySub(taxFee, detail.taxamount); |
| | | } |
| | | } else if (this.form.applytype == 3) { |
| | | if ( |
| | | !isNaN(parseFloat(this.fundDetails[i].price)) && |
| | | !isNaN(parseFloat(this.fundDetails[i].quantity)) |
| | | !isNaN(parseFloat(detail.price)) && |
| | | !isNaN(parseFloat(detail.quantity)) |
| | | ) { |
| | | totalFee += |
| | | parseFloat(this.fundDetails[i].price) * |
| | | parseFloat(this.fundDetails[i].quantity); |
| | | totalFee = moneyMul(detail.price, detail.quantity); |
| | | } |
| | | } |
| | | if (!isNaN(parseFloat(taxFee))) { |
| | | this.fundDetails[i].taxedamount = taxFee.toFixed(2); |
| | | this.fundDetails[i].taxedamount = moneyRound(taxFee).toFixed(2); |
| | | } |
| | | allSum += totalFee; |
| | | detailsArr.push(totalFee); |
| | | } |
| | | } |
| | | //this.form.amountrequested = allSum.toFixed(2); |
| | | this.$set(this.form, "amountrequested", allSum.toFixed(2)); |
| | | this.$set(this.form, "amountrequested", moneyRound(moneySum(detailsArr)).toFixed(2)); |
| | | //this.$forceUpdate(); |
| | | }, |
| | | |
| | |
| | | }, |
| | | |
| | | //æä»¶ä¸ä¼ |
| | | handleUploadError() {}, |
| | | handleUploadError() { }, |
| | | |
| | | handleremove(file) { |
| | | this.fileList.splice(this.fileList.indexOf(file), 1); |
| | |
| | | .button-delete { |
| | | color: rgb(236, 69, 69); |
| | | } |
| | | |
| | | ::v-deep.el-table .error-row { |
| | | background: #fcebeb; |
| | | } |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | clearable |
| | | style="width: 100%" |
| | | v-model="form.applyTime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="ç³è¯·æ¥æ" |
| | | > |
| | |
| | | }); |
| | | }, |
| | | |
| | | //è®¡ç®æ»éé¢ |
| | | //è®¡ç®æ»éé¢ï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ç¦æ¢ parseFloat ç´¯å ï¼ |
| | | sumTotalFee(row) { |
| | | let allSum = 0; |
| | | const detailsArr = []; |
| | | if (this.form.applytype != null) { |
| | | for (let i = 0; i < this.fundDetails.length; i++) { |
| | | const detail = this.fundDetails[i]; |
| | | let totalFee = 0; |
| | | let taxFee = 0; |
| | | if (this.form.applytype == 1 || this.form.applytype == 2) { |
| | | //计ç®å½åæ¥éå
容费ç¨å计 |
| | | if (!isNaN(parseFloat(this.fundDetails[i].amount))) { |
| | | totalFee += parseFloat(this.fundDetails[i].amount); |
| | | taxFee += parseFloat(this.fundDetails[i].amount); |
| | | //计ç®å½åæ¥éå
容费ç¨å计ï¼ç¨å - æ£ç¨ |
| | | if (!isNaN(parseFloat(detail.amount))) { |
| | | totalFee = moneyAdd(totalFee, detail.amount); |
| | | taxFee = moneyAdd(taxFee, detail.amount); |
| | | } |
| | | if (!isNaN(parseFloat(this.fundDetails[i].taxamount))) { |
| | | totalFee -= parseFloat(this.fundDetails[i].taxamount); |
| | | taxFee -= parseFloat(this.fundDetails[i].taxamount); |
| | | if (!isNaN(parseFloat(detail.taxamount))) { |
| | | totalFee = moneySub(totalFee, detail.taxamount); |
| | | taxFee = moneySub(taxFee, detail.taxamount); |
| | | } |
| | | } else if (this.form.applytype == 3) { |
| | | if ( |
| | | !isNaN(parseFloat(this.fundDetails[i].price)) && |
| | | !isNaN(parseFloat(this.fundDetails[i].quantity)) |
| | | !isNaN(parseFloat(detail.price)) && |
| | | !isNaN(parseFloat(detail.quantity)) |
| | | ) { |
| | | totalFee += |
| | | parseFloat(this.fundDetails[i].price) * |
| | | parseFloat(this.fundDetails[i].quantity); |
| | | totalFee = moneyMul(detail.price, detail.quantity); |
| | | } |
| | | } |
| | | if (!isNaN(parseFloat(taxFee))) { |
| | | this.fundDetails[i].taxedamount = taxFee.toFixed(2); |
| | | this.fundDetails[i].taxedamount = moneyRound(taxFee).toFixed(2); |
| | | } |
| | | allSum += totalFee; |
| | | detailsArr.push(totalFee); |
| | | } |
| | | } |
| | | //this.form.amountrequested = allSum.toFixed(2); |
| | | this.$set(this.form, "amountrequested", allSum.toFixed(2)); |
| | | this.$set(this.form, "amountrequested", moneyRound(moneySum(detailsArr)).toFixed(2)); |
| | | //this.$forceUpdate(); |
| | | }, |
| | | |
| | |
| | | if (response.code == 200) { |
| | | this.form.filename = file.raw.name; |
| | | this.$modal.msgSuccess(response.msg); |
| | | this.fileList.push({ name: response.fileName, url: response.fileName }); |
| | | // 2026-10-15ï¼å表éç name ç¨æä½äººçåå§æä»¶åï¼ä¸è¦ç¨ response.fileNameï¼é£æ¯åå¨è·¯å¾ï¼ã |
| | | // ä¿åæ¶åªåå urlï¼form.annexbankcard åçæ¯éå·æ¼æ¥ç urlï¼ï¼æä»¥è¿éåªå½±åä¸ä¼ æ¡çæ¾ç¤ºã |
| | | this.fileList.push({ name: file.raw.name, url: response.fileName }); |
| | | } else { |
| | | console.log(response.msg); |
| | | } |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="applyTime"> |
| | | <el-date-picker |
| | | format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | v-model="queryParams.value1" |
| | | type="daterange" |
| | | range-separator="è³" |
| | |
| | | clearable |
| | | style="width: 100%" |
| | | v-model="form.applyTime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="ç³è¯·æ¥æ" |
| | | :disabled="true" |
| | |
| | | icon="el-icon-download" |
| | | size="small" |
| | | @click="Batchentry" |
| | | >æ¹éå½å
¥äººå</el-button |
| | | >æ¹é导å
¥ç»©æäººå</el-button |
| | | > |
| | | </div> |
| | | </el-col> |
| | |
| | | <el-table-column |
| | | prop="beneficiaryname" |
| | | align="center" |
| | | label="绩æäººåæåä½" |
| | | label="绩æäººå/åä½" |
| | | width="250" |
| | | > |
| | | <template slot-scope="scope"> |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="isunit" |
| | | align="center" |
| | | label="人åç±»å«" |
| | | width="100" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-tag |
| | | :type="scope.row.isunit == 1 ? 'warning' : 'success'" |
| | | size="mini" |
| | | >{{ scope.row.isunit == 1 ? "åä½" : "个人" }}</el-tag |
| | | > |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="idcardno" |
| | | align="center" |
| | | label="身份è¯å·" |
| | | width="200" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.idcardno" placeholder="身份è¯å·" /> |
| | | <el-input |
| | | v-model="scope.row.idcardno" |
| | | :disabled="scope.row.isunit == 1" |
| | | :placeholder=" |
| | | scope.row.isunit == 1 ? 'å使 éå¡«å' : '身份è¯å·' |
| | | " |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | |
| | | :visible.sync="showSelectionDialog" |
| | | :close-on-click-modal="false" |
| | | :title="'绩æäººåï¼å«æå¨åä½ï¼è´¦å·éæ©'" |
| | | width="500px" |
| | | width="560px" |
| | | style="text-align: center" |
| | | v-loading="loading" |
| | | > |
| | | <el-form ref="funddetailForm" :model="funddetailForm"> |
| | | <el-row> |
| | | <el-form-item label="请è¾å
¥éæ©ï¼" prop="unitno" label-width="120px"> |
| | | <el-form-item label="çæ¥äººåï¼" prop="userKey" label-width="120px"> |
| | | <el-select |
| | | v-model="funddetailForm.userName" |
| | | v-model="funddetailForm.userKey" |
| | | filterable |
| | | remote |
| | | reserve-keyword |
| | | clearable |
| | | allow-create |
| | | default-first-option |
| | | placeholder="请è¾å
¥å§åæåä½åç§°" |
| | | :remote-method="remoteMethod" |
| | | :loading="loadingperformance" |
| | | :filter-method="filterPersonOption" |
| | | placeholder="è¾å
¥ å§å / åä½ / å·¥å· / 身份è¯å4ä½ çæ¥ï¼ä¹å¯ç´æ¥è¾å
¥å§å" |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="item in optionsperformance" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | :key="item.id" |
| | | :label="personOptionLabel(item)" |
| | | :value="item.id" |
| | | > |
| | | <span style="float: left">{{ item.username }}</span> |
| | | <span style="float: right; color: #8492a6; font-size: 13px"> |
| | | {{ |
| | | item.isUnitPerson ? "åä½" : "å·¥å· " + (item.userno || "-") |
| | | }}{{ item.unitname ? " · " + item.unitname : "" }} |
| | | </span> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-row> |
| | | <el-row style="text-align: left; padding-left: 120px"> |
| | | <span style="color: #909399; font-size: 12px"> |
| | | åé为人åç±»åå«ãåä¸ç»©æãç人åï¼éä¸å身份è¯å·ãé¶è¡è´¦å·çèªå¨å¸¦åºï¼åä½ä¸ºåä½çè¡ä¸æ ¡éªèº«ä»½è¯å·ã |
| | | </span> |
| | | </el-row> |
| | | </el-form> |
| | | <span slot="footer" class="dialog-footer"> |
| | |
| | | <el-radio-button :label="70">年度绩æ</el-radio-button> |
| | | </el-radio-group> |
| | | </div> |
| | | <div style="margin-bottom: 12px; margin-left: 10px;"> |
| | | <el-input |
| | | v-model="personKeyword" |
| | | clearable |
| | | size="small" |
| | | prefix-icon="el-icon-search" |
| | | placeholder="è¾å
¥ å§å / åä½ / å·¥å· / 身份è¯å4ä½ çæ¥" |
| | | style="width: 330px" |
| | | /> |
| | | <span style="margin-left: 10px; color: #909399; font-size: 12px"> |
| | | å
± {{ filteredCityOptions.length }} 人 |
| | | </span> |
| | | </div> |
| | | <div style="max-height: 330px; overflow-y: auto"> |
| | | <el-checkbox |
| | | :indeterminate="isIndeterminate" |
| | | v-model="checkAll" |
| | | @change="handleCheckAllChange" |
| | | >å
¨é</el-checkbox |
| | | >å
¨éï¼å½åçæ¥ç»æï¼</el-checkbox |
| | | > |
| | | <div style="margin: 15px 0;"></div> |
| | | <el-checkbox-group |
| | |
| | | > |
| | | <el-checkbox |
| | | border |
| | | v-for="city in cityOptions" |
| | | v-for="city in filteredCityOptions" |
| | | :label="city" |
| | | :key="city.userNo" |
| | | >{{ city.userName }}</el-checkbox |
| | | :key="city.id" |
| | | >{{ city.username }}{{ city.isUnitPerson ? "ï¼åä½ï¼" : "" |
| | | }}{{ city.unitname ? " · " + city.unitname : "" }}</el-checkbox |
| | | > |
| | | </el-checkbox-group> |
| | | </div> |
| | |
| | | listOrganization, |
| | | getOrganization, |
| | | listReportname, |
| | | listperformance, |
| | | listUser |
| | | } from "@/api/project/organization"; |
| | | |
| | |
| | | import Li_area_select from "@/components/Address"; |
| | | import OrgSelecter from "@/views/project/components/orgselect"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { moneySum, moneyAdd, moneySub, moneyRound } from "@/utils/money"; |
| | | import { checkFileName, checkDetails } from "@/utils/fileNameCheck"; |
| | | import CustomImageViewer from "@/components/CustomImageViewer"; |
| | | |
| | | export default { |
| | |
| | | feeUnitList: [], |
| | | batchdialogVisible: false, |
| | | itemlist: [], |
| | | //绩æäººååéï¼äººåç±»åå«ãåä¸ç»©æãç人åï¼æ¥èª service_externalpersonï¼ |
| | | cityOptions: [], |
| | | //æ¹éå½å
¥å¼¹æ¡ççæ¥å
³é®å |
| | | personKeyword: "", |
| | | checkAll: false, |
| | | checkedCities: [], |
| | | Personnelforname: null, |
| | |
| | | |
| | | funddetailForm: { |
| | | index: null, |
| | | userKey: null, |
| | | userName: null, |
| | | beneficiaryname: null, |
| | | beneficiaryno: null, |
| | |
| | | }, |
| | | |
| | | //çå¬å±æ§ 类似äºdataæ¦å¿µ |
| | | computed: {}, |
| | | computed: { |
| | | //æ¹éå½å
¥å¼¹æ¡ï¼æå
³é®åï¼å§å/åä½/å·¥å·/身份è¯å4ä½ï¼çæ¥åçåé人 |
| | | filteredCityOptions() { |
| | | const kw = (this.personKeyword || "").trim().toLowerCase(); |
| | | if (!kw) { |
| | | return this.cityOptions; |
| | | } |
| | | return this.cityOptions.filter(item => this.personMatchKeyword(item, kw)); |
| | | } |
| | | }, |
| | | //çæ§dataä¸çæ°æ®åå |
| | | watch: {}, |
| | | //æ¹æ³éå |
| | |
| | | }, |
| | | /** æäº¤æé® */ |
| | | submitForm: debounce(function() { |
| | | // 2026-10-15ï¼ä¿ååéä»¶æä»¶åè§èæ ¡éªï¼ä»
æ°å¢åæ®ï¼èåæ®çåå²éä»¶ç±å端æ"åªæ ¡éªæ¬æ¬¡åæ´"æ¾è¡ï¼ |
| | | if (!this.checkDetailFileNames()) { |
| | | return; |
| | | } |
| | | |
| | | if (!this.randomnumber) { |
| | | this.randomnumber = this.generateRandomString(9); |
| | | this.form.randomnumber = this.randomnumber; |
| | |
| | | ); |
| | | return; |
| | | } |
| | | if (tempDetail.idcardno == null) { |
| | | // åä½è¡ï¼isunit=1ï¼ä¸éè¦èº«ä»½è¯å· |
| | | if ( |
| | | tempDetail.isunit != 1 && |
| | | (tempDetail.idcardno == null || |
| | | String(tempDetail.idcardno).trim() === "") |
| | | ) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼ç¬¬" + |
| | | (k + 1).toString() + |
| | |
| | | return; |
| | | } |
| | | } |
| | | } |
| | | |
| | | //æç»é夿 ¡éªï¼åä¸äººå/åä½ä¸å
许åºç°å¤è¡ |
| | | const detailNameMap = {}; |
| | | for (let k = 0; k < this.rbDetails.length; k++) { |
| | | const nm = String(this.rbDetails[k].beneficiaryname || "").trim(); |
| | | if (!nm) { |
| | | continue; |
| | | } |
| | | if (detailNameMap[nm]) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼äººååç§°ï¼" + nm + " éå¤ï¼è¯·æ ¸å¯¹ååæäº¤ä¿åï¼" |
| | | ); |
| | | return; |
| | | } |
| | | detailNameMap[nm] = true; |
| | | } |
| | | |
| | | //å¤çæç» |
| | |
| | | this.$router.go(-1); |
| | | } else { |
| | | this.$modal.closeLoading(); |
| | | if (res.msg) { |
| | | this.$modal.msgError("æä½å¤±è¯¯"); |
| | | } else { |
| | | this.$modal.msgError(res.msg); |
| | | } |
| | | this.$modal.msgError(res.msg || "æä½å¤±è´¥"); |
| | | } |
| | | }); |
| | | }, |
| | |
| | | this.personlist = res.rows; |
| | | for (let j = 0; j < this.personlist.length; j++) { |
| | | //è·åè´¹ç¨æ¥éæºæå表 |
| | | if (this.personlist[j].usertype == "org") { |
| | | if (this.hasUserType(this.personlist[j].usertype, "org")) { |
| | | this.feeUnitList.push({ |
| | | id: this.personlist[j].id, |
| | | reportNo: this.personlist[j].userno, |
| | |
| | | }); |
| | | } |
| | | //ä¸å®¶äººåå表 |
| | | else if (res.rows[j].usertype == "expert") { |
| | | else if (this.hasUserType(res.rows[j].usertype, "expert")) { |
| | | this.expertlist.push({ |
| | | expertNo: this.personlist[j].id, |
| | | exportName: this.personlist[j].username |
| | |
| | | } |
| | | }, |
| | | |
| | | //ç¨åæ£ç¨ç®ç¨å |
| | | //ç¨åæ£ç¨ç®ç¨åï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ |
| | | chargeSum(row, type) { |
| | | let targetValue = 0; |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | if (!this.rbDetails[i].amount) { |
| | | this.rbDetails[i].amount = 0; |
| | |
| | | if (!this.rbDetails[i].taxamount) { |
| | | this.rbDetails[i].taxamount = 0; |
| | | } |
| | | this.rbDetails[i].taxedamount = ( |
| | | parseFloat(this.rbDetails[i].amount) - |
| | | parseFloat(this.rbDetails[i].taxamount) |
| | | //ç¨å - æ£ç¨ = ç¨åï¼æµ®ç¹ç¸å伿®çæå°å°¾å·®ï¼å¯¼è´åºç° -0.00ï¼ |
| | | this.rbDetails[i].taxedamount = moneySub( |
| | | this.rbDetails[i].amount, |
| | | this.rbDetails[i].taxamount |
| | | ).toFixed(2); |
| | | targetValue += parseFloat(this.rbDetails[i].amount); // å设æ¯ä¸ªå¯¹è±¡ä¸çç¹å®å¼åå¨å¨'specificValue'屿§ä¸ |
| | | console.log(this.rbDetails[i].taxedamount, "å计"); |
| | | } |
| | | console.log(targetValue, "å计"); |
| | | this.form.pretaxcost = targetValue; |
| | | //å计å¿
须精确累å ï¼å¦åä¼åå
¥ form.pretaxcost å¹¶è½åº |
| | | this.form.pretaxcost = moneySum(this.rbDetails, "amount"); |
| | | }, |
| | | //ç¨åæ£ç¨ç®ç¨å |
| | | //ç¨åæ£ç¨ç®ç¨åï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ |
| | | queenchargeSum(row, type) { |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | if (!this.rbDetails[i].amount) { |
| | |
| | | if (!this.rbDetails[i].taxamount) { |
| | | this.rbDetails[i].taxamount = 0; |
| | | } |
| | | this.rbDetails[i].amount = |
| | | parseFloat(this.rbDetails[i].taxamount) + |
| | | parseFloat(this.rbDetails[i].taxedamount); |
| | | //æ£ç¨ + ç¨å = ç¨åï¼å¿
须精确ç¸å å¹¶å½ä¸åå° 2 ä½ï¼å¦å伿®çé¿å°æ°ï¼ |
| | | this.rbDetails[i].amount = moneyRound( |
| | | moneyAdd(this.rbDetails[i].taxamount, this.rbDetails[i].taxedamount) |
| | | ); |
| | | } |
| | | }, |
| | | |
| | |
| | | }, |
| | | // æ¥åæéç«å»ä¿å |
| | | Savenow() { |
| | | // 2026-10-15ï¼ä¿ååéä»¶æä»¶åè§èæ ¡éªï¼ä»
æ°å¢åæ®ï¼èåæ®çåå²éä»¶ç±å端æ"åªæ ¡éªæ¬æ¬¡åæ´"æ¾è¡ï¼ |
| | | if (!this.checkDetailFileNames()) { |
| | | return; |
| | | } |
| | | |
| | | if (!this.randomnumber) { |
| | | this.randomnumber = this.generateRandomString(9); |
| | | this.form.randomnumber = this.randomnumber; |
| | |
| | | return; |
| | | } |
| | | } |
| | | } |
| | | |
| | | //æç»é夿 ¡éªï¼åä¸äººå/åä½ä¸å
许åºç°å¤è¡ |
| | | const detailNameMap = {}; |
| | | for (let k = 0; k < this.rbDetails.length; k++) { |
| | | const nm = String(this.rbDetails[k].beneficiaryname || "").trim(); |
| | | if (!nm) { |
| | | continue; |
| | | } |
| | | if (detailNameMap[nm]) { |
| | | this.$modal.msgWarning( |
| | | "æå¡é¡¹ç®è¡¨ä¸ï¼äººååç§°ï¼" + nm + " éå¤ï¼è¯·æ ¸å¯¹ååæäº¤ä¿åï¼" |
| | | ); |
| | | return; |
| | | } |
| | | detailNameMap[nm] = true; |
| | | } |
| | | |
| | | //å¤çæç» |
| | |
| | | } |
| | | }); |
| | | }, |
| | | // å
¨é |
| | | // å
¨éï¼æå½åçæ¥ç»æï¼ |
| | | handleCheckAllChange(val) { |
| | | this.checkedCities = val ? this.cityOptions : []; |
| | | this.checkedCities = val ? this.filteredCityOptions.slice() : []; |
| | | this.isIndeterminate = false; |
| | | }, |
| | | handleCheckedCitiesChange(value) { |
| | | let checkedCount = value.length; |
| | | this.checkAll = checkedCount === this.cityOptions.length; |
| | | this.checkAll = |
| | | this.filteredCityOptions.length > 0 && |
| | | checkedCount === this.filteredCityOptions.length; |
| | | this.isIndeterminate = |
| | | checkedCount > 0 && checkedCount < this.cityOptions.length; |
| | | checkedCount > 0 && checkedCount < this.filteredCityOptions.length; |
| | | }, |
| | | // æå¨è®¡ç® |
| | | Manualcalculationfn() { |
| | |
| | | }, |
| | | // æ¹éå½å
¥ç¹å» |
| | | Batchentry() { |
| | | // ethical |
| | | this.listperformance(); |
| | | this.personKeyword = ""; |
| | | this.checkedCities = []; |
| | | this.checkAll = false; |
| | | this.isIndeterminate = false; |
| | | this.batchdialogVisible = true; |
| | | }, |
| | | /** |
| | | * è½½å
¥ç»©æäººååéã |
| | | * æ¹é ååèªäººååç»è¡¨ï¼service_externalperson_groupï¼group_id=1ï¼ï¼ |
| | | * 2026-09-27 èµ·æ¹ä¸ºã人åç±»åï¼UserTypeï¼å¯å¤éï¼å« åä¸ç»©æãçå¤å´äººåè´¦æ·ï¼ |
| | | * ä¸åä¾èµåç»è¡¨ã |
| | | */ |
| | | listperformance() { |
| | | listperformance(1).then(res => { |
| | | this.cityOptions = res.data; |
| | | this.listperformancea = []; |
| | | this.listperformancea = this.cityOptions.map(item => { |
| | | return { value: item.userName, label: item.userName }; |
| | | }); |
| | | listExternalperson({ |
| | | usertype: "performance", |
| | | pageNum: 1, |
| | | pageSize: 10000 |
| | | }).then(res => { |
| | | const rows = res.rows || []; |
| | | this.cityOptions = rows |
| | | //åªä¿çå¯ç¨è´¦å·ï¼ä¸æ¹é ååç»è¡¨æ¥å£ç userstatus=1 å£å¾ä¸è´ï¼ã |
| | | //注æï¼ServiceExternalperson å®ä½æ²¡æ del_flag åæ®µï¼æ¥å£ä¸è¿åè¯¥åæ®µï¼ |
| | | //ä¸è½ç¨å®åè¿æ»¤ï¼å¦å undefined == 0 伿å
¨é¨åé人滤空ã |
| | | .filter( |
| | | item => |
| | | item.userstatus === undefined || |
| | | item.userstatus === null || |
| | | item.userstatus == 1 |
| | | ) |
| | | .map(item => { |
| | | return Object.assign({}, item, { |
| | | isUnitPerson: this.hasUserType(item.usertype, "org") |
| | | }); |
| | | }); |
| | | }); |
| | | }, |
| | | /** 人åç±»åï¼å¤å¼ï¼éå·åéï¼æ¯å¦å
嫿å®ç±»å */ |
| | | hasUserType(usertype, code) { |
| | | if (!usertype) { |
| | | return false; |
| | | } |
| | | return ( |
| | | String(usertype) |
| | | .split(",") |
| | | .map(t => t.trim()) |
| | | .indexOf(code) > -1 |
| | | ); |
| | | }, |
| | | /** å
³é®åå½ä¸å¤æï¼å§å / åä½ / å·¥å· / 身份è¯å4ä½ */ |
| | | personMatchKeyword(item, kw) { |
| | | const idcard = String(item.idcardno || ""); |
| | | return ( |
| | | String(item.username || "") |
| | | .toLowerCase() |
| | | .indexOf(kw) > -1 || |
| | | String(item.unitname || "") |
| | | .toLowerCase() |
| | | .indexOf(kw) > -1 || |
| | | String(item.userno || "") |
| | | .toLowerCase() |
| | | .indexOf(kw) > -1 || |
| | | (idcard.length >= 4 && idcard.slice(-4).indexOf(kw) > -1) |
| | | ); |
| | | }, |
| | | /** è¯å«äººåç±»å«ï¼åä½ï¼äººåç±»åå« orgï¼è¿æ¯ä¸ªäºº */ |
| | | isUnitPerson(item) { |
| | | return !!(item && this.hasUserType(item.usertype, "org")); |
| | | }, |
| | | /** éæ©æ¡ä¸æé¡¹ææ¡ï¼å§åï¼åä½ï¼ */ |
| | | personOptionLabel(item) { |
| | | return ( |
| | | (item.username || "") + |
| | | (item.unitname ? "ï¼" + item.unitname + "ï¼" : "") + |
| | | (item.isUnitPerson ? " - åä½" : "") |
| | | ); |
| | | }, |
| | | /** éæ©æ¡åéï¼ç©ºå
³é®åè¿åå
¨é¨ï¼å¦åæå
³é®åçæ¥ */ |
| | | filterPersonCandidates(kw) { |
| | | if (!kw) { |
| | | return this.cityOptions.slice(); |
| | | } |
| | | return this.cityOptions.filter(item => this.personMatchKeyword(item, kw)); |
| | | }, |
| | | /** éæ©æ¡æ¬å°çæ¥ï¼å§å/åä½/å·¥å·/身份è¯å4ä½ï¼ */ |
| | | filterPersonOption(query) { |
| | | const kw = (query || "").trim().toLowerCase(); |
| | | this.optionsperformance = this.filterPersonCandidates(kw); |
| | | // å·²éä¸é¡¹è¦ä¿çå¨ä¸æéï¼å¦ååæ¾ä¼ç©ºç½ |
| | | const picked = this.getPickedPerson(this.funddetailForm.userKey); |
| | | if (picked && this.optionsperformance.indexOf(picked) === -1) { |
| | | this.optionsperformance = [picked].concat(this.optionsperformance); |
| | | } |
| | | }, |
| | | /** æå¯ä¸é®ï¼äººå IDï¼ååéï¼æå·¥è¾å
¥çå§åè¿å null */ |
| | | getPickedPerson(key) { |
| | | if (key === null || key === undefined || key === "") { |
| | | return null; |
| | | } |
| | | return ( |
| | | this.cityOptions.find(item => String(item.id) === String(key)) || null |
| | | ); |
| | | }, |
| | | // 确认å½å
¥ |
| | | BatchentryFn() { |
| | |
| | | if (!this.rbDetails[0].applytype) { |
| | | this.rbDetails = []; |
| | | } |
| | | // æç»ä¸å·²æç人åå§åï¼ç¨äºé夿éï¼ä¸ä¼¦çä¸å®¶è´¹é¡µçå¤éå£å¾ä¸è´ï¼ |
| | | const existed = {}; |
| | | this.rbDetails.forEach(row => { |
| | | if (row.beneficiaryname) { |
| | | existed[String(row.beneficiaryname).trim()] = true; |
| | | } |
| | | }); |
| | | |
| | | const duplicated = []; |
| | | this.checkedCities.forEach(item => { |
| | | const nameKey = String(item.username || "").trim(); |
| | | if (nameKey && existed[nameKey]) { |
| | | duplicated.push(item.username); |
| | | return; |
| | | } |
| | | if (nameKey) { |
| | | existed[nameKey] = true; |
| | | } |
| | | const isunit = this.isUnitPerson(item); |
| | | let rowData = { |
| | | orderno: null, |
| | | fundid: null, |
| | | beneficiaryname: item.userName, |
| | | beneficiaryno: item.usertNo, |
| | | beneficiaryname: item.username, |
| | | beneficiaryno: item.userno, |
| | | isunit: isunit ? 1 : 0, |
| | | unitname: item.unitname, |
| | | unitno: null, |
| | | unitno: item.unitno, |
| | | uintuserno: null, |
| | | title: item.title, |
| | | idcardtype: null, |
| | | idcardno: item.idcrad, |
| | | idcardno: isunit ? "" : item.idcardno, |
| | | sex: null, |
| | | familyrelations: null, |
| | | phone: null, |
| | | depositbank: item.depositBank, |
| | | bankcardno: item.bankCardNo, |
| | | phone: item.telephone, |
| | | depositbank: item.depositbank, |
| | | bankcardno: item.bankcardno, |
| | | branchbankname: item.branchbankname, |
| | | annexbankcard: null, |
| | | annexregistform: null, |
| | |
| | | this.calculateTax(); |
| | | this.batchdialogVisible = false; |
| | | this.checkedCities = []; |
| | | if (duplicated.length) { |
| | | this.$modal.msgWarning( |
| | | "以ä¸äººå卿ç»ä¸å·²åå¨ï¼å·²è·³è¿é夿·»å ï¼" + duplicated.join("ã") |
| | | ); |
| | | } |
| | | console.log(this.rowfeeItemTypes); |
| | | }, |
| | | //æ°å¢ä¸è¡ |
| | |
| | | fundid: null, |
| | | beneficiaryname: null, |
| | | beneficiaryno: null, |
| | | isunit: 0, |
| | | unitname: null, |
| | | unitno: null, |
| | | uintuserno: null, |
| | |
| | | }); |
| | | //å
¨é¨å é¤åæ·»å 䏿¡æ°è¡ |
| | | }, |
| | | //ä¸å®¶/å»çæºæ/è´¹ç¨æ¥éæºæéæ© |
| | | //绩æäººå/åä½éæ©ï¼æå¼æ¶é¢å¡«å½åè¡å·²é人åï¼é¿å
"ç´æ¥ç¡®å®"æå·²æå§åæ¸
空 |
| | | ShowDetailDialog(spoce, showType) { |
| | | this.spocewl = spoce; |
| | | this.selectionType = showType; |
| | | this.selectionType = this.experthear; |
| | | this.expertfrom = "1"; |
| | | this.funddetailForm.index = spoce.$index; |
| | | this.funddetailForm.beneficiaryno = spoce.row.beneficiaryno; |
| | | this.funddetailForm.beneficiaryname = spoce.row.beneficiaryname; |
| | | this.funddetailForm.unitno = spoce.row.unitno; |
| | | this.funddetailForm.unitname = spoce.row.unitname; |
| | | this.funddetailForm.expertname = ""; |
| | | this.funddetailForm.expertidcardno = ""; |
| | | this.funddetailForm.expertunitno = ""; |
| | | this.funddetailForm.expertunitname = ""; |
| | | this.funddetailForm.experttitle = ""; |
| | | this.funddetailForm.expertdepositbank = ""; |
| | | this.funddetailForm.expertbankcardno = ""; |
| | | //å½åè¡å·²é人åçåå¡«ï¼å
æäººåç¼å·å¹é
ï¼å¹é
ä¸å°åæå§åå¹é
|
| | | let cur = |
| | | this.cityOptions.find( |
| | | item => String(item.userno) === String(spoce.row.beneficiaryno) |
| | | ) || null; |
| | | if (!cur && spoce.row.beneficiaryname) { |
| | | cur = |
| | | this.cityOptions.find( |
| | | item => item.username === spoce.row.beneficiaryname |
| | | ) || null; |
| | | } |
| | | this.funddetailForm.userKey = cur |
| | | ? cur.id |
| | | : spoce.row.beneficiaryname || null; |
| | | this.funddetailForm.userName = spoce.row.beneficiaryname || null; |
| | | //æå¼æ¶å±ç¤ºå
¨éåéï¼ä¾¿äºç´æ¥æµè§çæ¥ |
| | | this.optionsperformance = this.cityOptions.slice(); |
| | | this.showSelectionDialog = true; |
| | | }, |
| | | |
| | | //ä¸å®¶/å»çæºæ/è´¹ç¨æ¥éæºæéæ© |
| | | /** |
| | | * ç¡®å®éæ©ï¼æå¯ä¸é®ï¼äººå IDï¼å¹é
åéï¼ |
| | | * èªå¨å¸¦åºèº«ä»½è¯å·ãé¶è¡è´¦å·ã弿·é¶è¡ãçµè¯ãèç§°ã人åç¼å·ãåä½ï¼ |
| | | * åä½ï¼äººåç±»åå« orgï¼ä¸å身份è¯å·ï¼æå·¥è¾å
¥çå§åä¸å带åºã |
| | | */ |
| | | ConfirmDetailDialog() { |
| | | let tempIndex = this.funddetailForm.index; |
| | | let tempExpertName = this.funddetailForm.userName; |
| | | let singleDetail = this.rbDetails[tempIndex]; |
| | | const tempIndex = this.funddetailForm.index; |
| | | const singleDetail = this.rbDetails[tempIndex]; |
| | | const key = this.funddetailForm.userKey; |
| | | |
| | | //ä»ä¸å®¶å表è·åä¿¡æ¯ |
| | | this.cityOptions.map(res => { |
| | | if (tempExpertName == res.userName) { |
| | | singleDetail.beneficiaryno = res.userno; |
| | | singleDetail.bankcardno = res.bankCardNo; |
| | | singleDetail.branchbankname = res.branchbankname; |
| | | singleDetail.depositbank = res.depositBank; |
| | | singleDetail.idcardno = res.idcardNo; |
| | | singleDetail.phone = res.telephone; |
| | | singleDetail.title = res.title; |
| | | singleDetail.unitname = res.unitname; |
| | | singleDetail.unitno = parseInt(res.unitno); |
| | | } |
| | | }); |
| | | singleDetail.beneficiaryname = tempExpertName; |
| | | this.rbDetails[tempIndex] = singleDetail; |
| | | this.showSelectionDialog = false; |
| | | }, |
| | | remoteMethod(query) { |
| | | console.log(this.listperformancea); |
| | | if (query !== "") { |
| | | this.loadingperformance = true; |
| | | setTimeout(() => { |
| | | this.loadingperformance = false; |
| | | this.optionsperformance = this.listperformancea.filter(item => { |
| | | return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1; |
| | | }); |
| | | }, 200); |
| | | } else { |
| | | this.optionsperformance = []; |
| | | if (key === null || key === undefined || key === "") { |
| | | this.$modal.msgWarning("请å
çæ¥å¹¶éæ©ç»©æäººåï¼æç´æ¥è¾å
¥äººåå§åï¼"); |
| | | return; |
| | | } |
| | | |
| | | const person = this.getPickedPerson(key); |
| | | if (person) { |
| | | // å½ä¸äººååºï¼èªå¨å¸¦åºå
¨é¨ä¿¡æ¯ |
| | | const isunit = this.isUnitPerson(person); |
| | | singleDetail.beneficiaryname = person.username; |
| | | singleDetail.beneficiaryno = person.userno; |
| | | singleDetail.isunit = isunit ? 1 : 0; |
| | | singleDetail.idcardno = isunit ? "" : person.idcardno; |
| | | singleDetail.bankcardno = person.bankcardno; |
| | | singleDetail.branchbankname = person.branchbankname; |
| | | singleDetail.depositbank = person.depositbank; |
| | | singleDetail.phone = person.telephone; |
| | | singleDetail.title = person.title; |
| | | singleDetail.unitname = person.unitname; |
| | | singleDetail.unitno = person.unitno; |
| | | } else { |
| | | // æå·¥è¾å
¥ç人åï¼åªåå§åï¼èº«ä»½è¯å·/é¶è¡è´¦å·ç±ç»å人填å |
| | | singleDetail.beneficiaryname = String(key); |
| | | singleDetail.isunit = 0; |
| | | this.$modal.msgWarning( |
| | | "人ååºä¸æªæ¾å°ã" + |
| | | key + |
| | | "ãï¼å·²ææå·¥å½å
¥å¤çï¼è¯·èªè¡å¡«å身份è¯å·ãé¶è¡è´¦å·çä¿¡æ¯ã" |
| | | ); |
| | | } |
| | | |
| | | this.$set(this.rbDetails, tempIndex, singleDetail); |
| | | this.showSelectionDialog = false; |
| | | }, |
| | | handleUploadError() {}, |
| | | remove(file, fileList) { |
| | |
| | | this.Networkheader = string.slice(0, index + 4); // æªå8032åå
¶åé¨å符 |
| | | } |
| | | }, |
| | | /** |
| | | * 2026-10-15ï¼ä¸ä¼ æ¶æ ¡éªéä»¶æä»¶åï¼ä¸å¡è¦æ±ï¼ä¸åæ ¼ç«å³æç¤ºä¸ä¸å å
¥å表ï¼ã |
| | | * è§åä¸å端 AttachmentNameValidator åå£å¾ï¼å¿
é¡»å«ä¸æ / 廿æ©å±åå主干 â¤20 å / |
| | | * ä¸å«ç©ºæ ¼å / \ : * ? " < > | # % çç¹æ®å符ã |
| | | */ |
| | | checkUploadFileName(file) { |
| | | const raw = file && file.raw ? file.raw.name : file && file.name; |
| | | const r = checkFileName(raw); |
| | | if (!r.ok) { |
| | | this.$modal.msgError(r.msg); |
| | | return false; |
| | | } |
| | | return true; |
| | | }, |
| | | |
| | | /** |
| | | * 2026-10-15ï¼ä¿ååæ ¡éªæ´åæç»éä»¶æä»¶åï¼å«åä¸è¡å
éåï¼ã |
| | | * å£å¾ï¼ä¸å¡ç¡®è®¤ï¼ï¼åªæ ¡éª"æ¬æ¬¡åæ´"çéä»¶ââèåæ®éå·²åå¨çä¸åè§éä»¶åä¸è½æä¿å塿» |
| | | * ï¼å¦åèåæ®æ¹ä¸ä¸ªéé¢é½åä¸è¿å»ï¼ãå端æ id 读æ§è®°å½æ¾è¡åå²éä»¶ï¼å端æ¿ä¸å°"åªäºæ¯åå²" |
| | | * çæå¨ä¿¡æ¯ï¼å æ¤**ä»
æ°å¢åæ®**åä¿å忦æªï¼ç¼è¾èåæ®æ¶æ°å¢çä¸åè§éä»¶ç±åç«¯äºæ¬¡æ ¡éªæ¦ä¸ã |
| | | */ |
| | | checkDetailFileNames() { |
| | | if (this.form && this.form.id) { |
| | | return true; |
| | | } |
| | | const c = checkDetails(this.rbDetails); |
| | | if (!c.ok) { |
| | | this.$modal.msgError(c.msg); |
| | | return false; |
| | | } |
| | | return true; |
| | | }, |
| | | |
| | | uploadSccess(response, file, fileList) { |
| | | if (!this.checkUploadFileName(file)) { |
| | | return; |
| | | } |
| | | this.rbDetails; |
| | | const config = { |
| | | headers: { Authorization: "Bearer " + this.ICDtoken } |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px"> |
| | | <el-row> |
| | | <el-col :span="5"> |
| | | <el-form-item label="æç®æ¡ä¾" prop="donorname" style="float: left"> |
| | |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="applyTime"> |
| | | <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd" |
| | | <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd HH:mm:ss" |
| | | v-model="applyTime" type="daterange" range-separator="è³" start-placeholder="ç³è¯·å¼å§æ¥æ" |
| | | end-placeholder="ç³è¯·ç»ææ¥æ" @keyup.enter.native="flowconclusion"> |
| | | </el-date-picker> |
| | |
| | | <el-col :span="7"> |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="applyTime"> |
| | | <!-- <el-input v-model="form.donorno" placeholder="请è¾å
¥ç³è¯·æ¥æ" /> --> |
| | | <el-date-picker clearable style="width: 100%" v-model="form.applyTime" type="date" |
| | | <el-date-picker clearable style="width: 100%" v-model="form.applyTime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="ç³è¯·æ¥æ"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | |
| | | </el-row> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="dundcheck" v-if="dialogType == 'edit'">å®¡æ ¸</el-button> |
| | | <el-button type="primary" :loading="checkSubmitLoading" :disabled="checkSubmitLoading" @click="dundcheck" v-if="dialogType == 'edit'">å®¡æ ¸</el-button> |
| | | <el-button @click="cancel">åæ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | |
| | | |
| | | // 导å
¥æ¬å°åå¨çæ¹æ³ |
| | | import { setItem, grtItem, removeItem } from "@/utils/storage.js"; |
| | | import { moneySum, moneyAdd, moneySub, moneyMul, moneyRound } from "@/utils/money"; |
| | | |
| | | export default { |
| | | components: { |
| | |
| | | ], |
| | | data() { |
| | | return { |
| | | checkSubmitLoading: false, |
| | | arrr2: [], |
| | | arrr3: [], |
| | | //è´¹ç¨ç±»åæ°ç» |
| | |
| | | }); |
| | | }, |
| | | dundcheck() { |
| | | if (this.checkSubmitLoading) return; |
| | | // this.$em |
| | | |
| | | //console.log("1234567", this.form.flowlevelone, this.form.flowconclusion); |
| | |
| | | this.$modal.msgError("è¯·éæ©å®¡æ ¸ç»è®º!"); |
| | | return; |
| | | } |
| | | this.checkSubmitLoading = true; |
| | | checkfund(checkfundobj).then(res => { |
| | | this.checkSubmitLoading = false; |
| | | if (res.code == 200) { |
| | | console.log("å®¡æ ¸è´¹ç¨", res); |
| | | this.dialogOpen = false; |
| | |
| | | this.getlistbypower(); |
| | | } else { |
| | | this.dialogOpen = false; |
| | | if (res.msg) { |
| | | this.$modal.msgError("æä½å¤±è¯¯"); |
| | | } else { |
| | | this.$modal.msgError(res.msg); |
| | | } |
| | | this.$modal.msgError(res.msg || "æä½å¤±è´¥"); |
| | | } |
| | | }); |
| | | }, |
| | |
| | | }); |
| | | }, |
| | | |
| | | //è®¡ç®æ»éé¢ |
| | | //è®¡ç®æ»éé¢ï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ç¦æ¢ parseFloat ç´¯å ï¼ |
| | | sumTotalFee() { |
| | | let allSum = 0; |
| | | const detailsArr = []; |
| | | let preTaxSum = 0; |
| | | let taxedSum = 0; |
| | | if (this.form.applytype != null) { |
| | | for (let i = 0; i < this.fundDetailArr.length; i++) { |
| | | const detail = this.fundDetailArr[i]; |
| | | let totalFee = 0; |
| | | let taxFee = 0; |
| | | if (this.form.applytype == 1 || this.form.applytype == 2) { |
| | | //计ç®å½åæ¥éå
容费ç¨å计 |
| | | if (!isNaN(parseFloat(this.fundDetailArr[i].amount))) { |
| | | totalFee += parseFloat(this.fundDetailArr[i].amount); |
| | | taxFee += parseFloat(this.fundDetailArr[i].amount); |
| | | preTaxSum += parseFloat(this.fundDetailArr[i].amount); |
| | | //计ç®å½åæ¥éå
容费ç¨å计ï¼ç¨å - æ£ç¨ |
| | | if (!isNaN(parseFloat(detail.amount))) { |
| | | totalFee = moneyAdd(totalFee, detail.amount); |
| | | preTaxSum = moneyAdd(preTaxSum, detail.amount); |
| | | } |
| | | if (!isNaN(parseFloat(this.fundDetailArr[i].taxamount))) { |
| | | totalFee -= parseFloat(this.fundDetailArr[i].taxamount); |
| | | taxFee -= parseFloat(this.fundDetailArr[i].taxamount); |
| | | if (!isNaN(parseFloat(detail.taxamount))) { |
| | | totalFee = moneySub(totalFee, detail.taxamount); |
| | | } |
| | | //taxedamount |
| | | if (!isNaN(parseFloat(this.fundDetailArr[i].taxedamount))) { |
| | | taxedSum += parseFloat(this.fundDetailArr[i].taxedamount); |
| | | if (!isNaN(parseFloat(detail.taxedamount))) { |
| | | taxedSum = moneyAdd(taxedSum, detail.taxedamount); |
| | | } |
| | | } else if (this.form.applytype == 3) { |
| | | if ( |
| | | !isNaN(parseFloat(this.fundDetailArr[i].price)) && |
| | | !isNaN(parseFloat(this.fundDetailArr[i].quantity)) |
| | | !isNaN(parseFloat(detail.price)) && |
| | | !isNaN(parseFloat(detail.quantity)) |
| | | ) { |
| | | totalFee += |
| | | parseFloat(this.fundDetailArr[i].price) * |
| | | parseFloat(this.fundDetailArr[i].quantity); |
| | | totalFee = moneyMul(detail.price, detail.quantity); |
| | | } |
| | | } |
| | | // if (!isNaN(parseFloat(taxFee))) { |
| | | // this.fundDetailArr[i].taxedamount = taxFee.toFixed(2); |
| | | // } |
| | | allSum += totalFee; |
| | | detailsArr.push(totalFee); |
| | | } |
| | | } |
| | | this.form.amountrequested = allSum.toFixed(2); |
| | | this.form.pretaxcost = preTaxSum.toFixed(2); |
| | | this.form.taxedcost = taxedSum.toFixed(2); |
| | | this.form.amountrequested = moneyRound(moneySum(detailsArr)).toFixed(2); |
| | | this.form.pretaxcost = moneyRound(preTaxSum).toFixed(2); |
| | | this.form.taxedcost = moneyRound(taxedSum).toFixed(2); |
| | | this.$forceUpdate(); |
| | | console.log(this.form); |
| | | }, |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px"> |
| | | <el-row> |
| | | <el-col :span="5"> |
| | | <el-form-item label="æç®æ¡ä¾" prop="donorname" style="float: left"> |
| | |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="createTime"> |
| | | <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd" |
| | | <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd HH:mm:ss" |
| | | v-model="createTime" type="daterange" range-separator="è³" start-placeholder="ç³è¯·å¼å§æ¥æ" |
| | | end-placeholder="ç³è¯·ç»ææ¥æ" @keyup.enter.native="flowconclusion"> |
| | | </el-date-picker> |
| | |
| | | <el-col :span="5"> |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="createTime"> |
| | | <!-- <el-input v-model="form.donorno" placeholder="请è¾å
¥ç³è¯·æ¥æ" /> --> |
| | | <el-date-picker clearable style="width: 100%" v-model="form.createTime" type="date" |
| | | <el-date-picker clearable style="width: 100%" v-model="form.createTime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="ç³è¯·æ¥æ"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | |
| | | </el-row> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="dundcheck" v-if="dialogType == 'edit'">ä¿å</el-button> |
| | | <el-button type="primary" :loading="checkSubmitLoading" :disabled="checkSubmitLoading" @click="dundcheck" v-if="dialogType == 'edit'">ä¿å</el-button> |
| | | <el-button @click="cancel">åæ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | |
| | | checkfund, |
| | | listbypower, |
| | | addFundSharedInfo, |
| | | TotalcalculationFn |
| | | TotalcalculationFn, |
| | | validateExpertFee |
| | | } from "@/api/project/fund"; |
| | | import { |
| | | onelistFunds, |
| | |
| | | ], |
| | | data() { |
| | | return { |
| | | checkSubmitLoading: false, |
| | | arrr2: [], |
| | | arrr3: [], |
| | | personlist: [], |
| | |
| | | }); |
| | | }, |
| | | dundcheck() { |
| | | if (this.checkSubmitLoading) return; |
| | | // this.$em |
| | | |
| | | let checkfundobj = { |
| | |
| | | this.$modal.msgError("è¯·éæ©å®¡æ ¸ç»è®º!"); |
| | | return; |
| | | } |
| | | |
| | | // å®¡æ ¸âéè¿âåï¼å
åä¸å®¶å³å¡è´¹ 9 æ¡è´¹ç¨æ§å¶æ ¡éªï¼ä¸åç«¯æ¦æªåå£å¾ï¼ |
| | | if (checkfundobj.flowconclusion == 1) { |
| | | validateExpertFee({ id: this.form.id }).then(valid => { |
| | | const errors = (valid && valid.errors) || []; |
| | | const warnings = (valid && valid.warnings) || []; |
| | | if (warnings.length > 0) { |
| | | this.$modal.msgWarning(warnings.join("ï¼")); |
| | | } |
| | | if (errors.length > 0) { |
| | | this.$modal.msgError("ä¸è½å®¡æ ¸éè¿ï¼" + errors.join("ï¼")); |
| | | return; |
| | | } |
| | | this.doCheckfund(checkfundobj); |
| | | }); |
| | | return; |
| | | } |
| | | // ä¸éè¿ï¼æ éæ ¡éªéé¢ |
| | | this.doCheckfund(checkfundobj); |
| | | }, |
| | | doCheckfund(checkfundobj) { |
| | | this.checkSubmitLoading = true; |
| | | checkfund(checkfundobj).then(res => { |
| | | this.checkSubmitLoading = false; |
| | | if (res.code == 200) { |
| | | this.reset(); |
| | | this.$modal.msgSuccess("å®¡æ ¸å®æ!"); |
| | | this.getlistbypower(); |
| | | this.dialogOpen = false; |
| | | } else { |
| | | if (res.msg) { |
| | | this.$modal.msgError("æä½å¤±è¯¯"); |
| | | } else { |
| | | this.$modal.msgError(res.msg); |
| | | } |
| | | // å端è¿åçå
·ä½åå ï¼å¦è¶
éé¢ï¼ä¼å
å±ç¤º |
| | | this.$modal.msgError(res.msg || "æä½å¤±è¯¯"); |
| | | } |
| | | }); |
| | | }, |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px"> |
| | | <el-row align="left"> |
| | | <el-col :span="5"> |
| | | <el-form-item label="æç®æ¡ä¾" prop="donorname" style="float: left"> |
| | |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="createTime"> |
| | | <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd" |
| | | <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd HH:mm:ss" |
| | | v-model="createTime" type="daterange" range-separator="è³" start-placeholder="ç³è¯·å¼å§æ¥æ" |
| | | end-placeholder="ç³è¯·ç»ææ¥æ" @keyup.enter.native="flowconclusion"> |
| | | </el-date-picker> |
| | |
| | | <el-col :span="5"> |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="createTime"> |
| | | <!-- <el-input v-model="form.donorno" placeholder="请è¾å
¥ç³è¯·æ¥æ" /> --> |
| | | <el-date-picker clearable style="width: 100%" v-model="form.createTime" type="date" |
| | | <el-date-picker clearable style="width: 100%" v-model="form.createTime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="ç³è¯·æ¥æ"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | |
| | | </el-row> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="dundcheck" v-if="dialogType == 'edit'">确认</el-button> |
| | | <el-button type="primary" :loading="checkSubmitLoading" :disabled="checkSubmitLoading" @click="dundcheck" v-if="dialogType == 'edit'">确认</el-button> |
| | | <el-button @click="cancel">åæ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | |
| | | import { listDept } from "@/api/system/dept"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { setItem, grtItem, removeItem } from "@/utils/storage.js"; |
| | | import { moneySum, moneyAdd, moneySub, moneyMul, moneyRound } from "@/utils/money"; |
| | | |
| | | export default { |
| | | components: { |
| | |
| | | ], |
| | | data() { |
| | | return { |
| | | checkSubmitLoading: false, |
| | | arrr2: [], |
| | | arrr3: [], |
| | | //è´¹ç¨ç±»åæ°ç» |
| | |
| | | }); |
| | | }, |
| | | dundcheck() { |
| | | if (this.checkSubmitLoading) return; |
| | | // this.$em |
| | | this.dialogOpen = false; |
| | | let checkfundobj = { |
| | |
| | | flowcontent: this.newobj.flowconclusion, |
| | | fundid: this.newobj.fundid |
| | | }; |
| | | this.checkSubmitLoading = true; |
| | | checkfund(checkfundobj).then(res => { |
| | | this.checkSubmitLoading = false; |
| | | if (res.code == 200) { |
| | | this.reset(); |
| | | this.$modal.msgSuccess("å®¡æ ¸å®æ!"); |
| | | this.getlistbypower(); |
| | | } else { |
| | | if (res.msg) { |
| | | this.$modal.msgError("æä½å¤±è¯¯"); |
| | | } else { |
| | | this.$modal.msgError(res.msg); |
| | | } |
| | | this.$modal.msgError(res.msg || "æä½å¤±è´¥"); |
| | | } |
| | | }); |
| | | }, |
| | |
| | | // }); |
| | | }, |
| | | |
| | | //è®¡ç®æ»éé¢ |
| | | //è®¡ç®æ»éé¢ï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ç¦æ¢ parseFloat ç´¯å ï¼ |
| | | sumTotalFee() { |
| | | let allSum = 0; |
| | | const detailsArr = []; |
| | | if (this.form.applytype != null) { |
| | | for (let i = 0; i < this.fundDetailArr.length; i++) { |
| | | const detail = this.fundDetailArr[i]; |
| | | let totalFee = 0; |
| | | let taxFee = 0; |
| | | if (this.form.applytype == 1 || this.form.applytype == 2) { |
| | | //计ç®å½åæ¥éå
容费ç¨å计 |
| | | if (!isNaN(parseFloat(this.fundDetailArr[i].amount))) { |
| | | totalFee += parseFloat(this.fundDetailArr[i].amount); |
| | | taxFee += parseFloat(this.fundDetailArr[i].amount); |
| | | //计ç®å½åæ¥éå
容费ç¨å计ï¼ç¨å - æ£ç¨ |
| | | if (!isNaN(parseFloat(detail.amount))) { |
| | | totalFee = moneyAdd(totalFee, detail.amount); |
| | | taxFee = moneyAdd(taxFee, detail.amount); |
| | | } |
| | | if (!isNaN(parseFloat(this.fundDetailArr[i].taxamount))) { |
| | | totalFee -= parseFloat(this.fundDetailArr[i].taxamount); |
| | | taxFee -= parseFloat(this.fundDetailArr[i].taxamount); |
| | | if (!isNaN(parseFloat(detail.taxamount))) { |
| | | totalFee = moneySub(totalFee, detail.taxamount); |
| | | taxFee = moneySub(taxFee, detail.taxamount); |
| | | } |
| | | } else if (this.form.applytype == 3) { |
| | | if ( |
| | | !isNaN(parseFloat(this.fundDetailArr[i].price)) && |
| | | !isNaN(parseFloat(this.fundDetailArr[i].quantity)) |
| | | !isNaN(parseFloat(detail.price)) && |
| | | !isNaN(parseFloat(detail.quantity)) |
| | | ) { |
| | | totalFee += |
| | | parseFloat(this.fundDetailArr[i].price) * |
| | | parseFloat(this.fundDetailArr[i].quantity); |
| | | totalFee = moneyMul(detail.price, detail.quantity); |
| | | } |
| | | } |
| | | if (!isNaN(parseFloat(taxFee))) { |
| | | this.fundDetailArr[i].taxedamount = taxFee.toFixed(2); |
| | | this.fundDetailArr[i].taxedamount = moneyRound(taxFee).toFixed(2); |
| | | } |
| | | allSum += totalFee; |
| | | detailsArr.push(totalFee); |
| | | } |
| | | } |
| | | //this.form.amountrequested = allSum.toFixed(2); |
| | | this.$set(this.form, "amountrequested", allSum.toFixed(2)); |
| | | this.$set(this.form, "amountrequested", moneyRound(moneySum(detailsArr)).toFixed(2)); |
| | | //this.$forceUpdate(); |
| | | }, |
| | | |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px"> |
| | | <el-row align="left"> |
| | | <el-col :span="5"> |
| | | <el-form-item label="æç®æ¡ä¾" prop="donorname" style="float: left"> |
| | |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="createTime"> |
| | | <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd" |
| | | <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd HH:mm:ss" |
| | | v-model="createTime" type="daterange" range-separator="è³" start-placeholder="ç³è¯·å¼å§æ¥æ" |
| | | end-placeholder="ç³è¯·ç»ææ¥æ" @keyup.enter.native="flowconclusion"> |
| | | </el-date-picker> |
| | |
| | | <el-col :span="5"> |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="createTime"> |
| | | <!-- <el-input v-model="form.donorno" placeholder="请è¾å
¥ç³è¯·æ¥æ" /> --> |
| | | <el-date-picker clearable style="width: 100%" v-model="form.createTime" type="date" |
| | | <el-date-picker clearable style="width: 100%" v-model="form.createTime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="ç³è¯·æ¥æ"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | |
| | | </el-row> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="dundcheck" v-if="dialogType == 'edit'">确认</el-button> |
| | | <el-button type="primary" :loading="checkSubmitLoading" :disabled="checkSubmitLoading" @click="dundcheck" v-if="dialogType == 'edit'">确认</el-button> |
| | | <el-button @click="cancel">åæ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | |
| | | import { listDept } from "@/api/system/dept"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { setItem, grtItem, removeItem } from "@/utils/storage.js"; |
| | | import { moneySum, moneyAdd, moneySub, moneyMul, moneyRound } from "@/utils/money"; |
| | | |
| | | export default { |
| | | components: { |
| | |
| | | ], |
| | | data() { |
| | | return { |
| | | checkSubmitLoading: false, |
| | | arrr2: [], |
| | | arrr3: [], |
| | | //è´¹ç¨ç±»åæ°ç» |
| | |
| | | }); |
| | | }, |
| | | dundcheck() { |
| | | if (this.checkSubmitLoading) return; |
| | | // this.$em |
| | | this.dialogOpen = false; |
| | | let checkfundobj = { |
| | |
| | | flowcontent: this.newobj.flowconclusion, |
| | | fundid: this.newobj.fundid |
| | | }; |
| | | this.checkSubmitLoading = true; |
| | | checkfund(checkfundobj).then(res => { |
| | | this.checkSubmitLoading = false; |
| | | if (res.code == 200) { |
| | | this.reset(); |
| | | this.$modal.msgSuccess("å®¡æ ¸å®æ!"); |
| | | this.getlistbypower(); |
| | | } else { |
| | | if (res.msg) { |
| | | this.$modal.msgError("æä½å¤±è¯¯"); |
| | | } else { |
| | | this.$modal.msgError(res.msg); |
| | | } |
| | | this.$modal.msgError(res.msg || "æä½å¤±è´¥"); |
| | | } |
| | | }); |
| | | }, |
| | |
| | | // }); |
| | | }, |
| | | |
| | | //è®¡ç®æ»éé¢ |
| | | //è®¡ç®æ»éé¢ï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ç¦æ¢ parseFloat ç´¯å ï¼ |
| | | sumTotalFee() { |
| | | let allSum = 0; |
| | | const detailsArr = []; |
| | | if (this.form.applytype != null) { |
| | | for (let i = 0; i < this.fundDetailArr.length; i++) { |
| | | const detail = this.fundDetailArr[i]; |
| | | let totalFee = 0; |
| | | let taxFee = 0; |
| | | if (this.form.applytype == 1 || this.form.applytype == 2) { |
| | | //计ç®å½åæ¥éå
容费ç¨å计 |
| | | if (!isNaN(parseFloat(this.fundDetailArr[i].amount))) { |
| | | totalFee += parseFloat(this.fundDetailArr[i].amount); |
| | | taxFee += parseFloat(this.fundDetailArr[i].amount); |
| | | //计ç®å½åæ¥éå
容费ç¨å计ï¼ç¨å - æ£ç¨ |
| | | if (!isNaN(parseFloat(detail.amount))) { |
| | | totalFee = moneyAdd(totalFee, detail.amount); |
| | | taxFee = moneyAdd(taxFee, detail.amount); |
| | | } |
| | | if (!isNaN(parseFloat(this.fundDetailArr[i].taxamount))) { |
| | | totalFee -= parseFloat(this.fundDetailArr[i].taxamount); |
| | | taxFee -= parseFloat(this.fundDetailArr[i].taxamount); |
| | | if (!isNaN(parseFloat(detail.taxamount))) { |
| | | totalFee = moneySub(totalFee, detail.taxamount); |
| | | taxFee = moneySub(taxFee, detail.taxamount); |
| | | } |
| | | } else if (this.form.applytype == 3) { |
| | | if ( |
| | | !isNaN(parseFloat(this.fundDetailArr[i].price)) && |
| | | !isNaN(parseFloat(this.fundDetailArr[i].quantity)) |
| | | !isNaN(parseFloat(detail.price)) && |
| | | !isNaN(parseFloat(detail.quantity)) |
| | | ) { |
| | | totalFee += |
| | | parseFloat(this.fundDetailArr[i].price) * |
| | | parseFloat(this.fundDetailArr[i].quantity); |
| | | totalFee = moneyMul(detail.price, detail.quantity); |
| | | } |
| | | } |
| | | if (!isNaN(parseFloat(taxFee))) { |
| | | this.fundDetailArr[i].taxedamount = taxFee.toFixed(2); |
| | | this.fundDetailArr[i].taxedamount = moneyRound(taxFee).toFixed(2); |
| | | } |
| | | allSum += totalFee; |
| | | detailsArr.push(totalFee); |
| | | } |
| | | } |
| | | //this.form.amountrequested = allSum.toFixed(2); |
| | | this.$set(this.form, "amountrequested", allSum.toFixed(2)); |
| | | this.$set(this.form, "amountrequested", moneyRound(moneySum(detailsArr)).toFixed(2)); |
| | | //this.$forceUpdate(); |
| | | }, |
| | | |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px"> |
| | | <el-row align="left"> |
| | | <el-col :span="5"> |
| | | <el-form-item label="é¢å®¡ç¶æ" prop="checkstatus" style="float: left"> |
| | |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="createTime"> |
| | | <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd" v-model="createTime" |
| | | <el-date-picker format="yyyy-MM-dd" @change="selectapplication" value-format="yyyy-MM-dd HH:mm:ss" v-model="createTime" |
| | | type="daterange" range-separator="è³" start-placeholder="ç³è¯·å¼å§æ¥æ" end-placeholder="ç³è¯·ç»ææ¥æ" |
| | | @keyup.enter.native="flowconclusion"> |
| | | </el-date-picker> |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="ä¸å®¶å§å" prop="beneficiaryname"> |
| | | <el-input v-model="queryParams.beneficiaryname" placeholder="请è¾å
¥ä¸å®¶å§å" clearable size="small" |
| | | @keyup.enter.native="handleQuery" /> |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <!-- <el-form-item label="è´¹ç¨ç¼å·ï¼å·®æ
è´¹å
³è表service_reimbursement ID; è´¹ç¨å
³èè´¹ç¨è¡¨service_fundçID" prop="fundid"> |
| | | <el-input |
| | | v-model="queryParams.fundid" |
| | |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="createTime"> |
| | | <el-date-picker |
| | | format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd hh:mm:ss" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | v-model="queryParams.createTime" |
| | | type="date" |
| | | placeholder="è¯·éæ©ç³è¯·æ¥æ" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | <div class="app-container"> |
| | | <el-col :span="24" v-if="showType == 'list'"> |
| | | <el-card shadow="never"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true"> |
| | | <el-form-item label="å§å" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="æå¡é¡¹ç®ID" prop="itemid"> |
| | | <el-input |
| | | v-model="queryParams.itemid" |
| | |
| | | <el-table-column label="è´¹ç¨éé¢" align="center" prop="expense" /> |
| | | <el-table-column label="è´¹ç¨è¯´æ" align="center" prop="expensedescribe" /> |
| | | <el-table-column label="å¯ç¨ç¶æ" align="center" prop="usestate" /> |
| | | <el-table-column label="æ ¡éªæ¨¡å¼" align="center" prop="validateMode" width="110"> |
| | | <template slot-scope="scope"> |
| | | <el-tag v-if="scope.row.validateMode == 3" type="danger">䏿 ¡éª</el-tag> |
| | | <el-tag v-else-if="scope.row.validateMode == 2" type="warning">æ ¡éªæé</el-tag> |
| | | <el-tag v-else>å¼ºå¶æ ¡éª</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="夿³¨" align="center" prop="remark" /> |
| | | <el-table-column label="æä½" align="center" class-name="small-padding fixed-width"> |
| | | <template slot-scope="scope"> |
| | |
| | | </el-form-item> |
| | | <el-form-item label="å¯ç¨ç¶æ" prop="usestate"> |
| | | <el-input v-model="form.usestate" placeholder="请è¾å
¥å¯ç¨ç¶æ" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ ¡éªæ¨¡å¼" prop="validateMode"> |
| | | <el-select v-model="form.validateMode" placeholder="è¯·éæ©ä¸å®¶è´¹æ ¡éªæ¨¡å¼" style="width: 100%"> |
| | | <el-option label="å¼ºå¶æ ¡éªï¼ä¸éè¿ä¸è½ä¿åï¼" :value="1" /> |
| | | <el-option label="æ ¡éªæéï¼ä»
æéï¼å
许ä¿åï¼" :value="2" /> |
| | | <el-option label="䏿 ¡éªï¼è·³è¿éé¢ç±»æ ¡éªï¼" :value="3" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" prop="remark"> |
| | | <el-input v-model="form.remark" placeholder="请è¾å
¥å¤æ³¨" /> |
| | |
| | | expense: null, |
| | | expensedescribe: null, |
| | | usestate: null, |
| | | validateMode: 1, |
| | | remark: null, |
| | | delFlag: null, |
| | | createBy: null, |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="form.hospitalassesstime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©é¢çº§è¯ä¼°æ¶é´" |
| | | > |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="form.provincialassesstime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©ç级è¯ä¼°æ¶é´" |
| | | > |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="form.coreteamassesstime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="è¯ä¼°æ¶é´" |
| | | > |
| | |
| | | <div class="app-container"> |
| | | <!-- æç´¢æ¡ä»¶ --> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | size="small" |
| | | style="width: 100%" |
| | | v-model="form.applicanttime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©æ¥æ¶æ¶é´" |
| | | > |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="70px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="70px"> |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-form-item label="æç®è
" prop="name"> |
| | |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è·åæ¶é´" prop="organgettime"> |
| | | <el-date-picker clearable size="medium" v-model="form.organgettime" type="date" disabled |
| | | <el-date-picker clearable size="medium" v-model="form.organgettime" type="date" format="yyyy-MM-dd" disabled |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="éæ©å¨å®è·åæ¶é´"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç§»æ¤æ¶é´" prop="transplanttime"> |
| | | <el-date-picker clearable size="medium" v-model="form.transplanttime" type="date" |
| | | <el-date-picker clearable size="medium" v-model="form.transplanttime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="éæ©ç§»æ¤æ¶é´" disabled> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="form.registertime" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©æ³¨åæ¶é´" |
| | | > |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <!-- æ¥è¯¢æ¡ä»¶ï¼æé®ç´§è·æ¡ä»¶ä¹åï¼ä¸æ¡ä¾è¯ä¼°é¡µé£æ ¼ä¸è´ï¼ --> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | | v-show="showSearch" |
| | | label-width="82px" |
| | | > |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-form-item label="æç®è
" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | | placeholder="请è¾å
¥æç®è
å§å" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="è¯ä»¶å·ç " prop="idcardno"> |
| | | <el-input |
| | | v-model="queryParams.idcardno" |
| | | placeholder="请è¾å
¥è¯ä»¶å·ç " |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="å¨å®ç±»å«" prop="organno"> |
| | | <el-select |
| | | v-model="queryParams.organno" |
| | | placeholder="è¯·éæ©å¨å®ç±»å«" |
| | | clearable |
| | | size="small" |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_Organ" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="è·åç¶æ" prop="organstate"> |
| | | <el-select |
| | | v-model="queryParams.organstate" |
| | | placeholder="è¯·éæ©è·åç¶æ" |
| | | clearable |
| | | size="small" |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_organstate" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-form-item label="å¨å®ç¼å·" prop="organnumber"> |
| | | <el-input |
| | | v-model="queryParams.organnumber" |
| | | placeholder="请è¾å
¥å¨å®ç¼å·" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="ç§»æ¤æºæ" prop="transplanthospitalname"> |
| | | <el-input |
| | | v-model="queryParams.transplanthospitalname" |
| | | placeholder="请è¾å
¥ç§»æ¤æºæåç§°" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="ç§»æ¤äºº" prop="acceptname"> |
| | | <el-input |
| | | v-model="queryParams.acceptname" |
| | | placeholder="请è¾å
¥ç§»æ¤äººå§å" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label-width="10px"> |
| | | <el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="el-icon-refresh" size="small" @click="resetQuery">éç½®</el-button> |
| | | <el-button |
| | | type="warning" |
| | | plain |
| | | icon="el-icon-download" |
| | | size="small" |
| | | :loading="exportLoading" |
| | | @click="handleExport" |
| | | v-hasPermi="['project:register:export']" |
| | | >导åº</el-button> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row class="mb8"> |
| | | <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | </el-form> |
| | | |
| | | <el-table v-loading="loading" :data="registerList" :border="true"> |
| | | <el-table-column label="æç®è
ç¼å·" align="center" prop="donorno" width="200" show-overflow-tooltip /> |
| | | <el-table-column label="å§å" align="center" prop="name" width="90" show-overflow-tooltip /> |
| | | <el-table-column label="æ§å«" align="center" prop="sex" width="70"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag :options="dict.type.sys_user_sex" :value="scope.row.sex" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å¹´é¾" align="center" width="80"> |
| | | <template slot-scope="scope"> |
| | | <span v-if="scope.row.age">{{ scope.row.age }}{{ scope.row.ageunit }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å¨å®ç±»å«" align="center" prop="organname" width="90" show-overflow-tooltip /> |
| | | <el-table-column label="å¨å®ç¼å·" align="center" prop="organnumber" width="130" show-overflow-tooltip /> |
| | | <el-table-column label="è·åç¶æ" align="center" prop="organstate" width="100"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag :options="dict.type.sys_organstate" :value="scope.row.organstate" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="è·åæ¶é´" align="center" prop="organgettime" width="150"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.organgettime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="è·åæºæ" align="center" prop="gainhospitalname" min-width="180" show-overflow-tooltip /> |
| | | <el-table-column label="ç§»æ¤æºæ" align="center" prop="transplanthospitalname" min-width="180" show-overflow-tooltip /> |
| | | <el-table-column label="ç§»æ¤å»ç" align="center" prop="transplantdoct" width="100" show-overflow-tooltip /> |
| | | <el-table-column label="ç§»æ¤æ¶é´" align="center" prop="transplanttime" width="150"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.transplanttime) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" align="center" width="90" class-name="small-padding fixed-width"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-view" |
| | | @click="handleDetail(scope.row)" |
| | | v-hasPermi="['project:register:query']" |
| | | >详æ
</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | |
| | | <!-- 详æ
ï¼åªè¯»å±ç¤ºå
¨é¨å段 --> |
| | | <el-dialog title="å¨å®å»å¤è¯¦æ
" :visible.sync="open" width="900px" append-to-body> |
| | | <div v-loading="detailLoading" class="register-detail"> |
| | | <el-divider content-position="left">æç®è
ä¿¡æ¯</el-divider> |
| | | <el-descriptions :column="3" size="small" border> |
| | | <el-descriptions-item label="å§å">{{ detail.name }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ§å«">{{ dictLabel("sys_user_sex", detail.sex) }}</el-descriptions-item> |
| | | <el-descriptions-item label="å¹´é¾"> |
| | | <span v-if="detail.age">{{ detail.age }}{{ detail.ageunit }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä»¶å·ç ">{{ detail.idcardno }}</el-descriptions-item> |
| | | <el-descriptions-item label="åºçæ¥æ">{{ parseTime(detail.birthday, "{y}-{m}-{d}") }}</el-descriptions-item> |
| | | <el-descriptions-item label="èç³»çµè¯">{{ detail.phone }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç°ä½å°å" :span="3">{{ detail.residenceaddress }}</el-descriptions-item> |
| | | <el-descriptions-item label="æç®è
ç¼å·">{{ detail.donorno }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | | <el-divider content-position="left">å¨å®ä¿¡æ¯</el-divider> |
| | | <el-descriptions :column="3" size="small" border> |
| | | <el-descriptions-item label="å¨å®ç±»å«">{{ detail.organname }}</el-descriptions-item> |
| | | <el-descriptions-item label="å¨å®ç¼å·">{{ detail.organnumber }}</el-descriptions-item> |
| | | <el-descriptions-item label="è·åç¶æ"> |
| | | {{ dictLabel("sys_organstate", detail.organstate) }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è·åæ¶é´">{{ parseTime(detail.organgettime) }}</el-descriptions-item> |
| | | <el-descriptions-item label="è·åå»ç" :span="2">{{ detail.organgetdoct }}</el-descriptions-item> |
| | | <el-descriptions-item label="è·åæºæ" :span="2">{{ detail.gainhospitalname }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç§»æ¤æºæ" :span="2">{{ detail.transplanthospitalname }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç§»æ¤å»ç">{{ detail.transplantdoct }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç§»æ¤æ¶é´" :span="2">{{ parseTime(detail.transplanttime) }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | | <el-divider content-position="left">ç³è¯·ä¸å®¡æ ¸</el-divider> |
| | | <el-descriptions :column="3" size="small" border> |
| | | <el-descriptions-item label="ç³è¯·äºº">{{ detail.applicantusername }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç³è¯·æ¶é´" :span="2">{{ parseTime(detail.applicanttime) }}</el-descriptions-item> |
| | | <el-descriptions-item label="å®¡æ ¸äºº">{{ detail.checkusername }}</el-descriptions-item> |
| | | <el-descriptions-item label="å®¡æ ¸æ¶é´" :span="2">{{ parseTime(detail.checktime) }}</el-descriptions-item> |
| | | <el-descriptions-item label="å®¡æ ¸æè§" :span="3">{{ detail.checksuggestion }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | |
| | | <el-divider content-position="left">ç§»æ¤äººä¿¡æ¯</el-divider> |
| | | <el-descriptions :column="3" size="small" border> |
| | | <el-descriptions-item label="å§å">{{ detail.acceptname }}</el-descriptions-item> |
| | | <el-descriptions-item label="æ§å«">{{ dictLabel("sys_user_sex", detail.acceptsex) }}</el-descriptions-item> |
| | | <el-descriptions-item label="å¹´é¾"> |
| | | <span v-if="detail.acceptage">{{ detail.acceptage }}{{ detail.acceptageunit }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="è¯ä»¶å·ç ">{{ detail.acceptidcard }}</el-descriptions-item> |
| | | <el-descriptions-item label="èç³»çµè¯" :span="2">{{ detail.acceptphone }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç°ä½å°å" :span="3">{{ detail.acceptresidenceaddress }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | </div> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button @click="open = false">å
³ é</el-button> |
| | | </div> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import { listRegister, getRegister, exportRegister } from "@/api/project/register"; |
| | | |
| | | export default { |
| | | name: "Register", |
| | | dicts: ["sys_Organ", "sys_organstate", "sys_user_sex", "sys_AgeUnit"], |
| | | data() { |
| | | return { |
| | | // é®ç½©å± |
| | | loading: true, |
| | | // 详æ
å è½½ |
| | | detailLoading: false, |
| | | // 导åºé®ç½©å± |
| | | exportLoading: false, |
| | | // æ¾ç¤ºæç´¢æ¡ä»¶ |
| | | showSearch: true, |
| | | // æ»æ¡æ° |
| | | total: 0, |
| | | // å¨å®å»å¤å表 |
| | | registerList: [], |
| | | // 详æ
å¼¹çª |
| | | open: false, |
| | | detail: {}, |
| | | // æ¥è¯¢åæ°ï¼åéä¸å端 queryList / Mapper æ¯æçæ¡ä»¶ä¸è´ï¼ |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | name: null, |
| | | idcardno: null, |
| | | organno: null, |
| | | organstate: null, |
| | | organnumber: null, |
| | | transplanthospitalname: null, |
| | | acceptname: null |
| | | } |
| | | }; |
| | | }, |
| | | created() { |
| | | this.getList(); |
| | | }, |
| | | methods: { |
| | | /** æ¥è¯¢å¨å®å»å¤å表 */ |
| | | getList() { |
| | | this.loading = true; |
| | | listRegister(this.queryParams).then(response => { |
| | | this.registerList = response.rows; |
| | | this.total = response.total; |
| | | this.loading = false; |
| | | }); |
| | | }, |
| | | /** æç´¢æé®æä½ */ |
| | | handleQuery() { |
| | | this.queryParams.pageNum = 1; |
| | | this.getList(); |
| | | }, |
| | | /** éç½®æé®æä½ */ |
| | | resetQuery() { |
| | | this.resetForm("queryForm"); |
| | | this.handleQuery(); |
| | | }, |
| | | /** 详æ
æé®æä½ */ |
| | | handleDetail(row) { |
| | | this.detail = {}; |
| | | this.open = true; |
| | | this.detailLoading = true; |
| | | getRegister(row.id).then(response => { |
| | | this.detail = response.data || {}; |
| | | this.detailLoading = false; |
| | | }).catch(() => { |
| | | this.detailLoading = false; |
| | | }); |
| | | }, |
| | | /** åå
¸ç¿»è¯ï¼æ¨¡æ¿éç¨ï¼é¿å
å¤ä¸ª dict-tag åµå¥ï¼ */ |
| | | dictLabel(type, value) { |
| | | const list = this.dict.type[type] || []; |
| | | const item = list.find(d => String(d.value) === String(value)); |
| | | return item ? item.label : value; |
| | | }, |
| | | /** å¯¼åºæé®æä½ */ |
| | | handleExport() { |
| | | this.$modal |
| | | .confirm("æ¯å¦ç¡®è®¤å¯¼åºå¨å®å»å¤æ°æ®ï¼") |
| | | .then(() => { |
| | | this.exportLoading = true; |
| | | return exportRegister(this.queryParams); |
| | | }) |
| | | .then(response => { |
| | | this.$download.name(response.msg); |
| | | this.exportLoading = false; |
| | | }) |
| | | .catch(() => { |
| | | this.exportLoading = false; |
| | | }); |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .register-detail >>> .el-divider--horizontal { |
| | | margin: 12px 0 14px; |
| | | } |
| | | .register-detail >>> .el-divider__text { |
| | | color: var(--opo-primary, #0e768f); |
| | | font-size: var(--opo-font-size-sm, 14px); |
| | | } |
| | | .register-detail >>> .el-descriptions-item__label { |
| | | color: var(--opo-text-secondary, #6b7280); |
| | | width: 90px; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="å建è
" prop="createBy"> |
| | | <el-input |
| | | v-model="queryParams.createBy" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="å建人" prop="createBy"> |
| | | <el-input |
| | | v-model="queryParams.createBy" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="èµéç³è¯·ä¸»è¡¨ID" prop="rbid"> |
| | | <el-input |
| | | v-model="queryParams.rbid" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | clearable |
| | | size="small" |
| | | v-model="form.signdate" |
| | | type="date" |
| | | value-format="yyyy-MM-dd hh:mm:ss" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©ç¾åæ¥æ" |
| | | > |
| | | </el-date-picker> |
| | |
| | | size="small" |
| | | style="width: 310px" |
| | | v-model="evaluationForm.hospitalassesstime" |
| | | type="date" |
| | | value-format="yyyy-MM-dd hh:mm:ss" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©é¢çº§è¯ä¼°æ¶é´" |
| | | > |
| | | </el-date-picker> |
| | |
| | | size="small" |
| | | style="width: 310px" |
| | | v-model="evaluationForm.provincialassesstime" |
| | | type="date" |
| | | value-format="yyyy-MM-dd hh:mm:ss" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="éæ©ç级è¯ä¼°æ¶é´" |
| | | > |
| | | </el-date-picker> |
| | |
| | | size="small" |
| | | style="width: 310px" |
| | | v-model="evaluationForm.coreteamassesstime" |
| | | type="date" |
| | | value-format="yyyy-MM-dd hh:mm:ss" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="è¯ä¼°æ¶é´" |
| | | > |
| | | </el-date-picker> |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | this.queryParams.pabegtime = this.selecttime[0]; |
| | | this.queryParams.paendtime = this.selecttime[1]; |
| | | // if (this.queryParams.paendtime == this.queryParams.pabegtime) { |
| | | let num = Number(this.queryParams.paendtime.slice(5, 7)); |
| | | if (num < 9) { |
| | | let mon = Number(this.queryParams.paendtime.slice(6, 7)); |
| | | this.queryParams.paendtime = |
| | | this.queryParams.paendtime.slice(0, 5) + |
| | | "0" + |
| | | (mon + 1) + |
| | | "-" + |
| | | "01" + |
| | | " " + |
| | | "00" + |
| | | ":" + |
| | | "00" + |
| | | ":" + |
| | | "00"; |
| | | } |
| | | // this.queryParams.paendtime=this.queryParams.paendtime.slice(0,5)å¹´ |
| | | else if (num >= 10) { |
| | | this.queryParams.paendtime = |
| | | this.queryParams.paendtime.slice(0, 5) + |
| | | (num + 1) + |
| | | "-" + |
| | | "01" + |
| | | " " + |
| | | "00" + |
| | | ":" + |
| | | "00" + |
| | | ":" + |
| | | "00"; |
| | | } else { |
| | | this.queryParams.paendtime = |
| | | this.queryParams.paendtime.slice(0, 5) + |
| | | "10" + |
| | | "-" + |
| | | "01" + |
| | | " " + |
| | | "00" + |
| | | ":" + |
| | | "00" + |
| | | ":" + |
| | | "00"; |
| | | } |
| | | // ç»ææ¶é´å"æéç»ææç次æ 1 å·"ï¼ä»¥å
嫿´ä¸ªç»ææã |
| | | // åå®ç°ææä»½ +1 åç´æ¥æ¼å符串ï¼12 æä¼å¾å° 13 æï¼2026-13-01ï¼ï¼ |
| | | // MySQL æ¥ Incorrect datetime valueï¼åå¨è¿ç¨ç´æ¥ 500ã |
| | | this.queryParams.paendtime = this.$moment(this.queryParams.paendtime) |
| | | .startOf("month") |
| | | .add(1, "month") |
| | | .format("YYYY-MM") |
| | | .concat("-01 00:00:00"); |
| | | this.queryParams.pabegtime = |
| | | this.queryParams.pabegtime + " " + "00" + ":" + "00" + ":" + "00"; |
| | | // } |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | this.queryParams.pabegtime = this.selecttime[0]; |
| | | this.queryParams.paendtime = this.selecttime[1]; |
| | | // if (this.queryParams.paendtime == this.queryParams.pabegtime) { |
| | | let num = Number(this.queryParams.paendtime.slice(5, 7)); |
| | | if (num < 9) { |
| | | let mon = Number(this.queryParams.paendtime.slice(6, 7)); |
| | | this.queryParams.paendtime = |
| | | this.queryParams.paendtime.slice(0, 5) + |
| | | "0" + |
| | | (mon + 1) + |
| | | "-" + |
| | | "01" + |
| | | " " + |
| | | "00" + |
| | | ":" + |
| | | "00" + |
| | | ":" + |
| | | "00"; |
| | | } |
| | | // this.queryParams.paendtime=this.queryParams.paendtime.slice(0,5)å¹´ |
| | | else if (num >= 10) { |
| | | this.queryParams.paendtime = |
| | | this.queryParams.paendtime.slice(0, 5) + |
| | | (num + 1) + |
| | | "-" + |
| | | "01" + |
| | | " " + |
| | | "00" + |
| | | ":" + |
| | | "00" + |
| | | ":" + |
| | | "00"; |
| | | } else { |
| | | this.queryParams.paendtime = |
| | | this.queryParams.paendtime.slice(0, 5) + |
| | | "10" + |
| | | "-" + |
| | | "01" + |
| | | " " + |
| | | "00" + |
| | | ":" + |
| | | "00" + |
| | | ":" + |
| | | "00"; |
| | | } |
| | | // ç»ææ¶é´å"æéç»ææç次æ 1 å·"ï¼ä»¥å
嫿´ä¸ªç»ææã |
| | | // åå®ç°ææä»½ +1 åç´æ¥æ¼å符串ï¼12 æä¼å¾å° 13 æï¼2026-13-01ï¼ï¼ |
| | | // MySQL æ¥ Incorrect datetime valueï¼åå¨è¿ç¨ç´æ¥ 500ã |
| | | this.queryParams.paendtime = this.$moment(this.queryParams.paendtime) |
| | | .startOf("month") |
| | | .add(1, "month") |
| | | .format("YYYY-MM") |
| | | .concat("-01 00:00:00"); |
| | | this.queryParams.pabegtime = |
| | | this.queryParams.pabegtime + " " + "00" + ":" + "00" + ":" + "00"; |
| | | // } |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | this.queryParams.pabegtime = this.selecttime[0]; |
| | | this.queryParams.paendtime = this.selecttime[1]; |
| | | // if (this.queryParams.paendtime == this.queryParams.pabegtime) { |
| | | let num = Number(this.queryParams.paendtime.slice(5, 7)); |
| | | if (num < 9) { |
| | | let mon = Number(this.queryParams.paendtime.slice(6, 7)); |
| | | this.queryParams.paendtime = |
| | | this.queryParams.paendtime.slice(0, 5) + |
| | | "0" + |
| | | (mon + 1) + |
| | | "-" + |
| | | "01" + |
| | | " " + |
| | | "00" + |
| | | ":" + |
| | | "00" + |
| | | ":" + |
| | | "00"; |
| | | } |
| | | // this.queryParams.paendtime=this.queryParams.paendtime.slice(0,5)å¹´ |
| | | else if (num >= 10) { |
| | | this.queryParams.paendtime = |
| | | this.queryParams.paendtime.slice(0, 5) + |
| | | (num + 1) + |
| | | "-" + |
| | | "01" + |
| | | " " + |
| | | "00" + |
| | | ":" + |
| | | "00" + |
| | | ":" + |
| | | "00"; |
| | | } else { |
| | | this.queryParams.paendtime = |
| | | this.queryParams.paendtime.slice(0, 5) + |
| | | "10" + |
| | | "-" + |
| | | "01" + |
| | | " " + |
| | | "00" + |
| | | ":" + |
| | | "00" + |
| | | ":" + |
| | | "00"; |
| | | } |
| | | // ç»ææ¶é´å"æéç»ææç次æ 1 å·"ï¼ä»¥å
嫿´ä¸ªç»ææã |
| | | // åå®ç°ææä»½ +1 åç´æ¥æ¼å符串ï¼12 æä¼å¾å° 13 æï¼2026-13-01ï¼ï¼ |
| | | // MySQL æ¥ Incorrect datetime valueï¼åå¨è¿ç¨ç´æ¥ 500ã |
| | | this.queryParams.paendtime = this.$moment(this.queryParams.paendtime) |
| | | .startOf("month") |
| | | .add(1, "month") |
| | | .format("YYYY-MM") |
| | | .concat("-01 00:00:00"); |
| | | this.queryParams.pabegtime = |
| | | this.queryParams.pabegtime + " " + "00" + ":" + "00" + ":" + "00"; |
| | | // } |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | this.queryParams.pabegtime = this.selecttime[0]; |
| | | this.queryParams.paendtime = this.selecttime[1]; |
| | | // if (this.queryParams.paendtime == this.queryParams.pabegtime) { |
| | | let num = Number(this.queryParams.paendtime.slice(5, 7)); |
| | | if (num < 9) { |
| | | let mon = Number(this.queryParams.paendtime.slice(6, 7)); |
| | | this.queryParams.paendtime = |
| | | this.queryParams.paendtime.slice(0, 5) + |
| | | "0" + |
| | | (mon + 1) + |
| | | "-" + |
| | | "01" + |
| | | " " + |
| | | "00" + |
| | | ":" + |
| | | "00" + |
| | | ":" + |
| | | "00"; |
| | | } |
| | | // this.queryParams.paendtime=this.queryParams.paendtime.slice(0,5)å¹´ |
| | | else if (num >= 10) { |
| | | this.queryParams.paendtime = |
| | | this.queryParams.paendtime.slice(0, 5) + |
| | | (num + 1) + |
| | | "-" + |
| | | "01" + |
| | | " " + |
| | | "00" + |
| | | ":" + |
| | | "00" + |
| | | ":" + |
| | | "00"; |
| | | } else { |
| | | this.queryParams.paendtime = |
| | | this.queryParams.paendtime.slice(0, 5) + |
| | | "10" + |
| | | "-" + |
| | | "01" + |
| | | " " + |
| | | "00" + |
| | | ":" + |
| | | "00" + |
| | | ":" + |
| | | "00"; |
| | | } |
| | | // ç»ææ¶é´å"æéç»ææç次æ 1 å·"ï¼ä»¥å
嫿´ä¸ªç»ææã |
| | | // åå®ç°ææä»½ +1 åç´æ¥æ¼å符串ï¼12 æä¼å¾å° 13 æï¼2026-13-01ï¼ï¼ |
| | | // MySQL æ¥ Incorrect datetime valueï¼åå¨è¿ç¨ç´æ¥ 500ã |
| | | this.queryParams.paendtime = this.$moment(this.queryParams.paendtime) |
| | | .startOf("month") |
| | | .add(1, "month") |
| | | .format("YYYY-MM") |
| | | .concat("-01 00:00:00"); |
| | | this.queryParams.pabegtime = |
| | | this.queryParams.pabegtime + " " + "00" + ":" + "00" + ":" + "00"; |
| | | // } |
| | |
| | | <el-date-picker |
| | | v-model="form.taxedtime" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | type="datetime" |
| | | type="datetime" format="yyyy-MM-dd HH:mm" |
| | | :disabled="true" |
| | | placeholder="éæ©æ¶é´" |
| | | > |
| | |
| | | <el-row :gutter="20"> |
| | | <!--ç¨æ·æ°æ®--> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="patientqueryParams" |
| | | ref="queryForm" |
| | | size="small" |
| | |
| | | import Li_area_select from "@/components/Address"; |
| | | import { getUserProfile } from "@/api/system/user"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { moneySum, moneyRound } from "@/utils/money"; |
| | | import { |
| | | ExpertfeeListnb, |
| | | getFundtax, |
| | |
| | | this.$modal.msgError("注æå®æ¶éé¢ä¸çäºåºæ¶éé¢ï¼è¯·æ ¸å¯¹æ°æ®ï¼"); |
| | | } |
| | | }, |
| | | //ä¿®æ¹å®æ¶æåºæ¶å触å |
| | | //ä¿®æ¹å®æ¶æåºæ¶å触åï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ |
| | | chargeSum() { |
| | | let ChargeSum = 0; |
| | | let ChargeamountSum = 0; |
| | | |
| | | //è´¹ç¨å计 |
| | | try { |
| | | for (let i = 0; i < this.donorchargeorgans.length; i++) { |
| | | if (!isNaN(parseFloat(this.donorchargeorgans[i].organcharge))) { |
| | | ChargeSum += parseFloat(this.donorchargeorgans[i].organcharge); |
| | | } |
| | | if (!isNaN(parseFloat(this.donorchargeorgans[i].amount))) { |
| | | ChargeamountSum += parseFloat(this.donorchargeorgans[i].amount); |
| | | } |
| | | } |
| | | this.form.receivableamount = ChargeSum.toFixed(2); |
| | | this.form.receivedamount = ChargeamountSum.toFixed(2); |
| | | this.form.receivableamount = moneyRound( |
| | | moneySum(this.donorchargeorgans, "organcharge") |
| | | ).toFixed(2); |
| | | this.form.receivedamount = moneyRound( |
| | | moneySum(this.donorchargeorgans, "amount") |
| | | ).toFixed(2); |
| | | } catch {} |
| | | }, |
| | | |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | label="ç³è¯·æ¥æ" |
| | | align="center" |
| | | prop="createTime" |
| | | width="180" |
| | | width="140" |
| | | > |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.createTime, "{y}-{m}-{d}") }}</span> |
| | |
| | | <!-- <el-table-column label="ç»å人" align="center" prop="username" /> --> |
| | | <el-table-column |
| | | label="ç³è¯·åå·" |
| | | width="180" |
| | | width="160" |
| | | align="center" |
| | | prop="applyno" |
| | | /> |
| | | |
| | | <el-table-column label="ç¨åéé¢" align="center" prop="pretaxamount"> |
| | | <el-table-column label="ç¨åéé¢" align="center" prop="pretaxamount" width="100" > |
| | | </el-table-column> |
| | | <el-table-column label="æ£ç¨éé¢" align="center" prop="taxMoney" /> |
| | | <el-table-column label="ç¨åéé¢" align="center" prop="taxedamount" /> |
| | | <el-table-column label="æ¯å¦ç®ç¨" width="180" align="center" prop="istax"> |
| | | <el-table-column label="æ£ç¨éé¢" align="center" prop="taxMoney" width="100" /> |
| | | <el-table-column label="ç¨åéé¢" align="center" prop="taxedamount" width="100" /> |
| | | <el-table-column label="æ¯å¦ç®ç¨" align="center" prop="istax" width="90" > |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_0_1" |
| | |
| | | <!-- <el-table-column label="æ»éé¢" align="center" prop="taxamount" /> --> |
| | | |
| | | <el-table-column label="ç®ç¨æ¶é´" align="center" prop="taxedtime" /> |
| | | <el-table-column label="仿¬¾ç¶æ" align="center" prop="isdistribute"> |
| | | <el-table-column label="仿¬¾ç¶æ" align="center" prop="isdistribute" width="100" > |
| | | <template slot-scope="scope"> |
| | | <span>{{ scope.row.isdistribute == "0" ? "æªä»æ¬¾" : "已仿¬¾" }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="仿¬¾æ¥æ" align="center" prop="riqi" /> |
| | | <el-table-column label="仿¬¾æ¥æ" align="center" prop="riqi" width="120" /> |
| | | <el-table-column label="æä½" width="280" align="center"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | |
| | | </el-col> |
| | | <el-col :span="7"> |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="applyTime"> |
| | | <el-date-picker style="width: 100%" v-model="form.applyTime" type="date" |
| | | <el-date-picker style="width: 100%" v-model="form.applyTime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="ç³è¯·æ¥æ"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | |
| | | <el-table-column prop="starttime" slot="" label="åºåæ¥æ" fixed align="center" width="150"> |
| | | <template slot-scope="scope"> |
| | | <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.starttime" |
| | | type="date" value-format="yyyy-MM-dd HH:mm:ss" placeholder="åºåæ¥æ" |
| | | type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd HH:mm:ss" placeholder="åºåæ¥æ" |
| | | @change="getStandard(scope.row)"> |
| | | </el-date-picker> |
| | | </template> |
| | |
| | | <el-table-column prop="endtime" slot="" label="å°è¾¾æ¥æ" align="center" width="150" fixed> |
| | | <template slot-scope="scope"> |
| | | <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.endtime" |
| | | type="date" value-format="yyyy-MM-dd HH:mm:ss" placeholder="å°è¾¾æ¥æ"> |
| | | type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd HH:mm:ss" placeholder="å°è¾¾æ¥æ"> |
| | | </el-date-picker> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | } from "@/api/project/organization"; |
| | | import { listDonatebaseinfo } from "@/api/project/donatebaseinfo"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { moneySum } from "@/utils/money"; |
| | | export default { |
| | | data() { |
| | | return { |
| | |
| | | //å ç¹åæ¶çæç¤º |
| | | }); |
| | | }, |
| | | //计ç®è´¹ç¨å计 |
| | | //计ç®è´¹ç¨å计ï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ç¦æ¢ parseFloat ç´¯å ï¼ |
| | | sumTotalFee() { |
| | | let allSum = 0; |
| | | try { |
| | | for (let i = 0; i < this.applicationDetailArr.length; i++) { |
| | | let totalFee = 0; |
| | | const row = this.applicationDetailArr[i]; |
| | | //计ç®å½åæ¥éå
容费ç¨å计 |
| | | if (!isNaN(parseFloat(this.applicationDetailArr[i].trafficexpense))) { |
| | | totalFee += parseFloat(this.applicationDetailArr[i].trafficexpense); |
| | | } |
| | | if (!isNaN(parseFloat(this.applicationDetailArr[i].cityfee))) { |
| | | totalFee += parseFloat(this.applicationDetailArr[i].cityfee); |
| | | } |
| | | if (!isNaN(parseFloat(this.applicationDetailArr[i].hotelexpense))) { |
| | | totalFee += parseFloat(this.applicationDetailArr[i].hotelexpense); |
| | | } |
| | | if (!isNaN(parseFloat(this.applicationDetailArr[i].otherexpense))) { |
| | | totalFee += parseFloat(this.applicationDetailArr[i].otherexpense); |
| | | } |
| | | if (!isNaN(parseFloat(this.applicationDetailArr[i].foodexpenses))) { |
| | | totalFee += parseFloat(this.applicationDetailArr[i].foodexpenses); |
| | | } |
| | | if (!isNaN(parseFloat(this.applicationDetailArr[i].foodallowance))) { |
| | | totalFee += parseFloat(this.applicationDetailArr[i].foodallowance); |
| | | } |
| | | if (!isNaN(parseFloat(this.applicationDetailArr[i].otherfeeamount))) { |
| | | totalFee += parseFloat(this.applicationDetailArr[i].otherfeeamount); |
| | | } |
| | | this.applicationDetailArr[i].total = parseFloat(totalFee).toFixed(2); |
| | | this.$set(this.applicationDetailArr, i, this.applicationDetailArr[i]); |
| | | if (!isNaN(parseFloat(this.applicationDetailArr[i].total))) { |
| | | allSum += parseFloat(this.applicationDetailArr[i].total); |
| | | } |
| | | const totalFee = moneySum([ |
| | | row.trafficexpense, |
| | | row.cityfee, |
| | | row.hotelexpense, |
| | | row.otherexpense, |
| | | row.foodexpenses, |
| | | row.foodallowance, |
| | | row.otherfeeamount |
| | | ]); |
| | | row.total = totalFee.toFixed(2); |
| | | this.$set(this.applicationDetailArr, i, row); |
| | | } |
| | | this.form.amountrequested = allSum.toFixed(2); |
| | | this.form.amountrequested = moneySum(this.applicationDetailArr, "total").toFixed(2); |
| | | this.form.bigstrmoney = this.convertCurrency(this.form.amountrequested); |
| | | } catch { } |
| | | }, |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | | v-show="showSearch" |
| | | label-width="68px" |
| | | > |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-row> |
| | | <!-- |
| | | <el-col :span="6"> |
| | |
| | | --> |
| | | <el-col :span="6"> |
| | | <el-form-item label="ç»å人" prop="username"> |
| | | <el-input |
| | | v-model="queryParams.username" |
| | | placeholder="请è¾å
¥ç»å人" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | <el-input v-model="queryParams.username" placeholder="请è¾å
¥ç»å人" clearable size="small" |
| | | @keyup.enter.native="handleQuery" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ¥éæ¥æ" prop="applyTime"> |
| | | <el-date-picker |
| | | format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd" |
| | | v-model="value1" |
| | | type="daterange" |
| | | @blur="onpick" |
| | | range-separator="è³" |
| | | start-placeholder="æ¥éå¼å§æ¥æ" |
| | | end-placeholder="æ¥éç»ææ¥æ" |
| | | @keyup.enter.native="handleQuery" |
| | | > |
| | | <el-date-picker format="yyyy-MM-dd" value-format="yyyy-MM-dd HH:mm:ss" v-model="value1" type="daterange" |
| | | @change="selecttime" range-separator="è³" start-placeholder="æ¥éå¼å§æ¥æ" end-placeholder="æ¥éç»ææ¥æ" |
| | | @keyup.enter.native="handlQuery"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="å®¡æ ¸ç¶æ" prop="recordstatus"> |
| | | <el-input |
| | | v-model="queryParams.recordstatus" |
| | | placeholder="è¯·éæ©å®¡æ ¸ç¶æ" |
| | | clearable |
| | | size="small" |
| | | v-if="0" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | <el-select |
| | | v-model="queryParams.recordstatus" |
| | | placeholder="è¯·éæ©å®¡æ ¸ç¶æ" |
| | | clearable |
| | | size="small" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_recordstatus" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | <el-input v-model="queryParams.recordstatus" placeholder="è¯·éæ©å®¡æ ¸ç¶æ" clearable size="small" v-if="0" |
| | | @keyup.enter.native="handleQuery" /> |
| | | <el-select v-model="queryParams.recordstatus" placeholder="è¯·éæ©å®¡æ ¸ç¶æ" clearable size="small"> |
| | | <el-option v-for="dict in dict.type.sys_recordstatus" :key="dict.value" :label="dict.label" |
| | | :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <el-form-item label="æç®è
" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.donorname" |
| | | placeholder="请è¾å
¥æç®è
å§å" |
| | | clearable |
| | | size="small" |
| | | @keyup.enter.native="handleQuery" |
| | | /> |
| | | <el-input v-model="queryParams.donorname" placeholder="请è¾å
¥æç®è
å§å" clearable size="small" |
| | | @keyup.enter.native="handleQuery" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="4"> |
| | | <el-form-item> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-search" |
| | | size="mini" |
| | | @click="handleQuery" |
| | | >æç´¢</el-button |
| | | > |
| | | <el-button icon="el-icon-refresh" size="mini" @click="resetQuery" |
| | | >éç½®</el-button |
| | | > |
| | | <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">æç´¢</el-button> |
| | | <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | |
| | | <el-row :gutter="10" class="mb8"> |
| | | <el-col :span="1.5"> |
| | | <el-button type="primary" plain icon="el-icon-plus" @click="handleAdd" |
| | | >æ°å¢</el-button |
| | | > |
| | | <el-button type="primary" plain icon="el-icon-plus" @click="handleAdd">æ°å¢</el-button> |
| | | <!-- v-hasPermi="['project:funddetail:add']" --> |
| | | </el-col> |
| | | <el-col :span="1.5"> |
| | | <el-button |
| | | type="warning" |
| | | plain |
| | | icon="el-icon-download" |
| | | :loading="exportLoading" |
| | | @click="handleExport" |
| | | >导åº</el-button |
| | | > |
| | | <el-button type="warning" plain icon="el-icon-download" :loading="exportLoading" |
| | | @click="handleExport">导åº</el-button> |
| | | </el-col> |
| | | <!-- v-hasPermi="['project:funddetail:export']" --> |
| | | <right-toolbar |
| | | :showSearch.sync="showSearch" |
| | | @queryTable="getList" |
| | | ></right-toolbar> |
| | | <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> |
| | | </el-row> |
| | | |
| | | <el-table |
| | | :row-class-name="rowClassName" |
| | | v-loading="loading" |
| | | :data="reimbursementList" |
| | | @selection-change="handleSelectionChange" |
| | | > |
| | | <el-table :row-class-name="rowClassName" v-loading="loading" :data="reimbursementList" |
| | | @selection-change="handleSelectionChange"> |
| | | <!-- <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="æ¥é人类å«" width="120" align="center" prop="costtype"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag :options="dict.type.sys_travelexpensebelong" :value="scope.row.costtype" /> |
| | | </template> |
| | | </el-table-column>--> |
| | | <el-table-column |
| | | label="ç³è¯·æ¶é´" |
| | | width="150" |
| | | align="center" |
| | | prop="applyTime" |
| | | > |
| | | </el-table-column>--> |
| | | <el-table-column label="ç³è¯·æ¶é´" width="120" align="center" prop="applyTime"> |
| | | <template slot-scope="scope"> |
| | | <span>{{ parseTime(scope.row.applyTime, "{y}-{m}-{d}") }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="å®¡æ ¸ç¶æ" |
| | | align="center" |
| | | prop="recordstatus" |
| | | width="160" |
| | | > |
| | | <el-table-column label="å®¡æ ¸ç¶æ" align="center" prop="recordstatus" width="140"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_recordstatus" |
| | | :value="scope.row.recordstatus" |
| | | /> |
| | | <dict-tag :options="dict.type.sys_recordstatus" :value="scope.row.recordstatus" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="ææé¢å®¡ç¶æ" |
| | | width="140" |
| | | align="center" |
| | | prop="checkstatus" |
| | | > |
| | | <el-table-column label="ææé¢å®¡ç¶æ" width="140" align="center" prop="checkstatus"> |
| | | <template slot-scope="scope"> |
| | | <dict-tag |
| | | :options="dict.type.sys_stage_type" |
| | | :value="scope.row.checkstatus" |
| | | /> |
| | | <dict-tag :options="dict.type.sys_stage_type" :value="scope.row.checkstatus" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="ç»å人" |
| | | width="150" |
| | | align="center" |
| | | prop="username" |
| | | /> |
| | | <el-table-column label="ç»å人" width="100" align="center" prop="username" /> |
| | | <!-- |
| | | <el-table-column label="åºå·®äºº" width="180" align="center" prop="travelers"> |
| | | </el-table-column>--> |
| | | <el-table-column |
| | | label="æ¥ééé¢" |
| | | width="150" |
| | | align="center" |
| | | prop="amountrequested" |
| | | > |
| | | <el-table-column label="æ¥ééé¢" width="120" align="center" prop="amountrequested"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æå±ç»å«" |
| | | width="150" |
| | | align="center" |
| | | prop="deptmentname" |
| | | /> |
| | | <el-table-column |
| | | label="ç»é¿" |
| | | width="150" |
| | | align="center" |
| | | prop="managername" |
| | | /> |
| | | <el-table-column label="æå±ç»å«" width="120" align="center" prop="deptmentname" /> |
| | | <el-table-column label="ç»é¿" width="100" align="center" prop="managername" /> |
| | | <el-table-column label="åºå·®äºç±" align="center" prop="reason" /> |
| | | <!-- <el-table-column label="èç³»çµè¯" width="120" align="center" prop="phone"> |
| | | </el-table-column> |
| | |
| | | </el-table-column> |
| | | <el-table-column label="æ¥éå计" align="center" prop="financechecher"/>--> |
| | | <!-- <el-table-column label="è´¢å¡å®¡æ ¸" width="120" align="center" prop="financechecher" /> --> |
| | | <el-table-column |
| | | label="æç®è
" |
| | | width="150" |
| | | align="center" |
| | | prop="donorname" |
| | | /> |
| | | <el-table-column |
| | | label="æä½" |
| | | align="center" |
| | | fixed="right" |
| | | width="300" |
| | | class-name="small-padding fixed-width" |
| | | > |
| | | <el-table-column label="æç®è
" width="100" align="center" prop="donorname" /> |
| | | <el-table-column label="æä½" align="center" fixed="right" width="300" class-name="small-padding fixed-width"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | v-if="scope.row.recordstatus == -1 || scope.row.recordstatus == 1" |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-upload2" |
| | | @click="handleup(scope.row)" |
| | | >䏿¥</el-button |
| | | > |
| | | <el-button |
| | | v-if="scope.row.recordstatus == -1 || scope.row.recordstatus == 1" |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-edit" |
| | | @click="handleUpdate(scope.row)" |
| | | >ä¿®æ¹</el-button |
| | | > |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-view" |
| | | @click="handleDetail(scope.row)" |
| | | >æ¥ç</el-button |
| | | > |
| | | <el-button v-if="scope.row.recordstatus == -1 || scope.row.recordstatus == 1" size="mini" type="text" |
| | | icon="el-icon-upload2" @click="handleup(scope.row)">䏿¥</el-button> |
| | | <el-button v-if="scope.row.recordstatus == -1 || scope.row.recordstatus == 1" size="mini" type="text" |
| | | icon="el-icon-edit" @click="handleUpdate(scope.row)">ä¿®æ¹</el-button> |
| | | <el-button size="mini" type="text" icon="el-icon-view" @click="handleDetail(scope.row)">æ¥ç</el-button> |
| | | <!-- v-hasPermi="['project:funddetail:edit']" --> |
| | | <el-button |
| | | size="mini" |
| | | type="text" |
| | | icon="el-icon-download" |
| | | @click="gettable(scope.row)" |
| | | > |
| | | <el-button size="mini" type="text" icon="el-icon-download" @click="gettable(scope.row)"> |
| | | ä¸è½½ |
| | | </el-button> |
| | | <!-- v-hasPermi="['project:funddetail:edit']" --> |
| | | <el-button |
| | | v-if="scope.row.recordstatus == -1 || scope.row.recordstatus == 1" |
| | | size="mini" |
| | | type="text" |
| | | @click="handleDelete(scope.row)" |
| | | ><span class="button-delete" |
| | | ><i class="el-icon-delete"></i>å é¤</span |
| | | ></el-button |
| | | > |
| | | <el-button v-if="scope.row.recordstatus == -1 || scope.row.recordstatus == 1" size="mini" type="text" |
| | | @click="handleDelete(scope.row)"><span class="button-delete"><i |
| | | class="el-icon-delete"></i>å é¤</span></el-button> |
| | | <!-- v-hasPermi="['project:funddetail:remove']" --> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column fixed="right" align="center" width="120" label="åè½"> |
| | | <el-table-column fixed="right" align="center" width="120" label="åè½" v-if="false"> |
| | | <template slot-scope="scope"> |
| | | <el-button size="mini" v-if="scope.row.uploadStates == 1" |
| | | >线ä¸å·²æ¥é</el-button |
| | | > |
| | | <el-button |
| | | size="mini" |
| | | type="success" |
| | | v-else-if="scope.row.uploadStates == 0" |
| | | @click="Dooffline('1', scope.row)" |
| | | >çº¿ä¸æ¥é</el-button |
| | | > |
| | | <el-button size="mini" v-if="scope.row.uploadStates == 1">线ä¸å·²æ¥é</el-button> |
| | | <el-button size="mini" type="success" v-else-if="scope.row.uploadStates == 0" |
| | | @click="Dooffline('1', scope.row)">çº¿ä¸æ¥é</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <!-- v-hasPermi="['project:donateconsolationfund:edit']" --> |
| | | |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" |
| | | @pagination="getList" /> |
| | | |
| | | <!-- æ·»å æä¿®æ¹è´¹ç¨ç³è¯·æç»å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | :title="title" |
| | | :visible.sync="open" |
| | | :close-on-click-modal="false" |
| | | width="1400px" |
| | | append-to-body |
| | | @close="reset" |
| | | > |
| | | <el-dialog :title="title" :visible.sync="open" :close-on-click-modal="false" width="1400px" append-to-body |
| | | @close="reset"> |
| | | <el-form ref="form" :model="form" :rules="rules" label-width="120px"> |
| | | <el-row |
| | | ><el-col :span="5"> |
| | | <el-row><el-col :span="5"> |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="applyTime"> |
| | | <el-date-picker |
| | | style="width: 100%" |
| | | v-model="form.applyTime" |
| | | type="date" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="ç³è¯·æ¥æ" |
| | | > |
| | | <el-date-picker style="width: 100%" v-model="form.applyTime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="ç³è¯·æ¥æ"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="5"> |
| | | <el-form-item label="ç»å人" prop="username"> |
| | | <el-select |
| | | v-model="form.username" |
| | | clearable |
| | | filterable |
| | | allow-create |
| | | ref="getReportname" |
| | | default-first-option |
| | | placeholder="è¯·éæ©" |
| | | > |
| | | <el-option |
| | | v-for="item in personsList" |
| | | :key="item.reportNo" |
| | | :label="item.reportName" |
| | | :value="item.reportName" |
| | | > |
| | | <el-select v-model="form.username" clearable filterable allow-create ref="getReportname" |
| | | default-first-option placeholder="è¯·éæ©"> |
| | | <el-option v-for="item in personsList" :key="item.reportNo" :label="item.reportName" |
| | | :value="item.reportName"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | |
| | | </el-col> |
| | | <el-col :span="5"> |
| | | <el-form-item label="æç®è
" prop="infoid"> |
| | | <el-select |
| | | v-model="form.infoid" |
| | | @change="selectbaseinfo" |
| | | filterable |
| | | placeholder="è¯·éæ©æç®è
" |
| | | > |
| | | <el-option |
| | | v-for="item in baselist" |
| | | :key="item.index" |
| | | :label="item.name" |
| | | :value="item.infoid" |
| | | > |
| | | <el-select v-model="form.infoid" @change="selectbaseinfo" filterable placeholder="è¯·éæ©æç®è
"> |
| | | <el-option v-for="item in baselist" :key="item.index" :label="item.name" :value="item.infoid"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | |
| | | <el-row style="margin-top: 10px"> |
| | | <el-col :span="5"> |
| | | <el-form-item label="æ¥ééé¢" prop="amountrequested"> |
| | | <el-input |
| | | :disabled="true" |
| | | v-model="form.amountrequested" |
| | | placeholder="æ¥éå计éé¢" |
| | | /> |
| | | <el-input :disabled="true" v-model="form.amountrequested" placeholder="æ¥éå计éé¢" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="10"> |
| | | <el-form-item label="大åéé¢" prop="bigstrmoney"> |
| | | <el-input |
| | | :disabled="true" |
| | | v-model="form.bigstrmoney" |
| | | placeholder="æ¥é大åéé¢" |
| | | /> |
| | | </el-form-item> </el-col |
| | | ><el-col :span="5"> |
| | | <el-input :disabled="true" v-model="form.bigstrmoney" placeholder="æ¥é大åéé¢" /> |
| | | </el-form-item> </el-col><el-col :span="5"> |
| | | <el-form-item label="å®¡æ ¸ç¶æ" prop="flowlevel"> |
| | | <el-select |
| | | v-model="form.recordstatus" |
| | | placeholder="è¯·éæ©å®¡æ ¸ç¶æ" |
| | | clearable |
| | | :disabled="true" |
| | | size="small" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_recordstatus" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | /> |
| | | <el-select v-model="form.recordstatus" placeholder="è¯·éæ©å®¡æ ¸ç¶æ" clearable :disabled="true" size="small"> |
| | | <el-option v-for="dict in dict.type.sys_recordstatus" :key="dict.value" :label="dict.label" |
| | | :value="dict.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | </el-row> |
| | | <el-row> |
| | | <el-table :data="rbDetails" border highlight-current-row> |
| | | <el-table-column |
| | | prop="orderno" |
| | | slot="" |
| | | label="åºå·" |
| | | align="center" |
| | | fixed |
| | | width="65" |
| | | > |
| | | <el-table-column prop="orderno" slot="" label="åºå·" align="center" fixed width="65"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.orderno" placeholder="åºå·" /> |
| | | </template> |
| | | </el-table-column> |
| | | <!--主é®ãå¤ä¸å±ç¤º--> |
| | | <el-table-column |
| | | prop="id" |
| | | slot="" |
| | | label="主é®" |
| | | align="center" |
| | | fixed |
| | | width="95" |
| | | v-if="false" |
| | | > |
| | | <el-table-column prop="id" slot="" label="主é®" align="center" fixed width="95" v-if="false"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.id" placeholder="id" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="rbid" |
| | | slot="" |
| | | label="å¤é®" |
| | | align="center" |
| | | fixed |
| | | width="95" |
| | | v-if="false" |
| | | > |
| | | <el-table-column prop="rbid" slot="" label="å¤é®" align="center" fixed width="95" v-if="false"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.rbid" placeholder="rbid" /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="persontype" |
| | | slot="" |
| | | label="人åç±»å«" |
| | | align="center" |
| | | fixed |
| | | width="130" |
| | | > |
| | | <el-table-column prop="persontype" slot="" label="人åç±»å«" align="center" fixed width="130"> |
| | | <template slot-scope="scope"> |
| | | <el-select |
| | | v-model="scope.row.persontype" |
| | | value-key="value" |
| | | placeholder="人åç±»å«" |
| | | @change="getPersons(scope.row)" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_travelexpensebelong" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.label" |
| | | ></el-option> |
| | | <el-select v-model="scope.row.persontype" value-key="value" placeholder="人åç±»å«" |
| | | @change="getPersons(scope.row)"> |
| | | <el-option v-for="dict in dict.type.sys_travelexpensebelong" :key="dict.value" :label="dict.label" |
| | | :value="dict.label"></el-option> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="personname" |
| | | slot="" |
| | | label="è´¹ç¨äººå" |
| | | align="center" |
| | | fixed |
| | | width="110" |
| | | > |
| | | <el-table-column prop="personname" slot="" label="è´¹ç¨äººå" align="center" fixed width="110"> |
| | | <template slot-scope="scope"> |
| | | <el-select |
| | | v-model="scope.row.personname" |
| | | clearable |
| | | filterable |
| | | allow-create |
| | | default-first-option |
| | | placeholder="è¯·éæ©" |
| | | @focus1="getPersons(scope.row)" |
| | | > |
| | | <el-option |
| | | v-for="item in personsSel" |
| | | :key="item.reportNo" |
| | | :label="item.reportName" |
| | | :value="item.reportName" |
| | | > |
| | | <el-select v-model="scope.row.personname" clearable filterable allow-create default-first-option |
| | | placeholder="è¯·éæ©" @focus1="getPersons(scope.row)"> |
| | | <el-option v-for="item in personsSel" :key="item.reportNo" :label="item.reportName" |
| | | :value="item.reportName"> |
| | | </el-option> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="starttime" |
| | | slot="" |
| | | label="å¼å§æ¥æ" |
| | | fixed |
| | | align="center" |
| | | width="150" |
| | | > |
| | | <el-table-column prop="starttime" slot="" label="å¼å§æ¥æ" fixed align="center" width="150"> |
| | | <template slot-scope="scope"> |
| | | <el-date-picker |
| | | :picker-options="{ |
| | | disabledDate: time => { |
| | | if (scope.row.endtime) { |
| | | return ( |
| | | time.getTime() > |
| | | new Date(scope.row.endtime.replace(/-/g, '/')) |
| | | ); |
| | | } |
| | | <el-date-picker :picker-options="{ |
| | | disabledDate: time => { |
| | | if (scope.row.endtime) { |
| | | return ( |
| | | time.getTime() > |
| | | new Date(scope.row.endtime.replace(/-/g, '/')) |
| | | ); |
| | | } |
| | | }" |
| | | clearable |
| | | size="small" |
| | | style="width: 100%" |
| | | v-model="scope.row.starttime" |
| | | type="date" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="å¼å§æ¥æ" |
| | | @blur="getdays(scope.row)" |
| | | > |
| | | } |
| | | }" clearable size="small" style="width: 100%" v-model="scope.row.starttime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="å¼å§æ¥æ" @blur="getdays(scope.row)"> |
| | | </el-date-picker> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="endtime" |
| | | slot="" |
| | | label="ç»ææ¥æ" |
| | | align="center" |
| | | fixed |
| | | width="150" |
| | | > |
| | | <el-table-column prop="endtime" slot="" label="ç»ææ¥æ" align="center" fixed width="150"> |
| | | <template slot-scope="scope"> |
| | | <el-date-picker |
| | | :picker-options="{ |
| | | disabledDate: time => { |
| | | if (scope.row.starttime) { |
| | | return ( |
| | | time.getTime() < |
| | | new Date(scope.row.starttime.replace(/-/g, '/')) |
| | | ); |
| | | } |
| | | <el-date-picker :picker-options="{ |
| | | disabledDate: time => { |
| | | if (scope.row.starttime) { |
| | | return ( |
| | | time.getTime() < |
| | | new Date(scope.row.starttime.replace(/-/g, '/')) |
| | | ); |
| | | } |
| | | }" |
| | | clearable |
| | | size="small" |
| | | style="width: 100%" |
| | | v-model="scope.row.endtime" |
| | | type="date" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="ç»ææ¥æ" |
| | | @blur="getdays(scope.row)" |
| | | > |
| | | } |
| | | }" clearable size="small" style="width: 100%" v-model="scope.row.endtime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="ç»ææ¥æ" @blur="getdays(scope.row)"> |
| | | </el-date-picker> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="departure" |
| | | slot="" |
| | | label="åºåå°" |
| | | align="center" |
| | | width="100" |
| | | > |
| | | <el-table-column prop="departure" slot="" label="åºåå°" align="center" width="100"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.departure" placeholder="åºåå°" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="å°è¾¾å°" |
| | | prop="destination" |
| | | align="center" |
| | | width="140" |
| | | > |
| | | <el-table-column label="å°è¾¾å°" prop="destination" align="center" width="140"> |
| | | <template slot-scope="scope"> |
| | | <!-- <el-input v-model="scope.row.destination" placeholder="å°è¾¾å°" @blur="getallowance(scope.row)" /> --> |
| | | <el-select |
| | | filterable |
| | | allow-create |
| | | v-model="scope.row.destination" |
| | | value-key="value" |
| | | placeholder="å°è¾¾å°" |
| | | @change="getallowance(scope.row)" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_area_name" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.label" |
| | | ></el-option> |
| | | <el-select filterable allow-create v-model="scope.row.destination" value-key="value" placeholder="å°è¾¾å°" |
| | | @change="getallowance(scope.row)"> |
| | | <el-option v-for="dict in dict.type.sys_area_name" :key="dict.value" :label="dict.label" |
| | | :value="dict.label"></el-option> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="days" label="天æ°" width="65" align="center"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | v-model="scope.row.days" |
| | | @blur="getallowance(scope.row)" |
| | | placeholder="天æ°" |
| | | /> |
| | | <el-input v-model="scope.row.days" @blur="getallowance(scope.row)" placeholder="天æ°" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="traffictype" |
| | | label="åºå交éå·¥å
·" |
| | | align="center" |
| | | width="100" |
| | | > |
| | | <el-table-column prop="traffictype" label="åºå交éå·¥å
·" align="center" width="100"> |
| | | <template slot-scope="scope"> |
| | | <el-select |
| | | v-model="scope.row.traffictype" |
| | | placeholder="åºå交éå·¥å
·" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_traffictype" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.label" |
| | | ></el-option> |
| | | <el-select v-model="scope.row.traffictype" placeholder="åºå交éå·¥å
·"> |
| | | <el-option v-for="dict in dict.type.sys_traffictype" :key="dict.value" :label="dict.label" |
| | | :value="dict.label"></el-option> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="traffictype2" |
| | | label="è¿å交éå·¥å
·" |
| | | align="center" |
| | | width="100" |
| | | > |
| | | <el-table-column prop="traffictype2" label="è¿å交éå·¥å
·" align="center" width="100"> |
| | | <template slot-scope="scope"> |
| | | <el-select |
| | | v-model="scope.row.traffictype2" |
| | | placeholder="è¿å交éå·¥å
·" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_traffictype" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.label" |
| | | ></el-option> |
| | | <el-select v-model="scope.row.traffictype2" placeholder="è¿å交éå·¥å
·"> |
| | | <el-option v-for="dict in dict.type.sys_traffictype" :key="dict.value" :label="dict.label" |
| | | :value="dict.label"></el-option> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="trafficexpense" |
| | | label="交éè´¹" |
| | | align="center" |
| | | width="80" |
| | | > |
| | | <el-table-column prop="trafficexpense" label="交éè´¹" align="center" width="80"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | v-model="scope.row.trafficexpense" |
| | | placeholder="交éè´¹" |
| | | @blur=" |
| | | val => { |
| | | sumRowFee(scope.row); |
| | | } |
| | | " |
| | | /> |
| | | <el-input v-model="scope.row.trafficexpense" placeholder="交éè´¹" @blur=" |
| | | val => { |
| | | sumRowFee(scope.row); |
| | | } |
| | | " /> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- |
| | |
| | | </template> |
| | | </el-table-column> |
| | | --> |
| | | <el-table-column |
| | | prop="hotelexpense" |
| | | label="ä½å®¿è´¹" |
| | | align="center" |
| | | width="80" |
| | | > |
| | | <el-table-column prop="hotelexpense" label="ä½å®¿è´¹" align="center" width="80"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | v-model="scope.row.hotelexpense" |
| | | placeholder="ä½å®¿è´¹" |
| | | @blur=" |
| | | val => { |
| | | sumRowFee(scope.row); |
| | | } |
| | | " |
| | | /> |
| | | <el-input v-model="scope.row.hotelexpense" placeholder="ä½å®¿è´¹" @blur=" |
| | | val => { |
| | | sumRowFee(scope.row); |
| | | } |
| | | " /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="foodexpenses" |
| | | label="é¤è´¹æ¥é" |
| | | align="center" |
| | | width="80" |
| | | > |
| | | <el-table-column prop="foodexpenses" label="é¤è´¹æ¥é" align="center" width="80"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | v-model="scope.row.foodexpenses" |
| | | placeholder="ä¼é£è´¹æ¥é" |
| | | @blur=" |
| | | val => { |
| | | sumRowFee(scope.row); |
| | | } |
| | | " |
| | | /> |
| | | <el-input v-model="scope.row.foodexpenses" placeholder="ä¼é£è´¹æ¥é" @blur=" |
| | | val => { |
| | | sumRowFee(scope.row); |
| | | } |
| | | " /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="foodallowance" |
| | | label="ä¼é£è¡¥å©" |
| | | align="center" |
| | | width="80" |
| | | > |
| | | <el-table-column prop="foodallowance" label="ä¼é£è¡¥å©" align="center" width="80"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | v-model="scope.row.foodallowance" |
| | | placeholder="ä¼é£è´¹è¡¥å©" |
| | | @blur=" |
| | | val => { |
| | | sumRowFee(scope.row); |
| | | } |
| | | " |
| | | /> |
| | | <el-input v-model="scope.row.foodallowance" placeholder="ä¼é£è´¹è¡¥å©" @blur=" |
| | | val => { |
| | | sumRowFee(scope.row); |
| | | } |
| | | " /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="otherexpense" |
| | | label="å
¬æè´¹è¡¥å©" |
| | | align="center" |
| | | width="80" |
| | | > |
| | | <el-table-column prop="otherexpense" label="å
¬æè´¹è¡¥å©" align="center" width="80"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | v-model="scope.row.otherexpense" |
| | | placeholder="æè´¹" |
| | | @blur=" |
| | | val => { |
| | | sumRowFee(scope.row); |
| | | } |
| | | " |
| | | /> |
| | | <el-input v-model="scope.row.otherexpense" placeholder="æè´¹" @blur=" |
| | | val => { |
| | | sumRowFee(scope.row); |
| | | } |
| | | " /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="otherfeeamount" |
| | | label="å
¶ä»è´¹ç¨" |
| | | align="center" |
| | | width="90" |
| | | > |
| | | <el-table-column prop="otherfeeamount" label="å
¶ä»è´¹ç¨" align="center" width="90"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | v-model="scope.row.otherfeeamount" |
| | | placeholder="å
¶ä»è´¹ç¨" |
| | | @blur=" |
| | | val => { |
| | | sumRowFee(scope.row); |
| | | } |
| | | " |
| | | /> |
| | | <el-input v-model="scope.row.otherfeeamount" placeholder="å
¶ä»è´¹ç¨" @blur=" |
| | | val => { |
| | | sumRowFee(scope.row); |
| | | } |
| | | " /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="departure" |
| | | slot="" |
| | | label="å
¶ä»è´¹ç¨è¯´æ" |
| | | align="center" |
| | | width="120" |
| | | > |
| | | <el-table-column prop="departure" slot="" label="å
¶ä»è´¹ç¨è¯´æ" align="center" width="120"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | v-model="scope.row.otherfeedesc" |
| | | placeholder="å
¶ä»è´¹ç¨è¯´æ" |
| | | /> |
| | | <el-input v-model="scope.row.otherfeedesc" placeholder="å
¶ä»è´¹ç¨è¯´æ" /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="total" |
| | | label="å计" |
| | | align="center" |
| | | width="110" |
| | | > |
| | | <el-table-column prop="total" label="å计" align="center" width="110"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.total" placeholder="å计" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | fixed="right" |
| | | label="æä½" |
| | | align="center" |
| | | width="120" |
| | | v-if="dialogType == 'edit'" |
| | | > |
| | | <el-table-column fixed="right" label="æä½" align="center" width="120" v-if="dialogType == 'edit'"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | type="text" |
| | | size="mini" |
| | | @click="addDetailRow(scope.$index)" |
| | | >æ°å¢</el-button |
| | | > |
| | | <el-button |
| | | @click.native.prevent=" |
| | | deleteDetailRow(scope.$index, rbDetails, scope.row) |
| | | " |
| | | type="text" |
| | | size="small" |
| | | > |
| | | <el-button type="text" size="mini" @click="addDetailRow(scope.$index)">æ°å¢</el-button> |
| | | <el-button @click.native.prevent=" |
| | | deleteDetailRow(scope.$index, rbDetails, scope.row) |
| | | " type="text" size="small"> |
| | | å é¤ |
| | | </el-button> |
| | | </template> |
| | |
| | | </el-row> |
| | | <el-row style="margin-top: 30px"> |
| | | <el-table :data="rbPayees" border highlight-current-row> |
| | | <el-table-column |
| | | prop="orderno" |
| | | slot="" |
| | | label="åºå·" |
| | | align="center" |
| | | fixed |
| | | width="65" |
| | | > |
| | | <el-table-column prop="orderno" slot="" label="åºå·" align="center" fixed width="65"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.orderno" placeholder="åºå·" /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <!--主é®ãå¤é®ä¸å±ç¤º--> |
| | | <el-table-column |
| | | prop="id" |
| | | slot="" |
| | | label="主é®" |
| | | align="center" |
| | | fixed |
| | | width="95" |
| | | v-if="false" |
| | | > |
| | | <el-table-column prop="id" slot="" label="主é®" align="center" fixed width="95" v-if="false"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.id" placeholder="id" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="rbid" |
| | | slot="" |
| | | label="å¤é®" |
| | | align="center" |
| | | fixed |
| | | width="95" |
| | | v-if="false" |
| | | > |
| | | <el-table-column prop="rbid" slot="" label="å¤é®" align="center" fixed width="95" v-if="false"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.rbid" placeholder="rbid" /> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="persontype" |
| | | slot="" |
| | | label="人åç±»å«" |
| | | align="center" |
| | | fixed |
| | | width="130" |
| | | > |
| | | <el-table-column prop="persontype" slot="" label="人åç±»å«" align="center" fixed width="130"> |
| | | <template slot-scope="scope"> |
| | | <el-select |
| | | v-model="scope.row.persontype" |
| | | value-key="value" |
| | | placeholder="人åç±»å«" |
| | | @change="getPersons(scope.row)" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_travelexpensebelong" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.label" |
| | | ></el-option> |
| | | <el-select v-model="scope.row.persontype" value-key="value" placeholder="人åç±»å«" |
| | | @change="getPersons(scope.row)"> |
| | | <el-option v-for="dict in dict.type.sys_travelexpensebelong" :key="dict.value" :label="dict.label" |
| | | :value="dict.label"></el-option> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="personname" |
| | | slot="" |
| | | label="æ¶æ¬¾äºº" |
| | | align="center" |
| | | fixed |
| | | width="110" |
| | | > |
| | | <el-table-column prop="personname" slot="" label="æ¶æ¬¾äºº" align="center" fixed width="110"> |
| | | <template slot-scope="scope"> |
| | | <el-select |
| | | v-model="scope.row.personname" |
| | | clearable |
| | | filterable |
| | | allow-create |
| | | ref="getReportname" |
| | | default-first-option |
| | | placeholder="è¯·éæ©" |
| | | @change="getAccountinfo2(scope.row, scope.row.persontype)" |
| | | > |
| | | <el-option |
| | | v-for="item in personsSel" |
| | | :key="item.reportNo" |
| | | :label="item.reportName" |
| | | :value="item.reportName" |
| | | > |
| | | <el-select v-model="scope.row.personname" clearable filterable allow-create ref="getReportname" |
| | | default-first-option placeholder="è¯·éæ©" @change="getAccountinfo2(scope.row, scope.row.persontype)"> |
| | | <el-option v-for="item in personsSel" :key="item.reportNo" :label="item.reportName" |
| | | :value="item.reportName"> |
| | | </el-option> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="bankname" |
| | | slot="" |
| | | label="é¶è¡åç§°" |
| | | align="center" |
| | | fixed |
| | | width="200" |
| | | > |
| | | <el-table-column prop="bankname" slot="" label="é¶è¡åç§°" align="center" fixed width="200"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.bankname" placeholder="é¶è¡åç§°" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="bankcardno" |
| | | slot="" |
| | | label="é¶è¡å¡å·" |
| | | align="center" |
| | | fixed |
| | | width="200" |
| | | > |
| | | <el-table-column prop="bankcardno" slot="" label="é¶è¡å¡å·" align="center" fixed width="200"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | v-model="scope.row.bankcardno" |
| | | placeholder="é¶è¡å¡å·" |
| | | /> |
| | | <el-input v-model="scope.row.bankcardno" placeholder="é¶è¡å¡å·" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="amount" |
| | | slot="" |
| | | label="ææ¬¾éé¢" |
| | | align="center" |
| | | fixed |
| | | width="130" |
| | | > |
| | | <el-table-column prop="amount" slot="" label="ææ¬¾éé¢" align="center" fixed width="130"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.amount" placeholder="ææ¬¾éé¢" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="remark" |
| | | slot="" |
| | | label="请款说æ" |
| | | align="center" |
| | | fixed |
| | | width="280" |
| | | > |
| | | <el-table-column prop="remark" slot="" label="请款说æ" align="center" fixed width="280"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.remark" placeholder="说æ" /> |
| | | </template> </el-table-column |
| | | ><el-table-column |
| | | prop="paiddate" |
| | | slot="" |
| | | label="ææ¬¾æ¥æ" |
| | | fixed |
| | | align="center" |
| | | width="150" |
| | | > |
| | | </template> </el-table-column><el-table-column prop="paiddate" slot="" label="ææ¬¾æ¥æ" fixed align="center" |
| | | width="150"> |
| | | <template slot-scope="scope"> |
| | | <el-date-picker |
| | | clearable |
| | | size="small" |
| | | style="width: 100%" |
| | | v-model="scope.row.paiddate" |
| | | type="date" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="ææ¬¾æ¥æ" |
| | | :disabled="true" |
| | | > |
| | | <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.paiddate" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="ææ¬¾æ¥æ" :disabled="true"> |
| | | </el-date-picker> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="æä½" |
| | | align="center" |
| | | width="100" |
| | | v-if="dialogType == 'edit'" |
| | | > |
| | | <el-table-column label="æä½" align="center" width="100" v-if="dialogType == 'edit'"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | type="text" |
| | | size="mini" |
| | | @click="addPayeeRow(scope.$index)" |
| | | >æ°å¢</el-button |
| | | > |
| | | <el-button |
| | | @click.native.prevent=" |
| | | deletePayeeRow(scope.$index, rbPayees, scope.row) |
| | | " |
| | | type="text" |
| | | size="small" |
| | | > |
| | | <el-button type="text" size="mini" @click="addPayeeRow(scope.$index)">æ°å¢</el-button> |
| | | <el-button @click.native.prevent=" |
| | | deletePayeeRow(scope.$index, rbPayees, scope.row) |
| | | " type="text" size="small"> |
| | | å é¤ |
| | | </el-button> |
| | | </template> |
| | |
| | | --> |
| | | <el-form-item label="æä»¶ä¸ä¼ " align="left" prop="annexfiles"> |
| | | <!-- <file-upload ref="fileUpload" :fileType=fileType :limit="1" :on-success="handleUploadSuccess"></file-upload> --> |
| | | <el-upload |
| | | size="mini" |
| | | class="upload-demo" |
| | | :action="uploadFileUrl" |
| | | :file-list="fileList" |
| | | multiple |
| | | :limit="20" |
| | | :headers="headers" |
| | | :on-success=" |
| | | (response, file, fileList) => |
| | | <el-upload size="mini" class="upload-demo" :action="uploadFileUrl" :file-list="fileList" multiple |
| | | :limit="20" :headers="headers" :on-success="(response, file, fileList) => |
| | | uploadSccess(response, file, fileList) |
| | | " |
| | | :on-preview="downFile" |
| | | :disabled="dialogType == 'detail'" |
| | | :on-error="handleUploadError" |
| | | :on-exceed="handleExceed" |
| | | :on-remove="remove" |
| | | accept="image/*,.pdf" |
| | | > |
| | | <el-button |
| | | :disabled="dialogType == 'detail'" |
| | | size="small" |
| | | type="primary" |
| | | >ä¸ä¼ </el-button |
| | | > |
| | | " :on-preview="downFile" :disabled="dialogType == 'detail'" :on-error="handleUploadError" |
| | | :on-exceed="handleExceed" :on-remove="remove" accept="image/*,.pdf"> |
| | | <el-button :disabled="dialogType == 'detail'" size="small" type="primary">ä¸ä¼ </el-button> |
| | | </el-upload> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row v-if="dialogType == 'detail'"> |
| | | <el-table :data="fundflowList" border> |
| | | <el-table-column |
| | | label="å®¡æ ¸äºº" |
| | | align="center" |
| | | width="120" |
| | | prop="checkusername" |
| | | /> |
| | | <el-table-column |
| | | label="å®¡æ ¸æ¥æ" |
| | | align="center" |
| | | width="160" |
| | | prop="createTime" |
| | | /> |
| | | <el-table-column |
| | | label="å®¡æ ¸ç»æ" |
| | | align="center" |
| | | width="200" |
| | | prop="flowconclusion" |
| | | ><template slot-scope="scope" |
| | | ><span v-if="scope.row.flowconclusion == 1">éè¿</span |
| | | ><span v-if="scope.row.flowconclusion == 2" |
| | | >ä¸éè¿</span |
| | | ></template |
| | | > |
| | | <el-table-column label="å®¡æ ¸äºº" align="center" width="120" prop="checkusername" /> |
| | | <el-table-column label="å®¡æ ¸æ¥æ" align="center" width="160" prop="createTime" /> |
| | | <el-table-column label="å®¡æ ¸ç»æ" align="center" width="200" prop="flowconclusion"><template |
| | | slot-scope="scope"><span v-if="scope.row.flowconclusion == 1">éè¿</span><span |
| | | v-if="scope.row.flowconclusion == 2">ä¸éè¿</span></template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="å®¡æ ¸å¤æ³¨" |
| | | align="center" |
| | | prop="flowcontent" |
| | | /> |
| | | <el-table-column label="å®¡æ ¸å¤æ³¨" align="center" prop="flowcontent" /> |
| | | </el-table> |
| | | </el-row> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button |
| | | type="primary" |
| | | @click="submitForm" |
| | | v-if="dialogType == 'edit'" |
| | | >ä¿ å</el-button |
| | | > |
| | | <el-button type="primary" :loading="saveLoading" @click="submitForm" v-if="dialogType == 'edit'">ä¿ å</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | |
| | | import { addorupdateFund } from "@/api/project/fund"; |
| | | import { listReportname, listUser } from "@/api/project/organization"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { moneySum, moneyAdd } from "@/utils/money"; |
| | | export default { |
| | | components: { |
| | | Treeselect, |
| | |
| | | loading: true, |
| | | // 导åºé®ç½©å± |
| | | exportLoading: false, |
| | | // ä¿åæé® loadingï¼é²æ¢éå¤æäº¤ |
| | | saveLoading: false, |
| | | // é䏿°ç» |
| | | ids: [], |
| | | // éå个ç¦ç¨ |
| | |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | itemname: null, |
| | | itemtype: null, |
| | | costtype: null, |
| | | donorname: null, |
| | | starttime: null, |
| | | remark: null, |
| | | departure: null, |
| | | endtime: null, |
| | | destination: null, |
| | | uploadFlag: null, |
| | | uploadTime: null, |
| | | // orderByColumn: "createTime", |
| | | orderByColumn: "id", |
| | | isAsc: "desc" |
| | | }, |
| | | queryParams2: { |
| | |
| | | }, |
| | | |
| | | methods: { |
| | | handleUploadError() {}, |
| | | |
| | | |
| | | handleUploadError() { }, |
| | | |
| | | remove(file) { |
| | | this.fileList.splice(this.fileList.indexOf(file), 1); |
| | |
| | | row.days = ( |
| | | Math.floor( |
| | | Math.abs(Date.parse(row.starttime) - Date.parse(row.endtime)) / |
| | | (1000 * 3600 * 24) |
| | | (1000 * 3600 * 24) |
| | | ) + 1 |
| | | ).toString(); |
| | | } else { |
| | |
| | | if (tempStr == "æå·") { |
| | | row.otherexpense = ""; |
| | | } else if ( |
| | | tempStr == "æå·-æ¡åº" || |
| | | tempStr == "æå·-建德" || |
| | | tempStr == "æå·-æ·³å®" |
| | | tempStr.includes("æ¡åº") || |
| | | tempStr.includes("建德") || |
| | | tempStr.includes("æ·³å®") |
| | | ) { |
| | | row.otherexpense = (parseInt(row.days) * 60).toString(); |
| | | } else { |
| | |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | onpick(e) { |
| | | // console.log(e,this.value1) |
| | | }, |
| | | |
| | | |
| | | gettable(e) { |
| | | const id = e.id; |
| | | getdownload(e.id).then(res => { |
| | |
| | | |
| | | //è·åæ¥éä¸»ä¿¡æ¯ |
| | | const id = row.id || this.ids; |
| | | getReimbursement(id).then(response => { |
| | | this.form = response.data; |
| | | this.fileList = this.form.annexfiles |
| | | ? this.form.annexfiles |
| | | getReimbursement(id) |
| | | .then(async response => { |
| | | this.form = response.data; |
| | | this.fileList = this.form.annexfiles |
| | | ? this.form.annexfiles |
| | | .split(",") |
| | | .map(item => ({ url: item, name: item })) |
| | | : []; |
| | | this.form.recordstatus = response.data.recordstatus + ""; |
| | | : []; |
| | | this.form.recordstatus = response.data.recordstatus + ""; |
| | | |
| | | let ids = response.data.id; |
| | | //è·åæ¥éæç»ä¿¡æ¯ |
| | | getReimbursementdetaillist(ids).then(res => { |
| | | this.rbDetails = res.data; |
| | | const ids = response.data.id; |
| | | this.queryParamsPayee.rbid = ids; |
| | | |
| | | //æç»ä¸ææ¬¾ä¿¡æ¯äºä¸ä¾èµï¼å¹¶åè·åï¼åå°çå¾
æ¶é´ |
| | | const [detailRes, payeeRes] = await Promise.all([ |
| | | getReimbursementdetaillist(ids), |
| | | listReimbursementpayee(this.queryParamsPayee) |
| | | ]); |
| | | |
| | | this.rbDetails = detailRes.data; |
| | | if (this.rbDetails.length == 0) { |
| | | this.addDetailRow(0); |
| | | } |
| | |
| | | |
| | | //宿¶å计éé¢ |
| | | //this.sumTotalFee(); |
| | | }); |
| | | |
| | | //è·åæ¥éææ¬¾ä¿¡æ¯ |
| | | this.queryParamsPayee.rbid = ids; |
| | | listReimbursementpayee(this.queryParamsPayee).then(res => { |
| | | this.rbPayees = res.rows; |
| | | this.rbPayees = payeeRes.rows; |
| | | if (this.rbPayees.length == 0) { |
| | | this.addPayeeRow(0); |
| | | } |
| | | }) |
| | | .catch(() => { |
| | | this.$modal.msgError("æ¥éåä¿¡æ¯å 载失败ï¼è¯·éè¯ï¼"); |
| | | }); |
| | | }); |
| | | }, |
| | | |
| | | /** æ¥çæé®æä½ */ |
| | |
| | | this.open = true; |
| | | const id = row.id || this.ids; |
| | | |
| | | getReimbursement(id).then(response => { |
| | | this.form = response.data; |
| | | //éä»¶ |
| | | this.fileList = this.form.annexfiles |
| | | ? this.form.annexfiles |
| | | getReimbursement(id) |
| | | .then(async response => { |
| | | this.form = response.data; |
| | | //éä»¶ |
| | | this.fileList = this.form.annexfiles |
| | | ? this.form.annexfiles |
| | | .split(",") |
| | | .map(item => ({ url: item, name: item })) |
| | | : []; |
| | | : []; |
| | | |
| | | //å®¡æ ¸ç¶æ |
| | | this.form.recordstatus = response.data.recordstatus + ""; |
| | | //å®¡æ ¸ç¶æ |
| | | this.form.recordstatus = response.data.recordstatus + ""; |
| | | |
| | | let ids = response.data.id; |
| | | let listFundflowparams = { |
| | | fundid: row.id, |
| | | fundtype: 1 |
| | | }; |
| | | listFundflow(listFundflowparams).then(res => { |
| | | this.fundflowList = res.rows; |
| | | }); |
| | | const ids = response.data.id; |
| | | const listFundflowparams = { |
| | | fundid: row.id, |
| | | fundtype: 1 |
| | | }; |
| | | this.queryParamsPayee.rbid = ids; |
| | | |
| | | //æ¥éæç» |
| | | getReimbursementdetaillist(ids).then(res => { |
| | | this.rbDetails = res.data; |
| | | /* |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | this.rbDetails[i].index = i; |
| | | this.rbDetails[i].searchAddress = { |
| | | sheng: this.rbDetails[i].travelprovincename, |
| | | shi: this.rbDetails[i].travelcityname, |
| | | qu: this.rbDetails[i].traveltownname, |
| | | }; |
| | | } |
| | | */ |
| | | }); |
| | | //èµéæµæ°´ãæ¥éæç»ãææ¬¾ä¿¡æ¯äºä¸ä¾èµï¼å¹¶åè·å |
| | | const [fundflowRes, detailRes, payeeRes] = await Promise.all([ |
| | | listFundflow(listFundflowparams), |
| | | getReimbursementdetaillist(ids), |
| | | listReimbursementpayee(this.queryParamsPayee) |
| | | ]); |
| | | |
| | | if (this.rbDetails.length > 0) this.sumTotalFee(); |
| | | this.fundflowList = fundflowRes.rows; |
| | | this.rbDetails = detailRes.data; |
| | | |
| | | //仿¬¾ä¿¡æ¯ |
| | | this.queryParamsPayee.rbid = ids; |
| | | listReimbursementpayee(this.queryParamsPayee).then(res => { |
| | | this.rbPayees = res.rows; |
| | | //æç»å è½½å®æåå计ç®å计ï¼ä¿®å¤å代ç 卿ç»è¿ååå°± sumTotalFee çç«æé®é¢ |
| | | if (this.rbDetails.length > 0) this.sumTotalFee(); |
| | | |
| | | //仿¬¾ä¿¡æ¯ |
| | | this.rbPayees = payeeRes.rows; |
| | | if (this.rbPayees.length == 0) { |
| | | this.addPayeeRow(0); |
| | | } |
| | | }) |
| | | .catch(() => { |
| | | this.$modal.msgError("æ¥éåä¿¡æ¯å 载失败ï¼è¯·éè¯ï¼"); |
| | | }); |
| | | }); |
| | | }, |
| | | |
| | | /** æäº¤æé® */ |
| | | submitForm() { |
| | | this.$refs["form"].validate(valid => { |
| | | if (valid) { |
| | | //鲿¢éå¤æäº¤ï¼ä¿åä¸ç´æ¥å¿½ç¥å次ç¹å» |
| | | if (this.saveLoading) return; |
| | | this.$refs["form"].validate(async valid => { |
| | | if (!valid) return; |
| | | /** |
| | | let indexErrTime = this.rbDetails.findIndex((item) => { |
| | | if (item.endtime && item.starttime) { |
| | |
| | | } |
| | | */ |
| | | |
| | | try { |
| | | this.saveLoading = true; |
| | | //éä»¶æä»¶å¤ç |
| | | let list = this.fileList; |
| | | if (list.length > 0) { |
| | |
| | | const rbDetails = [...this.rbDetails]; |
| | | const rbPayees = [...this.rbPayees]; |
| | | if (this.form.id != null) { |
| | | updateReimbursement(this.form) |
| | | .then(res => { |
| | | //ä¿åæç» |
| | | for (let i = 0; i < rbDetails.length; i++) { |
| | | if (rbDetails[i].rbid != null) { |
| | | updateReimbursementdetail(rbDetails[i]); |
| | | } else { |
| | | //rbidå
³è主表Id |
| | | rbDetails[i].rbid = this.form.id; |
| | | addReimbursementdetail(rbDetails[i]); |
| | | } |
| | | } |
| | | //第1æ¥ï¼æ´æ°ä¸»è¡¨ï¼æåååå¤çå表 |
| | | await updateReimbursement(this.form); |
| | | |
| | | //ä¿åè´¦æ· |
| | | for (let i = 0; i < rbPayees.length; i++) { |
| | | if (rbPayees[i].rbid != null) { |
| | | updateReimbursementpayee(rbPayees[i]); |
| | | } else { |
| | | //rbidå
³è主表Id |
| | | rbPayees[i].rbid = this.form.id; |
| | | addReimbursementpayee(rbPayees[i]); |
| | | } |
| | | //第2æ¥ï¼å¹¶åä¿åæç»ï¼çå¾
å
¨é¨å®æï¼ä»»ä¸å¤±è´¥åèµ° catch æç¤º |
| | | await Promise.all( |
| | | rbDetails.map(detail => { |
| | | if (detail.rbid != null) { |
| | | return updateReimbursementdetail(detail); |
| | | } |
| | | |
| | | this.$modal.msgSuccess("ä¿®æ¹æ¥éåä¿åæå!"); |
| | | this.open = false; |
| | | this.getList(); |
| | | //rbidå
³è主表Id |
| | | detail.rbid = this.form.id; |
| | | return addReimbursementdetail(detail); |
| | | }) |
| | | .catch(err => { |
| | | this.$modal.msgError("ä¿®æ¹æ¥éåä¿å失败ï¼"); |
| | | }); |
| | | ); |
| | | |
| | | //第3æ¥ï¼å¹¶åä¿åè´¦æ· |
| | | await Promise.all( |
| | | rbPayees.map(payee => { |
| | | if (payee.rbid != null) { |
| | | return updateReimbursementpayee(payee); |
| | | } |
| | | //rbidå
³è主表Id |
| | | payee.rbid = this.form.id; |
| | | return addReimbursementpayee(payee); |
| | | }) |
| | | ); |
| | | |
| | | this.$modal.msgSuccess("ä¿®æ¹æ¥éåä¿åæå!"); |
| | | } else { |
| | | this.form.recordstatus = -1; |
| | | addReimbursement(this.form) |
| | | .then(response => { |
| | | //ä¿åæç» |
| | | for (let i = 0; i < rbDetails.length; i++) { |
| | | //rbidå
³è主表Id |
| | | rbDetails[i].rbid = response.data; |
| | | addReimbursementdetail(rbDetails[i]); |
| | | } |
| | | //第1æ¥ï¼æ°å¢ä¸»è¡¨ï¼è¿å主表Id |
| | | const response = await addReimbursement(this.form); |
| | | |
| | | //ä¿åè´¦å· |
| | | for (let i = 0; i < rbPayees.length; i++) { |
| | | //rbidå
³è主表Id |
| | | rbPayees[i].rbid = response.data; |
| | | addReimbursementpayee(rbPayees[i]); |
| | | } |
| | | |
| | | this.$modal.msgSuccess("æ°å¢æ¥éåä¿åæå!"); |
| | | this.open = false; |
| | | this.getList(); |
| | | //第2æ¥ï¼å¹¶åä¿åæç» |
| | | await Promise.all( |
| | | rbDetails.map(detail => { |
| | | //rbidå
³è主表Id |
| | | detail.rbid = response.data; |
| | | return addReimbursementdetail(detail); |
| | | }) |
| | | .catch(err => { |
| | | this.$modal.msgError("æ°å¢æ¥éåä¿å失败ï¼"); |
| | | }); |
| | | ); |
| | | |
| | | //第3æ¥ï¼å¹¶åä¿åè´¦å· |
| | | await Promise.all( |
| | | rbPayees.map(payee => { |
| | | //rbidå
³è主表Id |
| | | payee.rbid = response.data; |
| | | return addReimbursementpayee(payee); |
| | | }) |
| | | ); |
| | | |
| | | this.$modal.msgSuccess("æ°å¢æ¥éåä¿åæå!"); |
| | | } |
| | | |
| | | //ææä¿åæ¥éª¤å
¨é¨æååæå
³éå¼¹çªå¹¶å·æ°å表 |
| | | this.open = false; |
| | | this.getList(); |
| | | } catch (err) { |
| | | this.$modal.msgError("æ¥éåä¿å失败ï¼è¯·éè¯ï¼"); |
| | | } finally { |
| | | this.saveLoading = false; |
| | | } |
| | | } |
| | | }); |
| | | ); |
| | | }, |
| | | |
| | | /** å é¤æé®æä½ */ |
| | | handleDelete(row) { |
| | | const ids = row.id || this.ids; |
| | | console.log(ids); |
| | | this.$modal |
| | | .confirm("æ¯å¦ç¡®è®¤å é¤è¯¥æ¡è®°å½ï¼") |
| | | .then(function() { |
| | | .then(function () { |
| | | // å é¤detailså
çæ°æ® |
| | | return delReimbursement(ids); |
| | | }) |
| | | .then(() => { |
| | | delReimbursementdetail(ids); |
| | | //çå¾
æç»å é¤å®æååå·æ°å表ï¼é¿å
åè¡¨å·æ°æ¶æç»å°æªå é¤ |
| | | return delReimbursementdetail(ids); |
| | | }) |
| | | .then(() => { |
| | | this.getList(); |
| | | this.$modal.msgSuccess("å 餿å"); |
| | | }) |
| | | .catch(() => {}); |
| | | .catch(() => { }); |
| | | }, |
| | | |
| | | /** å¯¼åºæé®æä½ */ |
| | |
| | | this.$download.name(response.msg); |
| | | this.exportLoading = false; |
| | | }) |
| | | .catch(() => {}); |
| | | .catch(() => { |
| | | //失败æ¶ä¹è¦å¤ä½ loadingï¼å¦åæé®æ°¸ä¹
转å |
| | | this.exportLoading = false; |
| | | }); |
| | | }, |
| | | |
| | | //æ°å¢ä¸è¡ |
| | |
| | | }, |
| | | |
| | | //计ç®ä¸è¡å计 |
| | | //计ç®å½åè¡æ¥éå
容费ç¨å计 |
| | | //计ç®å½åè¡æ¥éå
容费ç¨å计ï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ |
| | | sumRowFee(row) { |
| | | let totalFee = 0; |
| | | if (!isNaN(parseFloat(row.trafficexpense))) { |
| | | totalFee += parseFloat(row.trafficexpense); |
| | | } |
| | | if (!isNaN(parseFloat(row.cityfee))) { |
| | | totalFee += parseFloat(row.cityfee); |
| | | } |
| | | if (!isNaN(parseFloat(row.hotelexpense))) { |
| | | totalFee += parseFloat(row.hotelexpense); |
| | | } |
| | | if (!isNaN(parseFloat(row.otherexpense))) { |
| | | totalFee += parseFloat(row.otherexpense); |
| | | } |
| | | if (!isNaN(parseFloat(row.foodexpenses))) { |
| | | totalFee += parseFloat(row.foodexpenses); |
| | | } |
| | | if (!isNaN(parseFloat(row.foodallowance))) { |
| | | totalFee += parseFloat(row.foodallowance); |
| | | } |
| | | if (!isNaN(parseFloat(row.otherfeeamount))) { |
| | | totalFee += parseFloat(row.otherfeeamount); |
| | | } |
| | | row.total = totalFee; |
| | | row.total = moneySum([ |
| | | row.trafficexpense, |
| | | row.cityfee, |
| | | row.hotelexpense, |
| | | row.otherexpense, |
| | | row.foodexpenses, |
| | | row.foodallowance, |
| | | row.otherfeeamount |
| | | ]); |
| | | |
| | | /* |
| | | if (!isNaN(parseFloat(this.rbDetails[rowIndex].trafficexpense))) { |
| | | totalFee += parseFloat(this.rbDetails[rowIndex].trafficexpense); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[rowIndex].cityfee))) { |
| | | totalFee += parseFloat(this.rbDetails[rowIndex].cityfee); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[rowIndex].hotelexpense))) { |
| | | totalFee += parseFloat(this.rbDetails[rowIndex].hotelexpense); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[rowIndex].otherexpense))) { |
| | | totalFee += parseFloat(this.rbDetails[rowIndex].otherexpense); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[rowIndex].foodexpenses))) { |
| | | totalFee += parseFloat(this.rbDetails[rowIndex].foodexpenses); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[rowIndex].foodallowance))) { |
| | | totalFee += parseFloat(this.rbDetails[rowIndex].foodallowance); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[rowIndex].otherfeeamount))) { |
| | | totalFee += parseFloat(this.rbDetails[rowIndex].otherfeeamount); |
| | | } |
| | | this.rbDetails[rowIndex].total = parseFloat(totalFee).toFixed(2); |
| | | this.$set(this.rbDetails, rowIndex, this.rbDetails[rowIndex]); |
| | | */ |
| | | //éæ°è®¡ç®æ´ä¸ªæ¥éåçå计 |
| | | this.sumTotalFee(); |
| | | }, |
| | | |
| | | //计ç®è´¹ç¨å计 |
| | | sumTotalFee() { |
| | | let allSum = 0; |
| | | |
| | | //æç®è
å®¶å±è´¹ç¨ |
| | | if (!isNaN(parseFloat(this.form.donoramount))) { |
| | | allSum += parseFloat(this.form.donoramount); |
| | | } |
| | | |
| | | //æ¥éæç»è´¹ç¨ |
| | | try { |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | /* |
| | | let totalFee = 0; |
| | | //计ç®å½åæ¥éå
容费ç¨å计 |
| | | if (!isNaN(parseFloat(this.rbDetails[i].total))) { |
| | | totalFee += parseFloat(this.rbDetails[i].total); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].cityfee))) { |
| | | totalFee += parseFloat(this.rbDetails[i].cityfee); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].hotelexpense))) { |
| | | totalFee += parseFloat(this.rbDetails[i].hotelexpense); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].otherexpense))) { |
| | | totalFee += parseFloat(this.rbDetails[i].otherexpense); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].foodexpenses))) { |
| | | totalFee += parseFloat(this.rbDetails[i].foodexpenses); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].foodallowance))) { |
| | | totalFee += parseFloat(this.rbDetails[i].foodallowance); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].otherfeeamount))) { |
| | | totalFee += parseFloat(this.rbDetails[i].otherfeeamount); |
| | | } |
| | | this.rbDetails[i].total = parseFloat(totalFee).toFixed(2); |
| | | this.$set(this.rbDetails, i, this.rbDetails[i]); |
| | | */ |
| | | |
| | | if (!isNaN(parseFloat(this.rbDetails[i].total))) { |
| | | allSum += parseFloat(this.rbDetails[i].total); |
| | | } |
| | | } |
| | | |
| | | this.form.amountrequested = allSum.toFixed(2); |
| | | this.form.amountrequested = moneyAdd( |
| | | moneySum(this.rbDetails, "total"), |
| | | this.form.donoramount |
| | | ).toFixed(2); |
| | | this.form.bigstrmoney = this.convertCurrency(this.form.amountrequested); |
| | | } catch {} |
| | | } catch { } |
| | | }, |
| | | |
| | | //é颿°åè½¬æ¢æå¤§å |
| | |
| | | background: #e8f4ff !important; |
| | | /* color:whitesmoke; */ |
| | | } |
| | | |
| | | .button-delete { |
| | | color: rgb(236, 69, 69); |
| | | } |
| | | |
| | | ::v-deep.el-table .error-row { |
| | | background: #fcebeb; |
| | | } |
| | |
| | | <el-date-picker |
| | | style="width: 100%" |
| | | v-model="form.applyTime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="ç³è¯·æ¥æ" |
| | | :disabled="true" |
| | |
| | | size="small" |
| | | style="width: 100%" |
| | | v-model="scope.row.starttime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="å¼å§æ¥æ" |
| | | @blur="getdays(scope.row)" |
| | |
| | | size="small" |
| | | style="width: 100%" |
| | | v-model="scope.row.endtime" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="ç»ææ¥æ" |
| | | @blur="getdays(scope.row)" |
| | |
| | | <!-- |
| | | <el-table-column prop="paiddate" slot="" label="ææ¬¾æ¥æ" fixed align="center" width="150"> |
| | | <template slot-scope="scope"> |
| | | <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.paiddate" type="date" |
| | | <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.paiddate" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="ææ¬¾æ¥æ" :disabled="true"> |
| | | </el-date-picker> |
| | | </template> |
| | |
| | | import { listReportname, listUser } from "@/api/project/organization"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import debounce from "lodash/debounce"; |
| | | import { moneySum, moneyAdd, moneyRound } from "@/utils/money"; |
| | | import { checkFileName, checkDetails } from "@/utils/fileNameCheck"; |
| | | export default { |
| | | components: { |
| | | Treeselect, |
| | |
| | | }, |
| | | |
| | | //æä»¶ä¸ä¼ æååè° |
| | | /** |
| | | * 2026-10-15ï¼ä¸ä¼ æ¶æ ¡éªéä»¶æä»¶åï¼ä¸å¡è¦æ±ï¼ä¸åæ ¼ç«å³æç¤ºä¸ä¸å å
¥å表ï¼ã |
| | | * è§åä¸å端 AttachmentNameValidator åå£å¾ï¼å¿
é¡»å«ä¸æ / 廿æ©å±åå主干 â¤20 å / |
| | | * ä¸å«ç©ºæ ¼å / \ : * ? " < > | # % çç¹æ®å符ã |
| | | */ |
| | | checkUploadFileName(file) { |
| | | const raw = file && file.raw ? file.raw.name : file && file.name; |
| | | const r = checkFileName(raw); |
| | | if (!r.ok) { |
| | | this.$modal.msgError(r.msg); |
| | | return false; |
| | | } |
| | | return true; |
| | | }, |
| | | |
| | | /** |
| | | * 2026-10-15ï¼ä¿ååæ ¡éªæ´åæç»éä»¶æä»¶åï¼å«åä¸è¡å
éåï¼ã |
| | | * å£å¾ï¼ä¸å¡ç¡®è®¤ï¼ï¼åªæ ¡éª"æ¬æ¬¡åæ´"çéä»¶ââèåæ®éå·²åå¨çä¸åè§éä»¶åä¸è½æä¿å塿» |
| | | * ï¼å¦åèåæ®æ¹ä¸ä¸ªéé¢é½åä¸è¿å»ï¼ãå端æ id 读æ§è®°å½æ¾è¡åå²éä»¶ï¼å端æ¿ä¸å°"åªäºæ¯åå²" |
| | | * çæå¨ä¿¡æ¯ï¼å æ¤**ä»
æ°å¢åæ®**åä¿å忦æªï¼ç¼è¾èåæ®æ¶æ°å¢çä¸åè§éä»¶ç±åç«¯äºæ¬¡æ ¡éªæ¦ä¸ã |
| | | */ |
| | | checkDetailFileNames() { |
| | | if (this.form && this.form.id) { |
| | | return true; |
| | | } |
| | | const c = checkDetails(this.rbDetails); |
| | | if (!c.ok) { |
| | | this.$modal.msgError(c.msg); |
| | | return false; |
| | | } |
| | | return true; |
| | | }, |
| | | |
| | | uploadSccess(response, file, fileList) { |
| | | if (!this.checkUploadFileName(file)) { |
| | | return; |
| | | } |
| | | this.rbDetails; |
| | | const config = { |
| | | headers: { Authorization: "Bearer " + this.ICDtoken } |
| | |
| | | name: file.name, |
| | | url: URL.createObjectURL(blob) |
| | | }); |
| | | // console.log(file.response.url); |
| | | // console.log(file); |
| | | |
| | | this.pdfimgsrcList.push(file.response.url); |
| | | this.fileListto.push({ |
| | | name: file.response.fileName, |
| | | url: file.response.url |
| | | }); |
| | | // 2026-10-15ï¼å é¤è¿éçç¬¬äºæ¬¡ pushã忥䏿¬¡ä¸ä¼ ä¼å fileListto / pdfimgsrcList |
| | | // åå两æ¡ï¼ä¸ç¬¬äºæ¡ç name åçæ¯ file.response.fileNameï¼åå¨è·¯å¾ï¼ï¼è remove() |
| | | // 伿æ´ä¸ª fileListto ååå° rbDetails[atpresent].annexfilesListï¼å¯¼è´æç»éä»¶é |
| | | // æ··å
¥è·¯å¾å½¢æç nameï¼è¢«éä»¶æä»¶åæ ¡éªè¯¯æ¦ï¼å端没æ"è·¯å¾å½¢æè·³è¿"è±å
ï¼ï¼ |
| | | // åæ¶ç¥¨æ®å表ä¼å¤åºä¸è¡ã |
| | | console.log(URL.createObjectURL(blob), "ur转æ¢"); |
| | | }) |
| | | .catch(error => { |
| | |
| | | if (tempStr == "æå·") { |
| | | row.otherexpense = ""; |
| | | } else if ( |
| | | tempStr == "æå·-æ¡åº" || |
| | | tempStr == "æå·-建德" || |
| | | tempStr == "æå·-æ·³å®" |
| | | tempStr.includes("æ¡åº") || |
| | | tempStr.includes("建德") || |
| | | tempStr.includes("æ·³å®") |
| | | ) { |
| | | row.otherexpense = (parseInt(row.days) * 60).toString(); |
| | | } else { |
| | |
| | | .map(item => ({ url: item, name: item })) |
| | | : []; |
| | | //å®¡æ ¸ç¶æ |
| | | this.form.recordstatus = response.data.recordstatus + ""; |
| | | this.form.recordstatus = this.toStatusText(response.data.recordstatus, "-1"); |
| | | let ids = response.data.id; |
| | | let listFundflowparams = { |
| | | fundid: ids, |
| | |
| | | }); |
| | | |
| | | //æ¥éæç» |
| | | getReimbursementdetaillist(ids).then(res => { |
| | | this.rbDetails = res.data; |
| | | //åè®¡è´¹ç¨ |
| | | // if (this.rbDetails.length > 0) this.sumTotalFee(); |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | this.sumRowFee(this.rbDetails[i]); |
| | | } |
| | | }); |
| | | getReimbursementdetaillist(ids) |
| | | .then(res => { |
| | | this.rbDetails = this.normalizeDetailList(res); |
| | | //åè®¡è´¹ç¨ |
| | | // if (this.rbDetails.length > 0) this.sumTotalFee(); |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | this.sumRowFee(this.rbDetails[i]); |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | this.rbDetails = []; |
| | | console.error("è·åæ¥éæç»å¤±è´¥,id=" + ids, err); |
| | | }); |
| | | |
| | | //仿¬¾ä¿¡æ¯ |
| | | this.queryParamsPayee.rbid = ids; |
| | |
| | | getReimbursement(id).then(response => { |
| | | this.form = response.data; |
| | | console.log(this.form.checkstatus, "checkstatus"); |
| | | this.form.checkstatus = this.form.checkstatus.toString(); |
| | | // checkstatus å¨åºä¸å¯ä¸ºç©ºï¼é¢å®¡ç¶æå°æªäº§çæ¶ï¼ï¼ç´æ¥ toString 伿 TypeError 䏿åç»åæ° |
| | | this.form.checkstatus = this.toStatusText(this.form.checkstatus, "-1"); |
| | | |
| | | //ç¥¨æ® |
| | | this.fileListto = this.form.annexfiles |
| | |
| | | }); |
| | | |
| | | //æ¥éæç» |
| | | getReimbursementdetaillist(ids).then(res => { |
| | | this.rbDetails = res.data; |
| | | console.log(this.rbDetails); |
| | | getReimbursementdetaillist(ids) |
| | | .then(res => { |
| | | this.rbDetails = this.normalizeDetailList(res); |
| | | console.log("æ¥éæç»è¡æ°ï¼", this.rbDetails.length, this.rbDetails); |
| | | |
| | | //åè®¡è´¹ç¨ |
| | | // if (this.rbDetails.length > 0) this.sumTotalFee(); |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | this.sumRowFee(this.rbDetails[i]); |
| | | } |
| | | }); |
| | | //åè®¡è´¹ç¨ |
| | | // if (this.rbDetails.length > 0) this.sumTotalFee(); |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | this.sumRowFee(this.rbDetails[i]); |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | // åæ°å¤±è´¥æ¶ä¸åéé»ï¼ç½®ç©ºå¹¶æåºåå ï¼é¿å
âæ¥å£ææ°æ®ä½é¡µé¢ç©ºç½âæ ä»ææ¥ |
| | | this.rbDetails = []; |
| | | console.error("è·åæ¥éæç»å¤±è´¥,id=" + ids, err); |
| | | }); |
| | | |
| | | //仿¬¾ä¿¡æ¯ |
| | | this.queryParamsPayee.rbid = ids; |
| | |
| | | this.continueOrExit(); |
| | | } else { |
| | | this.$modal.closeLoading(); |
| | | if (res.msg) { |
| | | this.$modal.msgError("æä½å¤±è¯¯"); |
| | | } else { |
| | | this.$modal.msgError(res.msg); |
| | | } |
| | | this.$modal.msgError(res.msg || "æä½å¤±è´¥"); |
| | | } |
| | | }); |
| | | }, |
| | |
| | | |
| | | /** æäº¤ä¿åæé® */ |
| | | submitForm: debounce(function (data) { |
| | | // 2026-10-15ï¼ä¿ååéä»¶æä»¶åè§èæ ¡éªï¼ä»
æ°å¢åæ®ï¼èåæ®çåå²éä»¶ç±å端æ"åªæ ¡éªæ¬æ¬¡åæ´"æ¾è¡ï¼ |
| | | if (!this.checkDetailFileNames()) { |
| | | return; |
| | | } |
| | | |
| | | this.$refs["form"].validate(valid => { |
| | | if (valid) { |
| | | //ç¥¨æ®æä»¶å¤ç |
| | |
| | | }, |
| | | // æ¥åæéç«å»ä¿å |
| | | Savenow() { |
| | | // 2026-10-15ï¼ä¿ååéä»¶æä»¶åè§èæ ¡éªï¼ä»
æ°å¢åæ®ï¼èåæ®çåå²éä»¶ç±å端æ"åªæ ¡éªæ¬æ¬¡åæ´"æ¾è¡ï¼ |
| | | if (!this.checkDetailFileNames()) { |
| | | return; |
| | | } |
| | | |
| | | this.Savereminder = false; |
| | | this.Reminderquantity = 0; |
| | | this.totalquantity = 0; |
| | |
| | | }); |
| | | }, |
| | | |
| | | //计ç®ä¸è¡å计 |
| | | //计ç®å½åè¡æ¥éå
容费ç¨å计 |
| | | sumRowFee(row) { |
| | | let totalFee = 0; |
| | | if (!isNaN(parseFloat(row.trafficexpense))) { |
| | | totalFee += parseFloat(row.trafficexpense); |
| | | /** |
| | | * ç¶æç±»åæ®µè½¬åç¬¦ä¸²ï¼æ¥å£å¯è½è¿å nullï¼ã |
| | | * |
| | | * èæ¯ï¼checkstatusãrecordstatus çå¨åºä¸å¯ç©ºï¼æ©æç´æ¥è°ç¨ .toString() |
| | | * 伿 TypeError 并䏿å
¶åçåæ°é»è¾ï¼è¡¨ç°ä¸ºâæ¥å£å·²ææ°æ®ä½æç»åºç©ºç½âã |
| | | * |
| | | * @param {*} value åå§ç¶æå¼ |
| | | * @param {string} fallback 为空æ¶çå
åºå¼ |
| | | * @returns {string} |
| | | */ |
| | | toStatusText(value, fallback) { |
| | | if (value === null || value === undefined || value === "") { |
| | | return fallback; |
| | | } |
| | | if (!isNaN(parseFloat(row.cityfee))) { |
| | | totalFee += parseFloat(row.cityfee); |
| | | } |
| | | if (!isNaN(parseFloat(row.hotelexpense))) { |
| | | totalFee += parseFloat(row.hotelexpense); |
| | | } |
| | | if (!isNaN(parseFloat(row.otherexpense))) { |
| | | totalFee += parseFloat(row.otherexpense); |
| | | } |
| | | if (!isNaN(parseFloat(row.foodexpenses))) { |
| | | totalFee += parseFloat(row.foodexpenses); |
| | | } |
| | | if (!isNaN(parseFloat(row.foodallowance))) { |
| | | totalFee += parseFloat(row.foodallowance); |
| | | } |
| | | if (!isNaN(parseFloat(row.otherfeeamount))) { |
| | | totalFee += parseFloat(row.otherfeeamount); |
| | | } |
| | | row.total = totalFee.toFixed(2); |
| | | return String(value); |
| | | }, |
| | | |
| | | /* |
| | | if (!isNaN(parseFloat(this.rbDetails[rowIndex].trafficexpense))) { |
| | | totalFee += parseFloat(this.rbDetails[rowIndex].trafficexpense); |
| | | /** |
| | | * ç»ä¸ä»æç»æ¥å£ååºä¸ååºæ°ç»ã |
| | | * |
| | | * æ£å¸¸ä¸º AjaxResult ç data æ°ç»ï¼è¥å端æ¹ä¸ºåé¡µç»æï¼total + rowsï¼ï¼ |
| | | * res.data å°ä¸æ¯æ°ç»ï¼ç´æ¥ç»å®å° el-table ä¼å¯¼è´âææ°æ®ä½ä¸æ¾ç¤ºâã |
| | | * |
| | | * @param {Object} res æ¥å£åå§ååº |
| | | * @returns {Array} æç»æ°ç»ï¼å¼å¸¸æ¶ä¸ºç©ºæ°ç»ï¼ä¸ä¼è®©è¡¨æ ¼æ¿å°éæ°ç»ï¼ |
| | | */ |
| | | normalizeDetailList(res) { |
| | | if (!res) { |
| | | return []; |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[rowIndex].cityfee))) { |
| | | totalFee += parseFloat(this.rbDetails[rowIndex].cityfee); |
| | | if (Array.isArray(res.data)) { |
| | | return res.data; |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[rowIndex].hotelexpense))) { |
| | | totalFee += parseFloat(this.rbDetails[rowIndex].hotelexpense); |
| | | if (Array.isArray(res.rows)) { |
| | | return res.rows; |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[rowIndex].otherexpense))) { |
| | | totalFee += parseFloat(this.rbDetails[rowIndex].otherexpense); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[rowIndex].foodexpenses))) { |
| | | totalFee += parseFloat(this.rbDetails[rowIndex].foodexpenses); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[rowIndex].foodallowance))) { |
| | | totalFee += parseFloat(this.rbDetails[rowIndex].foodallowance); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[rowIndex].otherfeeamount))) { |
| | | totalFee += parseFloat(this.rbDetails[rowIndex].otherfeeamount); |
| | | } |
| | | this.rbDetails[rowIndex].total = parseFloat(totalFee).toFixed(2); |
| | | this.$set(this.rbDetails, rowIndex, this.rbDetails[rowIndex]); |
| | | */ |
| | | return []; |
| | | }, |
| | | |
| | | //计ç®ä¸è¡å计 |
| | | //计ç®å½åè¡æ¥éå
容费ç¨å计ï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ |
| | | sumRowFee(row) { |
| | | const totalFee = moneySum([ |
| | | row.trafficexpense, |
| | | row.cityfee, |
| | | row.hotelexpense, |
| | | row.otherexpense, |
| | | row.foodexpenses, |
| | | row.foodallowance, |
| | | row.otherfeeamount |
| | | ]); |
| | | row.total = moneyRound(totalFee).toFixed(2); |
| | | |
| | | //éæ°è®¡ç®æ´ä¸ªæ¥éåçå计 |
| | | this.sumTotalFee(); |
| | | }, |
| | | |
| | | //计ç®è´¹ç¨å计 |
| | | sumTotalFee() { |
| | | let allSum = 0; |
| | | |
| | | //æç®è
å®¶å±è´¹ç¨ |
| | | if (!isNaN(parseFloat(this.form.donoramount))) { |
| | | allSum += parseFloat(this.form.donoramount); |
| | | } |
| | | |
| | | //æ¥éæç»è´¹ç¨ |
| | | try { |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | /* |
| | | let totalFee = 0; |
| | | //计ç®å½åæ¥éå
容费ç¨å计 |
| | | if (!isNaN(parseFloat(this.rbDetails[i].total))) { |
| | | totalFee += parseFloat(this.rbDetails[i].total); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].cityfee))) { |
| | | totalFee += parseFloat(this.rbDetails[i].cityfee); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].hotelexpense))) { |
| | | totalFee += parseFloat(this.rbDetails[i].hotelexpense); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].otherexpense))) { |
| | | totalFee += parseFloat(this.rbDetails[i].otherexpense); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].foodexpenses))) { |
| | | totalFee += parseFloat(this.rbDetails[i].foodexpenses); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].foodallowance))) { |
| | | totalFee += parseFloat(this.rbDetails[i].foodallowance); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].otherfeeamount))) { |
| | | totalFee += parseFloat(this.rbDetails[i].otherfeeamount); |
| | | } |
| | | this.rbDetails[i].total = parseFloat(totalFee).toFixed(2); |
| | | this.$set(this.rbDetails, i, this.rbDetails[i]); |
| | | */ |
| | | |
| | | if (!isNaN(parseFloat(this.rbDetails[i].total))) { |
| | | allSum += parseFloat(this.rbDetails[i].total); |
| | | } |
| | | } |
| | | |
| | | this.form.amountrequested = allSum.toFixed(2); |
| | | this.form.amountrequested = moneyAdd( |
| | | moneySum(this.rbDetails, "total"), |
| | | this.form.donoramount |
| | | ).toFixed(2); |
| | | this.form.bigstrmoney = this.convertCurrency(this.form.amountrequested); |
| | | } catch { } |
| | | }, |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px"> |
| | | <el-row> |
| | | <el-col :span="5"> |
| | | <el-form-item label="æç®æ¡ä¾" prop="name"> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-row> <el-col :span="5"> |
| | | <el-form-item label="æ¥éç±»å«" prop="costtype"> |
| | | <el-input v-model="queryParams.costtype" placeholder="è¯·éæ©æ¥éç±»å«" clearable size="small" v-if="0" |
| | | @keyup.enter.native="handleQuery" /> |
| | | <el-select v-model="queryParams.costtype" placeholder="è¯·éæ©æ¥éç±»å«" clearable size="small"> |
| | | <el-option v-for="dict in dict.type.sys_travelexpensebelong" :key="dict.value" :label="dict.label" |
| | | :value="dict.label" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="5"> |
| | | <el-form-item label="ç»å人" prop="username"> |
| | | <el-input v-model="queryParams.username" placeholder="请è¾å
¥æ¥é人" clearable size="small" |
| | |
| | | @keyup.enter.native="handleQuery" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="8"> |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="applyTime"> |
| | | <el-date-picker format="yyyy-MM-dd" value-format="yyyy-MM-dd" v-model="value1" type="daterange" |
| | | <el-date-picker format="yyyy-MM-dd" value-format="yyyy-MM-dd HH:mm:ss" v-model="value1" type="daterange" |
| | | @blur="onpick" range-separator="è³" start-placeholder="æ¥éç³è¯·å¼å§æ¥æ" end-placeholder="æ¥éç³è¯·ç»ææ¥æ" |
| | | @keyup.enter.native="handleQuery"> |
| | | </el-date-picker> |
| | |
| | | <el-row> |
| | | <el-col :span="5"> |
| | | <el-form-item label="ç³è¯·æ¥æ" prop="applyTime"> |
| | | <el-date-picker style="width: 100%" v-model="form.applyTime" :disabled="true" type="date" |
| | | <el-date-picker style="width: 100%" v-model="form.applyTime" :disabled="true" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="ç³è¯·æ¥æ"> |
| | | </el-date-picker> |
| | | </el-form-item> |
| | |
| | | ); |
| | | } |
| | | } |
| | | }" clearable size="small" style="width: 100%" v-model="scope.row.starttime" type="date" |
| | | }" clearable size="small" style="width: 100%" v-model="scope.row.starttime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="å¼å§æ¥æ" @blur="getallowance(scope.row)"> |
| | | </el-date-picker> |
| | | </template> |
| | |
| | | ); |
| | | } |
| | | } |
| | | }" clearable size="small" style="width: 100%" v-model="scope.row.endtime" type="date" |
| | | }" clearable size="small" style="width: 100%" v-model="scope.row.endtime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="ç»ææ¥æ" @blur="getallowance(scope.row)"> |
| | | </el-date-picker> |
| | | </template> |
| | |
| | | </template> </el-table-column><el-table-column prop="paiddate" slot="" label="ææ¬¾æ¥æ" fixed align="center" |
| | | width="150"> |
| | | <template slot-scope="scope"> |
| | | <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.paiddate" type="date" |
| | | <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.paiddate" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="ææ¬¾æ¥æ" :disabled="true" |
| | | @blur="getallowance(scope.row)"> |
| | | </el-date-picker> |
| | |
| | | <!-- <file-upload ref="fileUpload" :fileType=fileType :limit="1" :on-success="handleUploadSuccess"></file-upload> --> |
| | | <el-upload size="mini" class="upload-demo" :action="uploadFileUrl" :file-list="fileList" multiple |
| | | :limit="20" :headers="headers" :on-success="(response, file, fileList) => |
| | | uploadSccess(response, file, fileList) |
| | | uploadSccess(response, file, fileList) |
| | | " :on-preview="downFile" :disabled="dialogType == 'detail'" :on-error="handleUploadError" |
| | | :on-exceed="handleExceed" :on-remove="remove" accept="image/*,.pdf"> |
| | | <el-button :disabled="dialogType == 'detail'" size="small" type="primary">ä¸ä¼ </el-button> |
| | |
| | | </el-row> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="checksubmit" v-if="dialogType == 'edit'">ä¿ å</el-button> |
| | | <el-button type="primary" :loading="checkSubmitLoading" :disabled="checkSubmitLoading" @click="checksubmit" v-if="dialogType == 'edit'">ä¿ å</el-button> |
| | | <el-button @click="cancel">å æ¶</el-button> |
| | | </div> |
| | | </el-dialog> |
| | |
| | | import { getUserProfile } from "@/api/system/user"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { setItem, grtItem, removeItem } from "@/utils/storage.js"; |
| | | import { moneySum } from "@/utils/money"; |
| | | |
| | | export default { |
| | | components: { |
| | |
| | | ], |
| | | data() { |
| | | return { |
| | | checkSubmitLoading: false, |
| | | checkObj: { |
| | | flowlevelone: null, |
| | | flowconclusion: null, |
| | |
| | | }, |
| | | |
| | | checksubmit() { |
| | | if (this.checkSubmitLoading) return; |
| | | let checkfundobj = { |
| | | flowconclusion: this.checkObj.flowlevelone, |
| | | flowcontent: this.checkObj.flowconclusion, |
| | |
| | | return; |
| | | } |
| | | |
| | | this.checkSubmitLoading = true; |
| | | checkfund(checkfundobj).then(res => { |
| | | this.checkSubmitLoading = false; |
| | | if (res.code == 200) { |
| | | this.reset(); |
| | | this.open = false; |
| | |
| | | this.$modal.msgSuccess("å®¡æ ¸å®æ!"); |
| | | } else { |
| | | this.open = false; |
| | | if (res.msg) { |
| | | this.$modal.msgError("æä½å¤±è¯¯"); |
| | | } else { |
| | | this.$modal.msgError(res.msg); |
| | | } |
| | | this.$modal.msgError(res.msg || "æä½å¤±è´¥"); |
| | | } |
| | | }); |
| | | }, |
| | |
| | | }); |
| | | }, |
| | | |
| | | //计ç®è´¹ç¨å计 |
| | | //计ç®è´¹ç¨å计ï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ç¦æ¢ parseFloat ç´¯å ï¼ |
| | | sumTotalFee(scope) { |
| | | let allSum = 0; |
| | | try { |
| | | for (let i = 0; i < this.rbDetails.length; i++) { |
| | | let totalFee = 0; |
| | | const row = this.rbDetails[i]; |
| | | //计ç®å½åæ¥éå
容费ç¨å计 |
| | | if (!isNaN(parseFloat(this.rbDetails[i].trafficexpense))) { |
| | | totalFee += parseFloat(this.rbDetails[i].trafficexpense); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].cityfee))) { |
| | | totalFee += parseFloat(this.rbDetails[i].cityfee); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].hotelexpense))) { |
| | | totalFee += parseFloat(this.rbDetails[i].hotelexpense); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].otherexpense))) { |
| | | totalFee += parseFloat(this.rbDetails[i].otherexpense); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].foodexpenses))) { |
| | | totalFee += parseFloat(this.rbDetails[i].foodexpenses); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].foodallowance))) { |
| | | totalFee += parseFloat(this.rbDetails[i].foodallowance); |
| | | } |
| | | if (!isNaN(parseFloat(this.rbDetails[i].otherfeeamount))) { |
| | | totalFee += parseFloat(this.rbDetails[i].otherfeeamount); |
| | | } |
| | | this.rbDetails[i].total = parseFloat(totalFee).toFixed(2); |
| | | this.$set(this.rbDetails, scope.$index, this.rbDetails[i]); |
| | | if (!isNaN(parseFloat(this.rbDetails[i].total))) { |
| | | allSum += parseFloat(this.rbDetails[i].total); |
| | | } |
| | | const totalFee = moneySum([ |
| | | row.trafficexpense, |
| | | row.cityfee, |
| | | row.hotelexpense, |
| | | row.otherexpense, |
| | | row.foodexpenses, |
| | | row.foodallowance, |
| | | row.otherfeeamount |
| | | ]); |
| | | row.total = totalFee.toFixed(2); |
| | | this.$set(this.rbDetails, scope.$index, row); |
| | | } |
| | | this.form.amountrequested = allSum.toFixed(2); |
| | | this.form.amountrequested = moneySum(this.rbDetails, "total").toFixed(2); |
| | | this.form.bigstrmoney = this.convertCurrency(this.form.amountrequested); |
| | | } catch { } |
| | | }, |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="120px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="120px"> |
| | | <el-form-item label="å»çæºæ" prop="name"> |
| | | <el-input v-model="queryParams.name" placeholder="请è¾å
¥å»çæºæ" clearable size="small" |
| | | @keyup.enter.native="handleQuery" /> |
| | |
| | | style="width: 100%" |
| | | v-model="scope.row.receiveTime" |
| | | :disabled="true" |
| | | type="date" |
| | | type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="æ¥æ¶æ¥æ" |
| | | > |
| | |
| | | </el-table-column> |
| | | <el-table-column prop="amounttime" align="center" label="æ¶æ¬¾æ¥æ" width="200"> |
| | | <template slot-scope="scope"> |
| | | <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.amounttime" type="date" |
| | | <el-date-picker clearable size="small" style="width: 100%" v-model="scope.row.amounttime" type="date" format="yyyy-MM-dd" |
| | | value-format="yyyy-MM-dd HH:mm:ss" placeholder="æ¶æ¬¾æ¥æ"> |
| | | </el-date-picker> |
| | | </template> |
| | |
| | | <el-row :gutter="20"> |
| | | <!--ç¨æ·æ°æ®--> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="patientqueryParams" |
| | | ref="queryForm" |
| | | size="small" |
| | |
| | | import Li_area_select from "@/components/Address"; |
| | | import { getUserProfile } from "@/api/system/user"; |
| | | import { getToken } from "@/utils/auth"; |
| | | import { moneySum, moneyRound } from "@/utils/money"; |
| | | import debounce from "lodash/debounce"; |
| | | export default { |
| | | components: { |
| | |
| | | this.$modal.msgError("注æå®æ¶éé¢ä¸çäºåºæ¶éé¢ï¼è¯·æ ¸å¯¹æ°æ®ï¼"); |
| | | } |
| | | }, |
| | | //ä¿®æ¹å®æ¶æåºæ¶å触å |
| | | //ä¿®æ¹å®æ¶æåºæ¶å触åï¼éé¢ä¸å¾èµ°ç²¾ç¡®è¿ç®ï¼ |
| | | chargeSum() { |
| | | let ChargeSum = 0; |
| | | let ChargeamountSum = 0; |
| | | |
| | | //è´¹ç¨å计 |
| | | try { |
| | | for (let i = 0; i < this.donorchargeorgans.length; i++) { |
| | | if (!isNaN(parseFloat(this.donorchargeorgans[i].organcharge))) { |
| | | ChargeSum += parseFloat(this.donorchargeorgans[i].organcharge); |
| | | } |
| | | if (!isNaN(parseFloat(this.donorchargeorgans[i].amount))) { |
| | | ChargeamountSum += parseFloat(this.donorchargeorgans[i].amount); |
| | | } |
| | | } |
| | | this.form.receivableamount = ChargeSum.toFixed(2); |
| | | this.form.receivedamount = ChargeamountSum.toFixed(2); |
| | | this.form.receivableamount = moneyRound( |
| | | moneySum(this.donorchargeorgans, "organcharge") |
| | | ).toFixed(2); |
| | | this.form.receivedamount = moneyRound( |
| | | moneySum(this.donorchargeorgans, "amount") |
| | | ).toFixed(2); |
| | | } catch {} |
| | | }, |
| | | |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="ç级åç§°" prop="className"> |
| | | <el-input |
| | | v-model="queryParams.className" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="åæ°åç§°" prop="configName"> |
| | | <el-input |
| | | v-model="queryParams.configName" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form |
| | | class="opo-query-form" |
| | | :model="queryParams" |
| | | ref="queryForm" |
| | | :inline="true" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch"> |
| | | <el-form-item label="é¨é¨åç§°" prop="deptName"> |
| | | <el-input |
| | | v-model="queryParams.deptName" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="åå
¸åç§°" prop="dictType"> |
| | | <el-select v-model="queryParams.dictType" size="small"> |
| | | <el-option |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="åå
¸åç§°" prop="dictName"> |
| | | <el-input |
| | | v-model="queryParams.dictName" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="年级åç§°" prop="gradeName"> |
| | | <el-input |
| | | v-model="queryParams.gradeName" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="å§å" prop="name"> |
| | | <el-input |
| | | v-model="queryParams.name" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch"> |
| | | <el-form-item label="èååç§°" prop="menuName"> |
| | | <el-input |
| | | v-model="queryParams.menuName" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="å
¬åæ é¢" prop="noticeTitle"> |
| | | <el-input |
| | | v-model="queryParams.noticeTitle" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="å²ä½ç¼ç " prop="postCode"> |
| | | <el-input |
| | | v-model="queryParams.postCode" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true"> |
| | | <el-form-item label="ç¨æ·åç§°" prop="userName"> |
| | | <el-input |
| | | v-model="queryParams.userName" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true"> |
| | | <el-form-item label="è§è²åç§°" prop="roleName"> |
| | | <el-input |
| | | v-model="queryParams.roleName" |
| | |
| | | <template> |
| | | <!-- ææç¨æ· --> |
| | | <el-dialog title="éæ©ç¨æ·" :visible.sync="visible" width="800px" top="5vh" append-to-body> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true"> |
| | | <el-form-item label="ç¨æ·åç§°" prop="userName"> |
| | | <el-input |
| | | v-model="queryParams.userName" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="å¦çåç§°" prop="studentName"> |
| | | <el-input |
| | | v-model="queryParams.studentName" |
| | |
| | | </el-col> |
| | | <!--ç¨æ·æ°æ®--> |
| | | <el-col :span="20" :xs="24"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="ç¨æ·åç§°" prop="userName"> |
| | | <el-input |
| | | v-model="queryParams.userName" |
| | |
| | | <template> |
| | | <!-- 导å
¥è¡¨ --> |
| | | <el-dialog title="导å
¥è¡¨" :visible.sync="visible" width="800px" top="5vh" append-to-body> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true"> |
| | | <el-form-item label="表åç§°" prop="tableName"> |
| | | <el-input |
| | | v-model="queryParams.tableName" |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form |
| | | class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> |
| | | <el-form-item label="表åç§°" prop="tableName"> |
| | | <el-input |
| | | v-model="queryParams.tableName" |
| | |
| | | proxy: { |
| | | // detail: https://cli.vuejs.org/config/#devserver-proxy |
| | | [process.env.VUE_APP_BASE_API]: { |
| | | // target:`http://localhost:8080`, |
| | | target:`http://192.168.100.10:8081`, |
| | | target:`http://localhost:8080`, |
| | | // target:`http://192.168.100.110:8080`, |
| | | // target:`http://192.168.100.137:8080`, |
| | | // target: `https://slb.hospitalstar.com:9093`, |
| | | changeOrigin: true, |