Files
threeonecheck_web/pages/editchecklist/editchecklist.vue
2026-01-21 11:04:40 +08:00

608 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="page padding">
<view class="padding radius bg-white">
<view class="flex margin-bottom ">
<view class="text-gray">检查表名称</view>
<view class="text-red">*</view>
</view>
<up-input placeholder="请输入检查表名称" border="surround"></up-input>
<view class="flex margin-bottom margin-top">
<view class="text-gray">分派单位</view>
<view class="text-red">*</view>
</view>
<up-select placeholder="请选择分派单位" v-model:current="cateId" label="湘西自治州和谐网络科技有限公司" :options="cateList" @select="selectItem" ></up-select>
<view class="margin-bottom margin-top">补充说明</view>
<up-textarea v-model="value1" placeholder="请输入内容" ></up-textarea>
<view class="margin-bottom margin-top" >运行模式</view>
<up-select placeholder="请选择分派单位" v-model:current="cateId" label="全员" :options="cateList" @select="selectItem" ></up-select>
<view class="margin-bottom margin-top" >部门</view>
<up-select placeholder="请选择分派单位" v-model:current="cateId" label="选择部门" :options="cateList" @select="selectItem" ></up-select>
<view class="margin-bottom margin-top" >周期</view>
<up-select placeholder="请选择分派单位" v-model:current="cateId" label="每天一次" :options="cateList" @select="selectItem" ></up-select>
<view class="margin-bottom margin-top" >工作日</view>
<view class="flex">
<up-switch v-model="value" @change="change" activeColor="#07C160 " class="margin-right"></up-switch>
<up-switch v-model="value" @change="change" activeColor="#07C160 "></up-switch>
</view>
<view class="margin-bottom margin-top" @click="show = true">开始日期</view>
<up-calendar :show="show" :mode="mode" @confirm="confirm"></up-calendar>
<view class="margin-bottom margin-top" @click="show = true">结束日期</view>
<up-calendar :show="show" :mode="mode" @confirm="confirm"></up-calendar>
<view class="margin-bottom margin-top">已添加的检查项31</view>
<view>
<view class="flex margin-bottom">
<view style="white-space: nowrap;">检查库</view>
<view>应急管理部门非煤地下矿山领域标准化检查表</view>
</view>
<view class="flex margin-bottom">
<view style="white-space: nowrap;">关联表名</view>
<view>应急管理部门非煤地下矿山领域标准化检查表</view>
</view>
<view class="flex margin-bottom">
<view>检查项数量</view>
<view>31</view>
</view>
<view class="btn-right">
<button class="bg-red cu-btn ">删除</button>
</view>
<view class="margin-bottom margin-top">添加检查项</view>
<view class="flex justify-between">
<view class="but" @click="showAddPopup = true">手动添加</view>
<view class="but" @click="showLibraryPopup = true">从检查库添加</view>
</view>
</view>
</view>
<button class="bg-blue round margin-top-xl margin-bottom-xl">保存</button>
<!-- 手动添加检查项弹出框 -->
<u-popup :show="showAddPopup" mode="center" round="20" @close="showAddPopup = false">
<view class="popup-content">
<view class="popup-header">
<view class="popup-title text-bold">手动添加检查项</view>
<view class="popup-close" @click="showAddPopup = false">×</view>
</view>
<view class="popup-body">
<!-- 项目名称 -->
<view class="form-item">
<view class="form-label">项目名称<text class="text-red">*</text></view>
<input class="form-input" v-model="checkForm.projectName" placeholder="请输入项目名称" />
</view>
<!-- 检查内容 -->
<view class="form-item">
<view class="form-label">检查内容<text class="text-red">*</text></view>
<input class="form-input" v-model="checkForm.checkContent" placeholder="请输入检查内容" />
</view>
<!-- 参考法规 -->
<view class="form-item">
<view class="form-label">参考法规</view>
<view class="form-btn" @click="showLawPopup = true">
<text class="text-blue">{{ checkForm.law || '选择法规' }}</text>
</view>
</view>
<!-- 参考图片 -->
<view class="form-item">
<view class="form-label">参考图片</view>
<view class="upload-box" @click="chooseImage">
<view class="upload-add" v-if="!checkForm.image">
<text class="upload-icon">+</text>
<text class="upload-text">上传图片</text>
</view>
<image v-else :src="checkForm.image" mode="aspectFill" class="upload-img"></image>
</view>
</view>
</view>
<view class="popup-footer">
<button class="btn-cancel" @click="showAddPopup = false">取消</button>
<button class="btn-confirm bg-blue" @click="handleAddCheck">确定</button>
</view>
</view>
</u-popup>
<!-- 选择法规弹出框 -->
<u-popup :show="showLawPopup" mode="center" round="20" @close="showLawPopup = false">
<view class="law-popup">
<view class="popup-header">
<view class="popup-title text-bold">选择参考法规</view>
<view class="popup-close" @click="showLawPopup = false">×</view>
</view>
<!-- 搜索框 -->
<view class="search-box">
<text class="search-icon">🔍</text>
<input class="search-input" v-model="lawKeyword" placeholder="请输入关键词搜索" />
</view>
<!-- 法规列表 -->
<view class="law-list">
<view
class="law-item"
:class="{ 'law-item-active': selectedLaw === item }"
v-for="(item, index) in filteredLawList"
:key="index"
@click="selectedLaw = item"
>
{{ item }}
</view>
</view>
<!-- 加载更多 -->
<view class="load-more" @click="loadMoreLaw">
<text class="text-blue">加载更多</text>
</view>
<!-- 确认按钮 -->
<view class="law-footer">
<button class="btn-cancel" @click="showLawPopup = false">取消</button>
<button class="btn-confirm bg-blue" @click="confirmLaw">确定</button>
</view>
</view>
</u-popup>
<!-- 从检查库添加弹出框 -->
<u-popup :show="showLibraryPopup" mode="center" round="20" @close="showLibraryPopup = false">
<view class="library-popup">
<view class="popup-header">
<view class="popup-title text-bold">选择检查库</view>
<view class="popup-close" @click="showLibraryPopup = false">×</view>
</view>
<!-- 搜索框 -->
<view class="search-box">
<text class="search-icon">🔍</text>
<input class="search-input" v-model="libraryKeyword" placeholder="请输入关键词搜索" />
</view>
<!-- 检查库列表 -->
<view class="library-list">
<view
class="library-item"
v-for="(item, index) in filteredLibraryList"
:key="index"
@click="toggleLibrarySelect(item)"
>
<view class="library-checkbox" :class="{ 'library-checkbox-active': selectedLibraries.includes(item.id) }">
<text v-if="selectedLibraries.includes(item.id)"></text>
</view>
<view class="library-info">
<view class="library-name">关联表名{{ item.name }}</view>
<view class="library-count text-gray">{{ item.count }}</view>
</view>
</view>
</view>
<!-- 添加选中项按钮 -->
<button class="btn-add-library bg-blue" @click="addSelectedLibrary">添加选中项</button>
</view>
</u-popup>
</view>
</template>
<script setup>
import { ref, reactive, computed } from 'vue'
import {addCheckTable} from '/request/api.js'
// 响应式数据
const cateId = ref('')
const cateList = ref([
{
id: '1',
name: '湘西自治州和谐网络科技有限公司'
},
{
id: '2',
name: '湘西自治州和谐云大数据科技有限公司'
},
{
id: '3',
name: '湘西网络有限公司'
},
])
// 方法
const selectItem = (item) => {
console.log(item);
};
// 工作日开关
const value = ref(false)
// 日期
const show = ref(false);
const mode = ref('single');
const confirm = (e) => {
console.log(e);
};
// 手动添加检查项弹窗
const showAddPopup = ref(false);
const checkForm = reactive({
projectName: '',
checkContent: '',
law: '',
image: ''
});
// 选择法规弹窗
const showLawPopup = ref(false);
const lawKeyword = ref('');
const selectedLaw = ref('');
const lawList = ref([
'中华人民共和国安全生产法 第三十二条',
'建设项目安全设施"三同时"监督管理办法 第二十条',
'中华人民共和国职业病防治法 第十七条',
'中华人民共和国职业病防治法 第十八条',
'中华人民共和国消防法2021版第十一条',
'建设工程消防监督管理规定 第二十条'
]);
// 过滤法规列表
const filteredLawList = computed(() => {
if (!lawKeyword.value) return lawList.value;
return lawList.value.filter(item => item.includes(lawKeyword.value));
});
// 加载更多法规
const loadMoreLaw = () => {
uni.showToast({ title: '加载更多...', icon: 'none' });
};
// 确认选择法规
const confirmLaw = () => {
if (selectedLaw.value) {
checkForm.law = selectedLaw.value;
}
showLawPopup.value = false;
};
// 从检查库添加弹窗
const showLibraryPopup = ref(false);
const libraryKeyword = ref('');
const selectedLibraries = ref([]);
const libraryList = ref([
{ id: 1, name: '安全生产隐患"常见病"检查诊断表(个性部分)公路养护工程', count: 18 },
{ id: 2, name: '安全生产隐患"常见病"检查诊断表(个性部分)出租汽车企业', count: 12 },
{ id: 3, name: '安全生产隐患"常见病"检查诊断表(个性部分)城镇燃气', count: 12 }
]);
// 过滤检查库列表
const filteredLibraryList = computed(() => {
if (!libraryKeyword.value) return libraryList.value;
return libraryList.value.filter(item => item.name.includes(libraryKeyword.value));
});
// 切换选择检查库
const toggleLibrarySelect = (item) => {
const index = selectedLibraries.value.indexOf(item.id);
if (index > -1) {
selectedLibraries.value.splice(index, 1);
} else {
selectedLibraries.value.push(item.id);
}
};
// 添加选中的检查库
const addSelectedLibrary = () => {
if (selectedLibraries.value.length === 0) {
uni.showToast({ title: '请选择检查库', icon: 'none' });
return;
}
console.log('添加检查库:', selectedLibraries.value);
uni.showToast({ title: '添加成功', icon: 'success' });
showLibraryPopup.value = false;
selectedLibraries.value = [];
};
// 选择图片
const chooseImage = () => {
uni.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: (res) => {
checkForm.image = res.tempFilePaths[0];
}
});
};
// 提交检查项
const handleAddCheck = () => {
if (!checkForm.projectName) {
uni.showToast({ title: '请输入项目名称', icon: 'none' });
return;
}
if (!checkForm.checkContent) {
uni.showToast({ title: '请输入检查内容', icon: 'none' });
return;
}
console.log('提交检查项:', checkForm);
uni.showToast({ title: '添加成功', icon: 'success' });
showAddPopup.value = false;
// 重置表单
checkForm.projectName = '';
checkForm.checkContent = '';
checkForm.law = '';
checkForm.image = '';
};
</script>
<style scoped lang="scss">
.page {
min-height: 100vh;
background: #EBF2FC;
}
.btn-right {
display: flex;
justify-content: flex-end;
}
.but {
width: 304rpx;
height: 72rpx;
border-radius: 6rpx 6rpx 6rpx 6rpx;
border: 2rpx solid #108FFF;
color: #108FFF;
text-align: center;
line-height: 72rpx;
}
// 弹出框样式
.popup-content {
width: 600rpx;
background: #fff;
border-radius: 20rpx;
padding: 30rpx;
}
.popup-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30rpx;
}
.popup-title {
font-size: 34rpx;
color: #333;
}
.popup-close {
font-size: 48rpx;
color: #999;
line-height: 1;
}
.popup-body {
max-height: 700rpx;
overflow-y: auto;
}
.form-item {
margin-bottom: 24rpx;
}
.form-label {
font-size: 28rpx;
color: #333;
margin-bottom: 12rpx;
}
.form-input {
width: 100%;
height: 80rpx;
border: 2rpx solid #E5E5E5;
border-radius: 12rpx;
padding: 0 24rpx;
font-size: 28rpx;
box-sizing: border-box;
}
.form-btn {
width: 100%;
height: 80rpx;
border: 2rpx solid #E5E5E5;
border-radius: 12rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 28rpx;
}
.upload-box {
width: 160rpx;
height: 160rpx;
border: 2rpx dashed #ccc;
border-radius: 12rpx;
display: flex;
align-items: center;
justify-content: center;
}
.upload-add {
display: flex;
flex-direction: column;
align-items: center;
}
.upload-icon {
font-size: 48rpx;
color: #999;
}
.upload-text {
font-size: 24rpx;
color: #999;
margin-top: 8rpx;
}
.upload-img {
width: 100%;
height: 100%;
border-radius: 12rpx;
}
.popup-footer {
display: flex;
justify-content: center;
gap: 30rpx;
margin-top: 40rpx;
}
.btn-cancel {
flex: 1;
height: 80rpx;
line-height: 80rpx;
border: 2rpx solid #E5E5E5;
border-radius: 40rpx;
background: #fff;
color: #333;
font-size: 30rpx;
}
.btn-confirm {
flex: 1;
height: 80rpx;
line-height: 80rpx;
border-radius: 40rpx;
color: #fff;
font-size: 30rpx;
}
// 选择法规弹窗
.law-popup {
width: 600rpx;
background: #fff;
border-radius: 20rpx;
padding: 30rpx;
max-height: 80vh;
}
.search-box {
display: flex;
align-items: center;
background: #F5F5F5;
border-radius: 40rpx;
padding: 16rpx 24rpx;
margin-bottom: 24rpx;
}
.search-icon {
font-size: 28rpx;
margin-right: 12rpx;
}
.search-input {
flex: 1;
font-size: 28rpx;
background: transparent;
}
.law-list {
max-height: 500rpx;
overflow-y: auto;
}
.law-item {
padding: 24rpx;
border: 2rpx solid #E5E5E5;
border-radius: 12rpx;
margin-bottom: 16rpx;
font-size: 28rpx;
color: #333;
}
.law-item-active {
border-color: #2667E9;
background: #F0F6FF;
}
.load-more {
text-align: center;
padding: 24rpx;
border: 2rpx solid #2667E9;
border-radius: 40rpx;
margin-top: 16rpx;
}
.law-footer {
display: flex;
justify-content: center;
gap: 30rpx;
margin-top: 30rpx;
}
// 检查库弹窗样式
.library-popup {
width: 600rpx;
background: #fff;
border-radius: 20rpx;
padding: 30rpx;
max-height: 80vh;
}
.library-list {
max-height: 500rpx;
overflow-y: auto;
}
.library-item {
display: flex;
align-items: flex-start;
padding: 24rpx;
border: 2rpx solid #E5E5E5;
border-radius: 12rpx;
margin-bottom: 16rpx;
}
.library-checkbox {
width: 40rpx;
height: 40rpx;
border: 2rpx solid #ccc;
border-radius: 8rpx;
margin-right: 20rpx;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
margin-top: 4rpx;
}
.library-checkbox-active {
background: #2667E9;
border-color: #2667E9;
color: #fff;
}
.library-info {
flex: 1;
}
.library-name {
font-size: 28rpx;
color: #333;
line-height: 1.5;
}
.library-count {
font-size: 24rpx;
margin-top: 8rpx;
}
.btn-add-library {
width: 100%;
height: 80rpx;
line-height: 80rpx;
border-radius: 40rpx;
color: #fff;
font-size: 30rpx;
margin-top: 30rpx;
}
</style>