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

安全管理功能

parent 26ebbfa6
...@@ -27,8 +27,8 @@ public class TSafeInspectLedger extends BaseEntity ...@@ -27,8 +27,8 @@ public class TSafeInspectLedger extends BaseEntity
private String content; private String content;
/** 设备状态 */ /** 设备状态 */
@Excel(name = "设备状态") @Excel(name = "地点")
private Integer address; private String address;
/** 照片 */ /** 照片 */
@Excel(name = "照片") @Excel(name = "照片")
...@@ -73,12 +73,12 @@ public class TSafeInspectLedger extends BaseEntity ...@@ -73,12 +73,12 @@ public class TSafeInspectLedger extends BaseEntity
{ {
return content; return content;
} }
public void setAddress(Integer address) public void setAddress(String address)
{ {
this.address = address; this.address = address;
} }
public Integer getAddress() public String getAddress()
{ {
return address; return address;
} }
......
...@@ -27,8 +27,8 @@ public class TSafeMeetingLedger extends BaseEntity ...@@ -27,8 +27,8 @@ public class TSafeMeetingLedger extends BaseEntity
private String content; private String content;
/** 设备状态 */ /** 设备状态 */
@Excel(name = "设备状态") @Excel(name = "地点")
private Integer address; private String address;
/** 照片 */ /** 照片 */
@Excel(name = "照片") @Excel(name = "照片")
...@@ -73,12 +73,12 @@ public class TSafeMeetingLedger extends BaseEntity ...@@ -73,12 +73,12 @@ public class TSafeMeetingLedger extends BaseEntity
{ {
return content; return content;
} }
public void setAddress(Integer address) public void setAddress(String address)
{ {
this.address = address; this.address = address;
} }
public Integer getAddress() public String getAddress()
{ {
return address; return address;
} }
......
...@@ -19,7 +19,7 @@ public class TSafeTrainLedger extends BaseEntity ...@@ -19,7 +19,7 @@ public class TSafeTrainLedger extends BaseEntity
private Long trainId; private Long trainId;
/** 检查标题 */ /** 检查标题 */
@Excel(name = "检查标题") @Excel(name = "培训标题")
private String title; private String title;
/** 内容 */ /** 内容 */
...@@ -27,8 +27,8 @@ public class TSafeTrainLedger extends BaseEntity ...@@ -27,8 +27,8 @@ public class TSafeTrainLedger extends BaseEntity
private String content; private String content;
/** 设备状态 */ /** 设备状态 */
@Excel(name = "设备状态") @Excel(name = "地点")
private Integer address; private String address;
/** 照片 */ /** 照片 */
@Excel(name = "照片") @Excel(name = "照片")
...@@ -73,12 +73,12 @@ public class TSafeTrainLedger extends BaseEntity ...@@ -73,12 +73,12 @@ public class TSafeTrainLedger extends BaseEntity
{ {
return content; return content;
} }
public void setAddress(Integer address) public void setAddress(String address)
{ {
this.address = address; this.address = address;
} }
public Integer getAddress() public String getAddress()
{ {
return address; return address;
} }
......
package com.zehong.system.service.impl; package com.zehong.system.service.impl;
import java.util.List;
import com.zehong.common.utils.DateUtils; import com.zehong.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired; import com.zehong.common.utils.SecurityUtils;
import org.springframework.stereotype.Service;
import com.zehong.system.mapper.TSafeInspectLedgerMapper;
import com.zehong.system.domain.TSafeInspectLedger; import com.zehong.system.domain.TSafeInspectLedger;
import com.zehong.system.mapper.TSafeInspectLedgerMapper;
import com.zehong.system.service.ITSafeInspectLedgerService; import com.zehong.system.service.ITSafeInspectLedgerService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/** /**
* 安全检查台账Service业务层处理 * 安全检查台账Service业务层处理
...@@ -17,7 +19,7 @@ import com.zehong.system.service.ITSafeInspectLedgerService; ...@@ -17,7 +19,7 @@ import com.zehong.system.service.ITSafeInspectLedgerService;
@Service @Service
public class TSafeInspectLedgerServiceImpl implements ITSafeInspectLedgerService public class TSafeInspectLedgerServiceImpl implements ITSafeInspectLedgerService
{ {
@Autowired @Resource
private TSafeInspectLedgerMapper tSafeInspectLedgerMapper; private TSafeInspectLedgerMapper tSafeInspectLedgerMapper;
/** /**
...@@ -54,6 +56,7 @@ public class TSafeInspectLedgerServiceImpl implements ITSafeInspectLedgerService ...@@ -54,6 +56,7 @@ public class TSafeInspectLedgerServiceImpl implements ITSafeInspectLedgerService
public int insertTSafeInspectLedger(TSafeInspectLedger tSafeInspectLedger) public int insertTSafeInspectLedger(TSafeInspectLedger tSafeInspectLedger)
{ {
tSafeInspectLedger.setCreateTime(DateUtils.getNowDate()); tSafeInspectLedger.setCreateTime(DateUtils.getNowDate());
tSafeInspectLedger.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
return tSafeInspectLedgerMapper.insertTSafeInspectLedger(tSafeInspectLedger); return tSafeInspectLedgerMapper.insertTSafeInspectLedger(tSafeInspectLedger);
} }
...@@ -67,6 +70,7 @@ public class TSafeInspectLedgerServiceImpl implements ITSafeInspectLedgerService ...@@ -67,6 +70,7 @@ public class TSafeInspectLedgerServiceImpl implements ITSafeInspectLedgerService
public int updateTSafeInspectLedger(TSafeInspectLedger tSafeInspectLedger) public int updateTSafeInspectLedger(TSafeInspectLedger tSafeInspectLedger)
{ {
tSafeInspectLedger.setUpdateTime(DateUtils.getNowDate()); tSafeInspectLedger.setUpdateTime(DateUtils.getNowDate());
tSafeInspectLedger.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
return tSafeInspectLedgerMapper.updateTSafeInspectLedger(tSafeInspectLedger); return tSafeInspectLedgerMapper.updateTSafeInspectLedger(tSafeInspectLedger);
} }
......
package com.zehong.system.service.impl; package com.zehong.system.service.impl;
import java.util.List;
import com.zehong.common.utils.DateUtils; import com.zehong.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired; import com.zehong.common.utils.SecurityUtils;
import org.springframework.stereotype.Service;
import com.zehong.system.mapper.TSafeMeetingLedgerMapper;
import com.zehong.system.domain.TSafeMeetingLedger; import com.zehong.system.domain.TSafeMeetingLedger;
import com.zehong.system.mapper.TSafeMeetingLedgerMapper;
import com.zehong.system.service.ITSafeMeetingLedgerService; import com.zehong.system.service.ITSafeMeetingLedgerService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/** /**
* 安全例会台账Service业务层处理 * 安全例会台账Service业务层处理
...@@ -17,7 +19,7 @@ import com.zehong.system.service.ITSafeMeetingLedgerService; ...@@ -17,7 +19,7 @@ import com.zehong.system.service.ITSafeMeetingLedgerService;
@Service @Service
public class TSafeMeetingLedgerServiceImpl implements ITSafeMeetingLedgerService public class TSafeMeetingLedgerServiceImpl implements ITSafeMeetingLedgerService
{ {
@Autowired @Resource
private TSafeMeetingLedgerMapper tSafeMeetingLedgerMapper; private TSafeMeetingLedgerMapper tSafeMeetingLedgerMapper;
/** /**
...@@ -54,6 +56,7 @@ public class TSafeMeetingLedgerServiceImpl implements ITSafeMeetingLedgerService ...@@ -54,6 +56,7 @@ public class TSafeMeetingLedgerServiceImpl implements ITSafeMeetingLedgerService
public int insertTSafeMeetingLedger(TSafeMeetingLedger tSafeMeetingLedger) public int insertTSafeMeetingLedger(TSafeMeetingLedger tSafeMeetingLedger)
{ {
tSafeMeetingLedger.setCreateTime(DateUtils.getNowDate()); tSafeMeetingLedger.setCreateTime(DateUtils.getNowDate());
tSafeMeetingLedger.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
return tSafeMeetingLedgerMapper.insertTSafeMeetingLedger(tSafeMeetingLedger); return tSafeMeetingLedgerMapper.insertTSafeMeetingLedger(tSafeMeetingLedger);
} }
...@@ -67,6 +70,7 @@ public class TSafeMeetingLedgerServiceImpl implements ITSafeMeetingLedgerService ...@@ -67,6 +70,7 @@ public class TSafeMeetingLedgerServiceImpl implements ITSafeMeetingLedgerService
public int updateTSafeMeetingLedger(TSafeMeetingLedger tSafeMeetingLedger) public int updateTSafeMeetingLedger(TSafeMeetingLedger tSafeMeetingLedger)
{ {
tSafeMeetingLedger.setUpdateTime(DateUtils.getNowDate()); tSafeMeetingLedger.setUpdateTime(DateUtils.getNowDate());
tSafeMeetingLedger.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
return tSafeMeetingLedgerMapper.updateTSafeMeetingLedger(tSafeMeetingLedger); return tSafeMeetingLedgerMapper.updateTSafeMeetingLedger(tSafeMeetingLedger);
} }
......
package com.zehong.system.service.impl; package com.zehong.system.service.impl;
import java.util.List;
import com.zehong.common.utils.DateUtils; import com.zehong.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired; import com.zehong.common.utils.SecurityUtils;
import org.springframework.stereotype.Service;
import com.zehong.system.mapper.TSafeTrainLedgerMapper;
import com.zehong.system.domain.TSafeTrainLedger; import com.zehong.system.domain.TSafeTrainLedger;
import com.zehong.system.mapper.TSafeTrainLedgerMapper;
import com.zehong.system.service.ITSafeTrainLedgerService; import com.zehong.system.service.ITSafeTrainLedgerService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/** /**
* 安全培训台账Service业务层处理 * 安全培训台账Service业务层处理
...@@ -17,7 +19,7 @@ import com.zehong.system.service.ITSafeTrainLedgerService; ...@@ -17,7 +19,7 @@ import com.zehong.system.service.ITSafeTrainLedgerService;
@Service @Service
public class TSafeTrainLedgerServiceImpl implements ITSafeTrainLedgerService public class TSafeTrainLedgerServiceImpl implements ITSafeTrainLedgerService
{ {
@Autowired @Resource
private TSafeTrainLedgerMapper tSafeTrainLedgerMapper; private TSafeTrainLedgerMapper tSafeTrainLedgerMapper;
/** /**
...@@ -54,6 +56,7 @@ public class TSafeTrainLedgerServiceImpl implements ITSafeTrainLedgerService ...@@ -54,6 +56,7 @@ public class TSafeTrainLedgerServiceImpl implements ITSafeTrainLedgerService
public int insertTSafeTrainLedger(TSafeTrainLedger tSafeTrainLedger) public int insertTSafeTrainLedger(TSafeTrainLedger tSafeTrainLedger)
{ {
tSafeTrainLedger.setCreateTime(DateUtils.getNowDate()); tSafeTrainLedger.setCreateTime(DateUtils.getNowDate());
tSafeTrainLedger.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
return tSafeTrainLedgerMapper.insertTSafeTrainLedger(tSafeTrainLedger); return tSafeTrainLedgerMapper.insertTSafeTrainLedger(tSafeTrainLedger);
} }
...@@ -67,6 +70,7 @@ public class TSafeTrainLedgerServiceImpl implements ITSafeTrainLedgerService ...@@ -67,6 +70,7 @@ public class TSafeTrainLedgerServiceImpl implements ITSafeTrainLedgerService
public int updateTSafeTrainLedger(TSafeTrainLedger tSafeTrainLedger) public int updateTSafeTrainLedger(TSafeTrainLedger tSafeTrainLedger)
{ {
tSafeTrainLedger.setUpdateTime(DateUtils.getNowDate()); tSafeTrainLedger.setUpdateTime(DateUtils.getNowDate());
tSafeTrainLedger.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
return tSafeTrainLedgerMapper.updateTSafeTrainLedger(tSafeTrainLedger); return tSafeTrainLedgerMapper.updateTSafeTrainLedger(tSafeTrainLedger);
} }
......
...@@ -26,7 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ...@@ -26,7 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectTSafeInspectLedgerList" parameterType="TSafeInspectLedger" resultMap="TSafeInspectLedgerResult"> <select id="selectTSafeInspectLedgerList" parameterType="TSafeInspectLedger" resultMap="TSafeInspectLedgerResult">
<include refid="selectTSafeInspectLedgerVo"/> <include refid="selectTSafeInspectLedgerVo"/>
<where> <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="content != null and content != ''"> and content = #{content}</if>
<if test="address != null "> and address = #{address}</if> <if test="address != null "> and address = #{address}</if>
<if test="photo != null and photo != ''"> and photo = #{photo}</if> <if test="photo != null and photo != ''"> and photo = #{photo}</if>
......
...@@ -26,7 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ...@@ -26,7 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectTSafeMeetingLedgerList" parameterType="TSafeMeetingLedger" resultMap="TSafeMeetingLedgerResult"> <select id="selectTSafeMeetingLedgerList" parameterType="TSafeMeetingLedger" resultMap="TSafeMeetingLedgerResult">
<include refid="selectTSafeMeetingLedgerVo"/> <include refid="selectTSafeMeetingLedgerVo"/>
<where> <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="content != null and content != ''"> and content = #{content}</if>
<if test="address != null "> and address = #{address}</if> <if test="address != null "> and address = #{address}</if>
<if test="photo != null and photo != ''"> and photo = #{photo}</if> <if test="photo != null and photo != ''"> and photo = #{photo}</if>
......
...@@ -26,7 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ...@@ -26,7 +26,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectTSafeTrainLedgerList" parameterType="TSafeTrainLedger" resultMap="TSafeTrainLedgerResult"> <select id="selectTSafeTrainLedgerList" parameterType="TSafeTrainLedger" resultMap="TSafeTrainLedgerResult">
<include refid="selectTSafeTrainLedgerVo"/> <include refid="selectTSafeTrainLedgerVo"/>
<where> <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="content != null and content != ''"> and content = #{content}</if>
<if test="address != null "> and address = #{address}</if> <if test="address != null "> and address = #{address}</if>
<if test="photo != null and photo != ''"> and photo = #{photo}</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 @@ ...@@ -163,7 +163,7 @@
} }
}, },
hideUpload(fileList){ hideUpload(fileList){
if(fileList.length > 4){ if(fileList.length > this.limit){
this.isHide = true; this.isHide = true;
}else{ }else{
this.isHide = false; this.isHide = false;
......
...@@ -10,33 +10,6 @@ ...@@ -10,33 +10,6 @@
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </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-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> <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> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
...@@ -51,7 +24,7 @@ ...@@ -51,7 +24,7 @@
icon="el-icon-plus" icon="el-icon-plus"
size="mini" size="mini"
@click="handleAdd" @click="handleAdd"
v-hasPermi="['system:ledger:add']" v-hasPermi="['safe:inspect:add']"
>新增</el-button> >新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
...@@ -62,7 +35,7 @@ ...@@ -62,7 +35,7 @@
size="mini" size="mini"
:disabled="single" :disabled="single"
@click="handleUpdate" @click="handleUpdate"
v-hasPermi="['system:ledger:edit']" v-hasPermi="['safe:inspect:edit']"
>修改</el-button> >修改</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
...@@ -73,7 +46,7 @@ ...@@ -73,7 +46,7 @@
size="mini" size="mini"
:disabled="multiple" :disabled="multiple"
@click="handleDelete" @click="handleDelete"
v-hasPermi="['system:ledger:remove']" v-hasPermi="['safe:inspect:remove']"
>删除</el-button> >删除</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
...@@ -84,7 +57,7 @@ ...@@ -84,7 +57,7 @@
size="mini" size="mini"
:loading="exportLoading" :loading="exportLoading"
@click="handleExport" @click="handleExport"
v-hasPermi="['system:ledger:export']" v-hasPermi="['safe:inspect:export']"
>导出</el-button> >导出</el-button>
</el-col> </el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
...@@ -92,13 +65,42 @@ ...@@ -92,13 +65,42 @@
<el-table v-loading="loading" :data="ledgerList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="ledgerList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <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="title" />
<el-table-column label="内容" align="center" prop="content" /> <el-table-column label="内容" align="center" prop="content" />
<el-table-column label="设备状态" align="center" prop="address" /> <el-table-column label="地点" align="center" prop="address" />
<el-table-column label="照片" align="center" prop="photo" /> <el-table-column label="照片" align="center" prop="photo" >
<el-table-column label="附件" align="center" prop="attachment" /> <template slot-scope="scope">
<el-table-column label="是否删除(0正常,1删除)" align="center" prop="isDel" /> <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" prop="remarks" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
...@@ -107,14 +109,14 @@ ...@@ -107,14 +109,14 @@
type="text" type="text"
icon="el-icon-edit" icon="el-icon-edit"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
v-hasPermi="['system:ledger:edit']" v-hasPermi="['safe:inspect:edit']"
>修改</el-button> >修改</el-button>
<el-button <el-button
size="mini" size="mini"
type="text" type="text"
icon="el-icon-delete" icon="el-icon-delete"
@click="handleDelete(scope.row)" @click="handleDelete(scope.row)"
v-hasPermi="['system:ledger:remove']" v-hasPermi="['safe:inspect:remove']"
>删除</el-button> >删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
...@@ -129,25 +131,28 @@ ...@@ -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 ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="检查标题" prop="title"> <el-row>
<el-input v-model="form.title" placeholder="请输入检查标题" /> <el-col :span="12">
</el-form-item> <el-form-item label="检查标题" prop="title">
<el-form-item label="内容"> <el-input v-model="form.title" placeholder="请输入检查标题" />
<editor v-model="form.content" :min-height="192"/> </el-form-item>
</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>
<el-form-item label="设备状态" prop="address"> <el-form-item label="地点" prop="address">
<el-input v-model="form.address" placeholder="请输入设备状态" /> <el-input v-model="form.address" placeholder="请输入地点" />
</el-form-item> </el-form-item>
<el-form-item label="照片" prop="photo"> <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>
<el-form-item label="附件" prop="attachment"> <el-form-item label="附件" prop="attachment">
<el-input v-model="form.attachment" type="textarea" placeholder="请输入内容" /> <!--<fileUpload v-model="form.attachment"/>-->
</el-form-item> <MultipleFileUpload v-model="form.attachment" ref="attachment"/>
<el-form-item label="是否删除(0正常,1删除)" prop="isDel">
<el-input v-model="form.isDel" placeholder="请输入是否删除(0正常,1删除)" />
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remarks"> <el-form-item label="备注" prop="remarks">
<el-input v-model="form.remarks" placeholder="请输入备注" /> <el-input v-model="form.remarks" placeholder="请输入备注" />
...@@ -164,11 +169,14 @@ ...@@ -164,11 +169,14 @@
<script> <script>
import { listLedger, getLedger, delLedger, addLedger, updateLedger, exportLedger } from "@/api/safe/inspect"; import { listLedger, getLedger, delLedger, addLedger, updateLedger, exportLedger } from "@/api/safe/inspect";
import Editor from '@/components/Editor'; import Editor from '@/components/Editor';
import MultipleImageUpload from '@/components/MultipleImageUpload';
import MultipleFileUpload from '@/components/MultipleFileUpload';
export default { export default {
name: "Ledger", name: "Ledger",
components: { components: {
Editor, Editor,
MultipleImageUpload,
MultipleFileUpload
}, },
data() { data() {
return { return {
...@@ -208,6 +216,15 @@ export default { ...@@ -208,6 +216,15 @@ export default {
form: {}, form: {},
// 表单校验 // 表单校验
rules: { 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 { ...@@ -259,7 +276,8 @@ export default {
}, },
// 多选框选中数据 // 多选框选中数据
handleSelectionChange(selection) { 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.single = selection.length!==1
this.multiple = !selection.length this.multiple = !selection.length
}, },
...@@ -275,6 +293,14 @@ export default { ...@@ -275,6 +293,14 @@ export default {
const inspectId = row.inspectId || this.ids const inspectId = row.inspectId || this.ids
getLedger(inspectId).then(response => { getLedger(inspectId).then(response => {
this.form = response.data; 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.open = true;
this.title = "修改安全检查台账"; this.title = "修改安全检查台账";
}); });
...@@ -302,7 +328,8 @@ export default { ...@@ -302,7 +328,8 @@ export default {
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const inspectIds = row.inspectId || this.ids; const inspectIds = row.inspectId || this.ids;
this.$confirm('是否确认删除安全检查台账编号为"' + inspectIds + '"的数据项?', "警告", { const titles = row.title || this.titles;
this.$confirm('是否确认删除安全检查台账标题为"' + titles + '"的数据项?', "警告", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning" type: "warning"
...@@ -327,6 +354,32 @@ export default { ...@@ -327,6 +354,32 @@ export default {
this.download(response.msg); this.download(response.msg);
this.exportLoading = false; this.exportLoading = false;
}).catch(() => {}); }).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 @@ ...@@ -10,33 +10,6 @@
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
/> />
</el-form-item> </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-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> <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> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
...@@ -51,7 +24,7 @@ ...@@ -51,7 +24,7 @@
icon="el-icon-plus" icon="el-icon-plus"
size="mini" size="mini"
@click="handleAdd" @click="handleAdd"
v-hasPermi="['system:ledger:add']" v-hasPermi="['safe:meeting:add']"
>新增</el-button> >新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
...@@ -62,7 +35,7 @@ ...@@ -62,7 +35,7 @@
size="mini" size="mini"
:disabled="single" :disabled="single"
@click="handleUpdate" @click="handleUpdate"
v-hasPermi="['system:ledger:edit']" v-hasPermi="['safe:meeting:edit']"
>修改</el-button> >修改</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
...@@ -73,7 +46,7 @@ ...@@ -73,7 +46,7 @@
size="mini" size="mini"
:disabled="multiple" :disabled="multiple"
@click="handleDelete" @click="handleDelete"
v-hasPermi="['system:ledger:remove']" v-hasPermi="['safe:meeting:remove']"
>删除</el-button> >删除</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
...@@ -84,7 +57,7 @@ ...@@ -84,7 +57,7 @@
size="mini" size="mini"
:loading="exportLoading" :loading="exportLoading"
@click="handleExport" @click="handleExport"
v-hasPermi="['system:ledger:export']" v-hasPermi="['safe:meeting:export']"
>导出</el-button> >导出</el-button>
</el-col> </el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
...@@ -92,13 +65,42 @@ ...@@ -92,13 +65,42 @@
<el-table v-loading="loading" :data="ledgerList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="ledgerList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <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="title" />
<el-table-column label="内容" align="center" prop="content" /> <el-table-column label="内容" align="center" prop="content" />
<el-table-column label="设备状态" align="center" prop="address" /> <el-table-column label="地点" align="center" prop="address" />
<el-table-column label="照片" align="center" prop="photo" /> <el-table-column label="照片" align="center" prop="photo" >
<el-table-column label="附件" align="center" prop="attachment" /> <template slot-scope="scope">
<el-table-column label="是否删除(0正常,1删除)" align="center" prop="isDel" /> <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" prop="remarks" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
...@@ -107,14 +109,14 @@ ...@@ -107,14 +109,14 @@
type="text" type="text"
icon="el-icon-edit" icon="el-icon-edit"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
v-hasPermi="['system:ledger:edit']" v-hasPermi="['safe:meeting:edit']"
>修改</el-button> >修改</el-button>
<el-button <el-button
size="mini" size="mini"
type="text" type="text"
icon="el-icon-delete" icon="el-icon-delete"
@click="handleDelete(scope.row)" @click="handleDelete(scope.row)"
v-hasPermi="['system:ledger:remove']" v-hasPermi="['safe:meeting:remove']"
>删除</el-button> >删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
...@@ -129,28 +131,31 @@ ...@@ -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-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="例会标题" prop="title"> <el-row>
<el-input v-model="form.title" placeholder="请输入例会标题" /> <el-col :span="12">
<el-form-item label="例会标题" prop="title">
<el-input v-model="form.title" placeholder="请输入例会标题" />
</el-form-item>
</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>
<el-form-item label="内容"> <el-form-item label="地点" prop="address">
<editor v-model="form.content" :min-height="192"/> <el-input v-model="form.address" placeholder="请输入地点" />
</el-form-item>
<el-form-item label="设备状态" prop="address">
<el-input v-model="form.address" placeholder="请输入设备状态" />
</el-form-item> </el-form-item>
<el-form-item label="照片" prop="photo"> <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>
<el-form-item label="附件" prop="attachment"> <el-form-item label="附件" prop="attachment">
<el-input v-model="form.attachment" type="textarea" placeholder="请输入内容" /> <!--<fileUpload v-model="form.attachment"/>-->
</el-form-item> <MultipleFileUpload v-model="form.attachment" ref="attachment"/>
<el-form-item label="是否删除(0正常,1删除)" prop="isDel">
<el-input v-model="form.isDel" placeholder="请输入是否删除(0正常,1删除)" />
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remarks"> <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-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
...@@ -164,11 +169,14 @@ ...@@ -164,11 +169,14 @@
<script> <script>
import { listLedger, getLedger, delLedger, addLedger, updateLedger, exportLedger } from "@/api/safe/meeting"; import { listLedger, getLedger, delLedger, addLedger, updateLedger, exportLedger } from "@/api/safe/meeting";
import Editor from '@/components/Editor'; import Editor from '@/components/Editor';
import MultipleImageUpload from '@/components/MultipleImageUpload';
import MultipleFileUpload from '@/components/MultipleFileUpload';
export default { export default {
name: "Ledger", name: "Ledger",
components: { components: {
Editor, Editor,
MultipleImageUpload,
MultipleFileUpload,
}, },
data() { data() {
return { return {
...@@ -208,7 +216,16 @@ export default { ...@@ -208,7 +216,16 @@ export default {
form: {}, form: {},
// 表单校验 // 表单校验
rules: { rules: {
} title: [
{ required: true, message: "例会标题不能为空", trigger: "blur" }
],
content: [
{ required: true, message: "内容不能为空", trigger: "blur" }
],
address: [
{ required: true, message: "地点不能为空", trigger: "blur" }
],
},
}; };
}, },
created() { created() {
...@@ -259,7 +276,8 @@ export default { ...@@ -259,7 +276,8 @@ export default {
}, },
// 多选框选中数据 // 多选框选中数据
handleSelectionChange(selection) { 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.single = selection.length!==1
this.multiple = !selection.length this.multiple = !selection.length
}, },
...@@ -275,6 +293,14 @@ export default { ...@@ -275,6 +293,14 @@ export default {
const meetingId = row.meetingId || this.ids const meetingId = row.meetingId || this.ids
getLedger(meetingId).then(response => { getLedger(meetingId).then(response => {
this.form = response.data; 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.open = true;
this.title = "修改安全例会台账"; this.title = "修改安全例会台账";
}); });
...@@ -302,7 +328,8 @@ export default { ...@@ -302,7 +328,8 @@ export default {
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const meetingIds = row.meetingId || this.ids; const meetingIds = row.meetingId || this.ids;
this.$confirm('是否确认删除安全例会台账编号为"' + meetingIds + '"的数据项?', "警告", { const titles = row.title || this.titles;
this.$confirm('是否确认删除安全例会台账标题为"' + titles + '"的数据项?', "警告", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning" type: "warning"
...@@ -327,6 +354,32 @@ export default { ...@@ -327,6 +354,32 @@ export default {
this.download(response.msg); this.download(response.msg);
this.exportLoading = false; this.exportLoading = false;
}).catch(() => {}); }).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> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> <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 <el-input
v-model="queryParams.title" v-model="queryParams.title"
placeholder="请输入检查标题" 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="请输入备注"
clearable clearable
size="small" size="small"
@keyup.enter.native="handleQuery" @keyup.enter.native="handleQuery"
...@@ -51,7 +24,7 @@ ...@@ -51,7 +24,7 @@
icon="el-icon-plus" icon="el-icon-plus"
size="mini" size="mini"
@click="handleAdd" @click="handleAdd"
v-hasPermi="['system:ledger:add']" v-hasPermi="['safe:trian:add']"
>新增</el-button> >新增</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
...@@ -62,7 +35,7 @@ ...@@ -62,7 +35,7 @@
size="mini" size="mini"
:disabled="single" :disabled="single"
@click="handleUpdate" @click="handleUpdate"
v-hasPermi="['system:ledger:edit']" v-hasPermi="['safe:trian:edit']"
>修改</el-button> >修改</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
...@@ -73,7 +46,7 @@ ...@@ -73,7 +46,7 @@
size="mini" size="mini"
:disabled="multiple" :disabled="multiple"
@click="handleDelete" @click="handleDelete"
v-hasPermi="['system:ledger:remove']" v-hasPermi="['safe:trian:remove']"
>删除</el-button> >删除</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
...@@ -84,7 +57,7 @@ ...@@ -84,7 +57,7 @@
size="mini" size="mini"
:loading="exportLoading" :loading="exportLoading"
@click="handleExport" @click="handleExport"
v-hasPermi="['system:ledger:export']" v-hasPermi="['safe:trian:export']"
>导出</el-button> >导出</el-button>
</el-col> </el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
...@@ -92,13 +65,42 @@ ...@@ -92,13 +65,42 @@
<el-table v-loading="loading" :data="ledgerList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="ledgerList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <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="content" />
<el-table-column label="设备状态" align="center" prop="address" /> <el-table-column label="地点" align="center" prop="address" />
<el-table-column label="照片" align="center" prop="photo" /> <el-table-column label="照片" align="center" prop="photo" >
<el-table-column label="附件" align="center" prop="attachment" /> <template slot-scope="scope">
<el-table-column label="是否删除(0正常,1删除)" align="center" prop="isDel" /> <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" prop="remarks" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
...@@ -107,14 +109,14 @@ ...@@ -107,14 +109,14 @@
type="text" type="text"
icon="el-icon-edit" icon="el-icon-edit"
@click="handleUpdate(scope.row)" @click="handleUpdate(scope.row)"
v-hasPermi="['system:ledger:edit']" v-hasPermi="['safe:trian:edit']"
>修改</el-button> >修改</el-button>
<el-button <el-button
size="mini" size="mini"
type="text" type="text"
icon="el-icon-delete" icon="el-icon-delete"
@click="handleDelete(scope.row)" @click="handleDelete(scope.row)"
v-hasPermi="['system:ledger:remove']" v-hasPermi="['safe:trian:remove']"
>删除</el-button> >删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
...@@ -129,25 +131,28 @@ ...@@ -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 ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="检查标题" prop="title"> <el-row>
<el-input v-model="form.title" placeholder="请输入检查标题" /> <el-col :span="12">
</el-form-item> <el-form-item label="培训标题" prop="title">
<el-form-item label="内容"> <el-input v-model="form.title" placeholder="请输入培训标题" />
<editor v-model="form.content" :min-height="192"/> </el-form-item>
</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>
<el-form-item label="设备状态" prop="address"> <el-form-item label="地点" prop="address">
<el-input v-model="form.address" placeholder="请输入设备状态" /> <el-input v-model="form.address" placeholder="请输入地点" />
</el-form-item> </el-form-item>
<el-form-item label="照片" prop="photo"> <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>
<el-form-item label="附件" prop="attachment"> <el-form-item label="附件" prop="attachment">
<el-input v-model="form.attachment" type="textarea" placeholder="请输入内容" /> <!--<fileUpload v-model="form.attachment"/>-->
</el-form-item> <MultipleFileUpload v-model="form.attachment" ref="attachment"/>
<el-form-item label="是否删除(0正常,1删除)" prop="isDel">
<el-input v-model="form.isDel" placeholder="请输入是否删除(0正常,1删除)" />
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remarks"> <el-form-item label="备注" prop="remarks">
<el-input v-model="form.remarks" placeholder="请输入备注" /> <el-input v-model="form.remarks" placeholder="请输入备注" />
...@@ -164,11 +169,14 @@ ...@@ -164,11 +169,14 @@
<script> <script>
import { listLedger, getLedger, delLedger, addLedger, updateLedger, exportLedger } from "@/api/safe/train"; import { listLedger, getLedger, delLedger, addLedger, updateLedger, exportLedger } from "@/api/safe/train";
import Editor from '@/components/Editor'; import Editor from '@/components/Editor';
import MultipleImageUpload from '@/components/MultipleImageUpload';
import MultipleFileUpload from '@/components/MultipleFileUpload';
export default { export default {
name: "Ledger", name: "Ledger",
components: { components: {
Editor, Editor,
MultipleImageUpload,
MultipleFileUpload
}, },
data() { data() {
return { return {
...@@ -208,6 +216,15 @@ export default { ...@@ -208,6 +216,15 @@ export default {
form: {}, form: {},
// 表单校验 // 表单校验
rules: { 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 { ...@@ -259,7 +276,8 @@ export default {
}, },
// 多选框选中数据 // 多选框选中数据
handleSelectionChange(selection) { 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.single = selection.length!==1
this.multiple = !selection.length this.multiple = !selection.length
}, },
...@@ -272,9 +290,17 @@ export default { ...@@ -272,9 +290,17 @@ export default {
/** 修改按钮操作 */ /** 修改按钮操作 */
handleUpdate(row) { handleUpdate(row) {
this.reset(); this.reset();
const trainId = row.trainId || this.ids const trainId = row.trainId || this.ids;
getLedger(trainId).then(response => { getLedger(trainId).then(response => {
this.form = response.data; 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.open = true;
this.title = "修改安全培训台账"; this.title = "修改安全培训台账";
}); });
...@@ -302,7 +328,8 @@ export default { ...@@ -302,7 +328,8 @@ export default {
/** 删除按钮操作 */ /** 删除按钮操作 */
handleDelete(row) { handleDelete(row) {
const trainIds = row.trainId || this.ids; const trainIds = row.trainId || this.ids;
this.$confirm('是否确认删除安全培训台账编号为"' + trainIds + '"的数据项?', "警告", { const titles = row.title || this.titles;
this.$confirm('是否确认删除安全培训台账标题为"' + titles + '"的数据项?', "警告", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning" type: "warning"
...@@ -327,6 +354,32 @@ export default { ...@@ -327,6 +354,32 @@ export default {
this.download(response.msg); this.download(response.msg);
this.exportLoading = false; this.exportLoading = false;
}).catch(() => {}); }).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