隐患整改

hyx_2025-01-13_xgf2.0
LiuJiaNan 2025-05-23 14:37:33 +08:00
parent 09eab40055
commit be35580a81
14 changed files with 1599 additions and 0 deletions

View File

@ -9,4 +9,17 @@ export const setRefreshToken = (params) => post("/sys/refreshToken", params ); /
export const setEntryV1 = (params) => post("/app/sys/user/entry", params ); // 入职
export const resignV1 = (params) => post("/app/sys/user/resign", params ); // 离职
export const getStudentInfoApi = (params) => post("/app/student/getStudentInfo", params ); // 获取学员信息
export const getHiddenList = (params) => post("/app/hidden/list", params); // 隐患列表
export const getHiddenInfo = (params) => post("/app/hidden/goEdit", params); // 隐患信息
export const setFileDelete = (params) => post("/app/imgfiles/delete", params); // 删除图片
export const getPersonnelList = (params) => post("/app/sys/listUser", params); // 人员
export const setHiddenNuRectificationSubmit = (params) =>
post("/app/hiddenexamine/special", params);
export const setHiddenRectificationSubmit = (params) =>
post("/app/hidden/rectify", params); // 隐患整改提交
export const fileUpload = (params) => upload("/app/file/upload", params);

View File

@ -0,0 +1,68 @@
<template>
<next-tree
ref="nextTreeRef"
check-strictly
func-mode="radio"
select-parent
:if-search="false"
:tree-data="treeData"
:is-show-clear="isShowClear"
theme-color="#3377ff"
page-height="92vh"
label-key="name"
value-key="id"
children-key="children"
@confirm="fnTreeConfirm"
@cancel="visible = false"
/>
</template>
<script>
import {getDepartmentTree} from "@/api";
export default {
props: {
visible: {
type: Boolean,
required: true,
},
value: {
type: String,
default: "",
},
isShowClear: {
type: Boolean,
default: false,
},
},
data() {
return {
treeData: []
}
},
async mounted() {
await this.fnGetData();
this.$watch("visible", (newVal) => {
if (newVal) {
this.$refs.nextTreeRef && this.$refs.nextTreeRef._show();
this.$refs.nextTreeRef && this.$refs.nextTreeRef.checkedFunc(this.value);
} else this.$refs.nextTreeRef && this.$refs.nextTreeRef._hide();
}, {immediate: true})
},
methods: {
fnTreeConfirm(event) {
this.$emit("confirm", event);
this.$emit("update:visible", false);
},
async fnGetData() {
const resData = await getDepartmentTree({
loading: false,
postMethod: 'application/json',
});
this.treeData = JSON.parse(resData.zTreeNodes);
}
},
}
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,105 @@
<template>
<view>
<u-form-item
:label="label"
:prop="prop"
:required="required"
@click="()=>{
!disabled ? (visible = true) : null
}"
>
<view class="select_content">
<u-input
:value="name || '请选择'"
border="none"
input-align="right"
readonly
/>
<u-icon name="arrow-right"></u-icon>
</view>
</u-form-item>
<u-line/>
<department
:visible.sync="visible"
:value="id"
:is-show-clear="isShowClear"
@confirm="fnConfirm"
/>
</view>
</template>
<script>
import Department from "./department.vue";
export default {
components: {
Department,
},
props: {
name: {
type: String,
required: true,
default: "",
},
id: {
type: String,
required: true,
default: "",
},
form: {
type: Object,
default: () => ({}),
},
label: {
type: String,
default: "部门",
},
prop: {
type: String,
default: "",
},
required: {
type: Boolean,
default: true,
},
clearKey: {
type: String,
default: "",
},
disabled: {
type: Boolean,
default: false,
},
isShowClear: {
type: Boolean,
default: false,
},
},
data() {
return {
visible: false
}
},
methods: {
fnConfirm(event) {
if (event.length > 0) {
this.$emit('update:name', event[0].name)
this.$emit('update:id', event[0].id)
} else {
this.$emit('update:name', '')
this.$emit('update:id', '')
}
if (JSON.stringify(this.form) !== "{}" && this.clearKey) {
const clearKey = this.clearKey.split(",");
const form = uni.$u.deepClone(this.form)
for (let i = 0; i < clearKey.length; i++) {
form[clearKey[i]] = "";
}
this.$emit("update:form", form);
}
}
},
}
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,329 @@
<template>
<view>
<u-cell-group>
<u-cell title="隐患描述" :label="info.HIDDENDESCR"/>
<u-cell title="隐患来源" :value="HIDDEN_SOURCE[info.SOURCE]"/>
<block v-if="info.SOURCE === '2'">
<u-cell title="风险点(单元)" :value="info.RISK_UNIT"/>
<u-cell title="辨识部位" :value="info.IDENTIFICATION"/>
<u-cell title="存在风险" :value="info.RISK_DESCR"/>
<u-cell title="风险分级" :value="info.LEVEL"/>
<u-cell title="检查内容" :value="info.CHECK_CONTENT"/>
</block>
<u-cell title="隐患上报位置(经纬度)">
<template #label>
<view v-if="info.LONGITUDE && info.LATITUDE">
<view>经度:{{ info.LONGITUDE }}</view>
<view>纬度:{{ info.LATITUDE }}</view>
</view>
</template>
</u-cell>
<u-cell title="隐患部位" :value="info.hregionName || info.HIDDENPART"/>
<u-cell title="隐患位置描述" :value="info.POSITIONDESC"/>
<u-cell title="隐患类型" :value="info.HIDDENTYPENAME"/>
<u-cell title="隐患级别" :value="info.HIDDENLEVELNAME"/>
<u-cell title="隐患发现人" :value="hiddenFindPeople.map((item) => item.NAME).join('、')"/>
<u-cell title="隐患发现时间" :value="info.DISCOVERYTIME"/>
<block v-if="info.RECTIFICATIONTYPE">
<u-cell title="整改类型">
<template #value>
<text v-if="info.RECTIFICATIONTYPE === '1'"></text>
<text v-else-if="info.RECTIFICATIONTYPE === '2'">限期整改</text>
</template>
</u-cell>
<u-cell title="整改负责部门" :value="info.editDeptName"/>
<u-cell title="整改负责人" :value="info.editUserName"/>
<block v-if="info.RECTIFICATIONTYPE === '2'">
<u-cell title="整改期限" :value="info.editRectificationDeadline"/>
</block>
</block>
<u-cell title="是否相关方">
<template #value>
<text v-if="info.ISRELEVANT === '1'"></text>
<text v-else-if="info.ISRELEVANT === '2'"></text>
</template>
</u-cell>
<app-preview-image :files="hImgs" label="隐患照片"/>
<block v-if="hiddenVideo.length > 0">
<u-cell title="隐患视频">
<template #value>
<u-icon
name="play-circle-fill"
size="24"
@click="fnPreviewVideo(hiddenVideo[0].FILEPATH)"
/>
</template>
</u-cell>
</block>
<view v-for="(item, index) in hiddenExamineList" :key="index">
<block v-if="item.TYPE === 4">
<u-divider text-position="left" text="隐患确认"></u-divider>
<u-cell title="隐患级别" :value="item.editLevelName"/>
<u-cell title="整改负责人部门" :value="item.editDeptName"/>
<u-cell title="整改负责人" :value="item.editUserName"/>
<u-cell title="整改完成期限" :value="item.spare3"/>
<u-cell title="隐患确认人" :value="info.conUserName"/>
<u-cell title="隐患确认时间" :value="info.CONFIRM_TIME"/>
</block>
<block v-if="item.TYPE === 6 && item.spare5 !== '1'">
<u-cell title="隐患状态" value="确认打回"/>
<u-cell title="打回原因" :label="item.REPULSE_CAUSE"/>
<u-cell title="打回时间" :value="item.CREATTIME"/>
</block>
<block v-if="item.TYPE === 2">
<u-divider text-position="left" text="延期信息"></u-divider>
<u-cell title="申请延期日期" :value="item.CREATTIME"/>
<u-cell title="延期日期" :value="formatDate(item.DELAY_TIME)"/>
<u-cell title="审核人" :value="info.conUserName"/>
<u-cell title="处置方案" :value="item.DISPOSAL_PLAN"/>
<block v-if="item.DISPOSAL_FILE">
<u-cell title="处置方案附件">
<template #value>
<u-button
type="primary"
size="mini"
shape="circle"
:custom-style="{ width: 'auto' }"
text="下载"
@click="fnPreviewFile(item.DISPOSAL_FILE)"
/>
</template>
</u-cell>
</block>
<u-cell title="延期审核状态">
<template #value>
<text v-if="item.STATE === -1"></text>
<text v-if="item.STATE === 1"></text>
<text v-if="item.STATE === 2"></text>
</template>
</u-cell>
<block v-if="item.STATE !== -1">
<u-cell title="审核时间" :value="item.OPERATTIME"/>
</block>
</block>
<block v-if="item.TYPE === 1">
<u-divider text-position="left" text="特殊处理审核信息"></u-divider>
<u-cell title="无法整改原因" :label="item.EXAMINE"/>
<u-cell title="特殊处置审核状态">
<template #value>
<!-- 是否通过审核 ,1未通过2通过 -1初始16隐患确认打回 -->
<text v-if="item.STATE === -1"></text>
<text v-if="item.STATE === 1"></text>
<text v-if="item.STATE === 2"></text>
</template>
</u-cell>
<block v-if="item.STATE === 1">
<u-cell title="处置方案" :value="item.DISPOSAL_PLAN"/>
<block v-if="item.DISPOSAL_FILE">
<u-cell title="处置方案附件">
<template #value>
<u-button
type="primary"
size="mini"
shape="circle"
:custom-style="{ width: 'auto' }"
text="下载"
@click="fnPreviewFile(item.DISPOSAL_FILE)"
/>
</template>
</u-cell>
</block>
</block>
<block v-if="item.STATE !== -1">
<u-cell title="审核时间" :value="item.OPERATTIME"/>
<u-cell title="审核人" :value="info.conUserName"/>
</block>
<block v-if="item.STATE === 2">
<u-cell title="是否更换整改负责人" :value="item.spare1 === '1' ? '是' : '否'"/>
<block v-if="item.spare1 === '1'">
<u-cell title="整改负责人" :value="item.editUserName"/>
</block>
</block>
</block>
<block v-if="item.TYPE === 3">
<u-divider text-position="left" text="验收打回信息"></u-divider>
<u-cell title="验收打回意见" :label="item.EXAMINE"/>
<u-cell title="验收人" :value="item.CREATORNAME"/>
<u-cell title="验收时间" :value="item.CREATTIME"/>
</block>
</view>
<block v-if="info.REJECTREASON">
<u-divider text-position="left" text="隐患复查"></u-divider>
<u-cell title="复查驳回原因" :label="info.REJECTREASON"/>
</block>
<block v-if="info.STATE === '2' || info.STATE === '4' || (info.STATE === '-2' && info.RECTIFICATIONTYPE === '1') || info.STATE === '10'">
<u-divider text-position="left" text="整改信息"></u-divider>
<u-cell title="整改描述" :label="info.RECTIFYDESCR"/>
<u-cell title="整改部门" :value="info.RECTIFICATIONDEPTNAME"/>
<u-cell title="整改人" :value="info.RECTIFICATIONORNAME"/>
<u-cell title="整改时间" :value="info.RECTIFICATIONTIME"/>
<u-cell title="投入资金" :value="info.INVESTMENT_FUNDS === undefined ? '' : info.INVESTMENT_FUNDS + '元'"/>
<app-preview-image :files="rImgs" label="整改后图片"/>
<u-cell title="整改方案">
<template #value>
<text v-if="info.HAVESCHEME === '0'"></text>
<text v-else-if="info.HAVESCHEME === '1'"></text>
</template>
</u-cell>
<block v-if="info.HAVESCHEME === '1'">
<u-cell title="排查日期" :value="rectificationPlanInfo.SCREENINGDATE"/>
<block v-if="rectificationPlanInfo.LISTNAME">
<u-cell title="隐患清单" :value="rectificationPlanInfo.LISTNAME"/>
</block>
<u-cell title="治理标准要求" :value="rectificationPlanInfo.GOVERNSTANDARDS"/>
<u-cell title="治理方法" :value="rectificationPlanInfo.GOVERNMETHOD"/>
<u-cell title="经费和物资的落实" :value="rectificationPlanInfo.EXPENDITURE"/>
<u-cell title="负责治理人员" :value="rectificationPlanInfo.PRINCIPAL"/>
<u-cell title="工时安排" :value="rectificationPlanInfo.PROGRAMMING"/>
<u-cell title="时限要求" :value="rectificationPlanInfo.TIMELIMITFOR"/>
<u-cell title="工作要求" :value="rectificationPlanInfo.JOBREQUIREMENT"/>
<u-cell title="其他事项" :value="rectificationPlanInfo.OTHERBUSINESS"/>
<app-preview-image :files="sImgs" label="方案图片"/>
</block>
</block>
<block v-if="info.STATE === '4'">
<u-divider text-position="left" text="验收信息"></u-divider>
<block v-if="info.RECTIFICATIONTYPE === '1'">
<u-cell title="验收人" :value="info.CHECKORNAME" />
</block>
<block v-else>
<view v-for="(item, index) in checkList" :key="index">
<u-cell title="验收描述" :label="item.CHECKDESCR" />
<u-cell title="是否合格" :value="item.STATUS === 1 ? '是' : '否'" />
<u-cell title="验收部门" :value="item.CHECKDEPTNAME" />
<u-cell title="验收人" :value="item.CHECKORNAME" />
<u-cell title="验收时间" :value="item.CHECK_TIME" />
<app-preview-image :files="item.cImgs" label="验收图片" />
</view>
</block>
</block>
</u-cell-group>
<u-modal
:show="videoDialog.visible"
title="视频预览"
:show-confirm-button="false"
show-cancel-button
cancel-text="关闭"
@cancel="fnCloseVideoDialog"
>
<video
v-if="videoDialog.src"
:src="videoDialog.src"
style="width: 100%; height: 200px; margin: 10px"
autoplay
/>
</u-modal>
</view>
</template>
<script>
import AppPreviewImage from '@/components/preview_image/index.vue'
import dayjs from "dayjs";
import {getHiddenInfo} from "@/api/api";
export default {
components: {
AppPreviewImage,
},
props: {
hiddenId: {
type: String,
required: true,
},
},
data() {
return {
HIDDEN_SOURCE: {
1: "隐患快报",
2: "清单排查",
3: "清单排查",
4: "安全环保检查(监管端)",
5: "安全环保检查(企业端)",
6: "消防检查",
},
info: {},
hiddenFindPeople: [],
hImgs: [],
hiddenVideo: [],
hiddenExamineList: [],
rImgs: [],
rectificationPlanInfo: {},
sImgs: [],
checkList: [],
videoDialog: {
visible: false,
src: ''
}
}
},
mounted() {
this.fnGetData()
},
methods: {
async fnGetData(){
if (!this.hiddenId) return;
const filePath = this.$filePath
const resData = await getHiddenInfo({
HIDDEN_ID: this.hiddenId,
postMethod: 'application/json',
});
for (let i = 0; i < resData.hImgs.length; i++) {
resData.hImgs[i].FILEPATH = filePath + resData.hImgs[i].FILEPATH;
}
for (let i = 0; i < resData.rImgs.length; i++) {
resData.rImgs[i].FILEPATH = filePath + resData.rImgs[i].FILEPATH;
}
for (let i = 0; i < resData.sImgs.length; i++) {
resData.sImgs[i].FILEPATH = filePath + resData.sImgs[i].FILEPATH;
}
for (let i = 0; i < resData.hiddenVideo.length; i++) {
resData.hiddenVideo[i].FILEPATH =
filePath + resData.hiddenVideo[i].FILEPATH;
}
for (let i = 0; i < resData.checkList.length; i++) {
for (let j = 0; j < resData.checkList[i].cImgs.length; j++) {
resData.checkList[i].cImgs[j].FILEPATH =
filePath + resData.checkList[i].cImgs[j].FILEPATH;
}
}
this.info = resData.pd;
this.rectificationPlanInfo = resData.hs;
this.hiddenFindPeople = resData.hiddenFindPeople;
this.hImgs = resData.hImgs;
this.rImgs = resData.rImgs;
this.sImgs = resData.sImgs;
this.checkList = resData.checkList;
this.hiddenVideo = resData.hiddenVideo;
this.hiddenExamineList = resData.hiddenExa;
this.$emit("throw-basic-info", resData)
},
formatDate(date) {
return dayjs(date).format('YYYY-MM-DD')
},
fnPreviewVideo(src) {
this.videoDialog.visible = true;
this.videoDialog.src = src;
},
fnCloseVideoDialog() {
this.videoDialog.visible = false;
this.videoDialog.src = '';
},
fnPreviewFile(src) {
uni.downloadFile({
url: this.$filePath + src,
success: (res) => {
uni.openDocument({
filePath: res.tempFilePath,
});
},
});
}
},
}
</script>
<style scoped lang="scss">
.ml-10:first-child {
margin-left: 0;
}
</style>

