| | |
| | | <el-row> |
| | | <el-col :span="5"> |
| | | <el-form-item label="报销单号" prop="bh"> |
| | | <el-input |
| | | v-model="form.bh" |
| | | :disabled="true" |
| | | placeholder="报销单号" |
| | | clearable |
| | | /> |
| | | <el-input v-model="form.bh" :disabled="true" placeholder="报销单号" clearable /> |
| | | </el-form-item> |
| | | </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" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | placeholder="日 期" |
| | | > |
| | | <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-col> |
| | | <el-col :span="5"> |
| | | <el-form-item label="经办人" prop="username"> |
| | | <el-select |
| | | v-model="form.username" |
| | | placeholder="申请人" |
| | | clearable |
| | | filterable |
| | | allow-create |
| | | style="width: 100%" |
| | | @change="getUserAccount" |
| | | > |
| | | <el-option |
| | | v-for="dict in userlist" |
| | | :key="dict.index" |
| | | :label="dict.nickname" |
| | | :value="dict.nickname" |
| | | ></el-option> |
| | | <el-select v-model="form.username" placeholder="申请人" clearable filterable allow-create style="width: 100%" |
| | | @change="getUserAccount"> |
| | | <el-option v-for="dict in userlist" :key="dict.index" :label="dict.nickname" |
| | | :value="dict.nickname"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | </el-col> |
| | | <el-col :span="5" v-if="ismanager == true"> |
| | | <el-form-item label="申请金额" prop="pretaxcost"> |
| | | <el-input |
| | | v-model="form.pretaxcost" |
| | | placeholder="税前金额合计" |
| | | :disabled="true" |
| | | /> |
| | | <el-input v-model="form.pretaxcost" placeholder="税前金额合计" :disabled="true" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="5"> |
| | | <el-form-item label="所属组别" prop="deptmentname"> |
| | | <el-input |
| | | v-model="form.deptmentname" |
| | | placeholder="请输入所属组别" |
| | | clearable |
| | | /> |
| | | <el-input v-model="form.deptmentname" placeholder="请输入所属组别" clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="5"> |
| | | <el-form-item label="组长" prop="managername"> |
| | | <el-input |
| | | v-model="form.managername" |
| | | placeholder="请输入组长" |
| | | clearable |
| | | /> |
| | | <el-input v-model="form.managername" placeholder="请输入组长" clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row style="text-align: left"> |
| | | <el-col :span="5"> |
| | | <el-form-item label="捐献案例" prop="name"> |
| | | <el-input |
| | | :disabled="true" |
| | | v-model="form.donorname" |
| | | placeholder="请输入捐献者姓名" |
| | | /> |
| | | <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 :span="10"> |
| | | <el-form-item label="申请说明" prop="remark"> |
| | |
| | | <el-row v-if="jurisdiction"> |
| | | <!-- <el-alert title="当前为查看状态,不支持修改存储。" type="warning"> |
| | | </el-alert> --> |
| | | <el-alert |
| | | title="当前为查看状态,不支持修改存储。" |
| | | type="warning" |
| | | show-icon |
| | | > |
| | | <el-alert title="当前为查看状态,不支持修改存储。" type="warning" show-icon> |
| | | </el-alert> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="3" v-if="businessType == '1'"> |
| | | <div style="margin-bottom: 15px;"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-download" |
| | | size="small" |
| | | @click.native.prevent="importFeeItems" |
| | | > |
| | | <el-button type="primary" icon="el-icon-download" size="small" @click.native.prevent="importFeeItems"> |
| | | 批量导入服务项目 |
| | | </el-button> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="3" v-if="businessType == 2"> |
| | | <div style="margin-bottom: 15px;"> |
| | | <el-button |
| | | type="primary" |
| | | icon="el-icon-download" |
| | | size="small" |
| | | @click="Batchentry" |
| | | >批量录入专家</el-button |
| | | > |
| | | <el-button type="primary" icon="el-icon-download" size="small" @click="Batchentry">批量录入专家</el-button> |
| | | </div> |
| | | </el-col> |
| | | <!-- <el-col |
| | |
| | | </el-col> --> |
| | | </el-row> |
| | | <el-row> |
| | | <el-table |
| | | :data="rbDetails" |
| | | v-loading="loading" |
| | | max-height="800" |
| | | border |
| | | highlight-current-row |
| | | > |
| | | <el-table-column |
| | | prop="orderno" |
| | | align="center" |
| | | label="序号" |
| | | width="88" |
| | | > |
| | | <el-table :data="rbDetails" v-loading="loading" max-height="800" border highlight-current-row> |
| | | <el-table-column prop="orderno" align="center" label="序号" width="88"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.orderno" placeholder="序号" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="applytype" |
| | | align="center" |
| | | label="服务类型" |
| | | width="200" |
| | | > |
| | | <el-table-column prop="applytype" align="center" label="服务类型" width="200"> |
| | | <template slot-scope="scope"> |
| | | <el-select |
| | | v-model="scope.row.applytype" |
| | | placeholder="请选择服务类型" |
| | | @change="verifyFeeItemType(scope.row)" |
| | | > |
| | | <el-option |
| | | v-for="dict in rowfeeItemTypes" |
| | | :key="dict.index" |
| | | :label="dict.label" |
| | | :value="dict.value" |
| | | ></el-option> |
| | | <el-select v-model="scope.row.applytype" placeholder="请选择服务类型" @change="verifyFeeItemType(scope.row)"> |
| | | <el-option v-for="dict in rowfeeItemTypes" :key="dict.index" :label="dict.label" |
| | | :value="dict.value"></el-option> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="itemid" |
| | | align="center" |
| | | label="服务项目" |
| | | width="260" |
| | | > |
| | | <el-table-column prop="itemid" align="center" label="服务项目" width="260"> |
| | | <template slot-scope="scope"> |
| | | <el-select |
| | | v-model="scope.row.itemid" |
| | | placeholder="请选择服务项目" |
| | | filterable |
| | | @change="verifyFeeItem(scope.row)" |
| | | :filter-method="val => searchItemType(val, scope)" |
| | | > |
| | | <el-option |
| | | v-for="dict in scope.row.itemlist" |
| | | :key="dict.index" |
| | | :label="dict.itemName" |
| | | :value="dict.id" |
| | | ></el-option> |
| | | <el-select v-model="scope.row.itemid" placeholder="请选择服务项目" filterable |
| | | @change="verifyFeeItem(scope.row)" :filter-method="val => searchItemType(val, scope)"> |
| | | <el-option v-for="dict in scope.row.itemlist" :key="dict.index" :label="dict.itemName" |
| | | :value="dict.id"></el-option> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="servicesscope" |
| | | align="center" |
| | | label="服务说明" |
| | | v-if="businessType == '1'" |
| | | width="180" |
| | | > |
| | | <el-table-column prop="servicesscope" align="center" label="服务说明" v-if="businessType == '1'" width="180"> |
| | | <template slot-scope="scope"> |
| | | <el-select |
| | | v-model="scope.row.servicesscope" |
| | | placeholder="服务说明" |
| | | clearable |
| | | allow-create |
| | | @change="verifyFeeRemark(scope.row)" |
| | | > |
| | | <el-option |
| | | v-for="dict in scope.row.rowfeeblocks" |
| | | :key="dict.servicesscope" |
| | | :label="dict.remark" |
| | | :value="dict.servicesscope" |
| | | ></el-option> |
| | | <el-select v-model="scope.row.servicesscope" placeholder="服务说明" clearable allow-create |
| | | @change="verifyFeeRemark(scope.row)"> |
| | | <el-option v-for="dict in scope.row.rowfeeblocks" :key="dict.servicesscope" :label="dict.remark" |
| | | :value="dict.servicesscope"></el-option> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="price" |
| | | align="center" |
| | | label="单价" |
| | | width="120" |
| | | v-if="businessType == 4" |
| | | > |
| | | <el-table-column prop="price" align="center" label="单价" width="120" v-if="businessType == 4"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | v-model="scope.row.price" |
| | | placeholder="单价" |
| | | @blur=" |
| | | val => { |
| | | sumTotalFee(scope.row); |
| | | } |
| | | " |
| | | /> |
| | | <el-input v-model="scope.row.price" placeholder="单价" @blur=" |
| | | val => { |
| | | sumTotalFee(scope.row); |
| | | } |
| | | " /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="quantity" |
| | | align="center" |
| | | label="数量" |
| | | width="120" |
| | | v-if="businessType == 4" |
| | | > |
| | | <el-table-column prop="quantity" align="center" label="数量" width="120" v-if="businessType == 4"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | v-model="scope.row.quantity" |
| | | placeholder="数量" |
| | | @blur=" |
| | | val => { |
| | | sumTotalFee(scope.row); |
| | | } |
| | | " |
| | | /> |
| | | <el-input v-model="scope.row.quantity" placeholder="数量" @blur=" |
| | | val => { |
| | | sumTotalFee(scope.row); |
| | | } |
| | | " /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="amount" |
| | | align="center" |
| | | :label="amountlabel" |
| | | width="120" |
| | | > |
| | | <el-table-column prop="amount" align="center" :label="amountlabel" width="120"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.amount" placeholder="金额" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="taxamount" |
| | | align="center" |
| | | label="扣税金额" |
| | | width="120" |
| | | v-if=" |
| | | ismanager == true && |
| | | (businessType == '1' || businessType == '2') |
| | | " |
| | | > |
| | | <el-table-column prop="taxamount" align="center" label="扣税金额" width="120" v-if=" |
| | | ismanager == true && |
| | | (businessType == '1' || businessType == '2') |
| | | "> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | v-model="scope.row.taxamount" |
| | | placeholder="扣税金额" |
| | | /> |
| | | <el-input v-model="scope.row.taxamount" placeholder="扣税金额" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="taxedamount" |
| | | align="center" |
| | | label="税后金额" |
| | | width="120" |
| | | v-if=" |
| | | ismanager == true && |
| | | (businessType == '1' || businessType == '2') |
| | | " |
| | | > |
| | | <el-table-column prop="taxedamount" align="center" label="税后金额" width="120" |
| | | v-if="businessType == '1' || businessType == '2'"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | v-model="scope.row.taxedamount" |
| | | placeholder="税后金额" |
| | | /> |
| | | <el-input v-model="scope.row.taxedamount" placeholder="税后金额" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="beneficiaryname" |
| | | column-key="sdad" |
| | | align="center" |
| | | :label="beneficiarylabel" |
| | | width="200" |
| | | > |
| | | <el-table-column prop="beneficiaryname" column-key="sdad" align="center" :label="beneficiarylabel" |
| | | width="200"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | @click="showSelectionDialog(scope, 'account')" |
| | | >{{ |
| | | scope.row.beneficiaryname |
| | | ? scope.row.beneficiaryname |
| | | : "点击选择" |
| | | }}</el-button |
| | | > |
| | | <el-button type="primary" plain @click="showSelectionDialog(scope, 'account')">{{ |
| | | scope.row.beneficiaryname |
| | | ? scope.row.beneficiaryname |
| | | : "点击选择" |
| | | }}</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="unitno" |
| | | align="center" |
| | | label="专家所在单位" |
| | | width="250" |
| | | v-if="businessType == '1' || businessType == '2'" |
| | | > |
| | | <el-table-column prop="unitno" align="center" label="专家所在单位" width="250" |
| | | v-if="businessType == '1' || businessType == '2'"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | type="primary" |
| | | plain |
| | | @click="showSelectionDialog(scope, 'workunit')" |
| | | >{{ |
| | | scope.row.unitname ? scope.row.unitname : "点击选择" |
| | | }}</el-button |
| | | > |
| | | <el-button type="primary" plain @click="showSelectionDialog(scope, 'workunit')">{{ |
| | | scope.row.unitname ? scope.row.unitname : "点击选择" |
| | | }}</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="title" |
| | | align="center" |
| | | label="职称" |
| | | width="120" |
| | | v-if="businessType == '1' || businessType == '2'" |
| | | > |
| | | <el-table-column prop="title" align="center" label="职称" width="120" |
| | | v-if="businessType == '1' || businessType == '2'"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.title" placeholder="职称" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="idcardno" |
| | | align="center" |
| | | label="身份证号" |
| | | width="200" |
| | | v-if="businessType == '1' || businessType == '2'" |
| | | > |
| | | <el-table-column prop="idcardno" align="center" label="身份证号" width="200" |
| | | 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-table-column |
| | | prop="depositbank" |
| | | align="center" |
| | | label="开户银行" |
| | | width="200" |
| | | > |
| | | <el-table-column prop="depositbank" align="center" label="开户银行" width="200"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | :disabled="userprofile.nickName != '陈慕华'" |
| | | v-model="scope.row.depositbank" |
| | | placeholder="开户银行" |
| | | /> |
| | | <el-input :disabled="userprofile.nickName != '陈慕华'" v-model="scope.row.depositbank" |
| | | placeholder="开户银行" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="bankcardno" |
| | | align="center" |
| | | label="银行帐号" |
| | | width="210" |
| | | > |
| | | <el-table-column prop="bankcardno" align="center" label="银行帐号" width="210"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | :disabled="userprofile.nickName != '陈慕华'" |
| | | v-model="scope.row.bankcardno" |
| | | placeholder="银行帐号" |
| | | /> |
| | | <el-input :disabled="userprofile.nickName != '陈慕华'" v-model="scope.row.bankcardno" placeholder="银行帐号" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="itemdescrisca" |
| | | align="center" |
| | | width="330" |
| | | label="项目说明" |
| | | > |
| | | <el-table-column prop="itemdescrisca" align="center" width="330" label="项目说明"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | type="textarea" |
| | | :rows="2" |
| | | v-model="scope.row.itemdescribe" |
| | | placeholder="项目说明" |
| | | /> |
| | | <el-input type="textarea" :rows="2" v-model="scope.row.itemdescribe" placeholder="项目说明" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="remark" |
| | | align="center" |
| | | width="330" |
| | | label="备注" |
| | | v-show="ismanager == true" |
| | | > |
| | | <el-table-column prop="remark" align="center" width="330" label="备注" v-show="ismanager == true"> |
| | | <template slot-scope="scope"> |
| | | <el-input |
| | | type="textarea" |
| | | :rows="2" |
| | | v-model="scope.row.remark" |
| | | placeholder="备注" |
| | | /> |
| | | <el-input type="textarea" :rows="2" v-model="scope.row.remark" placeholder="备注" /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | fixed="right" |
| | | align="center" |
| | | label="操作" |
| | | width="180" |
| | | > |
| | | <el-table-column fixed="right" align="center" label="操作" width="180"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | type="text" |
| | | size="mini" |
| | | @click="addRow(scope.$index)" |
| | | v-if=" |
| | | <el-button type="text" size="mini" @click="addRow(scope.$index)" v-if=" |
| | | operationType == 'add' || |
| | | operationType == 'update' || |
| | | operationType == 'check' |
| | | ">新增</el-button> |
| | | <el-button @click.native.prevent=" |
| | | deleteRows(scope.row, scope.$index, rbDetails) |
| | | " type="text" size="small" v-if=" |
| | | operationType == 'add' || |
| | | operationType == 'update' || |
| | | operationType == 'check' |
| | | " |
| | | >新增</el-button |
| | | > |
| | | <el-button |
| | | @click.native.prevent=" |
| | | deleteRows(scope.row, scope.$index, rbDetails) |
| | | " |
| | | type="text" |
| | | size="small" |
| | | v-if=" |
| | | operationType == 'add' || |
| | | operationType == 'update' || |
| | | operationType == 'check' |
| | | " |
| | | > |
| | | operationType == 'update' || |
| | | operationType == 'check' |
| | | "> |
| | | 删除 |
| | | </el-button> |
| | | <el-button |
| | | @click.native.prevent=" |
| | | Filepopup(scope.$index, rbDetails, scope.row) |
| | | " |
| | | type="text" |
| | | size="small" |
| | | v-if=" |
| | | <el-button @click.native.prevent=" |
| | | Filepopup(scope.$index, rbDetails, scope.row) |
| | | " type="text" size="small" v-if=" |
| | | businessType == 2 || |
| | | businessType == 3 || |
| | | businessType == 4 || |
| | | businessType == 1 |
| | | " |
| | | >票据</el-button |
| | | > |
| | | businessType == 3 || |
| | | businessType == 4 || |
| | | businessType == 1 |
| | | ">票据</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | |
| | | |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item |
| | | label="费用申请附件" |
| | | align="left" |
| | | prop="annexbankcard" |
| | | v-if="businessType == 0" |
| | | > |
| | | <el-upload |
| | | size="mini" |
| | | class="upload-demo" |
| | | :action="uploadFileUrl" |
| | | :file-list="fileListto" |
| | | :show-file-list="false" |
| | | multiple |
| | | drag |
| | | :headers="headers" |
| | | :on-success=" |
| | | (response, file, fileList) => |
| | | uploadSccess(response, file, fileList) |
| | | " |
| | | :on-preview="downFile" |
| | | :disabled="operationType == 'detail'" |
| | | :on-error="handleUploadError" |
| | | :on-remove="remove" |
| | | accept="image/*,.pdf" |
| | | > |
| | | <el-form-item label="费用申请附件" align="left" prop="annexbankcard" v-if="businessType == 0"> |
| | | <el-upload size="mini" class="upload-demo" :action="uploadFileUrl" :file-list="fileListto" |
| | | :show-file-list="false" multiple drag :headers="headers" :on-success="(response, file, fileList) => |
| | | uploadSccess(response, file, fileList) |
| | | " :on-preview="downFile" :disabled="operationType == 'detail'" :on-error="handleUploadError" |
| | | :on-remove="remove" accept="image/*,.pdf"> |
| | | <i class="el-icon-upload"></i> |
| | | <div class="el-upload__text"> |
| | | 将票据拖到此处,或 |
| | | <em |
| | | ><el-button |
| | | :disabled="operationType == 'detail'" |
| | | size="small" |
| | | type="primary" |
| | | >点击上传</el-button |
| | | ></em |
| | | > |
| | | <em><el-button :disabled="operationType == 'detail'" size="small" type="primary">点击上传</el-button></em> |
| | | </div> |
| | | </el-upload> |
| | | <el-table |
| | | :data="fileListto" |
| | | @row-click="downFile" |
| | | style="width: 100%" |
| | | height="400" |
| | | > |
| | | <el-table-column |
| | | prop="name" |
| | | :show-overflow-tooltip="true" |
| | | label="名称" |
| | | > |
| | | <el-table :data="fileListto" @row-click="downFile" style="width: 100%" height="400"> |
| | | <el-table-column prop="name" :show-overflow-tooltip="true" label="名称"> |
| | | <template slot-scope="scope"> |
| | | <i style="color:#409EFF" class=" el-icon-s-order" />{{ |
| | | scope.row.name |
| | |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="name" |
| | | width="180" |
| | | :show-overflow-tooltip="true" |
| | | label="功能" |
| | | > |
| | | <el-table-column prop="name" width="180" :show-overflow-tooltip="true" label="功能"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | type="danger" |
| | | size="mini" |
| | | @click.native.prevent.stop="deletedowfile(scope.row)" |
| | | >删除</el-button |
| | | > |
| | | <el-button |
| | | type="primary" |
| | | size="mini" |
| | | @click.native.prevent.stop="moveupdowfile(scope.row)" |
| | | >上移</el-button |
| | | > |
| | | <el-button type="danger" size="mini" |
| | | @click.native.prevent.stop="deletedowfile(scope.row)">删除</el-button> |
| | | <el-button type="primary" size="mini" |
| | | @click.native.prevent.stop="moveupdowfile(scope.row)">上移</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row |
| | | v-if=" |
| | | operationType == 'detail' || |
| | | operationType == 'check' || |
| | | operationType == 'update' |
| | | " |
| | | > |
| | | <el-row v-if=" |
| | | operationType == 'detail' || |
| | | operationType == 'check' || |
| | | operationType == 'update' |
| | | "> |
| | | <el-table :data="fundflowList" border> |
| | | <el-table-column |
| | | label="审核日期" |
| | | align="center" |
| | | width="160" |
| | | prop="createTime" |
| | | /> |
| | | <el-table-column |
| | | label="审核人" |
| | | align="center" |
| | | width="120" |
| | | prop="checkusername" |
| | | /> |
| | | <el-table-column |
| | | label="审核结果" |
| | | align="center" |
| | | width="200" |
| | | prop="flowconclusion" |
| | | > |
| | | <el-table-column label="审核日期" align="center" width="160" prop="createTime" /> |
| | | <el-table-column label="审核人" align="center" width="120" prop="checkusername" /> |
| | | <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-row |
| | | style="margin-top: 25px; margin-bottom: 5px" |
| | | v-if="operationType == 'check' && userprofile.nickName == '陈慕华'" |
| | | > |
| | | <el-row style="margin-top: 25px; margin-bottom: 5px" |
| | | v-if="operationType == 'check' && userprofile.nickName == '陈慕华'"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="预审材料" prop="infoid"> |
| | | <el-form-item label="预审状态" prop="infoid"> |
| | | <el-radio-group v-model="form.checkstatus" align="left"> |
| | | <el-radio :label="1">待申请材料</el-radio> |
| | | <el-radio :label="2">审核通过等待邮寄纸质材料</el-radio> |
| | | <el-radio :label="3">已收到报销材料</el-radio> |
| | | <el-radio :label="1">待审核</el-radio> |
| | | <el-radio :label="2">预审通过等待纸质材料</el-radio> |
| | | <el-radio :label="3">已收到纸质材料</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row |
| | | style="margin-top: 5px; margin-bottom: 5px" |
| | | v-if="operationType == 'check'" |
| | | > |
| | | <el-row style="margin-top: 5px; margin-bottom: 5px" v-if="operationType == 'check'"> |
| | | <el-col :span="20"> |
| | | <el-form-item label="审核结果" align="left"> |
| | | <el-radio-group v-model="checkObj.flowlevelone" align="left"> |
| | |
| | | </el-row> |
| | | </el-form> |
| | | <div slot="footer" class="dialog-footer"> |
| | | <el-button |
| | | type="primary" |
| | | @click="submitForm" |
| | | v-if=" |
| | | operationType == 'add' || |
| | | operationType == 'update' || |
| | | ismanager == true |
| | | " |
| | | >保存</el-button |
| | | > |
| | | <el-button |
| | | type="success" |
| | | @click="handleup" |
| | | v-if="operationType == 'add' || operationType == 'update'" |
| | | >上报</el-button |
| | | > |
| | | <el-button |
| | | type="primary" |
| | | @click="checksubmit" |
| | | v-if="operationType == 'check'" |
| | | >提交审核</el-button |
| | | > |
| | | <el-button type="primary" @click="submitForm" v-if=" |
| | | operationType == 'add' || |
| | | operationType == 'update' || |
| | | ismanager == true |
| | | ">保存</el-button> |
| | | <el-button type="success" @click="handleup" |
| | | v-if="operationType == 'add' || operationType == 'update'">上报</el-button> |
| | | <el-button type="primary" @click="checksubmit" v-if="operationType == 'check'">提交审核</el-button> |
| | | <el-button @click="cancel">关 闭</el-button> |
| | | </div> |
| | | </div> |
| | | |
| | | <el-dialog |
| | | :visible.sync="showselectiondialog" |
| | | :close-on-click-modal="false" |
| | | :title="'账户信息/单位信息选择'" |
| | | width="650px" |
| | | style="text-align: center" |
| | | v-loading="loading" |
| | | > |
| | | <el-form |
| | | ref="accountselectform" |
| | | :rules="dialogrules" |
| | | :model="accountselectform" |
| | | label-width="120px" |
| | | > |
| | | <el-dialog :visible.sync="showselectiondialog" :close-on-click-modal="false" :title="'账户信息/单位信息选择'" width="650px" |
| | | style="text-align: center" v-loading="loading"> |
| | | <el-form ref="accountselectform" :rules="dialogrules" :model="accountselectform" label-width="120px"> |
| | | <el-row v-if="selectionType == 'workunit'"> |
| | | <el-col :span="24"> |
| | | <el-form-item |
| | | label="单位名称" |
| | | prop="expertunitname" |
| | | label-width="120px" |
| | | > |
| | | <el-select |
| | | v-model="accountselectform.expertunitname" |
| | | placeholder="单位名称" |
| | | clearable |
| | | filterable |
| | | allow-create |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="(spec, index) in unitList" |
| | | :key="index" |
| | | :label="spec.organizationname" |
| | | :value="spec.organizationname" |
| | | ></el-option> |
| | | <el-form-item label="单位名称" prop="expertunitname" label-width="120px"> |
| | | <el-select v-model="accountselectform.expertunitname" placeholder="单位名称" clearable filterable allow-create |
| | | style="width: 100%"> |
| | | <el-option v-for="(spec, index) in unitList" :key="index" :label="spec.organizationname" |
| | | :value="spec.organizationname"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row v-if="selectionType == 'account'"> |
| | | <el-col> |
| | | <el-form-item |
| | | label="账户来源" |
| | | prop="accountfrom" |
| | | class="left-align" |
| | | > |
| | | <el-form-item label="账户来源" prop="accountfrom" class="left-align"> |
| | | <el-radio-group v-model="accountfrom" style="margin-bottom: 0"> |
| | | <el-radio label="1">从账户库</el-radio> |
| | | <el-radio label="2" |
| | | >新增账户(新增专家账户后需要审核启用才能使用)</el-radio |
| | | > |
| | | <el-radio label="2">新增账户(新增专家账户后需要审核启用才能使用)</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="24" v-if="accountfrom == '1'"> |
| | | <el-form-item label="账户名称" prop="accountname"> |
| | | <el-select |
| | | filterable |
| | | allow-create |
| | | ref="accountname" |
| | | default-first-option |
| | | v-model="accountselectform.accountname" |
| | | placeholder="请选择" |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="item in accountlist" |
| | | :key="item.id" |
| | | :label="item.userid" |
| | | :value="item.id" |
| | | > |
| | | <el-select filterable allow-create ref="accountname" default-first-option |
| | | v-model="accountselectform.accountname" placeholder="请选择" style="width: 100%"> |
| | | <el-option v-for="item in accountlist" :key="item.id" :label="item.userid" :value="item.id"> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | |
| | | <el-row v-if="selectionType == 'account' && accountfrom == '2'"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="新增类型" prop="usertype" class="left-align"> |
| | | <el-radio-group |
| | | v-model="accountselectform.usertype" |
| | | style="margin-bottom: 0" |
| | | @change="userTypeChange(accountselectform.usertype)" |
| | | > |
| | | <el-radio-group v-model="accountselectform.usertype" style="margin-bottom: 0" |
| | | @change="userTypeChange(accountselectform.usertype)"> |
| | | <el-radio label="expert">专家账户</el-radio> |
| | | <el-radio label="org">单位账户</el-radio> |
| | | <el-radio label="donor">捐献者亲属账户</el-radio> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row v-if="selectionType == 'account' && accountfrom == '2'"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="账户名称" prop="username"> |
| | | <el-input |
| | | v-model="accountselectform.username" |
| | | placeholder="请输入单位名称,或专家姓名,或其他账号" |
| | | /> |
| | | <el-input v-model="accountselectform.username" placeholder="请输入单位名称,或专家姓名,或其他账号" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row |
| | | v-if=" |
| | | selectionType == 'account' && |
| | | accountfrom == '2' && |
| | | accountselectform.usertype != 'org' |
| | | " |
| | | > |
| | | <el-row v-if=" |
| | | selectionType == 'account' && |
| | | accountfrom == '2' && |
| | | accountselectform.usertype == 'org' |
| | | "> |
| | | <el-col :span="24"> |
| | | <el-form-item label="税号" prop="unitTaxNo"> |
| | | <el-input v-model="accountselectform.unitTaxNo" placeholder="请输入税号" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row v-if=" |
| | | selectionType == 'account' && |
| | | accountfrom == '2' && |
| | | accountselectform.usertype != 'org' |
| | | "> |
| | | <el-col :span="12"> |
| | | <el-form-item label="身份证号" prop="idcardno"> |
| | | <el-input |
| | | v-model="accountselectform.idcardno" |
| | | placeholder="请输入身份证号" |
| | | /> |
| | | <el-input v-model="accountselectform.idcardno" placeholder="请输入身份证号" @blur="handleIdCardBlur" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12" v-if="accountselectform.usertype == 'expert'"> |
| | | <el-form-item label="职称" prop="title"> |
| | | <el-select |
| | | v-model="accountselectform.title" |
| | | placeholder="请选择人员职称" |
| | | > |
| | | <el-option |
| | | v-for="dict in dict.type.sys_professionaltitle" |
| | | :key="dict.value" |
| | | :label="dict.label" |
| | | :value="dict.label" |
| | | ></el-option> |
| | | <el-select v-model="accountselectform.title" placeholder="请选择人员职称"> |
| | | <el-option v-for="dict in dict.type.sys_professionaltitle" :key="dict.value" :label="dict.label" |
| | | :value="dict.label"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row |
| | | v-if=" |
| | | selectionType == 'account' && |
| | | accountfrom == '2' && |
| | | accountselectform.usertype == 'expert' |
| | | " |
| | | > |
| | | <el-row v-if=" |
| | | selectionType == 'account' && |
| | | accountfrom == '2' && |
| | | accountselectform.usertype == 'expert' |
| | | "> |
| | | <el-col> |
| | | <el-form-item label="所在单位" prop="unitno"> |
| | | <el-select |
| | | v-model="accountselectform.unitno" |
| | | placeholder="单位名称" |
| | | clearable |
| | | filterable |
| | | allow-create |
| | | style="width: 100%" |
| | | > |
| | | <el-option |
| | | v-for="(spec, index) in unitList" |
| | | :key="index" |
| | | :label="spec.organizationname" |
| | | :value="spec.organizationid" |
| | | ></el-option> |
| | | <el-select v-model="accountselectform.unitno" placeholder="单位名称" clearable filterable allow-create |
| | | style="width: 100%"> |
| | | <el-option v-for="(spec, index) in unitList" :key="index" :label="spec.organizationname" |
| | | :value="spec.organizationid"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col> |
| | | <el-form-item label="单位工号" prop="personnelunitno"> |
| | | <el-input |
| | | v-model="accountselectform.personnelunitno" |
| | | placeholder="请输入所在单位的工号" |
| | | /> |
| | | <el-input v-model="accountselectform.personnelunitno" placeholder="请输入所在单位的工号" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row v-if="selectionType == 'account' && accountfrom == '2'"> |
| | | <el-col |
| | | ><el-form-item label="开户银行" prop="depositbank"> |
| | | <el-input |
| | | v-model="accountselectform.depositbank" |
| | | placeholder="请输入开户银行名称" |
| | | /> |
| | | <el-col><el-form-item label="开户银行" prop="depositbank"> |
| | | <el-input v-model="accountselectform.depositbank" placeholder="请输入开户银行名称" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col |
| | | ><el-form-item label="银行卡号" prop="bankcardno"> |
| | | <el-input |
| | | v-model="accountselectform.bankcardno" |
| | | placeholder="请输入银行卡号" |
| | | /> |
| | | <el-col><el-form-item label="银行卡号" prop="bankcardno"> |
| | | <el-input v-model="accountselectform.bankcardno" placeholder="请输入银行卡号" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row v-if="selectionType == 'account' && accountfrom == '2'"> |
| | | <el-col> |
| | | <el-form-item label="联系地址" prop="address"> |
| | | <el-input |
| | | v-model="accountselectform.address" |
| | | placeholder="请输入联系地址" |
| | | /> |
| | | <el-input v-model="accountselectform.address" placeholder="请输入联系地址" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row v-if="selectionType == 'account' && accountfrom == '2'"> |
| | | <el-col> |
| | | <el-form-item label="联系电话" prop="telephone"> |
| | | <el-input |
| | | v-model="accountselectform.telephone" |
| | | placeholder="请输入联系电话" |
| | | /> |
| | | <el-input v-model="accountselectform.telephone" placeholder="请输入联系电话" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="confirmSelectionDialog()" |
| | | >确 定</el-button |
| | | > |
| | | <el-button type="primary" @click="confirmSelectionDialog()">确 定</el-button> |
| | | <el-button @click="showselectiondialog = false">取 消</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | <el-dialog |
| | | v-dialogDrags |
| | | :modal="false" |
| | | :close-on-click-modal="false" |
| | | :title="pdftitle" |
| | | :visible.sync="pdfVisible" |
| | | width="60%" |
| | | > |
| | | <el-dialog v-dialogDrags :modal="false" :close-on-click-modal="false" :title="pdftitle" :visible.sync="pdfVisible" |
| | | width="60%"> |
| | | <div style="margin-bottom: 10px;"> |
| | | <el-table :data="tableDatatop" style="width: 100%"> |
| | | <el-table-column |
| | | v-if="businessType == 4" |
| | | prop="price" |
| | | align="center" |
| | | label="单价" |
| | | > |
| | | <el-table-column v-if="businessType == 4" prop="price" align="center" label="单价"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="quantity" |
| | | align="center" |
| | | label="数量" |
| | | v-if="businessType == 4" |
| | | > |
| | | <el-table-column prop="quantity" align="center" label="数量" v-if="businessType == 4"> |
| | | </el-table-column> |
| | | <el-table-column prop="amount" align="center" :label="amountlabel"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="taxedamount" |
| | | align="center" |
| | | label="税后金额" |
| | | v-if=" |
| | | (this.ismanager == true) & |
| | | (form.applytype == '1' || form.applytype == '2') |
| | | " |
| | | > |
| | | <el-table-column prop="taxedamount" align="center" label="税后金额" v-if=" |
| | | (this.ismanager == true) & |
| | | (form.applytype == '1' || form.applytype == '2') |
| | | "> |
| | | </el-table-column> |
| | | <!-- <el-table-column |
| | | prop="beneficiaryname" |
| | |
| | | </el-table-column> --> |
| | | <el-table-column prop="" align="center" label="单位/个人" width="250"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="title" |
| | | align="center" |
| | | label="职称" |
| | | width="120" |
| | | v-if="form.applytype == '1' || form.applytype == '2'" |
| | | > |
| | | <el-table-column prop="title" align="center" label="职称" width="120" |
| | | v-if="form.applytype == '1' || form.applytype == '2'"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="idcardno" |
| | | align="center" |
| | | label="身份证号" |
| | | width="200" |
| | | v-if="form.applytype == '1' || form.applytype == '2'" |
| | | > |
| | | <el-table-column prop="idcardno" align="center" label="身份证号" width="200" |
| | | v-if="form.applytype == '1' || form.applytype == '2'"> |
| | | </el-table-column> |
| | | <el-table-column prop="depositbank" align="center" label="开户银行"> |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="bankcardno" |
| | | align="center" |
| | | label="银行帐号" |
| | | width="210" |
| | | > |
| | | <el-table-column prop="bankcardno" align="center" label="银行帐号" width="210"> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | <el-alert |
| | | title="新上传文件需在提交保存后才可进行案例关联,否则视为放弃" |
| | | type="error" |
| | | show-icon |
| | | close-text="知道了" |
| | | > |
| | | <el-alert title="新上传文件需在提交保存后才可进行案例关联,否则视为放弃" type="error" show-icon close-text="知道了"> |
| | | </el-alert> |
| | | <el-tabs |
| | | style="margin-top: 20px;" |
| | | v-model="activeName" |
| | | type="border-card" |
| | | @tab-click="handleClick" |
| | | > |
| | | <el-tabs style="margin-top: 20px;" v-model="activeName" type="border-card" @tab-click="handleClick"> |
| | | <el-tab-pane label="普通附件" name="common"> |
| | | <div class="pdfimg"> |
| | | <div class="box-pdf"> |
| | | <div> |
| | | <el-upload |
| | | size="mini" |
| | | class="upload-demo" |
| | | :action="uploadFileUrl" |
| | | :file-list="fileListto" |
| | | :show-file-list="false" |
| | | multiple |
| | | drag |
| | | :headers="headers" |
| | | :on-success=" |
| | | (response, file, fileList) => |
| | | uploadSccess(response, file, fileList) |
| | | " |
| | | :on-preview="downFile" |
| | | :disabled="operationType == 'detail'" |
| | | :on-error="handleUploadError" |
| | | :on-remove="remove" |
| | | accept="image/*,.pdf" |
| | | > |
| | | <el-upload size="mini" class="upload-demo" :action="uploadFileUrl" :file-list="fileListto" |
| | | :show-file-list="false" multiple drag :headers="headers" :on-success="(response, file, fileList) => |
| | | uploadSccess(response, file, fileList) |
| | | " :on-preview="downFile" :disabled="operationType == 'detail'" :on-error="handleUploadError" |
| | | :on-remove="remove" accept="image/*,.pdf"> |
| | | <i class="el-icon-upload"></i> |
| | | <div class="el-upload__text"> |
| | | 将票据拖到此处,或 |
| | | <em |
| | | ><el-button |
| | | :disabled="operationType == 'detail'" |
| | | size="small" |
| | | type="primary" |
| | | >点击上传</el-button |
| | | ></em |
| | | > |
| | | <em><el-button :disabled="operationType == 'detail'" size="small" |
| | | type="primary">点击上传</el-button></em> |
| | | </div> |
| | | </el-upload> |
| | | <el-table |
| | | :data="fileListto" |
| | | @row-click="downFile" |
| | | style="width: 100%" |
| | | height="400" |
| | | > |
| | | <el-table-column |
| | | prop="name" |
| | | :show-overflow-tooltip="true" |
| | | label="名称" |
| | | > |
| | | <el-table :data="fileListto" @row-click="downFile" style="width: 100%" height="400"> |
| | | <el-table-column prop="name" :show-overflow-tooltip="true" label="名称"> |
| | | <template slot-scope="scope"> |
| | | <i style="color:#409EFF" class=" el-icon-s-order" /> |
| | | <span>{{ scope.row.name }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="name" |
| | | width="190" |
| | | :show-overflow-tooltip="true" |
| | | label="功能" |
| | | > |
| | | <el-table-column prop="name" width="190" :show-overflow-tooltip="true" label="功能"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | type="danger" |
| | | size="mini" |
| | | @click.native.prevent.stop="deletedowfile(scope.row)" |
| | | >删除</el-button |
| | | > |
| | | <el-button |
| | | type="primary" |
| | | size="mini" |
| | | @click.native.prevent.stop="moveupdowfile(scope.row)" |
| | | >上移</el-button |
| | | > |
| | | <el-button |
| | | type="success" |
| | | size="mini" |
| | | icon="el-icon-search" |
| | | circle |
| | | @click.native.prevent.stop="Downloadfile(scope.row)" |
| | | ></el-button> |
| | | <el-button type="danger" size="mini" |
| | | @click.native.prevent.stop="deletedowfile(scope.row)">删除</el-button> |
| | | <el-button type="primary" size="mini" |
| | | @click.native.prevent.stop="moveupdowfile(scope.row)">上移</el-button> |
| | | <el-button type="success" size="mini" icon="el-icon-search" circle |
| | | @click.native.prevent.stop="Downloadfile(scope.row)"></el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | | |
| | | <div |
| | | v-if="this.previewpdf && pdfimgsrcList.length" |
| | | class="pdfimgmin" |
| | | > |
| | | <div v-if="this.previewpdf && pdfimgsrcList.length" class="pdfimgmin"> |
| | | <!-- <img :src="pdfimg" /> --> |
| | | <el-image |
| | | style="width: 95%; height: 90%" |
| | | @error="handleImageError" |
| | | @load="handleImageLoad" |
| | | :src="pdfimg" |
| | | :preview-src-list="pdfimgsrcList" |
| | | > |
| | | <el-image ref="imagePreview" style="width: 95%; height: 90%" :src="pdfimg" |
| | | @click="handleImageClick(initialIndex)"> |
| | | <!-- <div slot="error" class="image-slot"> |
| | | <i class="el-icon-picture-outline"></i> |
| | | </div> --> |
| | | <i class="el-icon-picture-outline"></i> |
| | | </div> --> |
| | | </el-image> |
| | | <custom-image-viewer :url-list="pdfimgsrcList" :initial-index="currentIndex" :visible="viewerVisible" |
| | | @update:visible="viewerVisible = $event" @close="handleViewerClose" /> |
| | | </div> |
| | | <div v-else class="pdfimgmins">{{ hintitle }}</div> |
| | | </div> |
| | |
| | | <div class="pdfimg"> |
| | | <div class="box-pdf"> |
| | | <div> |
| | | <el-upload |
| | | size="mini" |
| | | class="upload-demo" |
| | | :action="uploadFileUrl" |
| | | :file-list="invoicefileList" |
| | | :show-file-list="false" |
| | | multiple |
| | | drag |
| | | :headers="headers" |
| | | :on-success=" |
| | | (response, file, fileList) => |
| | | uploadSccess(response, file, fileList) |
| | | " |
| | | :on-preview="downFile" |
| | | :disabled="operationType == 'detail'" |
| | | :on-error="handleUploadError" |
| | | :on-remove="remove" |
| | | accept="image/*,.pdf" |
| | | > |
| | | <el-upload size="mini" class="upload-demo" :action="uploadFileUrl" :file-list="invoicefileList" |
| | | :show-file-list="false" multiple drag :headers="headers" :on-success="(response, file, fileList) => |
| | | uploadSccess(response, file, fileList) |
| | | " :on-preview="downFile" :disabled="operationType == 'detail'" :on-error="handleUploadError" |
| | | :on-remove="remove" accept="image/*,.pdf"> |
| | | <i class="el-icon-upload"></i> |
| | | <div class="el-upload__text"> |
| | | 将发票文件拖到此处,或 |
| | | <em |
| | | ><el-button |
| | | :disabled="operationType == 'detail'" |
| | | size="small" |
| | | type="primary" |
| | | >点击上传</el-button |
| | | ></em |
| | | > |
| | | <em><el-button :disabled="operationType == 'detail'" size="small" |
| | | type="primary">点击上传</el-button></em> |
| | | </div> |
| | | </el-upload> |
| | | <el-table |
| | | :data="invoicefileListto" |
| | | @row-click="downFile" |
| | | style="width: 100%" |
| | | height="400" |
| | | > |
| | | <el-table-column |
| | | prop="name" |
| | | :show-overflow-tooltip="true" |
| | | label="名称" |
| | | > |
| | | <el-table :data="invoicefileListto" @row-click="downFile" style="width: 100%" height="400"> |
| | | <el-table-column prop="name" :show-overflow-tooltip="true" label="名称"> |
| | | <template slot-scope="scope"> |
| | | <i style="color:#409EFF" class=" el-icon-s-order" /> |
| | | <span>{{ scope.row.name }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column |
| | | prop="name" |
| | | width="190" |
| | | :show-overflow-tooltip="true" |
| | | label="功能" |
| | | > |
| | | <el-table-column prop="name" width="190" :show-overflow-tooltip="true" label="功能"> |
| | | <template slot-scope="scope"> |
| | | <el-button |
| | | type="primary" |
| | | size="mini" |
| | | @click.native.prevent.stop="deletedowfile(scope.row)" |
| | | >删除</el-button |
| | | > |
| | | <el-button |
| | | type="primary" |
| | | size="mini" |
| | | @click.native.prevent.stop="moveupdowfile(scope.row)" |
| | | >上移</el-button |
| | | > |
| | | <el-button |
| | | type="success" |
| | | size="mini" |
| | | icon="el-icon-search" |
| | | circle |
| | | @click.native.prevent.stop="Downloadfile(scope.row)" |
| | | ></el-button> |
| | | <el-button type="primary" size="mini" |
| | | @click.native.prevent.stop="deletedowfile(scope.row)">删除</el-button> |
| | | <el-button type="primary" size="mini" |
| | | @click.native.prevent.stop="moveupdowfile(scope.row)">上移</el-button> |
| | | <el-button type="success" size="mini" icon="el-icon-search" circle |
| | | @click.native.prevent.stop="Downloadfile(scope.row)"></el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | | |
| | | <div |
| | | v-if="this.previewpdf && invoicepdfimgsrcList.length" |
| | | class="pdfimgmin" |
| | | > |
| | | <div v-if="this.previewpdf && invoicepdfimgsrcList.length" class="pdfimgmin"> |
| | | <!-- <img :src="pdfimg" /> --> |
| | | <el-image |
| | | style="width: 95%; height: 90%" |
| | | @error="handleImageError" |
| | | @load="handleImageLoad" |
| | | :src="invoicepdfimg" |
| | | :preview-src-list="invoicepdfimgsrcList" |
| | | > |
| | | <el-image style="width: 95%; height: 90%" :src="invoicepdfimg" |
| | | @click="invoicehandleImageClick(initialIndex)"> |
| | | <!-- <div slot="error" class="image-slot"> |
| | | <i class="el-icon-picture-outline"></i> |
| | | </div> --> |
| | | <i class="el-icon-picture-outline"></i> |
| | | </div> --> |
| | | </el-image> |
| | | <custom-image-viewer :url-list="invoicepdfimgsrcList" :initial-index="invoicecurrentIndex" |
| | | :visible="invoiceviewerVisible" @update:visible="invoiceviewerVisible = $event" |
| | | @close="invoicehandleViewerClose" /> |
| | | </div> |
| | | <div v-else class="pdfimgmins">{{ hintitle }}</div> |
| | | </div> |
| | |
| | | </el-tabs> |
| | | </el-dialog> |
| | | <el-dialog title="提示" :visible.sync="Savereminder" width="30%"> |
| | | <el-alert |
| | | :title=" |
| | | '您已添加' + |
| | | totalquantity + |
| | | '条数据,为防止数据丢失是否提交保存再继续添加。' |
| | | " |
| | | type="warning" |
| | | > |
| | | <el-alert :title="'您已添加' + |
| | | totalquantity + |
| | | '条数据,为防止数据丢失是否提交保存再继续添加。' |
| | | " type="warning"> |
| | | </el-alert> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button type="primary" @click="Savenow">确 定</el-button> |
| | |
| | | </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-group v-model="checkedCities" @change="handleCheckedCitiesChange"> |
| | | <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> |
| | | |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import store from "@/store"; |
| | | |
| | | // 'sdaad2123UD2',1 'wsadadwsad',4 'sdadaddad',3 'ssaaddxs',2 |
| | | //这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等) |
| | | //例如:import 《组件名称》 from '《组件路径》'; |
| | |
| | | getdownloadBX, |
| | | addorupdateFund, |
| | | ManualCalculation, |
| | | getdetailsByItemId |
| | | getdetailsByItemId, |
| | | validateExpertFee, |
| | | listbypower |
| | | } from "@/api/project/fund"; |
| | | |
| | | import { |
| | |
| | | addExternalperson, |
| | | updateExternalperson, |
| | | exportExternalperson, |
| | | getOnlyCode |
| | | getOnlyCode, getInfoByIDCardNo |
| | | } from "@/api/project/externalperson"; |
| | | |
| | | import { listItemexpense } from "@/api/project/itemexpense"; |
| | |
| | | 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 { |
| | | //import引入的组件需要注入到对象中才能使用 |
| | | components: { |
| | | Li_area_select, |
| | | OrgSelecter |
| | | OrgSelecter, |
| | | CustomImageViewer |
| | | }, |
| | | name: "fundApply", |
| | | |
| | |
| | | //"sys_finsubject", |
| | | //"sys_financeitemtype", |
| | | //"sys_expensetype", |
| | | 'sys_DonationStatus', |
| | | "sys_recordstatus", |
| | | "sys_professionaltitle" |
| | | ], |
| | | |
| | | data() { |
| | | var validatePass = (rule, value, 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)) { |
| | | callback(); |
| | | } else { |
| | | callback(new Error("身份证号码格式错误")); |
| | | // 自定义身份证号校验器 |
| | | const validateIdCard = (rule, value, callback) => { |
| | | // 1. 如果为空,交给 required 规则去处理,这里直接放行 |
| | | if (!value) { |
| | | 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)$/; |
| | | // 2026-10-19:格式不合法立即早退。原来写成 if/else 但 else 里没有 return, |
| | | // 会继续往下走异步查重,导致 callback 被调用两次、"身份证号码格式错误"被后续结果覆盖。 |
| | | if (!regex.test(value)) { |
| | | return callback(new Error("身份证号码格式错误")); |
| | | } |
| | | |
| | | // 2. 调用后端接口进行重复性校验 |
| | | getInfoByIDCardNo(value).then(res => { |
| | | // 假设后端返回的 res.data 是数组,且长度大于0表示已存在 |
| | | if (res.data && res.data.length > 0) { |
| | | // 校验不通过,将错误信息传给 callback |
| | | callback(new Error("身份证号信息已被登记,请检查!")); |
| | | } else { |
| | | // 校验通过 |
| | | callback(); |
| | | } |
| | | }).catch(() => { |
| | | // 接口异常时的处理 |
| | | callback(new Error("校验身份证号时发生网络错误")); |
| | | }); |
| | | }; |
| | | |
| | | //这里存放数据 |
| | | return { |
| | | // 遮罩层 |
| | |
| | | // 网络请求头 |
| | | Networkheader: null, |
| | | batchdialogVisible: false, |
| | | //批量录入弹框的筛查关键字 |
| | | personKeyword: "", |
| | | itemlist: [], |
| | | cityOptions: [], |
| | | checkAll: false, |
| | |
| | | baselisttages: [ |
| | | { |
| | | id: 1, |
| | | name: "材料待审核" |
| | | name: "待审核" |
| | | }, |
| | | { |
| | | id: 2, |
| | | name: "审查通过等待邮寄纸质材料" |
| | | name: "预审通过等待纸质材料" |
| | | }, |
| | | { |
| | | id: 3, |
| | |
| | | }, |
| | | |
| | | dialogrules: { |
| | | // 2026-10-19:账户名称(账户来源=从账户库 时的下拉)也是必输项 |
| | | accountname: [ |
| | | { required: true, message: "请选择账户名称", trigger: "change" } |
| | | ], |
| | | usertype: [ |
| | | { required: true, message: "请输入账户类型", trigger: "blur" } |
| | | ], |
| | | username: [ |
| | | { 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' } |
| | | ], |
| | | //idcardno: [{ validator: validatePass, trigger: "blur" }], |
| | | depositbank: [ |
| | | { required: true, message: "请输入开户银行", trigger: "change" } |
| | | ], |
| | |
| | | flowconclusion: null, |
| | | fundid: null |
| | | }, |
| | | // 连续审批:待审批单据列表 |
| | | pendingList: [], |
| | | |
| | | // 查询参数 |
| | | queryParams: { |
| | |
| | | pdftitle: "", |
| | | pdfimg: "", |
| | | pdfimgsrcList: [], |
| | | currentIndex: 0, // 初始索引 |
| | | invoicecurrentIndex: 0, // 初始索引 |
| | | initialIndex: 0, // 初始索引 |
| | | viewerVisible: false, // 控制预览组件显示 |
| | | invoiceviewerVisible: false, // 控制预览组件显示 |
| | | pdfVisible: false, |
| | | previewpdf: false, |
| | | hintitle: "请上传文件后查看", |
| | |
| | | }, |
| | | |
| | | //监听属性 类似于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: {}, |
| | | //方法集合 |
| | | methods: { |
| | | bbaaccss(val) {}, |
| | | bbaaccss(val) { }, |
| | | // 浏览器页面关闭或刷新提示 |
| | | beforeunloadHandler(e) { |
| | | if ( |
| | | (JSON.stringify(this.form) == sessionStorage.getItem("apiform") && |
| | | JSON.stringify(this.rbDetails) == |
| | | sessionStorage.getItem("apifunddetail")) || |
| | | sessionStorage.getItem("apifunddetail")) || |
| | | !sessionStorage.getItem("apifunddetail") |
| | | ) { |
| | | } else { |
| | |
| | | this.businessType == "2" || |
| | | this.businessType == "3" |
| | | ) { |
| | | console.log(this.curCase,'this.curCase'); |
| | | |
| | | this.form.infoid = this.curCase.id; |
| | | this.form.donorname = this.curCase.name; |
| | | this.form.donorno = this.curCase.donorno; |
| | | this.form.invoicecount = this.curCase.recordstate; |
| | | } |
| | | |
| | | //初始化明细 |
| | |
| | | handleCheck() { |
| | | this.isopen = 0; |
| | | this.reset(); |
| | | // 重置审批信息,避免上一单的审批结果带入下一单 |
| | | this.checkObj = { |
| | | flowlevelone: null, |
| | | flowconclusion: null, |
| | | fundid: null |
| | | }; |
| | | // 连续审批:加载当前业务类型下的待审批列表 |
| | | this.getPendingList(); |
| | | |
| | | getFund(this.curId).then(response => { |
| | | this.form = response.data; |
| | |
| | | handleDelete() { |
| | | this.$modal |
| | | .confirm("是否确认删除该记录?") |
| | | .then(function() { |
| | | .then(function () { |
| | | return delFund(this.curId); |
| | | }) |
| | | .then(() => { |
| | |
| | | this.getfundList(); |
| | | this.$modal.msgSuccess("删除成功"); |
| | | }) |
| | | .catch(() => {}); |
| | | .catch(() => { }); |
| | | }, |
| | | |
| | | /** 上报按钮操作 */ |
| | |
| | | if ( |
| | | (JSON.stringify(this.form) == sessionStorage.getItem("apiform") && |
| | | JSON.stringify(this.rbDetails) == |
| | | sessionStorage.getItem("apifunddetail")) || |
| | | sessionStorage.getItem("apifunddetail")) || |
| | | !sessionStorage.getItem("apifunddetail") |
| | | ) { |
| | | } else { |
| | |
| | | return randomString; |
| | | }, |
| | | /** 提交按钮 */ |
| | | submitForm: debounce(function() { |
| | | submitForm: debounce(function () { |
| | | // 2026-10-15:保存前附件文件名规范校验(仅新增单据;老单据的历史附件由后端按"只校验本次变更"放行) |
| | | if (!this.checkDetailFileNames()) { |
| | | return; |
| | | } |
| | | |
| | | if (!this.randomnumber) { |
| | | this.randomnumber = this.generateRandomString(9); |
| | | this.form.randomnumber = this.randomnumber; |
| | |
| | | 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[k]; |
| | | if (tempDetail.itemid == null) { |
| | | this.$modal.msgWarning( |
| | | "服务项目表中,第" + |
| | | (k + 1).toString() + |
| | | "行的服务项目未选择,请先选择服务项目后再提交保存!" |
| | | (k + 1).toString() + |
| | | "行的服务项目未选择,请先选择服务项目后再提交保存!" |
| | | ); |
| | | return; |
| | | } |
| | |
| | | if (tempDetail.servicesscope == null) { |
| | | this.$modal.msgWarning( |
| | | "服务项目表中,第" + |
| | | (k + 1).toString() + |
| | | "行的费用说明未选择,请选择费用说明后再提交保存!" |
| | | (k + 1).toString() + |
| | | "行的费用说明未选择,请选择费用说明后再提交保存!" |
| | | ); |
| | | return; |
| | | } |
| | |
| | | if (tempDetail.beneficiaryno == null) { |
| | | this.$modal.msgWarning( |
| | | "服务项目表中,第" + |
| | | (k + 1).toString() + |
| | | "行的服务人员姓名为选择,请选择人员后再提交保存!" |
| | | (k + 1).toString() + |
| | | "行的服务人员姓名为选择,请选择人员后再提交保存!" |
| | | ); |
| | | return; |
| | | } |
| | |
| | | let tempDetail = this.rbDetails[j]; |
| | | if ( |
| | | isNaN(parseFloat(tempDetail.amount)) || |
| | | parseFloat(tempDetail.amount) == 0 |
| | | moneyRound(tempDetail.amount) == 0 |
| | | ) { |
| | | this.$modal.msgWarning( |
| | | "服务项目表中,第" + |
| | | (j + 1).toString() + |
| | | "行的金额未输入,请先输入金额后再提交保存!" |
| | | (j + 1).toString() + |
| | | "行的金额未输入,请先输入金额后再提交保存!" |
| | | ); |
| | | return; |
| | | } |
| | |
| | | let tempDetail = this.rbDetails[j]; |
| | | if ( |
| | | isNaN(parseFloat(tempDetail.amount)) || |
| | | parseFloat(tempDetail.amount) == 0 |
| | | moneyRound(tempDetail.amount) == 0 |
| | | ) { |
| | | this.$modal.msgWarning( |
| | | "服务项目表中,第" + |
| | | (j + 1).toString() + |
| | | "行的金额未输入,请先输入金额后再提交保存!" |
| | | (j + 1).toString() + |
| | | "行的金额未输入,请先输入金额后再提交保存!" |
| | | ); |
| | | return; |
| | | } |
| | | 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("保存并审批"); |
| | | }); |
| | | }, |
| | | |
| | | // 连续审批:获取当前业务类型下的待审批列表 |
| | | getPendingList() { |
| | | return listbypower({ |
| | | pageNum: 1, |
| | | pageSize: 1000, |
| | | CHECKFLAG: 1, |
| | | APPLYTYPE: this.businessType |
| | | }) |
| | | .then(res => { |
| | | this.pendingList = res.rows || []; |
| | | }) |
| | | .catch(() => { |
| | | this.pendingList = []; |
| | | }); |
| | | }, |
| | | |
| | | // 连续审批:审批完成后询问是否继续审批下一单 |
| | | continueOrExit() { |
| | | // 重新拉取待审批列表(当前单据已审批完成被移出列表) |
| | | this.getPendingList().then(() => { |
| | | const list = this.pendingList || []; |
| | | const next = list[0] || null; |
| | | if (next) { |
| | | this.$confirm("审批已完成,是否继续审批下一张待审批单据?", "提示", { |
| | | confirmButtonText: "继续审批", |
| | | cancelButtonText: "返回列表", |
| | | type: "info" |
| | | }) |
| | | .then(() => { |
| | | // 在当前页面直接加载下一张待审批单据 |
| | | this.curId = next.id; |
| | | this.handleCheck(); |
| | | // 同步更新地址栏,避免刷新后回到上一单 |
| | | this.$router |
| | | .replace({ |
| | | path: this.$route.path, |
| | | query: { |
| | | id: next.id, |
| | | businessType: this.businessType, |
| | | operationType: "check" |
| | | } |
| | | }) |
| | | .catch(() => {}); |
| | | }) |
| | | .catch(() => { |
| | | this.exitToPage(); |
| | | }); |
| | | } else { |
| | | this.$modal.msgSuccess("已无待审批单据,返回列表"); |
| | | this.exitToPage(); |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | // 返回列表页 |
| | | exitToPage() { |
| | | this.$store.dispatch("tagsView/delView", this.$route); |
| | | this.$router.go(-1); |
| | | }, |
| | | |
| | | // 取消按钮 |
| | |
| | | getUserProfile().then(res => { |
| | | this.userprofile = res.data; |
| | | this.standardlevel = res.data.standardlevel; |
| | | |
| | | if ( |
| | | this.userprofile.userName == "admin" || |
| | | this.userprofile.userName == "001" || |
| | | this.userprofile.userName == "047" |
| | | this.userprofile.userName == "053" || |
| | | this.userprofile.userName == "047" || |
| | | store.getters.rolesor[0].roleSort == "13" |
| | | ) { |
| | | this.ismanager = true; |
| | | } else { |
| | |
| | | }); |
| | | }, |
| | | |
| | | /** 人员类型(多值,逗号分隔)是否包含指定类型;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( |
| | | "服务项目表中,第" + |
| | | // 专家劳务费专用: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; |
| | | } |
| | | ); |
| | | return; |
| | | } |
| | | |
| | | if (this.businessType == "1") { |
| | | if (tempDetail.servicesscope == null) { |
| | | this.$modal.msgWarning( |
| | | "服务项目表中,第" + |
| | | if (this.businessType == "1") { |
| | | if (tempDetail.servicesscope == null) { |
| | | this.$modal.msgWarning( |
| | | "服务项目表中,第" + |
| | | (k + 1).toString() + |
| | | "行的费用说明未选择,请选择费用说明后再提交保存!" |
| | | ); |
| | | return; |
| | | } |
| | | ); |
| | | return; |
| | | } |
| | | |
| | | if (tempDetail.beneficiaryno == null) { |
| | | this.$modal.msgWarning( |
| | | "服务项目表中,第" + |
| | | if (tempDetail.beneficiaryno == null) { |
| | | this.$modal.msgWarning( |
| | | "服务项目表中,第" + |
| | | (k + 1).toString() + |
| | | "行的人员姓名为空,请选择人员后再提交保存!" |
| | | ); |
| | | return; |
| | | } |
| | | if (tempDetail.unitname == null) { |
| | | this.$modal.msgWarning( |
| | | "服务项目表中,第" + |
| | | ); |
| | | return; |
| | | } |
| | | if (tempDetail.unitname == null) { |
| | | this.$modal.msgWarning( |
| | | "服务项目表中,第" + |
| | | (k + 1).toString() + |
| | | "行的专家单位为空,请选择单位后再提交保存!" |
| | | ); |
| | | return; |
| | | ); |
| | | 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; |
| | | } |
| | | //处理明细 |
| | | 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; |
| | | //获取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; |
| | | } |
| | | 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( |
| | | "服务项目表中,第" + |
| | | //计算当前行报销内容费用合计,税前金额(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; |
| | | ); |
| | | 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( |
| | | "服务项目表中,第" + |
| | | } 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)) || |
| | | parseFloat(tempDetail.taxamount) == 0 |
| | | ) { |
| | | tempDetail.taxedamount = parseFloat(tempDetail.amount); |
| | | } else { |
| | | tempDetail.taxedamount = |
| | | parseFloat(tempDetail.amount) + |
| | | parseFloat(tempDetail.taxamount); |
| | | ); |
| | | 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; |
| | | //保存数据 |
| | | 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.$store.dispatch("tagsView/delView", this.$route); |
| | | this.$router.go(-1); |
| | | } else { |
| | | if (res.msg) { |
| | | this.$modal.msgError("操作失误"); |
| | | } else { |
| | | this.$modal.msgError(res.msg); |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | this.Getnetworkheader(); |
| | | this.getroute(); |
| | | this.getAccountList(); |
| | | this.getUserList(); |
| | | this.getUserProfile(); |
| | | if (this.form.id != null) { |
| | | } else { |
| | | this.$modal.msgError("申请单保存失败:" + response.msg); |
| | | this.form.recordstatus = -1; |
| | | } |
| | | }); |
| | | |
| | | //关闭窗口 |
| | | this.loading = false; |
| | | // this.getfundList(); |
| | | } |
| | | 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; |
| | | }, |
| | | /** 批量录入弹框:姓名/单位/工号/身份证后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; |
| | | } |
| | | }); |
| | | |
| | | 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, |
| | |
| | | |
| | | this.rbDetails.push(rowData); |
| | | }); |
| | | 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(); |
| | | }, |
| | |
| | | // 图片加载成功时执行的操作 |
| | | console.log("Image loaded successfully"); |
| | | }, |
| | | handleUploadError() {}, |
| | | handleImageClick(index) { |
| | | this.currentIndex = index; |
| | | this.viewerVisible = true; |
| | | }, |
| | | invoicehandleImageClick(index) { |
| | | this.invoicecurrentIndex = index; |
| | | this.invoiceviewerVisible = true; |
| | | }, |
| | | handleViewerClose() { |
| | | this.viewerVisible = false; |
| | | }, |
| | | invoicehandleViewerClose() { |
| | | this.invoiceviewerVisible = false; |
| | | }, |
| | | handleUploadError() { }, |
| | | remove(file, fileList) { |
| | | const rbDetails = [...this.rbDetails]; |
| | | if (this.activeName == "common") { |
| | |
| | | } |
| | | }, |
| | | |
| | | /** |
| | | * 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") { |
| | |
| | | if (hasIdOne) { |
| | | this.$modal.msgWarning( |
| | | "服务项目表中,人员名称:" + |
| | | res.username + |
| | | "重复,请注意核对信息!" |
| | | res.username + |
| | | "重复,请注意核对信息!" |
| | | ); |
| | | } |
| | | this.rbDetails[tempIndex].beneficiaryno = res.userno; |
| | |
| | | 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); |
| | |
| | | return; |
| | | } |
| | | |
| | | if (regex.test(row.idcardno)) { |
| | | row.error = ""; |
| | | } else { |
| | | row.error = "身份证号码格式错误"; |
| | | } |
| | | //身份证重复验证 |
| | | getInfoByIDCardNo(idcardno).then(res => { |
| | | if (res.data.length > 1) { |
| | | this.$modal.msgWarning("身份证号信息已被登记,请检查身份证号!" |
| | | ); |
| | | return; |
| | | } |
| | | }); |
| | | }, |
| | | |
| | | //账户类型选择变化 |
| | |
| | | } |
| | | }, |
| | | |
| | | // 失焦时手动触发校验(可选,通常配置了 trigger: 'blur' 后会自动触发) |
| | | handleIdCardBlur() { |
| | | // 手动校验单个字段,确保失焦时立刻看到结果 |
| | | this.$refs.showselectiondialog.validateField('idcardno'); |
| | | }, |
| | | |
| | | //生命周期 - 创建完成(可以访问当前this实例) |
| | | created() { |
| | | //获取路由参数 |
| | |
| | | |
| | | //生命周期 - 挂载完成(可以访问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; |
| | |
| | | this.$destroy(); |
| | | next(); |
| | | }, |
| | | beforeCreate() {}, //生命周期 - 创建之前 |
| | | beforeMount() {}, //生命周期 - 挂载之前 |
| | | beforeUpdate() {}, //生命周期 - 更新之前 |
| | | updated() {}, //生命周期 - 更新之后 |
| | | beforeDestroy() {}, //生命周期 - 销毁之前 |
| | | beforeCreate() { }, //生命周期 - 创建之前 |
| | | beforeMount() { }, //生命周期 - 挂载之前 |
| | | beforeUpdate() { }, //生命周期 - 更新之前 |
| | | updated() { }, //生命周期 - 更新之后 |
| | | beforeDestroy() { }, //生命周期 - 销毁之前 |
| | | destroyed() { |
| | | window.removeEventListener("beforeunload", e => this.beforeunloadFn(e)); |
| | | if (this._beforeUnloadHandler) { |
| | | window.removeEventListener("beforeunload", this._beforeUnloadHandler); |
| | | this._beforeUnloadHandler = null; |
| | | } |
| | | }, //生命周期 - 销毁完成 |
| | | activated() {} //如果页面有keep-alive缓存功能,这个函数会触发 |
| | | activated() { } //如果页面有keep-alive缓存功能,这个函数会触发 |
| | | }; |
| | | </script> |
| | | |
| | |
| | | line-height: 25px; |
| | | } |
| | | |
| | | ::v-deep .el-checkbox.is-bordered + .el-checkbox.is-bordered { |
| | | ::v-deep .el-checkbox.is-bordered+.el-checkbox.is-bordered { |
| | | margin-left: 0 !important; |
| | | margin-bottom: 10px; |
| | | } |