交办、整改责任人修改

This commit is contained in:
王利强
2026-06-30 09:47:10 +08:00
parent d4897284e8
commit 455fd4fc07
638 changed files with 5153 additions and 2572 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -27,6 +27,8 @@ export function createEmptyHazardPayload() {
title: '', title: '',
level: 0, level: 0,
source: 0, source: 0,
hazardSourceCode: null,
hazardSourceName: '',
description: '', description: '',
tagIndex: 0, tagIndex: 0,
tagId: null, tagId: null,
@@ -56,6 +58,7 @@ export function buildHiddenDangerParams(payload, extra = {}) {
areaId: areaId || null, areaId: areaId || null,
description: formData.description || '', description: formData.description || '',
source: SOURCE_OPTIONS[formData.source]?.title || '', source: SOURCE_OPTIONS[formData.source]?.title || '',
hazardSource: formData.hazardSourceCode ?? null,
tagId, tagId,
attachments: (fileList || []) attachments: (fileList || [])
.filter((f) => f.status === 'success') .filter((f) => f.status === 'success')
@@ -70,3 +73,21 @@ export function hasValidHazardPayload(payload) {
const { formData, fileList } = payload; const { formData, fileList } = payload;
return !!(formData?.title && fileList?.length > 0); return !!(formData?.title && fileList?.length > 0);
} }
export function hasHazardFormContent(payload) {
if (!payload) return false;
const data = payload.formData || {};
const files = payload.fileList || [];
return !!(
data.title ||
data.description ||
data.regulationName ||
data.regulationId ||
data.hazardSourceCode != null ||
data.hazardSourceName ||
payload.address ||
payload.areaId ||
payload.areaName ||
(files.length > 0)
);
}

View File

@@ -72,6 +72,10 @@
<view class="card-body"> <view class="card-body">
<!-- 提交 --> <!-- 提交 -->
<block v-if="item.type === 'submit'"> <block v-if="item.type === 'submit'">
<view class="detail-row">
<text class="label">隐患编号</text>
<text class="value">{{ item.content.code }}</text>
</view>
<view class="detail-row"> <view class="detail-row">
<text class="label">隐患标题</text> <text class="label">隐患标题</text>
<text class="value">{{ item.content.title }}</text> <text class="value">{{ item.content.title }}</text>
@@ -80,6 +84,10 @@
<text class="label">检查形式</text> <text class="label">检查形式</text>
<text class="value">{{ item.content.source }}</text> <text class="value">{{ item.content.source }}</text>
</view> </view>
<view class="detail-row">
<text class="label">隐患来源</text>
<text class="value">{{ item.content.hazardSourceName }}</text>
</view>
<view class="detail-row"> <view class="detail-row">
<text class="label">隐患区域</text> <text class="label">隐患区域</text>
<view class="value value--inline"> <view class="value value--inline">

View File

@@ -80,6 +80,10 @@
<view class="card-body"> <view class="card-body">
<!-- 提交 --> <!-- 提交 -->
<block v-if="item.type === 'submit'"> <block v-if="item.type === 'submit'">
<view class="detail-row-v2">
<text class="label">隐患编号</text>
<text class="value">{{ item.content.code }}</text>
</view>
<view class="detail-row-v2"> <view class="detail-row-v2">
<text class="label">隐患标题</text> <text class="label">隐患标题</text>
<text class="value">{{ item.content.title }}</text> <text class="value">{{ item.content.title }}</text>
@@ -88,6 +92,10 @@
<text class="label">检查形式</text> <text class="label">检查形式</text>
<text class="value">{{ item.content.source }}</text> <text class="value">{{ item.content.source }}</text>
</view> </view>
<view class="detail-row-v2">
<text class="label">隐患来源</text>
<text class="value">{{ item.content.hazardSourceName }}</text>
</view>
<view class="detail-row-v2"> <view class="detail-row-v2">
<text class="label">隐患区域</text> <text class="label">隐患区域</text>
<view class="value value--inline"> <view class="value value--inline">

View File

@@ -180,8 +180,10 @@ export function generateHazardHistory(data) {
operator: data.reporterName || '-', operator: data.reporterName || '-',
time: data.createdAt || '-', time: data.createdAt || '-',
content: { content: {
code: data.code || '-',
title: data.title || '-', title: data.title || '-',
source: data.source || '-', source: data.source || '-',
hazardSourceName: data.hazardSourceName || '-',
areaName: data.areaName || '-', areaName: data.areaName || '-',
areaColor: data.areaColor || '', areaColor: data.areaColor || '',
address: data.address || '-', address: data.address || '-',
@@ -260,10 +262,13 @@ export const MOCK_HAZARD_DETAIL = {
reporterPhone: '13800138000', reporterPhone: '13800138000',
reportDeptName: '安全管理部', reportDeptName: '安全管理部',
createdAt: '2026-06-01 09:30:00', createdAt: '2026-06-01 09:30:00',
code: '2026U1SL',
title: '消防通道堆放杂物', title: '消防通道堆放杂物',
level: 2, level: 2,
levelName: '一般隐患', levelName: '一般隐患',
source: '部门检查', source: '部门检查',
hazardSource: 1,
hazardSourceName: '本单位检查发现',
areaName: '生产车间A区', areaName: '生产车间A区',
areaColor: '#409EFF', areaColor: '#409EFF',
address: '办公楼3层东侧消防通道', address: '办公楼3层东侧消防通道',

View File

@@ -108,6 +108,12 @@
"navigationBarTitleText": "隐患排查" "navigationBarTitleText": "隐患排查"
} }
}, },
{
"path": "pages/hiddendanger/add",
"style": {
"navigationBarTitleText": "新增隐患排查"
}
},
{ {
"path": "pages/hiddendanger/view", "path": "pages/hiddendanger/view",
"style": { "style": {

View File

@@ -57,6 +57,10 @@
<text class="text-gray">检查形式</text> <text class="text-gray">检查形式</text>
<text>{{ SOURCE_OPTIONS[hazardPayload.formData.source]?.title || '-' }}</text> <text>{{ SOURCE_OPTIONS[hazardPayload.formData.source]?.title || '-' }}</text>
</view> </view>
<view class="info-row">
<text class="text-gray">隐患来源</text>
<text>{{ hazardPayload.formData.hazardSourceName || '-' }}</text>
</view>
<view class="info-row"> <view class="info-row">
<text class="text-gray">隐患位置</text> <text class="text-gray">隐患位置</text>
<text>{{ hazardPayload.address || '-' }}</text> <text>{{ hazardPayload.address || '-' }}</text>

View File

@@ -85,6 +85,10 @@
<text class="readonly-label">检查形式</text> <text class="readonly-label">检查形式</text>
<text class="readonly-value">{{ item.source }}</text> <text class="readonly-value">{{ item.source }}</text>
</view> </view>
<view v-if="item.hazardSource" class="readonly-row readonly-row--stack">
<text class="readonly-label">隐患来源</text>
<text class="readonly-value">{{ item.hazardSource }}</text>
</view>
<view v-if="item.hazardAddress" class="readonly-row readonly-row--stack"> <view v-if="item.hazardAddress" class="readonly-row readonly-row--stack">
<text class="readonly-label">隐患位置</text> <text class="readonly-label">隐患位置</text>
<text class="readonly-value">{{ item.hazardAddress }}</text> <text class="readonly-value">{{ item.hazardAddress }}</text>
@@ -156,6 +160,10 @@
<text class="text-gray">检查形式</text> <text class="text-gray">检查形式</text>
<text>{{ SOURCE_OPTIONS[answerList[index].hazardPayload.formData.source]?.title || '-' }}</text> <text>{{ SOURCE_OPTIONS[answerList[index].hazardPayload.formData.source]?.title || '-' }}</text>
</view> </view>
<view class="info-row">
<text class="text-gray">隐患来源</text>
<text>{{ answerList[index].hazardPayload.formData.hazardSourceName || '-' }}</text>
</view>
<view class="info-row"> <view class="info-row">
<text class="text-gray">隐患位置</text> <text class="text-gray">隐患位置</text>
<text>{{ answerList[index].hazardPayload.address || '-' }}</text> <text>{{ answerList[index].hazardPayload.address || '-' }}</text>
@@ -337,7 +345,7 @@ const viewHazardDetail = (item) => {
return; return;
} }
uni.navigateTo({ uni.navigateTo({
url: `/pages/hiddendanger/view?hazardId=${item.hazardId}` url: `/pages/hiddendanger/detail2?hazardId=${item.hazardId}&assignId=${item.assignId || ''}`
}); });
}; };
@@ -407,13 +415,20 @@ const buildAnswerFromTask = (item) => {
if (item.result === 2 && item.hazardName) { if (item.result === 2 && item.hazardName) {
const sourceIndex = SOURCE_OPTIONS.findIndex((o) => o.title === item.source); const sourceIndex = SOURCE_OPTIONS.findIndex((o) => o.title === item.source);
const hazardSourceCode = item.hazardSourceCode ?? (
item.hazardSource != null && item.hazardSource !== '' && !Number.isNaN(Number(item.hazardSource))
? Number(item.hazardSource)
: null
);
answer.hazardPayload = { answer.hazardPayload = {
...createEmptyHazardPayload(), ...createEmptyHazardPayload(),
formData: { formData: {
...createEmptyHazardPayload().formData, ...createEmptyHazardPayload().formData,
title: item.hazardName || '', title: item.hazardName || '',
description: item.hazardDesc || '', description: item.hazardDesc || '',
source: sourceIndex >= 0 ? sourceIndex : 0 source: sourceIndex >= 0 ? sourceIndex : 0,
hazardSourceCode,
hazardSourceName: item.hazardSourceName || ''
}, },
address: item.hazardAddress || '' address: item.hazardAddress || ''
}; };

View File

@@ -77,6 +77,31 @@
<up-textarea v-model="formData.treatmentResult" placeholder="请输入隐患治理完成情况"></up-textarea> <up-textarea v-model="formData.treatmentResult" placeholder="请输入隐患治理完成情况"></up-textarea>
<view class="margin-bottom margin-top">隐患治理责任单位自行验收的情况</view> <view class="margin-bottom margin-top">隐患治理责任单位自行验收的情况</view>
<up-textarea v-model="formData.selfVerifyContent" placeholder="请输入隐患治理责任单位自行验收的情况"></up-textarea> <up-textarea v-model="formData.selfVerifyContent" placeholder="请输入隐患治理责任单位自行验收的情况"></up-textarea>
<view class="flex margin-bottom margin-top">
<view class="text-gray">下一步流程</view>
<view class="text-red">*</view>
</view>
<view class="static-field">隐患销号审批</view>
<view class="flex margin-bottom margin-top">
<view class="text-gray">下一步处理人</view>
<view class="text-red">*</view>
</view>
<view class="static-field">部门企业管理员</view>
<view class="flex margin-bottom margin-top">
<view class="text-gray">短信提醒</view>
<view class="text-red">*</view>
</view>
<up-radio-group v-model="sendMsgFlagRadio" placement="row" activeColor="#2667e9">
<up-radio
label="是"
name="yes"
:customStyle="{ marginRight: '48rpx' }"
></up-radio>
<up-radio label="否" name="no"></up-radio>
</up-radio-group>
</scroll-view> </scroll-view>
<view class="popup-footer"> <view class="popup-footer">
<button class="btn-cancel" @click="showAddPopup = false">取消</button> <button class="btn-cancel" @click="showAddPopup = false">取消</button>
@@ -98,7 +123,7 @@
</template> </template>
<script setup> <script setup>
import { ref, reactive, onMounted } from 'vue' import { ref, reactive, computed, onMounted } from 'vue'
import { getMyWriteOffList, applyDelete, getAcceptanceList, getHiddenDangerDetail, getRectifyDetail, generateWriteoffContent } from '@/request/api.js'; import { getMyWriteOffList, applyDelete, getAcceptanceList, getHiddenDangerDetail, getRectifyDetail, generateWriteoffContent } from '@/request/api.js';
// 弹窗控制 // 弹窗控制
@@ -117,6 +142,10 @@
// AI生成状态 // AI生成状态
const aiGenerating = ref(false); const aiGenerating = ref(false);
// 短信提醒
const sendMsgFlagRadio = ref('yes');
const sendMsgFlag = computed(() => sendMsgFlagRadio.value === 'yes');
// 表单数据 // 表单数据
const formData = reactive({ const formData = reactive({
@@ -202,6 +231,7 @@
formData.mainTreatmentContent = ''; formData.mainTreatmentContent = '';
formData.treatmentResult = ''; formData.treatmentResult = '';
formData.selfVerifyContent = ''; formData.selfVerifyContent = '';
sendMsgFlagRadio.value = 'yes';
}; };
// AI生成销号方案 // AI生成销号方案
@@ -274,7 +304,8 @@
responsiblePerson: formData.responsiblePerson || '', // 主要负责人 responsiblePerson: formData.responsiblePerson || '', // 主要负责人
mainTreatmentContent: formData.mainTreatmentContent || '', // 主要治理内容 mainTreatmentContent: formData.mainTreatmentContent || '', // 主要治理内容
treatmentResult: formData.treatmentResult || '', // 隐患治理完成内容 treatmentResult: formData.treatmentResult || '', // 隐患治理完成内容
selfVerifyContent: formData.selfVerifyContent || '' // 责任单位自行验收情况 selfVerifyContent: formData.selfVerifyContent || '', // 责任单位自行验收情况
sendMsgFlag: sendMsgFlag.value // 是否短信提醒
}; };
console.log('提交数据:', params); console.log('提交数据:', params);
@@ -471,4 +502,15 @@
color: #666; color: #666;
} }
} }
.static-field {
background: #fff;
border: 1rpx solid #dcdfe6;
border-radius: 8rpx;
padding: 20rpx 24rpx;
margin-bottom: 20rpx;
font-size: 28rpx;
color: #333;
line-height: 1.5;
}
</style> </style>

View File

@@ -19,6 +19,9 @@
<view class="text-gray margin-bottom margin-top">隐患治理完成内容</view> <view class="text-gray margin-bottom margin-top">隐患治理完成内容</view>
<up-textarea v-model="formData.governanceCompleteContent" placeholder="暂无" disabled autoHeight></up-textarea> <up-textarea v-model="formData.governanceCompleteContent" placeholder="暂无" disabled autoHeight></up-textarea>
<view class="text-gray margin-bottom margin-top">隐患治理责任单位自行验收的情况</view>
<up-textarea v-model="formData.selfAcceptanceStatus" placeholder="暂无" disabled autoHeight></up-textarea>
<view class="text-gray margin-bottom margin-top">状态</view> <view class="text-gray margin-bottom margin-top">状态</view>
<up-input :modelValue="statusText" placeholder="暂无" disabled></up-input> <up-input :modelValue="statusText" placeholder="暂无" disabled></up-input>
@@ -64,6 +67,7 @@
mainPerson: '', mainPerson: '',
mainGovernanceContent: '', mainGovernanceContent: '',
governanceCompleteContent: '', governanceCompleteContent: '',
selfAcceptanceStatus: '',
status: '', status: '',
rejectReason: '' rejectReason: ''
}) })
@@ -111,6 +115,7 @@
formData.mainPerson = data.mainPerson || '' formData.mainPerson = data.mainPerson || ''
formData.mainGovernanceContent = data.mainGovernanceContent || '' formData.mainGovernanceContent = data.mainGovernanceContent || ''
formData.governanceCompleteContent = data.governanceCompleteContent || '' formData.governanceCompleteContent = data.governanceCompleteContent || ''
formData.selfAcceptanceStatus = data.selfAcceptanceStatus || data.selfVerifyContent || ''
formData.status = data.status ?? '' formData.status = data.status ?? ''
formData.rejectReason = data.rejectReason || '' formData.rejectReason = data.rejectReason || ''
applySignature(data.signPath) applySignature(data.signPath)

View File