View File

@ -0,0 +1,137 @@
<template>
<view>
<u-form-item
:label="label"
:prop="prop"
:required="required"
@click="fnShowPicker"
>
<view class="select_content">
<u-input
:value="name || '请选择'"
border="none"
input-align="right"
readonly
/>
<u-icon name="arrow-right"></u-icon>
</view>
</u-form-item>
<u-line/>
<u-picker
:show="visible"
:columns="[columns]"
key-name="NAME"
:default-index="[defaultIndex]"
@cancel="visible = false"
@confirm="fnConfirm"
/>
</view>
</template>
<script>
import {getPersonnelList} from "@/api/api";
export default {
props: {
name: {
type: String,
required: true,
default: "",
},
id: {
type: String,
required: true,
default: "",
},
label: {
type: String,
default: "人员",
},
prop: {
type: String,
default: "",
},
required: {
type: Boolean,
default: true,
},
disabled: {
type: Boolean,
default: false,
},
departmentId: {
type: String,
required: false,
},
corpInfoId: {
type: String,
required: false,
},
//
isAllowSelectionCurrentPerson: {
type: Boolean,
default: true,
},
},
data() {
return {
visible: false,
columns:[],
defaultIndex:0
}
},
methods: {
async fnGetData() {
const resData = await getPersonnelList({
DEPARTMENT_ID: this.departmentId,
NOMAIN: "1",
loading: false,
postMethod: 'application/json',
});
this.columns = resData.userList;
},
fnShowPicker(){
if (this.disabled) return;
if (this.columns.length === 0) {
uni.showToast({
title: "暂无可选人员",
icon: "none",
});
return;
}
this.visible = true;
this.defaultIndex = 0;
for (let i = 0; i < this.columns.length; i++) {
if (this.columns[i].USER_ID === this.id) {
this.defaultIndex = i;
break;
}
}
},
fnConfirm(event){
if (!this.isAllowSelectionCurrentPerson) {
if (event.value[0].USER_ID === this.$store.getters.getUserInfo.USER_ID) {
uni.showToast({
title: "不能选择当前登录人",
icon: "none",
});
return;
}
}
this.$emit("update:id", event.value[0].USER_ID);
this.$emit("update:name", event.value[0].NAME);
this.$emit("confirm", event.value[0]);
this.visible = false;
}
},
watch:{
departmentId(val) {
if (val) this.fnGetData();
else this.columns = [];
}
}
}
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,43 @@
<template>
<u-cell :title="label">
<template #label>
<view class="mt-10 flex-start">
<view v-for="(item, index) in files" :key="index" class="ml-10">
<u-image
show-loading
width="100rpx"
height="100rpx"
:src="item.FILEPATH"
@click="fnPreviewImage(item.FILEPATH, files)"
/>
</view>
</view>
</template>
</u-cell>
</template>
<script>
export default {
props: {
files: {
type: Array,
required: true,
},
label: {
type: String,
default: "图片",
},
},
methods: {
fnPreviewImage(src, srcArr) {
const urls = srcArr.map((item) => item.FILEPATH);
uni.previewImage({
urls,
current: src,
});
}
},
}
</script>
<style scoped lang="scss"></style>

