兼职凭证优化

This commit is contained in:
jinbooks_dev
2025-06-16 18:03:32 +08:00
parent 3792f8ace4
commit b4b7759724
6 changed files with 58 additions and 310 deletions

View File

@ -64,3 +64,11 @@ export function generateVoucherSubmit(data: any) {
data: data
})
}
export function deleteVoucherSubmit(data: any) {
return request({
url: '/employee/salary/delete-voucher',
method: 'post',
data: data
})
}

View File

@ -211,7 +211,7 @@
{{ formatAmount(scope.row.businessExpenditureCosts) }}
</template>
</el-table-column>
<el-table-column label="收票凭证" align="center" width="60"
<el-table-column label="收票凭证" align="center" width="100"
:show-overflow-tooltip="true" fixed="right">
<template #default="scope">
<el-button v-if="scope.row.employeeType === 'PARTTIME' && (scope.row.accrualVoucherId === null ||scope.row.accrualVoucherId ==='')"
@ -224,9 +224,14 @@
@click="viewVoucher(scope.row.accrualVoucherId)">
查看
</el-button>
<el-button v-if="scope.row.employeeType === 'PARTTIME' && scope.row.accrualVoucherId !== null &&scope.row.accrualVoucherId !==''"
type="text"
@click="deleteVoucher(scope.row,2)">
删除
</el-button>
</template>
</el-table-column>
<el-table-column label="发放凭证" align="center" width="60"
<el-table-column label="发放凭证" align="center" width="100"
:show-overflow-tooltip="true" fixed="right">
<template #default="scope">
<el-button v-if="scope.row.employeeType === 'PARTTIME' && (scope.row.salaryVoucherId === null ||scope.row.salaryVoucherId ==='')"
@ -239,6 +244,11 @@
@click="viewVoucher(scope.row.salaryVoucherId)">
查看
</el-button>
<el-button v-if="scope.row.employeeType === 'PARTTIME' && scope.row.salaryVoucherId !== null &&scope.row.salaryVoucherId !==''"
type="text"
@click="deleteVoucher(scope.row,3)">
删除
</el-button>
</template>
</el-table-column>
<!-- <el-table-column label="操作" align="center" fixed="right" width="180">
@ -296,7 +306,7 @@
<script setup lang="ts">
import {reactive, ref, toRefs, getCurrentInstance} from "vue";
import {useI18n} from "vue-i18n";
import {delSalary, exportSalary, fetchPage, salarySummary, generateVoucherSubmit} from "@/api/system/hr/employee-salary";
import {delSalary, exportSalary, fetchPage, salarySummary, generateVoucherSubmit,deleteVoucherSubmit} from "@/api/system/hr/employee-salary";
import {ElForm} from "element-plus";
import modal from "@/plugins/modal";
import {formatAmount} from "@/utils";
@ -589,6 +599,15 @@ function generateVoucher(row: any, voucherType: number) {
});
}
function deleteVoucher(row: any, voucherType: number) {
deleteVoucherSubmit({id: row.id, voucherType: voucherType}).then((res: any) => {
if (res.code === 0) {
getList();
modal.msgSuccess("操作成功");
}
});
}
/** 查看操作 */
function viewVoucher(voucherId: any) {
voucherApis.getOneVoucher(voucherId).then((response: any) => {

View File

@ -1,307 +0,0 @@
<template>
<div class="app-container">
<el-card class="common-card query-box">
<div class="queryForm">
<el-form :model="queryParams" ref="queryRef" :inline="true" label-width="68px">
<el-form-item label="凭证类型">
<el-select v-model="queryParams.voucherType" placeholder="" clearable style="width: 200px">
<el-option
v-for="dict in voucherTypes"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">{{ t('org.button.query') }}</el-button>
<el-button @click="resetQuery">{{ t('org.button.reset') }}</el-button>
</el-form-item>
</el-form>
</div>
</el-card>
<el-card class="common-card">
<div class="btn-form">
<el-button
type="primary"
@click="handleAdd"
>{{ t('org.button.add') }}
</el-button>
<el-button
type="danger"
@click="onDelete"
:disabled="ids.length === 0"
>{{ t('org.button.deleteBatch') }}
</el-button>
</div>
<el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange" border>
<el-table-column type="selection" width="55" align="center"/>
<el-table-column prop="voucherType" label="凭证类型" align="left" min-width="50"
:show-overflow-tooltip="true">
<template #default="scope">
<dict-tag-number :options="voucherTypes" :value="scope.row.voucherType"/>
</template>
</el-table-column>
<el-table-column prop="wordHead" label="凭证字" align="left" min-width="50"
:show-overflow-tooltip="true">
<template #default="scope">
<dict-tag :options="wordHeads" :value="scope.row.wordHead"/>
</template>
</el-table-column>
<!-- <el-table-column prop="summary" label="摘要" align="left" min-width="100"
:show-overflow-tooltip="true"></el-table-column>
<el-table-column prop="direction" label="借/贷" align="left" min-width="50">
<template #default="scope">
<el-tag type="warning" v-if="scope.row.direction == 0">{{ t('subjectDirectionNone') }}</el-tag>
<el-tag type="warning" v-if="scope.row.direction == 1">{{ t('subjectDebit') }}</el-tag>
<el-tag type="success" v-if="scope.row.direction == 2">{{ t('subjectCredit') }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="subjectName" label="科目" align="left" min-width="100"
:show-overflow-tooltip="true">
<template #default="scope">
{{ scope.row.subjectCode+" "+scope.row.subjectName }}
</template>
</el-table-column>-->
<!-- <el-table-column prop="status" :label="t('org.status')" align="center" min-width="40">
<template #default="scope">
<span v-if="scope.row.status === 1"><el-icon color="green"><SuccessFilled
class="success"/></el-icon></span>
<span v-if="scope.row.status === 0"><el-icon color="#808080"><CircleCloseFilled/></el-icon></span>
</template>
</el-table-column>-->
<el-table-column prop="status" label="状态" align="center" min-width="20">
<template #default="scope">
<el-switch
v-model="scope.row.status"
inline-prompt
active-text="启用"
inactive-text="禁用"
:active-value="1"
:inactive-value="0"
style="--el-switch-on-color: #13ce66;"
@change="handleStatusChange(scope.row, $event)"
/>
</template>
</el-table-column>
<el-table-column :label="$t('jbx.text.action')" width="80" align="center">
<template #default="scope">
<el-tooltip content="编辑">
<el-button link icon="Edit" @click="handleUpdate(scope.row)"></el-button>
</el-tooltip>
<el-tooltip content="移除">
<el-button link icon="Delete" type="danger" @click="onDelete(scope.row)"></el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNumber"
v-model:limit="queryParams.pageSize"
:page-sizes="queryParams.pageSizeOptions"
@pagination="getList"
/>
</el-card>
<!-- <edit-form :title="title" :open="open"
:form-id="id"
:dept-options="deptOptions"
:voucher-types="voucherTypes"
:word-heads="wordHeads"
@dialogOfClosedMethods="dialogOfClosedMethods"></edit-form>-->
<template-form :title="title" :open="open"
:dept-options="deptOptions"
:form-id="id"
:word-heads="wordHeads"
:voucher-types="voucherTypes"
@dialogOfClosedMethods="dialogOfClosedMethods">
</template-form>
</div>
</template>
<script setup lang="ts">
import {ElForm} from "element-plus";
import {useI18n} from "vue-i18n";
import {getCurrentInstance, reactive, ref, toRefs} from "vue";
import {delRule, pageList, changeStatus} from "@/api/system/hr/voucher-rule";
import editForm from "./salary-voucher-rules/edit.vue"
import templateForm from "./salary-voucher-rules/template.vue"
import {getTree} from "@/api/system/standard/standard-subject";
import bookStore from "@/store/modules/bookStore";
import DictTagNumber from "@/components/DIctTagNumber/index.vue";
import modal from "@/plugins/modal";
import * as GendersEnum from "@/utils/enums/GendersEnum";
const {proxy} = getCurrentInstance()!;
const {voucherTypes, wordHeads}
= proxy?.useDict( "voucherTypes", "wordHeads");
const currBookStore = bookStore()
const {t} = useI18n()
const data: any = reactive({
queryParams: {
pageNumber: 1,
pageSize: 10,
pageSizeOptions: [10, 20, 50]
},
rules: {
},
});
const {queryParams, rules} = toRefs(data);
const dataList = ref([]);
const loading = ref(true);
const total = ref(0);
const title = ref("");
const open = ref(false);
const id: any = ref(undefined);
const ids = ref([]);
const selectionlist: any = ref<any>([]);
const deptOptions: any = ref<any[]>([]);
const subjectKeyItem = ref<any>({})
const subjectKeyIdItem = ref<any>({})
function getList() {
pageList(queryParams.value).then((response: any) => {
dataList.value = response.data.records;
total.value = response.data.total;
loading.value = false;
})
}
/** 新增按钮操作 */
function handleAdd() {
title.value = "新增凭证模板";
id.value = undefined;
open.value = true;
}
/*关闭抽屉*/
function dialogOfClosedMethods(val: any): any {
open.value = false;
id.value = undefined;
if (val) {
getList();
}
}
interface TreeNode {
id: string | number; // 根据你的数据实际情况调整类型
children?: TreeNode[]; // 子节点可能不存在
}
function getSubjectTree(): any {
getTree({bookId: currBookStore.bookId}).then((response: { data: TreeNode[] }) => {
deptOptions.value = response.data;
});
}
// 多选框选中数据
function handleSelectionChange(selection: any) {
selectionlist.value = selection;
ids.value = selectionlist.value.map((item: any) => item.id);
}
function handleUpdate(row: any) {
id.value = row.id;
title.value = "编辑凭证规则"
open.value = true;
}
function onDelete(row: any) {
const _ids = row.id ? [row.id] : ids.value;
modal.confirm('是否确认删除?').then(function () {
return delRule({listIds: _ids});
}).then((res: any) => {
if (res.code === 0) {
getList();
modal.msgSuccess(t('jbx.alert.delete.success'));
} else {
modal.msgError(res.message);
}
}).catch(() => {
});
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
function resetQuery() {
queryParams.value.voucherType = undefined;
handleQuery();
}
/* 处理状态变更 */
function handleStatusChange(row: any, newStatus: number) {
// 保存之前的状态用于恢复
const oldStatus = newStatus === 1 ? 0 : 1;
// 根据新状态决定要执行的操作
if (newStatus === 1) {
// 用户正在尝试启用
modal
.confirm("是否启用该模板?")
.then(function () {
return changeStatus({id: row.id, status: newStatus});
})
.then((res) => {
if (res.code === 0) {
// 成功,保持当前状态
} else {
// 失败,回退状态
row.status = oldStatus;
modal.msgError(res.message);
}
})
.catch(() => {
// 用户取消,回退状态
row.status = oldStatus;
});
} else {
// 用户正在尝试禁用
modal
.confirm("是否确认禁用该模板?")
.then(function () {
return changeStatus({id: row.id, status: newStatus});
})
.then((res) => {
if (res.code === 0) {
// 成功,保持当前状态
} else {
// 失败,回退状态
row.status = oldStatus;
modal.msgError(res.message);
}
})
.catch(() => {
// 用户取消,回退状态
row.status = oldStatus;
});
}
}
getList();
getSubjectTree();
</script>
<style lang="scss" scoped>
.btn-form {
margin-bottom: 10px;
}
.common-card {
margin-bottom: 15px;
}
.app-container {
padding: 0;
background-color: #f5f7fa;
}
</style>