@@ -50,18 +50,10 @@
</view> </view>
</view> </view>
<view class="fixed-add-btn" @click="openAddPopup"> <view class="fixed-add-btn" @click="goToAdd">
<text class="cuIcon-add"></text> <text class="cuIcon-add"></text>
<text>新增</text> <text>新增</text>
</view> </view>
<HazardFormPopup
v-model:show="showAddPopup"
title="新增隐患排查"
mode="direct"
:extra-params="hazardExtraParams"
@success="onHazardAddSuccess"
/>
</view> </view>
</template> </template>
@@ -73,16 +65,10 @@
getCheckTaskDetail, getCheckTaskDetail,
getMyHiddenDangerList getMyHiddenDangerList
} from '@/request/api.js' } from '@/request/api.js'
import HazardFormPopup from '@/components/hazard/HazardFormPopup.vue'
const showAddPopup = ref(false)
const taskId = ref('') const taskId = ref('')
const checkPointId = ref('') const checkPointId = ref('')
const oneTableId = ref('')
const hazardExtraParams = computed(() => ({
taskId: taskId.value,
checkPointId: checkPointId.value
}))
const userRole = ref('') const userRole = ref('')
const canAcceptance = computed(() => { const canAcceptance = computed(() => {
@@ -120,6 +106,7 @@
onLoad((options) => { onLoad((options) => {
if (options.id) { if (options.id) {
oneTableId.value = options.id
fetchTaskInfo(options.id) fetchTaskInfo(options.id)
} }
}) })
@@ -149,13 +136,22 @@
fetchHiddenDangerList() fetchHiddenDangerList()
}) })
const openAddPopup = () => { const goToAdd = () => {
showAddPopup.value = true; let url = '/pages/hiddendanger/add'
}; const params = []
if (oneTableId.value) {
const onHazardAddSuccess = () => { params.push(`id=${oneTableId.value}`)
showAddPopup.value = false }
fetchHiddenDangerList() if (taskId.value) {
params.push(`taskId=${taskId.value}`)
}
if (checkPointId.value) {
params.push(`checkPointId=${checkPointId.value}`)
}
if (params.length) {
url += `?${params.join('&')}`
}
uni.navigateTo({ url })
} }
const details = (item) => { const details = (item) => {

View File

@@ -27,9 +27,13 @@
<view style="color: #999; margin-bottom: 10rpx;">实际投资资金</view> <view style="color: #999; margin-bottom: 10rpx;">实际投资资金</view>
<view style="word-break: break-all; line-height: 1.6; color: #333;">{{ formatMoney(rectifyData.actualCost) }}</view> <view style="word-break: break-all; line-height: 1.6; color: #333;">{{ formatMoney(rectifyData.actualCost) }}</view>
</view> </view>
<view class="margin-top">
<view style="color: #999; margin-bottom: 10rpx;">安全管理人员</view>
<view style="word-break: break-all; line-height: 1.6; color: #333;">{{ formatPersonNames(rectifyData.managerNames) }}</view>
</view>
<view class="margin-top"> <view class="margin-top">
<view style="color: #999; margin-bottom: 10rpx;">整改责任人</view> <view style="color: #999; margin-bottom: 10rpx;">整改责任人</view>
<view style="word-break: break-all; line-height: 1.6; color: #333;">{{ rectifyData.rectifierName || '暂无' }}</view> <view style="word-break: break-all; line-height: 1.6; color: #333;">{{ formatPersonNames(rectifyData.memberNames) }}</view>
</view> </view>
<view class="margin-top"> <view class="margin-top">
<view style="color: #999; margin-bottom: 10rpx;">完成情况</view> <view style="color: #999; margin-bottom: 10rpx;">完成情况</view>
@@ -63,8 +67,35 @@
<!-- 隐藏的 Canvas用于渲染防作弊时间戳水印 --> <!-- 隐藏的 Canvas用于渲染防作弊时间戳水印 -->
<canvas canvas-id="watermarkCanvas" :width="canvasWidth" :height="canvasHeight" :style="{ width: canvasWidth + 'px', height: canvasHeight + 'px', position: 'fixed', left: '-9999px', top: '-9999px' }"></canvas> <canvas canvas-id="watermarkCanvas" :width="canvasWidth" :height="canvasHeight" :style="{ width: canvasWidth + 'px', height: canvasHeight + 'px', position: 'fixed', left: '-9999px', top: '-9999px' }"></canvas>
<!-- 电子签名部分 --> <view class="flex margin-bottom margin-top">
<view class="flex justify-between margin-bottom margin-top-sm align-center"> <view class="text-gray">下一步流程</view>
<view class="text-red">*</view>
</view>
<view class="static-field">申请隐患销号</view>
<view class="flex margin-bottom margin-top">
<view class="text-gray">下一步处理人</view>
<view class="text-red">*</view>
</view>
<view class="static-field">部门企业管理员</view>
<!-- 短信提醒暂不使用
<view class="flex margin-bottom margin-top">
<view class="text-gray">短信提醒</view>
<view class="text-red">*</view>
</view>
<up-radio-group v-model="sendMsgFlagRadio" placement="row" activeColor="#2667e9">
<up-radio
label="是"
name="yes"
:customStyle="{ marginRight: '48rpx' }"
></up-radio>
<up-radio label="否" name="no"></up-radio>
</up-radio-group>
-->
<!-- 电子签名表单最底部 -->
<view class="flex justify-between margin-bottom margin-top align-center">
<view class="text-gray flex align-center"> <view class="text-gray flex align-center">
电子签名 电子签名
<view class="text-red">*</view> <view class="text-red">*</view>
@@ -139,10 +170,23 @@
rectifyResult: '', rectifyResult: '',
planCost: null, planCost: null,
actualCost: null, actualCost: null,
rectifierName: '', managerNames: [],
memberNames: [],
rectifyStatusName: '' rectifyStatusName: ''
}); });
const formatPersonNames = (names) => {
if (!names) return '暂无';
if (Array.isArray(names)) {
const text = names.filter(Boolean).join('、');
return text || '暂无';
}
if (typeof names === 'string') {
return names.trim() || '暂无';
}
return '暂无';
};
const formatMoney = (value) => { const formatMoney = (value) => {
if (value === null || value === undefined || value === '') { if (value === null || value === undefined || value === '') {
return '暂无'; return '暂无';
@@ -164,6 +208,10 @@
}); });
const fileList1 = ref([]); const fileList1 = ref([]);
// 短信提醒(暂不使用)
// const sendMsgFlagRadio = ref('yes');
// const sendMsgFlag = computed(() => sendMsgFlagRadio.value === 'yes');
// 防作弊时间戳水印 Canvas 大小配置 // 防作弊时间戳水印 Canvas 大小配置
const canvasWidth = ref(300); const canvasWidth = ref(300);
@@ -245,6 +293,7 @@
signatureLocalPath: signatureLocalPath.value, signatureLocalPath: signatureLocalPath.value,
showCanvas: showCanvas.value, showCanvas: showCanvas.value,
signaturePaths: signaturePaths.value signaturePaths: signaturePaths.value
// sendMsgFlagRadio: sendMsgFlagRadio.value
}), }),
hasContent: acceptDraftHasContent, hasContent: acceptDraftHasContent,
applyPayload: (data) => { applyPayload: (data) => {
@@ -264,6 +313,7 @@
signatureLocalPath.value = ''; signatureLocalPath.value = '';
isSignatureEmpty.value = true; isSignatureEmpty.value = true;
} }
// sendMsgFlagRadio.value = data.sendMsgFlagRadio === 'no' ? 'no' : 'yes';
}, },
clearForm: () => { clearForm: () => {
formData.result = 1; formData.result = 1;
@@ -277,6 +327,7 @@
if (signatureRef.value) { if (signatureRef.value) {
signatureRef.value.clear(); signatureRef.value.clear();
} }
// sendMsgFlagRadio.value = 'yes';
}, },
canSave: () => !!rectifyId.value, canSave: () => !!rectifyId.value,
requireInitialized: true, requireInitialized: true,
@@ -303,6 +354,7 @@
signatureLocalPath.value, signatureLocalPath.value,
showCanvas.value, showCanvas.value,
signaturePaths.value signaturePaths.value
// sendMsgFlagRadio.value
]); ]);
// 获取完整图片路径 // 获取完整图片路径
@@ -349,7 +401,8 @@
rectifyData.rectifyResult = rectify.rectifyResult || ''; rectifyData.rectifyResult = rectify.rectifyResult || '';
rectifyData.planCost = rectify.planCost ?? null; rectifyData.planCost = rectify.planCost ?? null;
rectifyData.actualCost = rectify.actualCost ?? null; rectifyData.actualCost = rectify.actualCost ?? null;
rectifyData.rectifierName = rectify.rectifierName || ''; rectifyData.managerNames = rectify.managerNames || [];
rectifyData.memberNames = rectify.memberNames || [];
rectifyData.rectifyStatusName = rectify.rectifyStatusName || ''; rectifyData.rectifyStatusName = rectify.rectifyStatusName || '';
rectifyAttachments.value = rectify.attachments || []; rectifyAttachments.value = rectify.attachments || [];
}; };
@@ -447,6 +500,7 @@
verifyRemark: formData.verifyRemark || '', verifyRemark: formData.verifyRemark || '',
attachments: attachments, attachments: attachments,
signPath: signatureServerPath.value || '' // 电子签名路径 signPath: signatureServerPath.value || '' // 电子签名路径
// sendMsgFlag: sendMsgFlag.value
}; };
console.log('提交验收参数:', params); console.log('提交验收参数:', params);
@@ -645,6 +699,17 @@
} }
} }
.static-field {
background: #fff;
border: 1rpx solid #dcdfe6;
border-radius: 8rpx;
padding: 20rpx 24rpx;
margin-bottom: 20rpx;
font-size: 28rpx;
color: #333;
line-height: 1.5;
}
// 签名相关样式 // 签名相关样式
.signature-box { .signature-box {
width: 100%; width: 100%;

142
pages/hiddendanger/add.vue Normal file
View File

@@ -0,0 +1,142 @@
<template>
<view class="page">
<HazardFormPanel
ref="formRef"
page-mode
title="新增隐患排查"
mode="direct"
:extra-params="hazardExtraParams"
:show-draft-banner="showRestoreBanner"
canvas-id="hazardAddWatermarkCanvas"
@success="onSubmitSuccess"
@clear-draft="clearDraft(true)"
@draft-change="draftSnapshot = $event"
/>
</view>
</template>
<script setup>
import { ref, computed, nextTick } from 'vue'
import { onLoad, onHide } from '@dcloudio/uni-app'
import { enterCheckPlan, getCheckTaskDetail } from '@/request/api.js'
import HazardFormPanel from '@/components/hazard/HazardFormPanel.vue'
import { buildDraftKey, DRAFT_NS, removeDraft } from '@/utils/draftCache.js'
import { useDraftCache } from '@/utils/useDraftCache.js'
import { hasHazardFormContent } from '@/components/hazard/hazardForm.js'
const formRef = ref(null)
const taskId = ref('')
const checkPointId = ref('')
const oneTableId = ref('')
const draftSnapshot = ref(null)
const draftInitialized = ref(false)
const hazardExtraParams = computed(() => ({
taskId: taskId.value,
checkPointId: checkPointId.value,
locationDraftKey: buildDraftKey(
DRAFT_NS.HAZARD_ADD,
'location',
oneTableId.value,
taskId.value,
checkPointId.value
)
}))
const getDraftKey = () => buildDraftKey(
DRAFT_NS.HAZARD_ADD,
oneTableId.value,
taskId.value,
checkPointId.value
)
const {
showRestoreBanner,
clear: clearDraft,
restore: restoreDraft,
save: saveDraft,
bindAutoSave
} = useDraftCache({
getKey: getDraftKey,
getPayload: () => formRef.value?.getPayload?.() || {},
hasContent: hasHazardFormContent,
applyPayload: (data) => {
nextTick(() => {
formRef.value?.applyPayload?.(data)
})
},
clearForm: () => {
formRef.value?.resetForm?.()
},
canSave: () => draftInitialized.value,
requireInitialized: true,
showRestoreToast: false,
onAfterRestore: (data) => {
draftSnapshot.value = data
}
})
const fetchTaskInfo = async (tableId) => {
try {
const startRes = await enterCheckPlan(tableId)
if (startRes.code === 0 && startRes.data) {
const tid = startRes.data.taskId
const detailRes = await getCheckTaskDetail(tid)
if (detailRes.code === 0 && detailRes.data) {
taskId.value = detailRes.data.taskId
checkPointId.value = detailRes.data.checkPointId
}
}
} catch (error) {
console.error('获取任务信息失败:', error)
}
}
const clearLocationPickerDraft = () => {
removeDraft(hazardExtraParams.value.locationDraftKey)
}
const restoreFormDraft = async () => {
await nextTick()
restoreDraft()
}
const onSubmitSuccess = () => {
clearLocationPickerDraft()
clearDraft(false)
}
bindAutoSave(() => draftSnapshot.value)
const initPage = async (options = {}) => {
if (options.taskId) {
taskId.value = options.taskId
}
if (options.checkPointId) {
checkPointId.value = options.checkPointId
}
if (options.id) {
oneTableId.value = options.id
if (!options.taskId || !options.checkPointId) {
await fetchTaskInfo(options.id)
}
}
draftInitialized.value = true
await restoreFormDraft()
}
onLoad(async (options) => {
await initPage(options)
})
onHide(() => {
saveDraft()
})
</script>
<style lang="scss" scoped>
.page {
min-height: 100vh;
background: #ebf2fc;
}
</style>

View File

@@ -10,6 +10,12 @@
<text class="text-blue text-bold" style="cursor: pointer; padding: 0 10rpx; color: #2667E9; font-weight: bold;" @click="clearDraft(true)">清空草稿</text> <text class="text-blue text-bold" style="cursor: pointer; padding: 0 10rpx; color: #2667E9; font-weight: bold;" @click="clearDraft(true)">清空草稿</text>
</view> </view>
<view class="flex margin-bottom"> <view class="flex margin-bottom">
<view class="text-gray">下一步流程</view>
<view class="text-red">*</view>
</view>
<view class="static-field">隐患整改</view>
<view class="flex margin-bottom margin-top">
<view class="text-gray">整改责任人</view> <view class="text-gray">整改责任人</view>
<view class="text-red">*</view> <view class="text-red">*</view>
</view> </view>
@@ -81,6 +87,19 @@
@cancel="showDatePicker = false" @cancel="showDatePicker = false"
@close="showDatePicker = false" @close="showDatePicker = false"
></up-datetime-picker> ></up-datetime-picker>
<view class="flex margin-bottom margin-top">
<view class="text-gray">短信提醒</view>
<view class="text-red">*</view>
</view>
<up-radio-group v-model="sendMsgFlagRadio" placement="row" activeColor="#2667e9">
<up-radio
label="是"
name="yes"
:customStyle="{ marginRight: '48rpx' }"
></up-radio>
<up-radio label="否" name="no"></up-radio>
</up-radio-group>
<view class="btn-group margin-top-xl"> <view class="btn-group margin-top-xl">
<button class="btn-cancel" @click="handleCancel">取消</button> <button class="btn-cancel" @click="handleCancel">取消</button>
@@ -93,7 +112,8 @@
<script setup> <script setup>
import { ref, computed } from 'vue'; import { ref, computed } from 'vue';
import { onLoad } from '@dcloudio/uni-app'; import { onLoad } from '@dcloudio/uni-app';
import { getDepartmentPersonUsers,assignHiddenDanger } from '@/request/api.js'; // import { getDepartmentPersonUsers, assignHiddenDanger } from '@/request/api.js';
import { getRelatedDeptUsers, assignHiddenDanger } from '@/request/api.js';
import { buildDraftKey, DRAFT_NS } from '@/utils/draftCache.js'; import { buildDraftKey, DRAFT_NS } from '@/utils/draftCache.js';
import { useDraftCache } from '@/utils/useDraftCache.js'; import { useDraftCache } from '@/utils/useDraftCache.js';
@@ -165,6 +185,10 @@
const dateValue = ref(Date.now()); const dateValue = ref(Date.now());
const selectedDate = ref(''); const selectedDate = ref('');
// 短信提醒
const sendMsgFlagRadio = ref('yes');
const sendMsgFlag = computed(() => sendMsgFlagRadio.value === 'yes');
// 草稿(仅缓存整改期限,不缓存人员选择) // 草稿(仅缓存整改期限,不缓存人员选择)
const { const {
showRestoreBanner, showRestoreBanner,
@@ -175,26 +199,32 @@
getKey: () => buildDraftKey(DRAFT_NS.ASSIGN, hazardId.value), getKey: () => buildDraftKey(DRAFT_NS.ASSIGN, hazardId.value),
getPayload: () => ({ getPayload: () => ({
selectedDate: selectedDate.value, selectedDate: selectedDate.value,
dateValue: dateValue.value dateValue: dateValue.value,
sendMsgFlagRadio: sendMsgFlagRadio.value
}), }),
hasContent: (payload) => !!payload.selectedDate, hasContent: (payload) => !!(payload.selectedDate || payload.sendMsgFlagRadio === 'no'),
applyPayload: (payload) => { applyPayload: (payload) => {
selectedDate.value = payload.selectedDate || ''; selectedDate.value = payload.selectedDate || '';
dateValue.value = payload.dateValue || Date.now(); dateValue.value = payload.dateValue || Date.now();
sendMsgFlagRadio.value = payload.sendMsgFlagRadio === 'no' ? 'no' : 'yes';
}, },
clearForm: () => { clearForm: () => {
selectedDate.value = ''; selectedDate.value = '';
dateValue.value = Date.now(); dateValue.value = Date.now();
sendMsgFlagRadio.value = 'yes';
}, },
canSave: () => !!hazardId.value canSave: () => !!hazardId.value
}); });
bindAutoSave(() => [selectedDate.value]); bindAutoSave(() => [selectedDate.value, sendMsgFlagRadio.value]);
// 获取部门人员列表 // 获取部门人员列表
const fetchDeptUsers = async () => { const fetchDeptUsers = async () => {
try { try {
const res = await getDepartmentPersonUsers(); // const res = await getDepartmentPersonUsers();
const res = await getRelatedDeptUsers({
type:1
});
if (res.code === 0 && res.data) { if (res.code === 0 && res.data) {
deptList.value = res.data; deptList.value = res.data;
console.log('部门人员树:', deptList.value); console.log('部门人员树:', deptList.value);
@@ -235,7 +265,8 @@
hazardId: Number(hazardId.value), // 隐患ID hazardId: Number(hazardId.value), // 隐患ID
assigneeId: Number(selectedUserId.value), // 被指派人ID assigneeId: Number(selectedUserId.value), // 被指派人ID
deadline: selectedDate.value, // 处理期限 deadline: selectedDate.value, // 处理期限
assignRemark: '' // 交办备注(可选) assignRemark: '', // 交办备注(可选)
sendMsgFlag: sendMsgFlag.value // 是否短信提醒
}; };
console.log('提交数据:', params); console.log('提交数据:', params);
@@ -303,6 +334,17 @@
} }
} }
.static-field {
background: #fff;
border: 1rpx solid #dcdfe6;
border-radius: 8rpx;
padding: 20rpx 24rpx;
margin-bottom: 20rpx;
font-size: 28rpx;
color: #333;
line-height: 1.5;
}
.user-popup { .user-popup {
background: #fff; background: #fff;

View File

@@ -165,11 +165,12 @@
<scroll-view class="cascader-col user-col" scroll-y :key="'dept-users-' + activeDeptIndex"> <scroll-view class="cascader-col user-col" scroll-y :key="'dept-users-' + activeDeptIndex">
<view v-if="currentDeptUsers.length === 0" class="empty-tip">该部门暂无人员</view> <view v-if="currentDeptUsers.length === 0" class="empty-tip">该部门暂无人员</view>
<view v-else> <view v-else>
<view class="user-item" v-for="user in currentDeptUsers" :key="'user-' + user.userId"> <view class="user-item" v-for="user in currentDeptUsers" :key="'user-' + user.userId" :class="{ 'user-item-locked': isLockedUser(user.userId) }">
<up-checkbox <up-checkbox
usedAlone usedAlone
:checked="userPickerSelectedSet.has(String(user.userId))" :checked="userPickerSelectedSet.has(String(user.userId))"
:label="formatUserDisplayName(user)" :label="formatUserPickerLabel(user)"
:disabled="isLockedUser(user.userId)"
activeColor="#2667E9" activeColor="#2667E9"
shape="square" shape="square"
@change="(checked) => onUserCheckChange(user.userId, checked)" @change="(checked) => onUserCheckChange(user.userId, checked)"
@@ -199,7 +200,40 @@
:height="canvasHeight" :height="canvasHeight"
:style="{ width: canvasWidth + 'px', height: canvasHeight + 'px', position: 'fixed', left: '-9999px', top: '-9999px' }" :style="{ width: canvasWidth + 'px', height: canvasHeight + 'px', position: 'fixed', left: '-9999px', top: '-9999px' }"
></canvas> ></canvas>
<!-- 电子签名 --> <canvas
v-if="!showUserPopup && !showManagerPopup && !showRectifyTimePicker"
canvas-id="watermarkCanvas"
:width="canvasWidth"
:height="canvasHeight"
:style="{ width: canvasWidth + 'px', height: canvasHeight + 'px', position: 'fixed', left: '-9999px', top: '-9999px' }"
></canvas>
<view class="form-label margin-bottom margin-top">
<view class="text-gray">下一步流程</view>
<view class="text-red">*</view>
</view>
<view class="static-field">隐患验收</view>
<view class="form-label margin-bottom margin-top">
<view class="text-gray">下一步处理人</view>
<view class="text-red">*</view>
</view>
<view class="static-field">企业管理员</view>
<view class="form-label margin-bottom margin-top">
<view class="text-gray">短信提醒</view>
<view class="text-red">*</view>
</view>
<up-radio-group v-model="sendMsgFlagRadio" placement="row" activeColor="#2667e9">
<up-radio
label="是"
name="yes"
:customStyle="{ marginRight: '48rpx' }"
></up-radio>
<up-radio label="否" name="no"></up-radio>
</up-radio-group>
<!-- 电子签名表单最底部 -->
<view class="form-label margin-bottom margin-top flex justify-between align-center" style="width: 100%;"> <view class="form-label margin-bottom margin-top flex justify-between align-center" style="width: 100%;">
<view class="flex align-center"> <view class="flex align-center">
<view class="text-gray">电子签名</view> <view class="text-gray">电子签名</view>
@@ -253,7 +287,15 @@
<script setup> <script setup>
import {ref,reactive,computed,nextTick,getCurrentInstance} from 'vue' import {ref,reactive,computed,nextTick,getCurrentInstance} from 'vue'
import {onLoad, onHide} from '@dcloudio/uni-app' import {onLoad, onHide} from '@dcloudio/uni-app'
import {submitRectification,getDepartmentPersonUsers,getRectifyDetail,getDeptUsersWithSubordinates,getHiddenDangerDetail,generateRectifyPlan} from '@/request/api.js' import {
submitRectification,
// getDepartmentPersonUsers,
// getDeptUsersWithSubordinates,
getRelatedDeptUsers,
getRectifyDetail,
getHiddenDangerDetail,
generateRectifyPlan
} from '@/request/api.js'
import { buildDraftKey, buildDraftKeyCompact, DRAFT_NS } from '@/utils/draftCache.js'; import { buildDraftKey, buildDraftKeyCompact, DRAFT_NS } from '@/utils/draftCache.js';
import { useDraftCache } from '@/utils/useDraftCache.js'; import { useDraftCache } from '@/utils/useDraftCache.js';
import { import {
@@ -415,6 +457,10 @@
const rectifyTimeValue = ref(Date.now()); const rectifyTimeValue = ref(Date.now());
const selectedRectifyTime = ref(''); const selectedRectifyTime = ref('');
// 短信提醒
const sendMsgFlagRadio = ref('yes');
const sendMsgFlag = computed(() => sendMsgFlagRadio.value === 'yes');
const formatDateValue = (timestamp) => { const formatDateValue = (timestamp) => {
if (!timestamp) return ''; if (!timestamp) return '';
const date = new Date(timestamp); const date = new Date(timestamp);
@@ -458,7 +504,18 @@
deptName: '' deptName: ''
}); });
} }
selectedUserIds.value = [id]; if (!lockedUserIds.value.includes(id)) {
lockedUserIds.value = [...lockedUserIds.value, id];
}
selectedUserIds.value = mergeLockedUserIds([id]);
syncSelectedUsersFromIds(selectedUserIds.value);
};
const setLockedDefaultUsers = (ids) => {
const normalized = parseIdList(ids);
if (!normalized.length) return;
lockedUserIds.value = normalized;
selectedUserIds.value = mergeLockedUserIds(selectedUserIds.value);
syncSelectedUsersFromIds(selectedUserIds.value); syncSelectedUsersFromIds(selectedUserIds.value);
}; };
@@ -529,7 +586,7 @@
showRectifyTimePicker.value = false; showRectifyTimePicker.value = false;
}; };
// 人员列表(安全管理人员:本部门及上级;整改责任人:隐患关联部门) // 人员列表(安全管理人员整改责任人:关联部门及人员type=2
const managerDeptList = ref([]) const managerDeptList = ref([])
const deptList = ref([]) const deptList = ref([])
const detailPersonPool = ref([]) const detailPersonPool = ref([])
@@ -541,9 +598,25 @@
const showUserPopup = ref(false) const showUserPopup = ref(false)
const selectedUserIds = ref([]) const selectedUserIds = ref([])
const selectedUsers = ref([]) const selectedUsers = ref([])
const lockedUserIds = ref([])
const activeDeptIndex = ref(0) const activeDeptIndex = ref(0)
const userPickerSelectedIds = ref([]) const userPickerSelectedIds = ref([])
const isLockedUser = (userId) => lockedUserIds.value.includes(String(userId));
const mergeLockedUserIds = (ids) => {
const merged = new Set([
...(ids || []).map((id) => String(id)),
...lockedUserIds.value.map((id) => String(id))
]);
return [...merged];
};
const formatUserPickerLabel = (user) => {
const name = formatUserDisplayName(user);
return isLockedUser(user.userId) ? `${name}(默认)` : name;
};
const formatUserDisplayName = (user) => { const formatUserDisplayName = (user) => {
if (user.postName) { if (user.postName) {
return `${user.nickName}_${user.postName}`; return `${user.nickName}_${user.postName}`;
@@ -647,6 +720,10 @@
function onUserCheckChange(userId, checked) { function onUserCheckChange(userId, checked) {
const id = String(userId); const id = String(userId);
if (!checked && isLockedUser(id)) {
uni.showToast({ title: '默认整改责任人不可取消', icon: 'none' });
return;
}
if (checked) { if (checked) {
if (!userPickerSelectedSet.value.has(id)) { if (!userPickerSelectedSet.value.has(id)) {
userPickerSelectedIds.value = [...userPickerSelectedIds.value, id]; userPickerSelectedIds.value = [...userPickerSelectedIds.value, id];
@@ -668,7 +745,7 @@
}; };
const openUserPopup = () => { const openUserPopup = () => {
userPickerSelectedIds.value = [...selectedUserIds.value]; userPickerSelectedIds.value = mergeLockedUserIds(selectedUserIds.value);
const firstDeptWithUsers = deptList.value.findIndex((dept) => dept.users?.length > 0); const firstDeptWithUsers = deptList.value.findIndex((dept) => dept.users?.length > 0);
activeDeptIndex.value = firstDeptWithUsers >= 0 ? firstDeptWithUsers : 0; activeDeptIndex.value = firstDeptWithUsers >= 0 ? firstDeptWithUsers : 0;
showUserPopup.value = true; showUserPopup.value = true;
@@ -687,45 +764,65 @@
// 确认选择整改责任人 // 确认选择整改责任人
const confirmUserSelect = () => { const confirmUserSelect = () => {
userPickerSelectedIds.value = mergeLockedUserIds(userPickerSelectedIds.value);
selectedUserIds.value = userPickerSelectedIds.value.map((id) => String(id)); selectedUserIds.value = userPickerSelectedIds.value.map((id) => String(id));
syncSelectedUsersFromIds(selectedUserIds.value); syncSelectedUsersFromIds(selectedUserIds.value);
showUserPopup.value = false; showUserPopup.value = false;
}; };
// 获取安全管理人员候选列表(本部门及上级部门) // 获取关联部门及人员列表(全部上级部门、本部门、全部下级部门)
const fetchManagerDeptUsers = async () => { const fetchRelatedDeptUsers = async () => {
try { try {
const res = await getDepartmentPersonUsers(); const res = await getRelatedDeptUsers({ type: 2 });
if (res.code === 0 && res.data) { if (res.code === 0 && res.data) {
managerDeptList.value = res.data; managerDeptList.value = res.data;
deptList.value = res.data;
if (selectedManagerIds.value.length > 0) { if (selectedManagerIds.value.length > 0) {
syncSelectedManagersFromIds(selectedManagerIds.value); syncSelectedManagersFromIds(selectedManagerIds.value);
} }
}
} catch (error) {
console.error('获取安全管理人员列表失败:', error);
}
};
// 获取整改责任人候选列表(隐患关联部门人员)
const fetchRectifyDeptUsers = async () => {
console.log('当前hazardId:', hazardId.value);
try {
const res = await getDeptUsersWithSubordinates({ hazardId: hazardId.value });
if (res.code === 0 && res.data) {
deptList.value = res.data;
if (selectedUserIds.value.length > 0) { if (selectedUserIds.value.length > 0) {
syncSelectedUsersFromIds(selectedUserIds.value); syncSelectedUsersFromIds(selectedUserIds.value);
} }
console.log('整改责任人部门树:', deptList.value);
} }
} catch (error) { } catch (error) {
console.error('获取整改责任人列表失败:', error); console.error('获取关联部门人员列表失败:', error);
} }
}; };
// 获取安全管理人员候选列表(本部门及上级部门)
// const fetchManagerDeptUsers = async () => {
// try {
// const res = await getDepartmentPersonUsers();
// if (res.code === 0 && res.data) {
// managerDeptList.value = res.data;
// if (selectedManagerIds.value.length > 0) {
// syncSelectedManagersFromIds(selectedManagerIds.value);
// }
// }
// } catch (error) {
// console.error('获取安全管理人员列表失败:', error);
// }
// };
// 获取整改责任人候选列表(隐患关联部门人员)
// const fetchRectifyDeptUsers = async () => {
// console.log('当前hazardId:', hazardId.value);
// try {
// const res = await getDeptUsersWithSubordinates({ hazardId: hazardId.value });
// if (res.code === 0 && res.data) {
// deptList.value = res.data;
// if (selectedUserIds.value.length > 0) {
// syncSelectedUsersFromIds(selectedUserIds.value);
// }
// console.log('整改责任人部门树:', deptList.value);
// }
// } catch (error) {
// console.error('获取整改责任人列表失败:', error);
// }
// };
const fetchPersonnelLists = async () => { const fetchPersonnelLists = async () => {
await Promise.all([fetchManagerDeptUsers(), fetchRectifyDeptUsers()]); await fetchRelatedDeptUsers();
if (selectedManagerIds.value.length > 0) { if (selectedManagerIds.value.length > 0) {
syncSelectedManagersFromIds(selectedManagerIds.value); syncSelectedManagersFromIds(selectedManagerIds.value);
} }
@@ -763,7 +860,8 @@
manageIds: selectedManagerIds.value.map((id) => Number(id)), manageIds: selectedManagerIds.value.map((id) => Number(id)),
memberIds: selectedUserIds.value.map((id) => Number(id)), memberIds: selectedUserIds.value.map((id) => Number(id)),
rectifyTime: selectedRectifyTime.value || formatDateValue(rectifyTimeValue.value), rectifyTime: selectedRectifyTime.value || formatDateValue(rectifyTimeValue.value),
signPath: signatureServerPath.value || '' signPath: signatureServerPath.value || '',
sendMsgFlag: sendMsgFlag.value
}; };
// 编辑模式需要传递rectifyId // 编辑模式需要传递rectifyId
@@ -1037,6 +1135,11 @@
} else if (data.rectifierId) { } else if (data.rectifierId) {
selectedUserIds.value = [String(data.rectifierId)]; selectedUserIds.value = [String(data.rectifierId)];
} }
if (data.assigneeId) {
setLockedDefaultUsers(data.assigneeId);
} else if (data.rectifierId) {
setLockedDefaultUsers(data.rectifierId);
}
await fetchPersonnelLists(); await fetchPersonnelLists();
// 回显附件 // 回显附件
@@ -1138,7 +1241,8 @@
signatureUrl: signatureUrl.value, signatureUrl: signatureUrl.value,
signatureLocalPath: signatureLocalPath.value, signatureLocalPath: signatureLocalPath.value,
showCanvas: showCanvas.value, showCanvas: showCanvas.value,
signaturePaths: signaturePaths.value signaturePaths: signaturePaths.value,
sendMsgFlagRadio: sendMsgFlagRadio.value
}), }),
hasContent: rectifyDraftHasContent, hasContent: rectifyDraftHasContent,
applyPayload: (data) => { applyPayload: (data) => {
@@ -1158,6 +1262,7 @@
} else if (data.showCanvas === false) { } else if (data.showCanvas === false) {
showCanvas.value = false; showCanvas.value = false;
} }
sendMsgFlagRadio.value = data.sendMsgFlagRadio === 'no' ? 'no' : 'yes';
}, },
clearForm: () => { clearForm: () => {
formData.rectifyPlan = ''; formData.rectifyPlan = '';
@@ -1175,6 +1280,7 @@
if (signatureRef.value) { if (signatureRef.value) {
signatureRef.value.clear(); signatureRef.value.clear();
} }
sendMsgFlagRadio.value = 'yes';
}, },
canSave: () => !!(hazardId.value || rectifyId.value), canSave: () => !!(hazardId.value || rectifyId.value),
onAfterRestore: (data) => { onAfterRestore: (data) => {
@@ -1203,7 +1309,8 @@
signatureUrl.value, signatureUrl.value,
signatureLocalPath.value, signatureLocalPath.value,
showCanvas.value, showCanvas.value,
signaturePaths.value signaturePaths.value,
sendMsgFlagRadio.value
]); ]);
onHide(() => { onHide(() => {
@@ -1328,6 +1435,17 @@
font-size: 28rpx; font-size: 28rpx;
color: #333; color: #333;
} }
.static-field {
background: #fff;
border: 1rpx solid #dcdfe6;
border-radius: 8rpx;
padding: 20rpx 24rpx;
margin-bottom: 20rpx;
font-size: 28rpx;
color: #333;
line-height: 1.5;
}
// 选择触发器样式 // 选择触发器样式
.select-trigger { .select-trigger {
@@ -1479,6 +1597,10 @@
border-bottom: none; border-bottom: none;
} }
} }
.user-item-locked {
opacity: 0.85;
}
.popup-footer { .popup-footer {
display: flex; display: flex;

View File

@@ -175,14 +175,18 @@
<text style="color: #333333;">{{ item.createdAt }}</text> <text style="color: #333333;">{{ item.createdAt }}</text>
</view> </view>
<!-- 操作按钮 --> <!-- 操作按钮 -->
<view class="margin-top flex justify-end" style="gap: 16rpx;"> <view class="flex justify-end danger-card-actions">
<button class="cu-btn round lg light bg-blue" @click.stop="viewHazardDetail(item)">查看详情</button> <button class="round cu-btn light bg-blue" @click.stop="viewHazardDetail(item)">查看详情</button>
<button v-if="item.statusName === '待整改' && item.canEdit" <button v-if="item.statusName === '待整改' && item.canEdit"
class="cu-btn round lg bg-blue" @click.stop="goRectification(item)">立即整改</button> class="round cu-btn light bg-blue" @click.stop="assignHazard(item)">隐患交办</button>
<button v-if="item.statusName === '待验收' && canAcceptance" <button v-if="item.statusName === '待整改' && item.canEdit"
class="cu-btn round lg bg-blue" @click.stop="goAcceptance(item)">立即验收</button> class="round cu-btn bg-blue" @click.stop="goRectification(item)">立即整改</button>
<button v-if="item.statusName === '待交办'" <button v-if="item.statusName === '待验收' && item.canEdit"
class="cu-btn round lg bg-blue" @click.stop="assignHazard(item)">隐患交办</button> class="round cu-btn light bg-blue" @click.stop="editRectification(item)">编辑整改信息</button>
<button v-if="item.statusName === '待验收' && canAcceptance"
class="round cu-btn bg-blue" @click.stop="goAcceptance(item)">立即验收</button>
<button v-if="item.statusName === '待交办'"
class="round cu-btn bg-blue" @click.stop="assignHazard(item)">隐患交办</button>
</view> </view>
</view> </view>
</view> </view>
@@ -937,4 +941,21 @@
flex-shrink: 0; flex-shrink: 0;
} }
} }
.danger-card-actions {
margin-top: 20rpx;
gap: 10rpx;
flex-wrap: wrap;
.cu-btn {
padding: 0 24rpx !important;
font-size: 26rpx !important;
height: 60rpx !important;
line-height: 60rpx !important;
white-space: nowrap !important;
flex-shrink: 0 !important;
width: auto !important;
margin: 0 !important;
}
}
</style> </style>