95
components/time/index.vue Normal file
View File

@ -0,0 +1,95 @@
<template>
<view>
<u-form-item
:label="label"
:prop="prop"
:required="required"
:label-position="labelPosition"
@click="fnShowPicker"
>
<view class="select_content">
<u-input
:value="value || '请选择'"
border="none"
input-align="right"
readonly
/>
<u-icon name="arrow-right"></u-icon>
</view>
</u-form-item>
<u-line/>
<u-datetime-picker
v-model="currentValue"
:show="visible"
:max-date="maxDate"
:min-date="minDate"
:mode="mode"
@cancel="visible = false"
@confirm="fnConfirm"
/>
</view>
</template>
<script>
import dayjs from "dayjs";
export default {
props: {
value: {
type: String,
required: true,
default: "",
},
label: {
type: String,
default: "时间",
},
prop: {
type: String,
default: "",
},
mode: {
type: String,
default: "datetime",
},
labelPosition: {
type: String,
default: "left",
},
required: {
type: Boolean,
default: true,
},
maxDate: {
type: Number,
default: dayjs().add(10, "year").valueOf(),
},
minDate: {
type: Number,
default: dayjs().subtract(10, "year").valueOf(),
},
},
data() {
return {
visible: false,
currentValue: this.value ? dayjs(this.value).valueOf() : new Date().getTime(),
}
},
methods: {
fnShowPicker() {
this.visible = true
},
fnConfirm({mode, value}) {
if (mode === "datetime")
this.$emit('input', dayjs(value).format("YYYY-MM-DD HH:mm"))
else if (mode === "date")
this.$emit('input', dayjs(value).format("YYYY-MM-DD"))
else if (mode === "year-month")
this.$emit('input', dayjs(value).format("YYYY-MM"))
this.visible = false;
}
},
}
</script>
<style scoped lang="scss"></style>

