xy 12 months ago
parent c562392f2e
commit f95779ae92

@ -2,7 +2,7 @@
ENV = 'production'
# base api
VUE_APP_BASE_API='http://192.168.16.110:8080'
VUE_APP_UPLOAD_API='http://192.168.16.110:8080/api/upload-file'
VUE_APP_BASE_API=''
VUE_APP_UPLOAD_API='/api/upload-file'
VUE_APP_PREVIEW=//view.langye.net/preview/onlinePreview
VUE_APP_MODULE_NAME=oa

@ -1,15 +1,140 @@
<template>
<div>
<vxe-modal
:value="isShow"
show-footer
title="车辆证照管理"
show-confirm-button
:width="840"
:height="660"
esc-closable
:fullscreen="$store.getters.device === 'mobile'"
@input="e => $emit('update:isShow',e)"
>
<el-form ref="elForm" :model="form" :rules="rules" label-position="top" label-width="100">
<el-form-item label="车辆" prop="vehicle_id">
<el-select v-model="form.vehicle_id" clearable style="width: 100%;">
<el-option v-for="item in vehicles" :key="item.id" :label="item.name" :value="item.id">
<span style="float: left">{{ item.name }}</span>
<span style="float: right; color: #8492a6; font-size: 13px">{{ item.driver }}</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="证书名称" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="发放日期" prop="grant_at">
<el-date-picker v-model="form.grant_at" value-format="yyyy-MM-dd" style="width: 100%;" />
</el-form-item>
<el-form-item label="到期日期" prop="expire_at">
<el-date-picker v-model="form.expire_at" value-format="yyyy-MM-dd" style="width: 100%;" />
</el-form-item>
<el-form-item label="续签日期" prop="renewed_at">
<el-date-picker v-model="form.renewed_at" value-format="yyyy-MM-dd" style="width: 100%;" />
</el-form-item>
<el-form-item label="核发机关" prop="grant_by">
<el-input v-model="form.grant_by" />
</el-form-item>
<el-form-item label="证书" prop="renewed_id" required>
<el-upload
:action="action"
:headers="{
Authorization: `Bearer ${getToken()}`
}"
:file-list="fileList"
:before-upload="beforeUploadUpload"
list-type="picture"
:limit="1"
:on-success="uploadSuccess"
:on-remove="uploadRemove"
>
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">文件大小不超过20Mb</div>
</el-upload>
</el-form-item>
<el-form-item label="证书编号" prop="serial">
<el-input v-model="form.serial" />
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" :loading="loading" @click="submit"></el-button>
</template>
</vxe-modal>
</div>
</template>
<script>
import { getToken } from '@/utils/auth'
import { save } from '@/api/vehicleCertificate'
export default {
props: {
isShow: {
type: Boolean,
default: false,
required: true
},
vehicles: {
type: Array,
default: () => []
}
},
data() {
return {}
return {
fileList: [],
action: process.env.VUE_APP_UPLOAD_API,
loading: false,
form: {
vehicle_id: '',
name: '',
grant_at: '',
expire_at: '',
renewed_at: '',
renewed_id: '',
grant_by: '',
serial: ''
},
rules: {}
}
},
methods: {},
computed: {},
methods: {
getToken,
uploadRemove() {
this.form.renewed_id = ''
},
uploadSuccess(response, file, fileList) {
this.fileList = fileList
this.form.renewed_id = this.fileList[0]?.response?.data?.id
},
beforeUploadUpload(file) {
const isLt20M = file.size / 1024 / 1024 < 20
if (!isLt20M) {
this.$message.error('上传大小不能超过 20MB!')
}
return isLt20M
},
submit() {
this.$refs['elForm'].validate(async valid => {
if (valid) {
this.loading = true
try {
await save(this.form)
this.$message.success('新增成功')
this.$emit('refresh')
this.$emit('update:isShow', false)
this.loading = false
this.$refs['elForm'].resetFields()
} catch (err) {
this.loading = false
}
}
})
}
}
}
</script>

