| src/api/safeProduction/specialEquipmentManagement.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/safeProduction/specialEquipmentManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/safeProduction/specialEquipmentManagement/ledgerEdit.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/safeProduction/specialEquipmentManagement/recordEdit.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/safeProduction/specialEquipmentManagement/rectificationEdit.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/pages/works.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/safeProduction/specialEquipmentManagement.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,106 @@ import request from "@/utils/request"; export function specialEquipmentLedgerListPage(query) { return request({ url: "/safe/specialEquipment/ledger/listPage", method: "get", params: query, }); } export function specialEquipmentLedgerList(query) { return request({ url: "/safe/specialEquipment/ledger/list", method: "get", params: query, }); } export function specialEquipmentLedgerAdd(data) { return request({ url: "/safe/specialEquipment/ledger/add", method: "post", data, }); } export function specialEquipmentLedgerUpdate(data) { return request({ url: "/safe/specialEquipment/ledger/update", method: "post", data, }); } export function specialEquipmentLedgerDel(ids) { return request({ url: "/safe/specialEquipment/ledger/delete", method: "delete", data: ids, }); } export function specialEquipmentRecordListPage(query) { return request({ url: "/safe/specialEquipment/record/listPage", method: "get", params: query, }); } export function specialEquipmentRecordAdd(data) { return request({ url: "/safe/specialEquipment/record/add", method: "post", data, }); } export function specialEquipmentRecordUpdate(data) { return request({ url: "/safe/specialEquipment/record/update", method: "post", data, }); } export function specialEquipmentRecordDel(ids) { return request({ url: "/safe/specialEquipment/record/delete", method: "delete", data: ids, }); } export function specialEquipmentRectificationListPage(query) { return request({ url: "/safe/specialEquipment/rectification/listPage", method: "get", params: query, }); } export function specialEquipmentRectificationAdd(data) { return request({ url: "/safe/specialEquipment/rectification/add", method: "post", data, }); } export function specialEquipmentRectificationClose(data) { return request({ url: "/safe/specialEquipment/rectification/close", method: "post", data, }); } export function specialEquipmentRectificationDel(ids) { return request({ url: "/safe/specialEquipment/rectification/delete", method: "delete", data: ids, }); } src/pages.json
@@ -1020,6 +1020,34 @@ } }, { "path": "pages/safeProduction/specialEquipmentManagement/index", "style": { "navigationBarTitleText": "ç¹ç§è®¾å¤ç®¡ç", "navigationStyle": "custom" } }, { "path": "pages/safeProduction/specialEquipmentManagement/ledgerEdit", "style": { "navigationBarTitleText": "å°è´¦", "navigationStyle": "custom" } }, { "path": "pages/safeProduction/specialEquipmentManagement/recordEdit", "style": { "navigationBarTitleText": "æ£éªç»´ä¿", "navigationStyle": "custom" } }, { "path": "pages/safeProduction/specialEquipmentManagement/rectificationEdit", "style": { "navigationBarTitleText": "éæ£æ´æ¹", "navigationStyle": "custom" } }, { "path": "pages/safeProduction/accidentReportingRecord/index", "style": { "navigationBarTitleText": "äºæ æ¥åè®°å½", src/pages/safeProduction/specialEquipmentManagement/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,516 @@ <template> <view class="special-equipment"> <PageHeader title="ç¹ç§è®¾å¤ç®¡ç" @back="goBack"> </PageHeader> <view class="tabs-section"> <up-tabs v-model="activeTabIndex" :list="tabList" itemStyle="width: 33.33%;height: 80rpx;" @change="onTabChange" /> </view> <scroll-view scroll-y class="list-scroll" @scrolltolower="loadMore" v-if="list.length > 0"> <up-checkbox-group v-if="selectMode" v-model="selectedIds" placement="column"> <view v-for="row in list" :key="row.id" class="card" @click="toggleSelect(row)"> <view class="card-header"> <text class="title">{{ getCardTitle(row) }}</text> <view class="right"> <up-checkbox :name="String(row.id)" :label="''" @click.stop></up-checkbox> </view> </view> <up-divider></up-divider> <view class="card-body"> <template v-if="activeTab === 'ledger'"> <view class="row"><text class="label">设å¤ç¼å·</text><text class="value">{{ row.equipmentNo || '-' }}</text></view> <view class="row"><text class="label">设å¤ç±»å«</text><text class="value">{{ row.equipmentType || '-' }}</text></view> <view class="row"><text class="label">å®è£ ä½ç½®</text><text class="value">{{ row.installLocation || '-' }}</text></view> <view class="row"><text class="label">è´è´£äºº</text><text class="value">{{ row.managerName || '-' }}</text></view> </template> <template v-else-if="activeTab === 'record'"> <view class="row"><text class="label">è®°å½ç±»å</text><text class="value">{{ recordTypeLabel(row.recordType) }}</text></view> <view class="row"><text class="label">è®°å½æ¥æ</text><text class="value">{{ row.recordDate || '-' }}</text></view> <view class="row"><text class="label">æ§è¡äºº</text><text class="value">{{ row.executorName || '-' }}</text></view> <view class="row"><text class="label">䏿¬¡å°ææ¥æ</text><text class="value">{{ row.nextDueDate || '-' }}</text></view> </template> <template v-else> <view class="row"><text class="label">é£é©ç级</text><text class="value">{{ row.riskLevel || '-' }}</text></view> <view class="row"><text class="label">åç°æ¥æ</text><text class="value">{{ row.discoveredDate || '-' }}</text></view> <view class="row"><text class="label">责任人</text><text class="value">{{ row.responsibleUserName || '-' }}</text></view> <view class="row"><text class="label">æ´æ¹ç¶æ</text><text class="value">{{ rectStatusLabel(row.rectificationStatus) }}</text></view> </template> </view> </view> </up-checkbox-group> <view v-else> <view v-for="row in list" :key="row.id" class="card"> <view class="card-header"> <text class="title">{{ getCardTitle(row) }}</text> <up-tag v-if="activeTab === 'record'" :text="recordTypeLabel(row.recordType)" type="primary" size="mini" /> <up-tag v-else-if="activeTab === 'rectification'" :text="rectStatusLabel(row.rectificationStatus)" type="info" size="mini" /> </view> <up-divider></up-divider> <view class="card-body"> <template v-if="activeTab === 'ledger'"> <view class="row"><text class="label">设å¤ç¼å·</text><text class="value">{{ row.equipmentNo || '-' }}</text></view> <view class="row"><text class="label">设å¤ç±»å«</text><text class="value">{{ row.equipmentType || '-' }}</text></view> <view class="row"><text class="label">å®è£ ä½ç½®</text><text class="value">{{ row.installLocation || '-' }}</text></view> <view class="row"><text class="label">è´è´£äºº</text><text class="value">{{ row.managerName || '-' }}</text></view> </template> <template v-else-if="activeTab === 'record'"> <view class="row"><text class="label">å ³è设å¤</text><text class="value">{{ row.equipmentName || '-' }}</text></view> <view class="row"><text class="label">è®°å½æ¥æ</text><text class="value">{{ row.recordDate || '-' }}</text></view> <view class="row"><text class="label">æ§è¡äºº</text><text class="value">{{ row.executorName || '-' }}</text></view> <view class="row"><text class="label">䏿¬¡å°ææ¥æ</text><text class="value">{{ row.nextDueDate || '-' }}</text></view> </template> <template v-else> <view class="row"><text class="label">鿣æè¿°</text><text class="value">{{ row.hazardDescription || '-' }}</text></view> <view class="row"><text class="label">é£é©ç级</text><text class="value">{{ row.riskLevel || '-' }}</text></view> <view class="row"><text class="label">æ´æ¹æé</text><text class="value">{{ row.rectificationDeadline || '-' }}</text></view> <view class="row"><text class="label">责任人</text><text class="value">{{ row.responsibleUserName || '-' }}</text></view> </template> </view> <view class="actions"> <u-button v-if="activeTab !== 'rectification'" size="small" class="action-btn" @click.stop="goEdit(row)">ç¼è¾</u-button> <u-button size="small" class="action-btn" type="error" @click.stop="deleteSingle(row)">å é¤</u-button> </view> </view> <up-loadmore :status="loadStatus" /> </view> </scroll-view> <view v-else class="no-data"> <up-empty mode="data" text="ææ æ°æ®"></up-empty> </view> <FooterButtons v-if="selectMode" cancelText="åæ¶" confirmText="å é¤" :confirmDisabled="selectedIds.length === 0" @cancel="exitSelectMode" @confirm="deleteSelected" /> <view class="fab-button" @click="goAdd"> <up-icon name="plus" size="24" color="#ffffff"></up-icon> </view> <up-action-sheet :show="showRecordTypeSheet" title="éæ©è®°å½ç±»å" :actions="recordTypeActions" @select="onSelectRecordType" @close="showRecordTypeSheet = false" /> <up-action-sheet :show="showRectStatusSheet" title="éæ©æ´æ¹ç¶æ" :actions="rectStatusActions" @select="onSelectRectStatus" @close="showRectStatusSheet = false" /> </view> </template> <script setup> import { computed, onMounted, reactive, ref } from "vue"; import { onShow } from "@dcloudio/uni-app"; import PageHeader from "@/components/PageHeader.vue"; import FooterButtons from "@/components/FooterButtons.vue"; import { specialEquipmentLedgerDel, specialEquipmentLedgerListPage, specialEquipmentRecordDel, specialEquipmentRecordListPage, specialEquipmentRectificationDel, specialEquipmentRectificationListPage, } from "@/api/safeProduction/specialEquipmentManagement"; const tabList = reactive([ { name: "çµåå°è´¦", value: "ledger" }, { name: "æ£éªç»´ä¿", value: "record" }, { name: "éæ£æ´æ¹", value: "rectification" }, ]); const activeTabIndex = ref(0); const activeTab = computed( () => tabList[activeTabIndex.value]?.value || "ledger" ); const ledgerSearch = reactive({ equipmentName: "" }); const recordSearch = reactive({ recordType: "" }); const rectSearch = reactive({ rectificationStatus: "" }); const page = reactive({ current: 1, size: 10, total: 0 }); const list = ref([]); const loadStatus = ref("loadmore"); const loading = ref(false); const selectMode = ref(false); const selectedIds = ref([]); const showRecordTypeSheet = ref(false); const showRectStatusSheet = ref(false); const recordTypeActions = [ { name: "æ£éª", value: 1 }, { name: "ç»´ä¿", value: 2 }, ]; const rectStatusActions = [ { name: "å¾ æ´æ¹", value: 1 }, { name: "æ´æ¹ä¸", value: 2 }, { name: "å¾ å¤æ ¸", value: 3 }, { name: "å·²éç¯", value: 4 }, ]; const recordTypeText = computed(() => { const v = recordSearch.recordType; if (!v) return ""; return v === 1 ? "æ£éª" : "ç»´ä¿"; }); const rectStatusText = computed(() => rectStatusLabel(rectSearch.rectificationStatus) ); const recordTypeLabel = v => { if (String(v) === "1") return "æ£éª"; if (String(v) === "2") return "ç»´ä¿"; return "-"; }; const rectStatusLabel = v => { const map = { 1: "å¾ æ´æ¹", 2: "æ´æ¹ä¸", 3: "å¾ å¤æ ¸", 4: "å·²éç¯" }; return map[Number(v)] || ""; }; const goBack = () => { uni.navigateBack(); }; const getCardTitle = row => { if (activeTab.value === "ledger") return row.equipmentName || "-"; if (activeTab.value === "record") return row.recordNo || "-"; return row.hazardDescription || "-"; }; const resetAndQuery = () => { page.current = 1; page.total = 0; list.value = []; loadStatus.value = "loadmore"; exitSelectMode(); fetchList(); }; const fetchList = () => { if (loading.value) return; loading.value = true; loadStatus.value = "loading"; const reqPage = { current: page.current, size: page.size }; let req; if (activeTab.value === "ledger") { req = specialEquipmentLedgerListPage({ ...ledgerSearch, ...reqPage }); } else if (activeTab.value === "record") { req = specialEquipmentRecordListPage({ ...recordSearch, ...reqPage }); } else { req = specialEquipmentRectificationListPage({ ...rectSearch, ...reqPage }); } req .then(res => { const records = res?.data?.records || res?.data?.rows || []; const total = Number(res?.data?.total || 0); page.total = total; list.value = page.current === 1 ? records : [...list.value, ...records]; loadStatus.value = list.value.length >= page.total ? "nomore" : "loadmore"; }) .catch(() => { loadStatus.value = "loadmore"; uni.showToast({ title: "å 载失败", icon: "none" }); }) .finally(() => { loading.value = false; }); }; const handleSearch = () => { resetAndQuery(); }; const loadMore = () => { if (loadStatus.value !== "loadmore") return; page.current++; fetchList(); }; const onTabChange = val => { activeTabIndex.value = val.index; resetAndQuery(); }; const ledgerQuery = () => { resetAndQuery(); }; const enterSelectMode = () => { selectMode.value = true; selectedIds.value = []; }; const exitSelectMode = () => { selectMode.value = false; selectedIds.value = []; }; const toggleSelect = row => { if (!row?.id) return; const id = String(row.id); const idx = selectedIds.value.indexOf(id); if (idx >= 0) selectedIds.value.splice(idx, 1); else selectedIds.value.push(id); }; const deleteApi = ids => { if (activeTab.value === "ledger") return specialEquipmentLedgerDel(ids); if (activeTab.value === "record") return specialEquipmentRecordDel(ids); return specialEquipmentRectificationDel(ids); }; const deleteSelected = () => { const ids = selectedIds.value.map(i => Number(i)); if (!ids.length) { uni.showToast({ title: "è¯·éæ©è¦å é¤çæ°æ®", icon: "none" }); return; } uni.showModal({ title: "å é¤ç¡®è®¤", content: "确认å 餿鿰æ®åï¼", success: res => { if (!res.confirm) return; uni.showLoading({ title: "å é¤ä¸...", mask: true }); deleteApi(ids) .then(() => { uni.showToast({ title: "å 餿å", icon: "success" }); exitSelectMode(); resetAndQuery(); }) .catch(() => { uni.showToast({ title: "å é¤å¤±è´¥", icon: "none" }); }) .finally(() => { uni.hideLoading(); }); }, }); }; const deleteSingle = row => { if (!row?.id) return; uni.showModal({ title: "å é¤ç¡®è®¤", content: "确认å é¤è¯¥æ¡æ°æ®åï¼", success: res => { if (!res.confirm) return; uni.showLoading({ title: "å é¤ä¸...", mask: true }); deleteApi([row.id]) .then(() => { uni.showToast({ title: "å 餿å", icon: "success" }); resetAndQuery(); }) .catch(() => { uni.showToast({ title: "å é¤å¤±è´¥", icon: "none" }); }) .finally(() => { uni.hideLoading(); }); }, }); }; const goAdd = () => { if (activeTab.value === "ledger") { uni.navigateTo({ url: "/pages/safeProduction/specialEquipmentManagement/ledgerEdit", }); return; } if (activeTab.value === "record") { uni.navigateTo({ url: "/pages/safeProduction/specialEquipmentManagement/recordEdit", }); return; } uni.navigateTo({ url: "/pages/safeProduction/specialEquipmentManagement/rectificationEdit", }); }; const goEdit = row => { if (!row?.id) return; const data = encodeURIComponent(JSON.stringify(row)); if (activeTab.value === "ledger") { uni.navigateTo({ url: `/pages/safeProduction/specialEquipmentManagement/ledgerEdit?data=${data}`, }); return; } if (activeTab.value === "record") { uni.navigateTo({ url: `/pages/safeProduction/specialEquipmentManagement/recordEdit?data=${data}`, }); return; } }; const onSelectRecordType = action => { recordSearch.recordType = action.value; showRecordTypeSheet.value = false; resetAndQuery(); }; const onSelectRectStatus = action => { rectSearch.rectificationStatus = action.value; showRectStatusSheet.value = false; resetAndQuery(); }; onMounted(() => { resetAndQuery(); }); onShow(() => { resetAndQuery(); }); </script> <style scoped lang="scss"> @import "../../../styles/sales-common.scss"; .special-equipment { min-height: 100vh; background: #f8f9fa; position: relative; padding-bottom: 140rpx; } .tabs-section { background: #fff; padding: 0 12px 8px 12px; } .header-right { display: flex; align-items: center; padding-right: 12rpx; } .list-scroll { flex: 1; min-height: 0; padding: 0 0 20rpx 0; } .card { background: #fff; border-radius: 16rpx; padding: 24rpx; margin: 20rpx; box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.05); } .card-header { display: flex; align-items: center; justify-content: space-between; gap: 12rpx; } .title { font-size: 28rpx; font-weight: 600; color: #333; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .card-body { padding: 10rpx 0; } .row { display: flex; justify-content: space-between; margin-bottom: 12rpx; } .label { font-size: 26rpx; color: #999; } .value { font-size: 26rpx; color: #333; text-align: right; max-width: 70%; word-break: break-all; } .actions { display: flex; justify-content: flex-end; align-items: center; gap: 16rpx; padding-top: 16rpx; border-top: 1rpx solid #f0f0f0; } .fab-button { position: fixed; right: 30rpx; bottom: 140rpx; width: 96rpx; height: 96rpx; background: #3c9cff; border-radius: 48rpx; display: flex; align-items: center; justify-content: center; box-shadow: 0 8rpx 24rpx rgba(60, 156, 255, 0.3); z-index: 1001; } .no-data { padding-top: 200rpx; } .card-header .right :deep(.up-checkbox__label) { display: none; } .u-border, .up-border { border: none !important; } </style> src/pages/safeProduction/specialEquipmentManagement/ledgerEdit.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,145 @@ <template> <view class="account-detail"> <PageHeader :title="pageTitle" @back="goBack" /> <up-form ref="formRef" :model="form" label-width="110"> <up-form-item label="设å¤ç¼å·" required> <up-input v-model="form.equipmentNo" placeholder="请è¾å ¥" clearable /> </up-form-item> <up-form-item label="设å¤åç§°" required> <up-input v-model="form.equipmentName" placeholder="请è¾å ¥" clearable /> </up-form-item> <up-form-item label="设å¤ç±»å«"> <up-input v-model="form.equipmentType" placeholder="请è¾å ¥" clearable /> </up-form-item> <up-form-item label="è§æ ¼åå·"> <up-input v-model="form.modelSpec" placeholder="请è¾å ¥" clearable /> </up-form-item> <up-form-item label="å®è£ ä½ç½®"> <up-input v-model="form.installLocation" placeholder="请è¾å ¥" clearable /> </up-form-item> <up-form-item label="使ç¨åä½"> <up-input v-model="form.useUnit" placeholder="请è¾å ¥" clearable /> </up-form-item> <up-form-item label="è´è´£äºº"> <up-input v-model="managerName" placeholder="è¯·éæ©" readonly @click="showManagerSheet = true" /> <template #right> <up-icon name="arrow-right" @click="showManagerSheet = true"></up-icon> </template> </up-form-item> </up-form> <FooterButtons :loading="loading" confirmText="ä¿å" @cancel="goBack" @confirm="handleSubmit" /> <up-action-sheet :show="showManagerSheet" title="éæ©è´è´£äºº" :actions="managerActions" @select="onSelectManager" @close="showManagerSheet = false" /> </view> </template> <script setup> import { computed, onMounted, ref } from "vue"; import { onLoad } from "@dcloudio/uni-app"; import FooterButtons from "@/components/FooterButtons.vue"; import PageHeader from "@/components/PageHeader.vue"; import { userListNoPageByTenantId } from "@/api/system/user"; import { specialEquipmentLedgerAdd, specialEquipmentLedgerUpdate, } from "@/api/safeProduction/specialEquipmentManagement"; const formRef = ref(); const loading = ref(false); const showManagerSheet = ref(false); const managerActions = ref([]); const managerName = ref(""); const form = ref({ id: "", equipmentNo: "", equipmentName: "", equipmentType: "", modelSpec: "", installLocation: "", useUnit: "", managerId: "", managerName: "", }); const pageTitle = computed(() => (form.value.id ? "ç¼è¾å°è´¦" : "æ°å¢å°è´¦")); const goBack = () => { uni.navigateBack(); }; const loadUsers = () => { userListNoPageByTenantId() .then(res => { const rows = Array.isArray(res?.data) ? res.data : []; managerActions.value = rows.map(u => ({ name: u.nickName || u.userName || "", value: u.userId, })); }) .catch(() => { managerActions.value = []; }); }; const onSelectManager = action => { form.value.managerId = action.value; form.value.managerName = action.name; managerName.value = action.name; showManagerSheet.value = false; }; const handleSubmit = async () => { const equipmentNo = String(form.value.equipmentNo || "").trim(); if (!equipmentNo) { uni.showToast({ title: "请è¾å ¥è®¾å¤ç¼å·", icon: "none" }); return; } const equipmentName = String(form.value.equipmentName || "").trim(); if (!equipmentName) { uni.showToast({ title: "请è¾å ¥è®¾å¤åç§°", icon: "none" }); return; } loading.value = true; const api = form.value.id ? specialEquipmentLedgerUpdate : specialEquipmentLedgerAdd; api({ ...form.value, equipmentNo, equipmentName }) .then(() => { uni.showToast({ title: "ä¿åæå", icon: "success" }); uni.$emit("specialEquipmentManagement:refresh"); goBack(); }) .catch(() => { uni.showToast({ title: "ä¿å失败", icon: "none" }); }) .finally(() => { loading.value = false; }); }; onLoad(options => { if (!options?.data) return; try { const row = JSON.parse(decodeURIComponent(options.data)); form.value = { ...form.value, ...(row || {}) }; managerName.value = form.value.managerName || ""; } catch { uni.showToast({ title: "æ°æ®å 载失败", icon: "none" }); } }); onMounted(() => { loadUsers(); }); </script> <style scoped lang="scss"> @import "@/static/scss/form-common.scss"; </style> src/pages/safeProduction/specialEquipmentManagement/recordEdit.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,275 @@ <template> <view class="account-detail"> <PageHeader :title="pageTitle" @back="goBack" /> <up-form ref="formRef" :model="form" label-width="110"> <up-form-item label="å ³è设å¤" required> <up-input v-model="equipmentText" placeholder="è¯·éæ©" readonly @click="showEquipmentSheet = true" /> <template #right> <up-icon name="arrow-right" @click="showEquipmentSheet = true"></up-icon> </template> </up-form-item> <up-form-item label="è®°å½ç±»å" required> <up-input v-model="recordTypeText" placeholder="è¯·éæ©" readonly @click="showRecordTypeSheet = true" /> <template #right> <up-icon name="arrow-right" @click="showRecordTypeSheet = true"></up-icon> </template> </up-form-item> <up-form-item label="è®°å½ç¼å·" required> <up-input v-model="form.recordNo" placeholder="请è¾å ¥" clearable /> </up-form-item> <up-form-item label="è®°å½æ¥æ" required> <up-input v-model="form.recordDate" placeholder="è¯·éæ©" readonly @click="showRecordDatePicker = true" /> <template #right> <up-icon name="arrow-right" @click="showRecordDatePicker = true"></up-icon> </template> </up-form-item> <up-form-item label="æ§è¡äºº" required> <up-input v-model="executorText" placeholder="è¯·éæ©" readonly @click="showExecutorSheet = true" /> <template #right> <up-icon name="arrow-right" @click="showExecutorSheet = true"></up-icon> </template> </up-form-item> <up-form-item label="䏿¬¡å°ææ¥æ"> <up-input v-model="form.nextDueDate" placeholder="è¯·éæ©" readonly @click="showNextDueDatePicker = true" /> <template #right> <up-icon name="arrow-right" @click="showNextDueDatePicker = true"></up-icon> </template> </up-form-item> <up-form-item label="æ§è¡ç»æ"> <up-textarea v-model="form.executeResult" placeholder="请è¾å ¥" auto-height /> </up-form-item> <up-form-item label="é®é¢æè¿°"> <up-textarea v-model="form.problemDescription" placeholder="请è¾å ¥" auto-height /> </up-form-item> <up-form-item label="å¤çæªæ½"> <up-textarea v-model="form.disposeMeasure" placeholder="请è¾å ¥" auto-height /> </up-form-item> <up-form-item label="é件说æ"> <up-textarea v-model="form.attachmentRemark" placeholder="请è¾å ¥" auto-height /> </up-form-item> </up-form> <FooterButtons :loading="loading" confirmText="ä¿å" @cancel="goBack" @confirm="handleSubmit" /> <up-action-sheet :show="showEquipmentSheet" title="éæ©è®¾å¤" :actions="equipmentActions" @select="onSelectEquipment" @close="showEquipmentSheet = false" /> <up-action-sheet :show="showRecordTypeSheet" title="éæ©è®°å½ç±»å" :actions="recordTypeActions" @select="onSelectRecordType" @close="showRecordTypeSheet = false" /> <up-action-sheet :show="showExecutorSheet" title="éæ©æ§è¡äºº" :actions="executorActions" @select="onSelectExecutor" @close="showExecutorSheet = false" /> <up-datetime-picker :show="showRecordDatePicker" v-model="recordDateValue" mode="date" @confirm="onRecordDateConfirm" @cancel="showRecordDatePicker = false" /> <up-datetime-picker :show="showNextDueDatePicker" v-model="nextDueDateValue" mode="date" @confirm="onNextDueDateConfirm" @cancel="showNextDueDatePicker = false" /> </view> </template> <script setup> import { computed, onMounted, ref } from "vue"; import { onLoad } from "@dcloudio/uni-app"; import FooterButtons from "@/components/FooterButtons.vue"; import PageHeader from "@/components/PageHeader.vue"; import { formatDateToYMD } from "@/utils/ruoyi"; import { userListNoPageByTenantId } from "@/api/system/user"; import { specialEquipmentLedgerList, specialEquipmentRecordAdd, specialEquipmentRecordUpdate, } from "@/api/safeProduction/specialEquipmentManagement"; const formRef = ref(); const loading = ref(false); const showEquipmentSheet = ref(false); const showRecordTypeSheet = ref(false); const showExecutorSheet = ref(false); const equipmentActions = ref([]); const executorActions = ref([]); const showRecordDatePicker = ref(false); const showNextDueDatePicker = ref(false); const recordDateValue = ref(Date.now()); const nextDueDateValue = ref(Date.now()); const equipmentText = ref(""); const recordTypeText = ref(""); const executorText = ref(""); const recordTypeActions = [ { name: "æ£éª", value: 1 }, { name: "ç»´ä¿", value: 2 }, ]; const form = ref({ id: "", equipmentId: "", recordType: "", recordNo: "", recordDate: "", executeResult: "", problemDescription: "", disposeMeasure: "", executorId: "", executorName: "", nextDueDate: "", attachmentRemark: "", }); const pageTitle = computed(() => (form.value.id ? "ç¼è¾è®°å½" : "æ°å¢è®°å½")); const goBack = () => { uni.navigateBack(); }; const loadEquipmentOptions = () => { specialEquipmentLedgerList({}) .then(res => { const rows = Array.isArray(res?.data) ? res.data : []; equipmentActions.value = rows.map(r => ({ name: r.equipmentName || "", value: r.id, equipmentNo: r.equipmentNo, })); }) .catch(() => { equipmentActions.value = []; }); }; const loadUsers = () => { userListNoPageByTenantId() .then(res => { const rows = Array.isArray(res?.data) ? res.data : []; executorActions.value = rows.map(u => ({ name: u.nickName || u.userName || "", value: u.userId, })); }) .catch(() => { executorActions.value = []; }); }; const onSelectEquipment = action => { form.value.equipmentId = action.value; equipmentText.value = action.equipmentNo ? `${action.name}(${action.equipmentNo})` : action.name; showEquipmentSheet.value = false; }; const onSelectRecordType = action => { form.value.recordType = action.value; recordTypeText.value = action.name; showRecordTypeSheet.value = false; }; const onSelectExecutor = action => { form.value.executorId = action.value; form.value.executorName = action.name; executorText.value = action.name; showExecutorSheet.value = false; }; const onRecordDateConfirm = e => { const value = e?.value ?? recordDateValue.value; form.value.recordDate = formatDateToYMD(value); showRecordDatePicker.value = false; }; const onNextDueDateConfirm = e => { const value = e?.value ?? nextDueDateValue.value; form.value.nextDueDate = formatDateToYMD(value); showNextDueDatePicker.value = false; }; const normalizeTexts = () => { if (form.value.recordType) { recordTypeText.value = String(form.value.recordType) === "1" ? "æ£éª" : "ç»´ä¿"; } executorText.value = form.value.executorName || ""; }; const handleSubmit = async () => { if (!form.value.equipmentId) { uni.showToast({ title: "è¯·éæ©å ³è设å¤", icon: "none" }); return; } if (!form.value.recordType) { uni.showToast({ title: "è¯·éæ©è®°å½ç±»å", icon: "none" }); return; } const recordNo = String(form.value.recordNo || "").trim(); if (!recordNo) { uni.showToast({ title: "请è¾å ¥è®°å½ç¼å·", icon: "none" }); return; } if (!form.value.recordDate) { uni.showToast({ title: "è¯·éæ©è®°å½æ¥æ", icon: "none" }); return; } if (!form.value.executorId) { uni.showToast({ title: "è¯·éæ©æ§è¡äºº", icon: "none" }); return; } loading.value = true; const api = form.value.id ? specialEquipmentRecordUpdate : specialEquipmentRecordAdd; api({ ...form.value, recordNo }) .then(() => { uni.showToast({ title: "ä¿åæå", icon: "success" }); uni.$emit("specialEquipmentManagement:refresh"); goBack(); }) .catch(() => { uni.showToast({ title: "ä¿å失败", icon: "none" }); }) .finally(() => { loading.value = false; }); }; onLoad(options => { if (!options?.data) return; try { const row = JSON.parse(decodeURIComponent(options.data)); form.value = { ...form.value, ...(row || {}) }; normalizeTexts(); } catch { uni.showToast({ title: "æ°æ®å 载失败", icon: "none" }); } }); onMounted(() => { loadEquipmentOptions(); loadUsers(); }); </script> <style scoped lang="scss"> @import "@/static/scss/form-common.scss"; </style> src/pages/safeProduction/specialEquipmentManagement/rectificationEdit.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,310 @@ <template> <view class="account-detail"> <PageHeader title="æ°å¢æ´æ¹" @back="goBack" /> <up-form ref="formRef" :model="form" label-width="110"> <up-form-item label="å ³è设å¤" required> <up-input v-model="equipmentText" placeholder="è¯·éæ©" readonly @click="showEquipmentSheet = true" /> <template #right> <up-icon name="arrow-right" @click="showEquipmentSheet = true"></up-icon> </template> </up-form-item> <up-form-item label="é£é©ç级" required> <up-input v-model="riskLevelText" placeholder="è¯·éæ©" readonly @click="showRiskLevelSheet = true" /> <template #right> <up-icon name="arrow-right" @click="showRiskLevelSheet = true"></up-icon> </template> </up-form-item> <up-form-item label="åç°æ¥æ" required> <up-input v-model="form.discoveredDate" placeholder="è¯·éæ©" readonly @click="showDiscoveredDatePicker = true" /> <template #right> <up-icon name="arrow-right" @click="showDiscoveredDatePicker = true"></up-icon> </template> </up-form-item> <up-form-item label="æ´æ¹æé" required> <up-input v-model="form.rectificationDeadline" placeholder="è¯·éæ©" readonly @click="showDeadlinePicker = true" /> <template #right> <up-icon name="arrow-right" @click="showDeadlinePicker = true"></up-icon> </template> </up-form-item> <up-form-item label="æ´æ¹è´£ä»»äºº"> <up-input v-model="responsibleUserText" placeholder="è¯·éæ©" readonly @click="showResponsibleUserSheet = true" /> <template #right> <up-icon name="arrow-right" @click="showResponsibleUserSheet = true"></up-icon> </template> </up-form-item> <up-form-item label="æ´æ¹ç¶æ"> <up-input v-model="rectStatusText" placeholder="è¯·éæ©" readonly @click="showRectStatusSheet = true" /> <template #right> <up-icon name="arrow-right" @click="showRectStatusSheet = true"></up-icon> </template> </up-form-item> <up-form-item label="鿣æè¿°" required> <up-textarea v-model="form.hazardDescription" placeholder="请è¾å ¥" auto-height /> </up-form-item> <up-form-item label="æ´æ¹æªæ½"> <up-textarea v-model="form.rectificationMeasures" placeholder="请è¾å ¥" auto-height /> </up-form-item> <up-form-item label="æ´æ¹ç»æ"> <up-textarea v-model="form.rectificationResult" placeholder="请è¾å ¥" auto-height /> </up-form-item> <up-form-item label="夿³¨"> <up-textarea v-model="form.remarks" placeholder="请è¾å ¥" auto-height /> </up-form-item> </up-form> <FooterButtons :loading="loading" confirmText="ä¿å" @cancel="goBack" @confirm="handleSubmit" /> <up-action-sheet :show="showEquipmentSheet" title="éæ©è®¾å¤" :actions="equipmentActions" @select="onSelectEquipment" @close="showEquipmentSheet = false" /> <up-action-sheet :show="showRiskLevelSheet" title="éæ©é£é©ç级" :actions="riskLevelActions" @select="onSelectRiskLevel" @close="showRiskLevelSheet = false" /> <up-action-sheet :show="showResponsibleUserSheet" title="éæ©æ´æ¹è´£ä»»äºº" :actions="responsibleUserActions" @select="onSelectResponsibleUser" @close="showResponsibleUserSheet = false" /> <up-action-sheet :show="showRectStatusSheet" title="éæ©æ´æ¹ç¶æ" :actions="rectStatusActions" @select="onSelectRectStatus" @close="showRectStatusSheet = false" /> <up-datetime-picker :show="showDiscoveredDatePicker" v-model="discoveredDateValue" mode="date" @confirm="onDiscoveredDateConfirm" @cancel="showDiscoveredDatePicker = false" /> <up-datetime-picker :show="showDeadlinePicker" v-model="deadlineValue" mode="date" @confirm="onDeadlineConfirm" @cancel="showDeadlinePicker = false" /> </view> </template> <script setup> import { onMounted, ref } from "vue"; import FooterButtons from "@/components/FooterButtons.vue"; import PageHeader from "@/components/PageHeader.vue"; import { formatDateToYMD } from "@/utils/ruoyi"; import { userListNoPageByTenantId } from "@/api/system/user"; import { specialEquipmentLedgerList, specialEquipmentRectificationAdd, } from "@/api/safeProduction/specialEquipmentManagement"; const formRef = ref(); const loading = ref(false); const equipmentActions = ref([]); const responsibleUserActions = ref([]); const showEquipmentSheet = ref(false); const showRiskLevelSheet = ref(false); const showResponsibleUserSheet = ref(false); const showRectStatusSheet = ref(false); const showDiscoveredDatePicker = ref(false); const showDeadlinePicker = ref(false); const discoveredDateValue = ref(Date.now()); const deadlineValue = ref(Date.now()); const equipmentText = ref(""); const riskLevelText = ref(""); const responsibleUserText = ref(""); const rectStatusText = ref("å¾ æ´æ¹"); const riskLevelActions = [ { name: "ä½", value: "ä½" }, { name: "ä¸", value: "ä¸" }, { name: "é«", value: "é«" }, ]; const rectStatusActions = [ { name: "å¾ æ´æ¹", value: 1 }, { name: "æ´æ¹ä¸", value: 2 }, { name: "å¾ å¤æ ¸", value: 3 }, { name: "å·²éç¯", value: 4 }, ]; const form = ref({ id: "", equipmentId: "", hazardDescription: "", riskLevel: "", discoveredDate: "", responsibleUserId: "", responsibleUserName: "", rectificationDeadline: "", rectificationStatus: 1, rectificationMeasures: "", rectificationResult: "", remarks: "", }); const goBack = () => { uni.navigateBack(); }; const loadEquipmentOptions = () => { specialEquipmentLedgerList({}) .then(res => { const rows = Array.isArray(res?.data) ? res.data : []; equipmentActions.value = rows.map(r => ({ name: r.equipmentName || "", value: r.id, equipmentNo: r.equipmentNo, })); }) .catch(() => { equipmentActions.value = []; }); }; const loadUsers = () => { userListNoPageByTenantId() .then(res => { const rows = Array.isArray(res?.data) ? res.data : []; responsibleUserActions.value = rows.map(u => ({ name: u.nickName || u.userName || "", value: u.userId, })); }) .catch(() => { responsibleUserActions.value = []; }); }; const onSelectEquipment = action => { form.value.equipmentId = action.value; equipmentText.value = action.equipmentNo ? `${action.name}(${action.equipmentNo})` : action.name; showEquipmentSheet.value = false; }; const onSelectRiskLevel = action => { form.value.riskLevel = action.value; riskLevelText.value = action.name; showRiskLevelSheet.value = false; }; const onSelectResponsibleUser = action => { form.value.responsibleUserId = action.value; form.value.responsibleUserName = action.name; responsibleUserText.value = action.name; showResponsibleUserSheet.value = false; }; const onSelectRectStatus = action => { form.value.rectificationStatus = action.value; rectStatusText.value = action.name; showRectStatusSheet.value = false; }; const onDiscoveredDateConfirm = e => { const value = e?.value ?? discoveredDateValue.value; form.value.discoveredDate = formatDateToYMD(value); showDiscoveredDatePicker.value = false; }; const onDeadlineConfirm = e => { const value = e?.value ?? deadlineValue.value; form.value.rectificationDeadline = formatDateToYMD(value); showDeadlinePicker.value = false; }; const handleSubmit = async () => { if (!form.value.equipmentId) { uni.showToast({ title: "è¯·éæ©å ³è设å¤", icon: "none" }); return; } if (!form.value.riskLevel) { uni.showToast({ title: "è¯·éæ©é£é©ç级", icon: "none" }); return; } if (!form.value.discoveredDate) { uni.showToast({ title: "è¯·éæ©åç°æ¥æ", icon: "none" }); return; } if (!form.value.rectificationDeadline) { uni.showToast({ title: "è¯·éæ©æ´æ¹æé", icon: "none" }); return; } const hazardDescription = String(form.value.hazardDescription || "").trim(); if (!hazardDescription) { uni.showToast({ title: "请è¾å ¥éæ£æè¿°", icon: "none" }); return; } loading.value = true; specialEquipmentRectificationAdd({ ...form.value, hazardDescription }) .then(() => { uni.showToast({ title: "ä¿åæå", icon: "success" }); uni.$emit("specialEquipmentManagement:refresh"); goBack(); }) .catch(() => { uni.showToast({ title: "ä¿å失败", icon: "none" }); }) .finally(() => { loading.value = false; }); }; onMounted(() => { loadEquipmentOptions(); loadUsers(); rectStatusText.value = "å¾ æ´æ¹"; form.value.rectificationStatus = 1; }); </script> <style scoped lang="scss"> @import "@/static/scss/form-common.scss"; </style> src/pages/works.vue
@@ -507,6 +507,10 @@ label: "è§ç¨ä¸èµè´¨", }, { icon: "/static/images/icon/yunxingguanli.svg", label: "ç¹ç§è®¾å¤ç®¡ç", }, { icon: "/static/images/icon/weixianyuan.svg", label: "å±é©æºå°è´¦", }, @@ -935,6 +939,11 @@ url: "/pages/safeProduction/safeQualifications/index", }); break; case "ç¹ç§è®¾å¤ç®¡ç": uni.navigateTo({ url: "/pages/safeProduction/specialEquipmentManagement/index", }); break; case "å±é©æºå°è´¦": uni.navigateTo({ url: "/pages/safeProduction/hazardSourceLedger/index",