128
components/upload/index.vue Normal file
View File

@ -0,0 +1,128 @@
<template>
<view>
<u-form-item
:label="label"
:label-position="labelPosition"
:prop="prop"
:required="required"
>
<view class="mt-10" style="flex: 1">
<u-upload
:file-list="value"
:multiple="multiple"
:max-count="maxCount"
width="76"
height="76"
:accept="accept"
:disabled="disabled"
:deletable="!deletable"
:capture="capture"
@afterRead="fnAfterRead"
@delete="fnDelete"
/>
</view>
</u-form-item>
<u-line/>
</view>
</template>
<script>
import {setFileDelete} from "@/api/api";
export default {
props: {
value: {
type: Array,
required: true,
default: () => [],
},
label: {
type: String,
default: "图片",
},
labelPosition: {
type: String,
default: "top",
},
prop: {
type: String,
default: "",
},
required: {
type: Boolean,
default: true,
},
multiple: {
type: Boolean,
default: true,
},
maxCount: {
type: Number,
default: 4,
},
accept: {
type: String,
default: "image",
},
defineUpload: {
type: Boolean,
default: true,
},
defineDelete: {
type: Boolean,
default: true,
},
disabled: {
type: Boolean,
default: false,
},
deletable: {
type: Boolean,
default: false,
},
capture: {
type: Array,
default: () => ["album", "camera"],
},
},
methods: {
fnAfterRead(event) {
if (this.multiple) {
if (this.defineUpload) {
this.$emit('input', [...this.value, ...event.file])
}
} else {
if (this.defineUpload) {
this.$emit('input', [...this.value, event.file])
}
}
this.$emit('after-read', event.file)
},
fnDelete(event) {
uni.showModal({
title: "提示",
content: "是否删除该图片",
success: async (res) => {
if (res.confirm) {
if (this.defineDelete) {
if (event.file.IMGFILES_ID) {
await setFileDelete({
IMGFILES_ID: event.file.IMGFILES_ID,
postMethod: 'application/json',
});
}
const value = uni.$u.deepClone(this.value)
value.splice(event.index, 1)
this.$emit('input', value)
} else {
this.$emit('delete', event)
}
}
},
});
}
},
}
</script>
<style scoped lang="scss"></style>

