Commit 236a20c0 authored by 耿迪迪's avatar 耿迪迪

安全管理功能

parent 26ebbfa6
......@@ -27,8 +27,8 @@ public class TSafeInspectLedger extends BaseEntity
private String content;
/** 设备状态 */
@Excel(name = "设备状态")
private Integer address;
@Excel(name = "地点")
private String address;
/** 照片 */
@Excel(name = "照片")
......@@ -73,12 +73,12 @@ public class TSafeInspectLedger extends BaseEntity
{
return content;
}
public void setAddress(Integer address)
public void setAddress(String address)
{
this.address = address;
}
public Integer getAddress()
public String getAddress()
{
return address;
}
......
......@@ -27,8 +27,8 @@ public class TSafeMeetingLedger extends BaseEntity
private String content;
/** 设备状态 */
@Excel(name = "设备状态")
private Integer address;
@Excel(name = "地点")
private String address;
/** 照片 */
@Excel(name = "照片")
......@@ -73,12 +73,12 @@ public class TSafeMeetingLedger extends BaseEntity
{
return content;
}
public void setAddress(Integer address)
public void setAddress(String address)
{
this.address = address;
}
public Integer getAddress()
public String getAddress()
{
return address;
}
......
......@@ -19,7 +19,7 @@ public class TSafeTrainLedger extends BaseEntity
private Long trainId;
/** 检查标题 */
@Excel(name = "检查标题")
@Excel(name = "培训标题")
private String title;
/** 内容 */
......@@ -27,8 +27,8 @@ public class TSafeTrainLedger extends BaseEntity
private String content;
/** 设备状态 */
@Excel(name = "设备状态")
private Integer address;
@Excel(name = "地点")
private String address;
/** 照片 */
@Excel(name = "照片")
......@@ -73,12 +73,12 @@ public class TSafeTrainLedger extends BaseEntity
{
return content;
}
public void setAddress(Integer address)
public void setAddress(String address)
{
this.address = address;
}
public Integer getAddress()
public String getAddress()
{
return address;
}
......
package com.zehong.system.service.impl;
import java.util.List;
import com.zehong.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zehong.system.mapper.TSafeInspectLedgerMapper;
import com.zehong.common.utils.SecurityUtils;
import com.zehong.system.domain.TSafeInspectLedger;
import com.zehong.system.mapper.TSafeInspectLedgerMapper;
import com.zehong.system.service.ITSafeInspectLedgerService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* 安全检查台账Service业务层处理
......@@ -17,7 +19,7 @@ import com.zehong.system.service.ITSafeInspectLedgerService;
@Service
public class TSafeInspectLedgerServiceImpl implements ITSafeInspectLedgerService
{
@Autowired
@Resource
private TSafeInspectLedgerMapper tSafeInspectLedgerMapper;
/**
......@@ -54,6 +56,7 @@ public class TSafeInspectLedgerServiceImpl implements ITSafeInspectLedgerService
public int insertTSafeInspectLedger(TSafeInspectLedger tSafeInspectLedger)
{
tSafeInspectLedger.setCreateTime(DateUtils.getNowDate());
tSafeInspectLedger.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
return tSafeInspectLedgerMapper.insertTSafeInspectLedger(tSafeInspectLedger);
}
......@@ -67,6 +70,7 @@ public class TSafeInspectLedgerServiceImpl implements ITSafeInspectLedgerService
public int updateTSafeInspectLedger(TSafeInspectLedger tSafeInspectLedger)
{
tSafeInspectLedger.setUpdateTime(DateUtils.getNowDate());
tSafeInspectLedger.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
return tSafeInspectLedgerMapper.updateTSafeInspectLedger(tSafeInspectLedger);
}
......
package com.zehong.system.service.impl;
import java.util.List;
import com.zehong.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zehong.system.mapper.TSafeMeetingLedgerMapper;
import com.zehong.common.utils.SecurityUtils;
import com.zehong.system.domain.TSafeMeetingLedger;
import com.zehong.system.mapper.TSafeMeetingLedgerMapper;
import com.zehong.system.service.ITSafeMeetingLedgerService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* 安全例会台账Service业务层处理
......@@ -17,7 +19,7 @@ import com.zehong.system.service.ITSafeMeetingLedgerService;
@Service
public class TSafeMeetingLedgerServiceImpl implements ITSafeMeetingLedgerService
{
@Autowired
@Resource
private TSafeMeetingLedgerMapper tSafeMeetingLedgerMapper;
/**
......@@ -54,6 +56,7 @@ public class TSafeMeetingLedgerServiceImpl implements ITSafeMeetingLedgerService
public int insertTSafeMeetingLedger(TSafeMeetingLedger tSafeMeetingLedger)
{
tSafeMeetingLedger.setCreateTime(DateUtils.getNowDate());
tSafeMeetingLedger.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
return tSafeMeetingLedgerMapper.insertTSafeMeetingLedger(tSafeMeetingLedger);
}
......@@ -67,6 +70,7 @@ public class TSafeMeetingLedgerServiceImpl implements ITSafeMeetingLedgerService
public int updateTSafeMeetingLedger(TSafeMeetingLedger tSafeMeetingLedger)
{
tSafeMeetingLedger.setUpdateTime(DateUtils.getNowDate());
tSafeMeetingLedger.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
return tSafeMeetingLedgerMapper.updateTSafeMeetingLedger(tSafeMeetingLedger);
}
......
package com.zehong.system.service.impl;
import java.util.List;
import com.zehong.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zehong.system.mapper.TSafeTrainLedgerMapper;
import com.zehong.common.utils.SecurityUtils;
import com.zehong.system.domain.TSafeTrainLedger;
import com.zehong.system.mapper.TSafeTrainLedgerMapper;
import com.zehong.system.service.ITSafeTrainLedgerService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* 安全培训台账Service业务层处理
......@@ -17,7 +19,7 @@ import com.zehong.system.service.ITSafeTrainLedgerService;
@Service
public class TSafeTrainLedgerServiceImpl implements ITSafeTrainLedgerService
{
@Autowired
@Resource
private TSafeTrainLedgerMapper tSafeTrainLedgerMapper;
/**
......@@ -54,6 +56,7 @@ public class TSafeTrainLedgerServiceImpl implements ITSafeTrainLedgerService
public int insertTSafeTrainLedger(TSafeTrainLedger tSafeTrainLedger)
{
tSafeTrainLedger.setCreateTime(DateUtils.getNowDate());
tSafeTrainLedger.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
return tSafeTrainLedgerMapper.insertTSafeTrainLedger(tSafeTrainLedger);
}
......@@ -67,6 +70,7 @@ public class TSafeTrainLedgerServiceImpl implements ITSafeTrainLedgerService
public int updateTSafeTrainLedger(TSafeTrainLedger tSafeTrainLedger)
{
tSafeTrainLedger.setUpdateTime(DateUtils.getNowDate());
tSafeTrainLedger.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
return tSafeTrainLedgerMapper.updateTSafeTrainLedger(tSafeTrainLedger);
}
......
......@@ -26,7 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectTSafeInspectLedgerList" parameterType="TSafeInspectLedger" resultMap="TSafeInspectLedgerResult">
<include refid="selectTSafeInspectLedgerVo"/>
<where>
<if test="title != null and title != ''"> and title = #{title}</if>
<if test="title != null and title != ''"> and title like concat('%', #{title}, '%')</if>
<if test="content != null and content != ''"> and content = #{content}</if>
<if test="address != null "> and address = #{address}</if>
<if test="photo != null and photo != ''"> and photo = #{photo}</if>
......
......@@ -26,7 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectTSafeMeetingLedgerList" parameterType="TSafeMeetingLedger" resultMap="TSafeMeetingLedgerResult">
<include refid="selectTSafeMeetingLedgerVo"/>
<where>
<if test="title != null and title != ''"> and title = #{title}</if>
<if test="title != null and title != ''"> and title like concat('%', #{title}, '%')</if>
<if test="content != null and content != ''"> and content = #{content}</if>
<if test="address != null "> and address = #{address}</if>
<if test="photo != null and photo != ''"> and photo = #{photo}</if>
......
......@@ -26,7 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectTSafeTrainLedgerList" parameterType="TSafeTrainLedger" resultMap="TSafeTrainLedgerResult">
<include refid="selectTSafeTrainLedgerVo"/>
<where>
<if test="title != null and title != ''"> and title = #{title}</if>
<if test="title != null and title != ''"> and title like concat('%', #{title}, '%')</if>
<if test="content != null and content != ''"> and content = #{content}</if>
<if test="address != null "> and address = #{address}</if>
<if test="photo != null and photo != ''"> and photo = #{photo}</if>
......
<template>
<div class="upload-file">
<el-upload
:action="uploadImgUrl"
:headers="headers"
multiple
list-type="text"
:fileType="fileType"
:file-list="fileList"
:limit="limit"
:before-upload="handleBeforeUpload"
:on-exceed="handleExceed"
:on-success="handleUploadSuccess"
:on-error="handleUploadError"
:on-preview="handlePictureCardPreview"
:on-remove="handleRemove"
:class="{hide: isHide}"
>
<!-- 上传按钮 -->
<el-button size="mini" type="primary">选取文件</el-button>
</el-upload>
<!-- 上传提示 -->
<div class="el-upload__tip" slot="tip" v-if="showTip">
请上传
<template v-if="fileSize">
大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>
</template>
<template v-if="fileType">
格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b>
</template>
的文件,且不超过{{limit}}个
</div>
</div>
</template>
<script>
import { getToken } from "@/utils/auth";
export default {
name: "multiple-image-upload",
props: {
// 值
value: [String, Object, Array],
// 大小限制(MB)
fileSize: {
type: Number,
default: 5,
},
//回显数组
/*fileList: {
type: Array,
default: () => [],
},*/
// 文件类型, 例如['png', 'jpg', 'jpeg']
fileType: {
type: Array,
default: () => ["doc", "xls", "ppt", "txt", "pdf"],
},
limit: {
type: Number,
default: 5
},
// 是否显示提示
isShowTip: {
type: Boolean,
default: true,
},
},
data(){
return{
uploadImgUrl: process.env.VUE_APP_BASE_API + "/common/upload", // 上传的图片服务器地址
headers: {
Authorization: "Bearer " + getToken(),
},
previewImg: null,
dialogImageUrl: null,
fileList: [],
isHide: false
}
},
computed: {
// 是否显示提示
showTip() {
return this.isShowTip && (this.fileType || this.fileSize);
},
},
methods: {
// 上传前校检格式和大小
handleBeforeUpload(file) {
// 校检文件类型
if (this.fileType) {
let fileExtension = "";
if (file.name.lastIndexOf(".") > -1) {
fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
}
const isTypeOk = this.fileType.some((type) => {
if (file.type.indexOf(type) > -1) return true;
if (fileExtension && fileExtension.indexOf(type) > -1) return true;
return false;
});
if (!isTypeOk) {
this.$message.error(`文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`);
return false;
}
}
// 校检文件大小
if (this.fileSize) {
const isLt = file.size / 1024 / 1024 < this.fileSize;
if (!isLt) {
this.$message.error(`上传文件大小不能超过 ${this.fileSize} MB!`);
return false;
}
}
return true;
},
// 文件个数超出
handleExceed() {
this.$message.error(`只允许上传单`+ this.limit +`文件`);
},
handleUploadSuccess(res,file,fileList) {
if (res.code == 200) {
let files = this.getFile(fileList);
this.$message.success("上传成功");
this.$emit("input", JSON.stringify(files));
this.hideUpload(fileList);
}
},
handleUploadError() {
this.$message.error("上传失败, 请重试");
},
handlePictureCardPreview(file) {
this.dialogImageUrl = file.url;
this.$refs.previewImg.showViewer = true;
},
handleRemove(file, fileList) {
let files = this.getFile(fileList);
this.$emit("input", JSON.stringify(files));
this.hideUpload(fileList);
},
getFile(fileList){
if (fileList.every(item => item.status == "success")) {
//由于fileList是所有的文件包含之前已上传过的,这里需要做区分(带response的即为新上传的)
return fileList.map(item => {
const files = {name: item.name};
if(item.response){
files.url = item.response.url;
}else{
files.url = item.url;
}
return files;
})
}else{
return [];
}
},
hideUpload(fileList){
if(fileList.length > 4){
this.isHide = true;
}else{
this.isHide = false;
}
}
}
}
</script>
<style scoped lang="scss">
.hide ::v-deep .el-upload--picture-card {
display: none;
}
</style>
......@@ -163,7 +163,7 @@
}
},
hideUpload(fileList){
if(fileList.length > 4){
if(fileList.length > this.limit){
this.isHide = true;
}else{
this.isHide = false;
......
......@@ -10,33 +10,6 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="设备状态" prop="address">
<el-input
v-model="queryParams.address"
placeholder="请输入设备状态"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="是否删除(0正常,1删除)" prop="isDel">
<el-input
v-model="queryParams.isDel"
placeholder="请输入是否删除(0正常,1删除)"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="备注" prop="remarks">
<el-input
v-model="queryParams.remarks"
placeholder="请输入备注"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
......@@ -51,7 +24,7 @@
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:ledger:add']"
v-hasPermi="['safe:inspect:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
......@@ -62,7 +35,7 @@
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:ledger:edit']"
v-hasPermi="['safe:inspect:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
......@@ -73,7 +46,7 @@
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:ledger:remove']"
v-hasPermi="['safe:inspect:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
......@@ -84,7 +57,7 @@
size="mini"
:loading="exportLoading"
@click="handleExport"
v-hasPermi="['system:ledger:export']"
v-hasPermi="['safe:inspect:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
......@@ -92,13 +65,42 @@
<el-table v-loading="loading" :data="ledgerList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="备注" align="center" prop="inspectId" />
<el-table-column label="检查标题" align="center" prop="title" />
<el-table-column label="内容" align="center" prop="content" />
<el-table-column label="设备状态" align="center" prop="address" />
<el-table-column label="照片" align="center" prop="photo" />
<el-table-column label="附件" align="center" prop="attachment" />
<el-table-column label="是否删除(0正常,1删除)" align="center" prop="isDel" />
<el-table-column label="地点" align="center" prop="address" />
<el-table-column label="照片" align="center" prop="photo" >
<template slot-scope="scope">
<el-image v-if="scope.row.photo" :src="scope.row.photo.split(',')[0]" :preview-src-list="scope.row.photo.split(',')" :z-index="9999" style="width: 30px;height: 30px;"></el-image>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="附件" align="center" prop="attachment" >
<template slot-scope="scope">
<div v-if="scope.row.attachment">
<el-dropdown trigger="click" placement="bottom">
<span style="color: #1c84c6; cursor: pointer;text-align: center">
查看附件 ({{ JSON.parse(scope.row.attachment).length }}) <i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
v-for="(file, index) in JSON.parse(scope.row.attachment)"
:key="index"
>
<a
@click="downloadFile(file)"
style="color: #1c84c6; text-decoration: none; display: block;"
>
<i class="el-icon-document"></i> {{ file.name || `附件${index + 1}` }}
</a>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="创建人" align="center" prop="createBy" />
<el-table-column label="创建时间" align="center" prop="createTime" />
<el-table-column label="备注" align="center" prop="remarks" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
......@@ -107,14 +109,14 @@
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:ledger:edit']"
v-hasPermi="['safe:inspect:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:ledger:remove']"
v-hasPermi="['safe:inspect:remove']"
>删除</el-button>
</template>
</el-table-column>
......@@ -129,25 +131,28 @@
/>
<!-- 添加或修改安全检查台账对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-dialog :title="title" :visible.sync="open" width="900px" append-to-body destroy-on-close :close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-row>
<el-col :span="12">
<el-form-item label="检查标题" prop="title">
<el-input v-model="form.title" placeholder="请输入检查标题" />
</el-form-item>
<el-form-item label="内容">
<editor v-model="form.content" :min-height="192"/>
</el-col>
</el-row>
<el-form-item label="内容" prop="content">
<el-input type="textarea" :autosize="{ minRows: 4}" v-model="form.content" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="设备状态" prop="address">
<el-input v-model="form.address" placeholder="请输入设备状态" />
<el-form-item label="地点" prop="address">
<el-input v-model="form.address" placeholder="请输入地点" />
</el-form-item>
<el-form-item label="照片" prop="photo">
<el-input v-model="form.photo" type="textarea" placeholder="请输入内容" />
<!--<imageUpload v-model="form.photo"/>-->
<MultipleImageUpload v-model="form.photo" ref="photo"/>
</el-form-item>
<el-form-item label="附件" prop="attachment">
<el-input v-model="form.attachment" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="是否删除(0正常,1删除)" prop="isDel">
<el-input v-model="form.isDel" placeholder="请输入是否删除(0正常,1删除)" />
<!--<fileUpload v-model="form.attachment"/>-->
<MultipleFileUpload v-model="form.attachment" ref="attachment"/>
</el-form-item>
<el-form-item label="备注" prop="remarks">
<el-input v-model="form.remarks" placeholder="请输入备注" />
......@@ -164,11 +169,14 @@
<script>
import { listLedger, getLedger, delLedger, addLedger, updateLedger, exportLedger } from "@/api/safe/inspect";
import Editor from '@/components/Editor';
import MultipleImageUpload from '@/components/MultipleImageUpload';
import MultipleFileUpload from '@/components/MultipleFileUpload';
export default {
name: "Ledger",
components: {
Editor,
MultipleImageUpload,
MultipleFileUpload
},
data() {
return {
......@@ -208,6 +216,15 @@ export default {
form: {},
// 表单校验
rules: {
title: [
{ required: true, message: "检查标题不能为空", trigger: "blur" }
],
content: [
{ required: true, message: "内容不能为空", trigger: "blur" }
],
address: [
{ required: true, message: "地点不能为空", trigger: "blur" }
],
}
};
},
......@@ -259,7 +276,8 @@ export default {
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.inspectId)
this.ids = selection.map(item => item.inspectId);
this.titles = selection.map(item => item.title);
this.single = selection.length!==1
this.multiple = !selection.length
},
......@@ -275,6 +293,14 @@ export default {
const inspectId = row.inspectId || this.ids
getLedger(inspectId).then(response => {
this.form = response.data;
this.$nextTick(() => {
if(this.form.photo){
this.$refs.photo.fileList = this.form.photo.split(",").map(item => { return{ url:item}});
}
if(this.form.attachment){
this.$refs.attachment.fileList = JSON.parse(this.form.attachment)
}
})
this.open = true;
this.title = "修改安全检查台账";
});
......@@ -302,7 +328,8 @@ export default {
/** 删除按钮操作 */
handleDelete(row) {
const inspectIds = row.inspectId || this.ids;
this.$confirm('是否确认删除安全检查台账编号为"' + inspectIds + '"的数据项?', "警告", {
const titles = row.title || this.titles;
this.$confirm('是否确认删除安全检查台账标题为"' + titles + '"的数据项?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
......@@ -327,6 +354,32 @@ export default {
this.download(response.msg);
this.exportLoading = false;
}).catch(() => {});
},
async downloadFile(file) {
try {
const response = await fetch(file.url)
const blob = await response.blob()
// 创建下载链接
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a')
link.href = url
link.download = file.name // 这里可以自定义文件名
document.body.appendChild(link)
link.click()
// 清理
document.body.removeChild(link)
window.URL.revokeObjectURL(url)
this.$message.success('开始下载')
} catch (error) {
console.error('下载失败:', error)
this.$message.error('下载失败,请重试')
// 降级方案:直接打开新窗口
window.open(file.url, '_blank')
}
}
}
};
......
......@@ -10,33 +10,6 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="设备状态" prop="address">
<el-input
v-model="queryParams.address"
placeholder="请输入设备状态"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="是否删除(0正常,1删除)" prop="isDel">
<el-input
v-model="queryParams.isDel"
placeholder="请输入是否删除(0正常,1删除)"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="备注" prop="remarks">
<el-input
v-model="queryParams.remarks"
placeholder="请输入备注"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
......@@ -51,7 +24,7 @@
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:ledger:add']"
v-hasPermi="['safe:meeting:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
......@@ -62,7 +35,7 @@
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:ledger:edit']"
v-hasPermi="['safe:meeting:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
......@@ -73,7 +46,7 @@
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:ledger:remove']"
v-hasPermi="['safe:meeting:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
......@@ -84,7 +57,7 @@
size="mini"
:loading="exportLoading"
@click="handleExport"
v-hasPermi="['system:ledger:export']"
v-hasPermi="['safe:meeting:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
......@@ -92,13 +65,42 @@
<el-table v-loading="loading" :data="ledgerList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="备注" align="center" prop="meetingId" />
<el-table-column label="例会标题" align="center" prop="title" />
<el-table-column label="内容" align="center" prop="content" />
<el-table-column label="设备状态" align="center" prop="address" />
<el-table-column label="照片" align="center" prop="photo" />
<el-table-column label="附件" align="center" prop="attachment" />
<el-table-column label="是否删除(0正常,1删除)" align="center" prop="isDel" />
<el-table-column label="地点" align="center" prop="address" />
<el-table-column label="照片" align="center" prop="photo" >
<template slot-scope="scope">
<el-image v-if="scope.row.photo" :src="scope.row.photo.split(',')[0]" :preview-src-list="scope.row.photo.split(',')" :z-index="9999" style="width: 30px;height: 30px;"></el-image>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="附件" align="center" prop="attachment" >
<template slot-scope="scope">
<div v-if="scope.row.attachment">
<el-dropdown trigger="click" placement="bottom">
<span style="color: #1c84c6; cursor: pointer;text-align: center">
查看附件 ({{ JSON.parse(scope.row.attachment).length }}) <i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
v-for="(file, index) in JSON.parse(scope.row.attachment)"
:key="index"
>
<a
@click="downloadFile(file)"
style="color: #1c84c6; text-decoration: none; display: block;"
>
<i class="el-icon-document"></i> {{ file.name || `附件${index + 1}` }}
</a>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="创建人" align="center" prop="createBy" />
<el-table-column label="创建时间" align="center" prop="createTime" />
<el-table-column label="备注" align="center" prop="remarks" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
......@@ -107,14 +109,14 @@
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:ledger:edit']"
v-hasPermi="['safe:meeting:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:ledger:remove']"
v-hasPermi="['safe:meeting:remove']"
>删除</el-button>
</template>
</el-table-column>
......@@ -129,28 +131,31 @@
/>
<!-- 添加或修改安全例会台账对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-dialog :title="title" :visible.sync="open" width="900px" append-to-body destroy-on-close :close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-row>
<el-col :span="12">
<el-form-item label="例会标题" prop="title">
<el-input v-model="form.title" placeholder="请输入例会标题" />
</el-form-item>
<el-form-item label="内容">
<editor v-model="form.content" :min-height="192"/>
</el-col>
</el-row>
<el-form-item label="内容" prop="content">
<el-input type="textarea" :autosize="{ minRows: 4}" v-model="form.content" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="设备状态" prop="address">
<el-input v-model="form.address" placeholder="请输入设备状态" />
<el-form-item label="地点" prop="address">
<el-input v-model="form.address" placeholder="请输入地点" />
</el-form-item>
<el-form-item label="照片" prop="photo">
<el-input v-model="form.photo" type="textarea" placeholder="请输入内容" />
<!--<imageUpload v-model="form.photo"/>-->
<MultipleImageUpload v-model="form.photo" ref="photo"/>
</el-form-item>
<el-form-item label="附件" prop="attachment">
<el-input v-model="form.attachment" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="是否删除(0正常,1删除)" prop="isDel">
<el-input v-model="form.isDel" placeholder="请输入是否删除(0正常,1删除)" />
<!--<fileUpload v-model="form.attachment"/>-->
<MultipleFileUpload v-model="form.attachment" ref="attachment"/>
</el-form-item>
<el-form-item label="备注" prop="remarks">
<el-input v-model="form.remarks" placeholder="请输入备注" />
<el-input type="textarea" v-model="form.remarks" placeholder="请输入备注" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
......@@ -164,11 +169,14 @@
<script>
import { listLedger, getLedger, delLedger, addLedger, updateLedger, exportLedger } from "@/api/safe/meeting";
import Editor from '@/components/Editor';
import MultipleImageUpload from '@/components/MultipleImageUpload';
import MultipleFileUpload from '@/components/MultipleFileUpload';
export default {
name: "Ledger",
components: {
Editor,
MultipleImageUpload,
MultipleFileUpload,
},
data() {
return {
......@@ -208,7 +216,16 @@ export default {
form: {},
// 表单校验
rules: {
}
title: [
{ required: true, message: "例会标题不能为空", trigger: "blur" }
],
content: [
{ required: true, message: "内容不能为空", trigger: "blur" }
],
address: [
{ required: true, message: "地点不能为空", trigger: "blur" }
],
},
};
},
created() {
......@@ -259,7 +276,8 @@ export default {
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.meetingId)
this.ids = selection.map(item => item.meetingId);
this.titles = selection.map(item => item.title);
this.single = selection.length!==1
this.multiple = !selection.length
},
......@@ -275,6 +293,14 @@ export default {
const meetingId = row.meetingId || this.ids
getLedger(meetingId).then(response => {
this.form = response.data;
this.$nextTick(() => {
if(this.form.photo){
this.$refs.photo.fileList = this.form.photo.split(",").map(item => { return{ url:item}});
}
if(this.form.attachment){
this.$refs.attachment.fileList = JSON.parse(this.form.attachment)
}
})
this.open = true;
this.title = "修改安全例会台账";
});
......@@ -302,7 +328,8 @@ export default {
/** 删除按钮操作 */
handleDelete(row) {
const meetingIds = row.meetingId || this.ids;
this.$confirm('是否确认删除安全例会台账编号为"' + meetingIds + '"的数据项?', "警告", {
const titles = row.title || this.titles;
this.$confirm('是否确认删除安全例会台账标题为"' + titles + '"的数据项?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
......@@ -327,6 +354,32 @@ export default {
this.download(response.msg);
this.exportLoading = false;
}).catch(() => {});
},
async downloadFile(file) {
try {
const response = await fetch(file.url)
const blob = await response.blob()
// 创建下载链接
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a')
link.href = url
link.download = file.name // 这里可以自定义文件名
document.body.appendChild(link)
link.click()
// 清理
document.body.removeChild(link)
window.URL.revokeObjectURL(url)
this.$message.success('开始下载')
} catch (error) {
console.error('下载失败:', error)
this.$message.error('下载失败,请重试')
// 降级方案:直接打开新窗口
window.open(file.url, '_blank')
}
}
}
};
......
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="检查标题" prop="title">
<el-form-item label="培训标题" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入检查标题"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="设备状态" prop="address">
<el-input
v-model="queryParams.address"
placeholder="请输入设备状态"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="是否删除(0正常,1删除)" prop="isDel">
<el-input
v-model="queryParams.isDel"
placeholder="请输入是否删除(0正常,1删除)"
clearable
size="small"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="备注" prop="remarks">
<el-input
v-model="queryParams.remarks"
placeholder="请输入备注"
placeholder="请输入培训标题"
clearable
size="small"
@keyup.enter.native="handleQuery"
......@@ -51,7 +24,7 @@
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:ledger:add']"
v-hasPermi="['safe:trian:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
......@@ -62,7 +35,7 @@
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:ledger:edit']"
v-hasPermi="['safe:trian:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
......@@ -73,7 +46,7 @@
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:ledger:remove']"
v-hasPermi="['safe:trian:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
......@@ -84,7 +57,7 @@
size="mini"
:loading="exportLoading"
@click="handleExport"
v-hasPermi="['system:ledger:export']"
v-hasPermi="['safe:trian:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
......@@ -92,13 +65,42 @@
<el-table v-loading="loading" :data="ledgerList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="备注" align="center" prop="trainId" />
<el-table-column label="检查标题" align="center" prop="title" />
<el-table-column label="培训标题" align="center" prop="title" />
<el-table-column label="内容" align="center" prop="content" />
<el-table-column label="设备状态" align="center" prop="address" />
<el-table-column label="照片" align="center" prop="photo" />
<el-table-column label="附件" align="center" prop="attachment" />
<el-table-column label="是否删除(0正常,1删除)" align="center" prop="isDel" />
<el-table-column label="地点" align="center" prop="address" />
<el-table-column label="照片" align="center" prop="photo" >
<template slot-scope="scope">
<el-image v-if="scope.row.photo" :src="scope.row.photo.split(',')[0]" :preview-src-list="scope.row.photo.split(',')" :z-index="9999" style="width: 30px;height: 30px;"></el-image>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="附件" align="center" prop="attachment" >
<template slot-scope="scope">
<div v-if="scope.row.attachment">
<el-dropdown trigger="click" placement="bottom">
<span style="color: #1c84c6; cursor: pointer;text-align: center">
查看附件 ({{ JSON.parse(scope.row.attachment).length }}) <i class="el-icon-arrow-down el-icon--right"></i>
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
v-for="(file, index) in JSON.parse(scope.row.attachment)"
:key="index"
>
<a
@click="downloadFile(file)"
style="color: #1c84c6; text-decoration: none; display: block;"
>
<i class="el-icon-document"></i> {{ file.name || `附件${index + 1}` }}
</a>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<span v-else>-</span>
</template>
</el-table-column>
<el-table-column label="创建人" align="center" prop="createBy" />
<el-table-column label="创建时间" align="center" prop="createTime" />
<el-table-column label="备注" align="center" prop="remarks" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
......@@ -107,14 +109,14 @@
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:ledger:edit']"
v-hasPermi="['safe:trian:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:ledger:remove']"
v-hasPermi="['safe:trian:remove']"
>删除</el-button>
</template>
</el-table-column>
......@@ -129,25 +131,28 @@
/>
<!-- 添加或修改安全培训台账对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-dialog :title="title" :visible.sync="open" width="900px" append-to-body destroy-on-close :close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="检查标题" prop="title">
<el-input v-model="form.title" placeholder="请输入检查标题" />
<el-row>
<el-col :span="12">
<el-form-item label="培训标题" prop="title">
<el-input v-model="form.title" placeholder="请输入培训标题" />
</el-form-item>
<el-form-item label="内容">
<editor v-model="form.content" :min-height="192"/>
</el-col>
</el-row>
<el-form-item label="内容" prop="content">
<el-input type="textarea" :autosize="{ minRows: 4}" v-model="form.content" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="设备状态" prop="address">
<el-input v-model="form.address" placeholder="请输入设备状态" />
<el-form-item label="地点" prop="address">
<el-input v-model="form.address" placeholder="请输入地点" />
</el-form-item>
<el-form-item label="照片" prop="photo">
<el-input v-model="form.photo" type="textarea" placeholder="请输入内容" />
<!--<imageUpload v-model="form.photo"/>-->
<MultipleImageUpload v-model="form.photo" ref="photo"/>
</el-form-item>
<el-form-item label="附件" prop="attachment">
<el-input v-model="form.attachment" type="textarea" placeholder="请输入内容" />
</el-form-item>
<el-form-item label="是否删除(0正常,1删除)" prop="isDel">
<el-input v-model="form.isDel" placeholder="请输入是否删除(0正常,1删除)" />
<!--<fileUpload v-model="form.attachment"/>-->
<MultipleFileUpload v-model="form.attachment" ref="attachment"/>
</el-form-item>
<el-form-item label="备注" prop="remarks">
<el-input v-model="form.remarks" placeholder="请输入备注" />
......@@ -164,11 +169,14 @@
<script>
import { listLedger, getLedger, delLedger, addLedger, updateLedger, exportLedger } from "@/api/safe/train";
import Editor from '@/components/Editor';
import MultipleImageUpload from '@/components/MultipleImageUpload';
import MultipleFileUpload from '@/components/MultipleFileUpload';
export default {
name: "Ledger",
components: {
Editor,
MultipleImageUpload,
MultipleFileUpload
},
data() {
return {
......@@ -208,6 +216,15 @@ export default {
form: {},
// 表单校验
rules: {
title: [
{ required: true, message: "培训标题不能为空", trigger: "blur" }
],
content: [
{ required: true, message: "内容不能为空", trigger: "blur" }
],
address: [
{ required: true, message: "地点不能为空", trigger: "blur" }
],
}
};
},
......@@ -259,7 +276,8 @@ export default {
},
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.trainId)
this.ids = selection.map(item => item.trainId);
this.titles = selection.map(item => item.title);
this.single = selection.length!==1
this.multiple = !selection.length
},
......@@ -272,9 +290,17 @@ export default {
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const trainId = row.trainId || this.ids
const trainId = row.trainId || this.ids;
getLedger(trainId).then(response => {
this.form = response.data;
this.$nextTick(() => {
if(this.form.photo){
this.$refs.photo.fileList = this.form.photo.split(",").map(item => { return{ url:item}});
}
if(this.form.attachment){
this.$refs.attachment.fileList = JSON.parse(this.form.attachment)
}
})
this.open = true;
this.title = "修改安全培训台账";
});
......@@ -302,7 +328,8 @@ export default {
/** 删除按钮操作 */
handleDelete(row) {
const trainIds = row.trainId || this.ids;
this.$confirm('是否确认删除安全培训台账编号为"' + trainIds + '"的数据项?', "警告", {
const titles = row.title || this.titles;
this.$confirm('是否确认删除安全培训台账标题为"' + titles + '"的数据项?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
......@@ -327,6 +354,32 @@ export default {
this.download(response.msg);
this.exportLoading = false;
}).catch(() => {});
},
async downloadFile(file) {
try {
const response = await fetch(file.url)
const blob = await response.blob()
// 创建下载链接
const url = window.URL.createObjectURL(blob)
const link = document.createElement('a')
link.href = url
link.download = file.name // 这里可以自定义文件名
document.body.appendChild(link)
link.click()
// 清理
document.body.removeChild(link)
window.URL.revokeObjectURL(url)
this.$message.success('开始下载')
} catch (error) {
console.error('下载失败:', error)
this.$message.error('下载失败,请重试')
// 降级方案:直接打开新窗口
window.open(file.url, '_blank')
}
}
}
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment