完成固定资产列表

master
lynn 7 months ago
parent 6004011f49
commit fdf9383d2c

@ -0,0 +1,30 @@
import request from '@/utils/request'
// 获取固定资产列表
export function getFixAssetsList(data) {
return request({
url: '/api/admin/asset/index',
method: 'post',
data,
headers: {
'Content-Type': 'multipart/form-data'
}
})
}
// 删除固定资产
export function destroyFixAssets(id) {
return request({
url: '/api/admin/asset/destroy?id=' + id,
method: 'get'
})
}
// 新增或更新固定资产
export function saveFixAssets(data) {
return request({
url: '/api/admin/asset/save',
method: 'post',
data
})
}

@ -0,0 +1,286 @@
<template>
<div>
<el-dialog :visible.sync="isShow" width="800px" :title="type==='add'?'新增固定资产':'编辑固定资产'" @close="handleClose" destroy-on-close>
<div class="form-row">
<div class="xy-table-item type-dialog-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"><Input v-model="form.asset_code" style="width:100%;" placeholder="请输入资产编号" /></div>
</div>
<div class="xy-table-item type-dialog-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"><Input v-model="form.asset_name" style="width:100%;" placeholder="请输入资产名称" /></div>
</div>
</div>
<div class="form-row">
<div class="xy-table-item type-dialog-item">
<div class="xy-table-item-label">国标分类</div>
<div class="xy-table-item-content"><Input v-model="form.gb_category" style="width:100%;" placeholder="请输入国标分类" /></div>
</div>
<div class="xy-table-item type-dialog-item">
<div class="xy-table-item-label">类别名称</div>
<div class="xy-table-item-content"><Input v-model="form.category_name" style="width:100%;" placeholder="请输入类别名称" /></div>
</div>
</div>
<div class="form-row">
<div class="xy-table-item type-dialog-item">
<div class="xy-table-item-label">规格型号</div>
<div class="xy-table-item-content"><Input v-model="form.model" style="width:100%;" placeholder="请输入规格型号" /></div>
</div>
<div class="xy-table-item type-dialog-item">
<div class="xy-table-item-label">数量</div>
<div class="xy-table-item-content"><el-input-number v-model="form.quantity" style="width:100%;" :min="0" :step="1" placeholder="请输入数量" /></div>
</div>
</div>
<div class="form-row">
<div class="xy-table-item type-dialog-item">
<div class="xy-table-item-label">计量单位</div>
<div class="xy-table-item-content"><Input v-model="form.unit" style="width:100%;" placeholder="请输入计量单位" /></div>
</div>
<div class="xy-table-item type-dialog-item">
<div class="xy-table-item-label">购置时间</div>
<div class="xy-table-item-content"><DatePicker v-model="form.purchase_date" type="year" format="yyyy" value-format="yyyy" style="width:100%;max-width:100%;" placeholder="请选择购置年份" /></div>
</div>
</div>
<div class="form-row">
<div class="xy-table-item type-dialog-item">
<div class="xy-table-item-label">使用期限</div>
<div class="xy-table-item-content"><el-input-number v-model="form.use_life" style="width:100%;" :min="0" :step="1" placeholder="请输入使用期限" /></div>
</div>
<div class="xy-table-item type-dialog-item">
<div class="xy-table-item-label">原值</div>
<div class="xy-table-item-content"><el-input-number v-model="form.original_value" style="width:100%;" :min="0" :step="0.01" :precision="2" placeholder="请输入原值" /></div>
</div>
</div>
<div class="form-row">
<div class="xy-table-item type-dialog-item">
<div class="xy-table-item-label">使用科室</div>
<div class="xy-table-item-content"><Input v-model="form.department" style="width:100%;" placeholder="请输入使用科室" /></div>
</div>
<div class="xy-table-item type-dialog-item">
<div class="xy-table-item-label">保管人</div>
<div class="xy-table-item-content"><Input v-model="form.keeper" style="width:100%;" placeholder="请输入保管人" /></div>
</div>
</div>
<div class="form-row">
<div class="xy-table-item type-dialog-item">
<div class="xy-table-item-label">存放地点</div>
<div class="xy-table-item-content"><Input v-model="form.location" style="width:100%;" placeholder="请输入存放地点" /></div>
</div>
<div class="xy-table-item type-dialog-item">
<div class="xy-table-item-label">所属库</div>
<div class="xy-table-item-content"><Input v-model="form.warehouse" style="width:100%;" placeholder="请输入所属库" /></div>
</div>
</div>
<div class="form-row">
<div class="xy-table-item type-dialog-item">
<div class="xy-table-item-label">使用方向</div>
<div class="xy-table-item-content"><Input v-model="form.usage_direction" style="width:100%;" placeholder="请输入使用方向" /></div>
</div>
<div class="xy-table-item type-dialog-item">
<div class="xy-table-item-label">备注</div>
<div class="xy-table-item-content"><Input v-model="form.remark" style="width:100%;" placeholder="请输入备注" /></div>
</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="isShow = false"> </el-button>
<el-button type="primary" @click="submit"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { saveFixAssets } from '@/api/system/fixAssets.js'
export default {
data() {
return {
isShow: false,
type: 'add',
id: '',
form: {
asset_code: '',
asset_name: '',
gb_category: '',
category_name: '',
model: '',
quantity: 0,
unit: '',
purchase_date: '',
use_life: 0,
original_value: 0,
department: '',
keeper: '',
location: '',
warehouse: '',
usage_direction: '',
remark: ''
},
rules: {
asset_code: [{ required: true, message: '请输入资产编号' }],
asset_name: [{ required: true, message: '请输入资产名称' }]
}
}
},
methods: {
handleClose() {
this.isShow = false;
this.resetForm();
},
resetForm() {
Object.assign(this.form, {
asset_code: '',
asset_name: '',
gb_category: '',
category_name: '',
model: '',
quantity: 0,
unit: '',
purchase_date: '',
use_life: 0,
original_value: 0,
department: '',
keeper: '',
location: '',
warehouse: '',
usage_direction: '',
remark: ''
});
},
open(type = 'add', row = null) {
this.resetForm();
this.type = type;
this.isShow = true;
if (type === 'editor' && row) {
this.id = row.id;
Object.assign(this.form, {
asset_code: row.asset_number || '',
asset_name: row.name || '',
gb_category: row.category || '',
category_name: row.category_name || '',
department: row.usage_department || '',
model: row.model || '',
unit: row.unit || '',
use_life: row.expire_date || '',
purchase_date: row.purchase_date ? String(row.purchase_date).slice(0, 4) : '',
original_value: row.value || '',
quantity: row.quantity || 0,
keeper: row.custodian || '',
location: row.storage_location || '',
warehouse: row.storehouse || '',
usage_direction: row.usage_direction || '',
remark: row.remarks || ''
});
} else {
this.id = '';
}
},
toCSTDateString(date) {
if (!date) return '';
const d = new Date(date);
d.setMinutes(d.getMinutes() + d.getTimezoneOffset() + 480);
const y = d.getFullYear();
const m = (d.getMonth() + 1).toString().padStart(2, '0');
const day = d.getDate().toString().padStart(2, '0');
return `${y}-${m}-${day}`;
},
submit() {
const params = {
id: this.type === 'editor' ? this.id : undefined,
asset_number: this.form.asset_code,
category: this.form.gb_category,
model: this.form.model,
unit: this.form.unit,
expire_date: this.form.use_life,
usage_department: this.form.department,
storage_location: this.form.location,
name: this.form.asset_name,
category_name: this.form.category_name,
quantity: this.form.quantity,
purchase_date: this.form.purchase_date
? (typeof this.form.purchase_date === 'string'
? this.form.purchase_date.slice(0, 4)
: (this.form.purchase_date.getFullYear
? String(this.form.purchase_date.getFullYear())
: '')
)
: '',
value: this.form.original_value,
usage_direction: this.form.usage_direction,
custodian: this.form.keeper,
storehouse: this.form.warehouse,
remarks: this.form.remark
};
console.log(params);
saveFixAssets(params).then(res => {
this.$message({
type: 'success',
message: this.type === 'add' ? '新增成功' : '编辑成功'
})
this.$emit('refresh')
this.isShow = false
})
}
}
}
</script>
<style scoped lang="scss">
.form-row {
display: flex;
justify-content: space-between;
margin-bottom: 0;
}
.xy-table-item.type-dialog-item {
width: 48%;
margin-bottom: 28px;
}
::v-deep .xy-table-item-label {
min-width: 140px !important;
width: 140px !important;
font-size: 16px;
text-align: right;
padding-right: 20px;
display: flex;
align-items: center;
justify-content: flex-end;
}
.type-dialog-item {
margin-bottom: 28px;
display: flex;
align-items: center;
}
.xy-table-item-content {
flex: 1;
display: flex;
align-items: center;
}
::v-deep .el-dialog {
border-radius: 12px;
}
::v-deep .el-button--primary {
border-radius: 6px;
font-size: 15px;
padding: 8px 24px;
}
::v-deep .ivu-select,
::v-deep .ivu-input-wrapper {
width: 100%;
}
::v-deep .el-date-editor {
width: 100% !important;
max-width: 100% !important;
}
::v-deep .xy-dialog-form-item {
margin-bottom: 0;
position: relative;
}
::v-deep .xy-dialog-form-item .ivu-form-item-error-tip {
position: absolute;
top: 50%;
transform: translateY(-50%);
left: 510px;
margin-left: 10px;
line-height: 1;
padding-top: 0;
}
</style>

