一单n制等功能,接入随手拍之前我先提交一版本

This commit is contained in:
王利强
2026-08-12 14:43:53 +08:00
parent ec76d588e2
commit 47deeedb22
664 changed files with 1429 additions and 2894 deletions

View File

@@ -74,7 +74,7 @@
<text class="time">{{ fieldText(item, item.time) }}</text> <text class="time">{{ fieldText(item, item.time) }}</text>
</template> </template>
<template v-else> <template v-else>
<text class="operator">{{ labels.executorPrefix }}{{ labels.personnelSuffix }}{{ fieldText(item, item.currentHandlerName) }}</text> <text class="operator">{{ labels.nextHandlerLabel }}{{ fieldText(item, item.currentHandlerName) }}</text>
<text class="time status-pending">{{ labels.statusSuffix }}{{ PENDING_LABEL }}</text> <text class="time status-pending">{{ labels.statusSuffix }}{{ PENDING_LABEL }}</text>
</template> </template>
</view> </view>

View File

@@ -2,7 +2,7 @@ export const CHAIN_LABELS = {
loading: '加载中...', loading: '加载中...',
empty: '暂无流程记录', empty: '暂无流程记录',
personnelSuffix: '人员:', personnelSuffix: '人员:',
executorPrefix: '执行', nextHandlerLabel: '下一步处理人:',
statusSuffix: '状态:', statusSuffix: '状态:',
hazardCode: '隐患编号', hazardCode: '隐患编号',
hazardTitle: '隐患标题', hazardTitle: '隐患标题',

View File

@@ -117,7 +117,10 @@ const executorLabel = computed(() => {
if (runMode === 4) { if (runMode === 4) {
const rosterItems = detail.value.rosterItems || [] const rosterItems = detail.value.rosterItems || []
if (rosterItems.length > 0) { if (rosterItems.length > 0) {
return rosterItems.map((item) => item.identityName).filter(Boolean).join('、') || '-' return rosterItems
.map((item) => (item.userName || item.identityName || '').trim())
.filter(Boolean)
.join('、') || '-'
} }
return '-' return '-'
} }

View File

@@ -46,35 +46,39 @@
<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="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>
<view class="static-field">{{ nextStepDisplay }}</view> <up-radio-group :key="'hazard-end-' + hazardEndRadio" v-model="hazardEndRadio" placement="row" activeColor="#2667e9">
<view class="flex margin-bottom margin-top">
<view class="text-gray">下一步处理人</view>
<view class="text-red">*</view>
</view>
<view class="select-trigger" @click="openAssigneePopup">
<view class="select-content" :class="{ 'text-gray': !selectedAssigneeName }">
{{ selectedAssigneeName || '请选择下一步处理人' }}
</view>
<text class="cuIcon-unfold"></text>
</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 <up-radio
label="" label=""
name="yes" name="no"
:customStyle="{ marginRight: '48rpx' }" :customStyle="{ marginRight: '48rpx' }"
></up-radio> ></up-radio>
<up-radio label="" name="no"></up-radio> <up-radio label="" name="yes"></up-radio>
</up-radio-group> </up-radio-group>
<template v-if="!hazardEnd">
<view class="flex margin-bottom margin-top">
<view class="text-gray">下一步流程</view>
<view class="text-red">*</view>
</view>
<view class="static-field">{{ nextStepDisplay }}</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>
</template>
<view class="flex margin-top-xl" style="gap: 20rpx;"> <view class="flex margin-top-xl" style="gap: 20rpx;">
<button class="round flex-sub" @click="handleCancel">取消</button> <button class="round flex-sub" @click="handleCancel">取消</button>
<button class="bg-blue round flex-sub" @click="handleSubmit">提交申请</button> <button class="bg-blue round flex-sub" @click="handleSubmit">提交申请</button>
@@ -90,6 +94,7 @@
@close="showHazardPicker = false" @close="showHazardPicker = false"
></up-picker> ></up-picker>
<!-- 暂时注释下一步处理人弹窗
<u-popup :show="showAssigneePopup" mode="bottom" round="20" @close="cancelAssigneeSelect"> <u-popup :show="showAssigneePopup" mode="bottom" round="20" @close="cancelAssigneeSelect">
<view class="user-popup"> <view class="user-popup">
<view class="popup-header"> <view class="popup-header">
@@ -118,11 +123,12 @@
</view> </view>
</view> </view>
</u-popup> </u-popup>
-->
</view> </view>
</template> </template>
<script setup> <script setup>
import { ref, reactive, computed } from 'vue'; import { ref, reactive, computed, nextTick } from 'vue';
import { onLoad } from '@dcloudio/uni-app'; import { onLoad } from '@dcloudio/uni-app';
import { import {
applyDelete, applyDelete,
@@ -145,6 +151,9 @@
const selectableHazardList = ref([]); const selectableHazardList = ref([]);
const selectedDeptName = ref(''); const selectedDeptName = ref('');
const aiGenerating = ref(false); const aiGenerating = ref(false);
const hazardEndRadio = ref('no');
const hazardEnd = computed(() => hazardEndRadio.value === 'yes');
const normalizeHazardEndRadio = (value) => (value === 'yes' ? 'yes' : 'no');
const sendMsgFlagRadio = ref('yes'); const sendMsgFlagRadio = ref('yes');
const sendMsgFlag = computed(() => sendMsgFlagRadio.value === 'yes'); const sendMsgFlag = computed(() => sendMsgFlagRadio.value === 'yes');
@@ -542,10 +551,11 @@
uni.showToast({ title: '请选择隐患', icon: 'none' }); uni.showToast({ title: '请选择隐患', icon: 'none' });
return; return;
} }
if (!selectedAssigneeIdentityId.value) { // 暂时注释:下一步处理人必选校验
uni.showToast({ title: '请选择下一步处理人', icon: 'none' }); // if (!selectedAssigneeIdentityId.value) {
return; // uni.showToast({ title: '请选择下一步处理人', icon: 'none' });
} // return;
// }
const params = { const params = {
hazardId: Number(selectedHazardId.value), hazardId: Number(selectedHazardId.value),
@@ -555,9 +565,14 @@
mainTreatmentContent: formData.mainTreatmentContent || '', mainTreatmentContent: formData.mainTreatmentContent || '',
treatmentResult: formData.treatmentResult || '', treatmentResult: formData.treatmentResult || '',
selfVerifyContent: formData.selfVerifyContent || '', selfVerifyContent: formData.selfVerifyContent || '',
assigneeIdentityId: selectedAssigneeIdentityId.value, hazardEnd: hazardEnd.value,
sendMsgFlag: sendMsgFlag.value quickApprove: hazardEnd.value ? null : true,
sendMsgFlag: hazardEnd.value ? null : sendMsgFlag.value
}; };
// 非快速审批时需传 assigneeIdentityId
// if (!params.quickApprove) {
// params.assigneeIdentityId = selectedAssigneeIdentityId.value;
// }
try { try {
const res = await applyDelete(params); const res = await applyDelete(params);
@@ -587,16 +602,19 @@
const hazardFromOptions = buildWriteoffHazardFromOptions(options); const hazardFromOptions = buildWriteoffHazardFromOptions(options);
if (hazardFromOptions?.hazardId) { if (hazardFromOptions?.hazardId) {
await applySelectedHazard(hazardFromOptions); await applySelectedHazard(hazardFromOptions);
return; } else {
if (!hazardLocked.value) {
await fetchSelectableHazardList();
}
if (taskId.value) {
await fetchNextStep();
}
} }
if (!hazardLocked.value) { nextTick(() => {
await fetchSelectableHazardList(); hazardEndRadio.value = normalizeHazardEndRadio(hazardEndRadio.value);
} });
if (taskId.value) {
await fetchNextStep();
}
}); });
</script> </script>

View File

@@ -196,34 +196,14 @@
@close="showHazardPicker = false" @close="showHazardPicker = false"
></up-picker> ></up-picker>
<u-popup :show="showAssigneePopup" mode="bottom" round="20" @close="cancelAssigneeSelect"> <FlowAssigneePickerPopup
<view class="user-popup"> :show="showAssigneePopup"
<view class="popup-header"> :task-id="taskId"
<view class="popup-title text-bold">选择下一步处理人</view> v-model:picker-identity-id="pickerAssigneeIdentityId"
<view class="popup-close" @click="cancelAssigneeSelect">×</view> v-model:picker-name="pickerAssigneeName"
</view> @cancel="cancelAssigneeSelect"
<scroll-view class="user-list-scroll" scroll-y> @confirm="confirmAssigneeSelect"
<view v-if="assigneeLoading" class="empty-tip">加载中...</view> />
<view v-else-if="assigneeList.length === 0" class="empty-tip">暂无人员数据</view>
<template v-else>
<view
v-for="user in assigneeList"
:key="getAssigneeItemKey(user)"
class="user-item"
:class="{ active: String(pickerAssigneeIdentityId) === String(resolveAssigneeIdentityId(user)) }"
@click="onAssigneeItemClick(user)"
>
<text class="user-item-text">{{ formatAssigneeDisplayName(user) }}</text>
<text v-if="String(pickerAssigneeIdentityId) === String(resolveAssigneeIdentityId(user))" class="cuIcon-check text-blue"></text>
</view>
</template>
</scroll-view>
<view class="popup-footer">
<button class="btn-cancel" @click="cancelAssigneeSelect">取消</button>
<button class="btn-confirm bg-blue" @click="confirmAssigneeSelect">确定</button>
</view>
</view>
</u-popup>
</view> </view>
</template> </template>
@@ -237,9 +217,9 @@
getRectifyDetail, getRectifyDetail,
generateWriteoffContent, generateWriteoffContent,
getFlowNextNodes, getFlowNextNodes,
getDeptUsers,
getWriteoffForm getWriteoffForm
} from '@/request/api.js'; } from '@/request/api.js';
import FlowAssigneePickerPopup from '@/components/flow/FlowAssigneePickerPopup.vue';
import { uploadToCloud, toSubmitFileUrl } from '@/utils/upload.js'; import { uploadToCloud, toSubmitFileUrl } from '@/utils/upload.js';
import { buildWriteoffHazardFromOptions } from '@/utils/hazardNav.js'; import { buildWriteoffHazardFromOptions } from '@/utils/hazardNav.js';
@@ -278,8 +258,6 @@
const pickerAssigneeIdentityId = ref(''); const pickerAssigneeIdentityId = ref('');
const pickerAssigneeName = ref(''); const pickerAssigneeName = ref('');
const showAssigneePopup = ref(false); const showAssigneePopup = ref(false);
const assigneeList = ref([]);
const assigneeLoading = ref(false);
const showCanvas = ref(true); const showCanvas = ref(true);
const signatureUrl = ref(''); const signatureUrl = ref('');
@@ -435,96 +413,19 @@
}; };
}; };
const getStoredUserInfo = () => { const openAssigneePopup = () => {
try { if (!taskId.value) {
const stored = uni.getStorageSync('userInfo'); uni.showToast({ title: '缺少任务ID', icon: 'none' });
if (!stored) return {};
return typeof stored === 'string' ? JSON.parse(stored) : stored;
} catch (error) {
return {};
}
};
const getCurrentDeptId = () => {
const userInfo = getStoredUserInfo();
const identity = userInfo.userIdentity;
if (identity?.deptId != null && identity.deptId !== '') {
return String(identity.deptId);
}
if (userInfo.deptId != null && userInfo.deptId !== '') {
return String(userInfo.deptId);
}
return '';
};
const resolveAssigneeIdentityId = (user) => {
if (!user) return '';
const id = user.identityId ?? user.userIdentityId ?? user.userId ?? '';
return id === '' || id == null ? '' : String(id);
};
const getAssigneeItemKey = (user) => {
const identityId = resolveAssigneeIdentityId(user);
if (identityId) return `identity-${identityId}`;
return `user-${user.userId || user.nickName || ''}`;
};
const formatAssigneeDisplayName = (user) => {
if (!user) return '';
const name = user.nickName || user.userName || user.name || '';
const identityName = user.identityName || '';
if (name && identityName) return `${name}${identityName}`;
return name || identityName || '未知人员';
};
const resolveAssigneeDeptUserType = () => {
if (formData.approvalResult === 2) return 3;
return quickApproveRadio.value === 'yes' ? 2 : 3;
};
const fetchAssigneeList = async () => {
const deptId = getCurrentDeptId();
if (!deptId) {
assigneeList.value = [];
return; return;
} }
assigneeLoading.value = true;
try {
const res = await getDeptUsers(deptId, { type: resolveAssigneeDeptUserType() });
if (res.code === 0) {
assigneeList.value = res.data || [];
} else {
assigneeList.value = [];
}
} catch (error) {
console.error('获取部门人员失败:', error);
assigneeList.value = [];
} finally {
assigneeLoading.value = false;
}
};
const openAssigneePopup = async () => {
pickerAssigneeIdentityId.value = selectedAssigneeIdentityId.value; pickerAssigneeIdentityId.value = selectedAssigneeIdentityId.value;
pickerAssigneeName.value = selectedAssigneeName.value; pickerAssigneeName.value = selectedAssigneeName.value;
showAssigneePopup.value = true; showAssigneePopup.value = true;
await fetchAssigneeList();
}; };
const onAssigneeItemClick = (user) => { const confirmAssigneeSelect = ({ identityId, name }) => {
const identityId = resolveAssigneeIdentityId(user); selectedAssigneeIdentityId.value = identityId;
if (!identityId) return; selectedAssigneeName.value = name;
pickerAssigneeIdentityId.value = String(identityId);
pickerAssigneeName.value = formatAssigneeDisplayName(user);
};
const confirmAssigneeSelect = () => {
if (!pickerAssigneeIdentityId.value) {
uni.showToast({ title: '请选择下一步处理人', icon: 'none' });
return;
}
selectedAssigneeIdentityId.value = pickerAssigneeIdentityId.value;
selectedAssigneeName.value = pickerAssigneeName.value;
showAssigneePopup.value = false; showAssigneePopup.value = false;
}; };
@@ -1098,100 +999,6 @@
} }
} }
.user-popup {
background: #fff;
.popup-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 30rpx;
border-bottom: 1rpx solid #eee;
.popup-title {
font-size: 32rpx;
color: #333;
}
.popup-close {
font-size: 40rpx;
color: #999;
line-height: 1;
}
}
.user-list-scroll {
max-height: 600rpx;
padding: 0 30rpx;
box-sizing: border-box;
}
.empty-tip {
padding: 80rpx 20rpx;
text-align: center;
color: #909399;
font-size: 26rpx;
}
.user-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 24rpx 0;
border-bottom: 1rpx solid #f5f5f5;
&:last-child {
border-bottom: none;
}
&.active {
.user-item-text {
color: #2667E9;
font-weight: 600;
}
}
.user-item-text {
flex: 1;
font-size: 28rpx;
color: #333;
}
}
.popup-footer {
display: flex;
gap: 24rpx;
padding: 24rpx 30rpx;
padding-bottom: calc(24rpx + env(safe-area-inset-bottom));
background: #fff;
button {
flex: 1;
height: 80rpx;
line-height: 80rpx;
border-radius: 40rpx;
font-size: 30rpx;
margin: 0;
padding: 0;
&::after {
border: none;
}
}
.btn-cancel {
background: #fff;
color: #2667E9;
border: 2rpx solid #2667E9;
}
.btn-confirm {
color: #fff;
border: none;
}
}
}
.signature-action-btn { .signature-action-btn {
margin: 0; margin: 0;
padding: 0 20rpx; padding: 0 20rpx;

View File

@@ -472,9 +472,9 @@
<view <view
v-else v-else
class="executor-radio" class="executor-radio"
:class="{ 'executor-radio-active': selectedExecutorId === item.userId }" :class="{ 'executor-radio-active': selectedExecutorIdentityId === item.identityId }"
> >
<view v-if="selectedExecutorId === item.userId" class="executor-radio-dot"></view> <view v-if="selectedExecutorIdentityId === item.identityId" class="executor-radio-dot"></view>
</view> </view>
<view class="executor-info"> <view class="executor-info">
<text class="executor-name">{{ item.nickName }}</text> <text class="executor-name">{{ item.nickName }}</text>
@@ -521,7 +521,7 @@ const formData = reactive({
modeName: '', modeName: '',
selectDeptId: '', selectDeptId: '',
selectDeptName: '', selectDeptName: '',
executorId: '', executorIdentityId: '',
executorNames: '', executorNames: '',
rosterIdentityIds: [], rosterIdentityIds: [],
cycleId: '', cycleId: '',
@@ -641,7 +641,7 @@ const todayMinDate = computed(() => getTodayTimestamp())
const endDateMinDate = computed(() => { const endDateMinDate = computed(() => {
if (formData.startDate) { if (formData.startDate) {
const [year, month, day] = formData.startDate.split('-').map(Number) const [year, month, day] = formData.startDate.split('-').map(Number)
return new Date(year, month - 1, day + 1).getTime() return new Date(year, month - 1, day).getTime()
} }
return getTodayTimestamp() return getTodayTimestamp()
}); });
@@ -665,7 +665,7 @@ const cycleColumns = ref([['每天一次', '每周一次', '每月一次', '每
// 执行人员选择器 // 执行人员选择器
const showExecutorPopup = ref(false); const showExecutorPopup = ref(false);
const executorList = ref([]); const executorList = ref([]);
const selectedExecutorId = ref(null); const selectedExecutorIdentityId = ref(null);
const selectedRosterIdentityIds = ref([]); const selectedRosterIdentityIds = ref([]);
const pageScrollLockStyle = computed(() => { const pageScrollLockStyle = computed(() => {
@@ -786,23 +786,55 @@ const onModeConfirm = (e) => {
} }
const clearExecutorSelection = () => { const clearExecutorSelection = () => {
formData.executorId = '' formData.executorIdentityId = ''
formData.executorNames = '' formData.executorNames = ''
formData.rosterIdentityIds = [] formData.rosterIdentityIds = []
selectedExecutorId.value = null selectedExecutorIdentityId.value = null
selectedRosterIdentityIds.value = [] selectedRosterIdentityIds.value = []
} }
const getDeptUsersQueryParams = () => {
if (formData.runMode === 4) {
return { type: 4 }
}
if (formData.runMode === 1) {
return { type: 5 }
}
return {}
}
const syncSingleExecutorSelection = (rawValue) => {
if (formData.runMode === 4 || rawValue === undefined || rawValue === null || rawValue === '') {
return
}
const num = Number(rawValue)
if (Number.isNaN(num)) return
const byIdentity = executorList.value.find((user) => Number(user.identityId) === num)
if (byIdentity) {
selectedExecutorIdentityId.value = byIdentity.identityId
formData.executorIdentityId = byIdentity.identityId
return
}
const byUser = executorList.value.find((user) => Number(user.userId) === num)
if (byUser) {
selectedExecutorIdentityId.value = byUser.identityId
formData.executorIdentityId = byUser.identityId
}
}
const fetchDeptUsers = async (deptId) => { const fetchDeptUsers = async (deptId) => {
if (!deptId) { if (!deptId) {
executorList.value = [] executorList.value = []
return return
} }
try { try {
const params = formData.runMode === 4 ? { type: 4 } : {} const params = getDeptUsersQueryParams()
const res = await getDeptUsers(deptId, params) const res = await getDeptUsers(deptId, params)
if (res.code === 0 && res.data) { if (res.code === 0 && res.data) {
executorList.value = res.data || [] executorList.value = res.data || []
if (formData.runMode === 1) {
syncSingleExecutorSelection(formData.executorIdentityId)
}
} else { } else {
executorList.value = [] executorList.value = []
} }
@@ -813,7 +845,7 @@ const fetchDeptUsers = async (deptId) => {
} }
const selectExecutor = (item) => { const selectExecutor = (item) => {
selectedExecutorId.value = item.userId selectedExecutorIdentityId.value = item.identityId
} }
const toggleRosterExecutor = (item) => { const toggleRosterExecutor = (item) => {
@@ -841,12 +873,12 @@ const confirmExecutorSelect = () => {
showExecutorPopup.value = false showExecutorPopup.value = false
return return
} }
if (!selectedExecutorId.value) { if (!selectedExecutorIdentityId.value) {
uni.showToast({ title: '请选择执行人员', icon: 'none' }) uni.showToast({ title: '请选择执行人员', icon: 'none' })
return return
} }
const selectedUser = executorList.value.find(u => u.userId === selectedExecutorId.value) const selectedUser = executorList.value.find((user) => user.identityId === selectedExecutorIdentityId.value)
formData.executorId = selectedExecutorId.value formData.executorIdentityId = selectedExecutorIdentityId.value
formData.executorNames = selectedUser?.nickName || selectedUser?.nickname || '' formData.executorNames = selectedUser?.nickName || selectedUser?.nickname || ''
showExecutorPopup.value = false showExecutorPopup.value = false
} }
@@ -859,7 +891,7 @@ const openExecutorPopup = () => {
if (formData.runMode === 4) { if (formData.runMode === 4) {
selectedRosterIdentityIds.value = [...(formData.rosterIdentityIds || [])] selectedRosterIdentityIds.value = [...(formData.rosterIdentityIds || [])]
} else { } else {
selectedExecutorId.value = formData.executorId || null selectedExecutorIdentityId.value = formData.executorIdentityId || null
} }
fetchDeptUsers(formData.deptId) fetchDeptUsers(formData.deptId)
showExecutorPopup.value = true showExecutorPopup.value = true
@@ -933,7 +965,7 @@ const onStartDateConfirm = (e) => {
}) })
return return
} }
if (formData.endDate && parseDateValue(selectedDate) >= parseDateValue(formData.endDate)) { if (formData.endDate && parseDateValue(selectedDate) > parseDateValue(formData.endDate)) {
formData.endDate = '' formData.endDate = ''
} }
formData.startDate = selectedDate formData.startDate = selectedDate
@@ -949,8 +981,8 @@ const onEndDateConfirm = (e) => {
}) })
return return
} }
if (formData.startDate && parseDateValue(selectedDate) <= parseDateValue(formData.startDate)) { if (formData.startDate && parseDateValue(selectedDate) < parseDateValue(formData.startDate)) {
uni.showToast({ title: '计划结束日期必须晚于计划开始日期', icon: 'none' }) uni.showToast({ title: '计划结束日期不能早于计划开始日期', icon: 'none' })
return return
} }
formData.endDate = selectedDate formData.endDate = selectedDate
@@ -1466,7 +1498,7 @@ const handleSave = async () => {
uni.showToast({ title: '请选择模式', icon: 'none' }); uni.showToast({ title: '请选择模式', icon: 'none' });
return; return;
} }
if (formData.runMode === 1 && !formData.executorId) { if (formData.runMode === 1 && !formData.executorIdentityId) {
uni.showToast({ title: '请选择执行人员', icon: 'none' }); uni.showToast({ title: '请选择执行人员', icon: 'none' });
return; return;
} }
@@ -1482,8 +1514,8 @@ const handleSave = async () => {
uni.showToast({ title: '请选择计划日期', icon: 'none' }); uni.showToast({ title: '请选择计划日期', icon: 'none' });
return; return;
} }
if (parseDateValue(formData.endDate) <= parseDateValue(formData.startDate)) { if (parseDateValue(formData.endDate) < parseDateValue(formData.startDate)) {
uni.showToast({ title: '计划结束日期必须晚于计划开始日期', icon: 'none' }); uni.showToast({ title: '计划结束日期不能早于计划开始日期', icon: 'none' });
return; return;
} }
@@ -1536,8 +1568,8 @@ const handleSave = async () => {
planEndTime: `${formData.endDate} 00:00:00` planEndTime: `${formData.endDate} 00:00:00`
}; };
if (formData.runMode === 1 && formData.executorId) { if (formData.runMode === 1 && formData.executorIdentityId) {
params.executorId = formData.executorId; params.executorIdentityId = formData.executorIdentityId;
} }
if (formData.runMode === 4 && formData.rosterIdentityIds?.length) { if (formData.runMode === 4 && formData.rosterIdentityIds?.length) {

View File

@@ -44,7 +44,7 @@
class="round cu-btn bg-blue" @click="Rectification(item)">立即整改</button> class="round cu-btn bg-blue" @click="Rectification(item)">立即整改</button>
<button v-if="item.statusName === '待验收' && item.canEdit" <button v-if="item.statusName === '待验收' && item.canEdit"
class="round cu-btn light bg-blue" @click="editRectification(item)">编辑整改信息</button> class="round cu-btn light bg-blue" @click="editRectification(item)">编辑整改信息</button>
<button v-if="canShowAcceptanceButton(item, userRole)" <button v-if="canShowAcceptanceButton(item)"
class="round cu-btn bg-blue" @click="acceptance(item)">立即验收</button> class="round cu-btn bg-blue" @click="acceptance(item)">立即验收</button>
<button v-if="item.statusName === '待交办'" <button v-if="item.statusName === '待交办'"
class="round cu-btn bg-blue" @click="assignHazard(item)">隐患交办</button> class="round cu-btn bg-blue" @click="assignHazard(item)">隐患交办</button>

View File

@@ -64,23 +64,44 @@
</view> </view>
<up-upload :fileList="fileList1" @afterRead="afterRead" @delete="deletePic" name="1" multiple imageMode="aspectFill" :maxCount="10"></up-upload> <up-upload :fileList="fileList1" @afterRead="afterRead" @delete="deletePic" name="1" multiple imageMode="aspectFill" :maxCount="10"></up-upload>
<view v-if="formData.result === 1" class="flex margin-bottom margin-top"> <template v-if="formData.result === 1">
<view class="text-gray">是否快速审批</view> <view class="flex margin-bottom margin-top">
<view class="text-red">*</view> <view class="text-gray">是否结束隐患验收</view>
</view> <view class="text-red">*</view>
<view v-if="formData.result === 1" class="flex" style="gap: 20rpx;"> </view>
<button :class="['result-btn', formData.quickApproveRadio === 'yes' ? 'active' : '']" @click="onQuickApproveChange('yes')"></button> <up-radio-group :key="'hazard-end-' + hazardEndRadio" v-model="hazardEndRadio" placement="row" activeColor="#2667e9" @change="onHazardEndChange">
<button :class="['result-btn', formData.quickApproveRadio === 'no' ? 'active' : '']" @click="onQuickApproveChange('no')"></button> <up-radio
</view> label="否"
name="no"
:customStyle="{ marginRight: '48rpx' }"
></up-radio>
<up-radio label="是" name="yes"></up-radio>
</up-radio-group>
</template>
<template v-if="formData.result === 1 && hazardEndRadio !== 'yes'">
<view class="flex margin-bottom margin-top">
<view class="text-gray">是否快速审批</view>
<view class="text-red">*</view>
</view>
<up-radio-group :key="'quick-approve-' + quickApproveRadio" v-model="quickApproveRadio" placement="row" activeColor="#2667e9" @change="onQuickApproveChange">
<up-radio
label="是"
name="yes"
:customStyle="{ marginRight: '48rpx' }"
></up-radio>
<up-radio label="否" name="no"></up-radio>
</up-radio-group>
</template>
<!-- 隐藏的 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 v-if="!(formData.result === 1 && hazardEndRadio === 'yes')" 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>
<view class="static-field">{{ nextStepDisplay }}</view> <view v-if="!(formData.result === 1 && hazardEndRadio === 'yes')" class="static-field">{{ nextStepDisplay }}</view>
<template v-if="showAssigneeSection"> <template v-if="showAssigneeSection">
<view class="flex margin-bottom margin-top"> <view class="flex margin-bottom margin-top">
@@ -96,34 +117,14 @@
</view> </view>
</template> </template>
<u-popup :show="showAssigneePopup" mode="bottom" round="20" @close="cancelAssigneeSelect"> <FlowAssigneePickerPopup
<view class="user-popup"> :show="showAssigneePopup"
<view class="popup-header"> :task-id="taskId"
<view class="popup-title text-bold">选择下一步处理人</view> v-model:picker-identity-id="pickerAssigneeIdentityId"
<view class="popup-close" @click="cancelAssigneeSelect">×</view> v-model:picker-name="pickerAssigneeName"
</view> @cancel="cancelAssigneeSelect"
<scroll-view class="user-list-scroll" scroll-y> @confirm="confirmAssigneeSelect"
<view v-if="assigneeLoading" class="empty-tip">加载中...</view> />
<view v-else-if="assigneeList.length === 0" class="empty-tip">暂无人员数据</view>
<template v-else>
<view
v-for="user in assigneeList"
:key="getAssigneeItemKey(user)"
class="user-item"
:class="{ active: String(pickerAssigneeIdentityId) === String(resolveAssigneeIdentityId(user)) }"
@click="onAssigneeItemClick(user)"
>
<text class="user-item-text">{{ formatAssigneeDisplayName(user) }}</text>
<text v-if="String(pickerAssigneeIdentityId) === String(resolveAssigneeIdentityId(user))" class="cuIcon-check text-blue"></text>
</view>
</template>
</scroll-view>
<view class="popup-footer">
<button class="btn-cancel" @click="cancelAssigneeSelect">取消</button>
<button class="btn-confirm bg-blue" @click="confirmAssigneeSelect">确定</button>
</view>
</view>
</u-popup>
<!-- 短信提醒暂不使用 <!-- 短信提醒暂不使用
<view class="flex margin-bottom margin-top"> <view class="flex margin-bottom margin-top">
@@ -193,7 +194,8 @@
<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 { acceptanceRectification, getHiddenDangerDetail, getRectifyDetail, getFlowNextNodes, getDeptUsers } from '@/request/api.js'; import { acceptanceRectification, getHiddenDangerDetail, getRectifyDetail, getFlowNextNodes } from '@/request/api.js';
import FlowAssigneePickerPopup from '@/components/flow/FlowAssigneePickerPopup.vue';
import { toImageUrl } from '@/request/request.js'; import { toImageUrl } from '@/request/request.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';
@@ -274,40 +276,22 @@
if (formData.result === 2) { if (formData.result === 2) {
return { pass: false }; return { pass: false };
} }
if (hazardEndRadio.value === 'yes') {
return { pass: true, hazardEnd: true };
}
return { return {
pass: true, pass: true,
quickApprove: formData.quickApproveRadio === 'yes' quickApprove: quickApproveRadio.value === 'yes'
}; };
}; };
const getStoredUserInfo = () => {
try {
const stored = uni.getStorageSync('userInfo');
if (!stored) return {};
return typeof stored === 'string' ? JSON.parse(stored) : stored;
} catch (error) {
return {};
}
};
const getCurrentDeptId = () => {
const userInfo = getStoredUserInfo();
const identity = userInfo.userIdentity;
if (identity?.deptId != null && identity.deptId !== '') {
return String(identity.deptId);
}
if (userInfo.deptId != null && userInfo.deptId !== '') {
return String(userInfo.deptId);
}
return '';
};
const rectifierDisplayName = computed(() => rectifyData.rectifierName?.trim() || '暂无'); const rectifierDisplayName = computed(() => rectifyData.rectifierName?.trim() || '暂无');
// 通过且快速审批时无需选择下一步处理人 // 通过且快速审批时无需选择下一步处理人;结束验收时也不显示
const showAssigneeSection = computed(() => { const showAssigneeSection = computed(() => {
if (formData.result === 1 && hazardEndRadio.value === 'yes') return false;
if (formData.result === 2) return true; if (formData.result === 2) return true;
if (formData.result === 1 && formData.quickApproveRadio === 'no') return true; if (formData.result === 1 && quickApproveRadio.value === 'no') return true;
return false; return false;
}); });
@@ -316,76 +300,20 @@
const pickerAssigneeIdentityId = ref(''); const pickerAssigneeIdentityId = ref('');
const pickerAssigneeName = ref(''); const pickerAssigneeName = ref('');
const showAssigneePopup = ref(false); const showAssigneePopup = ref(false);
const assigneeList = ref([]);
const assigneeLoading = ref(false);
const resolveAssigneeIdentityId = (user) => { const openAssigneePopup = () => {
if (!user) return ''; if (!taskId.value) {
const id = user.identityId ?? user.userIdentityId ?? user.userId ?? ''; uni.showToast({ title: '缺少任务ID', icon: 'none' });
return id === '' || id == null ? '' : String(id);
};
const getAssigneeItemKey = (user) => {
const identityId = resolveAssigneeIdentityId(user);
if (identityId) return `identity-${identityId}`;
return `user-${user.userId || user.nickName || ''}`;
};
const formatAssigneeDisplayName = (user) => {
if (!user) return '';
const name = user.nickName || user.userName || user.name || '';
const identityName = user.identityName || '';
if (name && identityName) return `${name}${identityName}`;
return name || identityName || '未知人员';
};
const resolveAssigneeDeptUserType = () => (
formData.quickApproveRadio === 'yes' ? 2 : 3
);
const fetchAssigneeList = async () => {
const deptId = getCurrentDeptId();
if (!deptId) {
assigneeList.value = [];
return; return;
} }
assigneeLoading.value = true;
try {
const res = await getDeptUsers(deptId, { type: resolveAssigneeDeptUserType() });
if (res.code === 0) {
assigneeList.value = res.data || [];
} else {
assigneeList.value = [];
}
} catch (error) {
console.error('获取部门人员失败:', error);
assigneeList.value = [];
} finally {
assigneeLoading.value = false;
}
};
const openAssigneePopup = async () => {
pickerAssigneeIdentityId.value = selectedAssigneeIdentityId.value; pickerAssigneeIdentityId.value = selectedAssigneeIdentityId.value;
pickerAssigneeName.value = selectedAssigneeName.value; pickerAssigneeName.value = selectedAssigneeName.value;
showAssigneePopup.value = true; showAssigneePopup.value = true;
await fetchAssigneeList();
}; };
const onAssigneeItemClick = (user) => { const confirmAssigneeSelect = ({ identityId, name }) => {
const identityId = resolveAssigneeIdentityId(user); selectedAssigneeIdentityId.value = identityId;
if (!identityId) return; selectedAssigneeName.value = name;
pickerAssigneeIdentityId.value = String(identityId);
pickerAssigneeName.value = formatAssigneeDisplayName(user);
};
const confirmAssigneeSelect = () => {
if (!pickerAssigneeIdentityId.value) {
uni.showToast({ title: '请选择下一步处理人', icon: 'none' });
return;
}
selectedAssigneeIdentityId.value = pickerAssigneeIdentityId.value;
selectedAssigneeName.value = pickerAssigneeName.value;
showAssigneePopup.value = false; showAssigneePopup.value = false;
}; };
@@ -396,22 +324,36 @@
const onResultChange = (result) => { const onResultChange = (result) => {
formData.result = result; formData.result = result;
if (result === 2) { if (result === 2) {
hazardEndRadio.value = 'no';
selectedAssigneeIdentityId.value = ''; selectedAssigneeIdentityId.value = '';
selectedAssigneeName.value = ''; selectedAssigneeName.value = '';
} else if (!formData.quickApproveRadio) { } else if (!quickApproveRadio.value) {
formData.quickApproveRadio = 'yes'; quickApproveRadio.value = 'yes';
} }
fetchNextStep(); fetchNextStep();
}; };
const onQuickApproveChange = (value) => { const onHazardEndChange = (value) => {
formData.quickApproveRadio = value; if (value === 'yes') {
quickApproveRadio.value = 'yes';
selectedAssigneeIdentityId.value = '';
selectedAssigneeName.value = '';
} else {
fetchNextStep();
}
};
const onQuickApproveChange = () => {
selectedAssigneeIdentityId.value = ''; selectedAssigneeIdentityId.value = '';
selectedAssigneeName.value = ''; selectedAssigneeName.value = '';
fetchNextStep(); fetchNextStep();
}; };
const fetchNextStep = async () => { const fetchNextStep = async () => {
if (formData.result === 1 && hazardEndRadio.value === 'yes') {
nextStepName.value = '';
return;
}
nextStepLoading.value = true; nextStepLoading.value = true;
try { try {
const currentTaskId = taskId.value; const currentTaskId = taskId.value;
@@ -478,11 +420,19 @@
// 整改附件 // 整改附件
const rectifyAttachments = ref([]); const rectifyAttachments = ref([]);
// 是否结束隐患验收
const hazardEndRadio = ref('no');
const hazardEnd = computed(() => hazardEndRadio.value === 'yes');
const normalizeHazardEndRadio = (value) => (value === 'yes' ? 'yes' : 'no');
// 是否快速审批
const quickApproveRadio = ref('yes');
const normalizeQuickApproveRadio = (value) => (value === 'no' ? 'no' : 'yes');
// 表单数据 // 表单数据
const formData = reactive({ const formData = reactive({
result: 1, // 验收结果 1.通过 2.不通过 result: 1, // 验收结果 1.通过 2.不通过
verifyRemark: '', // 验收备注 verifyRemark: '' // 验收备注
quickApproveRadio: 'yes' // 是否快速审批 yes/no仅通过时有效
}); });
const fileList1 = ref([]); const fileList1 = ref([]);
@@ -564,7 +514,8 @@
formData: { formData: {
result: formData.result, result: formData.result,
verifyRemark: formData.verifyRemark, verifyRemark: formData.verifyRemark,
quickApproveRadio: formData.quickApproveRadio hazardEndRadio: hazardEndRadio.value,
quickApproveRadio: quickApproveRadio.value
}, },
selectedAssigneeIdentityId: selectedAssigneeIdentityId.value, selectedAssigneeIdentityId: selectedAssigneeIdentityId.value,
selectedAssigneeName: selectedAssigneeName.value, selectedAssigneeName: selectedAssigneeName.value,
@@ -581,7 +532,8 @@
const form = data.formData || {}; const form = data.formData || {};
formData.result = form.result !== undefined ? form.result : 1; formData.result = form.result !== undefined ? form.result : 1;
formData.verifyRemark = form.verifyRemark || ''; formData.verifyRemark = form.verifyRemark || '';
formData.quickApproveRadio = form.quickApproveRadio === 'no' ? 'no' : 'yes'; hazardEndRadio.value = normalizeHazardEndRadio(form.hazardEndRadio ?? (form.hazardEnd === true ? 'yes' : 'no'));
quickApproveRadio.value = normalizeQuickApproveRadio(form.quickApproveRadio);
selectedAssigneeIdentityId.value = data.selectedAssigneeIdentityId || ''; selectedAssigneeIdentityId.value = data.selectedAssigneeIdentityId || '';
selectedAssigneeName.value = data.selectedAssigneeName || ''; selectedAssigneeName.value = data.selectedAssigneeName || '';
fileList1.value = data.fileList1 || []; fileList1.value = data.fileList1 || [];
@@ -602,7 +554,8 @@
clearForm: () => { clearForm: () => {
formData.result = 1; formData.result = 1;
formData.verifyRemark = ''; formData.verifyRemark = '';
formData.quickApproveRadio = 'yes'; hazardEndRadio.value = 'no';
quickApproveRadio.value = 'yes';
selectedAssigneeIdentityId.value = ''; selectedAssigneeIdentityId.value = '';
selectedAssigneeName.value = ''; selectedAssigneeName.value = '';
fileList1.value = []; fileList1.value = [];
@@ -636,7 +589,8 @@
bindAutoSave(() => [ bindAutoSave(() => [
formData.result, formData.result,
formData.verifyRemark, formData.verifyRemark,
formData.quickApproveRadio, hazardEndRadio.value,
quickApproveRadio.value,
selectedAssigneeIdentityId.value, selectedAssigneeIdentityId.value,
selectedAssigneeName.value, selectedAssigneeName.value,
fileList1.value, fileList1.value,
@@ -772,11 +726,14 @@
}; };
const validateFormBeforeSubmit = () => { const validateFormBeforeSubmit = () => {
if (formData.result === 1 && !formData.quickApproveRadio) { if (formData.result === 1 && hazardEndRadio.value === 'yes') {
return true;
}
if (formData.result === 1 && !quickApproveRadio.value) {
uni.showToast({ title: '请选择是否快速审批', icon: 'none' }); uni.showToast({ title: '请选择是否快速审批', icon: 'none' });
return false; return false;
} }
if (formData.result === 1 && formData.quickApproveRadio === 'no' && !selectedAssigneeIdentityId.value) { if (formData.result === 1 && quickApproveRadio.value === 'no' && !selectedAssigneeIdentityId.value) {
uni.showToast({ title: '请选择下一步处理人', icon: 'none' }); uni.showToast({ title: '请选择下一步处理人', icon: 'none' });
return false; return false;
} }
@@ -854,14 +811,19 @@
result: formData.result, result: formData.result,
verifyRemark: formData.verifyRemark || '', verifyRemark: formData.verifyRemark || '',
attachments: attachments, attachments: attachments,
signPath: signatureServerPath.value || '' // 电子签名路径 signPath: signatureServerPath.value || '', // 电子签名路径
hazardEnd: formData.result === 1 && hazardEndRadio.value === 'yes'
// sendMsgFlag: sendMsgFlag.value // sendMsgFlag: sendMsgFlag.value
}; };
if (formData.result === 1) { if (formData.result === 1) {
params.quickApprove = formData.quickApproveRadio === 'yes'; if (hazardEndRadio.value === 'yes') {
if (formData.quickApproveRadio === 'no') { params.quickApprove = null;
params.assigneeIdentityId = selectedAssigneeIdentityId.value; } else {
params.quickApprove = quickApproveRadio.value === 'yes';
if (quickApproveRadio.value === 'no') {
params.assigneeIdentityId = selectedAssigneeIdentityId.value;
}
} }
} }
@@ -1035,6 +997,10 @@
// 页面打开时自动恢复草稿 // 页面打开时自动恢复草稿
restoreDraft(); restoreDraft();
nextTick(() => {
hazardEndRadio.value = normalizeHazardEndRadio(hazardEndRadio.value);
quickApproveRadio.value = normalizeQuickApproveRadio(quickApproveRadio.value);
});
}); });
</script> </script>
@@ -1091,100 +1057,6 @@
} }
} }
.user-popup {
background: #fff;
.popup-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 30rpx;
border-bottom: 1rpx solid #eee;
.popup-title {
font-size: 32rpx;
color: #333;
}
.popup-close {
font-size: 40rpx;
color: #999;
line-height: 1;
}
}
.user-list-scroll {
max-height: 600rpx;
padding: 0 30rpx;
box-sizing: border-box;
}
.empty-tip {
padding: 80rpx 20rpx;
text-align: center;
color: #909399;
font-size: 26rpx;
}
.user-item {
display: flex;
align-items: center;
justify-content: space-between;
padding: 24rpx 0;
border-bottom: 1rpx solid #f5f5f5;
&:last-child {
border-bottom: none;
}
&.active {
.user-item-text {
color: #2667E9;
font-weight: 600;
}
}
.user-item-text {
flex: 1;
font-size: 28rpx;
color: #333;
}
}
.popup-footer {
display: flex;
gap: 24rpx;
padding: 24rpx 30rpx;
padding-bottom: calc(24rpx + env(safe-area-inset-bottom));
background: #fff;
button {
flex: 1;
height: 80rpx;
line-height: 80rpx;
border-radius: 40rpx;
font-size: 30rpx;
margin: 0;
padding: 0;
&::after {
border: none;
}
}
.btn-cancel {
background: #fff;
color: #2667E9;
border: 2rpx solid #2667E9;
}
.btn-confirm {
color: #fff;
border: none;
}
}
}
// 签名相关样式 // 签名相关样式
.signature-box { .signature-box {
width: 100%; width: 100%;

View File

@@ -209,30 +209,45 @@
></canvas> ></canvas>
<view class="form-label margin-bottom margin-top"> <view class="form-label 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>
<view class="static-field">{{ nextStepDisplay }}</view> <up-radio-group :key="'hazard-end-' + hazardEndRadio" v-model="hazardEndRadio" placement="row" activeColor="#2667e9">
<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 <up-radio
label="" label=""
name="yes" name="no"
:customStyle="{ marginRight: '48rpx' }" :customStyle="{ marginRight: '48rpx' }"
></up-radio> ></up-radio>
<up-radio label="" name="no"></up-radio> <up-radio label="" name="yes"></up-radio>
</up-radio-group> </up-radio-group>
<template v-if="!hazardEnd">
<view class="form-label margin-bottom margin-top">
<view class="text-gray">下一步流程</view>
<view class="text-red">*</view>
</view>
<view class="static-field">{{ nextStepDisplay }}</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>
</template>
<!-- 电子签名表单最底部 --> <!-- 电子签名表单最底部 -->
<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">
@@ -541,6 +556,11 @@
const rectifyTimeValue = ref(Date.now()); const rectifyTimeValue = ref(Date.now());
const selectedRectifyTime = ref(''); const selectedRectifyTime = ref('');
// 是否结束隐患整改
const hazardEndRadio = ref('no');
const hazardEnd = computed(() => hazardEndRadio.value === 'yes');
const normalizeHazardEndRadio = (value) => (value === 'yes' ? 'yes' : 'no');
// 短信提醒 // 短信提醒
const sendMsgFlagRadio = ref('yes'); const sendMsgFlagRadio = ref('yes');
const sendMsgFlag = computed(() => sendMsgFlagRadio.value === 'yes'); const sendMsgFlag = computed(() => sendMsgFlagRadio.value === 'yes');
@@ -946,7 +966,8 @@
memberIds: selectedIdentityIds.value.map((id) => Number(id)), memberIds: selectedIdentityIds.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 hazardEnd: hazardEnd.value,
sendMsgFlag: hazardEnd.value ? null : sendMsgFlag.value
}; };
if (selectedDeadlineDate.value) { if (selectedDeadlineDate.value) {
params.deadline = selectedDeadlineDate.value; params.deadline = selectedDeadlineDate.value;
@@ -1354,7 +1375,8 @@
signatureLocalPath: signatureLocalPath.value, signatureLocalPath: signatureLocalPath.value,
showCanvas: showCanvas.value, showCanvas: showCanvas.value,
signaturePaths: signaturePaths.value, signaturePaths: signaturePaths.value,
sendMsgFlagRadio: sendMsgFlagRadio.value sendMsgFlagRadio: sendMsgFlagRadio.value,
hazardEndRadio: hazardEndRadio.value
}), }),
hasContent: rectifyDraftHasContent, hasContent: rectifyDraftHasContent,
applyPayload: (data) => { applyPayload: (data) => {
@@ -1375,6 +1397,7 @@
showCanvas.value = false; showCanvas.value = false;
} }
sendMsgFlagRadio.value = data.sendMsgFlagRadio === 'no' ? 'no' : 'yes'; sendMsgFlagRadio.value = data.sendMsgFlagRadio === 'no' ? 'no' : 'yes';
hazardEndRadio.value = normalizeHazardEndRadio(data.hazardEndRadio ?? (data.hazardEnd === true ? 'yes' : 'no'));
}, },
clearForm: () => { clearForm: () => {
formData.rectifyPlan = ''; formData.rectifyPlan = '';
@@ -1393,6 +1416,7 @@
signatureRef.value.clear(); signatureRef.value.clear();
} }
sendMsgFlagRadio.value = 'yes'; sendMsgFlagRadio.value = 'yes';
hazardEndRadio.value = 'no';
}, },
canSave: () => !!(hazardId.value || rectifyId.value), canSave: () => !!(hazardId.value || rectifyId.value),
onAfterRestore: (data) => { onAfterRestore: (data) => {
@@ -1422,7 +1446,8 @@
signatureLocalPath.value, signatureLocalPath.value,
showCanvas.value, showCanvas.value,
signaturePaths.value, signaturePaths.value,
sendMsgFlagRadio.value sendMsgFlagRadio.value,
hazardEndRadio.value
]); ]);
onHide(() => { onHide(() => {
@@ -1469,6 +1494,10 @@
initRectifyTimeDefault(); initRectifyTimeDefault();
} }
nextTick(() => {
hazardEndRadio.value = normalizeHazardEndRadio(hazardEndRadio.value);
});
// 从列表页带入的限定整改时间(待整改交办 deadline // 从列表页带入的限定整改时间(待整改交办 deadline
if (options.deadline) { if (options.deadline) {
applyDeadlineFromOptions(options.deadline); applyDeadlineFromOptions(options.deadline);

View File

@@ -45,11 +45,20 @@
</view> </view>
</view> </view>
<!-- 我的检查计划 --> <!-- 我的检查计划 -->
<view v-if="!isApprovalRole" class="bg-white margin-top radius" style="padding: 40rpx; margin-left: -30rpx; margin-right: -30rpx;"> <view v-if="showCheckPlanSection" class="bg-white margin-top radius" style="padding: 40rpx; margin-left: -30rpx; margin-right: -30rpx;">
<view class="flex margin-bottom-xl align-center justify-between"> <view class="flex margin-bottom align-center justify-between">
<view class="text-bold margin-left-xs" style="font-size: 32rpx;">我的检查计划</view> <view class="text-bold margin-left-xs" style="font-size: 32rpx;">我的检查计划</view>
<!-- <button class="cu-btn round sm line-blue inspect-list-btn" @click="goInspectList">检查列表</button> --> <!-- <button class="cu-btn round sm line-blue inspect-list-btn" @click="goInspectList">检查列表</button> -->
</view> </view>
<view class="danger-tab-list plan-tab-list">
<view
class="danger-tab-item"
:class="{ 'danger-tab-active': activePlanTab === index }"
v-for="(tab, index) in planTabs"
:key="tab.value"
@click="switchPlanTab(index)"
>{{ tab.label }}</view>
</view>
<!-- 无数据提示 --> <!-- 无数据提示 -->
<view v-if="checkPlanData.length === 0" class="text-center text-gray padding"> <view v-if="checkPlanData.length === 0" class="text-center text-gray padding">
暂无检查计划 暂无检查计划
@@ -184,7 +193,7 @@
class="round cu-btn bg-blue" @click.stop="goRectification(item)">立即整改</button> class="round cu-btn bg-blue" @click.stop="goRectification(item)">立即整改</button>
<button v-if="item.statusName === '待验收' && item.canEdit" <button v-if="item.statusName === '待验收' && item.canEdit"
class="round cu-btn light bg-blue" @click.stop="editRectification(item)">编辑整改信息</button> class="round cu-btn light bg-blue" @click.stop="editRectification(item)">编辑整改信息</button>
<button v-if="canShowAcceptanceButton(item, currentRoleKey)" <button v-if="canShowAcceptanceButton(item)"
class="round cu-btn bg-blue" @click.stop="goAcceptance(item)">立即验收</button> class="round cu-btn bg-blue" @click.stop="goAcceptance(item)">立即验收</button>
<button v-if="item.statusName === '待交办'" <button v-if="item.statusName === '待交办'"
class="round cu-btn bg-blue" @click.stop="assignHazard(item)">隐患交办</button> class="round cu-btn bg-blue" @click.stop="assignHazard(item)">隐患交办</button>
@@ -266,7 +275,7 @@
import { getProfileDetail } from '@/request/three_one_api/info.js'; import { getProfileDetail } from '@/request/three_one_api/info.js';
import { onLoad, onShow, onReachBottom } from '@dcloudio/uni-app'; import { onLoad, onShow, onReachBottom } from '@dcloudio/uni-app';
import { toImageUrl } from '@/request/request.js'; import { toImageUrl } from '@/request/request.js';
import { applyProfileToUserInfo, applyStoredUserInfo, resolveIdentityName, resolveUserIdentityRoleKey } from '@/utils/userInfo.js'; import { applyProfileToUserInfo, applyStoredUserInfo, resolveIdentityName, resolveUserIdentityRoleKey, isGovernmentEntityAdmin } from '@/utils/userInfo.js';
import { import {
buildRectificationUrl, buildRectificationUrl,
buildEditRectificationUrl, buildEditRectificationUrl,
@@ -302,6 +311,7 @@
const currentRoleKey = computed(() => resolveUserIdentityRoleKey(userInfo)); const currentRoleKey = computed(() => resolveUserIdentityRoleKey(userInfo));
const isApprovalRole = computed(() => currentRoleKey.value === 'approval'); const isApprovalRole = computed(() => currentRoleKey.value === 'approval');
const showCheckPlanSection = computed(() => !isApprovalRole.value && currentRoleKey.value !== 'manage');
// 展示用身份名称(兼容接口字段与本地缓存) // 展示用身份名称(兼容接口字段与本地缓存)
const displayIdentityName = computed(() => { const displayIdentityName = computed(() => {
@@ -375,17 +385,22 @@
// common角色只能看到的菜单名称 // common角色只能看到的菜单名称
const commonMenuNames = ['隐患排查', '隐患销号']; const commonMenuNames = ['隐患排查', '隐患销号'];
// 政府类型管理员organizationEntityType=0/1 且 admin/manage隐藏的菜单
const govEntityAdminHiddenMenuNames = ['成员管理', '信息填报', '区域设置', '证件管理'];
// 根据角色动态展示菜单 // 根据角色与组织实体类型动态展示菜单
const infoList = computed(() => { const infoList = computed(() => {
let list = allMenuList;
if (currentRoleKey.value === 'approval') { if (currentRoleKey.value === 'approval') {
return allMenuList.filter(item => item.name === '隐患排查'); list = list.filter(item => item.name === '隐患排查');
} else if (currentRoleKey.value === 'common') {
list = list.filter(item => commonMenuNames.includes(item.name));
} }
if (currentRoleKey.value === 'common') { if (isGovernmentEntityAdmin(userInfo)) {
return allMenuList.filter(item => commonMenuNames.includes(item.name)); list = list.filter(item => !govEntityAdminHiddenMenuNames.includes(item.name));
} }
// admin、manage 及其他角色展示全部菜单 return list;
return allMenuList;
}); });
const goInspectList = () => { const goInspectList = () => {
uni.navigateTo({ uni.navigateTo({
@@ -456,6 +471,12 @@
//我的检查计划 //我的检查计划
const PLAN_INITIAL_SIZE = 4; const PLAN_INITIAL_SIZE = 4;
const planTabs = [
{ label: '全部', value: 0 },
{ label: '未完成', value: 4 },
{ label: '已完成', value: 3 }
];
const activePlanTab = ref(0);
const checkPlanParams = ref({ const checkPlanParams = ref({
pageNum: 1, pageNum: 1,
pageSize: PLAN_INITIAL_SIZE, pageSize: PLAN_INITIAL_SIZE,
@@ -466,6 +487,19 @@
const planShowAll = ref(false); const planShowAll = ref(false);
const expandedPlanMap = ref({}); const expandedPlanMap = ref({});
const buildCheckPlanListParams = (pageSize) => ({
pageNum: 1,
pageSize,
name: checkPlanParams.value.name,
planStatus: planTabs[activePlanTab.value].value
});
const switchPlanTab = (index) => {
if (activePlanTab.value === index) return;
activePlanTab.value = index;
getCheckPlanLists();
};
const hasMoreCheckPlans = computed(() => { const hasMoreCheckPlans = computed(() => {
return !planShowAll.value && checkPlanTotal.value > PLAN_INITIAL_SIZE; return !planShowAll.value && checkPlanTotal.value > PLAN_INITIAL_SIZE;
}); });
@@ -494,11 +528,7 @@
const getCheckPlanLists = async () => { const getCheckPlanLists = async () => {
planShowAll.value = false; planShowAll.value = false;
try { try {
const res = await getCheckPlanList({ const res = await getCheckPlanList(buildCheckPlanListParams(PLAN_INITIAL_SIZE));
pageNum: 1,
pageSize: PLAN_INITIAL_SIZE,
name: checkPlanParams.value.name
});
if (res.code === 0) { if (res.code === 0) {
const records = res.data?.records || []; const records = res.data?.records || [];
checkPlanTotal.value = Number(res.data?.total ?? records.length); checkPlanTotal.value = Number(res.data?.total ?? records.length);
@@ -515,11 +545,7 @@
const loadMoreCheckPlans = async () => { const loadMoreCheckPlans = async () => {
if (!hasMoreCheckPlans.value) return; if (!hasMoreCheckPlans.value) return;
try { try {
const res = await getCheckPlanList({ const res = await getCheckPlanList(buildCheckPlanListParams(checkPlanTotal.value));
pageNum: 1,
pageSize: checkPlanTotal.value,
name: checkPlanParams.value.name
});
if (res.code === 0) { if (res.code === 0) {
const records = res.data?.records || []; const records = res.data?.records || [];
initPlanExpandedState(records); initPlanExpandedState(records);
@@ -552,7 +578,9 @@
if (isApprovalRole.value) { if (isApprovalRole.value) {
fetchWorkbenchList(); fetchWorkbenchList();
} else { } else {
getCheckPlanLists(); if (showCheckPlanSection.value) {
getCheckPlanLists();
}
resetHiddenDangerList(); resetHiddenDangerList();
fetchHiddenDangerList(); fetchHiddenDangerList();
} }
@@ -1117,7 +1145,8 @@
margin-left: 10rpx; margin-left: 10rpx;
} }
.workbench-tab-list { .workbench-tab-list,
.plan-tab-list {
margin-bottom: 20rpx; margin-bottom: 20rpx;
} }

View File

@@ -1,48 +1,56 @@
<template> <template>
<view class="content"> <view class="content">
<view class="header"> <view class="status-bar" :style="{ height: statusBarHeight + 'px' }"></view>
<image src="/static/index/index_bg.png" class="bg-image"></image>
<view class="padding login"> <view class="brand-section">
<view class="text-xl text-black text-bold">账号登录</view> <view class="brand-logo">
<view class="padding-top">欢迎登录湘西州三个一安全管理平台</view> <image class="brand-logo-image" src="/static/logo1.png" mode="aspectFit"></image>
</view>
<view class="brand-title">湘西州三个一安全管理平台</view>
<view class="brand-subtitle">隐患早发现风险早处置守护安全生产</view>
</view>
<view class="role-card">
<view class="role-card-title">选择角色</view>
<view class="role-grid">
<view
v-for="item in roleList"
:key="item.id"
class="role-item"
:class="{ 'role-item--active': selectedRole === item.id }"
@click="selectRole(item.id)"
>
<view class="role-icon-wrap">
<u-icon
:name="item.icon"
:size="22"
:color="selectedRole === item.id ? '#ffffff' : '#b0b8c8'"
></u-icon>
</view>
<text class="role-name">{{ item.name }}</text>
</view>
</view> </view>
</view> </view>
<view class="list"> <view class="login-card">
<view class="list-call"> <view class="list">
<image class="img" src="/static/index/phone.png"></image> <view class="list-call">
<input class="sl-input" v-model="username" type="text" placeholder="请输入用户名" /> <image class="img" src="/static/index/phone.png"></image>
<input class="sl-input" v-model="username" type="text" placeholder="请输入用户名" />
</view>
<view class="list-call">
<image class="img" src="/static/index/lock.png"></image>
<input class="sl-input" v-model="password" type="text" maxlength="32" placeholder="请输入密码" :password="showPassword"/>
<image class="eye-img" :src="showPassword ? '/static/index/cl.png' : '/static/index/op.png'" @click="changePassword"></image>
</view>
</view> </view>
<view class="list-call">
<image class="img" src="/static/index/lock.png"></image>
<input class="sl-input" v-model="password" type="text" maxlength="32" placeholder="请输入密码" :password="showPassword"/>
<image class="eye-img" :src="showPassword ? '/static/index/cl.png' : '/static/index/op.png'" @click="changePassword"></image>
</view>
<!-- <view class="agreement">
<navigator url="reg" open-type="navigate" class="link">注册成员账号</navigator>
<navigator url="forget" open-type="navigate" class="link">忘记密码?</navigator>
</view> -->
</view> </view>
<view class="padding-lr"> <view class="padding-lr">
<button class="button-login" hover-class="button-hover" @click="handleLogin"> <button class="button-login" hover-class="button-hover" @click="handleLogin">
登录 登录
</button> </button>
<!-- <view class="button-login" hover-class="button-hover" @tap="handleLogin('member')">
<text>登录普通成员</text>
</view> -->
<!-- <view class="button-report margin-top" hover-class="button-hover" @tap="goToReport">
<image src="/static/index/photos.png" class="icon-image"></image>
<text>随手拍举报</text>
</view> -->
<!-- <view class="protocol-box">
<navigator url="agreement" open-type="navigate" class="protocol-link">用户协议</navigator>
</view> -->
</view> </view>
</view> </view>
</template> </template>
@@ -50,30 +58,74 @@
import { ref } from 'vue'; import { ref } from 'vue';
import { login } from '@/request/api.js'; import { login } from '@/request/api.js';
// 响应式数据 const statusBarHeight = uni.getSystemInfoSync().statusBarHeight || 0;
// 督导组跳转目标小程序配置
const SUPERVISION_MINI_PROGRAM = {
appId: 'wxe3533791db8a8734',
path: 'pages/index/index',
// develop=开发版 trial=体验版 release=正式版
envVersion: 'release'
};
const roleList = [
{ id: 'enterprise', name: '企业', icon: 'home-fill' },
{ id: 'personal', name: '个人', icon: 'account-fill' },
{ id: 'supervision', name: '督导组', icon: 'man-add-fill' },
{ id: 'government', name: '政务', icon: 'order' }
// { id: 'family', name: '家庭', icon: 'home' }
];
const selectedRole = ref('enterprise');
const username = ref(''); const username = ref('');
const password = ref(''); const password = ref('');
const showPassword = ref(true); const showPassword = ref(true);
// 方法定义 const selectRole = (roleId) => {
const changePassword = () => { if (roleId === 'supervision') {
showPassword.value = !showPassword.value; navigateToSupervisionMiniProgram();
} return;
}
selectedRole.value = roleId;
};
const getPhoneNumber = () => { const navigateToSupervisionMiniProgram = () => {
// 获取手机号的逻辑可以接入一键登录SDK // #ifdef MP-WEIXIN
uni.navigateToMiniProgram({
appId: SUPERVISION_MINI_PROGRAM.appId,
path: SUPERVISION_MINI_PROGRAM.path,
extraData: {
from: 'threeonecheck',
role: 'supervision'
},
envVersion: SUPERVISION_MINI_PROGRAM.envVersion,
success() {
console.log('跳转督导组小程序成功');
},
fail(err) {
console.error('跳转督导组小程序失败:', err);
uni.showModal({
title: '跳转失败',
content: '请确认两个小程序已关联,且目标小程序已添加您为开发者。开发阶段可在微信开发者工具中测试。',
showCancel: false
});
}
});
// #endif
// #ifndef MP-WEIXIN
uni.showToast({ uni.showToast({
title: '获取手机号功能待实现', title: '请在微信小程序中使用',
icon: 'none' icon: 'none'
}); });
} // #endif
};
const changePassword = () => {
showPassword.value = !showPassword.value;
};
const handleLogin = async () => { const handleLogin = async () => {
console.log('点击登录按钮');
console.log('用户名:', username.value);
console.log('密码:', password.value);
// 验证用户名
if (!username.value) { if (!username.value) {
uni.showToast({ uni.showToast({
icon: 'none', icon: 'none',
@@ -81,8 +133,7 @@ const handleLogin = async () => {
}); });
return; return;
} }
// 验证密码
if (!password.value) { if (!password.value) {
uni.showToast({ uni.showToast({
icon: 'none', icon: 'none',
@@ -90,39 +141,35 @@ const handleLogin = async () => {
}); });
return; return;
} }
try { try {
console.log('开始调用登录接口...');
const res = await login({ const res = await login({
username: username.value, username: username.value,
password: password.value password: password.value
}); });
console.log('登录接口返回:', res);
if (res.code === 0) { if (res.code === 0) {
// 登录成功保存token和用户信息
if (res.data.token) { if (res.data.token) {
uni.setStorageSync('token', res.data.token); uni.setStorageSync('token', res.data.token);
} }
// 保存用户信息
const userInfo = { const userInfo = {
userId: res.data.userId, userId: res.data.userId,
username: res.data.username, username: res.data.username,
nickName: res.data.nickName, nickName: res.data.nickName,
deptId: res.data.deptId, deptId: res.data.deptId,
deptName: res.data.deptName, deptName: res.data.deptName,
role:res.data.role, role: res.data.role,
isDept:res.data.isDept isDept: res.data.isDept
}; };
uni.setStorageSync('userInfo', JSON.stringify(userInfo)); uni.setStorageSync('userInfo', JSON.stringify(userInfo));
uni.setStorageSync('loginRole', selectedRole.value);
uni.showToast({ uni.showToast({
title: '登录成功', title: '登录成功',
icon: 'success' icon: 'success'
}); });
setTimeout(() => { setTimeout(() => {
uni.reLaunch({ uni.reLaunch({
url: '/pages/index/index' url: '/pages/index/index'
@@ -141,110 +188,131 @@ const handleLogin = async () => {
icon: 'none' icon: 'none'
}); });
} }
} };
// const handleLogin = () => {
// if (phone.value.length != 11) {
// uni.showToast({
// icon: 'none',
// title: '手机号不正确'
// });
// return;
// }
// if (password.value.length < 6) {
// uni.showToast({
// icon: 'none',
// title: '密码不正确'
// });
// return;
// }
// // 登录请求
// uni.request({
// url: 'http://example.com/api/login',
// data: {
// phone: phone.value,
// password: password.value
// },
// method: 'POST',
// dataType: 'json',
// success: (res) => {
// if (res.data.code != 200) {
// uni.showToast({
// title: res.data.msg || '登录失败',
// icon: 'none'
// });
// } else {
// // 登录成功保存token等信息
// uni.setStorageSync('token', res.data.data.token);
// uni.setStorageSync('userInfo', JSON.stringify(res.data.data.userInfo));
// // 返回上一页或首页
// uni.navigateBack({
// delta: 1,
// fail: () => {
// uni.switchTab({
// url: '/pages/index/index'
// });
// }
// });
// }
// },
// fail: () => {
// uni.showToast({
// title: '网络请求失败',
// icon: 'none'
// });
// }
// });
// }
const goToReport = () => {
//跳转到主页面 跳到分包
uni.navigateTo({
url: '/subpackages/suishoupai/pages/index/index'
})
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
page { page {
background-color: #FFFFFF; background: linear-gradient(180deg, #eef4ff 0%, #f8fbff 45%, #ffffff 100%);
} }
.content { .content {
min-height: 100vh;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; background: linear-gradient(180deg, #eef4ff 0%, #f8fbff 45%, #ffffff 100%);
background-color: #FFFFFF; padding-bottom: 60rpx;
box-sizing: border-box;
} }
.header { .status-bar {
width: 100%; width: 100%;
position: relative; flex-shrink: 0;
margin-bottom: 0;
.bg-image {
width: 100%;
vertical-align: bottom;
}
} }
.login { .brand-section {
position: absolute; display: flex;
top: 50%; flex-direction: column;
color: #666666; align-items: center;
font-size: 28rpx; padding: 120rpx 48rpx 32rpx;
}
.brand-logo {
margin-bottom: 28rpx;
}
.brand-logo-image {
width: 130rpx;
height: 130rpx;
display: block;
}
.brand-title {
font-size: 40rpx;
font-weight: 700;
color: #1a1a2e;
text-align: center;
line-height: 1.4;
}
.brand-subtitle {
margin-top: 16rpx;
font-size: 26rpx;
color: #8a94a6;
text-align: center;
line-height: 1.5;
}
.role-card {
margin: 0 40rpx 16rpx;
padding: 32rpx 28rpx 28rpx;
background: #ffffff;
border-radius: 24rpx;
box-shadow: 0 8rpx 32rpx rgba(47, 108, 242, 0.08);
}
.role-card-title {
font-size: 30rpx;
font-weight: 600;
color: #1a1a2e;
margin-bottom: 24rpx;
}
.role-grid {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
.role-item {
width: 22%;
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 8rpx;
}
.role-icon-wrap {
width: 88rpx;
height: 88rpx;
border-radius: 20rpx;
background: #f5f7fb;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s ease;
}
.role-item--active .role-icon-wrap {
background: linear-gradient(145deg, #4a8af7 0%, #2f6cf2 100%);
box-shadow: 0 8rpx 20rpx rgba(47, 108, 242, 0.3);
}
.role-name {
margin-top: 12rpx;
font-size: 24rpx;
color: #8a94a6;
line-height: 1.2;
text-align: center;
}
.role-item--active .role-name {
color: #2f6cf2;
font-weight: 600;
}
.login-card {
margin: 16rpx 40rpx 0;
padding: 32rpx 28rpx;
background: #ffffff;
border-radius: 24rpx;
box-shadow: 0 8rpx 32rpx rgba(47, 108, 242, 0.08);
} }
.list { .list {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding-top: 50rpx; background-color: transparent;
padding-left: 70rpx;
padding-right: 70rpx;
background-color: #FFFFFF;
margin-top: -2rpx; /* 消除可能的间隙 */
.list-call { .list-call {
display: flex; display: flex;
@@ -256,8 +324,12 @@ page {
background: #F5F7FB; background: #F5F7FB;
border-radius: 16rpx; border-radius: 16rpx;
border: 2rpx solid #F5F7FB; border: 2rpx solid #F5F7FB;
margin-top: 30rpx; margin-top: 24rpx;
padding: 0 30rpx; padding: 0 30rpx;
&:first-child {
margin-top: 0;
}
.img { .img {
width: 30rpx; width: 30rpx;
@@ -278,31 +350,9 @@ page {
} }
} }
.agreement {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
font-size: 30rpx;
margin-top: 30rpx;
color: #3D83F6;
text-align: center;
height: 40rpx;
line-height: 40rpx;
.link {
font-size: 30rpx;
color: #3D83F6;
&:active {
opacity: 0.8;
}
}
}
.padding-lr { .padding-lr {
padding-left: 70rpx; padding-left: 40rpx;
padding-right: 70rpx; padding-right: 40rpx;
} }
.button-login { .button-login {
@@ -316,7 +366,7 @@ page {
text-align: center; text-align: center;
margin-left: auto; margin-left: auto;
margin-right: auto; margin-right: auto;
margin-top: 130rpx; margin-top: 48rpx;
border: none; border: none;
&::after { &::after {
@@ -324,70 +374,7 @@ page {
} }
} }
.button-report {
color: #FFFFFF;
font-size: 34rpx;
width: 100%;
height: 100rpx;
background: linear-gradient(90deg, #FF7878 0%, #F2505B 100%);
border-radius: 50rpx;
line-height: 100rpx;
text-align: center;
margin-left: auto;
margin-right: auto;
display: flex;
align-items: center;
justify-content: center;
}
.margin-top {
margin-top: 30rpx;
}
.button-hover { .button-hover {
opacity: 0.8; opacity: 0.8;
} }
.text-blue {
color: #3D83F6;
font-size: 28rpx;
}
.icon-image {
width: 36rpx;
height: 36rpx;
margin-right: 8rpx;
}
.text-xl {
font-size: 36rpx;
}
.text-black {
color: #000000;
}
.text-bold {
font-weight: bold;
}
.padding {
padding: 30rpx;
}
.padding-top {
padding-top: 15rpx;
}
.protocol-box {
display: flex;
justify-content: center;
margin-top: 40rpx;
.protocol-link {
font-size: 28rpx;
color: #3D83F6;
text-decoration: underline;
}
}
</style> </style>

View File

@@ -462,7 +462,7 @@ export function getCheckItemListDetail(params) {
}); });
} }
// 根据部门id获取用户列表可选 params.type1=部门全部用户默认2=部门 manage 角色用户3=非 manage 角色用户(验收页非快速审批用) // 根据部门id获取用户列表type=4 排班模式type=5 单人模式
export function getDeptUsers(deptId, params = {}) { export function getDeptUsers(deptId, params = {}) {
return requestAPI({ return requestAPI({
url: deptId ? `/admin/user/dept/users/${deptId}` : '/admin/user/dept/users', url: deptId ? `/admin/user/dept/users/${deptId}` : '/admin/user/dept/users',

BIN
static/logo1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

View File

@@ -1 +0,0 @@
"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 l=(e.path||o.tempFilePaths[c]).split("?")[0].split(".").pop().toLowerCase();t.includes(l)?(p.push(e),n.push(o.tempFilePaths[c])):(i=!0,s=l)})),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}}),o.setConfig({config:{loadFontOnce:!0}}),s().app.mount("#app"),exports.createApp=s;

View File

@@ -1,91 +0,0 @@
{
"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/process-chain",
"pages/hiddendanger/rectification",
"pages/hiddendanger/acceptance",
"pages/hiddendanger/acceptance-approval",
"pages/hiddendanger/assignment",
"pages/closeout/application",
"pages/closeout/apply",
"pages/closeout/approval",
"pages/closeout/leader-approval",
"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/personalcenter/identity",
"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

@@ -1 +0,0 @@
"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

@@ -1 +0,0 @@
"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

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

View File

@@ -1 +0,0 @@
<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

@@ -1 +0,0 @@
.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)}

View File

@@ -1 +0,0 @@
"use strict";const e=require("../../common/vendor.js"),t=require("../../request/api.js"),a=require("./flowAssigneeUtils.js");if(!Array){e.resolveComponent("u-popup")()}Math||(i+(()=>"../../uni_modules/uview-plus/components/u-popup/u-popup.js"))();const i=()=>"./FlowAssigneeTree.js",n={__name:"FlowAssigneePickerPopup",props:{show:{type:Boolean,default:!1},taskId:{type:String,default:""},pickerIdentityId:{type:String,default:""},pickerName:{type:String,default:""}},emits:["update:pickerIdentityId","update:pickerName","cancel","confirm"],setup(i,{emit:n}){const o=i,s=n,r=e.ref(!1),d=e.ref([]),u=e.ref(""),p=e.ref(""),l=e.computed((()=>{const e=a.findAssigneeUserInDeptTree(d.value,u.value);return e?a.formatAssigneeDisplayName(e):p.value}));e.watch((()=>o.show),(async i=>{i&&(u.value=o.pickerIdentityId||"",p.value=o.pickerName||"",await(async()=>{if(o.taskId){r.value=!0;try{const i=await t.getFlowApproverCandidates(o.taskId);0===i.code?d.value=a.normalizeApproverDeptTree(i.data):(d.value=[],e.index.showToast({title:i.msg||"获取处理人失败",icon:"none"}))}catch(i){console.error("获取处理人失败:",i),d.value=[],e.index.showToast({title:"获取处理人失败",icon:"none"})}finally{r.value=!1}}else d.value=[]})())}));const c=e=>{const t=a.resolveAssigneeIdentityId(e);t&&(u.value=t,p.value=a.formatAssigneeDisplayName(e),s("update:pickerIdentityId",t),s("update:pickerName",p.value))},v=()=>{s("cancel")},m=()=>{if(!u.value)return void e.index.showToast({title:"请选择下一步处理人",icon:"none"});const t=a.findAssigneeUserInDeptTree(d.value,u.value);if(!t)return void e.index.showToast({title:"所选身份无效,请重新选择",icon:"none"});const i=a.formatAssigneeDisplayName(t);s("update:pickerIdentityId",u.value),s("update:pickerName",i),s("confirm",{identityId:u.value,name:i,user:t})};return(t,a)=>e.e({a:e.o(v),b:i.pickerIdentityId},i.pickerIdentityId?{c:e.t(l.value)}:{},{d:r.value},r.value?{}:i.taskId?0===d.value.length?{}:{g:e.o(c),h:e.p({depts:d.value,"selected-identity-id":i.pickerIdentityId})}:{},{e:!i.taskId,f:0===d.value.length,i:e.o(v),j:e.o(m),k:e.o(v),l:e.p({show:i.show,mode:"bottom",round:"20"}),m:e.gei(t,"")})}},o=e._export_sfc(n,[["__scopeId","data-v-120ddf40"]]);wx.createComponent(o);

View File

@@ -1,7 +0,0 @@
{
"component": true,
"usingComponents": {
"u-popup": "../../uni_modules/uview-plus/components/u-popup/u-popup",
"flow-assignee-tree": "./FlowAssigneeTree"
}
}

View File

@@ -1 +0,0 @@
<u-popup wx:if="{{l}}" u-s="{{['d']}}" bindclose="{{k}}" u-i="120ddf40-0" bind:__l="__l" u-p="{{l}}" class="{{['data-v-120ddf40', virtualHostClass]}}" virtualHostClass="{{['data-v-120ddf40', virtualHostClass]}}" style="{{virtualHostStyle}}" virtualHostStyle="{{virtualHostStyle}}" hidden="{{virtualHostHidden || false}}" virtualHostHidden="{{virtualHostHidden || false}}" id="{{m}}" virtualHostId="{{m}}"><view class="user-popup data-v-120ddf40"><view class="popup-header data-v-120ddf40"><view class="popup-title text-bold data-v-120ddf40">选择下一步处理人</view><view class="popup-close data-v-120ddf40" bindtap="{{a}}">×</view></view><view wx:if="{{b}}" class="selected-summary data-v-120ddf40"><text class="summary-label data-v-120ddf40">已选:</text><text class="summary-text data-v-120ddf40">{{c}}</text></view><scroll-view class="user-list-scroll data-v-120ddf40" scroll-y><view wx:if="{{d}}" class="empty-tip data-v-120ddf40">加载中...</view><view wx:elif="{{e}}" class="empty-tip data-v-120ddf40">缺少任务ID无法加载处理人</view><view wx:elif="{{f}}" class="empty-tip data-v-120ddf40">暂无人员数据</view><flow-assignee-tree wx:else class="data-v-120ddf40" virtualHostClass="data-v-120ddf40" bindselect="{{g}}" u-i="120ddf40-1,120ddf40-0" bind:__l="__l" u-p="{{h||''}}"/></scroll-view><view class="popup-footer data-v-120ddf40"><button class="btn-cancel data-v-120ddf40" bindtap="{{i}}">取消</button><button class="btn-confirm bg-blue data-v-120ddf40" bindtap="{{j}}">确定</button></view></view></u-popup>

View File

@@ -1 +0,0 @@
.user-popup.data-v-120ddf40{background:#fff}.user-popup .popup-header.data-v-120ddf40{display:flex;justify-content:space-between;align-items:center;padding:30rpx;border-bottom:1rpx solid #eee}.user-popup .popup-header .popup-title.data-v-120ddf40{font-size:32rpx;color:#333}.user-popup .popup-header .popup-close.data-v-120ddf40{font-size:40rpx;color:#999;line-height:1}.user-popup .selected-summary.data-v-120ddf40{padding:16rpx 30rpx;background:#f5f7fa;border-bottom:1rpx solid #eee;font-size:24rpx;line-height:1.5}.user-popup .selected-summary .summary-label.data-v-120ddf40{color:#909399}.user-popup .selected-summary .summary-text.data-v-120ddf40{color:#333}.user-popup .user-list-scroll.data-v-120ddf40{max-height:600rpx;box-sizing:border-box}.user-popup .empty-tip.data-v-120ddf40{padding:80rpx 20rpx;text-align:center;color:#909399;font-size:26rpx}.user-popup .popup-footer.data-v-120ddf40{display:flex;gap:24rpx;padding:24rpx 30rpx;padding-bottom:calc(24rpx + env(safe-area-inset-bottom));background:#fff}.user-popup .popup-footer button.data-v-120ddf40{flex:1;height:80rpx;line-height:80rpx;border-radius:40rpx;font-size:30rpx;margin:0;padding:0}.user-popup .popup-footer button.data-v-120ddf40:after{border:none}.user-popup .popup-footer .btn-cancel.data-v-120ddf40{background:#fff;color:#2667e9;border:2rpx solid #2667E9}.user-popup .popup-footer .btn-confirm.data-v-120ddf40{color:#fff;border:none}

View File

@@ -1 +0,0 @@
"use strict";const e=require("../../common/vendor.js"),t=require("./flowAssigneeUtils.js"),r={__name:"FlowAssigneeTree",props:{depts:{type:Array,default:()=>[]},selectedIdentityId:{type:String,default:""}},emits:["select"],setup(r,{emit:s}){const n=r,d=s,i=e.computed((()=>t.flattenApproverDeptTree(n.depts)));return(s,n)=>({a:e.f(i.value,((s,n,i)=>e.e({a:"dept"===s.type},"dept"===s.type?{b:e.t(s.deptName),c:24*s.level+20+"rpx"}:e.e({d:e.t(e.unref(t.formatAssigneeDisplayName)(s.user)),e:String(r.selectedIdentityId)===String(e.unref(t.resolveAssigneeIdentityId)(s.user))},(String(r.selectedIdentityId),String(e.unref(t.resolveAssigneeIdentityId)(s.user)),{}),{f:String(r.selectedIdentityId)===String(e.unref(t.resolveAssigneeIdentityId)(s.user))?1:"",g:24*s.level+20+"rpx",h:e.o((e=>{return t=s.user,void d("select",t);var t}),s.key)}),{i:s.key}))),b:e.gei(s,"")})}},s=e._export_sfc(r,[["__scopeId","data-v-0f6adde8"]]);wx.createComponent(s);

View File

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

View File

@@ -1 +0,0 @@
<view class="{{['assignee-tree', 'data-v-0f6adde8', virtualHostClass]}}" style="{{virtualHostStyle}}" hidden="{{virtualHostHidden || false}}" id="{{b}}"><block wx:for="{{a}}" wx:for-item="row" wx:key="i"><view wx:if="{{row.a}}" class="dept-node data-v-0f6adde8" style="{{'padding-left:' + row.c}}"><text class="dept-name data-v-0f6adde8">{{row.b}}</text></view><view wx:else class="{{['user-item', 'data-v-0f6adde8', row.f && 'active']}}" style="{{'padding-left:' + row.g}}" bindtap="{{row.h}}"><text class="user-item-text data-v-0f6adde8">{{row.d}}</text><text wx:if="{{row.e}}" class="cuIcon-check text-blue data-v-0f6adde8"></text></view></block></view>

View File

@@ -1 +0,0 @@
.dept-node.data-v-0f6adde8{padding:20rpx 20rpx 12rpx;font-size:26rpx;color:#909399;line-height:1.4}.dept-name.data-v-0f6adde8{font-weight:600}.user-item.data-v-0f6adde8{display:flex;align-items:center;justify-content:space-between;padding:24rpx 20rpx;border-bottom:1rpx solid #f5f5f5}.user-item.active .user-item-text.data-v-0f6adde8{color:#2667e9;font-weight:600}.user-item .user-item-text.data-v-0f6adde8{flex:1;font-size:28rpx;color:#333}

View File

@@ -1 +0,0 @@
"use strict";const e=e=>{if(!e)return"";const r=e.identityId??e.userIdentityId??e.userId??"";return""===r||null==r?"":String(r)},r=r=>{const t=e(r);return t?`identity-${t}`:`user-${r.userId||r.nickName||""}`},t=(r,s)=>{var n;if(!s||!Array.isArray(r))return null;for(const i of r){const r=(i.users||[]).find((r=>String(e(r))===String(s)));if(r)return r;if(null==(n=i.children)?void 0:n.length){const e=t(i.children,s);if(e)return e}}return null},s=(e,t=0)=>{var n;const i=[];if(!Array.isArray(e))return i;for(const a of e){i.push({type:"dept",key:`dept-${a.deptId??a.deptName??t}`,deptName:a.deptName||"",level:t});for(const e of a.users||[])i.push({type:"user",key:r(e),user:e,level:t+1});(null==(n=a.children)?void 0:n.length)&&i.push(...s(a.children,t+1))}return i};exports.findAssigneeUserInDeptTree=t,exports.flattenApproverDeptTree=s,exports.formatAssigneeDisplayName=e=>e?e.identityName?`${e.nickName||e.userName||""}_${e.identityName}`:e.postName?`${e.nickName||e.userName||""}_${e.postName}`:e.nickName||e.userName||e.name||"未知人员":"",exports.normalizeApproverDeptTree=e=>e?Array.isArray(e)?e:Array.isArray(e.records)?e.records:Array.isArray(e.list)?e.list:[]:[],exports.resolveAssigneeIdentityId=e;

File diff suppressed because one or more lines are too long

View File

@@ -1,9 +0,0 @@
{
"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

@@ -1 +0,0 @@
"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

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

View File

@@ -1 +0,0 @@
<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

@@ -1 +0,0 @@
"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,r={}){var i,d,n;const{formData:o,address:u,lng:s,lat:c,areaId:g,fileList:m}=l,I=null==(i=l.tagOptions)?void 0:i[o.tagIndex],f=o.tagId??(I?I.id:null);return{title:o.title,level:(null==(d=e[o.level])?void 0:d.id)||2,lng:s||0,lat:c||0,address:u||"",areaId:g||null,description:o.description||"",source:(null==(n=a[o.source])?void 0:n.title)||"",hazardSource:o.hazardSourceCode??null,tagId:f,attachments:(m||[]).filter((t=>"success"===t.status)).map((e=>t.buildAttachmentItem(e))),regulationId:o.regulationId||null,...r}},exports.createEmptyHazardPayload=function(){return{formData:{title:"",level:0,source:0,hazardSourceCode:null,hazardSourceName:"",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||null!=e.hazardSourceCode||e.hazardSourceName||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

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

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +0,0 @@
{
"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

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

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.hazard-detail-panel-v2.data-v-4e898db8{flex:1;min-height:0;width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden}.loading-wrap.data-v-4e898db8,.empty-wrap.data-v-4e898db8{flex:1;display:flex;align-items:center;justify-content:center;min-height:0}.loading-text.data-v-4e898db8,.empty-text.data-v-4e898db8{font-size:28rpx;color:#909399}.detail-body.data-v-4e898db8{display:flex;gap:20rpx;align-items:stretch;overflow:hidden;box-sizing:border-box}.steps-card.data-v-4e898db8{width:140rpx;flex-shrink:0;background:#fff;border-radius:20rpx;box-sizing:border-box}.step-item.data-v-4e898db8{padding:0 12rpx}.step-track.data-v-4e898db8{display:flex;flex-direction:column;align-items:center;padding:28rpx 0 0}.step-dot.data-v-4e898db8{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-4e898db8{background:#2667e9}.step-icon.data-v-4e898db8{width:36rpx;height:36rpx}.step-label.data-v-4e898db8{margin-top:12rpx;font-size:24rpx;color:#999;line-height:1.2}.step-label--active.data-v-4e898db8{color:#2667e9;font-weight:600}.step-line.data-v-4e898db8{width:0;height:40rpx;margin:10rpx 0;border-left:2rpx dashed #dcdfe6}.content-column.data-v-4e898db8{flex:1;width:0;min-height:0;box-sizing:border-box}.content-scroll.data-v-4e898db8{width:100%;box-sizing:border-box}.node-section.data-v-4e898db8{box-sizing:border-box;padding:0;margin-bottom:24rpx}.node-section--last.data-v-4e898db8{padding-bottom:40rpx;margin-bottom:0}.detail-card-shell.data-v-4e898db8{border-radius:22rpx;padding:2rpx;background:transparent;transition:background .3s ease,box-shadow .3s ease}.detail-card-shell--active.data-v-4e898db8{background:linear-gradient(145deg,rgba(4,108,234,.48),rgba(38,103,233,.3),rgba(33,88,200,.16));box-shadow:0 8rpx 24rpx rgba(38,103,233,.12)}.detail-card.data-v-4e898db8{background:#fff;border-radius:20rpx;overflow:hidden;padding:28rpx 38rpx;box-sizing:border-box}.card-header-v2.data-v-4e898db8{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx;padding:0}.card-header-main.data-v-4e898db8{flex:1;min-width:0}.operator.data-v-4e898db8{font-size:28rpx;font-weight:600;color:#303133;line-height:1.5;word-break:break-all}.time.data-v-4e898db8{display:block;margin-top:8rpx;font-size:24rpx;color:#999;line-height:1.4}.level-badge.data-v-4e898db8{flex-shrink:0;padding:6rpx 16rpx;border-radius:8rpx;font-size:22rpx;font-weight:500;white-space:nowrap}.level-badge.level-normal.data-v-4e898db8{background:#fff7e6;border:2rpx solid #ffd591;color:#fa8c16}.level-badge.level-major.data-v-4e898db8{background:#fff1f0;border:2rpx solid #ffa39e;color:#f5222d}.card-divider.data-v-4e898db8{height:0;margin:20rpx 0;border-top:2rpx dashed #eee}.card-body.data-v-4e898db8{padding:0}.detail-row-v2.data-v-4e898db8{display:flex;align-items:flex-start;justify-content:flex-start;gap:24rpx;padding:18rpx 0}.detail-row-v2--block.data-v-4e898db8{flex-wrap:wrap}.label.data-v-4e898db8{flex-shrink:0;font-size:26rpx;color:#999;line-height:1.5}.value.data-v-4e898db8{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-4e898db8{display:flex;align-items:center}.area-dot.data-v-4e898db8{width:20rpx;height:20rpx;border-radius:50%;margin-right:12rpx;flex-shrink:0}.level-tag.data-v-4e898db8{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-4e898db8{background:#fff7e6;border:2rpx solid #ffd591;color:#fa8c16}.level-major.data-v-4e898db8{background:#fff1f0;border:2rpx solid #ffa39e;color:#f5222d}.tag-badge.data-v-4e898db8{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-4e898db8{display:flex;flex-wrap:wrap;gap:16rpx;flex:1;min-width:0}.attachment-img.data-v-4e898db8{width:160rpx;height:160rpx;border-radius:12rpx;background:#f5f7fa}.sign-img.data-v-4e898db8{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-4e898db8{display:inline-block;padding:12rpx 20rpx;background:#f5f7fa;border:1rpx solid #e4e7ed;border-radius:8rpx;color:#2667e9;font-size:24rpx}.result-tag.data-v-4e898db8{padding:6rpx 16rpx;border-radius:6rpx;font-size:24rpx}.result-tag--pass.data-v-4e898db8{background:#f0f9eb;color:#67c23a}.result-tag--fail.data-v-4e898db8{background:#fef0f0;color:#f56c6c}

File diff suppressed because one or more lines are too long

View File

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

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
.hazard-process-chain-panel.data-v-0fa85334{flex:1;min-height:0;width:100%;height:100%;display:flex;flex-direction:column;overflow:hidden}.loading-wrap.data-v-0fa85334,.empty-wrap.data-v-0fa85334{flex:1;display:flex;align-items:center;justify-content:center;min-height:0}.loading-text.data-v-0fa85334,.empty-text.data-v-0fa85334{font-size:28rpx;color:#909399}.detail-body.data-v-0fa85334{display:flex;gap:20rpx;align-items:stretch;overflow:hidden;box-sizing:border-box}.steps-card.data-v-0fa85334{width:148rpx;flex-shrink:0;background:#fff;border-radius:20rpx;box-sizing:border-box}.step-item.data-v-0fa85334{padding:0 8rpx}.step-track.data-v-0fa85334{display:flex;flex-direction:column;align-items:center;padding:24rpx 0 0}.step-dot.data-v-0fa85334{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-0fa85334{background:#2667e9}.step-icon.data-v-0fa85334{width:36rpx;height:36rpx}.step-label.data-v-0fa85334{margin-top:10rpx;font-size:20rpx;color:#999;line-height:1.3;text-align:center;word-break:break-all}.step-label--active.data-v-0fa85334{color:#2667e9;font-weight:600}.step-line.data-v-0fa85334{width:0;height:36rpx;margin:8rpx 0;border-left:2rpx dashed #dcdfe6}.content-column.data-v-0fa85334{flex:1;width:0;min-height:0;box-sizing:border-box}.content-scroll.data-v-0fa85334{width:100%;box-sizing:border-box}.node-section.data-v-0fa85334{box-sizing:border-box;padding:0;margin-bottom:24rpx}.node-section--last.data-v-0fa85334{padding-bottom:40rpx;margin-bottom:0}.detail-card-shell.data-v-0fa85334{border-radius:22rpx;padding:2rpx;background:transparent;transition:background .3s ease,box-shadow .3s ease}.detail-card-shell--active.data-v-0fa85334{background:linear-gradient(145deg,rgba(4,108,234,.48),rgba(38,103,233,.3),rgba(33,88,200,.16));box-shadow:0 8rpx 24rpx rgba(38,103,233,.12)}.detail-card.data-v-0fa85334{background:#fff;border-radius:20rpx;overflow:hidden;padding:28rpx 38rpx;box-sizing:border-box}.card-header-v2.data-v-0fa85334{display:flex;align-items:flex-start;justify-content:space-between;gap:16rpx;padding:0}.card-header-main.data-v-0fa85334{flex:1;min-width:0}.operator.data-v-0fa85334{font-size:28rpx;font-weight:600;color:#303133;line-height:1.5;word-break:break-all}.time.data-v-0fa85334{display:block;margin-top:8rpx;font-size:24rpx;color:#999;line-height:1.4}.time.status-pending.data-v-0fa85334{color:#e6a23c}.level-badge.data-v-0fa85334{flex-shrink:0;padding:6rpx 16rpx;border-radius:8rpx;font-size:22rpx;font-weight:500;white-space:nowrap}.level-badge.level-normal.data-v-0fa85334{background:#fff7e6;border:2rpx solid #ffd591;color:#fa8c16}.level-badge.level-major.data-v-0fa85334{background:#fff1f0;border:2rpx solid #ffa39e;color:#f5222d}.card-divider.data-v-0fa85334{height:0;margin:20rpx 0;border-top:2rpx dashed #eee}.card-body.data-v-0fa85334{padding:0}.detail-row-v2.data-v-0fa85334{display:flex;align-items:flex-start;justify-content:flex-start;gap:24rpx;padding:18rpx 0}.detail-row-v2--block.data-v-0fa85334{flex-wrap:wrap}.label.data-v-0fa85334{flex-shrink:0;font-size:26rpx;color:#999;line-height:1.5}.value.data-v-0fa85334{flex:1;min-width:0;font-size:26rpx;color:#333;line-height:1.6;text-align:left;word-break:break-all}.value--pending.data-v-0fa85334{color:#e6a23c}.level-tag.data-v-0fa85334{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-0fa85334{background:#fff7e6;border:2rpx solid #ffd591;color:#fa8c16}.level-major.data-v-0fa85334{background:#fff1f0;border:2rpx solid #ffa39e;color:#f5222d}.attachment-list.data-v-0fa85334{display:flex;flex-wrap:wrap;gap:16rpx;flex:1;min-width:0}.attachment-img.data-v-0fa85334{width:160rpx;height:160rpx;border-radius:12rpx;background:#f5f7fa}.sign-img.data-v-0fa85334{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-0fa85334{display:inline-block;padding:12rpx 20rpx;background:#f5f7fa;border:1rpx solid #e4e7ed;border-radius:8rpx;color:#2667e9;font-size:24rpx}.result-tag.data-v-0fa85334{padding:6rpx 16rpx;border-radius:6rpx;font-size:24rpx}.result-tag--pass.data-v-0fa85334{background:#f0f9eb;color:#67c23a}.result-tag--fail.data-v-0fa85334{background:#fef0f0;color:#f56c6c}

View File

@@ -1 +0,0 @@
"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.formatNameList=m,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:{code:r.code||"-",title:r.title||"-",source:r.source||"-",hazardSourceName:r.hazardSourceName||"-",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`};

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
"use strict";exports.CHAIN_LABELS={loading:"加载中...",empty:"暂无流程记录",personnelSuffix:"人员:",executorPrefix:"执行",statusSuffix:"状态:",hazardCode:"隐患编号",hazardTitle:"隐患标题",checkSource:"检查形式",hazardSource:"隐患来源",hazardArea:"隐患区域",address:"位置描述",hazardLevel:"隐患等级",hazardTag:"隐患标签",description:"问题描述",hazardAttachments:"隐患附件",legalBasis:"参考法规",assigneeName:"指定整改责任人",assignDeadline:"指定整改截至日期",assignStatus:"交办状态",rectifyStatus:"整改状态",rectifyPlan:"整改方案",rectifyResult:"整改结果",rectifyMeasures:"整改措施",controlMeasures:"管控措施",rectifierName:"整改责任人",managerNames:"管理人员",memberNames:"整改成员",planCost:"预计费用",actualCost:"实际费用",rectifyAttachments:"整改附件",rectifySign:"整改签字",verifyResult:"验收结果",pass:"通过",verifyRemark:"验收备注",verifyAttachments:"验收附件",verifySign:"验收签字",writeoffDeadline:"整改时限",responsibleDept:"治理责任单位",responsiblePerson:"主要负责人",mainTreatment:"主要治理内容",treatmentResult:"治理完成内容",selfVerify:"自行验收情况",applySign:"申请签字",approvalOpinion:"审批意见",approvalComment:"意见说明",smsReminder:"短信提醒",yes:"是",no:"否",approvalSign:"审批签字",attachmentFallback:"附件",yuan:"元"},exports.LEVEL_NAME_CLASS_MAP={"一般":"level-normal","一般隐患":"level-normal","重大":"level-major","重大隐患":"level-major"};

View File

@@ -1 +0,0 @@
"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

@@ -1 +0,0 @@
"use strict";const e=require("../../common/vendor.js"),l=require("./processChain.js");exports.useProcessChainScroll=function(t,o){const n=e.getCurrentInstance(),u=(null==n?void 0:n.proxy)||n,r=e.ref([]),c=e.ref(0),s=e.ref([0]),i=e.ref(0),a=e.ref(""),v=e.ref(""),d=e.ref(!0),f=e.ref(!1);let h=null;const p=()=>{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;i.value=l.height||0;const n=(null==t?void 0:t.scrollTop)||0;s.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||(p(),setTimeout(p,300))})),e.watch((()=>"function"==typeof t?t():null==t?void 0:t.value),(e=>(e=>{const t=(null==e?void 0:e.nodes)||[];r.value=l.mapProcessChainNodes(t),c.value=0,a.value="",p(),setTimeout(p,300)})(e)),{immediate:!0,deep:!0}),e.watch(c,(e=>{v.value="process-step-"+e,setTimeout((()=>{v.value=""}),300)})),e.watch((()=>r.value.length),(()=>p())),e.onReady((()=>{p(),setTimeout(p,300)})),{historyList:r,activeIndex:c,contentScrollIntoView:a,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&&i.value>0&&e+i.value>=l-60)return void(c.value!==t-1&&(c.value=t-1));const o=s.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!==c.value&&(c.value=n)})(l,t),p()},onScrollToLower:()=>{const e=r.value.length;e>0&&c.value!==e-1&&(c.value=e-1)},scrollToNode:e=>{e<0||e>=r.value.length||(f.value=!0,d.value=!0,c.value=e,a.value="process-node-"+e,setTimeout((()=>{a.value="",f.value=!1,p()}),350))},scheduleMeasureLayout:p}};

View File

@@ -1 +0,0 @@
"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

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

View File

@@ -1 +0,0 @@
<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

@@ -1 +0,0 @@
"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

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

View File

@@ -1 +0,0 @@
<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

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

View File

@@ -1 +0,0 @@
<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

@@ -1 +0,0 @@
.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

@@ -1,8 +0,0 @@
{
"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

@@ -1 +0,0 @@
.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

@@ -1 +0,0 @@
"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

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

View File

@@ -1 +0,0 @@
<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

@@ -1 +0,0 @@
"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

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

View File

@@ -1 +0,0 @@
<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

@@ -1 +0,0 @@
.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

@@ -1,9 +0,0 @@
{
"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

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

View File

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

File diff suppressed because one or more lines are too long

View File

@@ -1,11 +0,0 @@
{
"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

@@ -1 +0,0 @@
"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

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

View File

@@ -1 +0,0 @@
<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

@@ -1 +0,0 @@
.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

@@ -1 +0,0 @@
"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

@@ -1,8 +0,0 @@
{
"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

@@ -1 +0,0 @@
.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

@@ -1 +0,0 @@
"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-4a66b6cd"]]);wx.createPage(l);

View File

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

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