View File

@@ -161,6 +161,13 @@ export function getHiddenDangerLabelList() {
method: 'GET' method: 'GET'
}); });
} }
//获取隐患来源列表
export function getHazardSourceList() {
return requestAPI({
url: '/frontend/hazard/source/list',
method: 'GET'
});
}
//获取部门人员列表(本部门、上级部门、上上级部门) //获取部门人员列表(本部门、上级部门、上上级部门)
export function getDepartmentPersonUsers(params) { export function getDepartmentPersonUsers(params) {
return requestAPI({ return requestAPI({
@@ -170,6 +177,15 @@ export function getDepartmentPersonUsers(params) {
}); });
} }
// 获取关联部门及人员列表(全部上级部门、本部门、全部下级部门)
export function getRelatedDeptUsers(params) {
return requestAPI({
url: '/frontend/hazard/dept/users/related',
method: 'GET',
data: params
});
}
//获取部门人员列表(包含参与过该隐患环节下的所有部门人员) //获取部门人员列表(包含参与过该隐患环节下的所有部门人员)
export function getDeptUsersWithSubordinates(params) { export function getDeptUsersWithSubordinates(params) {
return requestAPI({ return requestAPI({

View File

@@ -5,7 +5,7 @@ import Request from './luch-request/index.js';
// const baseUrl = 'https://yingji.hexieapi.com/prod-api'; // const baseUrl = 'https://yingji.hexieapi.com/prod-api';
// const baseUrl = 'http://192.168.1.168:5004'; //廖哥本地 // const baseUrl = 'http://192.168.1.168:5004'; //廖哥本地
const baseUrl = 'http://192.168.1.140:5004'; //超哥本地 const baseUrl = 'http://192.168.1.140:5004'; //超哥本地
// const baseUrl = 'http://192.168.1.158:7003'; //测试环境 // const baseUrl = 'http://192.168.1.158:7003/prod-api'; //测试环境
// 图片/文件资源域名:去掉 /prod-api便于 <image> / previewImage / downloadFile 直接访问 // 图片/文件资源域名:去掉 /prod-api便于 <image> / previewImage / downloadFile 直接访问

1
unpackage/dist/build/mp-weixin/app.js vendored Normal file
View File

@@ -0,0 +1 @@
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./common/vendor.js"),o=require("./uni_modules/uview-plus/index.js");Math;const t={onLaunch:function(){console.log("App Launch")},onShow:function(){console.log("App Show")},onHide:function(){console.log("App Hide")}};e.index.addInterceptor("chooseImage",{success(o){const t=["bmp","gif","jpg","jpeg","png"],n=[],p=[];let i=!1,s="";o.tempFiles.forEach(((e,c)=>{const u=(e.path||o.tempFilePaths[c]).split("?")[0].split(".").pop().toLowerCase();t.includes(u)?(p.push(e),n.push(o.tempFilePaths[c])):(i=!0,s=u)})),i&&e.index.showToast({title:`已过滤不支持的 .${s} 格式图片,请上传 png/jpg/jpeg/gif/bmp`,icon:"none",duration:3500}),o.tempFilePaths=n,o.tempFiles=p}});const n=["bmp","gif","jpg","jpeg","png","doc","docx","xls","xlsx","ppt","pptx","html","htm","txt","rar","zip","gz","bz2","mp4","avi","rmvb","pdf"],p=["qiniup.com","qbox.me"];function i(o){if(!o)return!0;const t=o.split("?")[0].split(".").pop().toLowerCase();return!!n.includes(t)||(e.index.showToast({title:`不支持 .${t} 格式,请上传合规的文件或图片`,icon:"none",duration:3e3}),!1)}function s(){const n=e.createSSRApp(t);return n.use(o.uviewPlus),{app:n}}e.index.addInterceptor("uploadFile",{invoke(e){const o=e.url||"";return p.some((e=>o.includes(e)))||o.includes("/frontend/attachment/upload"),!!i(e.filePath)&&e}}),s().app.mount("#app"),exports.createApp=s;

85
unpackage/dist/build/mp-weixin/app.json vendored Normal file
View File

@@ -0,0 +1,85 @@
{
"pages": [
"pages/index/index",
"pages/map/map",
"pages/plandetail/plandetail",
"pages/Inspectionresult/Inspectionresult",
"pages/Inspectionresult/list",
"pages/Inspectionresult/detail",
"pages/membermanagemen/membermanagemen",
"pages/corporateInformation/corporateInformation",
"pages/editcompanInformation/editcompanInformation",
"pages/checklist/checklist",
"pages/checklist/detail",
"pages/editchecklist/editchecklist",
"pages/Inspectionlog/Inspectionlog",
"pages/Inspectionchecklist/Inspectionchecklist",
"pages/Idphotomanagement/Idphotomanagement",
"pages/hiddendanger/Inspection",
"pages/hiddendanger/add",
"pages/hiddendanger/view",
"pages/hiddendanger/detail2",
"pages/hiddendanger/rectification",
"pages/hiddendanger/acceptance",
"pages/hiddendanger/assignment",
"pages/closeout/application",
"pages/closeout/editor",
"pages/equipmentregistration/equipmentregistration",
"pages/area/management",
"pages/Inspectionwarning/Inspectionwarning",
"pages/personalcenter/my",
"pages/personalcenter/helpcenter",
"pages/personalcenter/notification",
"pages/personalcenter/settings",
"pages/personalcenter/account",
"pages/personalcenter/edit",
"pages/login/login",
"pages/login/reg",
"pages/login/enterprise",
"pages/login/success",
"pages/login/forget",
"pages/login/agreement"
],
"window": {
"navigationBarTextStyle": "white",
"navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#007aff",
"backgroundColor": "#F8F8F8"
},
"tabBar": {
"color": "#999999",
"selectedColor": "#007aff",
"borderStyle": "black",
"backgroundColor": "#ffffff",
"list": [
{
"pagePath": "pages/index/index",
"text": "首页",
"iconPath": "static/tabbar_icon/home_icon.png",
"selectedIconPath": "static/tabbar_icon/home_selectedIcon.png"
},
{
"pagePath": "pages/Inspectionwarning/Inspectionwarning",
"text": "预警",
"iconPath": "static/tabbar_icon/yujing_icon.png",
"selectedIconPath": "static/tabbar_icon/yujing_selectedIcon.png"
},
{
"pagePath": "pages/personalcenter/my",
"text": "我的",
"iconPath": "static/tabbar_icon/mine_icon.png",
"selectedIconPath": "static/tabbar_icon/mine_selectedIcon.png"
}
]
},
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于选择隐患位置"
}
},
"requiredPrivateInfos": [
"chooseLocation",
"getLocation"
],
"usingComponents": {}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
"use strict";exports._imports_0="/static/home_icon/jianbianbeijing.png",exports._imports_0$1="/static/jianchabiao/biaodan.svg",exports._imports_0$2="/static/yinhuan_detail/status.png",exports._imports_0$3="/static/yujin/yujin_sousuo.png",exports._imports_0$4="/static/my/edit.png",exports._imports_0$5="/static/my/Customer service.png",exports._imports_0$6="/static/index/index_bg.png",exports._imports_0$7="/static/index/phone.png",exports._imports_0$8="/static/index/蒙版组 260.png",exports._imports_1="/static/yinhuan_detail/date.png",exports._imports_1$1="/static/yujin/yujin_tongji.png",exports._imports_1$2="/static/my/Notification.png",exports._imports_1$3="/static/my/Phone.png",exports._imports_1$4="/static/index/lock.png",exports._imports_2="/static/my/Account.png";

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
"use strict";const e=require("../common/vendor.js"),o={__name:"AreaFormPopup",props:{visible:{type:Boolean,default:!1},isEdit:{type:Boolean,default:!1},editData:{type:Object,default:()=>({})},loading:{type:Boolean,default:!1}},emits:["update:visible","submit","close"],setup(o,{emit:a}){const t=o,l=a,n=e.reactive({name:"",color:"#D92121"}),i=[{name:"红色",value:"#D92121"},{name:"橙色",value:"#FF8822"},{name:"黄色",value:"#FFCC00"},{name:"蓝色",value:"#165DFF"}],r=i.map((e=>e.value)),c=e.computed((()=>{const e=i.find((e=>e.value===n.color));return e?`${e.name} ${e.value}`:n.color}));e.watch((()=>t.editData),(e=>{e&&Object.keys(e).length>0&&(n.name=e.name||"",n.color=(e=>{if(!e)return i[0].value;const o=String(e).toUpperCase();return r.find((e=>e.toUpperCase()===o))||i[0].value})(e.color))}),{immediate:!0,deep:!0}),e.watch((()=>t.visible),(e=>{e||u()}));const u=()=>{n.name="",n.color="#D92121"},s=()=>{l("update:visible",!1),l("close")},m=()=>{n.name?r.includes(n.color)?l("submit",{name:n.name,color:n.color}):e.index.showToast({title:"请从预设颜色中选择",icon:"none"}):e.index.showToast({title:"请输入区域名称",icon:"none"})};return(a,t)=>e.e({a:o.visible},o.visible?{b:e.t(o.isEdit?"编辑区域":"新增区域"),c:e.o(s),d:n.name,e:e.o((e=>n.name=e.detail.value)),f:n.color,g:e.t(c.value),h:e.f(i,((o,a,t)=>({a:n.color===o.value?1:"",b:o.value,c:e.t(o.name),d:o.value,e:e.o((e=>{return a=o.value,void(n.color=a);var a}),o.value)}))),i:e.o(s),j:e.o(m),k:o.loading,l:e.o((()=>{})),m:e.o(s),n:e.gei(a,"")}:{})}},a=e._export_sfc(o,[["__scopeId","data-v-737ed489"]]);wx.createComponent(a);

View File

@@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

View File

@@ -0,0 +1 @@
<view wx:if="{{a}}" bindtap="{{m}}" class="{{['popup-mask', 'data-v-737ed489', virtualHostClass]}}" style="{{virtualHostStyle}}" hidden="{{virtualHostHidden || false}}" id="{{n}}"><view class="popup-content data-v-737ed489" catchtap="{{l}}"><view class="popup-header data-v-737ed489"><view class="popup-title text-bold data-v-737ed489">{{b}}</view><view class="popup-close data-v-737ed489" bindtap="{{c}}">×</view></view><view class="popup-body data-v-737ed489"><view class="flex margin-bottom-sm data-v-737ed489"><view class="data-v-737ed489">区域名称</view><view class="text-red data-v-737ed489">*</view></view><input class="form-input data-v-737ed489" placeholder="请输入区域名称" value="{{d}}" bindinput="{{e}}"/><view class="flex margin-bottom-sm margin-top data-v-737ed489"><view class="data-v-737ed489">区域颜色</view><view class="text-red data-v-737ed489">*</view></view><view class="flex align-center margin-bottom-sm data-v-737ed489"><view class="color-preview data-v-737ed489" style="{{'background-color:' + f}}"></view><text class="margin-left-sm text-gray data-v-737ed489">{{g}}</text></view><view class="margin-bottom-sm text-gray data-v-737ed489">请选择颜色</view><view class="color-grid data-v-737ed489"><view wx:for="{{h}}" wx:for-item="item" wx:key="d" class="color-option data-v-737ed489" bindtap="{{item.e}}"><view class="{{['color-item', 'data-v-737ed489', item.a && 'color-item-active']}}" style="{{'background-color:' + item.b}}"></view><text class="color-label data-v-737ed489">{{item.c}}</text></view></view></view><view class="popup-footer data-v-737ed489"><button class="btn-cancel data-v-737ed489" bindtap="{{i}}">取消</button><button class="btn-confirm bg-blue data-v-737ed489" bindtap="{{j}}" loading="{{k}}">确定</button></view></view></view>

View File

@@ -0,0 +1 @@
.popup-mask.data-v-737ed489{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.5);display:flex;align-items:center;justify-content:center;z-index:999}.popup-content.data-v-737ed489{width:600rpx;background:#fff;border-radius:20rpx;overflow:hidden}.popup-header.data-v-737ed489{display:flex;justify-content:space-between;align-items:center;padding:30rpx;border-bottom:1rpx solid #eee}.popup-title.data-v-737ed489{font-size:32rpx}.popup-close.data-v-737ed489{font-size:40rpx;color:#999}.popup-body.data-v-737ed489{padding:30rpx}.popup-footer.data-v-737ed489{display:flex;padding:20rpx 30rpx 30rpx}.popup-footer button.data-v-737ed489{flex:1;height:80rpx;line-height:80rpx;border-radius:40rpx;font-size:30rpx;margin:0 10rpx}.popup-footer button.data-v-737ed489:after{border:none}.popup-footer .btn-cancel.data-v-737ed489{background:#f5f5f5;color:#666}.popup-footer .btn-confirm.data-v-737ed489{color:#fff}.form-input.data-v-737ed489{width:100%;height:70rpx;padding:0 20rpx;border:2rpx solid #dadbde;border-radius:8rpx;font-size:28rpx;box-sizing:border-box}.color-preview.data-v-737ed489{width:70rpx;height:70rpx;border-radius:8rpx;flex-shrink:0;border:2rpx solid #e5e5e5}.color-grid.data-v-737ed489{display:flex;flex-wrap:wrap;justify-content:space-between;gap:24rpx 0}.color-option.data-v-737ed489{width:25%;display:flex;flex-direction:column;align-items:center}.color-item.data-v-737ed489{width:80rpx;height:80rpx;border-radius:12rpx;border:4rpx solid transparent;box-sizing:border-box}.color-label.data-v-737ed489{margin-top:12rpx;font-size:24rpx;color:#666}.color-item-active.data-v-737ed489{border-color:#333;box-shadow:0 0 0 4rpx rgba(0,0,0,.08)}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,9 @@
{
"component": true,
"usingComponents": {
"up-upload": "../../uni_modules/uview-plus/components/u-upload/u-upload",
"up-input": "../../uni_modules/uview-plus/components/u-input/u-input",
"up-textarea": "../../uni_modules/uview-plus/components/u-textarea/u-textarea",
"u-popup": "../../uni_modules/uview-plus/components/u-popup/u-popup"
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js");if(!Array){e.resolveComponent("u-popup")()}Math||(a+(()=>"../../uni_modules/uview-plus/components/u-popup/u-popup.js"))();const a=()=>"./HazardFormPanel.js",o={__name:"HazardFormPopup",props:{show:{type:Boolean,default:!1},title:{type:String,default:"填写隐患信息"},mode:{type:String,default:"collect"},modelValue:{type:Object,default:null},extraParams:{type:Object,default:()=>({})},showDraftBanner:{type:Boolean,default:!1},bodyHeight:{type:String,default:""},canvasId:{type:String,default:"hazardFormWatermarkCanvas"}},emits:["update:show","update:modelValue","success","confirm","clear-draft"],setup(a,{expose:o,emit:l}){const t=a,r=l,u=e.computed({get:()=>t.show,set:e=>r("update:show",e)}),d=e.computed((()=>({title:t.title,mode:t.mode,modelValue:t.modelValue,extraParams:t.extraParams,showDraftBanner:t.showDraftBanner,bodyHeight:t.bodyHeight,canvasId:t.canvasId}))),n=()=>{u.value=!1},s=e.ref(null);return o({getPayload:(...e)=>{var a,o;return null==(o=null==(a=s.value)?void 0:a.getPayload)?void 0:o.call(a,...e)},applyPayload:(...e)=>{var a,o;return null==(o=null==(a=s.value)?void 0:a.applyPayload)?void 0:o.call(a,...e)},resetForm:(...e)=>{var a,o;return null==(o=null==(a=s.value)?void 0:a.resetForm)?void 0:o.call(a,...e)},validateForm:(...e)=>{var a,o;return null==(o=null==(a=s.value)?void 0:a.validateForm)?void 0:o.call(a,...e)}}),(a,o)=>({a:e.sr(s,"52d033ec-1,52d033ec-0",{k:"panelRef"}),b:e.o((e=>u.value=e)),c:e.o((e=>r("success",e))),d:e.o((e=>r("confirm",e))),e:e.o((e=>r("clear-draft"))),f:e.o((e=>u.value=!1)),g:e.p({...d.value,show:u.value}),h:e.o(n),i:e.o((e=>u.value=e)),j:e.p({mode:"center",round:"20","safe-area-inset-bottom":!1,show:u.value}),k:e.gei(a,"")})}};wx.createComponent(o);

View File

@@ -0,0 +1,7 @@
{
"component": true,
"usingComponents": {
"u-popup": "../../uni_modules/uview-plus/components/u-popup/u-popup",
"hazard-form-panel": "./HazardFormPanel"
}
}

View File

@@ -0,0 +1 @@
<u-popup wx:if="{{j}}" u-s="{{['d']}}" bindclose="{{h}}" u-i="52d033ec-0" bind:__l="__l" bindupdateShow="{{i}}" u-p="{{j}}" class="{{[virtualHostClass]}}" virtualHostClass="{{[virtualHostClass]}}" style="{{virtualHostStyle}}" virtualHostStyle="{{virtualHostStyle}}" hidden="{{virtualHostHidden || false}}" virtualHostHidden="{{virtualHostHidden || false}}" id="{{k}}" virtualHostId="{{k}}"><hazard-form-panel wx:if="{{g}}" class="r" virtualHostClass="r" u-r="panelRef" bindupdateShow="{{b}}" bindsuccess="{{c}}" bindconfirm="{{d}}" bindclearDraft="{{e}}" bindclose="{{f}}" u-i="52d033ec-1,52d033ec-0" bind:__l="__l" u-p="{{g}}"/></u-popup>

View File

@@ -0,0 +1 @@
"use strict";const t=require("../../utils/upload.js"),e=[{id:2,title:"一般隐患"},{id:3,title:"重大隐患"}],a=[{id:1,title:"部门检查"},{id:2,title:"督导检查"},{id:3,title:"企业自查"},{id:4,title:"行业互查"}];exports.AI_LEVEL_MAP={"轻微":0,"轻微隐患":0,"一般":0,"一般隐患":0,"重大":1,"重大隐患":1},exports.LEVEL_OPTIONS=e,exports.SOURCE_OPTIONS=a,exports.buildHiddenDangerParams=function(l,i={}){var r,n,d;const{formData:s,address:o,lng:u,lat:c,areaId:g,fileList:I}=l,f=null==(r=l.tagOptions)?void 0:r[s.tagIndex],m=s.tagId??(f?f.id:null);return{title:s.title,level:(null==(n=e[s.level])?void 0:n.id)||2,lng:u||0,lat:c||0,address:o||"",areaId:g||null,description:s.description||"",source:(null==(d=a[s.source])?void 0:d.title)||"",tagId:m,attachments:(I||[]).filter((t=>"success"===t.status)).map((e=>t.buildAttachmentItem(e))),regulationId:s.regulationId||null,...i}},exports.createEmptyHazardPayload=function(){return{formData:{title:"",level:0,source:0,description:"",tagIndex:0,tagId:null,regulationId:null,regulationName:""},address:"",lng:0,lat:0,areaId:"",areaName:"",fileList:[]}},exports.hasHazardFormContent=function(t){if(!t)return!1;const e=t.formData||{},a=t.fileList||[];return!!(e.title||e.description||e.regulationName||e.regulationId||t.address||t.areaId||t.areaName||a.length>0)},exports.hasValidHazardPayload=function(t){if(!t)return!1;const{formData:e,fileList:a}=t;return!!((null==e?void 0:e.title)&&(null==a?void 0:a.length)>0)};

View File

@@ -0,0 +1 @@
"use strict";require("../../common/vendor.js"),require("../../request/request.js");

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.hazard-detail-panel-v2.data-v-1547c16c{flex:1;min-height:0;width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden}.loading-wrap.data-v-1547c16c,.empty-wrap.data-v-1547c16c{flex:1;display:flex;align-items:center;justify-content:center;min-height:0}.loading-text.data-v-1547c16c,.empty-text.data-v-1547c16c{font-size:28rpx;color:#909399}.detail-body.data-v-1547c16c{display:flex;gap:20rpx;align-items:stretch;overflow:hidden;box-sizing:border-box}.steps-card.data-v-1547c16c{width:140rpx;flex-shrink:0;background:#fff;border-radius:20rpx;box-sizing:border-box}.step-item.data-v-1547c16c{padding:0 12rpx}.step-track.data-v-1547c16c{display:flex;flex-direction:column;align-items:center;padding:28rpx 0 0}.step-dot.data-v-1547c16c{width:66rpx;height:66rpx;border-radius:50%;background:#f3f3f3;display:flex;align-items:center;justify-content:center;transition:background .2s}.step-dot--active.data-v-1547c16c{background:#2667e9}.step-icon.data-v-1547c16c{width:36rpx;height:36rpx}.step-label.data-v-1547c16c{margin-top:12rpx;font-size:24rpx;color:#999;line-height:1.2}.step-label--active.data-v-1547c16c{color:#2667e9;font-weight:600}.step-line.data-v-1547c16c{width:0;height:40rpx;margin:10rpx 0;border-left:2rpx dashed #dcdfe6}.content-column.data-v-1547c16c{flex:1;width:0;min-height:0;box-sizing:border-box}.content-scroll.data-v-1547c16c{width:100%;box-sizing:border-box}.node-section.data-v-1547c16c{box-sizing:border-box;padding:0;margin-bottom:24rpx}.node-section--last.data-v-1547c16c{padding-bottom:40rpx;margin-bottom:0}.detail-card.data-v-1547c16c{background:#fff;border-radius:20rpx;overflow:hidden;padding:28rpx 38rpx;box-sizing:border-box}.card-header-v2.data-v-1547c16c{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx;padding:0}.card-header-main.data-v-1547c16c{flex:1;min-width:0}.operator.data-v-1547c16c{font-size:28rpx;font-weight:600;color:#303133;line-height:1.5;word-break:break-all}.time.data-v-1547c16c{display:block;margin-top:8rpx;font-size:24rpx;color:#999;line-height:1.4}.level-badge.data-v-1547c16c{flex-shrink:0;padding:6rpx 16rpx;border-radius:8rpx;font-size:22rpx;font-weight:500;white-space:nowrap}.level-badge.level-normal.data-v-1547c16c{background:#fff7e6;border:2rpx solid #ffd591;color:#fa8c16}.level-badge.level-major.data-v-1547c16c{background:#fff1f0;border:2rpx solid #ffa39e;color:#f5222d}.card-divider.data-v-1547c16c{height:0;margin:20rpx 0;border-top:2rpx dashed #eee}.card-body.data-v-1547c16c{padding:0}.detail-row-v2.data-v-1547c16c{display:flex;align-items:flex-start;justify-content:flex-start;gap:24rpx;padding:18rpx 0}.detail-row-v2--block.data-v-1547c16c{flex-wrap:wrap}.label.data-v-1547c16c{flex-shrink:0;font-size:26rpx;color:#999;line-height:1.5}.value.data-v-1547c16c{flex:1;min-width:0;font-size:26rpx;color:#333;line-height:1.6;text-align:left;word-break:break-all}.value--inline.data-v-1547c16c{display:flex;align-items:center}.area-dot.data-v-1547c16c{width:20rpx;height:20rpx;border-radius:50%;margin-right:12rpx;flex-shrink:0}.level-tag.data-v-1547c16c{display:inline-flex;align-items:center;padding:4rpx 16rpx;border-radius:8rpx;font-size:24rpx;font-weight:500;line-height:1.4;white-space:nowrap}.level-normal.data-v-1547c16c{background:#fff7e6;border:2rpx solid #ffd591;color:#fa8c16}.level-major.data-v-1547c16c{background:#fff1f0;border:2rpx solid #ffa39e;color:#f5222d}.tag-badge.data-v-1547c16c{display:inline-flex;align-items:center;padding:4rpx 16rpx;border-radius:8rpx;font-size:24rpx;background:#eef3ff;border:2rpx solid #aac5fc;color:#2667e9}.attachment-list.data-v-1547c16c{display:flex;flex-wrap:wrap;gap:16rpx;flex:1;min-width:0}.attachment-img.data-v-1547c16c{width:160rpx;height:160rpx;border-radius:12rpx;background:#f5f7fa}.sign-img.data-v-1547c16c{width:300rpx;height:160rpx;border:1rpx solid #e4e7ed;border-radius:8rpx;background:#fafafa;flex:1;min-width:0;max-width:100%}.file-link.data-v-1547c16c{display:inline-block;padding:12rpx 20rpx;background:#f5f7fa;border:1rpx solid #e4e7ed;border-radius:8rpx;color:#2667e9;font-size:24rpx}.result-tag.data-v-1547c16c{padding:6rpx 16rpx;border-radius:6rpx;font-size:24rpx}.result-tag--pass.data-v-1547c16c{background:#f0f9eb;color:#67c23a}.result-tag--fail.data-v-1547c16c{background:#fef0f0;color:#f56c6c}

View File

@@ -0,0 +1 @@
"use strict";const e="submit",t="assign",a="rectify",r="verify",i="writeoff",s={1:"status-blue",2:"status-orange",3:"status-red",4:"status-yellow",5:"status-green"},n={"待交办":"status-blue","待整改":"status-orange","整改中":"status-orange","待验收":"status-red","待销号":"status-yellow","已完成":"status-green","已销号":"status-green"},o={2:"一般隐患",3:"重大隐患"};function m(e,t="-"){if(Array.isArray(e)&&e.length)return e.join("、");if("string"==typeof e&&e.trim()){const t=e.split(/[,,、]/).map((e=>e.trim())).filter(Boolean);return t.length?t.join("、"):e}return t}function c(e,t,a){(t||[]).forEach((t=>{if(!t)return;const s=t.verifyId??t.id;if(null!=s){if(a.has(s))return;a.add(s)}e.push(function(e){return!!e&&(2===e.type||"销号"===e.typeName)}(t)?function(e){return{type:i,nodeName:"销号",titlePrefix:"销号",operator:e.verifierName||"-",time:e.verifyTime||"-",content:{resultName:e.resultName||"-",remark:e.remark||"",attachments:e.attachments||[],signPath:e.signPath||"",writeoffDeptName:e.writeoffDeptName||"-"}}}(t):function(e){return{type:r,nodeName:"验收",titlePrefix:"验收",operator:e.verifierName||"-",time:e.verifyTime||"-",content:{resultName:e.resultName||"-",remark:e.remark||"",attachments:e.attachments||[],signPath:e.signPath||"",verifyDeptName:e.verifyDeptName||"-"}}}(t))}))}exports.generateHazardHistory=function(r){if(!r)return[];const i=[];var s;return i.push({type:e,nodeName:"提交",titlePrefix:"提交",operator:r.reporterName||"-",time:r.createdAt||"-",content:{title:r.title||"-",source:r.source||"-",areaName:r.areaName||"-",areaColor:r.areaColor||"",address:r.address||"-",level:r.level,levelName:r.levelName||(s=r.level,o[s]||"未知"),tagName:r.tagName||"-",description:r.description||"-",attachments:r.attachments||[],legalBasis:r.legalBasis||r.regulationName||"-",reporterPhone:r.reporterPhone||"-",reportDeptName:r.reportDeptName||"-"}}),r.assignFlows&&r.assignFlows.length>0&&r.assignFlows.forEach((e=>{var r;e.assignId&&i.push({type:t,nodeName:"交办",titlePrefix:"交办",operator:e.assignerName||"-",time:e.assignTime||"-",content:{assigneeName:e.assigneeName||"-",deadline:e.deadline||"-",assignDeptName:e.assignDeptName||"-",assignRemark:e.assignRemark||"-",priorityName:e.priorityName||"-"}}),e.rectify&&i.push({type:a,nodeName:"整改",titlePrefix:"整改",operator:e.rectify.rectifierName||"-",time:e.rectify.rectifyTime||"-",content:{rectifyPlan:e.rectify.rectifyPlan||"-",rectifyResult:e.rectify.rectifyResult||"-",rectificationMeasures:e.rectify.rectificationMeasures||"-",controlMeasures:e.rectify.controlMeasures||"-",deadline:e.deadline||"-",rectifierNames:(r=e.rectify,r?Array.isArray(r.rectifierNames)&&r.rectifierNames.length?r.rectifierNames.join("、"):Array.isArray(r.memberNames)&&r.memberNames.length?r.memberNames.join("、"):m(r.rectifierName,"-"):"-"),managerNames:m(e.rectify.managerNames,"-"),planCost:e.rectify.planCost,actualCost:e.rectify.actualCost,attachments:e.rectify.attachments||[],signPath:e.rectify.signPath||"",rectifyStatusName:e.rectify.rectifyStatusName||"-"}});const s=new Set;c(i,e.verifies||[],s),c(i,function(e){return e.writeOffs||e.writeoffs||[]}(e),s)})),i},exports.getStatusClass=function(e,t){return t&&n[t]?n[t]:s[e]||""},exports.getStepIconPath=function(e,t=!1){const a={submit:"tijiao",assign:"jiaoban",rectify:"zhenggai",verify:"yanshou",writeoff:"xiaohao"}[e]||"tijiao";return"zhenggai"===a?t?"/static/yinhuan_detail/zhenggai_selected.png":"/static/yinhuan_detail/zhenggai__unselected.png":`/static/yinhuan_detail/${a}__${t?"selected":"unselected"}.png`};

View File

@@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js"),l=require("./hazardDetail.js");exports.useHazardDetailScroll=function(t,o){const n=e.getCurrentInstance(),u=(null==n?void 0:n.proxy)||n,r=e.ref([]),a=e.ref(0),i=e.ref([0]),c=e.ref(0),s=e.ref(""),v=e.ref(""),d=e.ref(!0),f=e.ref(!1);let h=null;const g=()=>{clearTimeout(h),h=setTimeout((()=>{r.value.length&&e.nextTick$1((()=>{const l=e.index.createSelectorQuery().in(u);l.select(".content-scroll").boundingClientRect(),l.select(".content-scroll").scrollOffset(),l.selectAll(".node-section").boundingClientRect(),l.exec((e=>{const l=null==e?void 0:e[0],t=null==e?void 0:e[1],o=(null==e?void 0:e[2])||[];if(!l||!o.length)return;c.value=l.height||0;const n=(null==t?void 0:t.scrollTop)||0;i.value=o.map((e=>e.top-l.top+n))}))}))}),80)};return e.watch((()=>"function"==typeof o?o():null==o?void 0:o.value),(e=>{e||(g(),setTimeout(g,300))})),e.watch((()=>"function"==typeof t?t():null==t?void 0:t.value),(e=>{return t=e,r.value=l.generateHazardHistory(t),a.value=0,s.value="",g(),void setTimeout(g,300);var t}),{immediate:!0,deep:!0}),e.watch(a,(e=>{v.value="hazard-step-"+e,setTimeout((()=>{v.value=""}),300)})),e.watch((()=>r.value.length),(()=>g())),e.onReady((()=>{g(),setTimeout(g,300)})),{historyList:r,activeIndex:a,contentScrollIntoView:s,stepScrollIntoView:v,scrollWithAnimation:d,onContentScroll:e=>{if(f.value)return;const{scrollTop:l=0,scrollHeight:t=0}=e.detail||{};((e,l=0)=>{const t=r.value.length;if(!t)return;if(l>0&&c.value>0&&e+c.value>=l-60)return void(a.value!==t-1&&(a.value=t-1));const o=i.value;if(!o.length)return;let n=0;for(let u=o.length-1;u>=0;u--)if(e>=o[u]-80){n=u;break}n!==a.value&&(a.value=n)})(l,t),g()},onScrollToLower:()=>{const e=r.value.length;e>0&&a.value!==e-1&&(a.value=e-1)},scrollToNode:e=>{e<0||e>=r.value.length||(f.value=!0,d.value=!0,a.value=e,s.value="hazard-node-"+e,setTimeout((()=>{s.value="",f.value=!1,g()}),350))},scheduleMeasureLayout:g}};

View File

@@ -0,0 +1 @@
"use strict";const e=require("../../../../common/vendor.js");Math||o();const o=()=>"../wd-icon/wd-icon.js",n=e.defineComponent({name:"wd-button",options:{addGlobalClass:!0,virtualHost:!0,styleIsolation:"shared"},props:e.buttonProps,emits:["click","getuserinfo","contact","getphonenumber","getrealtimephonenumber","error","launchapp","opensetting","chooseavatar","agreeprivacyauthorization"],setup(o,{emit:n}){const a=o,t=n,i=e.ref(20),s=e.ref(70),r=e.ref(""),c=e.computed((()=>`background-image: url(${r.value});`)),l=e.computed((()=>a.disabled||a.loading?void 0:a.openType));function d(e){a.disabled||a.loading||t("click",e)}function u(e){"phoneNumber"===a.scope?g(e):"userInfo"===a.scope&&p(e)}function p(e){t("getuserinfo",e.detail)}function f(e){t("contact",e.detail)}function g(e){t("getphonenumber",e.detail)}function m(e){t("getrealtimephonenumber",e.detail)}function b(e){t("error",e.detail)}function h(e){t("launchapp",e.detail)}function v(e){t("opensetting",e.detail)}function w(e){t("chooseavatar",e.detail)}function k(e){t("agreeprivacyauthorization",e.detail)}return e.watch((()=>a.loading),(()=>{!function(){const{loadingColor:o,type:n,plain:t}=a;let i=o;if(!i)switch(n){case"primary":i="#4D80F0";break;case"success":i="#34d19d";break;case"info":case"default":i="#333";break;case"warning":i="#f0883a";break;case"error":i="#fa4350"}const s=((e="#4D80F0",o=!0)=>`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 42 42"><defs><linearGradient x1="100%" y1="0%" x2="0%" y2="0%" id="a"><stop stop-color="${o?e:"#fff"}" offset="0%" stop-opacity="0"/><stop stop-color="${o?e:"#fff"}" offset="100%"/></linearGradient></defs><g fill="none" fill-rule="evenodd"><path d="M21 1c11.046 0 20 8.954 20 20s-8.954 20-20 20S1 32.046 1 21 9.954 1 21 1zm0 7C13.82 8 8 13.82 8 21s5.82 13 13 13 13-5.82 13-13S28.18 8 21 8z" fill="${o?"#fff":e}"/><path d="M4.599 21c0 9.044 7.332 16.376 16.376 16.376 9.045 0 16.376-7.332 16.376-16.376" stroke="url(#a)" stroke-width="3.5" stroke-linecap="round"/></g></svg>`)(i,!t);r.value=`"data:image/svg+xml;base64,${e.encode(s)}"`}()}),{deep:!0,immediate:!0}),(o,n)=>e.e({a:o.loading},o.loading?{b:e.s(c.value)}:o.icon?{d:e.p({"custom-class":"wd-button__icon",name:o.icon,classPrefix:o.classPrefix})}:{},{c:o.icon,e:e.gei(o,o.buttonId),f:""+(o.disabled||o.loading?"":"wd-button--active"),g:e.s(o.customStyle),h:e.n("is-"+o.type),i:e.n("is-"+o.size),j:e.n(o.round?"is-round":""),k:e.n(o.hairline?"is-hairline":""),l:e.n(o.plain?"is-plain":""),m:e.n(o.disabled?"is-disabled":""),n:e.n(o.block?"is-block":""),o:e.n(o.loading?"is-loading":""),p:e.n(o.customClass),q:i.value,r:s.value,s:l.value,t:o.sendMessageTitle,v:o.sendMessagePath,w:o.sendMessageImg,x:o.appParameter,y:o.showMessageCard,z:o.sessionFrom,A:o.lang,B:o.hoverStopPropagation,C:o.scope,D:e.o(d),E:e.o(u),F:e.o(p),G:e.o(f),H:e.o(g),I:e.o(m),J:e.o(b),K:e.o(h),L:e.o(v),M:e.o(w),N:e.o(k)})}}),a=e._export_sfc(n,[["__scopeId","data-v-161f130c"]]);wx.createComponent(a);

View File

@@ -0,0 +1,6 @@
{
"component": true,
"usingComponents": {
"wd-icon": "../wd-icon/wd-icon"
}
}

View File

@@ -0,0 +1 @@
<button id="{{e}}" hover-class="{{f}}" style="{{g + ';' + virtualHostStyle}}" class="{{['data-v-161f130c', 'wd-button', h, i, j, k, l, m, n, o, p, virtualHostClass]}}" hover-start-time="{{q}}" hover-stay-time="{{r}}" open-type="{{s}}" send-message-title="{{t}}" send-message-path="{{v}}" send-message-img="{{w}}" app-parameter="{{x}}" show-message-card="{{y}}" session-from="{{z}}" lang="{{A}}" hover-stop-propagation="{{B}}" scope="{{C}}" bindtap="{{D}}" bindgetAuthorize="{{E}}" bindgetuserinfo="{{F}}" bindcontact="{{G}}" bindgetphonenumber="{{H}}" bindgetrealtimephonenumber="{{I}}" binderror="{{J}}" bindlaunchapp="{{K}}" bindopensetting="{{L}}" bindchooseavatar="{{M}}" bindagreeprivacyauthorization="{{N}}" hidden="{{virtualHostHidden || false}}"><view class="wd-button__content data-v-161f130c"><view wx:if="{{a}}" class="wd-button__loading data-v-161f130c"><view class="wd-button__loading-svg data-v-161f130c" style="{{b}}"></view></view><wd-icon wx:elif="{{c}}" class="data-v-161f130c" virtualHostClass="data-v-161f130c" u-i="161f130c-0" bind:__l="__l" u-p="{{d}}"></wd-icon><view class="wd-button__text data-v-161f130c"><slot/></view></view></button>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
"use strict";const e=require("../../../../common/vendor.js"),o=e.defineComponent({name:"wd-icon",options:{virtualHost:!0,addGlobalClass:!0,styleIsolation:"shared"},props:e.iconProps,emits:["click","touch"],setup(o,{emit:t}){const s=o,c=t,n=e.computed((()=>e.isDef(s.name)&&s.name.includes("/"))),a=e.computed((()=>{const e=s.classPrefix;return`${e} ${s.customClass} ${n.value?"wd-icon--image":e+"-"+s.name}`})),i=e.computed((()=>{const o={};return s.color&&(o.color=s.color),s.size&&(o["font-size"]=e.addUnit(s.size)),`${e.objToStyle(o)} ${s.customStyle}`}));function l(e){c("click",e)}return(o,t)=>e.e({a:n.value},n.value?{b:o.name}:{},{c:e.o(l),d:e.n(a.value),e:e.s(i.value),f:e.gei(o,"")})}}),t=e._export_sfc(o,[["__scopeId","data-v-bef80b7c"]]);wx.createComponent(t);

View File

@@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

View File

@@ -0,0 +1 @@
<view bindtap="{{c}}" class="{{['data-v-bef80b7c', d, virtualHostClass]}}" style="{{e + ';' + virtualHostStyle}}" hidden="{{virtualHostHidden || false}}" id="{{f}}"><image wx:if="{{a}}" class="wd-icon__image data-v-bef80b7c" src="{{b}}"></image></view>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,6 @@
{
"component": true,
"usingComponents": {
"wd-button": "../wd-button/wd-button"
}
}

View File

@@ -0,0 +1 @@
<view class="{{['wd-signature', 'data-v-5e53ec40', virtualHostClass]}}" style="{{virtualHostStyle}}" hidden="{{virtualHostHidden || false}}" id="{{y}}"><view class="wd-signature__content data-v-5e53ec40"><block wx:if="{{r0}}"><canvas class="wd-signature__content-canvas data-v-5e53ec40" style="{{a}}" width="{{b}}" height="{{c}}" canvas-id="{{d}}" id="{{e}}" disable-scroll="{{f}}" bindtouchstart="{{g}}" bindtouchend="{{h}}" bindtouchmove="{{i}}" type="2d"/></block></view><view class="wd-signature__footer data-v-5e53ec40"><block wx:if="{{$slots.footer}}"><slot name="footer"></slot></block><block wx:else><block wx:if="{{j}}"><wd-button wx:if="{{m}}" class="data-v-5e53ec40" virtualHostClass="data-v-5e53ec40" u-s="{{['d']}}" bindclick="{{l}}" u-i="5e53ec40-0" bind:__l="__l" u-p="{{m}}">{{k}}</wd-button><wd-button wx:if="{{p}}" class="data-v-5e53ec40" virtualHostClass="data-v-5e53ec40" u-s="{{['d']}}" bindclick="{{o}}" u-i="5e53ec40-1" bind:__l="__l" u-p="{{p}}">{{n}}</wd-button></block><wd-button wx:if="{{s}}" class="data-v-5e53ec40" virtualHostClass="data-v-5e53ec40" u-s="{{['d']}}" bindclick="{{r}}" u-i="5e53ec40-2" bind:__l="__l" u-p="{{s}}">{{q}}</wd-button><wd-button wx:if="{{w}}" class="data-v-5e53ec40" virtualHostClass="data-v-5e53ec40" u-s="{{['d']}}" bindclick="{{v}}" u-i="5e53ec40-3" bind:__l="__l" u-p="{{w}}">{{t}}</wd-button></block></view></view>

View File

@@ -0,0 +1 @@
.wd-signature__content.data-v-5e53ec40{justify-content:center;align-items:center;display:flex;overflow:hidden;background:var(--wot-signature-bg, var(--wot-color-white, white));border-radius:var(--wot-signature-radius, 4px);border:var(--wot-signature-border, 1px solid var(--wot-color-gray-5, #c8c9cc))}.wd-signature__content-canvas.data-v-5e53ec40{width:100%}.wd-signature__footer.data-v-5e53ec40{margin-top:var(--wot-signature-footer-margin-top, 8px);justify-content:flex-end;display:flex}.wd-signature__footer.data-v-5e53ec40 .wd-button{margin-left:var(--wot-signature-button-margin-left, 8px)}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,8 @@
{
"navigationBarTitleText": "证件照管理",
"usingComponents": {
"u-popup": "../../uni_modules/uview-plus/components/u-popup/u-popup",
"u-datetime-picker": "../../uni_modules/uview-plus/components/u-datetime-picker/u-datetime-picker",
"u-modal": "../../uni_modules/uview-plus/components/u-modal/u-modal"
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.page.data-v-5f64e04d{min-height:100vh;background:#ebf2fc;padding-bottom:120rpx}.license-list.data-v-5f64e04d{padding-bottom:20rpx}.license-item.data-v-5f64e04d{background:#fff;border-radius:16rpx;padding:24rpx;margin-bottom:20rpx;box-shadow:0 2rpx 12rpx rgba(0,0,0,.05)}.license-header.data-v-5f64e04d{display:flex;justify-content:space-between;align-items:center;margin-bottom:16rpx;padding-bottom:16rpx;border-bottom:1rpx solid #f0f0f0}.license-type.data-v-5f64e04d{font-size:32rpx;font-weight:700;color:#333}.license-actions.data-v-5f64e04d{display:flex;gap:20rpx}.action-btn.data-v-5f64e04d{font-size:28rpx;padding:8rpx 16rpx}.license-detail.data-v-5f64e04d{margin-bottom:16rpx}.detail-row.data-v-5f64e04d{display:flex;margin-bottom:12rpx;font-size:28rpx}.detail-row .label.data-v-5f64e04d{color:#999;width:160rpx;flex-shrink:0}.detail-row .value.data-v-5f64e04d{color:#333;flex:1}.license-photo.data-v-5f64e04d{width:200rpx;height:150rpx;border-radius:8rpx;overflow:hidden}.license-photo image.data-v-5f64e04d{width:100%;height:100%}.empty-state.data-v-5f64e04d{padding:200rpx 0;text-align:center}.add-btn.data-v-5f64e04d{position:fixed;bottom:40rpx;left:30rpx;right:30rpx;height:88rpx;line-height:88rpx;border-radius:44rpx;font-size:32rpx}.popup-content.data-v-5f64e04d{width:600rpx;background:#fff;border-radius:20rpx;padding:30rpx}.popup-header.data-v-5f64e04d{display:flex;justify-content:space-between;align-items:center;margin-bottom:30rpx}.popup-title.data-v-5f64e04d{font-size:34rpx;color:#333}.popup-close.data-v-5f64e04d{font-size:48rpx;color:#999;line-height:1}.popup-body.data-v-5f64e04d{max-height:700rpx;overflow-y:auto}.form-item.data-v-5f64e04d{margin-bottom:24rpx}.form-label.data-v-5f64e04d{font-size:28rpx;color:#333;margin-bottom:12rpx}.form-input.data-v-5f64e04d{width:100%;height:80rpx;border:2rpx solid #E5E5E5;border-radius:12rpx;padding:0 24rpx;font-size:28rpx;box-sizing:border-box}.form-select.data-v-5f64e04d{display:flex;align-items:center;line-height:80rpx}.upload-box.data-v-5f64e04d{width:200rpx;height:200rpx;border:2rpx dashed #ccc;border-radius:12rpx;display:flex;align-items:center;justify-content:center;position:relative}.upload-add.data-v-5f64e04d{display:flex;flex-direction:column;align-items:center}.upload-icon.data-v-5f64e04d{font-size:60rpx;color:#999}.upload-text.data-v-5f64e04d{font-size:24rpx;color:#999;margin-top:8rpx}.upload-preview.data-v-5f64e04d{width:100%;height:100%;position:relative}.upload-img.data-v-5f64e04d{width:100%;height:100%;border-radius:12rpx}.upload-delete.data-v-5f64e04d{position:absolute;top:-16rpx;right:-16rpx;width:40rpx;height:40rpx;background:#ff4d4f;color:#fff;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:28rpx}.popup-footer.data-v-5f64e04d{display:flex;justify-content:center;gap:30rpx;margin-top:40rpx}.btn-cancel.data-v-5f64e04d{flex:1;height:80rpx;line-height:80rpx;border:2rpx solid #E5E5E5;border-radius:40rpx;background:#fff;color:#333;font-size:30rpx}.btn-confirm.data-v-5f64e04d{flex:1;height:80rpx;line-height:80rpx;border-radius:40rpx;color:#fff;font-size:30rpx}.dept-popup.data-v-5f64e04d{width:600rpx;background:#fff;border-radius:20rpx;padding:30rpx}.dept-list.data-v-5f64e04d{max-height:400rpx;overflow-y:auto;margin-bottom:30rpx}.dept-item.data-v-5f64e04d{display:flex;align-items:center;padding:24rpx;border:2rpx solid #E5E5E5;border-radius:12rpx;margin-bottom:16rpx}.dept-checkbox.data-v-5f64e04d{width:36rpx;height:36rpx;border:2rpx solid #ccc;border-radius:6rpx;margin-right:20rpx;display:flex;align-items:center;justify-content:center;flex-shrink:0}.dept-checkbox-active.data-v-5f64e04d{background:#2667e9;border-color:#2667e9;color:#fff}.dept-name.data-v-5f64e04d{font-size:28rpx;color:#333}.btn-dept-confirm.data-v-5f64e04d{width:100%;height:80rpx;line-height:80rpx;border-radius:40rpx;color:#fff;font-size:30rpx}

View File

@@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js"),r={};const n=e._export_sfc(r,[["render",function(r,n){return{a:e.gei(r,"")}}]]);wx.createPage(n);

View File

@@ -0,0 +1,4 @@
{
"navigationBarTitleText": "检查清单",
"usingComponents": {}
}

View File

@@ -0,0 +1 @@
<view class="{{['padding', virtualHostClass]}}" style="{{virtualHostStyle}}" hidden="{{virtualHostHidden || false}}" id="{{a}}"><view class="text-bold text-black">检查清单预览</view><view class="flex margin-bottom"><view class="text-gray">计划名称:</view><view>和谐矿业每日巡检</view></view><view class="flex margin-bottom"><view class="text-gray">检查时间:</view><view>2025-11-19 10:18:40</view></view><view class="flex margin-bottom"><view class="text-gray">检查人员:</view><view>18174379303</view></view><image></image><view class="flex margin-bottom"><view>被检查单位:</view><view></view></view><view class="flex margin-bottom"><view>检查人员:</view><view></view></view><view class="flex margin-bottom"><view>上次检查情况:</view><view></view></view><view class="flex margin-bottom"><view>本次检查情况:</view><view></view></view><view class="flex margin-bottom"><view>检查日期:</view><view>2025-11-19 10:18:40</view></view><view class="flex justify-between"><view class="flex text-center align-center"><button class="bg-blue">缩小</button><view>50%</view><button class="bg-blue">放大</button></view><button class="lg cu-btn">重置</button></view></view>

View File

@@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js"),c={__name:"Inspectionlog",setup:c=>(c,s)=>({a:e.o((c=>{e.index.navigateTo({url:"/pages/Inspectionchecklist/Inspectionchecklist"})})),b:e.gei(c,"")})},s=e._export_sfc(c,[["__scopeId","data-v-fa142cd8"]]);wx.createPage(s);

View File

@@ -0,0 +1,4 @@
{
"navigationBarTitleText": "检查记录",
"usingComponents": {}
}

View File

@@ -0,0 +1 @@
<view class="{{['page', 'padding', 'data-v-fa142cd8', virtualHostClass]}}" style="{{virtualHostStyle}}" hidden="{{virtualHostHidden || false}}" id="{{b}}"><view class="padding bg-white radius list data-v-fa142cd8"><view class="text-bold margin-bottom text-black data-v-fa142cd8">和谐矿业每日巡检</view><view class="flex margin-bottom data-v-fa142cd8"><view class="text-gray data-v-fa142cd8">检查时间:</view><view class="data-v-fa142cd8">2025-11-19 10:18:40</view></view><view class="flex margin-bottom data-v-fa142cd8"><view class="text-gray data-v-fa142cd8">检查人员:</view><view class="data-v-fa142cd8">18174379303</view></view><view class="flex margin-bottom data-v-fa142cd8"><view class="text-gray data-v-fa142cd8">隐患数量:</view><view class="data-v-fa142cd8">1</view></view><view class="flex margin-bottom data-v-fa142cd8"><view class="text-gray data-v-fa142cd8">备注:</view><view class="data-v-fa142cd8">可以</view></view><view class="flex justify-between data-v-fa142cd8"><view class="data-v-fa142cd8"></view><button class="bg-blue round cu-btn lg data-v-fa142cd8" bindtap="{{a}}">预览清单</button></view></view></view>

View File

@@ -0,0 +1 @@
.page.data-v-fa142cd8{min-height:100vh;background:#ebf2fc}.list.data-v-fa142cd8{background:#fff;box-shadow:0 2rpx 6rpx 2rpx rgba(0,0,0,.08);border-left:5px solid #2667E9;border-radius:20rpx;padding:20rpx}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,9 @@
{
"navigationBarTitleText": "检查结果",
"usingComponents": {
"u-radio": "../../uni_modules/uview-plus/components/u-radio/u-radio",
"u-radio-group": "../../uni_modules/uview-plus/components/u-radio-group/u-radio-group",
"up-textarea": "../../uni_modules/uview-plus/components/u-textarea/u-textarea",
"hazard-form-popup": "../../components/hazard/HazardFormPopup"
}
}

View File

@@ -0,0 +1 @@
<view class="{{['page', 'padding', 'data-v-8e75359a', virtualHostClass]}}" style="{{virtualHostStyle}}" hidden="{{virtualHostHidden || false}}" id="{{J}}"><view wx:if="{{a}}" class="progress-bar data-v-8e75359a"><view class="progress-text data-v-8e75359a"><text class="current-index data-v-8e75359a">第 {{b}} 个问题</text><text class="total-count data-v-8e75359a"> / 共 {{c}} 个</text></view><view class="progress-line data-v-8e75359a"><view class="progress-inner data-v-8e75359a" style="{{'width:' + d}}"></view></view></view><view class="padding bg-white radius data-v-8e75359a"><view class="text-bold data-v-8e75359a">{{e}}</view><view class="margin-top data-v-8e75359a"><rich-text class="data-v-8e75359a" nodes="{{f}}"></rich-text></view><view class="margin-top data-v-8e75359a"><u-radio-group wx:if="{{j}}" class="data-v-8e75359a" virtualHostClass="data-v-8e75359a" u-s="{{['d']}}" bindchange="{{h}}" u-i="8e75359a-0" bind:__l="__l" bindupdateModelValue="{{i}}" u-p="{{j}}"><u-radio wx:for="{{g}}" wx:for-item="item" wx:key="a" class="data-v-8e75359a" virtualHostClass="data-v-8e75359a" bindchange="{{item.b}}" u-i="{{item.c}}" bind:__l="__l" u-p="{{item.d}}"></u-radio></u-radio-group></view><view wx:if="{{k}}" class="hazard-section margin-top data-v-8e75359a"><view class="hazard-tip data-v-8e75359a"><text class="cuIcon-warn text-yellow margin-right-xs data-v-8e75359a"></text><text class="text-orange data-v-8e75359a">检查结果为异常,需填写隐患信息</text></view><view wx:if="{{l}}" class="hazard-btn data-v-8e75359a" bindtap="{{m}}"><text class="text-blue data-v-8e75359a">填写隐患信息</text></view><view wx:else class="hazard-card data-v-8e75359a"><view class="card-header data-v-8e75359a"><view class="text-bold text-black data-v-8e75359a">{{n}}</view><view class="{{['level-tag', 'data-v-8e75359a', p && 'level-minor', q && 'level-normal', r && 'level-major']}}">{{o}}</view></view><view class="card-body data-v-8e75359a"><view class="info-row data-v-8e75359a"><text class="text-gray data-v-8e75359a">检查形式:</text><text class="data-v-8e75359a">{{s}}</text></view><view class="info-row data-v-8e75359a"><text class="text-gray data-v-8e75359a">隐患位置:</text><text class="data-v-8e75359a">{{t}}</text></view><view class="info-row data-v-8e75359a"><text class="text-gray data-v-8e75359a">隐患描述:</text><text class="description-text data-v-8e75359a">{{v}}</text></view><view wx:if="{{w}}" class="info-row data-v-8e75359a"><text class="text-gray data-v-8e75359a">附件:</text><text class="data-v-8e75359a">{{x}}个文件</text></view></view><view class="card-footer data-v-8e75359a"><button class="btn-edit data-v-8e75359a" bindtap="{{y}}">修改</button><button class="btn-clear data-v-8e75359a" bindtap="{{z}}">清除</button></view></view></view><view class="margin-top data-v-8e75359a"><up-textarea wx:if="{{B}}" class="data-v-8e75359a" virtualHostClass="data-v-8e75359a" u-i="8e75359a-2" bind:__l="__l" bindupdateModelValue="{{A}}" u-p="{{B}}"></up-textarea></view></view><button class="bg-blue round margin-top-xl data-v-8e75359a" bindtap="{{C}}">提交</button><hazard-form-popup wx:if="{{I}}" class="r data-v-8e75359a" virtualHostClass="r data-v-8e75359a" u-r="hazardFormRef" bindconfirm="{{E}}" bindclearDraft="{{F}}" u-i="8e75359a-3" bind:__l="__l" bindupdateShow="{{G}}" bindupdateModelValue="{{H}}" u-p="{{I}}"/></view>

View File

@@ -0,0 +1 @@
.page.data-v-8e75359a{min-height:100vh;background:#ebf2fc}.progress-bar.data-v-8e75359a{background:#fff;border-radius:12rpx;padding:24rpx;margin-bottom:20rpx;box-shadow:0 2rpx 12rpx rgba(0,0,0,.05)}.progress-text.data-v-8e75359a{display:flex;align-items:baseline;margin-bottom:16rpx}.progress-text .current-index.data-v-8e75359a{font-size:32rpx;font-weight:700;color:#2667e9}.progress-text .total-count.data-v-8e75359a{font-size:28rpx;color:#999}.progress-line.data-v-8e75359a{height:12rpx;background:#e5e5e5;border-radius:6rpx;overflow:hidden}.progress-inner.data-v-8e75359a{height:100%;background:linear-gradient(90deg,#2667e9,#5b9bff);border-radius:6rpx;transition:width .3s ease}.hazard-section.data-v-8e75359a{border-top:1rpx solid #eee;padding-top:20rpx}.hazard-tip.data-v-8e75359a{display:flex;align-items:center;padding:16rpx 20rpx;background:#fff7e6;border:1rpx solid #FFE7BA;border-radius:8rpx;margin-bottom:20rpx}.hazard-tip .text-orange.data-v-8e75359a{color:#fa8c16;font-size:26rpx}.hazard-btn.data-v-8e75359a{display:flex;align-items:center;justify-content:center;height:88rpx;border:2rpx dashed #2667E9;border-radius:12rpx;background:#f5f9ff}.hazard-btn .text-blue.data-v-8e75359a{color:#2667e9;font-size:28rpx}.hazard-card.data-v-8e75359a{background:#f5f9ff;border:1rpx solid #D6E4FF;border-radius:12rpx;overflow:hidden}.hazard-card .card-header.data-v-8e75359a{display:flex;justify-content:space-between;align-items:center;padding:20rpx;border-bottom:1rpx solid #E8E8E8;background:#fff}.hazard-card .card-body.data-v-8e75359a{padding:20rpx}.hazard-card .card-body .info-row.data-v-8e75359a{display:flex;margin-bottom:12rpx;font-size:26rpx}.hazard-card .card-body .info-row.data-v-8e75359a:last-child{margin-bottom:0}.hazard-card .card-body .info-row .text-gray.data-v-8e75359a{flex-shrink:0;color:#999}.hazard-card .card-body .info-row .description-text.data-v-8e75359a{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.hazard-card .card-footer.data-v-8e75359a{display:flex;border-top:1rpx solid #E8E8E8;background:#fff}.hazard-card .card-footer button.data-v-8e75359a{flex:1;height:80rpx;line-height:80rpx;font-size:28rpx;border-radius:0}.hazard-card .card-footer button.data-v-8e75359a:after{border:none}.hazard-card .card-footer .btn-edit.data-v-8e75359a{background:#fff;color:#2667e9;border-right:1rpx solid #E8E8E8}.hazard-card .card-footer .btn-clear.data-v-8e75359a{background:#fff;color:#f56c6c}.level-tag.data-v-8e75359a{padding:4rpx 16rpx;border-radius:8rpx;font-size:24rpx}.level-minor.data-v-8e75359a{background:#f6ffed;border:2rpx solid #B7EB8F;color:#52c41a}.level-normal.data-v-8e75359a{background:#fff7e6;border:2rpx solid #FFD591;color:#fa8c16}.level-major.data-v-8e75359a{background:#fff1f0;border:2rpx solid #FFA39E;color:#f5222d}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
{
"navigationBarTitleText": "排查详情",
"usingComponents": {
"up-icon": "../../uni_modules/uview-plus/components/u-icon/u-icon",
"u-radio": "../../uni_modules/uview-plus/components/u-radio/u-radio",
"u-radio-group": "../../uni_modules/uview-plus/components/u-radio-group/u-radio-group",
"up-textarea": "../../uni_modules/uview-plus/components/u-textarea/u-textarea",
"u-popup": "../../uni_modules/uview-plus/components/u-popup/u-popup",
"hazard-form-popup": "../../components/hazard/HazardFormPopup"
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js"),a=require("../../request/api.js");if(!Array){e.resolveComponent("u-navbar")()}Math;const t={__name:"list",setup(t){const n=e.ref(!0),o=e.ref([]),l=e.ref(""),s=e.ref(""),r={pageNum:1,pageSize:100,name:""},i=e=>e?String(e).split(" ")[0]:"",u=e=>{const a=Number(e);return Number.isNaN(a)?0:Math.min(100,Math.max(0,a))};e.onLoad((e=>{e.tableId&&(l.value=e.tableId),e.name&&(s.value=decodeURIComponent(e.name))})),e.onShow((()=>{(async()=>{var t;if(!l.value)return n.value=!1,void(o.value=[]);n.value=!0;try{const s=await a.getPlanTableDetail({...r,tableId:l.value});0===s.code?o.value=(null==(t=s.data)?void 0:t.records)||[]:e.index.showToast({title:s.msg||"获取检查清单失败",icon:"none"})}catch(s){console.error("获取检查清单失败:",s),e.index.showToast({title:"获取检查清单失败",icon:"none"})}finally{n.value=!1}})()}));const d=()=>{e.index.switchTab({url:"/pages/index/index"})};return e.onBackPress((()=>(d(),!0))),(a,t)=>e.e({a:e.o(d),b:e.p({title:"检查列表",placeholder:!0,safeAreaInsetTop:!0,bgColor:"#3375e6",titleColor:"#ffffff",leftIconColor:"#ffffff",autoBack:!1}),c:n.value},n.value?{}:l.value?0===o.value.length?{}:{f:e.f(o.value,((a,t,n)=>e.e({a:e.t(a.name||s.value||"检查任务"),b:e.t(a.runModeName),c:e.t(a.cycle),d:a.taskDate},a.taskDate?{e:e.t(i(a.taskDate))}:{},{f:e.t(i(a.planStartTime)),g:e.t(i(a.planEndTime)),h:u(a.progress)+"%",i:e.t(u(a.progress)),j:e.t(a.totalCount??0),k:e.t(a.pendingCount??0),l:e.t(a.unusualNum??0),m:e.t(a.finishedCount??0),n:e.o((t=>(a=>{const t=a.id,n=i(a.taskDate);if(!t||!n)return void e.index.showToast({title:"缺少任务参数",icon:"none"});const o=a.name||s.value||"",r=l.value?`&tableId=${l.value}`:"";e.index.navigateTo({url:`/pages/Inspectionresult/detail?oneTableId=${t}&taskDate=${encodeURIComponent(n)}&name=${encodeURIComponent(o)}${r}`})})(a)),a.id||a.taskDate),o:a.id||a.taskDate})))}:{},{d:!l.value,e:0===o.value.length,g:e.gei(a,"")})}},n=e._export_sfc(t,[["__scopeId","data-v-ea20e208"]]);wx.createPage(n);

View File

@@ -0,0 +1,7 @@
{
"navigationStyle": "custom",
"navigationBarTitleText": "检查列表",
"usingComponents": {
"u-navbar": "../../uni_modules/uview-plus/components/u-navbar/u-navbar"
}
}

View File

@@ -0,0 +1 @@
<view class="{{['page', 'data-v-ea20e208', virtualHostClass]}}" style="{{virtualHostStyle}}" hidden="{{virtualHostHidden || false}}" id="{{g}}"><u-navbar wx:if="{{b}}" class="data-v-ea20e208" virtualHostClass="data-v-ea20e208" bindleftClick="{{a}}" u-i="ea20e208-0" bind:__l="__l" u-p="{{b}}"/><view class="page-content padding data-v-ea20e208"><view wx:if="{{c}}" class="empty-tip text-gray text-center padding data-v-ea20e208">加载中...</view><view wx:elif="{{d}}" class="empty-tip text-gray text-center padding data-v-ea20e208"> 请从首页检查计划进入 </view><view wx:elif="{{e}}" class="empty-tip text-gray text-center padding data-v-ea20e208"> 暂无检查任务 </view><block wx:else><view wx:for="{{f}}" wx:for-item="item" wx:key="o" class="plan-card margin-bottom data-v-ea20e208"><view class="plan-header data-v-ea20e208"><text class="plan-header-title data-v-ea20e208">{{item.a}}</text></view><view class="plan-body data-v-ea20e208"><view class="flex data-v-ea20e208"><view class="border-border margin-right-xs data-v-ea20e208">{{item.b}}完成</view><view class="border-border data-v-ea20e208">{{item.c}}</view></view><view wx:if="{{item.d}}" class="flex text-gray margin-top data-v-ea20e208"><view class="data-v-ea20e208">任务日期:</view><view class="data-v-ea20e208" style="color:#333333">{{item.e}}</view></view><view class="flex text-gray margin-top data-v-ea20e208"><view class="data-v-ea20e208">计划时间:</view><view class="data-v-ea20e208" style="color:#333333">{{item.f}}至{{item.g}}</view></view><view class="flex margin-top align-center data-v-ea20e208"><view class="data-v-ea20e208" style="color:#B5B5B5">完成进度:</view><view class="flex align-center margin-left-sm data-v-ea20e208"><view class="cu-progress round data-v-ea20e208"><view class="bg-green data-v-ea20e208" style="{{'width:' + item.h}}"></view></view><text class="margin-left-sm data-v-ea20e208">{{item.i}}%</text></view></view><view class="plan-stats margin-top data-v-ea20e208"><view class="plan-stat-item data-v-ea20e208"><view class="plan-stat-num text-orange data-v-ea20e208">{{item.j}}</view><view class="plan-stat-label data-v-ea20e208">总检项</view></view><view class="plan-stat-item data-v-ea20e208"><view class="plan-stat-num text-yellow data-v-ea20e208">{{item.k}}</view><view class="plan-stat-label data-v-ea20e208">待排查</view></view><view class="plan-stat-item data-v-ea20e208"><view class="plan-stat-num text-red data-v-ea20e208">{{item.l}}</view><view class="plan-stat-label data-v-ea20e208">异常数</view></view><view class="plan-stat-item data-v-ea20e208"><view class="plan-stat-num text-blue data-v-ea20e208">{{item.m}}</view><view class="plan-stat-label data-v-ea20e208">已完成</view></view></view><view class="margin-top margin-bottom flex justify-end data-v-ea20e208"><button class="cu-btn round lg bg-blue data-v-ea20e208" catchtap="{{item.n}}"> 检查处置 </button></view></view></view></block></view></view>

View File

@@ -0,0 +1 @@
.page.data-v-ea20e208{min-height:100vh;background:#ebf2fc}.empty-tip.data-v-ea20e208{font-size:28rpx}.plan-card.data-v-ea20e208{border-radius:16rpx;overflow:hidden;box-shadow:0 2rpx 6rpx 2rpx rgba(0,0,0,.06)}.plan-header.data-v-ea20e208{background:linear-gradient(135deg,#4a90e2,#2667e9);padding:24rpx 30rpx;display:flex;align-items:center}.plan-header .plan-header-title.data-v-ea20e208{color:#fff;font-size:30rpx;font-weight:700}.plan-body.data-v-ea20e208{padding:24rpx 30rpx 10rpx;background:#fff}.plan-stats.data-v-ea20e208{display:flex;background:#f5f7fa;border-radius:12rpx;border:1rpx solid #E8ECF0;overflow:hidden}.plan-stats .plan-stat-item.data-v-ea20e208{flex:1;text-align:center;padding:20rpx 0;border-right:1rpx solid #E8ECF0}.plan-stats .plan-stat-item.data-v-ea20e208:last-child{border-right:none}.plan-stats .plan-stat-num.data-v-ea20e208{font-size:36rpx;font-weight:700}.plan-stats .plan-stat-label.data-v-ea20e208{font-size:24rpx;color:#666;margin-top:8rpx}.cu-progress.data-v-ea20e208{width:300rpx;height:20rpx;background:#ebeef5;border-radius:100rpx;overflow:hidden}.cu-progress view.data-v-ea20e208{height:100%;border-radius:100rpx;transition:width .3s ease}.bg-green.data-v-ea20e208{background:#2667e9}.border-border.data-v-ea20e208{padding:10rpx;background:#eef3ff;border-radius:4rpx;border:2rpx solid #AAC5FC;text-align:center;display:flex;justify-content:center;align-items:center;font-size:28rpx;color:#2667e9}

View File

@@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js"),t=require("../../common/assets.js"),a=require("../../request/api.js");if(!Array){(e.resolveComponent("up-datetime-picker")+e.resolveComponent("up-input")+e.resolveComponent("u-loadmore"))()}Math||((()=>"../../uni_modules/uview-plus/components/u-datetime-picker/u-datetime-picker.js")+(()=>"../../uni_modules/uview-plus/components/u-input/u-input.js")+(()=>"../../uni_modules/uview-plus/components/u-loadmore/u-loadmore.js"))();const o={__name:"Inspectionwarning",setup(o){const l=e.reactive({startDate:"",endDate:"",deptName:""}),u=e.ref(!1),s=e.ref(!1),n=e.ref(Number(new Date)),r=e.ref(Number(new Date)),d=e.reactive({total:0,overdue:0,pending:0,completed:0,overdueCompleted:0,onTimeCompleted:0});e.reactive({total:0,overdue:0,completed:0,pending:0});const i=e.ref([]),v=e.ref(1),c=e.ref(20),m=e.ref("loadmore"),p=e.ref([{label:"全部状态",value:0,count:null},{label:"逾期未检",value:1,count:null},{label:"严重逾期",value:2,count:null},{label:"期限内待检",value:3,count:null},{label:"逾期已完成",value:4,count:null},{label:"按期已完成",value:5,count:null}]),g=e.ref(0),f=e=>{const t=new Date(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")}`},D=e=>{const t=f(e.value);l.startDate=t,u.value=!1},h=e=>{const t=f(e.value);l.endDate=t,s.value=!1},N=e=>{if(!e||"按期"===e)return"status-normal";const t=parseInt(e);return t>=7?"status-serious":t>=1?"status-overdue":"status-normal"},b=(e,t)=>{if(!e||"按期"===e)return"已完成"===t?"按期已完成":"期限内待检";const a=parseInt(e);return a>=7?"严重逾期":a>=1?"已完成"===t?"逾期已完成":"逾期未检":"期限内待检"},w=async()=>{try{const e={pageNum:v.value,pageSize:c.value};l.startDate&&(e.startDate=l.startDate),l.endDate&&(e.endDate=l.endDate),l.deptName&&l.deptName.trim()&&(e.deptName=l.deptName.trim());const t=p.value[g.value].value;0!==t&&(e.inspectionStatus=t);const o=await a.getInspectionWarningList(e);if(0===o.code)if(o.data.statistics&&(d.total=o.data.statistics.total||0,d.overdue=o.data.statistics.overdue||0,d.pending=o.data.statistics.pending||0,d.completed=o.data.statistics.completed||0,d.overdueCompleted=o.data.statistics.overdueCompleted||0,d.onTimeCompleted=o.data.statistics.onTimeCompleted||0,p.value[0].count=o.data.statistics.total||0,p.value[1].count=o.data.statistics.overdue||0,p.value[2].count=o.data.statistics.pending||0,p.value[3].count=o.data.statistics.completed||0,p.value[4].count=o.data.statistics.overdueCompleted||0,p.value[5].count=o.data.statistics.onTimeCompleted||0),o.data.page&&o.data.page.records){const e=o.data.page.records;1===v.value?i.value=e:i.value=[...i.value,...e];const t=o.data.page.total||0;i.value.length>=t?m.value="nomore":m.value="loadmore"}else m.value="nomore"}catch(e){console.error("获取预警列表失败:",e)}},C=()=>{v.value=1,i.value=[],w()};return e.onReachBottom((()=>{"loadmore"===m.value&&(v.value++,w())})),e.onShow((()=>{w()})),(a,o)=>e.e({a:t._imports_0$3,b:e.t(l.startDate||"请选择"),c:e.n(l.startDate?"date-value":"date-placeholder"),d:e.o((e=>u.value=!0)),e:e.o(D),f:e.o((e=>u.value=!1)),g:e.o((e=>u.value=!1)),h:e.o((e=>n.value=e)),i:e.p({show:u.value,mode:"date",modelValue:n.value}),j:e.t(l.endDate||"请选择"),k:e.n(l.endDate?"date-value":"date-placeholder"),l:e.o((e=>s.value=!0)),m:e.o(h),n:e.o((e=>s.value=!1)),o:e.o((e=>s.value=!1)),p:e.o((e=>r.value=e)),q:e.p({show:s.value,mode:"date",modelValue:r.value}),r:e.o((e=>l.deptName=e)),s:e.p({placeholder:"请输入公司名称",border:"surround",modelValue:l.deptName}),t:e.o(C),v:t._imports_1$1,w:e.t(d.total),x:e.t(d.overdue),y:e.t(d.onTimeCompleted),z:e.t(d.completed),A:e.f(p.value,((t,a,o)=>e.e({a:e.t(t.label),b:e.t(null!=t.count?t.count:""),c:g.value===a},(g.value,{}),{d:a,e:g.value===a?1:"",f:e.o((e=>(e=>{g.value=e,v.value=1,i.value=[],w()})(a)),a)}))),B:e.f(i.value,((t,a,o)=>({a:e.t(t.deptName||"-"),b:e.t(b(t.overdueDays,t.statusName)),c:e.n(N(t.overdueDays)),d:e.t(t.planName||"-"),e:e.t(t.cycleName||"-"),f:e.t(t.taskDate||"-"),g:e.t(t.finishTime||"未完成"),h:e.t(t.executorName||"-"),i:e.t(t.overdueDays||"-"),j:t.id}))),C:i.value.length>0},i.value.length>0?{D:e.p({status:m.value})}:{},{E:0===i.value.length},(i.value.length,{}),{F:e.gei(a,"")})}},l=e._export_sfc(o,[["__scopeId","data-v-b713017f"]]);wx.createPage(l);

View File

@@ -0,0 +1,8 @@
{
"navigationBarTitleText": "日常安全检查预警",
"usingComponents": {
"up-datetime-picker": "../../uni_modules/uview-plus/components/u-datetime-picker/u-datetime-picker",
"up-input": "../../uni_modules/uview-plus/components/u-input/u-input",
"u-loadmore": "../../uni_modules/uview-plus/components/u-loadmore/u-loadmore"
}
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
.page.data-v-b713017f{min-height:100vh;background:#ebf2fc;padding-bottom:40rpx}.section-header.data-v-b713017f{display:flex;align-items:center}.section-header .section-icon.data-v-b713017f{width:40rpx;height:40rpx;margin-right:12rpx}.search-card .date-row.data-v-b713017f{display:flex;gap:20rpx}.search-card .date-row .date-item.data-v-b713017f{flex:1}.search-card .date-label.data-v-b713017f{font-size:28rpx;color:#333;margin-bottom:12rpx}.search-card .date-picker.data-v-b713017f{display:flex;align-items:center;justify-content:space-between;height:72rpx;padding:0 20rpx;background:#f8f8f8;border-radius:8rpx;border:1rpx solid #eee}.search-card .date-picker .date-value.data-v-b713017f{color:#333;font-size:28rpx}.search-card .date-picker .date-placeholder.data-v-b713017f{color:#999;font-size:28rpx}.search-card .search-btn.data-v-b713017f{margin-top:30rpx;background:linear-gradient(135deg,#667eea,#2667e9);color:#fff;border-radius:40rpx;height:80rpx;line-height:80rpx;font-size:30rpx}.stat-grid.data-v-b713017f{display:flex;justify-content:space-between;gap:16rpx}.stat-grid .stat-item.data-v-b713017f{flex:1;height:124rpx;border-radius:12rpx;color:#fff;display:flex;flex-direction:column;align-items:center;justify-content:center}.stat-grid .stat-item .stat-num.data-v-b713017f{font-size:40rpx;font-weight:700}.stat-grid .stat-item .stat-label.data-v-b713017f{font-size:24rpx;margin-top:8rpx}.stat-grid .stat-total.data-v-b713017f{background:linear-gradient(135deg,#628efb,#4a7cf7)}.stat-grid .stat-overdue.data-v-b713017f{background:linear-gradient(135deg,#32dcc7,#20c5b0)}.stat-grid .stat-completed.data-v-b713017f{background:linear-gradient(135deg,#32d1e9,#20b8d0)}.stat-grid .stat-pending.data-v-b713017f{background:linear-gradient(135deg,#a190f5,#8b78e8)}.list-title-bar.data-v-b713017f{width:8rpx;height:32rpx;background:#2667e9;border-radius:4rpx;margin-right:12rpx}.list-card.data-v-b713017f{background:#fff;box-shadow:0 2rpx 10rpx rgba(0,0,0,.08);border-radius:16rpx;padding:0;margin-bottom:20rpx;overflow:hidden}.list-card .card-title-row.data-v-b713017f{display:flex;justify-content:space-between;align-items:center;background:linear-gradient(135deg,#4a7cf7,#2667e9);padding:24rpx 30rpx}.list-card .card-company-name.data-v-b713017f{font-size:32rpx;font-weight:700;color:#fff;flex:1;margin-right:16rpx}.list-card .card-status-tag.data-v-b713017f{padding:8rpx 24rpx;border-radius:8rpx;white-space:nowrap;flex-shrink:0;font-size:24rpx;color:#fff;font-weight:500}.list-card .card-body.data-v-b713017f{padding:30rpx}.list-card .card-row.data-v-b713017f{display:flex;margin-top:16rpx;font-size:28rpx;line-height:1.5}.list-card .card-row.data-v-b713017f:first-of-type{margin-top:0}.list-card .card-row .row-label.data-v-b713017f{color:#999;white-space:nowrap;flex-shrink:0}.list-card .card-row .row-value.data-v-b713017f{color:#333;word-break:break-all}.status-serious.data-v-b713017f{background:linear-gradient(135deg,#ff6b6b,#ee5a5a)}.status-overdue.data-v-b713017f{background:linear-gradient(135deg,#ffa726,#ff9800)}.status-normal.data-v-b713017f{background:linear-gradient(135deg,#66bb6a,#4caf50)}.status-completed.data-v-b713017f{background:linear-gradient(135deg,#42a5f5,#2196f3)}.empty-tip.data-v-b713017f{text-align:center;padding:100rpx 0;color:#999;font-size:28rpx}.status-tabs.data-v-b713017f{white-space:nowrap;background:#fff;border-radius:16rpx;margin-bottom:20rpx;padding:0 10rpx}.status-tabs-inner.data-v-b713017f{display:inline-flex;align-items:center;height:88rpx;white-space:nowrap}.status-tab-item.data-v-b713017f{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;padding:0 24rpx;height:88rpx;position:relative}.status-tab-text.data-v-b713017f{font-size:26rpx;color:#666}.status-tab-active .status-tab-text.data-v-b713017f{color:#2667e9;font-weight:700}.status-tab-bar.data-v-b713017f{position:absolute;bottom:8rpx;width:40rpx;height:6rpx;background:#2667e9;border-radius:3rpx}

View File

@@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js"),a=require("../../request/three_one_api/area.js");Math||o();const o=()=>"../../components/AreaFormPopup.js",t={__name:"management",setup(o){const t=e.ref([]),l=e.ref(!1),n=e.ref(!1),c=e.ref(null),r=e.ref(!1),s=e.ref({});e.onMounted((()=>{i()}));const i=async()=>{try{const e=await a.getAreaList();0===e.code&&(t.value=e.data.records||[])}catch(e){console.error("获取区域列表失败:",e)}},u=()=>{n.value=!1,c.value=null,s.value={},l.value=!0},d=()=>{n.value=!1,c.value=null,s.value={}},v=async o=>{r.value=!0;try{const t={name:o.name,color:o.color};let s;n.value?(t.id=c.value,s=await a.updateArea(t)):s=await a.addArea(t),0===s.code&&(l.value=!1,e.index.showToast({title:n.value?"修改成功":"新增成功",icon:"success"}),i())}catch(t){console.error("提交失败:",t),e.index.showToast({title:"操作失败",icon:"none"})}finally{r.value=!1}};return(o,h)=>e.e({a:t.value.length>0},t.value.length>0?{b:e.f(t.value,((o,t,r)=>({a:e.t(o.name||"区域名称"),b:o.color,c:e.t(o.color),d:e.o((t=>(async o=>{try{const e=await a.getAreaDetail({id:o.id});0===e.code&&(n.value=!0,c.value=o.id,s.value={name:e.data.name||"",color:e.data.color||"#D92121"},l.value=!0)}catch(t){console.error("获取区域详情失败:",t),e.index.showToast({title:"获取详情失败",icon:"none"})}})(o)),o.id),e:e.o((t=>(o=>{e.index.showModal({title:"确认删除",content:"确定要删除该区域吗?",confirmColor:"#e54d42",success:async t=>{if(t.confirm)try{0===(await a.deleteArea({id:o.id})).code&&(e.index.showToast({title:"删除成功",icon:"success"}),i())}catch(l){console.error("删除失败:",l),e.index.showToast({title:"删除失败",icon:"none"})}}})})(o)),o.id),f:o.id})))}:{},{c:e.o(u),d:e.o(v),e:e.o(d),f:e.o((e=>l.value=e)),g:e.p({isEdit:n.value,editData:s.value,loading:r.value,visible:l.value}),h:e.gei(o,"")})}},l=e._export_sfc(t,[["__scopeId","data-v-6ce07390"]]);wx.createPage(l);

View File

@@ -0,0 +1,6 @@
{
"navigationBarTitleText": "区域管理",
"usingComponents": {
"area-form-popup": "../../components/AreaFormPopup"
}
}

View File

@@ -0,0 +1 @@
<view class="{{['padding', 'page', 'data-v-6ce07390', virtualHostClass]}}" style="{{virtualHostStyle}}" hidden="{{virtualHostHidden || false}}" id="{{h}}"><view wx:if="{{a}}" class="area-list data-v-6ce07390"><view wx:for="{{b}}" wx:for-item="item" wx:key="f" class="padding bg-white radius margin-bottom data-v-6ce07390"><view class="flex justify-between data-v-6ce07390"><view class="data-v-6ce07390"><view class="text-bold text-black data-v-6ce07390">{{item.a}}</view><view class="margin-top flex align-center data-v-6ce07390"><text class="data-v-6ce07390">颜色:</text><view class="color-dot data-v-6ce07390" style="{{'background-color:' + item.b}}"></view><text class="margin-left-xs data-v-6ce07390">{{item.c}}</text></view></view><view class="data-v-6ce07390"><button class="bg-blue cu-btn data-v-6ce07390" bindtap="{{item.d}}">编辑</button><button class="bg-red cu-btn margin-left data-v-6ce07390" bindtap="{{item.e}}">删除</button></view></view></view></view><view wx:else class="empty-state data-v-6ce07390"><text class="text-gray data-v-6ce07390">暂无区域数据</text></view><button class="add-btn bg-blue round data-v-6ce07390" bindtap="{{c}}">新增公司区域</button><area-form-popup wx:if="{{g}}" class="data-v-6ce07390" virtualHostClass="data-v-6ce07390" bindsubmit="{{d}}" bindclose="{{e}}" u-i="6ce07390-0" bind:__l="__l" bindupdateVisible="{{f}}" u-p="{{g}}"/></view>

View File

@@ -0,0 +1 @@
.page.data-v-6ce07390{min-height:100vh;background:#ebf2fc;padding-bottom:120rpx}.area-list.data-v-6ce07390{padding-bottom:20rpx}.empty-state.data-v-6ce07390{padding:200rpx 0;text-align:center}.add-btn.data-v-6ce07390{position:fixed;bottom:40rpx;left:30rpx;right:30rpx;height:88rpx;line-height:88rpx;border-radius:44rpx;font-size:32rpx}.color-dot.data-v-6ce07390{width:30rpx;height:30rpx;border-radius:6rpx;flex-shrink:0;margin-left:10rpx}

View File

@@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js"),t=require("../../request/api.js"),a={__name:"checklist",setup(a){const o=e.ref([]),i=()=>{e.index.navigateTo({url:"/pages/editchecklist/editchecklist"})};return e.onShow((()=>{(async()=>{try{const e=await t.getCheckTableList({pageNum:1,pageSize:100});0===e.code&&(o.value=e.data.records||[])}catch(e){console.error("获取检查表列表失败:",e)}})()})),(t,a)=>e.e({a:e.f(o.value,((t,a,o)=>e.e({a:e.t(t.name),b:t.deptName||t.pointCount},t.deptName||t.pointCount?e.e({c:t.deptName},t.deptName?{d:e.t(t.deptName)}:{},{e:t.deptName&&t.pointCount},(t.deptName&&t.pointCount,{}),{f:t.pointCount},t.pointCount?{g:e.t(t.pointCount)}:{}):{},{h:e.o((a=>(t=>{(null==t?void 0:t.id)&&e.index.navigateTo({url:`/pages/checklist/detail?id=${t.id}`})})(t)),t.id),i:t.id}))),b:0===o.value.length},(o.value.length,{}),{c:e.o(i),d:e.gei(t,"")})}},o=e._export_sfc(a,[["__scopeId","data-v-73d9f4c0"]]);wx.createPage(o);

View File

@@ -0,0 +1,4 @@
{
"navigationBarTitleText": "检查表",
"usingComponents": {}
}

View File

@@ -0,0 +1 @@
<view class="{{['page', 'padding', 'data-v-73d9f4c0', virtualHostClass]}}" style="{{virtualHostStyle}}" hidden="{{virtualHostHidden || false}}" id="{{d}}"><view wx:for="{{a}}" wx:for-item="item" wx:key="i" class="checklist-card data-v-73d9f4c0"><view class="card-main data-v-73d9f4c0"><view class="card-info data-v-73d9f4c0"><view class="card-name data-v-73d9f4c0">{{item.a}}</view><view wx:if="{{item.b}}" class="card-meta data-v-73d9f4c0"><text wx:if="{{item.c}}" class="data-v-73d9f4c0">{{item.d}}</text><text wx:if="{{item.e}}" class="meta-dot data-v-73d9f4c0">·</text><text wx:if="{{item.f}}" class="data-v-73d9f4c0">检查项 {{item.g}} 项</text></view></view><button class="detail-btn data-v-73d9f4c0" catchtap="{{item.h}}">详情</button></view></view><view wx:if="{{b}}" class="empty-tip data-v-73d9f4c0"><text class="data-v-73d9f4c0">暂无检查表</text></view><button class="add-btn data-v-73d9f4c0" bindtap="{{c}}"><text class="data-v-73d9f4c0">新增检查表</text></button></view>

View File

@@ -0,0 +1 @@
.page.data-v-73d9f4c0{min-height:100vh;background:#ebf2fc;padding-bottom:120rpx}.checklist-card.data-v-73d9f4c0{background:#fff;border-radius:16rpx;padding:24rpx 28rpx;margin-bottom:20rpx;box-shadow:0 2rpx 10rpx rgba(0,0,0,.05)}.card-main.data-v-73d9f4c0{display:flex;align-items:center;gap:20rpx}.card-info.data-v-73d9f4c0{flex:1;min-width:0}.card-name.data-v-73d9f4c0{font-size:32rpx;color:#333;font-weight:500;line-height:1.4;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-all}.card-meta.data-v-73d9f4c0{margin-top:10rpx;font-size:24rpx;color:#999;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.meta-dot.data-v-73d9f4c0{margin:0 8rpx}.detail-btn.data-v-73d9f4c0{flex-shrink:0;width:120rpx;height:60rpx;line-height:60rpx;padding:0;margin:0;background:#fff;border:2rpx solid #2667E9;border-radius:30rpx;color:#2667e9;font-size:26rpx}.detail-btn.data-v-73d9f4c0:after{border:none}.empty-tip.data-v-73d9f4c0{text-align:center;padding:100rpx 0;color:#999;font-size:28rpx}.add-btn.data-v-73d9f4c0{position:fixed;bottom:40rpx;left:30rpx;right:30rpx;height:90rpx;background:linear-gradient(135deg,#667eea,#2668ea);border-radius:45rpx;color:#fff;font-size:32rpx;display:flex;align-items:center;justify-content:center;box-shadow:0 8rpx 20rpx rgba(102,126,234,.4)}.add-btn.data-v-73d9f4c0:after{border:none}

View File

@@ -0,0 +1 @@
"use strict";const e=require("../../common/vendor.js"),a=require("../../common/assets.js"),t=require("../../request/api.js"),u={__name:"detail",setup(u){const l=e.ref(!0),n=e.ref(""),o=e.ref({}),i=e.ref([]),v={1:"日常检查",2:"专项检查",3:"设备检查"},r={1:"每天一次",2:"每周",3:"每月",4:"每季度"},s={1:"单人完成",2:"全员",3:"指定分组"},c={1:"包含周末",2:"不包含周末"},d=e.computed((()=>o.value.typeName||v[o.value.type]||"-")),m=e.computed((()=>o.value.cycleName||r[o.value.cycle]||"-")),p=e.computed((()=>o.value.runModeName||s[o.value.runMode]||"-")),f=e.computed((()=>o.value.isWeekendName||c[o.value.isWeekend]||"-")),N=e.computed((()=>2===Number(o.value.runMode)?"全员":o.value.executorName||"-")),y=e=>e?String(e).split(" ")[0]:"-";return e.onLoad((a=>{if(n.value=a.id||"",!n.value)return e.index.showToast({title:"缺少检查表ID",icon:"none"}),void(l.value=!1);(async()=>{if(n.value){l.value=!0;try{const a=await t.getOneTableInfo(n.value);if(0===a.code){const e=a.data||{};o.value=e,i.value=e.itemDetailList||[]}else e.index.showToast({title:a.msg||"获取详情失败",icon:"none"})}catch(a){console.error("获取检查计划详情失败:",a),e.index.showToast({title:"获取详情失败",icon:"none"})}finally{l.value=!1}}})()})),(t,u)=>e.e({a:l.value},l.value?{}:e.e({b:e.t(o.value.name||"-"),c:e.t(o.value.deptName||"-"),d:e.t(d.value),e:e.t(p.value),f:e.t(N.value),g:e.t(m.value),h:o.value.description},o.value.description?{i:o.value.description}:{},{j:a._imports_0$1,k:e.t(o.value.itemNames||"-"),l:e.t(i.value.length),m:0===i.value.length},0===i.value.length?{}:{n:e.f(i.value,((a,t,u)=>e.e({a:e.t(t+1),b:e.t(a.checkItemName||"-"),c:a.industryName},a.industryName?{d:e.t(a.industryName)}:{},{e:a.pointId||t})))},{o:e.t(f.value),p:e.t(y(o.value.planStartTime)),q:e.t(y(o.value.planEndTime))}),{r:e.gei(t,"")})}},l=e._export_sfc(u,[["__scopeId","data-v-311899fa"]]);wx.createPage(l);

View File

@@ -0,0 +1,4 @@
{
"navigationBarTitleText": "检查计划详情",
"usingComponents": {}
}

View File

@@ -0,0 +1 @@
<view class="{{['page', 'data-v-311899fa', virtualHostClass]}}" style="{{virtualHostStyle}}" hidden="{{virtualHostHidden || false}}" id="{{r}}"><view wx:if="{{a}}" class="loading-wrap data-v-311899fa"><text class="loading-text data-v-311899fa">加载中...</text></view><block wx:else><view class="section-card data-v-311899fa"><view class="section-title data-v-311899fa">基本信息</view><view class="info-row data-v-311899fa"><text class="info-label data-v-311899fa">检查表名称</text><text class="info-value data-v-311899fa">{{b}}</text></view><view class="info-row data-v-311899fa"><text class="info-label data-v-311899fa">分派单位</text><text class="info-value data-v-311899fa">{{c}}</text></view><view class="info-row data-v-311899fa"><text class="info-label data-v-311899fa">检查表类型</text><text class="info-value data-v-311899fa">{{d}}</text></view><view class="info-row data-v-311899fa"><text class="info-label data-v-311899fa">模式</text><text class="info-value data-v-311899fa">{{e}}</text></view><view class="info-row data-v-311899fa"><text class="info-label data-v-311899fa">执行人员</text><text class="info-value data-v-311899fa">{{f}}</text></view><view class="info-row data-v-311899fa"><text class="info-label data-v-311899fa">循环周期</text><text class="info-value data-v-311899fa">{{g}}</text></view><view class="info-row column data-v-311899fa"><text class="info-label data-v-311899fa">检查说明</text><view class="info-block data-v-311899fa"><rich-text wx:if="{{h}}" class="data-v-311899fa" nodes="{{i}}"></rich-text><text wx:else class="info-empty data-v-311899fa">-</text></view></view></view><view class="section-card data-v-311899fa"><view class="section-title data-v-311899fa">关联表项</view><view class="related-box data-v-311899fa"><image class="related-icon data-v-311899fa" src="{{j}}" mode="aspectFit"></image><text class="related-text data-v-311899fa">{{k}}</text></view></view><view class="section-card data-v-311899fa"><view class="section-title data-v-311899fa"> 检查项明细 <text class="item-count data-v-311899fa">{{l}}项)</text></view><view wx:if="{{m}}" class="empty-block data-v-311899fa">暂无检查项</view><view wx:else class="item-list data-v-311899fa"><view wx:for="{{n}}" wx:for-item="item" wx:key="e" class="item-row data-v-311899fa"><text class="item-no data-v-311899fa">{{item.a}}</text><view class="item-content data-v-311899fa"><text class="item-name data-v-311899fa">{{item.b}}</text><text wx:if="{{item.c}}" class="item-industry data-v-311899fa">{{item.d}}</text></view></view></view></view><view class="section-card data-v-311899fa"><view class="section-title data-v-311899fa">计划安排</view><view class="info-row data-v-311899fa"><text class="info-label data-v-311899fa">仅工作日</text><text class="info-value data-v-311899fa">{{o}}</text></view><view class="info-row data-v-311899fa"><text class="info-label data-v-311899fa">计划开始日期</text><text class="info-value data-v-311899fa">{{p}}</text></view><view class="info-row data-v-311899fa"><text class="info-label data-v-311899fa">计划结束日期</text><text class="info-value data-v-311899fa">{{q}}</text></view></view></block></view>

View File

@@ -0,0 +1 @@
.page.data-v-311899fa{min-height:100vh;background:#ebf2fc;padding:24rpx 24rpx 40rpx;box-sizing:border-box}.loading-wrap.data-v-311899fa{padding:120rpx 0;text-align:center}.loading-text.data-v-311899fa{font-size:28rpx;color:#999}.section-card.data-v-311899fa{background:#fff;border-radius:16rpx;padding:28rpx;margin-bottom:20rpx;box-shadow:0 2rpx 10rpx rgba(0,0,0,.04)}.section-title.data-v-311899fa{font-size:30rpx;font-weight:600;color:#333;margin-bottom:20rpx;padding-left:16rpx;border-left:6rpx solid #2667E9}.item-count.data-v-311899fa{font-size:26rpx;font-weight:400;color:#999}.info-row.data-v-311899fa{display:flex;align-items:flex-start;padding:18rpx 0;border-bottom:1rpx solid #f0f0f0}.info-row.data-v-311899fa:last-child{border-bottom:none}.info-row.column.data-v-311899fa{flex-direction:column}.info-label.data-v-311899fa{width:180rpx;flex-shrink:0;font-size:26rpx;color:#999;line-height:1.5}.info-value.data-v-311899fa{flex:1;font-size:28rpx;color:#333;line-height:1.5;word-break:break-all}.info-block.data-v-311899fa{width:100%;margin-top:12rpx;padding:20rpx;background:#f8f9fb;border:1rpx solid #ebeef5;border-radius:8rpx;font-size:28rpx;color:#606266;line-height:1.6;box-sizing:border-box}.info-empty.data-v-311899fa{color:#c0c4cc}.related-box.data-v-311899fa{display:flex;align-items:flex-start;gap:12rpx;padding:20rpx;background:#f8f9fb;border:1rpx solid #ebeef5;border-radius:8rpx}.related-icon.data-v-311899fa{flex-shrink:0;width:36rpx;height:36rpx;margin-top:4rpx}.related-text.data-v-311899fa{flex:1;font-size:28rpx;color:#333;line-height:1.5;word-break:break-all}.empty-block.data-v-311899fa{text-align:center;padding:40rpx 0;font-size:26rpx;color:#999}.item-list.data-v-311899fa{border-top:1rpx solid #f0f0f0}.item-row.data-v-311899fa{display:flex;align-items:flex-start;gap:16rpx;padding:24rpx 0;border-bottom:1rpx solid #f0f0f0}.item-row.data-v-311899fa:last-child{border-bottom:none;padding-bottom:0}.item-no.data-v-311899fa{width:36rpx;font-size:26rpx;color:#999;line-height:1.5;flex-shrink:0}.item-content.data-v-311899fa{flex:1;min-width:0}.item-name.data-v-311899fa{display:block;font-size:28rpx;color:#333;line-height:1.5;word-break:break-all}.item-industry.data-v-311899fa{display:inline-block;margin-top:8rpx;font-size:24rpx;color:#999}

Some files were not shown because too many files have changed in this diff Show More