master
xy 3 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> <script>
import { getparameter } from '@/api/system/dictionary' 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' import { getBudget } from '@/api/budget/budget'
export default { export default {
props: { props: {
@ -332,9 +332,22 @@ export default {
async getDetail() { async getDetail() {
const res = await show({ id: this.id }); const res = await show({ id: this.id });
this.$integrateData(this.form, res); 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() { submit() {
this.form.contract_plan_links = this.form.contract_plan_links.map(i => i?.value)
if (this.type === "add") { if (this.type === "add") {
if (this.form.hasOwnProperty("id")) { if (this.form.hasOwnProperty("id")) {
delete this.form.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 <lx-header
icon="md-apps" icon="md-apps"
style="margin-bottom: 10px; border: 0px; margin-top: 15px" style="margin-bottom: 10px; border: 0px; margin-top: 15px"
text="我的报销"
> >
<div slot="content"></div> <div slot="content"></div>
<slot> <slot>
@ -114,14 +113,14 @@
<Button style="margin-left: 10px" type="primary" @click="$refs['addExpenseAccount'].type= 'add',$refs['addExpenseAccount'].show()" <Button style="margin-left: 10px" type="primary" @click="$refs['addExpenseAccount'].type= 'add',$refs['addExpenseAccount'].show()"
>新增</Button >新增</Button
> >
<Button style="margin-left: 10px" type="primary" @click="" <Button style="margin-left: 10px" type="primary" @click="getList"
>查询</Button >查询</Button
> >
<Button <Button
style="margin-left: 10px" style="margin-left: 10px"
type="primary" type="primary"
@click=" @click="
() => (select = { page: 1, year: '', type: '', department: '' }) init
" "
>重置 >重置
</Button> </Button>
@ -129,17 +128,37 @@
</slot> </slot>
</lx-header> </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;"> <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> </div>
<addExpenseAccount :other_types="otherType" :departments="departments" ref="addExpenseAccount"></addExpenseAccount> <addExpenseAccount :other_types="otherType" :departments="departments" ref="addExpenseAccount" @refresh="getList"></addExpenseAccount>
</div> </div>
</template> </template>
<script> <script>
import { getContract ,delContract } from '@/api/contract/contract'
import { getparameter } from '@/api/system/dictionary' import { getparameter } from '@/api/system/dictionary'
import { listdeptNoAuth } from '@/api/system/department' import { listdeptNoAuth } from '@/api/system/department'
@ -153,22 +172,34 @@ export default {
otherType: [], otherType: [],
total: 0, total: 0,
select: { select: {
page: 1,
page_size: 10
}, },
types: [], types: [],
departments: [], departments: [],
list: [],
table: [ table: [
{ {
prop: '', prop: 'name',
label: '项目名称', label: '项目名称',
width: 180, width: 190,
fixed: 'left' fixed: 'left'
}, },
{ {
prop: '', label: this.$route.path.split('_')[1] == 2 ? '报销类型' : '支出类型',
label: '报销类型',
width: 160, 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: '', prop: '',
@ -217,6 +248,25 @@ export default {
} }
}, },
methods: { 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() { async getDepartment() {
this.departments = await listdeptNoAuth() this.departments = await listdeptNoAuth()
}, },
@ -226,15 +276,34 @@ export default {
number: 'other_type' number: 'other_type'
}) })
this.otherType = res.detail 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() { created() {
this.getDepartment() this.getDepartment()
this.getOtherType() this.getOtherType()
this.getList()
}, },
beforeRouteEnter (to, from , next) { beforeRouteEnter (to, from , next) {
console.log(to.path.split('_')[1])
next() next()
} }
} }

@ -12,23 +12,23 @@
<div> <div>
<span style="padding: 0 6px">创建日期</span> <span style="padding: 0 6px">创建日期</span>
<span> <span>
<DatePicker <DatePicker
:value="select.year" :value="select.year"
placeholder="选择开始日期" placeholder="选择开始日期"
placement="bottom" placement="bottom"
style="width: 114px" style="width: 114px"
type="date" type="date"
@on-change="(e) => (select.year = e)" @on-change="(e) => (select.year = e)"
></DatePicker> ></DatePicker>
<DatePicker <DatePicker
:value="select.year" :value="select.year"
placeholder="选择结束日期" placeholder="选择结束日期"
placement="bottom" placement="bottom"
style="width: 114px;margin-left: 6px;" style="width: 114px; margin-left: 6px"
type="date" type="date"
@on-change="(e) => (select.year = e)" @on-change="(e) => (select.year = e)"
></DatePicker> ></DatePicker>
</span> </span>
</div> </div>
<div> <div>
@ -40,112 +40,168 @@
placeholder="选择项目类型" placeholder="选择项目类型"
style="width: 130px" style="width: 130px"
> >
<Option v-for="item in types" :key="item.id" :value="item.id">{{ <Option v-for="item in types" :key="item.id" :value="item.id"
item.value }} >{{ item.value }}
</Option> </Option>
</Select> </Select>
</span> </span>
</div> </div>
<div> <div>
<span style="padding: 0 6px"> 科室 </span> <span style="padding: 0 6px"> 科室 </span>
<span> <span>
<Select <Select
placeholder="科室选择" placeholder="科室选择"
clearable clearable
v-model="select.department" v-model="select.department"
style="width: 130px" style="width: 130px"
> >
<Option v-for="item in departments" :key="item.id" :value="item.id">{{ item.name }}</Option> <Option
</Select> v-for="item in departments"
</span> :key="item.id"
:value="item.id"
>{{ item.name }}</Option
>
</Select>
</span>
</div> </div>
<div> <div>
<span style="padding: 0 6px"> 报销类型 </span> <span style="padding: 0 6px"> 报销类型 </span>
<span> <span>
<Select <Select
v-model="select.type" v-model="select.type"
clearable clearable
placeholder="选择报销类型" placeholder="选择报销类型"
style="width: 130px" style="width: 130px"
> >
<Option v-for="item in types" :key="item.id" :value="item.id">{{ <Option v-for="item in types" :key="item.id" :value="item.id">{{
item.value item.value
}}</Option> }}</Option>
</Select> </Select>
</span> </span>
</div> </div>
<div> <div>
<span style="padding: 0 6px"> 报销金额 </span> <span style="padding: 0 6px"> 报销金额 </span>
<span> <span>
<InputNumber <InputNumber
style="width: 110px;" style="width: 110px"
placeholder="最低价" placeholder="最低价"
v-model="select.end_money" v-model="select.end_money"
:formatter="value => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')" :formatter="
:parser="value => value.replace(/\s?|(,*)/g, '')"></InputNumber> (value) => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
<InputNumber "
style="width: 110px;margin-left: 6px;" :parser="(value) => value.replace(/\s?|(,*)/g, '')"
placeholder="最高价" ></InputNumber>
v-model="select.end_money" <InputNumber
:formatter="value => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')" style="width: 110px; margin-left: 6px"
:parser="value => value.replace(/\s?|(,*)/g, '')"></InputNumber> placeholder="最高价"
</span> v-model="select.end_money"
:formatter="
(value) => `${value}`.replace(/\B(?=(\d{3})+(?!\d))/g, ',')
"
:parser="(value) => value.replace(/\s?|(,*)/g, '')"
></InputNumber>
</span>
</div> </div>
<div> <div>
<span style="padding: 0 6px"> 状态 </span> <span style="padding: 0 6px"> 状态 </span>
<span> <span>
<Select <Select
v-model="select.type" v-model="select.type"
clearable clearable
placeholder="选择状态" placeholder="选择状态"
style="width: 110px" style="width: 110px"
> >
<Option v-for="item in types" :key="item.id" :value="item.id">{{ <Option v-for="item in types" :key="item.id" :value="item.id">{{
item.value item.value
}}</Option> }}</Option>
</Select> </Select>
</span> </span>
</div> </div>
<Button style="margin-left: 10px" type="primary" @click=""
>新增</Button
>
<Button style="margin-left: 10px" type="primary" @click=""
>查询</Button
>
<Button <Button
style="margin-left: 10px" style="margin-left: 10px"
type="primary" type="primary"
@click=" @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> </Button>
</div> </div>
</slot> </slot>
</lx-header> </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;"> <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> </div>
<addIncomeRegistration
:type_ids="incomeType"
:way_ids="way"
ref="addIncomeRegistration"
@refresh="getList"
></addIncomeRegistration>
</div> </div>
</template> </template>
<script> <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 { export default {
components: {
addIncomeRegistration,
},
data() { data() {
return { return {
way: [],
incomeType: [],
total: 0, total: 0,
select: { select: {
page: 1,
page_size: 10,
}, },
types: [], types: [],
departments: [], departments: [],
@ -153,82 +209,123 @@ export default {
list: [], list: [],
table: [ table: [
{ {
prop: '', prop: "name",
label: '收入项目', label: "收入项目",
width: 180, width: 180,
fixed: 'left' fixed: "left",
}, },
{ {
prop: '', prop: "type.value",
label: '收入类型', label: "收入类型",
width: 160, width: 160,
}, },
{ {
prop: '', prop: "from",
label: '收入来源', label: "收入来源",
width: 160, width: 160,
}, },
{ {
prop: '', prop: "way.value",
label: '收入方式', label: "收入方式",
width: 160, width: 160,
}, },
{ {
prop: '', prop: "money",
label: '收入金额(元)', label: "收入金额(元)",
width: 140, width: 140,
align: 'right' align: "right",
}, },
{ {
prop: '', prop: "",
label: '实际收入金额(元)', label: "实际收入金额(元)",
width: 140, width: 140,
align: 'right' align: "right",
}, },
{ {
prop: '', prop: "",
label: '已入账金额', label: "已入账金额",
width: 140, width: 140,
align: 'right' align: "right",
}, },
{ {
prop: 'department.name', prop: "department.name",
label: '业务科室', label: "业务科室",
width: 140 width: 140,
}, },
{ {
prop: '', prop: "",
label: '状态', label: "状态",
width: 140 width: 140,
}, },
{ {
prop: 'admin.name', prop: "admin.name",
label: '经办人', label: "经办人",
width: 140 width: 140,
}, },
{ {
prop: 'created_at', prop: "created_at",
label: '创建日期', label: "创建日期",
width: 180 width: 180,
} },
] ],
};
}
}, },
methods: { 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() { 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: {}, computed: {},
created() { created() {
this.getDepartment() this.getWay();
this.getIncomeType();
this.getDepartment();
this.getList();
}, },
beforeRouteEnter (to, from , next) { beforeRouteEnter(to, from, next) {
console.log(to.path.split('_')[1]) console.log(to.path.split("_")[1]);
next() next();
} },
} };
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">

Loading…
Cancel
Save