@ -0,0 +1,280 @@
<template>
<div class="table-page-container">
<div ref="lxHeader">
<lx-header icon="md-apps" text="固定资产管理" style="margin-bottom: 10px; border: 0px; margin-top: 15px">
<slot>
<div style="display: flex;justify-content: flex-start;flex-wrap: wrap;">
<DatePicker v-model="select.purchase_date" type="year" placeholder="购置年份" style="width: 200px;margin-right: 10px;" clearable />
<Input v-model="select.asset_number" style="width: 200px;margin-right: 10px;" placeholder="资产编号" clearable />
<Input v-model="select.name" style="width: 200px;margin-right: 10px;" placeholder="资产名称" clearable />
<Input v-model="select.usage_department" style="width: 200px;margin-right: 10px;" placeholder="使用科室" clearable />
<Input v-model="select.custodian" style="width: 200px;margin-right: 10px;" placeholder="保管人" clearable />
<Button type="primary" style="margin-left: 8px;" @click="resetSelect"></Button>
<Button type="primary" style="margin-left: 8px;" @click="getWarehouseList"></Button>
<Button type="primary" style="margin-left: 8px;" @click="handleAdd"></Button>
<!-- <Button icon="ios-add" type="primary" style="margin-left: 10px;"
@click="$refs['imports'].show()">导入</Button> -->
</div>
</slot>
</lx-header>
</div>
<div class="table-flex-content">
<xy-table :list="list" :total="total" @pageSizeChange="pageSizeChange" @pageIndexChange="pageChange"
:table-item="table" size="medium" :height="tableHeight" style="border-radius: 10px; overflow: hidden; box-shadow: 0 2px 12px 0 rgba(0,0,0,0.08); width: 100%;">
<template v-slot:btns>
<el-table-column fixed="right" label="操作" align="center" min-width="140" header-align="center" class-name="table-col-action">
<template slot-scope="scope">
<div style="display: flex; gap: 8px; justify-content: center;">
<Button type="primary" size="small" style="border-radius: 6px;" @click="$refs.addFixAssets.open('editor', scope.row)">编辑</Button>
<Button type="primary" style="margin-left: 0; border-radius: 6px;" size="small" ghost @click="delRow(scope.row.id)"></Button>
</div>
</template>
</el-table-column>
</template>
</xy-table>
<AddFixAssets ref="addFixAssets" :warehouseList="list" @refresh="getWarehouseList"></AddFixAssets>
</div>
</div>
</template>
<script>
import {
destroy,
index
} from "@/api/system/baseForm.js"
import { getWarehouseTypeList, destroyWarehouseType } from '@/api/system/warehouse'
import { getStorehouseTypeList } from '@/api/system/storehouseType'
import AddWarehouse from './components/addWarehouse.vue'
import {
getparameteritem
} from "@/api/system/dictionary.js"
import AddFixAssets from './components/addFixAssets.vue'
import { getFixAssetsList, destroyFixAssets, saveFixAssets } from '@/api/system/fixAssets.js'
export default {
components: {
AddFixAssets,
},
data() {
return {
select: {
page: 1,
page_size: 10,
purchase_date: '',
asset_number: '',
name: '',
usage_department: '',
custodian: '',
table_name: 'materialstorages',
area:''
},
typeList: [],
nameList: [],
areaList:[],
total: 0,
list: [],
table: [
{ label: '序号', type: 'index', width: 60 },
{ label: '资产编号', prop: 'asset_number', minWidth: 120 },
{ label: '资产名称', prop: 'name', minWidth: 120 },
{ label: '国标分类', prop: 'category', minWidth: 120 },
{ label: '类别名称', prop: 'category_name', minWidth: 120 },
{ label: '规格型号', prop: 'model', minWidth: 120 },
{ label: '数量', prop: 'quantity', minWidth: 80 },
{ label: '计量单位', prop: 'unit', minWidth: 80 },
{ label: '购置时间', prop: 'purchase_date', minWidth: 120 },
{ label: '使用期限', prop: 'expire_date', minWidth: 100 },
{ label: '原值', prop: 'value', minWidth: 100 },
{ label: '使用科室', prop: 'usage_department', minWidth: 120 },
{ label: '保管人', prop: 'custodian', minWidth: 100 },
{ label: '存放地点', prop: 'storage_location', minWidth: 120 },
{ label: '所属库', prop: 'storehouse', minWidth: 120 },
{ label: '使用方向', prop: 'usage_direction', minWidth: 120 },
{ label: '备注', prop: 'remarks', minWidth: 120 }
],
tableHeight: 550 //
}
},
created() {
this.getWarehouseList()
},
mounted() {
this.calcTableHeight();
window.addEventListener('resize', this.calcTableHeight);
},
beforeDestroy() {
window.removeEventListener('resize', this.calcTableHeight);
},
methods: {
async getTypeList() {
try {
const formData = new FormData();
formData.append('page', 1);
formData.append('page_size', 1000);
const res = await getStorehouseTypeList(formData);
this.typeList = res.data;
} catch (e) {
this.$message.error('获取仓库类型列表失败');
}
},
async getWarehouseListByType(typeId) {
try {
const res = await index({
table_name: 'materialstorages',
filter: [{
key: 'storehouses_id',
op: 'eq',
value: typeId
}]
});
this.nameList = res.data;
} catch (e) {
this.$message.error('获取仓库列表失败');
}
},
handleTypeChange(typeId) {
this.select.type = typeId;
this.select.name = ''; //
this.getWarehouseListByType(typeId);
},
async getWarehouseList() {
try {
const formData = new FormData();
formData.append('page', this.select.page);
formData.append('page_size', this.select.page_size);
// filter
let filterIdx = 0;
if (this.select.purchase_date) {
const year = typeof this.select.purchase_date === 'string'
? this.select.purchase_date.slice(0, 4)
: (this.select.purchase_date.getFullYear
? String(this.select.purchase_date.getFullYear())
: '');
formData.append(`filter[${filterIdx}][key]`, 'purchase_date');
formData.append(`filter[${filterIdx}][op]`, 'like');
formData.append(`filter[${filterIdx}][value]`, year);
filterIdx++;
}
if (this.select.asset_number) {
formData.append(`filter[${filterIdx}][key]`, 'asset_number');
formData.append(`filter[${filterIdx}][op]`, 'like');
formData.append(`filter[${filterIdx}][value]`, this.select.asset_number);
filterIdx++;
}
if (this.select.name) {
formData.append(`filter[${filterIdx}][key]`, 'name');
formData.append(`filter[${filterIdx}][op]`, 'like');
formData.append(`filter[${filterIdx}][value]`, this.select.name);
filterIdx++;
}
if (this.select.usage_department) {
formData.append(`filter[${filterIdx}][key]`, 'usage_department');
formData.append(`filter[${filterIdx}][op]`, 'like');
formData.append(`filter[${filterIdx}][value]`, this.select.usage_department);
filterIdx++;
}
if (this.select.custodian) {
formData.append(`filter[${filterIdx}][key]`, 'custodian');
formData.append(`filter[${filterIdx}][op]`, 'like');
formData.append(`filter[${filterIdx}][value]`, this.select.custodian);
filterIdx++;
}
const res = await getFixAssetsList(formData);
this.list = res.data;
this.total = res.total;
} catch (e) {
this.$message.error('获取库房列表失败');
}
},
pageChange(e) {
this.select.page = e
this.getWarehouseList()
},
pageSizeChange(e){
this.select.page_size = e
this.getWarehouseList()
},
delRow(id) {
if (id) {
this.$confirm('确认要删除该库房吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
try {
await destroyFixAssets(id);
this.$message.success('删除成功');
this.getWarehouseList();
} catch (e) {
this.$message.error('删除失败');
}
});
}
},
calcTableHeight() {
const header = this.$refs.lxHeader ? this.$refs.lxHeader.offsetHeight : 0;
const windowHeight = window.innerHeight;
const minTableHeight = 600; //
this.tableHeight = Math.max(windowHeight - header - 100, minTableHeight);
},
resetSelect() {
this.select = {
page: 1,
page_size: 10,
purchase_date: '',
asset_number: '',
name: '',
usage_department: '',
custodian: '',
table_name: 'materialstorages',
area: ''
};
this.nameList = [];
this.getWarehouseList();
},
handleAdd() {
if (this.$refs.addFixAssets) {
this.$refs.addFixAssets.resetForm();
this.$refs.addFixAssets.open('add');
}
},
}
}
</script>
<style>
.table-page-container {
display: flex;
flex-direction: column;
height: 100vh;
box-sizing: border-box;
background: #f5f7fa;
}
.table-flex-content {
flex: 1 1 0;
display: flex;
flex-direction: column;
min-height: 0;
}
.el-table th {
background: #f5f7fa !important;
color: #333;
font-weight: bold;
font-size: 15px;
}
.el-table td {
font-size: 14px;
height: 48px;
}
.el-table {
border-radius: 10px;
overflow: hidden;
width: 100%;
height: 100%;
}
/* 让操作列自动填充剩余空间 */
.table-col-action {
flex: 1 !important;
}
</style>
Loading…
Cancel
Save