View File

@ -423,6 +423,18 @@
"style": {
"navigationBarTitleText": "开始考试"
}
},
{
"path": "pages/hidden_rectification/index",
"style": {
"navigationBarTitleText": "隐患整改"
}
},
{
"path": "pages/hidden_rectification/rectification",
"style": {
"navigationBarTitleText": "隐患整改"
}
}
],
"globalStyle": {

View File

@ -0,0 +1,126 @@
<template>
<view class="content">
<u-list @scrolltolower="scrolltolower" v-if="list.length > 0">
<u-list-item v-for="(item, index) in list" :key="index">
<view>
<view class="flex-between main-title">
<view class="u-line-1">{{ item.HIDDENDESCR || "暂无" }}</view>
<view :class="HIDDEN_LEVEL_COlOR[item.HIDDENLEVEL]">
{{ item.HIDDENLEVELNAME }}
</view>
</view>
<view class="flex-between mt-10 subtitle">
<view>来源{{ HIDDEN_SOURCE[item.SOURCE] }}</view>
</view>
<view class="flex-between subtitle mt-5">
<view>隐患发现人{{ item.findUserNames || "暂无" }}</view>
<view>
隐患发现时间{{ item.DISCOVERYTIME ? formatDate(item.DISCOVERYTIME) : "暂无" }}
</view>
</view>
<view class="flex-between subtitle mt-5">
<view>隐患确认人{{ item.confirmUserName || "暂无" }}</view>
<view>
隐患确认时间{{ item.CONFIRM_TIME ? formatDate(item.CONFIRM_TIME) : "暂无" }}
</view>
</view>
<view class="flex-between mt-10 subtitle">
<view></view>
<view class="flex-between">
<u-button type="primary" text="整改" size="mini" @click="fnRectification(item.HIDDEN_ID)"></u-button>
</view>
</view>
</view>
</u-list-item>
</u-list>
<empty v-else></empty>
</view>
</template>
<script>
import {getHiddenList} from "../../api/api";
import dayjs from 'dayjs'
export default {
data() {
return {
pageSize: 10,
currentPage: 1,
totalPage: 0,
list: [],
HIDDEN_LEVEL_COlOR: {
hiddenLevel1001: "yellow-bg",
hiddenLevel1002: "yellow-bg",
hiddenLevel1004: "yellow-bg",
hiddenLevel2001: "red-bg",
hiddenLevel2002: "red-bg",
},
HIDDEN_SOURCE: {
1: "隐患快报",
2: "清单排查",
3: "清单排查",
4: "安全环保检查(监管端)",
5: "安全环保检查(企业端)",
6: "消防检查",
}
}
},
onShow() {
this.resetList()
},
methods: {
async getData() {
let resData = await getHiddenList({
DISPOSESTATE: 2,
isIndex: 2,
USERDEPT: this.$store.getters.getUserInfo.DEPARTMENT_ID,
SELFUSERID: this.$store.getters.getUserInfo.USER_ID,
currentPage: this.currentPage,
showCount: this.pageSize,
totalResult: 0,
postMethod: 'application/json',
CORPINFO_ID:''
});
this.list = [...this.list, ...resData.varList];
this.totalPage = resData.page.totalPage;
},
resetList() {
this.pageSize = 10
this.currentPage = 1
this.list = []
this.getData()
},
scrolltolower() {
this.currentPage++;
if (this.totalPage >= this.currentPage) this.getData();
},
formatDate(date) {
return dayjs(date).format("YYYY-MM-DD")
},
fnRectification(HIDDEN_ID) {
uni.$u.route({
url: '/pages/hidden_rectification/rectification',
params: {HIDDEN_ID,}
})
},
}
}
</script>
<style scoped lang="scss">
.yellow-bg {
color: #fbbd08;
background-color: #fef2ce;
padding: 10rpx 20rpx;
font-size: 24rpx;
border-radius: 10rpx;
}
.red-bg {
color: #e54d42;
background-color: #fadbd9;
padding: 10rpx 20rpx;
font-size: 24rpx;
border-radius: 10rpx;
}
</style>

View File

@ -0,0 +1,507 @@
<template>
<view class="content">
<view class="card">
<app-hidden-view
:hidden-id="hiddenId"
@throw-basic-info="info = $event.pd"
/>
<view class="card">
<u-form
ref="formRef"
label-position="left"
:model="form"
:rules="rules"
label-width="auto"
>
<u-form-item label="是否正常整改" prop="IS_NORMAL" required>
<u-radio-group v-model="form.IS_NORMAL" direction="horizontal">
<u-radio name="1" label="是" value="1"/>
<u-radio name="2" label="否" value="2"/>
</u-radio-group>
</u-form-item>
<u-line/>
<block v-if="form.IS_NORMAL === '2'">
<u-form-item
label="无法整改原因"
label-position="top"
prop="disposalPlan"
required
>
<u-textarea
v-model="form.disposalPlan"
placeholder="请输入无法整改原因"
border="none"
auto-height
/>
</u-form-item>
<u-line/>
</block>
<block v-if="form.IS_NORMAL === '1'">
<u-divider text-position="left" text="隐患整改"></u-divider>
<u-form-item
label="隐患整改详细描述"
label-position="top"
prop="RECTIFYDESCR"
required
>
<u-textarea
v-model="form.RECTIFYDESCR"
placeholder="请输入隐患整改详细描述"
border="none"
auto-height
/>
</u-form-item>
<u-line/>
<app-time
v-model="form.RECTIFICATIONTIME"
prop="RECTIFICATIONTIME"
mode="date"
label="整改日期"
/>
<u-form-item label="投入资金(元)" prop="INVEST_FUNDS" required>
<u-input
v-model="form.INVEST_FUNDS"
placeholder="请输入投入资金"
border="none"
type="number"
input-align="right"
/>
</u-form-item>
<u-line/>
<app-upload
v-model="form.afterRectificationFile"
label="整改后照片"
prop="afterRectificationFile"
/>
<view>
<u-form-item label="验收人员">
<u-button
custom-style="width: 100rpx;margin-right:0"
type="primary"
size="mini"
text="添加"
@click="fnAddAcceptanceList"
/>
</u-form-item>
<u-line/>
<view
v-for="(item, index) in acceptanceList"
:key="item.id"
style="
position: relative;
border: 1px dashed #ccc;
padding: 20rpx 20rpx 20rpx 40rpx;
"
class="mt-10"
>
<app-department
:id.sync="item.DEPARTMENT_ID"
:name.sync="item.DEPARTMENT_NAME"
:form.sync="acceptanceList[index]"
clear-key="USER_NAME,USER_ID"
label="验收部门"
/>
<app-personnel
:id.sync="item.USER_ID"
:name.sync="item.USER_NAME"
:department-id="item.DEPARTMENT_ID"
:is-allow-selection-current-person="false"
label="验收人"
/>
<u-icon
v-if="index !== 0"
name="close-circle-fill"
color="#ff2929"
size="20"
custom-style="position: absolute;right: -20rpx;top: -20rpx"
@click="acceptanceList.splice(index, 1)"
/>
</view>
</view>
<u-form-item label="是否有整改方案" prop="HAVESCHEME" required>
<u-radio-group v-model="form.HAVESCHEME" direction="horizontal">
<u-radio name="1" label="是"/>
<u-radio name="0" label="否"/>
</u-radio-group>
</u-form-item>
<u-line/>
<block v-if="form.HAVESCHEME === '1'">
<u-cell-group :border="false">
<u-cell title="排查日期" :value="info.CREATTIME"/>
<u-cell title="隐患清单" :value="info.LIST_NAME"/>
</u-cell-group>
<u-form-item
label="治理标准"
label-position="top"
prop="GOVERNSTANDARDS"
required
>
<u-textarea
v-model="form.GOVERNSTANDARDS"
placeholder="请输入治理标准"
border="none"
auto-height
/>
</u-form-item>
<u-line/>
<u-form-item
label="治理方法"
label-position="top"
prop="GOVERNMETHOD"
required
>
<u-textarea
v-model="form.GOVERNMETHOD"
placeholder="请输入治理方法"
border="none"
auto-height
/>
</u-form-item>
<u-line/>
<u-form-item
label="经费落实"
label-position="top"
prop="EXPENDITURE"
required
>
<u-textarea
v-model="form.EXPENDITURE"
placeholder="请输入经费落实"
border="none"
auto-height
/>
</u-form-item>
<u-line/>
<u-form-item
label="负责人员"
label-position="top"
prop="PRINCIPAL"
required
>
<u-textarea
v-model="form.PRINCIPAL"
placeholder="请输入负责人员"
border="none"
auto-height
/>
</u-form-item>
<u-line/>
<u-form-item
label="工时安排"
label-position="top"
prop="PROGRAMMING"
required
>
<u-textarea
v-model="form.PROGRAMMING"
placeholder="请输入工时安排"
border="none"
auto-height
/>
</u-form-item>
<u-line/>
<u-form-item
label="时限要求"
label-position="top"
prop="TIMELIMITFOR"
required
>
<u-textarea
v-model="form.TIMELIMITFOR"
placeholder="请输入时限要求"
border="none"
auto-height
/>
</u-form-item>
<u-line/>
<u-form-item
label="工作要求"
label-position="top"
prop="JOBREQUIREMENT"
required
>
<u-textarea
v-model="form.JOBREQUIREMENT"
placeholder="请输入工作要求"
border="none"
auto-height
/>
</u-form-item>
<u-line/>
<u-form-item
label="其它事项"
label-position="top"
prop="OTHERBUSINESS"
required
>
<u-textarea
v-model="form.OTHERBUSINESS"
placeholder="请输入其它事项"
border="none"
auto-height
/>
</u-form-item>
<u-line/>
<app-upload
v-model="form.programmeFile"
label="方案照片"
prop="programmeFile"
/>
</block>
</block>
<view class="mt-10">
<u-button
type="primary"
shape="circle"
text="提交"
:throttle-time="1000"
@click="fnSubmit"
/>
</view>
</u-form>
</view>
</view>
</view>
</template>
<script>
import AppHiddenView from '@/components/hidden_view/index.vue'
import AppTime from "@/components/time/index.vue";
import AppUpload from "@/components/upload/index.vue";
import AppDepartment from "@/components/department/index.vue";
import AppPersonnel from "@/components/personnel/index.vue";
import {fileUpload, setHiddenNuRectificationSubmit, setHiddenRectificationSubmit} from "@/api/api";
export default {
components: {
AppHiddenView,
AppTime,
AppUpload,
AppDepartment,
AppPersonnel,
},
data() {
return {
hiddenId: '',
info: {},
form: {
IS_NORMAL: "1",
disposalPlan: "",
RECTIFYDESCR: "",
RECTIFICATIONTIME: "",
INVEST_FUNDS: "",
afterRectificationFile: [],
HAVESCHEME: "0",
GOVERNSTANDARDS: "",
GOVERNMETHOD: "",
EXPENDITURE: "",
PRINCIPAL: "",
PROGRAMMING: "",
TIMELIMITFOR: "",
JOBREQUIREMENT: "",
OTHERBUSINESS: "",
programmeFile: [],
},
rules: {
IS_NORMAL: {
type: "string",
required: true,
message: "请选择是否正常整改",
trigger: ["blur", "change"],
},
disposalPlan: {
type: "string",
required: true,
message: "请输入无法整改原因",
trigger: ["blur", "change"],
},
RECTIFYDESCR: {
type: "string",
required: true,
message: "请输入隐患整改详细描述",
trigger: ["blur", "change"],
},
RECTIFICATIONTIME: {
type: "string",
required: true,
message: "请选择整改日期",
trigger: ["blur", "change"],
},
INVEST_FUNDS: {
type: "number",
required: true,
message: "请输入投入资金",
trigger: ["blur", "change"],
},
afterRectificationFile: {
type: "array",
required: true,
message: "请上传整改后照片",
trigger: ["blur", "change"],
},
HAVESCHEME: {
type: "string",
required: true,
message: "请选择是否有整改方案",
trigger: ["blur", "change"],
},
GOVERNSTANDARDS: {
type: "string",
required: true,
message: "请输入治理标准",
trigger: ["blur", "change"],
},
GOVERNMETHOD: {
type: "string",
required: true,
message: "请输入治理方法",
trigger: ["blur", "change"],
},
EXPENDITURE: {
type: "string",
required: true,
message: "请输入经费落实",
trigger: ["blur", "change"],
},
PRINCIPAL: {
type: "string",
required: true,
message: "请输入负责人员",
trigger: ["blur", "change"],
},
PROGRAMMING: {
type: "string",
required: true,
message: "请输入工时安排",
trigger: ["blur", "change"],
},
TIMELIMITFOR: {
type: "string",
required: true,
message: "请输入时限要求",
trigger: ["blur", "change"],
},
JOBREQUIREMENT: {
type: "string",
required: true,
message: "请输入工作要求",
trigger: ["blur", "change"],
},
OTHERBUSINESS: {
type: "string",
required: true,
message: "请输入其它事项",
trigger: ["blur", "change"],
},
programmeFile: {
type: "array",
required: true,
message: "请上传方案照片",
trigger: ["blur", "change"],
},
},
acceptanceList: []
}
},
onLoad(query) {
this.hiddenId = query.HIDDEN_ID
this.fnAddAcceptanceList()
},
methods: {
fnAddAcceptanceList() {
this.acceptanceList.push({
DEPARTMENT_NAME: "",
DEPARTMENT_ID: "",
USER_NAME: "",
USER_ID: "",
id: uni.$u.guid(),
});
},
async fnSubmit() {
const isValidate = await this.$refs.formRef.validate()
if (!isValidate) return;
if (this.form.IS_NORMAL === 1 || this.form.IS_NORMAL === "1") {
for (let i = 0; i < this.acceptanceList.length; i++) {
if (
!this.acceptanceList[i].DEPARTMENT_NAME ||
!this.acceptanceList[i].USER_NAME
) {
uni.showToast({
icon: "none",
title: "请选择部门人员",
});
return;
}
}
await setHiddenRectificationSubmit({
HIDDEN_ID: this.hiddenId,
...this.form,
SCREENINGDATE: this.info.CREATTIME,
LISTNAME: this.info.LIST_NAME,
OTHER: JSON.stringify(this.acceptanceList),
});
for (let i = 0; i < this.form.afterRectificationFile.length; i++) {
await this.fnUploadFile(
this.form.afterRectificationFile[i].url,
this.hiddenId,
4
);
}
for (let i = 0; i < this.form.programmeFile.length; i++) {
await this.fnUploadFile(this.form.programmeFile[i].url, this.hiddenId, 8);
}
uni.showToast({
icon: "none",
title: "提交成功",
});
setTimeout(() => {
uni.navigateBack();
}, 1000);
} else {
if (!this.form.disposalPlan) {
uni.showToast({
icon: "none",
title: "请输入无法整改原因",
});
}
const data = await setHiddenNuRectificationSubmit({
disposalPlan: this.form.disposalPlan,
HIDDEN_ID: this.hiddenId,
USER_ID: this.$store.getters.getUserInfo.USER_ID,
USERNAME: this.$store.getters.getUserInfo.USERNAME,
postMethod: 'application/json',
});
if (data.result === "success") {
uni.showToast({
icon: "none",
title: data.msg,
});
setTimeout(() => {
uni.navigateBack();
}, 1000);
} else {
uni.showToast({
icon: "none",
title: "系统异常:" + data.msg,
});
}
}
},
async fnUploadFile(filePath, FOREIGN_KEY, TYPE) {
await fileUpload({
filePath,
name: "file",
formData: {
foreignKey: FOREIGN_KEY,
corpInfoId: this.$store.getters.getUserInfo.CORPINFO_ID,
type: TYPE,
},
});
}
},
}
</script>
<style scoped lang="scss">
</style>

View File

@ -89,6 +89,11 @@
img: require('../../static/icon-apps/app_icons8.png'),
title: '培训管理',
url: '/pages/train_management/index'
},
{
img: require('../../static/icon-apps/app_icons9.png'),
title: '隐患整改',
url: '/pages/hidden_rectification/index'
}
],
classInfo: null,

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -96,6 +96,12 @@
justify-content: flex-end;
}
.flex-start {
display: flex;
align-items: center;
justify-content: flex-start;
}
.flex-warp {
display: flex;
flex-direction: row;
@ -128,3 +134,28 @@
font-weight: normal;
}
}
.u-form-item__body__right__content__slot {
position: relative;
.u-radio-group--row {
justify-content: flex-end;
gap: 20rpx;
}
.flex-start {
.u-radio-group--row {
justify-content: flex-start;
}
}
.select_content {
flex: 1;
display: flex;
align-items: center;
}
}
.u-form-item__body__right__message {
margin-bottom: 10rpx;
}