This commit is contained in:
2026-07-27 17:19:36 +08:00
parent e50d1b8fda
commit 1c7532e0de
132 changed files with 7066 additions and 1241 deletions

View File

@@ -2,13 +2,31 @@
<basic-container class="transport-ship-page">
<div class="ship-toolbar">
<div class="ship-toolbar__actions">
<el-button type="primary" icon="el-icon-plus" plain v-if="hasPermission('transport_ship_add')" @click="openShip()">
<el-button
type="primary"
icon="el-icon-plus"
plain
v-if="hasPermission('transport_ship_add')"
@click="openShip()"
>
新增
</el-button>
<el-button type="primary" icon="el-icon-download" plain v-if="hasPermission('transport_ship_export')" @click="handleExport">
<el-button
type="primary"
icon="el-icon-download"
plain
v-if="hasPermission('transport_ship_export')"
@click="handleExport"
>
导出
</el-button>
<el-button type="danger" icon="el-icon-delete" plain v-if="hasPermission('transport_ship_delete')" @click="handleDelete">
<el-button
type="danger"
icon="el-icon-delete"
plain
v-if="hasPermission('transport_ship_delete')"
@click="handleDelete"
>
批量删除
</el-button>
</div>
@@ -56,7 +74,11 @@
</span>
</template>
<template #businessTransportCertEndDate="{ row }">
<span :class="getDateClass(row, 'businessTransportCertEndDate', 'businessTransportCertLongTerm')">
<span
:class="
getDateClass(row, 'businessTransportCertEndDate', 'businessTransportCertLongTerm')
"
>
{{ formatEndDate(row.businessTransportCertEndDate, row.businessTransportCertLongTerm) }}
</span>
</template>
@@ -66,10 +88,22 @@
</span>
</template>
<template #menu="{ row }">
<el-button type="primary" text icon="el-icon-edit" v-if="hasPermission('transport_ship_edit')" @click="openShip(row)">
<el-button
type="primary"
text
icon="el-icon-edit"
v-if="hasPermission('transport_ship_edit')"
@click="openShip(row)"
>
修改
</el-button>
<el-button type="primary" text icon="el-icon-view" v-if="hasPermission('transport_ship_view')" @click="openShip(row, true)">
<el-button
type="primary"
text
icon="el-icon-view"
v-if="hasPermission('transport_ship_view')"
@click="openShip(row, true)"
>
综合台账
</el-button>
<el-button
@@ -84,8 +118,22 @@
</template>
</avue-crud>
<el-dialog :title="dialogTitle" append-to-body v-model="shipBox" width="92%" top="4vh" @closed="resetShip">
<el-form ref="shipForm" :model="shipForm" :rules="formRules" label-position="top" :disabled="readonly" class="ship-form">
<el-dialog
:title="dialogTitle"
append-to-body
v-model="shipBox"
width="92%"
top="4vh"
@closed="resetShip"
>
<el-form
ref="shipForm"
:model="shipForm"
:rules="formRules"
label-position="right"
:disabled="readonly"
class="ship-form"
>
<div class="section-title">基础船舶信息</div>
<el-row :gutter="18">
<el-col :span="6">
@@ -95,7 +143,14 @@
</el-col>
<el-col :span="6">
<el-form-item label="船舶识别号" prop="shipIdentifierNo">
<el-input v-model="shipForm.shipIdentifierNo" maxlength="50" show-word-limit @input="shipForm.shipIdentifierNo = String(shipForm.shipIdentifierNo || '').toUpperCase()" />
<el-input
v-model="shipForm.shipIdentifierNo"
maxlength="50"
show-word-limit
@input="
shipForm.shipIdentifierNo = String(shipForm.shipIdentifierNo || '').toUpperCase()
"
/>
</el-form-item>
</el-col>
<el-col :span="6">
@@ -111,7 +166,12 @@
<el-col :span="6">
<el-form-item label="船舶类型" prop="shipType">
<el-select v-model="shipForm.shipType" filterable allow-create default-first-option>
<el-option v-for="item in shipTypeOptions" :key="item" :label="item" :value="item" />
<el-option
v-for="item in shipTypeOptions"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
</el-col>
@@ -134,16 +194,34 @@
<el-row :gutter="18">
<el-col :span="8">
<el-form-item label="国籍证有效期至" prop="nationalityCertEndDate">
<el-date-picker v-model="shipForm.nationalityCertEndDate" type="date" value-format="YYYY-MM-DD" :disabled="shipForm.nationalityCertLongTerm === 1" />
<el-date-picker
v-model="shipForm.nationalityCertEndDate"
type="date"
value-format="YYYY-MM-DD"
:disabled="shipForm.nationalityCertLongTerm === 1"
/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="长期有效" prop="nationalityCertLongTerm">
<el-checkbox v-model="shipForm.nationalityCertLongTerm" :true-label="1" :false-label="0"></el-checkbox>
<el-checkbox
v-model="shipForm.nationalityCertLongTerm"
:true-label="1"
:false-label="0"
></el-checkbox
>
</el-form-item>
</el-col>
<el-col :span="12">
<image-upload-field label="国籍证图片" prop="nationalityCertImage" :value="shipForm.nationalityCertImage" :readonly="readonly" :headers="uploadHeaders" large @success="url => setImage('nationalityCertImage', url)" />
<image-upload-field
label="国籍证图片"
prop="nationalityCertImage"
:value="shipForm.nationalityCertImage"
:readonly="readonly"
:headers="uploadHeaders"
large
@success="url => setImage('nationalityCertImage', url)"
/>
</el-col>
</el-row>
@@ -151,16 +229,34 @@
<el-row :gutter="18">
<el-col :span="8">
<el-form-item label="最低安全配员证书有效期至" prop="safeManningCertEndDate">
<el-date-picker v-model="shipForm.safeManningCertEndDate" type="date" value-format="YYYY-MM-DD" :disabled="shipForm.safeManningCertLongTerm === 1" />
<el-date-picker
v-model="shipForm.safeManningCertEndDate"
type="date"
value-format="YYYY-MM-DD"
:disabled="shipForm.safeManningCertLongTerm === 1"
/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="长期有效" prop="safeManningCertLongTerm">
<el-checkbox v-model="shipForm.safeManningCertLongTerm" :true-label="1" :false-label="0"></el-checkbox>
<el-checkbox
v-model="shipForm.safeManningCertLongTerm"
:true-label="1"
:false-label="0"
></el-checkbox
>
</el-form-item>
</el-col>
<el-col :span="12">
<image-upload-field label="最低安全配员证书图片" prop="safeManningCertImage" :value="shipForm.safeManningCertImage" :readonly="readonly" :headers="uploadHeaders" large @success="url => setImage('safeManningCertImage', url)" />
<image-upload-field
label="最低安全配员证书图片"
prop="safeManningCertImage"
:value="shipForm.safeManningCertImage"
:readonly="readonly"
:headers="uploadHeaders"
large
@success="url => setImage('safeManningCertImage', url)"
/>
</el-col>
</el-row>
@@ -168,16 +264,34 @@
<el-row :gutter="18">
<el-col :span="8">
<el-form-item label="营业运输证有效期至" prop="businessTransportCertEndDate">
<el-date-picker v-model="shipForm.businessTransportCertEndDate" type="date" value-format="YYYY-MM-DD" :disabled="shipForm.businessTransportCertLongTerm === 1" />
<el-date-picker
v-model="shipForm.businessTransportCertEndDate"
type="date"
value-format="YYYY-MM-DD"
:disabled="shipForm.businessTransportCertLongTerm === 1"
/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="长期有效" prop="businessTransportCertLongTerm">
<el-checkbox v-model="shipForm.businessTransportCertLongTerm" :true-label="1" :false-label="0"></el-checkbox>
<el-checkbox
v-model="shipForm.businessTransportCertLongTerm"
:true-label="1"
:false-label="0"
></el-checkbox
>
</el-form-item>
</el-col>
<el-col :span="12">
<image-upload-field label="营业运输证图片" prop="businessTransportCertImage" :value="shipForm.businessTransportCertImage" :readonly="readonly" :headers="uploadHeaders" large @success="url => setImage('businessTransportCertImage', url)" />
<image-upload-field
label="营业运输证图片"
prop="businessTransportCertImage"
:value="shipForm.businessTransportCertImage"
:readonly="readonly"
:headers="uploadHeaders"
large
@success="url => setImage('businessTransportCertImage', url)"
/>
</el-col>
</el-row>
@@ -185,22 +299,39 @@
<el-row :gutter="18">
<el-col :span="8">
<el-form-item label="承租有效期至" prop="leaseEndDate">
<el-date-picker v-model="shipForm.leaseEndDate" type="date" value-format="YYYY-MM-DD" :disabled="shipForm.leaseLongTerm === 1" />
<el-date-picker
v-model="shipForm.leaseEndDate"
type="date"
value-format="YYYY-MM-DD"
:disabled="shipForm.leaseLongTerm === 1"
/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="长期有效" prop="leaseLongTerm">
<el-checkbox v-model="shipForm.leaseLongTerm" :true-label="1" :false-label="0"></el-checkbox>
<el-checkbox v-model="shipForm.leaseLongTerm" :true-label="1" :false-label="0"
></el-checkbox
>
</el-form-item>
</el-col>
<el-col :span="12">
<image-upload-field label="承租合同图片" prop="leaseContractImage" :value="shipForm.leaseContractImage" :readonly="readonly" :headers="uploadHeaders" large @success="url => setImage('leaseContractImage', url)" />
<image-upload-field
label="承租合同图片"
prop="leaseContractImage"
:value="shipForm.leaseContractImage"
:readonly="readonly"
:headers="uploadHeaders"
large
@success="url => setImage('leaseContractImage', url)"
/>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button @click="shipBox = false">取消</el-button>
<el-button type="primary" v-if="!readonly" :loading="submitLoading" @click="handleSubmit">确定</el-button>
<el-button type="primary" v-if="!readonly" :loading="submitLoading" @click="handleSubmit"
>确定</el-button
>
</template>
</el-dialog>
</basic-container>
@@ -210,7 +341,14 @@
import { mapGetters } from 'vuex';
import NProgress from 'nprogress';
import { option } from '@/option/transportCapacity/transport-ship';
import { getList, getDetail, submit, remove, changeStatus, getExpiryStat } from '@/api/transportCapacity/transport-ship';
import {
getList,
getDetail,
submit,
remove,
changeStatus,
getExpiryStat,
} from '@/api/transportCapacity/transport-ship';
import { exportBlob } from '@/api/common';
import { getToken } from '@/utils/auth';
import { downloadXls } from '@/utils/util';
@@ -313,9 +451,15 @@ export default {
shipIdentifierNo: [{ required: true, message: '请输入船舶识别号', trigger: 'blur' }],
organizationName: [{ required: true, message: '请输入所属组织', trigger: 'blur' }],
shipType: [{ required: true, message: '请选择船舶类型', trigger: 'change' }],
nationalityCertEndDate: [{ validator: this.validateNationalityCertEndDate, trigger: 'change' }],
safeManningCertEndDate: [{ validator: this.validateSafeManningCertEndDate, trigger: 'change' }],
businessTransportCertEndDate: [{ validator: this.validateBusinessTransportCertEndDate, trigger: 'change' }],
nationalityCertEndDate: [
{ validator: this.validateNationalityCertEndDate, trigger: 'change' },
],
safeManningCertEndDate: [
{ validator: this.validateSafeManningCertEndDate, trigger: 'change' },
],
businessTransportCertEndDate: [
{ validator: this.validateBusinessTransportCertEndDate, trigger: 'change' },
],
remark: [{ max: 200, message: '备注最多200字', trigger: 'blur' }],
},
};
@@ -344,15 +488,18 @@ export default {
return this.isAdmin || this.permission?.[code] === true;
},
validateNationalityCertEndDate(rule, value, callback) {
if (this.shipForm.nationalityCertLongTerm !== 1 && !value) return callback(new Error('请选择国籍证有效期至'));
if (this.shipForm.nationalityCertLongTerm !== 1 && !value)
return callback(new Error('请选择国籍证有效期至'));
callback();
},
validateSafeManningCertEndDate(rule, value, callback) {
if (this.shipForm.safeManningCertLongTerm !== 1 && !value) return callback(new Error('请选择最低安全配员证书有效期至'));
if (this.shipForm.safeManningCertLongTerm !== 1 && !value)
return callback(new Error('请选择最低安全配员证书有效期至'));
callback();
},
validateBusinessTransportCertEndDate(rule, value, callback) {
if (this.shipForm.businessTransportCertLongTerm !== 1 && !value) return callback(new Error('请选择营业运输证有效期至'));
if (this.shipForm.businessTransportCertLongTerm !== 1 && !value)
return callback(new Error('请选择营业运输证有效期至'));
callback();
},
openShip(row, readonly = false) {
@@ -395,7 +542,11 @@ export default {
handleStatus(row) {
const status = row.status === 1 ? 2 : 1;
const text = status === 1 ? '启用' : '停用';
this.$confirm(`是否${text}该船舶?`, '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => {
this.$confirm(`是否${text}该船舶?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
changeStatus(row.id, status).then(() => {
this.$message.success('操作成功');
this.onLoad(this.page);
@@ -407,7 +558,11 @@ export default {
this.$message.warning('请选择至少一条数据');
return;
}
this.$confirm('是否删除选中的船舶数据?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => {
this.$confirm('是否删除选中的船舶数据?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
remove(this.ids).then(() => {
this.$message.success('操作成功');
this.onLoad(this.page);
@@ -476,9 +631,16 @@ export default {
return query;
},
handleExport() {
this.$confirm('是否导出船舶数据?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => {
this.$confirm('是否导出船舶数据?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
NProgress.start();
exportBlob('/blade-transport/transport-ship/export-transport-ship', this.buildExportParams())
exportBlob(
'/blade-transport/transport-ship/export-transport-ship',
this.buildExportParams()
)
.then(res => {
downloadXls(res.data, `船舶管理${this.$dayjs().format('YYYY-MM-DD HH:mm:ss')}.xlsx`);
})