master
xy 2 years ago
parent e8edb1ceee
commit a33fffdd2e

@ -0,0 +1,33 @@
import request from '@/utils/request'
export function index (params) {
return request({
method: 'get',
url: '/api/admin/income/index',
params
})
}
export function show (params) {
return request({
method: 'get',
url: '/api/admin/income/show',
params
})
}
export function save (data) {
return request({
method: 'post',
url: '/api/admin/income/save',
data
})
}
export function destroy (params) {
return request({
method: 'get',
url: '/api/admin/income/destroy',
params
})
}

@ -142,7 +142,7 @@
<script>
import { getparameter } from '@/api/system/dictionary'
import { addContrant,editorContract } from "@/api/contract/contract";
import { addContrant,editorContract,detailContract as show } from "@/api/contract/contract";
import { getBudget } from '@/api/budget/budget'
export default {
props: {
@ -332,9 +332,22 @@ export default {
async getDetail() {
const res = await show({ id: this.id });
this.$integrateData(this.form, res);
this.form.contract_plan_links = res.plans?.map(item => {
return {
label: item.name,
value: {
plan_id: item.id,
use_money: res.plan_link.filter(item1 => {
return item1.plan_id === item.id
})[0].use_money,
new_money: item.money
}
}
})
},
submit() {
this.form.contract_plan_links = this.form.contract_plan_links.map(i => i?.value)
if (this.type === "add") {
if (this.form.hasOwnProperty("id")) {
delete this.form.id;

@ -0,0 +1,326 @@
<template>
<div>
<xy-dialog
ref="dialog"
:is-show.sync="isShow"
type="form"
:title="type === 'add' ? '新增收入登记' : '编辑收入登记'"
:form="form"
:rules="rules"
@submit="submit"
>
<template v-slot:name>
<div class="xy-table-item">
<div class="xy-table-item-label">收入事项 </div>
<div class="xy-table-item-content">
<el-input
v-model="form.name"
clearable
placeholder="请输入收入事项"
style="width: 300px"
></el-input>
</div>
</div>
</template>
<template v-slot:type_id>
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red; font-weight: 600; padding-right: 4px"
>*</span
>
收入类型
</div>
<div class="xy-table-item-content">
<el-select
v-model="form.type_id"
clearable
placeholder="请选择收入类型"
style="width: 300px"
>
<el-option
v-for="item in type_ids"
:key="item.id"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:way_id>
<div class="xy-table-item">
<div class="xy-table-item-label">收入方式 </div>
<div class="xy-table-item-content">
<el-select
v-model="form.way_id"
clearable
placeholder="请选择收入方式"
style="width: 300px"
>
<el-option
v-for="item in way_ids"
:key="item.id"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:from>
<div class="xy-table-item">
<div class="xy-table-item-label">收入来源 </div>
<div class="xy-table-item-content">
<el-input
v-model="form.from"
clearable
placeholder="请输入收入来源"
style="width: 300px"
></el-input>
</div>
</div>
</template>
<template v-slot:remark>
<div class="xy-table-item">
<div class="xy-table-item-label">备注 </div>
<div class="xy-table-item-content">
<el-input
type="textarea"
:autosize="{ minRows: 2 }"
v-model="form.remark"
clearable
placeholder="请输入备注"
style="width: 300px"
></el-input>
</div>
</div>
</template>
<template v-slot:money>
<div class="xy-table-item">
<div class="xy-table-item-label">收入金额 </div>
<div class="xy-table-item-content">
<el-input-number
v-model="form.money"
clearable
:precision="2"
placeholder="请输入收入金额"
style="width: 300px"
:controls="false"
></el-input-number>
</div>
</div>
</template>
<template v-slot:file_ids>
<div class="xy-table-item">
<div class="xy-table-item-label">附件 </div>
<div class="xy-table-item-content">
<el-upload
style="width: 300px"
ref="upload"
multiple
:on-success="
(response, file, fileList) =>
successHandle(response, file, fileList, 'file_ids')
"
:before-upload="uploadBefore"
accept=".rar,.zip,.doc,.docx,.pdf,.jpg,.png,.gif,.mp4,.xls,.xlsx"
:action="action"
:file-list="file_ids"
:auto-upload="false"
:on-remove="
(file, fileList) => removeHande(file, fileList, 'file_ids')
"
>
<el-button slot="trigger" size="small" type="primary"
>选取文件</el-button
>
<el-button
style="margin-left: 10px"
size="small"
type="success"
@click="$refs['upload'].submit()"
>开始上传</el-button
>
<div slot="tip" class="el-upload__tip">
支持文件格式.rar .zip .doc .docx .pdf .jpg .png .gif .mp4 .xls
.xlsx
<br />单个文件不能超过20M
</div>
</el-upload>
</div>
</div>
</template>
</xy-dialog>
</div>
</template>
<script>
import { show, save } from "@/api/income";
export default {
props: {
type_ids: {
type: Array,
default: () => [],
},
way_ids: {
type: Array,
default: () => [],
},
},
data() {
return {
isShow: false,
id: "",
type: "",
action: process.env.VUE_APP_UPLOAD_API,
file_ids: [],
form: {
name: "",
type_id: "",
way_id: "",
from: "",
remark: "",
status: 1,
money: "",
file_ids: "",
},
rules: {
type_id: [
{
required: true,
message: "请填写收入类型",
},
],
},
};
},
methods: {
show() {
this.isShow = true;
},
hidden() {
this.isShow = false;
},
init() {
for (let key in this.form) {
if (this.form[key] instanceof Array) {
this.form[key] = [];
} else {
this.form[key] = "";
}
this.form.status = 1;
}
this.$refs["dialog"].clearValidate();
},
setId(id) {
if (typeof id == "number") {
this.id = id;
} else {
console.error("error typeof id: " + typeof id);
}
},
getId() {
return this.id;
},
setType(type = "add") {
let types = ["add", "editor"];
if (types.includes(type)) {
this.type = type;
} else {
console.warn("Unknown type: " + type);
}
},
setForm(key = [], value = []) {
if (key instanceof Array) {
key.forEach((key, index) => {
this.form[key] = value[index] ?? "";
});
}
if (typeof key === "string") {
this.form[key] = value;
}
if (!key) {
this.init();
}
},
//
successHandle(response, file, fileList, key) {
this[key] = fileList;
},
removeHande(file, fileList, key) {
this[key] = fileList;
},
uploadBefore(file) {
console.log(file);
if (file.size / 1000 > 20 * 1024) {
this.$message({
type: "warning",
message: "上传图片大小超过20MB",
});
return false;
}
},
async getDetail() {
const res = await show({ id: this.id });
this.$integrateData(this.form, res);
this.file_ids = res.files.map((i) => {
return {
name: i.original_name,
url: i.url,
response: i,
};
});
},
submit() {
if (this.type === "add") {
if (this.form.hasOwnProperty("id")) {
delete this.form.id;
}
}
if (this.type === "editor") {
Object.defineProperty(this.form, "id", {
value: this.id,
enumerable: true,
configurable: true,
writable: true,
});
}
this.form.file_ids = this.file_ids.map((i) => i.response.id);
save(this.form).then((res) => {
this.$message({
type: "success",
message:
this.type === "add" ? "新增收入登记" : "编辑收入登记" + "成功",
});
this.isShow = false;
this.$emit("refresh");
});
},
},
watch: {
isShow(val) {
if (val) {
if (this.type === "editor") {
this.getDetail();
}
} else {
this.id = "";
this.type = "";
this.init();
this.$refs["dialog"].clearValidate();
delete this.form.id;
}
},
},
};
</script>
<style scoped lang="scss">
::v-deep .el-input__inner {
text-align: left;
}
</style>

@ -4,7 +4,6 @@
<lx-header
icon="md-apps"
style="margin-bottom: 10px; border: 0px; margin-top: 15px"
text="我的报销"
>
<div slot="content"></div>
<slot>
@ -114,14 +113,14 @@
<Button style="margin-left: 10px" type="primary" @click="$refs['addExpenseAccount'].type= 'add',$refs['addExpenseAccount'].show()"
>新增</Button
>
<Button style="margin-left: 10px" type="primary" @click=""
<Button style="margin-left: 10px" type="primary" @click="getList"
>查询</Button
>
<Button
style="margin-left: 10px"
type="primary"
@click="
() => (select = { page: 1, year: '', type: '', department: '' })
init
"
>重置
</Button>
@ -129,17 +128,37 @@
</slot>
</lx-header>
<xy-table></xy-table>
<xy-table row-key="id"
:list="list"
:table-item="table"
@delete="row => destroy(row.id)"
@editor="row => {
$refs['addExpenseAccount'].setType('editor');
$refs['addExpenseAccount'].setId(row.id);
$refs['addExpenseAccount'].show();
}"></xy-table>
<div style="display: flex;justify-content: flex-end;padding: 10px 0;">
<Page :total="total" @on-change="" show-elevator show-sizer @on-page-size-change="" />
<Page :total="total"
@on-change="e => {
select.page = e;
getList()
}"
show-elevator
show-sizer
@on-page-size-change="e => {
select.page_size = e;
select.page = 1;
getList();
}" />
</div>
<addExpenseAccount :other_types="otherType" :departments="departments" ref="addExpenseAccount"></addExpenseAccount>
<addExpenseAccount :other_types="otherType" :departments="departments" ref="addExpenseAccount" @refresh="getList"></addExpenseAccount>
</div>
</template>
<script>
import { getContract ,delContract } from '@/api/contract/contract'
import { getparameter } from '@/api/system/dictionary'
import { listdeptNoAuth } from '@/api/system/department'
@ -153,22 +172,34 @@ export default {
otherType: [],
total: 0,
select: {
page: 1,
page_size: 10
},
types: [],
departments: [],
list: [],
table: [
{
prop: '',
prop: 'name',
label: '项目名称',
width: 180,
width: 190,
fixed: 'left'
},
{
prop: '',
label: '报销类型',
label: this.$route.path.split('_')[1] == 2 ? '报销类型' : '支出类型',
width: 160,
customFn:row => {
let map = new Map([
[1,'医药报销支出'],
[2,'出差报销支出']
])
return this.$route.path.split('_')[1] == 2 ? (
<span>{ map.get(row.report_type) }</span>
) : (
<span>{ row.other_type?.value }</span>
)
}
},
{
prop: '',
@ -217,6 +248,25 @@ export default {
}
},
methods: {
init() {
for (let key in this.select) {
if (this.select[key] instanceof Array) {
this.select[key] = [];
} else {
this.select[key] = "";
}
}
this.select.page = 1
this.select.page_size = 10
},
async getList () {
const res = await getContract(this.select)
this.list = res.list.data
this.total = res.list.total
},
async getDepartment() {
this.departments = await listdeptNoAuth()
},
@ -226,15 +276,34 @@ export default {
number: 'other_type'
})
this.otherType = res.detail
},
destroy (id) {
delContract({
id
}).then(res => {
this.getList()
})
}
},
computed: {
typeText () {
return function (type) {
if (type == 2) {
return '报销'
}
if (type == 3) {
return '其他支出'
}
}
}
},
computed: {},
created() {
this.getDepartment()
this.getOtherType()
this.getList()
},
beforeRouteEnter (to, from , next) {
console.log(to.path.split('_')[1])
next()
}
}

@ -12,23 +12,23 @@
<div>
<span style="padding: 0 6px">创建日期</span>
<span>
<DatePicker
:value="select.year"
placeholder="选择开始日期"
placement="bottom"
style="width: 114px"
type="date"
@on-change="(e) => (select.year = e)"
></DatePicker>
<DatePicker
:value="select.year"
placeholder="选择结束日期"
placement="bottom"
style="width: 114px;margin-left: 6px;"
type="date"
@on-change="(e) => (select.year = e)"
></DatePicker>
</span>
<DatePicker
:value="select.year"
placeholder="选择开始日期"
placement="bottom"
style="width: 114px"
type="date"
@on-change="(e) => (select.year = e)"
></DatePicker>
<DatePicker
:value="select.year"
placeholder="选择结束日期"
placement="bottom"
style="width: 114px; margin-left: 6px"
type="date"
@on-change="(e) => (select.year = e)"
></DatePicker>
</span>
</div>
<div>
@ -40,112 +40,168 @@
placeholder="选择项目类型"
style="width: 130px"
>
<Option v-for="item in types" :key="item.id" :value="item.id">{{
item.value }}
<Option v-for="item in types" :key="item.id" :value="item.id"
>{{ item.value }}
</Option>
</Select>
</Select>
</span>
</div>
<div>
<span style="padding: 0 6px"> 科室 </span>
<span>
<Select
placeholder="科室选择"
clearable
v-model="select.department"
style="width: 130px"
>
<Option v-for="item in departments" :key="item.id" :value="item.id">{{ item.name }}</Option>
</Select>
</span>
<Select
placeholder="科室选择"
clearable
v-model="select.department"
style="width: 130px"
>
<Option
v-for="item in departments"
:key="item.id"
:value="item.id"
>{{ item.name }}</Option
>
</Select>
</span>
</div>
<div>
<span style="padding: 0 6px"> 报销类型 </span>
<span>
<Select
v-model="select.type"
clearable
placeholder="选择报销类型"
style="width: 130px"
>
<Option v-for="item in types" :key="item.id" :value="item.id">{{
<Select
v-model="select.type"
clearable
placeholder="选择报销类型"
style="width: 130px"
>
<Option v-for="item in types" :key="item.id" :value="item.id">{{
item.value
}}</Option>
</Select>
</span>
</Select>
</span>
</div>
<div>
<span style="padding: 0 6px"> 报销金额 </span>
<span>
<InputNumber
style="width: 110px;"
placeholder="最低价"
v-model="select.end_money"
:formatter="value => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')"
:parser="value => value.replace(/\s?|(,*)/g, '')"></InputNumber>
<InputNumber
style="width: 110px;margin-left: 6px;"
placeholder="最高价"
v-model="select.end_money"
:formatter="value => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')"
:parser="value => value.replace(/\s?|(,*)/g, '')"></InputNumber>
</span>
<InputNumber
style="width: 110px"
placeholder="最低价"
v-model="select.end_money"
:formatter="
(value) => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
"
:parser="(value) => value.replace(/\s?|(,*)/g, '')"
></InputNumber>
<InputNumber
style="width: 110px; margin-left: 6px"
placeholder="最高价"
v-model="select.end_money"
:formatter="
(value) => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
"
:parser="(value) => value.replace(/\s?|(,*)/g, '')"
></InputNumber>
</span>
</div>
<div>
<span style="padding: 0 6px"> 状态 </span>
<span>
<Select
v-model="select.type"
clearable
placeholder="选择状态"
style="width: 110px"
>
<Option v-for="item in types" :key="item.id" :value="item.id">{{
<Select
v-model="select.type"
clearable
placeholder="选择状态"
style="width: 110px"
>
<Option v-for="item in types" :key="item.id" :value="item.id">{{
item.value
}}</Option>
</Select>
</span>
</Select>
</span>
</div>
<Button style="margin-left: 10px" type="primary" @click=""
>新增</Button
>
<Button style="margin-left: 10px" type="primary" @click=""
>查询</Button
>
<Button
style="margin-left: 10px"
type="primary"
@click="
() => (select = { page: 1, year: '', type: '', department: '' })
$refs['addIncomeRegistration'].setType('add'),
$refs['addIncomeRegistration'].show()
"
>重置
>新增</Button
>
<Button style="margin-left: 10px" type="primary" @click="getList"
>查询</Button
>
<Button style="margin-left: 10px" type="primary" @click="init"
>重置
</Button>
</div>
</slot>
</lx-header>
<xy-table :list="list" :table-item="table"></xy-table>
<xy-table
:list="list"
:table-item="table"
@delete="(row) => destroy(row.id)"
@editor="
(row) => {
$refs['addIncomeRegistration'].setId(row.id);
$refs['addIncomeRegistration'].setType('editor');
$refs['addIncomeRegistration'].show();
}
"
></xy-table>
<div style="display: flex;justify-content: flex-end;padding: 10px 0;">
<Page :total="total" @on-change="" show-elevator show-sizer @on-page-size-change="" />
<div style="display: flex; justify-content: flex-end; padding: 10px 0">
<Page
:total="total"
@on-change="
(e) => {
select.page = e;
getList();
}
"
show-elevator
show-sizer
@on-page-size-change="
(e) => {
select.page_size = e;
select.page = 1;
getList();
}
"
/>
</div>
<addIncomeRegistration
:type_ids="incomeType"
:way_ids="way"
ref="addIncomeRegistration"
@refresh="getList"
></addIncomeRegistration>
</div>
</template>
<script>
import { listdeptNoAuth } from '@/api/system/department'
import { getparameter } from "@/api/system/dictionary";
import { index, destroy } from "@/api/income";
import { listdeptNoAuth } from "@/api/system/department";
import addIncomeRegistration from "@/views/inOut/component/addIncomeRegistration.vue";
export default {
components: {
addIncomeRegistration,
},
data() {
return {
way: [],
incomeType: [],
total: 0,
select: {
page: 1,
page_size: 10,
},
types: [],
departments: [],
@ -153,82 +209,123 @@ export default {
list: [],
table: [
{
prop: '',
label: '收入项目',
prop: "name",
label: "收入项目",
width: 180,
fixed: 'left'
fixed: "left",
},
{
prop: '',
label: '收入类型',
prop: "type.value",
label: "收入类型",
width: 160,
},
{
prop: '',
label: '收入来源',
prop: "from",
label: "收入来源",
width: 160,
},
{
prop: '',
label: '收入方式',
prop: "way.value",
label: "收入方式",
width: 160,
},
{
prop: '',
label: '收入金额(元)',
prop: "money",
label: "收入金额(元)",
width: 140,
align: 'right'
align: "right",
},
{
prop: '',
label: '实际收入金额(元)',
prop: "",
label: "实际收入金额(元)",
width: 140,
align: 'right'
align: "right",
},
{
prop: '',
label: '已入账金额',
prop: "",
label: "已入账金额",
width: 140,
align: 'right'
align: "right",
},
{
prop: 'department.name',
label: '业务科室',
width: 140
prop: "department.name",
label: "业务科室",
width: 140,
},
{
prop: '',
label: '状态',
width: 140
prop: "",
label: "状态",
width: 140,
},
{
prop: 'admin.name',
label: '经办人',
width: 140
prop: "admin.name",
label: "经办人",
width: 140,
},
{
prop: 'created_at',
label: '创建日期',
width: 180
}
]
}
prop: "created_at",
label: "创建日期",
width: 180,
},
],
};
},
methods: {
init() {
for (let key in this.select) {
if (this.select[key] instanceof Array) {
this.select[key] = [];
} else {
this.select[key] = "";
}
}
this.select.page = 1;
this.select.page_size = 10;
},
async getWay() {
const res = await getparameter({
number: "income_way",
});
this.way = res.detail;
},
async getIncomeType() {
const res = await getparameter({
number: "income_type",
});
this.incomeType = res.detail;
},
async getDepartment() {
this.departments = await listdeptNoAuth()
this.departments = await listdeptNoAuth();
},
async getList() {
const res = await index(this.select);
this.list = res.list.data;
this.total = res.list.total;
},
destroy(id) {
destroy({
id,
}).then((_) => {
this.getList();
});
},
},
computed: {},
created() {
this.getDepartment()
this.getWay();
this.getIncomeType();
this.getDepartment();
this.getList();
},
beforeRouteEnter (to, from , next) {
console.log(to.path.split('_')[1])
next()
}
}
beforeRouteEnter(to, from, next) {
console.log(to.path.split("_")[1]);
next();
},
};
</script>
<style scoped lang="scss">

Loading…
Cancel
Save