@ -21,7 +21,7 @@
:data="tableData"
>
<vxe-column type="seq" width="58" align="center" />
<vxe-column field="name" width="170" title="名字" :edit-render="{ name: 'input', attrs: { type: 'text' } }" />
<vxe-column field="name" width="170" title="证书名称" :edit-render="{ name: 'input', attrs: { type: 'text' } }" />
<vxe-column field="key" width="150" title="标识" :edit-render="{ name: 'input', attrs: { type: 'text' } }" />
<vxe-column field="value" width="150" title="值" :edit-render="{ name: 'input', attrs: { type: 'text' } }" />
<vxe-column field="mysort" width="80" title="排序" align="center" :edit-render="{ name: 'input', attrs: { type: 'number' } }" />
@ -57,11 +57,12 @@
}"
/>
</card-container>
<add-vehicle-certificate ref="AddVehicleCertificate" :is-show.sync="isShowAdd" @refresh="getList" />
<add-vehicle-certificate ref="AddVehicleCertificate" :vehicles="vehicles" :is-show.sync="isShowAdd" @refresh="getList" />
</div>
</template>
<script>
import { index as vehicleIndex } from '@/api/vehicle'
import { deepCopy } from '@/utils'
import { index, save, destroy } from '@/api/vehicleCertificate'
import AddVehicleCertificate from './components/AddVehicleCertificate.vue'
@ -71,12 +72,14 @@ export default {
},
data() {
return {
vehicles: [],
isShowAdd: false,
loading: false,
select: {
page: 1,
page_size: 20
page_size: 20,
show_relation: ['vehicle', 'renewed']
},
total: 0,
allAlign: null,
@ -105,6 +108,7 @@ export default {
}
},
created() {
this.getVehicles()
this.getList()
},
methods: {
@ -122,6 +126,21 @@ export default {
}
},
async getVehicles () {
try {
const res = await vehicleIndex({
page: 1,
page_size: 9999,
'filter[0][key]': 'type',
'filter[0][op]': 'eq',
'filter[0][value]': 'vehicle'
})
this.vehicles = res.data
} catch (err) {
console.error(err)
}
},
async getList() {
this.loading = true
try {

@ -40,13 +40,27 @@
</el-tag>
<template v-if="selectDay && dayAttendances(selectDay).attendance.chuchai && dayAttendances(selectDay).attendance.chuchai instanceof Array && dayAttendances(selectDay).attendance.chuchai[0]">
<el-card>
<el-descriptions :column="2" size="mini">
<el-descriptions-item :span="2">
<el-tag>上午出差</el-tag>
</el-descriptions-item>
</el-descriptions>
</el-card>
<el-descriptions :column="2" size="mini" border>
<template #title>
<el-tag effect="dark" type="warning" size="mini">上午出差</el-tag>
</template>
<el-descriptions-item label="目的地">{{ dayAttendances(selectDay).attendance.chuchai[0].mudidi }}</el-descriptions-item>
<el-descriptions-item label="交通方式">{{ dayAttendances(selectDay).attendance.chuchai[0].jiaotongfangshi }}</el-descriptions-item>
<el-descriptions-item label="开始时间">{{ dayAttendances(selectDay).attendance.chuchai[0].kaishi }}</el-descriptions-item>
<el-descriptions-item label="结束时间">{{ dayAttendances(selectDay).attendance.chuchai[0].jieshu }}</el-descriptions-item>
</el-descriptions>
</template>
<template v-if="selectDay && dayAttendances(selectDay).attendance.chuchai && dayAttendances(selectDay).attendance.chuchai instanceof Array && dayAttendances(selectDay).attendance.chuchai[1]">
<el-descriptions :column="2" size="mini" border>
<template #title>
<el-tag effect="dark" type="warning" size="mini">下午出差</el-tag>
</template>
<el-descriptions-item label="目的地">{{ dayAttendances(selectDay).attendance.chuchai[1].mudidi }}</el-descriptions-item>
<el-descriptions-item label="交通方式">{{ dayAttendances(selectDay).attendance.chuchai[1].jiaotongfangshi }}</el-descriptions-item>
<el-descriptions-item label="开始时间">{{ dayAttendances(selectDay).attendance.chuchai[1].kaishi }}</el-descriptions-item>
<el-descriptions-item label="结束时间">{{ dayAttendances(selectDay).attendance.chuchai[1].jieshu }}</el-descriptions-item>
</el-descriptions>
</template>
<template v-if="selectDay && dayAttendances(selectDay).attendance.qingxiujia && dayAttendances(selectDay).attendance.qingxiujia instanceof Array && dayAttendances(selectDay).attendance.qingxiujia[0]">

@ -44,12 +44,23 @@
>
<vxe-column type="seq" width="64" align="center" />
<vxe-column field="document_menu.name" title="所属栏目" width="140" align="center" />
<vxe-column field="name" title="名称" width="160" align="center" />
<vxe-column field="file.original_name" title="文件" min-width="180" header-align="center" align="left" />
<vxe-column field="operate" title="操作" min-width="220">
<vxe-column field="name" title="名称" width="160" align="center" :edit-render="{ name: 'input', attrs: { type: 'text' } }" />
<vxe-column field="file.original_name" title="文件" min-width="180" header-align="center" align="left" :edit-render="{}">
<template #edit="{ row }">
<vxe-upload v-model="row.file" progress-text="{percent}%" :more-config="{ maxCount: 1, layout: 'horizontal' }" :limit-size="20" :show-button-text="false" :upload-method="({file}) => uploadMethod(file, row)"></vxe-upload>
</template>
</vxe-column>
<vxe-column field="operate" title="操作" min-width="240">
<template #default="{ row }">
<el-button size="small" type="primary" icon="el-icon-search" @click="preview(row)"></el-button>
<el-button size="small" type="danger" @click="destroyRowEvent(row)"></el-button>
<template v-if="isActiveStatus(row)">
<el-button size="small" type="primary" @click="saveRowEvent(row)"></el-button>
<el-button size="small" type="primary" plain @click="cancelRowEvent(row)"></el-button>
</template>
<template v-else>
<el-button size="small" type="primary" icon="el-icon-search" @click="preview(row)"></el-button>
<el-button size="small" type="warning" @click="editRowEvent(row)"></el-button>
<el-button size="small" type="danger" @click="destroyRowEvent(row)"></el-button>
</template>
</template>
</vxe-column>
</vxe-table>
@ -79,7 +90,10 @@
<script>
import AddDocument from './components/AddDocument.vue'
import { menuIndex, index, destroy } from '@/api/document'
import { menuIndex, index, destroy, save } from '@/api/document'
import { deepCopy } from "@/utils";
import axios from "axios";
import { getToken } from "@/utils/auth";
export default {
components: {
AddDocument
@ -99,12 +113,28 @@ export default {
page: 1,
page_size: 20,
'filter[0][key]': 'document_menu_id',
'filter[0][eq]': 'eq',
'filter[0][op]': 'eq',
'filter[0][value]': ''
}
},
form: {
id: '',
document_menu_id: '',
name: '',
file_id: '',
update_children_ids: '',
myindex: ''
},
}
},
computed: {},
computed: {
isActiveStatus() {
return function(row) {
if (this.$refs['table']) {
return this.$refs['table'].isEditByRow(row)
}
}
},
},
watch: {
filterText(val) {
this.$refs.tree.filter(val)
@ -129,13 +159,33 @@ export default {
return data.name.indexOf(value) !== -1
},
uploadMethod(file, row) {
const formData = new FormData()
formData.append('file', file)
return axios.post(process.env.VUE_APP_UPLOAD_API, formData, {
headers: {
Authorization: `Bearer ${getToken()}`,
}
}).then((response) => {
if (response.status === 200 && !response.data.code) {
row.file_id = response.data.data.id
row.file = response.data.data
} else {
this.$message.error("上传失败")
}
})
},
async getList() {
try {
this.loading = true
const res = await index(this.select)
this.tableData = res.data
this.total = res.total
this.loading = false
} catch (err) {
console.error(err)
this.loading = false
}
},
async getTypes() {
@ -146,6 +196,42 @@ export default {
console.error(err)
}
},
editRowEvent(row) {
if (this.$refs['table']) {
this.$refs['table'].setEditRow(row)
}
},
cancelRowEvent(row) {
if (this.$refs['table']) {
this.$refs['table'].clearEdit().then(() => {
//
this.$refs['table'].revertData(row)
})
}
},
async saveRowEvent(row) {
try {
const errMap = await this.$refs['table'].validate()
if (errMap) {
throw new Error(errMap)
}
await this.$confirm('确认保存?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消'
})
await this.$refs['table'].clearEdit()
const form = deepCopy(this.form)
for (const key in form) {
form[key] = row[key]
}
this.loading = true
await save(form)
await this.getList()
this.loading = false
} catch (err) {
this.loading = false
}
},
async destroyRowEvent(row) {
try {
await this.$confirm('确认删除?', '提示', {
@ -176,10 +262,10 @@ export default {
display: flex;
justify-content: space-between;
& > div:nth-child(1) {
& > *:nth-child(1) {
flex-basis: 20%;
}
& > div:nth-child(2) {
& > *:nth-child(2) {
flex-basis: 78%;
margin-left: 10px;
}
@ -189,7 +275,7 @@ export default {
.container {
display: initial;
& > div:nth-child(2) {
& > *:nth-child(2) {
margin-top: 10px;
margin-left: 0;
}

@ -148,15 +148,15 @@ export default {
},
beforePhotoUpload(file) {
const isJPG = file.type === 'image/jpeg'
const isLt10M = file.size / 1024 / 1024 < 10
const isLt20M = file.size / 1024 / 1024 < 20
if (!isJPG) {
this.$message.error('上传头像图片只能是 JPG 格式!')
}
if (!isLt10M) {
this.$message.error('上传头像图片大小不能超过 10MB!')
if (!isLt20M) {
this.$message.error('上传头像图片大小不能超过 20MB!')
}
return isJPG && isLt10M
return isJPG && isLt20M
},
submit() {

@ -29,48 +29,50 @@
<vxe-column field="driver" width="120" title="驾驶员" :edit-render="{ name: 'input', attrs: { type: 'text' } }" />
<vxe-column field="start_date" width="170" title="上牌日期" :edit-render="{}">
<template #edit="{ row }">
<el-date-picker style="width: 100%;" v-model="row.start_date" value-format="yyyy-MM-dd" />
<el-date-picker style="width: 100%;" v-model="row.start_date" size="small" value-format="yyyy-MM-dd" />
</template>
</vxe-column>
<vxe-column width="200" title="照片" field="">
<vxe-column width="200" title="照片" field="photo_file.original_name" :edit-render="{}">
<template #edit="{ row }">
<vxe-upload v-model="row.photo_file" progress-text="{percent}%" :more-config="{ maxCount: 1, layout: 'horizontal' }" :limit-size="20" :show-button-text="false" :upload-method="({file}) => uploadMethod(file, row)"></vxe-upload>
</template>
</vxe-column>
<vxe-column field="insurance_expire" width="170" title="保险到期日期" :edit-render="{}">
<template #edit="{ row }">
<el-date-picker style="width: 100%;" v-model="row.insurance_expire" value-format="yyyy-MM-dd" />
<el-date-picker style="width: 100%;" v-model="row.insurance_expire" value-format="yyyy-MM-dd" size="small" />
</template>
</vxe-column>
<vxe-column field="inspect_date" width="170" title="年检日期" :edit-render="{}">
<template #edit="{ row }">
<el-date-picker style="width: 100%;" v-model="row.inspect_date" value-format="yyyy-MM-dd" />
<el-date-picker style="width: 100%;" v-model="row.inspect_date" value-format="yyyy-MM-dd" size="small" />
</template>
</vxe-column>
<vxe-column field="maintain_expire" width="170" title="保养日期" :edit-render="{}">
<template #edit="{ row }">
<el-date-picker style="width: 100%;" v-model="row.maintain_expire" value-format="yyyy-MM-dd" />
<el-date-picker style="width: 100%;" v-model="row.maintain_expire" value-format="yyyy-MM-dd" size="small" />
</template>
</vxe-column>
<vxe-column field="discard_date" width="170" title="报废日期" :edit-render="{}">
<template #edit="{ row }">
<el-date-picker style="width: 100%;" v-model="row.discard_date" value-format="yyyy-MM-dd" />
<el-date-picker style="width: 100%;" v-model="row.discard_date" value-format="yyyy-MM-dd" size="small" />
</template>
</vxe-column>
<vxe-column field="end_date" width="170" title="归属结束日期" :edit-render="{}">
<template #edit="{ row }">
<el-date-picker style="width: 100%;" v-model="row.end_date" value-format="yyyy-MM-dd" />
<el-date-picker style="width: 100%;" v-model="row.end_date" value-format="yyyy-MM-dd" size="small" />
</template>
</vxe-column>
<vxe-column field="status" title="车辆状态" width="120" :edit-render="{}">
<vxe-column field="status" title="车辆状态" width="120" :edit-render="{}" :formatter="({ cellValue }) => cellValue ? '正常可用' : '维修中'">
<template #edit="{ row }">
<el-select v-model="row.status" style="width: 100%;">
<el-select v-model="row.status" style="width: 100%;" size="small">
<el-option :value="1" label="正常可用" />
<el-option :value="-1" label="维修中" />
</el-select>
</template>
</vxe-column>
<vxe-column field="is_open_detail" title="是否开放精准预约" width="120" :edit-render="{}">
<vxe-column field="is_open_detail" title="是否开放精准预约" width="120" :edit-render="{}" :formatter="({ cellValue }) => cellValue ? '开放' : '不开放'">
<template #edit="{ row }">
<el-select v-model="row.is_open_detail" style="width: 100%;">
<el-select v-model="row.is_open_detail" style="width: 100%;" size="small">
<el-option :value="1" label="开放" />
<el-option :value="0" label="不开放" />
</el-select>
@ -117,6 +119,8 @@ import { index as departmentIndex } from '@/api/department'
import { deepCopy } from '@/utils'
import { index, save, destroy } from '@/api/vehicle'
import AddVehicle from './components/AddVehicle.vue'
import axios from "axios";
import {getToken} from "@/utils/auth";
export default {
components: {
AddVehicle
@ -130,7 +134,7 @@ export default {
select: {
page: 1,
page_size: 20,
// show_relation: ['photo_file']
show_relation: ['photo_file']
},
total: 0,
allAlign: null,
@ -173,6 +177,22 @@ export default {
this.getList()
},
methods: {
uploadMethod(file, row) {
const formData = new FormData()
formData.append('file', file)
return axios.post(process.env.VUE_APP_UPLOAD_API, formData, {
headers: {
Authorization: `Bearer ${getToken()}`,
}
}).then((response) => {
if (response.status === 200 && !response.data.code) {
row.photo_file_id = response.data.data.id
row.photo_file = response.data.data
} else {
this.$message.error("上传失败")
}
})
},
editRowEvent(row) {
if (this.$refs['table']) {
this.$refs['table'].setEditRow(row)

Loading…
Cancel
Save