| | |
| | | <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 |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | label="申请材料状态" |
| | | label="材料预审状态" |
| | | width="140" |
| | | align="center" |
| | | prop="checkstatus" |
| | |
| | | <!-- 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(); |
| | | }, |
| | | |