| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // åè´§å°è´¦é¡µé¢æ¥å£ |
| | | import request from "@/utils/request"; |
| | | |
| | | // å页æ¥è¯¢ |
| | | export function dangerInvestigationListPage(query) { |
| | | return request({ |
| | | url: "/safeHidden/page", |
| | | method: "get", |
| | | params: query, |
| | | }); |
| | | } |
| | | |
| | | // æ°å¢å®å
¨è§ç¨ä¸èµè´¨ç®¡ç |
| | | export function safeHiddenAdd(query) { |
| | | return request({ |
| | | url: '/safeHidden', |
| | | method: 'post', |
| | | data: query |
| | | }) |
| | | } |
| | | // ä¿®æ¹å®å
¨è§ç¨ä¸èµè´¨ç®¡ç |
| | | export function safeHiddenUpdate(query) { |
| | | return request({ |
| | | url: '/safeHidden', |
| | | method: 'put', |
| | | data: query |
| | | }) |
| | | } |
| | | // å é¤å®å
¨è§ç¨ä¸èµè´¨ç®¡ç |
| | | export function safeHiddenDel(ids) { |
| | | return request({ |
| | | url: '/safeHidden/' + ids, |
| | | method: 'delete', |
| | | data: ids |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢éä»¶å表 |
| | | export function fileListPage(query) { |
| | | return request({ |
| | | url: "/safeHiddenFile/listPage", |
| | | method: "get", |
| | | params: query, |
| | | }); |
| | | } |
| | | // æ·»å éä»¶ |
| | | export function safeHiddenFileAdd(query) { |
| | | return request({ |
| | | url: '/safeHiddenFile/add', |
| | | method: 'post', |
| | | data: query |
| | | }) |
| | | } |
| | | // å é¤éä»¶ |
| | | export function safeHiddenFileDel(ids) { |
| | | return request({ |
| | | url: '/safeHiddenFile/del', |
| | | method: 'delete', |
| | | data: ids |
| | | }) |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from "@/utils/request"; |
| | | |
| | | export function safeHazardRecordListPage(query) { |
| | | return request({ |
| | | url: "/safeHazardRecord/page", |
| | | method: "get", |
| | | params: query, |
| | | }); |
| | | } |
| | | |
| | | export function safeHazardRecordDel(ids) { |
| | | return request({ |
| | | url: '/safeHazardRecord/' + ids, |
| | | method: 'delete', |
| | | data: ids |
| | | }) |
| | | } |
| | | // æ°å¢å±é©æºå°è´¦ |
| | | export function safeHazardRecordAdd(query) { |
| | | return request({ |
| | | url: '/safeHazardRecord/borrow', |
| | | method: 'post', |
| | | data: query |
| | | }) |
| | | } |
| | | |
| | | export function safeHazardRecordUpdate(query) { |
| | | return request({ |
| | | url: '/safeHazardRecord/return', |
| | | method: 'put', |
| | | data: query |
| | | }) |
| | | } |
| | |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/safeProduction/dangerInvestigation/index", |
| | | "style": { |
| | | "navigationBarTitleText": "éæ£ææ¥ä¸æ¥", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/safeProduction/dangerInvestigation/detail", |
| | | "style": { |
| | | "navigationBarTitleText": "鿣䏿¥è¯¦æ
", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/safeProduction/dangerInvestigation/view", |
| | | "style": { |
| | | "navigationBarTitleText": "éæ£è¯¦æ
", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/safeProduction/dangerInvestigation/rectify", |
| | | "style": { |
| | | "navigationBarTitleText": "éæ£æ´æ¹", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/safeProduction/dangerInvestigation/acceptance", |
| | | "style": { |
| | | "navigationBarTitleText": "éæ£éªæ¶", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/safeProduction/dangerInvestigation/fileList", |
| | | "style": { |
| | | "navigationBarTitleText": "éæ£ææ¥ä¸æ¥éä»¶", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/safeProduction/hazardousMaterialsControl/index", |
| | | "style": { |
| | | "navigationBarTitleText": "å±é©ç©æ", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/safeProduction/hazardousMaterialsControl/detail", |
| | | "style": { |
| | | "navigationBarTitleText": "å±é©ç©æè¯¦æ
", |
| | | "navigationStyle": "custom" |
| | | } |
| | | } |
| | | ], |
| | | "subPackages": [ |
| | | { |
| | |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/caigoutaizhang@2x.png", |
| | | label: "å±é©æºç®¡ç", |
| | | label: "å±é©æºå°è´¦", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/caigoutaizhang@2x.png", |
| | | label: "å±é©ä½ä¸", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/xunjianshangchuan@2x.png", |
| | | label: "å·¡æ£ä¸ä¼ ", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/guzhangfenxi@2x.png", |
| | | label: "éæ£ææ¥", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/guzhangfenxi@2x.png", |
| | | label: "å±é©ç©æ", |
| | | }, |
| | | ]); |
| | | // åååå
¬åè½æ°æ® |
| | |
| | | { |
| | | icon: "/static/images/icon/shbeibaoyang@2x.png", |
| | | label: "设å¤ä¿å
»", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/xunjianshangchuan@2x.png", |
| | | label: "å·¡æ£ä¸ä¼ ", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/guzhangfenxi@2x.png", |
| | |
| | | url: "/pages/safeProduction/safeQualifications/index", |
| | | }); |
| | | break; |
| | | case "å±é©æºç®¡ç": |
| | | case "å±é©æºå°è´¦": |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/hazardSourceLedger/index", |
| | | }); |
| | |
| | | url: "/pages/cooperativeOffice/collaborativeApproval/index8", |
| | | }); |
| | | break; |
| | | case "éæ£ææ¥": |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/dangerInvestigation/index", |
| | | }); |
| | | break; |
| | | case "å±é©ç©æ": |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/hazardousMaterialsControl/index", |
| | | }); |
| | | break; |
| | | default: |
| | | uni.showToast({ |
| | | title: `ç¹å»äº${item.label}`, |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="danger-investigation-acceptance"> |
| | | <PageHeader title="éæ£éªæ¶" |
| | | @back="goBack" /> |
| | | <view class="section"> |
| | | <view class="section-title">éæ£ä¿¡æ¯</view> |
| | | <view class="info-item"> |
| | | <text class="info-label">鿣ç¼å·</text> |
| | | <text class="info-value">{{ form.hiddenCode || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">éæ£ç±»å</text> |
| | | <text class="info-value">{{ hidden_danger_type.find(i => String(i.value) === String(form.type))?.label || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">é£é©ç级</text> |
| | | <text class="info-value">{{ form.riskLevel || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">鿣æè¿°</text> |
| | | <text class="info-value">{{ form.hiddenDesc || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">鿣å
·ä½ä½ç½®</text> |
| | | <text class="info-value">{{ form.location || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">䏿¥äºº</text> |
| | | <text class="info-value">{{ form.createUserName || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">䏿¥æ¶é´</text> |
| | | <text class="info-value">{{ form.createTime || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">æ´æ¹å®ææé</text> |
| | | <text class="info-value">{{ form.rectifyTime || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">æ´æ¹è´£ä»»äºº</text> |
| | | <text class="info-value">{{ form.rectifyUserName || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">æ´æ¹è´£ä»»äººèç³»æ¹å¼</text> |
| | | <text class="info-value">{{ form.rectifyUserMobile || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">æ´æ¹å
·ä½æªæ½</text> |
| | | <text class="info-value">{{ form.rectifyMeasures || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">å®é
æ´æ¹å®ææ¶é´</text> |
| | | <text class="info-value">{{ form.rectifyActualTime || '-' }}</text> |
| | | </view> |
| | | </view> |
| | | <u-form @submit="handleSubmit" |
| | | ref="formRef" |
| | | label-width="110"> |
| | | <!-- éªæ¶ä¿¡æ¯ --> |
| | | <u-cell-group title="éªæ¶ä¿¡æ¯"> |
| | | <u-form-item label="éªæ¶æ¶é´" |
| | | prop="verifyTime" |
| | | border-bottom> |
| | | <u-input v-model="form.verifyTime" |
| | | placeholder="è¯·éæ©éªæ¶æ¶é´" |
| | | disabled /> |
| | | </u-form-item> |
| | | <u-form-item label="éªæ¶äºº" |
| | | prop="verifyUserName" |
| | | border-bottom> |
| | | <u-input v-model="form.verifyUserName" |
| | | disabled |
| | | placeholder="请è¾å
¥éªæ¶äºº" /> |
| | | </u-form-item> |
| | | <u-form-item label="éªæ¶ç»æ" |
| | | prop="verifyResult" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="verifyResultName" |
| | | placeholder="è¯·éæ©éªæ¶ç»æ" |
| | | @click="showVerifyResultSheet" |
| | | readonly /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | @click="showVerifyResultSheet"></up-icon> |
| | | </template> |
| | | </u-form-item> |
| | | <u-form-item label="éªæ¶æè§" |
| | | prop="verifyRemark" |
| | | required |
| | | border-bottom> |
| | | <u-textarea v-model="form.verifyRemark" |
| | | placeholder="请è¾å
¥éªæ¶æè§" |
| | | :maxlength="200" |
| | | count |
| | | :autoHeight="true" /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | <!-- æäº¤æé® --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" |
| | | @click="goBack">åæ¶</u-button> |
| | | <u-button class="sign-btn" |
| | | type="primary" |
| | | @click="handleSubmit" |
| | | :loading="loading">æäº¤éªæ¶</u-button> |
| | | </view> |
| | | </u-form> |
| | | <!-- æ¶é´éæ©å¨ --> |
| | | <up-datetime-picker :show="showTime" |
| | | v-model="currentTime" |
| | | @confirm="onTimeConfirm" |
| | | @cancel="showTime = false" |
| | | mode="date" /> |
| | | <!-- éªæ¶ç»æéæ©å¨ --> |
| | | <up-action-sheet :show="verifyResultSheetVisible" |
| | | :actions="verifyResultOptions" |
| | | @select="handleVerifyResultSelect" |
| | | title="éæ©éªæ¶ç»æ" /> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // æ¿æ¢ toast æ¹æ³ |
| | | defineOptions({ name: "danger-investigation-acceptance" }); |
| | | const showToast = message => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: "none", |
| | | }); |
| | | }; |
| | | |
| | | import { ref, onMounted } from "vue"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import { safeHiddenUpdate } from "@/api/safeProduction/dangerInvestigation"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import dayjs from "dayjs"; |
| | | import { onLoad } from "@dcloudio/uni-app"; |
| | | import { useDict } from "@/utils/dict"; |
| | | |
| | | const { hidden_danger_type } = useDict("hidden_danger_type"); |
| | | const userStore = useUserStore(); |
| | | |
| | | // è¡¨åæ°æ® |
| | | const form = ref({ |
| | | id: "", |
| | | hiddenCode: "", |
| | | hiddenDesc: "", |
| | | location: "", |
| | | rectifyTime: "", |
| | | rectifyActualTime: "", |
| | | rectifyResult: "", |
| | | verifyTime: "", |
| | | verifyRemark: "", |
| | | verifyResult: "", |
| | | }); |
| | | |
| | | // 页é¢ç¶æ |
| | | const loading = ref(false); |
| | | const formRef = ref(null); |
| | | |
| | | // æ¶é´ç¸å
³ |
| | | const currentTime = ref(Date.now()); |
| | | const showTime = ref(false); |
| | | |
| | | // éªæ¶ç»æéæ©å¨ |
| | | const verifyResultSheetVisible = ref(false); |
| | | const verifyResultName = ref(""); |
| | | const verifyResultOptions = ref([ |
| | | { value: "éè¿", name: "éè¿" }, |
| | | { value: "ä¸éè¿", name: "ä¸éè¿" }, |
| | | ]); |
| | | const showVerifyResultSheet = () => { |
| | | verifyResultSheetVisible.value = true; |
| | | }; |
| | | const handleVerifyResultSelect = item => { |
| | | form.value.verifyResult = item.value; |
| | | verifyResultName.value = item.name; |
| | | verifyResultSheetVisible.value = false; |
| | | }; |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | // è¿åæ¶æ¸
餿¬å°åå¨çæ°æ® |
| | | uni.removeStorageSync("dangerInvestigation"); |
| | | uni.navigateBack(); |
| | | }; |
| | | |
| | | // æ¾ç¤ºæ¶é´éæ©å¨ |
| | | const showTimePicker = () => { |
| | | showTime.value = true; |
| | | }; |
| | | |
| | | // 确认æ¶é´éæ© |
| | | const onTimeConfirm = e => { |
| | | form.value.verifyTime = dayjs(e.value).format("YYYY-MM-DD"); |
| | | currentTime.value = e.value; |
| | | showTime.value = false; |
| | | }; |
| | | |
| | | // æäº¤è¡¨å |
| | | const handleSubmit = async () => { |
| | | if (!form.value.verifyRemark) { |
| | | showToast("请è¾å
¥éªæ¶æè§"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.verifyResult) { |
| | | showToast("è¯·éæ©éªæ¶ç»æ"); |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | loading.value = true; |
| | | |
| | | // 使ç¨å®å
¨æµ
æ·è´ï¼é¿å
对象å±å¼å¨æäºè¿è¡æ¶æé |
| | | const source = |
| | | form.value && typeof form.value === "object" ? form.value : {}; |
| | | const submitData = {}; |
| | | Object.keys(source).forEach(k => { |
| | | submitData[k] = source[k]; |
| | | }); |
| | | console.log("submitData", submitData); |
| | | |
| | | const { code } = await safeHiddenUpdate(submitData); |
| | | if (code === 200) { |
| | | showToast("éªæ¶æäº¤æå"); |
| | | setTimeout(() => { |
| | | goBack(); |
| | | }, 500); |
| | | } else { |
| | | loading.value = false; |
| | | showToast("éªæ¶æäº¤å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | } catch (e) { |
| | | loading.value = false; |
| | | console.error("æäº¤å¤±è´¥:", e); |
| | | showToast("æäº¤å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | }; |
| | | |
| | | onLoad(() => { |
| | | // 仿¬å°åå¨è·åéæ£æ°æ® |
| | | const dangerInvestigation = uni.getStorageSync("dangerInvestigation"); |
| | | if (dangerInvestigation && dangerInvestigation.id) { |
| | | form.value = dangerInvestigation; |
| | | console.log("form.value", form.value); |
| | | } else { |
| | | showToast("ææ éæ£æ°æ®"); |
| | | } |
| | | }); |
| | | |
| | | // åå§å页颿°æ® |
| | | const initPageData = () => { |
| | | // 设置é»è®¤éªæ¶æ¶é´ä¸ºå½åæ¶é´ |
| | | if (!form.value.verifyTime) { |
| | | form.value.verifyTime = dayjs().format("YYYY-MM-DD"); |
| | | currentTime.value = Date.now(); |
| | | } |
| | | // 设置已ééªæ¶ç»æçæ¾ç¤ºææ¬ |
| | | if (form.value.verifyResult) { |
| | | verifyResultName.value = |
| | | verifyResultOptions.value.find( |
| | | item => item.value === form.value.verifyResult |
| | | )?.name || ""; |
| | | } |
| | | // è®¾ç½®éªæ¶äºº |
| | | if (!form.value.verifyUserName) { |
| | | userStore.getInfo().then(res => { |
| | | form.value.verifyUserId = res.user.userId; |
| | | form.value.verifyUserName = res.user.nickName; |
| | | }); |
| | | } |
| | | console.log("form.value", form.value); |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | initPageData(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import "@/static/scss/form-common.scss"; |
| | | .danger-investigation-acceptance { |
| | | min-height: 100vh; |
| | | background-color: #f8f9fa; |
| | | padding-bottom: 160rpx; |
| | | } |
| | | .footer-btns { |
| | | position: fixed; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | background: #fff; |
| | | display: flex; |
| | | justify-content: space-around; |
| | | align-items: center; |
| | | padding: 0.75rem 0; |
| | | box-shadow: 0 -0.125rem 0.5rem rgba(0, 0, 0, 0.05); |
| | | z-index: 1000; |
| | | } |
| | | |
| | | .cancel-btn { |
| | | font-weight: 400; |
| | | font-size: 1rem; |
| | | color: #666; |
| | | background: #f5f5f5; |
| | | border: 1px solid #ddd; |
| | | width: 45%; |
| | | height: 2.5rem; |
| | | border-radius: 2.5rem 2.5rem 2.5rem 2.5rem; |
| | | } |
| | | |
| | | .sign-btn { |
| | | font-weight: 500; |
| | | font-size: 1rem; |
| | | color: #fff; |
| | | background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
| | | border: none; |
| | | width: 45%; |
| | | height: 2.5rem; |
| | | border-radius: 2.5rem 2.5rem 2.5rem 2.5rem; |
| | | } |
| | | |
| | | .section { |
| | | background-color: #ffffff; |
| | | margin-bottom: 16px; |
| | | overflow: hidden; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); |
| | | } |
| | | |
| | | .section-title { |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | color: #333333; |
| | | padding: 16px 16px 12px; |
| | | border-bottom: 1px solid #f0f0f0; |
| | | } |
| | | |
| | | .info-item { |
| | | display: flex; |
| | | padding: 14px 16px; |
| | | border-bottom: 1px solid #f8f8f8; |
| | | align-items: flex-start; |
| | | } |
| | | |
| | | .info-item:last-child { |
| | | border-bottom: none; |
| | | } |
| | | |
| | | .info-label { |
| | | font-size: 14px; |
| | | color: #666666; |
| | | min-width: 80px; |
| | | flex-shrink: 0; |
| | | line-height: 22px; |
| | | } |
| | | |
| | | .info-value { |
| | | font-size: 14px; |
| | | color: #333333; |
| | | flex: 1; |
| | | line-height: 22px; |
| | | text-align: right; |
| | | } |
| | | |
| | | .multi-line { |
| | | text-align: left; |
| | | word-break: break-all; |
| | | line-height: 1.6; |
| | | } |
| | | |
| | | .remark-item { |
| | | padding-bottom: 16px; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="danger-investigation-detail"> |
| | | <PageHeader :title="isEdit ? 'ç¼è¾éæ£' : 'æ°å¢éæ£'" |
| | | @back="goBack" /> |
| | | <u-form @submit="handleSubmit" |
| | | ref="formRef" |
| | | label-width="110"> |
| | | <!-- éæ£ä¿¡æ¯ --> |
| | | <u-cell-group title="éæ£ä¿¡æ¯"> |
| | | <u-form-item label="鿣ç¼å·" |
| | | prop="hiddenCode" |
| | | border-bottom> |
| | | <u-input v-model="form.hiddenCode" |
| | | placeholder="ç³»ç»èªå¨çæ" |
| | | readonly /> |
| | | </u-form-item> |
| | | <u-form-item label="éæ£ç±»å" |
| | | prop="type" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="hiddenTypeName" |
| | | placeholder="è¯·éæ©éæ£ç±»å" |
| | | @click="showHiddenTypeSheet" |
| | | readonly /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | @click="showHiddenTypeSheet"></up-icon> |
| | | </template> |
| | | </u-form-item> |
| | | <u-form-item label="é£é©ç级" |
| | | prop="riskLevel" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="riskLevelName" |
| | | placeholder="è¯·éæ©é£é©ç级" |
| | | @click="showRiskLevelSheet" |
| | | readonly /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | @click="showRiskLevelSheet"></up-icon> |
| | | </template> |
| | | </u-form-item> |
| | | <u-form-item label="鿣æè¿°" |
| | | prop="hiddenDesc" |
| | | required |
| | | border-bottom> |
| | | <u-textarea v-model="form.hiddenDesc" |
| | | placeholder="请è¾å
¥éæ£æè¿°" |
| | | :maxlength="200" |
| | | count |
| | | :autoHeight="true" /> |
| | | </u-form-item> |
| | | <u-form-item label="鿣å
·ä½ä½ç½®" |
| | | prop="location" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.location" |
| | | placeholder="请è¾å
¥éæ£å
·ä½ä½ç½®" /> |
| | | </u-form-item> |
| | | <u-form-item label="æ´æ¹å®ææé" |
| | | prop="rectifyTime" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.rectifyTime" |
| | | placeholder="è¯·éæ©æ´æ¹å®ææé" |
| | | @click="showTimePicker" /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | @click="showTimePicker"></up-icon> |
| | | </template> |
| | | </u-form-item> |
| | | <u-form-item label="æ´æ¹è´£ä»»äºº" |
| | | prop="rectifyUserName" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.rectifyUserName" |
| | | placeholder="è¯·éæ©æ´æ¹è´£ä»»äºº" |
| | | @click="showPrincipalSheet" |
| | | readonly /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | @click="showPrincipalSheet"></up-icon> |
| | | </template> |
| | | </u-form-item> |
| | | <u-form-item label="䏿¥äºº" |
| | | prop="createUserName" |
| | | border-bottom> |
| | | <u-input v-model="form.createUserName" |
| | | disabled |
| | | placeholder="请è¾å
¥ä¸æ¥äºº" /> |
| | | </u-form-item> |
| | | <u-form-item label="䏿¥æ¶é´" |
| | | prop="createTime" |
| | | border-bottom> |
| | | <u-input v-model="form.createTime" |
| | | disabled |
| | | placeholder="请è¾å
¥ä¸æ¥æ¶é´" /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | <!-- æäº¤æé® --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" |
| | | @click="goBack">åæ¶</u-button> |
| | | <u-button class="sign-btn" |
| | | type="primary" |
| | | @click="handleSubmit" |
| | | :loading="loading">{{ isEdit ? 'ä¿åä¿®æ¹' : 'æäº¤' }}</u-button> |
| | | </view> |
| | | </u-form> |
| | | <!-- æ¶é´éæ©å¨ --> |
| | | <up-datetime-picker :show="showTime" |
| | | v-model="currentTime" |
| | | @confirm="onTimeConfirm" |
| | | @cancel="showTime = false" |
| | | mode="date" /> |
| | | <!-- éæ£ç±»åéæ©å¨ --> |
| | | <up-action-sheet :show="hiddenTypeSheetVisible" |
| | | :actions="hiddenTypeOptions" |
| | | @select="handleHiddenTypeSelect" |
| | | @close="hiddenTypeSheetVisible = false" |
| | | title="éæ©éæ£ç±»å" /> |
| | | <!-- é£é©ççº§éæ©å¨ --> |
| | | <up-action-sheet :show="riskLevelSheetVisible" |
| | | :actions="riskLevelOptions" |
| | | @select="handleRiskLevelSelect" |
| | | @close="riskLevelSheetVisible = false" |
| | | title="éæ©é£é©ç级" /> |
| | | <!-- æ´æ¹è´£ä»»äººéæ©å¨ --> |
| | | <up-action-sheet :show="principalSheetVisible" |
| | | :actions="principalOptions" |
| | | @select="handlePrincipalSelect" |
| | | @close="principalSheetVisible = false" |
| | | title="éæ©æ´æ¹è´£ä»»äºº" /> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // æ¿æ¢ toast æ¹æ³ |
| | | defineOptions({ name: "danger-investigation-detail" }); |
| | | const showToast = message => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: "none", |
| | | }); |
| | | }; |
| | | |
| | | import { ref, onMounted } from "vue"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import { |
| | | safeHiddenAdd, |
| | | safeHiddenUpdate, |
| | | } from "@/api/safeProduction/dangerInvestigation"; |
| | | import { userListNoPageByTenantId } from "@/api/system/user"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { useDict } from "@/utils/dict"; |
| | | import dayjs from "dayjs"; |
| | | import { onLoad } from "@dcloudio/uni-app"; |
| | | |
| | | // è·ååå
¸æ°æ® |
| | | const { hidden_danger_type } = useDict("hidden_danger_type"); |
| | | |
| | | const userStore = useUserStore(); |
| | | |
| | | // è¡¨åæ°æ® |
| | | const form = ref({ |
| | | hiddenCode: "", |
| | | type: "", |
| | | riskLevel: "", |
| | | hiddenDesc: "", |
| | | location: "", |
| | | rectifyTime: "", |
| | | rectifyUserName: "", |
| | | rectifyUserMobile: "", |
| | | rectifyMeasures: "", |
| | | }); |
| | | |
| | | // 页é¢ç¶æ |
| | | const loading = ref(false); |
| | | const formRef = ref(null); |
| | | const isEdit = ref(false); |
| | | |
| | | // æ¶é´ç¸å
³ |
| | | const currentTime = ref(Date.now()); |
| | | const showTime = ref(false); |
| | | |
| | | // éæ£ç±»åéæ©å¨ |
| | | const hiddenTypeSheetVisible = ref(false); |
| | | const hiddenTypeName = ref(""); |
| | | const hiddenTypeOptions = ref([]); |
| | | const showHiddenTypeSheet = () => { |
| | | hiddenTypeSheetVisible.value = true; |
| | | }; |
| | | const handleHiddenTypeSelect = item => { |
| | | form.value.type = item.value; |
| | | hiddenTypeName.value = item.name; |
| | | hiddenTypeSheetVisible.value = false; |
| | | }; |
| | | |
| | | // é£é©ççº§éæ©å¨ |
| | | const riskLevelSheetVisible = ref(false); |
| | | const riskLevelName = ref(""); |
| | | const riskLevelOptions = ref([]); |
| | | const showRiskLevelSheet = () => { |
| | | riskLevelSheetVisible.value = true; |
| | | }; |
| | | const handleRiskLevelSelect = item => { |
| | | form.value.riskLevel = item.value; |
| | | riskLevelName.value = item.name; |
| | | riskLevelSheetVisible.value = false; |
| | | }; |
| | | |
| | | // æ´æ¹è´£ä»»äººéæ©å¨ |
| | | const principalSheetVisible = ref(false); |
| | | const userList = ref([]); |
| | | const principalOptions = ref([]); |
| | | const showPrincipalSheet = () => { |
| | | if (principalOptions.value.length === 0) { |
| | | getUserList(); |
| | | } else { |
| | | principalSheetVisible.value = true; |
| | | } |
| | | }; |
| | | const handlePrincipalSelect = item => { |
| | | form.value.rectifyUserId = item.value; |
| | | form.value.rectifyUserName = item.name; |
| | | form.value.rectifyUserMobile = item.mobile; |
| | | principalSheetVisible.value = false; |
| | | }; |
| | | |
| | | // è·åç¨æ·å表 |
| | | const getUserList = () => { |
| | | userListNoPageByTenantId().then(res => { |
| | | if (res.code === 200) { |
| | | userList.value = res.data; |
| | | principalOptions.value = res.data.map(user => ({ |
| | | value: user.userId, |
| | | name: user.nickName, |
| | | mobile: user.phonenumber, |
| | | })); |
| | | principalSheetVisible.value = true; |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | // è¿åæ¶æ¸
餿¬å°åå¨çæ°æ® |
| | | uni.removeStorageSync("dangerInvestigation"); |
| | | uni.navigateBack(); |
| | | }; |
| | | |
| | | // æ¾ç¤ºæ¶é´éæ©å¨ |
| | | const showTimePicker = () => { |
| | | showTime.value = true; |
| | | }; |
| | | |
| | | // 确认æ¶é´éæ© |
| | | const onTimeConfirm = e => { |
| | | form.value.rectifyTime = dayjs(e.value).format("YYYY-MM-DD"); |
| | | currentTime.value = e.value; |
| | | showTime.value = false; |
| | | }; |
| | | |
| | | // æäº¤è¡¨å |
| | | const handleSubmit = async () => { |
| | | console.log("form.value", form.value); |
| | | if (!form.value.type) { |
| | | showToast("è¯·éæ©éæ£ç±»å"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.riskLevel) { |
| | | showToast("è¯·éæ©é£é©ç级"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.hiddenDesc) { |
| | | showToast("请è¾å
¥éæ£æè¿°"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.location) { |
| | | showToast("请è¾å
¥éæ£å
·ä½ä½ç½®"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.rectifyTime) { |
| | | showToast("è¯·éæ©æ´æ¹å®ææé"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.rectifyUserName) { |
| | | showToast("è¯·éæ©æ´æ¹è´£ä»»äºº"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.rectifyUserMobile) { |
| | | showToast("请è¾å
¥æ´æ¹è´£ä»»äººèç³»æ¹å¼"); |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | loading.value = true; |
| | | |
| | | // 使ç¨å®å
¨æµ
æ·è´ï¼é¿å
对象å±å¼å¨æäºè¿è¡æ¶æé |
| | | const source = |
| | | form.value && typeof form.value === "object" ? form.value : {}; |
| | | const submitData = {}; |
| | | Object.keys(source).forEach(k => { |
| | | submitData[k] = source[k]; |
| | | }); |
| | | console.log("submitData", submitData); |
| | | if (isEdit.value) { |
| | | const { code } = await safeHiddenUpdate(submitData); |
| | | if (code === 200) { |
| | | showToast("ä¿®æ¹æå"); |
| | | setTimeout(() => { |
| | | goBack(); |
| | | }, 500); |
| | | } else { |
| | | loading.value = false; |
| | | showToast("ä¿®æ¹å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | } else { |
| | | const { code } = await safeHiddenAdd(submitData); |
| | | if (code === 200) { |
| | | showToast("æ°å¢æå"); |
| | | setTimeout(() => { |
| | | goBack(); |
| | | }, 500); |
| | | } else { |
| | | loading.value = false; |
| | | showToast("æ°å¢å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | } |
| | | } catch (e) { |
| | | loading.value = false; |
| | | console.error("æäº¤å¤±è´¥:", e); |
| | | showToast("æäº¤å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | }; |
| | | |
| | | onLoad(() => { |
| | | // ç¼è¾éæ£æ¶ï¼ä»æ¬å°åå¨è·åæ°æ® |
| | | const dangerInvestigation = uni.getStorageSync("dangerInvestigation"); |
| | | if (dangerInvestigation && dangerInvestigation.id) { |
| | | form.value = dangerInvestigation; |
| | | isEdit.value = true; |
| | | } else { |
| | | isEdit.value = false; |
| | | } |
| | | userStore.getInfo().then(res => { |
| | | form.value.createUser = res.user.userId; |
| | | form.value.createUserName = res.user.nickName; |
| | | }); |
| | | form.value.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss"); |
| | | }); |
| | | |
| | | // åå§å页颿°æ® |
| | | const initPageData = () => { |
| | | // 设置é»è®¤æ´æ¹å®ææé为å½åæ¶é´ |
| | | if (!isEdit.value) { |
| | | form.value.rectifyTime = dayjs().format("YYYY-MM-DD"); |
| | | currentTime.value = Date.now(); |
| | | } |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | initPageData(); |
| | | // åå§åéé¡¹æ°æ® |
| | | hiddenTypeOptions.value = hidden_danger_type.value.map(item => ({ |
| | | value: item.value, |
| | | name: item.label, |
| | | })); |
| | | riskLevelOptions.value = [ |
| | | { |
| | | value: "é大é£é©", |
| | | name: "é大é£é©", |
| | | }, |
| | | { |
| | | value: "è¾å¤§é£é©", |
| | | name: "è¾å¤§é£é©", |
| | | }, |
| | | { |
| | | value: "ä¸è¬é£é©", |
| | | name: "ä¸è¬é£é©", |
| | | }, |
| | | { |
| | | value: "ä½é£é©", |
| | | name: "ä½é£é©", |
| | | }, |
| | | ]; |
| | | // 设置已éå¼çæ¾ç¤ºææ¬ |
| | | if (form.value.type) { |
| | | hiddenTypeName.value = |
| | | hiddenTypeOptions.value.find(item => item.value == form.value.type) |
| | | ?.name || ""; |
| | | } |
| | | if (form.value.riskLevel) { |
| | | riskLevelName.value = |
| | | riskLevelOptions.value.find(item => item.value == form.value.riskLevel) |
| | | ?.name || ""; |
| | | } |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import "@/static/scss/form-common.scss"; |
| | | .danger-investigation-detail { |
| | | min-height: 100vh; |
| | | background-color: #f8f9fa; |
| | | } |
| | | |
| | | .footer-btns { |
| | | position: fixed; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | background: #fff; |
| | | display: flex; |
| | | justify-content: space-around; |
| | | align-items: center; |
| | | padding: 0.75rem 0; |
| | | box-shadow: 0 -0.125rem 0.5rem rgba(0, 0, 0, 0.05); |
| | | z-index: 1000; |
| | | } |
| | | |
| | | .cancel-btn { |
| | | font-weight: 400; |
| | | font-size: 1rem; |
| | | color: #666; |
| | | background: #f5f5f5; |
| | | border: 1px solid #ddd; |
| | | width: 45%; |
| | | height: 2.5rem; |
| | | border-radius: 2.5rem 2.5rem 2.5rem 2.5rem; |
| | | } |
| | | |
| | | .sign-btn { |
| | | font-weight: 500; |
| | | font-size: 1rem; |
| | | color: #fff; |
| | | background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
| | | border: none; |
| | | width: 45%; |
| | | height: 2.5rem; |
| | | border-radius: 2.5rem 2.5rem 2.5rem 2.5rem; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="file-list-page"> |
| | | <!-- 页é¢å¤´é¨ --> |
| | | <PageHeader title="é件管ç" |
| | | @back="goBack" /> |
| | | <!-- éä»¶å表 --> |
| | | <view class="file-list-container"> |
| | | <view v-if="fileList.length > 0" |
| | | class="file-list"> |
| | | <view v-for="(file, index) in fileList" |
| | | :key="file.id || index" |
| | | class="file-item"> |
| | | <!-- æä»¶å¾æ --> |
| | | <!-- <view class="file-icon" |
| | | :class="getFileIconClass(file.fileType)"> |
| | | <up-icon :name="getFileIcon(file.fileType)" |
| | | size="24" |
| | | color="#ffffff" /> |
| | | </view> --> |
| | | <!-- æä»¶ä¿¡æ¯ --> |
| | | <view class="file-info"> |
| | | <text class="file-name">{{ file.name }}</text> |
| | | <!-- <text class="file-meta">{{ formatFileSize(file.fileSize) }} · {{ file.uploadTime || file.createTime }}</text> --> |
| | | </view> |
| | | <!-- æä½æé® --> |
| | | <view class="file-actions"> |
| | | <!-- <u-button size="small" |
| | | type="primary" |
| | | plain |
| | | @click="previewFile(file)">é¢è§</u-button> --> |
| | | <u-button size="small" |
| | | type="info" |
| | | plain |
| | | @click="downloadFile(file)">ä¸è½½å¹¶é¢è§</u-button> |
| | | <u-button size="small" |
| | | type="error" |
| | | plain |
| | | @click="confirmDelete(file, index)">å é¤</u-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <!-- ç©ºç¶æ --> |
| | | <view v-else |
| | | class="empty-state"> |
| | | <up-icon name="document" |
| | | size="64" |
| | | color="#c0c4cc" /> |
| | | <text class="empty-text">ææ éä»¶</text> |
| | | </view> |
| | | </view> |
| | | <!-- <a rel="nofollow" |
| | | id="downloadLink" |
| | | href="#" |
| | | style="display:none;">ä¸è½½ææ¬æä»¶</a> --> |
| | | <!-- ä¸ä¼ æé® --> |
| | | <view class="upload-button" |
| | | @click="chooseFile"> |
| | | <up-icon name="plus" |
| | | size="24" |
| | | color="#ffffff" /> |
| | | <text class="upload-text">ä¸ä¼ éä»¶</text> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, onMounted } from "vue"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import config from "@/config"; |
| | | import { getToken } from "@/utils/auth"; |
| | | // import { saveAs } from "file-saver"; |
| | | import { |
| | | listRuleFiles, |
| | | delRuleFile, |
| | | } from "@/api/managementMeetings/rulesRegulationsManagement"; |
| | | import { |
| | | safeHiddenFileAdd, |
| | | fileListPage, |
| | | safeHiddenFileDel, |
| | | } from "@/api/safeProduction/dangerInvestigation"; |
| | | import { blobValidate } from "@/utils/ruoyi"; |
| | | |
| | | // éä»¶å表 |
| | | const fileList = ref([]); |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | uni.navigateBack(); |
| | | }; |
| | | // const request = axios.create({ |
| | | // baseURL: "URL.com", |
| | | // adapter: axiosAdapterUniapp, |
| | | // }); |
| | | // è·åæä»¶å¾æ |
| | | const getFileIcon = fileType => { |
| | | const iconMap = { |
| | | doc: "document", |
| | | docx: "document", |
| | | xls: "grid", |
| | | xlsx: "grid", |
| | | pdf: "document", |
| | | ppt: "copy", |
| | | pptx: "copy", |
| | | txt: "document", |
| | | jpg: "image", |
| | | jpeg: "image", |
| | | png: "image", |
| | | gif: "image", |
| | | zip: "folder", |
| | | rar: "folder", |
| | | }; |
| | | return iconMap[fileType.toLowerCase()] || "document"; |
| | | }; |
| | | |
| | | // è·åæä»¶å¾æ æ ·å¼ç±» |
| | | const getFileIconClass = fileType => { |
| | | const colorMap = { |
| | | doc: "blue", |
| | | docx: "blue", |
| | | xls: "green", |
| | | xlsx: "green", |
| | | pdf: "red", |
| | | ppt: "orange", |
| | | pptx: "orange", |
| | | txt: "gray", |
| | | jpg: "purple", |
| | | jpeg: "purple", |
| | | png: "purple", |
| | | gif: "purple", |
| | | zip: "yellow", |
| | | rar: "yellow", |
| | | }; |
| | | return colorMap[fileType.toLowerCase()] || "gray"; |
| | | }; |
| | | |
| | | // æ ¼å¼åæä»¶å¤§å° |
| | | const formatFileSize = bytes => { |
| | | if (bytes === 0) return "0 B"; |
| | | const k = 1024; |
| | | const sizes = ["B", "KB", "MB", "GB"]; |
| | | const i = Math.floor(Math.log(bytes) / Math.log(k)); |
| | | return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + " " + sizes[i]; |
| | | }; |
| | | |
| | | // éæ©æä»¶ |
| | | const chooseFile = () => { |
| | | uni.chooseImage({ |
| | | count: 9, |
| | | sizeType: ["original", "compressed"], |
| | | sourceType: ["album", "camera"], |
| | | success: res => { |
| | | console.log(res, "éæ©å¾çæå"); |
| | | uploadFiles(res.tempFiles); |
| | | }, |
| | | fail: err => { |
| | | console.error("éæ©å¾ç失败:", err); |
| | | showToast("éæ©æä»¶å¤±è´¥"); |
| | | }, |
| | | }); |
| | | // uni.chooseFile({ |
| | | // count: 9, |
| | | // extension: [ |
| | | // ".doc", |
| | | // ".docx", |
| | | // ".xls", |
| | | // ".xlsx", |
| | | // ".pdf", |
| | | // ".ppt", |
| | | // ".pptx", |
| | | // ".txt", |
| | | // ".jpg", |
| | | // ".jpeg", |
| | | // ".png", |
| | | // ".gif", |
| | | // ".zip", |
| | | // ".rar", |
| | | // ], |
| | | // success: res => { |
| | | // console.log(res, "éæ©æä»¶æå"); |
| | | // uploadFiles(res.tempFiles); |
| | | // }, |
| | | // fail: err => { |
| | | // showToast("éæ©æä»¶å¤±è´¥"); |
| | | // }, |
| | | // }); |
| | | }; |
| | | |
| | | // ä¸ä¼ æä»¶ |
| | | const uploadFiles = tempFiles => { |
| | | console.log(tempFiles, "ä¸ä¼ æä»¶1"); |
| | | tempFiles.forEach((tempFile, index) => { |
| | | // æ¾ç¤ºä¸ä¼ ä¸æç¤º |
| | | uni.showLoading({ |
| | | title: "ä¸ä¼ ä¸...", |
| | | mask: true, |
| | | }); |
| | | console.log(tempFile, "ä¸ä¼ æä»¶2"); |
| | | // 1. ç´æ¥ä½¿ç¨ uni.uploadFile ä¸ä¼ æä»¶ |
| | | uni.uploadFile({ |
| | | url: config.baseUrl + "/file/upload", |
| | | filePath: tempFile.path, |
| | | name: "file", |
| | | header: { |
| | | Authorization: "Bearer " + getToken(), |
| | | }, |
| | | success: uploadRes => { |
| | | uni.hideLoading(); |
| | | console.log(uploadRes, "ä¸ä¼ æä»¶3"); |
| | | |
| | | try { |
| | | const res = JSON.parse(uploadRes.data); |
| | | console.log(res, "ä¸ä¼ æä»¶4"); |
| | | if (res.code === 200) { |
| | | // 2. æåæä»¶ä¿¡æ¯ |
| | | const fileName = tempFile.name |
| | | ? tempFile.name |
| | | : tempFile.path.split("/").pop(); |
| | | // const fileType = fileName.split(".").pop(); |
| | | // 3. æé ä¿åæä»¶ä¿¡æ¯çåæ° |
| | | const saveData = { |
| | | name: fileName, |
| | | safeHiddenId: rulesRegulationsManagementId.value, |
| | | url: res.data.tempPath || "", |
| | | }; |
| | | console.log(saveData, "ä¿åæä»¶ä¿¡æ¯åæ°"); |
| | | // 4. è°ç¨ addRuleFile æ¥å£ä¿åæä»¶ä¿¡æ¯ |
| | | safeHiddenFileAdd(saveData) |
| | | .then(addRes => { |
| | | if (addRes.code === 200) { |
| | | // 5. æ·»å å°æä»¶å表 |
| | | const newFile = { |
| | | ...addRes.data, |
| | | uploadTime: new Date().toLocaleString(), |
| | | }; |
| | | // fileList.value.push(newFile); |
| | | getFileList(); |
| | | showToast("ä¸ä¼ æå"); |
| | | } else { |
| | | showToast("ä¿åæä»¶ä¿¡æ¯å¤±è´¥"); |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | console.error("ä¿åæä»¶ä¿¡æ¯å¤±è´¥:", err); |
| | | showToast("ä¿åæä»¶ä¿¡æ¯å¤±è´¥"); |
| | | }); |
| | | } else { |
| | | showToast("æä»¶ä¸ä¼ 失败"); |
| | | } |
| | | } catch (e) { |
| | | console.error("è§£æä¸ä¼ ç»æå¤±è´¥:", e); |
| | | showToast("ä¸ä¼ 失败"); |
| | | } |
| | | }, |
| | | fail: err => { |
| | | uni.hideLoading(); |
| | | console.error("ä¸ä¼ 失败:", err); |
| | | showToast("ä¸ä¼ 失败"); |
| | | }, |
| | | }); |
| | | }); |
| | | }; |
| | | // ä¸è½½æä»¶ |
| | | const downloadFile = file => { |
| | | var url = |
| | | config.baseUrl + |
| | | "/common/download?fileName=" + |
| | | encodeURIComponent(file.url) + |
| | | "&delete=true"; |
| | | console.log(url, "url"); |
| | | |
| | | uni |
| | | .downloadFile({ |
| | | url: url, |
| | | responseType: "blob", |
| | | header: { Authorization: "Bearer " + getToken() }, |
| | | }) |
| | | .then(res => { |
| | | let osType = uni.getStorageSync("deviceInfo").osName; |
| | | let filePath = res.tempFilePath; |
| | | if (osType === "ios") { |
| | | uni.openDocument({ |
| | | filePath: filePath, |
| | | showMenu: true, |
| | | success: res => { |
| | | resolve(res); |
| | | }, |
| | | fail: err => { |
| | | console.log("uni.openDocument--fail"); |
| | | reject(err); |
| | | }, |
| | | }); |
| | | } else { |
| | | uni.saveFile({ |
| | | tempFilePath: filePath, |
| | | success: fileRes => { |
| | | uni.showToast({ |
| | | icon: "none", |
| | | mask: true, |
| | | title: |
| | | "æä»¶å·²ä¿åï¼Android/data/uni.UNI720216F/apps/__UNI__720216F/" + |
| | | fileRes.savedFilePath, //ä¿åè·¯å¾ |
| | | duration: 3000, |
| | | }); |
| | | setTimeout(() => { |
| | | //æå¼ææ¡£æ¥ç |
| | | uni.openDocument({ |
| | | filePath: fileRes.savedFilePath, |
| | | success: function (res) { |
| | | resolve(fileRes); |
| | | }, |
| | | }); |
| | | }, 3000); |
| | | }, |
| | | fail: err => { |
| | | console.log("uni.save--fail"); |
| | | reject(err); |
| | | }, |
| | | }); |
| | | } |
| | | // const isBlob = blobValidate(res.data); |
| | | // if (isBlob) { |
| | | // const blob = new Blob([res.data], { type: "text/plain" }); |
| | | // const url = URL.createObjectURL(blob); |
| | | // const downloadLink = document.getElementById("downloadLink"); |
| | | // downloadLink.href = url; |
| | | // downloadLink.download = file.name; |
| | | // downloadLink.click(); |
| | | // showToast("ä¸è½½æå"); |
| | | // } else { |
| | | // showToast("ä¸è½½å¤±è´¥"); |
| | | // } |
| | | }) |
| | | .catch(err => { |
| | | console.error("ä¸è½½å¤±è´¥:", err); |
| | | showToast("ä¸è½½å¤±è´¥"); |
| | | }); |
| | | }; |
| | | |
| | | // 确认å é¤ |
| | | const confirmDelete = (file, index) => { |
| | | uni.showModal({ |
| | | title: "å é¤ç¡®è®¤", |
| | | content: `ç¡®å®è¦å é¤éä»¶ "${file.name}" åï¼`, |
| | | success: res => { |
| | | if (res.confirm) { |
| | | deleteFile(file.id, index); |
| | | } |
| | | }, |
| | | }); |
| | | }; |
| | | |
| | | // å 餿件 |
| | | const deleteFile = (fileId, index) => { |
| | | uni.showLoading({ |
| | | title: "å é¤ä¸...", |
| | | mask: true, |
| | | }); |
| | | |
| | | safeHiddenFileDel([fileId]) |
| | | .then(res => { |
| | | uni.hideLoading(); |
| | | if (res.code === 200) { |
| | | // fileList.value.splice(index, 1); |
| | | getFileList(); |
| | | showToast("å 餿å"); |
| | | } else { |
| | | showToast("å é¤å¤±è´¥"); |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | uni.hideLoading(); |
| | | showToast("å é¤å¤±è´¥"); |
| | | }); |
| | | }; |
| | | |
| | | // æ¾ç¤ºæç¤º |
| | | const showToast = message => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: "none", |
| | | }); |
| | | }; |
| | | const rulesRegulationsManagementId = ref(""); |
| | | // 页é¢å è½½æ¶ |
| | | onMounted(() => { |
| | | rulesRegulationsManagementId.value = uni.getStorageSync( |
| | | "dangerInvestigationFileId" |
| | | ); |
| | | // ä» API è·åéä»¶å表 |
| | | getFileList(); |
| | | // 仿¬å°åå¨è·å rulesRegulationsManagementId |
| | | }); |
| | | |
| | | // è·åéä»¶å表 |
| | | const getFileList = () => { |
| | | uni.showLoading({ |
| | | title: "å è½½ä¸...", |
| | | mask: true, |
| | | }); |
| | | |
| | | fileListPage({ |
| | | safeHiddenId: rulesRegulationsManagementId.value, |
| | | current: -1, |
| | | size: -1, |
| | | }) |
| | | .then(res => { |
| | | uni.hideLoading(); |
| | | if (res.code === 200) { |
| | | fileList.value = res.data.records || []; |
| | | } else { |
| | | showToast("è·åéä»¶å表失败"); |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | uni.hideLoading(); |
| | | showToast("è·åéä»¶å表失败"); |
| | | }); |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import "../../../styles/sales-common.scss"; |
| | | |
| | | .file-list-page { |
| | | min-height: 100vh; |
| | | background: #f8f9fa; |
| | | padding-bottom: 100rpx; |
| | | } |
| | | |
| | | .file-list-container { |
| | | padding: 20rpx; |
| | | } |
| | | |
| | | .file-list { |
| | | background: #ffffff; |
| | | border-radius: 8rpx; |
| | | overflow: hidden; |
| | | box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05); |
| | | } |
| | | |
| | | .file-item { |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 20rpx; |
| | | border-bottom: 1rpx solid #f0f0f0; |
| | | |
| | | &:last-child { |
| | | border-bottom: none; |
| | | } |
| | | } |
| | | |
| | | .file-icon { |
| | | width: 56rpx; |
| | | height: 56rpx; |
| | | border-radius: 8rpx; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | margin-right: 20rpx; |
| | | |
| | | &.blue { |
| | | background: #409eff; |
| | | } |
| | | |
| | | &.green { |
| | | background: #67c23a; |
| | | } |
| | | |
| | | &.red { |
| | | background: #f56c6c; |
| | | } |
| | | |
| | | &.orange { |
| | | background: #e6a23c; |
| | | } |
| | | |
| | | &.gray { |
| | | background: #909399; |
| | | } |
| | | |
| | | &.purple { |
| | | background: #909399; |
| | | } |
| | | |
| | | &.yellow { |
| | | background: #e6a23c; |
| | | } |
| | | } |
| | | |
| | | .file-info { |
| | | flex: 1; |
| | | min-width: 0; |
| | | } |
| | | |
| | | .file-name { |
| | | display: block; |
| | | font-size: 16px; |
| | | color: #303133; |
| | | margin-bottom: 8rpx; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | .file-meta { |
| | | display: block; |
| | | font-size: 12px; |
| | | color: #909399; |
| | | } |
| | | |
| | | .file-actions { |
| | | display: flex; |
| | | gap: 12rpx; |
| | | } |
| | | |
| | | .empty-state { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | justify-content: center; |
| | | padding: 100rpx 0; |
| | | background: #ffffff; |
| | | border-radius: 8rpx; |
| | | box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.05); |
| | | } |
| | | |
| | | .empty-text { |
| | | font-size: 14px; |
| | | color: #909399; |
| | | margin-top: 20rpx; |
| | | } |
| | | |
| | | .upload-button { |
| | | position: fixed; |
| | | bottom: 40rpx; |
| | | right: 40rpx; |
| | | width: 130rpx; |
| | | height: 130rpx; |
| | | border-radius: 50%; |
| | | background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
| | | display: flex; |
| | | flex-direction: column; |
| | | justify-content: center; |
| | | align-items: center; |
| | | box-shadow: 0 4rpx 16rpx rgba(102, 126, 234, 0.4); |
| | | z-index: 1000; |
| | | } |
| | | |
| | | .upload-text { |
| | | font-size: 10px; |
| | | color: #ffffff; |
| | | margin-top: 4rpx; |
| | | } |
| | | |
| | | .upload-progress { |
| | | padding: 40rpx 0; |
| | | } |
| | | |
| | | .upload-progress-text { |
| | | display: block; |
| | | text-align: center; |
| | | margin-top: 20rpx; |
| | | font-size: 14px; |
| | | color: #606266; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="sales-accoun"> |
| | | <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> |
| | | <PageHeader title="éæ£ææ¥ä¸æ¥" |
| | | @back="goBack" /> |
| | | <!-- æç´¢åçéåºå --> |
| | | <!-- <view class="search-section"> |
| | | <view class="search-bar"> |
| | | <view class="search-input"> |
| | | <up-input class="search-text" |
| | | placeholder="请è¾å
¥å±é©æºåç§°" |
| | | v-model="customerName" |
| | | @blur="getList" |
| | | clearable /> |
| | | </view> |
| | | <view class="filter-button" |
| | | @click="getList"> |
| | | <u-icon name="search" |
| | | size="24" |
| | | color="#999"></u-icon> |
| | | </view> |
| | | </view> |
| | | </view> --> |
| | | <!-- æè®¿è®°å½å表 --> |
| | | <view class="ledger-list" |
| | | v-if="visitList.length > 0"> |
| | | <view v-for="(item, index) in visitList" |
| | | :key="index"> |
| | | <view class="ledger-item" |
| | | :class="{ 'overdue': isOverdue(item.rectifyTime, item.rectifyActualTime) }"> |
| | | <view class="item-header"> |
| | | <view class="item-left"> |
| | | <view class="document-icon"> |
| | | <up-icon name="file-text" |
| | | size="16" |
| | | color="#ffffff"></up-icon> |
| | | </view> |
| | | <text class="item-id">鿣ç¼å·ï¼{{ item.hiddenCode }}</text> |
| | | </view> |
| | | </view> |
| | | <up-divider></up-divider> |
| | | <view class="item-details" |
| | | @click="viewDetail(item)"> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">鿣æè¿°</text> |
| | | <text class="detail-value">{{ item.hiddenDesc || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">éæ£ç±»å</text> |
| | | <text class="detail-value">{{ hidden_danger_type.find(i => String(i.value) === String(item.type))?.label || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">é£é©ç级</text> |
| | | <u-tag :type="getRiskLevelType(item.riskLevel)"> |
| | | {{ item.riskLevel || '-' }} |
| | | </u-tag> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">鿣å
·ä½ä½ç½®</text> |
| | | <text class="detail-value">{{ item.location || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">䏿¥äºº</text> |
| | | <text class="detail-value">{{ item.createUserName || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">䏿¥æ¶é´</text> |
| | | <text class="detail-value">{{ item.createTime || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">æ´æ¹å®ææé</text> |
| | | <text class="detail-value">{{ item.rectifyTime || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">æ´æ¹è´£ä»»äºº</text> |
| | | <text class="detail-value">{{ item.rectifyUserName || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">æ´æ¹è´£ä»»äººèç³»æ¹å¼</text> |
| | | <text class="detail-value">{{ item.rectifyUserMobile || '-' }}</text> |
| | | </view> |
| | | <view v-if="item.rectifyActualTime" |
| | | class="detail-row"> |
| | | <text class="detail-label">æ´æ¹å
·ä½æªæ½</text> |
| | | <text class="detail-value">{{ item.rectifyMeasures || '-' }}</text> |
| | | </view> |
| | | <view v-if="item.rectifyActualTime" |
| | | class="detail-row"> |
| | | <text class="detail-label">å®é
æ´æ¹å®ææ¶é´</text> |
| | | <text class="detail-value">{{ item.rectifyActualTime || '-' }}</text> |
| | | </view> |
| | | <view v-if="item.verifyTime" |
| | | class="detail-row"> |
| | | <text class="detail-label">éªæ¶æè§</text> |
| | | <text class="detail-value">{{ item.verifyRemark || '-' }}</text> |
| | | </view> |
| | | <view v-if="item.verifyTime" |
| | | class="detail-row"> |
| | | <text class="detail-label">éªæ¶æ¶é´</text> |
| | | <text class="detail-value">{{ item.verifyTime || '-' }}</text> |
| | | </view> |
| | | <view v-if="item.verifyTime" |
| | | class="detail-row"> |
| | | <text class="detail-label">éªæ¶äºº</text> |
| | | <text class="detail-value">{{ item.verifyUserName || '-' }}</text> |
| | | </view> |
| | | <view v-if="item.verifyTime" |
| | | class="detail-row"> |
| | | <text class="detail-label">éªæ¶ç»æ</text> |
| | | <text class="detail-value">{{ item.verifyResult || '-' }}</text> |
| | | </view> |
| | | </view> |
| | | <!-- æé®åºå --> |
| | | <view class="action-buttons"> |
| | | <!-- <u-button type="info" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="viewDetail(item)"> |
| | | æ¥ç详æ
|
| | | </u-button> --> |
| | | <u-button type="warning" |
| | | size="small" |
| | | class="action-btn" |
| | | :disabled="item.isRectify" |
| | | @click="rectifyVisit(item)"> |
| | | æ´æ¹ |
| | | </u-button> |
| | | <u-button type="success" |
| | | size="small" |
| | | class="action-btn" |
| | | :disabled="!item.rectifyActualTime" |
| | | @click="acceptanceVisit(item)"> |
| | | éªæ¶ |
| | | </u-button> |
| | | </view> |
| | | <view class="action-buttons"> |
| | | <u-button type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="editVisit(item)"> |
| | | ç¼è¾ |
| | | </u-button> |
| | | <u-button type="info" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="viewFileList(item)"> |
| | | éä»¶ |
| | | </u-button> |
| | | <u-button type="error" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="deleteVisit(item)"> |
| | | å é¤ |
| | | </u-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view v-else |
| | | class="no-data"> |
| | | <text>ææ æè®¿è®°å½</text> |
| | | </view> |
| | | <!-- æµ®å¨æ°å¢æé® --> |
| | | <view class="fab-button" |
| | | @click="addVisit"> |
| | | <up-icon name="plus" |
| | | size="24" |
| | | color="#ffffff"></up-icon> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, onMounted } from "vue"; |
| | | |
| | | import { onShow } from "@dcloudio/uni-app"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import { |
| | | dangerInvestigationListPage, |
| | | safeHiddenDel, |
| | | } from "@/api/safeProduction/dangerInvestigation"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { useDict } from "@/utils/dict"; |
| | | // æ¿æ¢ toast æ¹æ³ |
| | | defineOptions({ name: "client-visit-index" }); |
| | | const showToast = message => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: "none", |
| | | }); |
| | | }; |
| | | const getRiskLevelType = riskLevel => { |
| | | const typeMap = { |
| | | ä½é£é©: "info", |
| | | ä¸è¬é£é©: "info", |
| | | è¾å¤§é£é©: "warning", |
| | | é大é£é©: "error", |
| | | }; |
| | | return typeMap[riskLevel] || "info"; |
| | | }; |
| | | |
| | | import dayjs from "dayjs"; |
| | | |
| | | const userStore = useUserStore(); |
| | | |
| | | // æ£æ¥éæ£æ¯å¦è¶
ææªæ´æ¹ |
| | | const isOverdue = (rectifyTime, rectifyActualTime) => { |
| | | // å¦æå·²ç»æ´æ¹å®æï¼åä¸è¶
æ |
| | | if (rectifyActualTime) return false; |
| | | |
| | | // å¦ææ²¡ææ´æ¹æéï¼åä¸è¶
æ |
| | | if (!rectifyTime) return false; |
| | | |
| | | const today = dayjs(); |
| | | const deadline = dayjs(rectifyTime); |
| | | |
| | | // 妿å½åæ¥æè¶
è¿æ´æ¹æéï¼åè¶
æ |
| | | return today.isAfter(deadline, "day"); |
| | | }; |
| | | |
| | | // æç´¢å
³é®è¯ |
| | | const customerName = ref(""); |
| | | |
| | | // æè®¿è®°å½æ°æ® |
| | | const visitList = ref([]); |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | uni.navigateBack(); |
| | | }; |
| | | const viewFileList = item => { |
| | | uni.setStorageSync("dangerInvestigationFileId", item.id); |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/dangerInvestigation/fileList", |
| | | }); |
| | | }; |
| | | |
| | | // æ¥è¯¢å表 |
| | | const getList = () => { |
| | | showLoadingToast("å è½½ä¸..."); |
| | | const params = { |
| | | current: -1, |
| | | size: -1, |
| | | }; |
| | | dangerInvestigationListPage(params) |
| | | .then(res => { |
| | | visitList.value = res.records || res.data?.records || []; |
| | | userStore.getInfo().then(res => { |
| | | visitList.value.forEach(item => { |
| | | console.log(item.rectifyUserId, res.user.userId); |
| | | if (Number(item.rectifyUserId) != Number(res.user.userId)) { |
| | | item.isRectify = true; |
| | | } else { |
| | | item.isRectify = false; |
| | | } |
| | | }); |
| | | }); |
| | | |
| | | closeToast(); |
| | | }) |
| | | .catch(() => { |
| | | closeToast(); |
| | | showToast("è·åæ°æ®å¤±è´¥"); |
| | | }); |
| | | }; |
| | | |
| | | // æ¾ç¤ºå è½½æç¤º |
| | | const showLoadingToast = message => { |
| | | uni.showLoading({ |
| | | title: message, |
| | | mask: true, |
| | | }); |
| | | }; |
| | | |
| | | // å
³éæç¤º |
| | | const closeToast = () => { |
| | | uni.hideLoading(); |
| | | }; |
| | | |
| | | // æ°å¢éæ£ |
| | | const addVisit = () => { |
| | | uni.setStorageSync("dangerInvestigation", {}); |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/dangerInvestigation/detail", |
| | | }); |
| | | }; |
| | | // ç¼è¾éæ£ |
| | | const editVisit = item => { |
| | | uni.setStorageSync("dangerInvestigation", item); |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/dangerInvestigation/detail", |
| | | }); |
| | | }; |
| | | // æ´æ¹éæ£ |
| | | const rectifyVisit = item => { |
| | | uni.setStorageSync("dangerInvestigation", item); |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/dangerInvestigation/rectify", |
| | | }); |
| | | }; |
| | | // éªæ¶éæ£ |
| | | const acceptanceVisit = item => { |
| | | uni.setStorageSync("dangerInvestigation", item); |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/dangerInvestigation/acceptance", |
| | | }); |
| | | }; |
| | | // å é¤éæ£ |
| | | const deleteVisit = item => { |
| | | uni.showModal({ |
| | | title: "å é¤ç¡®è®¤", |
| | | content: `ç¡®å®è¦å é¤è¯¥éæ£åï¼`, |
| | | success: res => { |
| | | if (res.confirm) { |
| | | deleteClientVisit(item.id); |
| | | } |
| | | }, |
| | | }); |
| | | }; |
| | | const { hidden_danger_type } = useDict("hidden_danger_type"); |
| | | // å é¤éæ£è®°å½ |
| | | const deleteClientVisit = id => { |
| | | showLoadingToast("å é¤ä¸..."); |
| | | safeHiddenDel([id]) |
| | | .then(() => { |
| | | closeToast(); |
| | | showToast("å 餿å"); |
| | | getList(); |
| | | }) |
| | | .catch(() => { |
| | | closeToast(); |
| | | showToast("å é¤å¤±è´¥"); |
| | | }); |
| | | }; |
| | | // æ¥ç详æ
|
| | | const viewDetail = item => { |
| | | uni.setStorageSync("dangerInvestigation", item); |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/dangerInvestigation/view", |
| | | }); |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | getList(); |
| | | }); |
| | | |
| | | onShow(() => { |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import "../../../styles/sales-common.scss"; |
| | | |
| | | // 页é¢ç¹å®çæ ·å¼è¦ç |
| | | .sales-accoun { |
| | | min-height: 100vh; |
| | | background: #f8f9fa; |
| | | position: relative; |
| | | padding-bottom: 80px; |
| | | } |
| | | |
| | | // ç¹å®ç徿 æ ·å¼ |
| | | .document-icon { |
| | | background: #667eea; // ä¿æé¡µé¢ç¹æçèæ¯è² |
| | | } |
| | | |
| | | // ç¹ææ ·å¼ |
| | | .visit-status { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .detail-value { |
| | | word-break: break-all; // ä¿ç页é¢ç¹æçææ¬æ¢è¡æ ·å¼ |
| | | } |
| | | |
| | | // ç¹å®çæµ®å¨æé®æ ·å¼ |
| | | .fab-button { |
| | | background: #667eea; // ä¿æé¡µé¢ç¹æçèæ¯è² |
| | | box-shadow: 0 4px 16px rgba(102, 126, 234, 0.3); // ä¿æé¡µé¢ç¹æçé´å½±ææ |
| | | } |
| | | .action-buttons { |
| | | gap: 4px; |
| | | } |
| | | .action-buttons { |
| | | padding: 0 0 10rpx 0; |
| | | } |
| | | |
| | | // è¶
ææªæ´æ¹çéæ£æ ·å¼ |
| | | .overdue { |
| | | border-left: 8rpx solid #ff4d4f; |
| | | background-color: rgba(255, 77, 79, 0.02); |
| | | } |
| | | |
| | | .overdue .item-header { |
| | | position: relative; |
| | | padding-left: 20rpx; |
| | | } |
| | | |
| | | .overdue .item-header::after { |
| | | content: "è¶
æ"; |
| | | position: absolute; |
| | | top: 32rpx; |
| | | right: 20rpx; |
| | | font-size: 24rpx; |
| | | font-weight: 500; |
| | | color: #ff4d4f; |
| | | background-color: rgba(255, 77, 79, 0.1); |
| | | padding: 4rpx 16rpx; |
| | | border-radius: 16rpx; |
| | | border: 1rpx solid rgba(255, 77, 79, 0.3); |
| | | } |
| | | |
| | | .overdue .detail-row:nth-child(7) .detail-value { |
| | | color: #ff4d4f; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .overdue .detail-row { |
| | | padding-left: 20rpx; |
| | | } |
| | | </style> |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="danger-investigation-rectify"> |
| | | <PageHeader title="éæ£æ´æ¹" |
| | | @back="goBack" /> |
| | | <view class="section"> |
| | | <view class="section-title">éæ£ä¿¡æ¯</view> |
| | | <view class="info-item"> |
| | | <text class="info-label">鿣ç¼å·</text> |
| | | <text class="info-value">{{ form.hiddenCode || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">éæ£ç±»å</text> |
| | | <text class="info-value">{{ hidden_danger_type.find(i => String(i.value) === String(form.type))?.label || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">é£é©ç级</text> |
| | | <text class="info-value">{{ form.riskLevel || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">鿣æè¿°</text> |
| | | <text class="info-value">{{ form.hiddenDesc || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">鿣å
·ä½ä½ç½®</text> |
| | | <text class="info-value">{{ form.location || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">䏿¥äºº</text> |
| | | <text class="info-value">{{ form.createUserName || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">䏿¥æ¶é´</text> |
| | | <text class="info-value">{{ form.createTime || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">æ´æ¹å®ææé</text> |
| | | <text class="info-value">{{ form.rectifyTime || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">æ´æ¹è´£ä»»äºº</text> |
| | | <text class="info-value">{{ form.rectifyUserName || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">æ´æ¹è´£ä»»äººèç³»æ¹å¼</text> |
| | | <text class="info-value">{{ form.rectifyUserMobile || '-' }}</text> |
| | | </view> |
| | | </view> |
| | | <u-form @submit="handleSubmit" |
| | | ref="formRef" |
| | | label-width="130"> |
| | | <!-- æ´æ¹ä¿¡æ¯ --> |
| | | <u-cell-group title="æ´æ¹ä¿¡æ¯"> |
| | | <u-form-item label="å®é
æ´æ¹å®ææ¶é´" |
| | | prop="rectifyActualTime" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.rectifyActualTime" |
| | | placeholder="è¯·éæ©å®é
æ´æ¹å®ææ¶é´" |
| | | @click="showTimePicker" /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | @click="showTimePicker"></up-icon> |
| | | </template> |
| | | </u-form-item> |
| | | <u-form-item label="æ´æ¹å
·ä½æªæ½" |
| | | required |
| | | border-bottom> |
| | | <u-textarea v-model="form.rectifyMeasures" |
| | | readonly |
| | | :autoHeight="true" /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | <!-- æäº¤æé® --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" |
| | | @click="goBack">åæ¶</u-button> |
| | | <u-button class="sign-btn" |
| | | type="primary" |
| | | @click="handleSubmit" |
| | | :loading="loading">æäº¤æ´æ¹</u-button> |
| | | </view> |
| | | </u-form> |
| | | <!-- æ¶é´éæ©å¨ --> |
| | | <up-datetime-picker :show="showTime" |
| | | v-model="currentTime" |
| | | @confirm="onTimeConfirm" |
| | | @cancel="showTime = false" |
| | | mode="date" /> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // æ¿æ¢ toast æ¹æ³ |
| | | defineOptions({ name: "danger-investigation-rectify" }); |
| | | const showToast = message => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: "none", |
| | | }); |
| | | }; |
| | | |
| | | import { ref, onMounted } from "vue"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import { safeHiddenUpdate } from "@/api/safeProduction/dangerInvestigation"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import dayjs from "dayjs"; |
| | | import { onLoad } from "@dcloudio/uni-app"; |
| | | import { useDict } from "@/utils/dict"; |
| | | |
| | | const userStore = useUserStore(); |
| | | const { hidden_danger_type } = useDict("hidden_danger_type"); |
| | | // è¡¨åæ°æ® |
| | | const form = ref({ |
| | | id: "", |
| | | hiddenCode: "", |
| | | hiddenDesc: "", |
| | | location: "", |
| | | rectifyTime: "", |
| | | rectifyUserName: "", |
| | | rectifyUserMobile: "", |
| | | rectifyMeasures: "", |
| | | rectifyActualTime: "", |
| | | rectifyResult: "", |
| | | }); |
| | | |
| | | // 页é¢ç¶æ |
| | | const loading = ref(false); |
| | | const formRef = ref(null); |
| | | |
| | | // æ¶é´ç¸å
³ |
| | | const currentTime = ref(Date.now()); |
| | | const showTime = ref(false); |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | // è¿åæ¶æ¸
餿¬å°åå¨çæ°æ® |
| | | uni.removeStorageSync("dangerInvestigation"); |
| | | uni.navigateBack(); |
| | | }; |
| | | |
| | | // æ¾ç¤ºæ¶é´éæ©å¨ |
| | | const showTimePicker = () => { |
| | | showTime.value = true; |
| | | }; |
| | | |
| | | // 确认æ¶é´éæ© |
| | | const onTimeConfirm = e => { |
| | | form.value.rectifyActualTime = dayjs(e.value).format("YYYY-MM-DD"); |
| | | currentTime.value = e.value; |
| | | showTime.value = false; |
| | | }; |
| | | |
| | | // æäº¤è¡¨å |
| | | const handleSubmit = async () => { |
| | | if (!form.value.rectifyActualTime) { |
| | | showToast("è¯·éæ©å®é
æ´æ¹å®ææ¶é´"); |
| | | return; |
| | | } |
| | | if (!form.value.rectifyMeasures) { |
| | | showToast("请è¾å
¥æ´æ¹å
·ä½æªæ½"); |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | loading.value = true; |
| | | |
| | | // 使ç¨å®å
¨æµ
æ·è´ï¼é¿å
对象å±å¼å¨æäºè¿è¡æ¶æé |
| | | const source = |
| | | form.value && typeof form.value === "object" ? form.value : {}; |
| | | const submitData = {}; |
| | | Object.keys(source).forEach(k => { |
| | | submitData[k] = source[k]; |
| | | }); |
| | | console.log("submitData", submitData); |
| | | |
| | | const { code } = await safeHiddenUpdate(submitData); |
| | | if (code === 200) { |
| | | showToast("æ´æ¹æäº¤æå"); |
| | | setTimeout(() => { |
| | | goBack(); |
| | | }, 500); |
| | | } else { |
| | | loading.value = false; |
| | | showToast("æ´æ¹æäº¤å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | } catch (e) { |
| | | loading.value = false; |
| | | console.error("æäº¤å¤±è´¥:", e); |
| | | showToast("æäº¤å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | }; |
| | | |
| | | onLoad(() => { |
| | | // 仿¬å°åå¨è·åéæ£æ°æ® |
| | | const dangerInvestigation = uni.getStorageSync("dangerInvestigation"); |
| | | if (dangerInvestigation && dangerInvestigation.id) { |
| | | form.value = dangerInvestigation; |
| | | console.log("form.value", form.value); |
| | | } else { |
| | | showToast("ææ éæ£æ°æ®"); |
| | | } |
| | | }); |
| | | |
| | | // åå§å页颿°æ® |
| | | const initPageData = () => { |
| | | // 设置é»è®¤å®é
æ´æ¹å®ææ¶é´ä¸ºå½åæ¶é´ |
| | | if (!form.value.rectifyActualTime) { |
| | | form.value.rectifyActualTime = dayjs().format("YYYY-MM-DD"); |
| | | currentTime.value = Date.now(); |
| | | } |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | initPageData(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import "@/static/scss/form-common.scss"; |
| | | .danger-investigation-rectify { |
| | | min-height: 100vh; |
| | | background-color: #f8f9fa; |
| | | padding-bottom: 160rpx; |
| | | } |
| | | .footer-btns { |
| | | position: fixed; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | background: #fff; |
| | | display: flex; |
| | | justify-content: space-around; |
| | | align-items: center; |
| | | padding: 0.75rem 0; |
| | | box-shadow: 0 -0.125rem 0.5rem rgba(0, 0, 0, 0.05); |
| | | z-index: 1000; |
| | | } |
| | | |
| | | .cancel-btn { |
| | | font-weight: 400; |
| | | font-size: 1rem; |
| | | color: #666; |
| | | background: #f5f5f5; |
| | | border: 1px solid #ddd; |
| | | width: 45%; |
| | | height: 2.5rem; |
| | | border-radius: 2.5rem 2.5rem 2.5rem 2.5rem; |
| | | } |
| | | |
| | | .sign-btn { |
| | | font-weight: 500; |
| | | font-size: 1rem; |
| | | color: #fff; |
| | | background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
| | | border: none; |
| | | width: 45%; |
| | | height: 2.5rem; |
| | | border-radius: 2.5rem 2.5rem 2.5rem 2.5rem; |
| | | } |
| | | |
| | | .section { |
| | | background-color: #ffffff; |
| | | margin-bottom: 16px; |
| | | overflow: hidden; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); |
| | | } |
| | | |
| | | .section-title { |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | color: #333333; |
| | | padding: 16px 16px 12px; |
| | | border-bottom: 1px solid #f0f0f0; |
| | | } |
| | | |
| | | .info-item { |
| | | display: flex; |
| | | padding: 14px 16px; |
| | | border-bottom: 1px solid #f8f8f8; |
| | | align-items: flex-start; |
| | | } |
| | | |
| | | .info-item:last-child { |
| | | border-bottom: none; |
| | | } |
| | | |
| | | .info-label { |
| | | font-size: 14px; |
| | | color: #666666; |
| | | min-width: 80px; |
| | | flex-shrink: 0; |
| | | line-height: 22px; |
| | | } |
| | | |
| | | .info-value { |
| | | font-size: 14px; |
| | | color: #333333; |
| | | flex: 1; |
| | | line-height: 22px; |
| | | text-align: right; |
| | | } |
| | | |
| | | .multi-line { |
| | | text-align: left; |
| | | word-break: break-all; |
| | | line-height: 1.6; |
| | | } |
| | | |
| | | .remark-item { |
| | | padding-bottom: 16px; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="danger-investigation-view"> |
| | | <PageHeader title="éæ£è¯¦æ
" |
| | | @back="goBack" /> |
| | | <!-- å
å®¹å®¹å¨ --> |
| | | <view class="content-container"> |
| | | <!-- éæ£ä¿¡æ¯ --> |
| | | <view class="section"> |
| | | <view class="section-title">éæ£ä¿¡æ¯</view> |
| | | <view class="info-item"> |
| | | <text class="info-label">鿣ç¼å·</text> |
| | | <text class="info-value">{{ form.hiddenCode || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">éæ£ç±»å</text> |
| | | <text class="info-value">{{ hidden_danger_type.find(i => String(i.value) === String(form.type))?.label || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">é£é©ç级</text> |
| | | <text class="info-value">{{ form.riskLevel || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">鿣æè¿°</text> |
| | | <text class="info-value">{{ form.hiddenDesc || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">鿣å
·ä½ä½ç½®</text> |
| | | <text class="info-value">{{ form.location || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">䏿¥äºº</text> |
| | | <text class="info-value">{{ form.createUserName || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">䏿¥æ¶é´</text> |
| | | <text class="info-value">{{ form.createTime || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">æ´æ¹å®ææé</text> |
| | | <text class="info-value">{{ form.rectifyTime || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">æ´æ¹è´£ä»»äºº</text> |
| | | <text class="info-value">{{ form.rectifyUserName || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">æ´æ¹è´£ä»»äººèç³»æ¹å¼</text> |
| | | <text class="info-value">{{ form.rectifyUserMobile || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">æ´æ¹å
·ä½æªæ½</text> |
| | | <text class="info-value">{{ form.rectifyMeasures || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">å®é
æ´æ¹å®ææ¶é´</text> |
| | | <text class="info-value">{{ form.rectifyActualTime || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">éªæ¶æ¶é´</text> |
| | | <text class="info-value">{{ form.verifyTime || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">éªæ¶äºº</text> |
| | | <text class="info-value">{{ form.verifyUserName || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">éªæ¶ç»æ</text> |
| | | <text class="info-value">{{ form.verifyResult || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">éªæ¶æè§</text> |
| | | <text class="info-value">{{ form.verifyRemark || '-' }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // æ¿æ¢ toast æ¹æ³ |
| | | const showToast = message => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: "none", |
| | | }); |
| | | }; |
| | | |
| | | import { ref, onMounted } from "vue"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { onLoad } from "@dcloudio/uni-app"; |
| | | import { useDict } from "@/utils/dict"; |
| | | |
| | | const { hidden_danger_type } = useDict("hidden_danger_type"); |
| | | const userStore = useUserStore(); |
| | | |
| | | // è¡¨åæ°æ® |
| | | const form = ref({ |
| | | hiddenCode: "", |
| | | hiddenType: "", |
| | | riskLevel: "", |
| | | hiddenDesc: "", |
| | | location: "", |
| | | createUserName: "", |
| | | createTime: "", |
| | | rectifyTime: "", |
| | | rectifyUserName: "", |
| | | rectifyUserMobile: "", |
| | | rectifyMeasures: "", |
| | | rectifyActualTime: "", |
| | | rectifyResult: "", |
| | | acceptanceTime: "", |
| | | acceptanceOpinion: "", |
| | | verifyResult: "", |
| | | }); |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | // è¿åæ¶æ¸
餿¬å°åå¨çæ°æ® |
| | | uni.removeStorageSync("dangerInvestigation"); |
| | | uni.navigateBack(); |
| | | }; |
| | | |
| | | // åå§å页颿°æ® |
| | | const initPageData = () => { |
| | | // 仿¬å°åå¨è·åéæ£è¯¦æ
|
| | | const row = uni.getStorageSync("dangerInvestigation"); |
| | | if (row) { |
| | | form.value = { ...row }; |
| | | } else { |
| | | showToast("ææ éæ£æ°æ®"); |
| | | } |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | initPageData(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import "@/static/scss/form-common.scss"; |
| | | .danger-investigation-view { |
| | | min-height: 100vh; |
| | | background-color: #f8f9fa; |
| | | } |
| | | |
| | | .content-container { |
| | | padding: 16px; |
| | | } |
| | | |
| | | .section { |
| | | background-color: #ffffff; |
| | | border-radius: 12px; |
| | | margin-bottom: 16px; |
| | | overflow: hidden; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06); |
| | | } |
| | | |
| | | .section-title { |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | color: #333333; |
| | | padding: 16px 16px 12px; |
| | | border-bottom: 1px solid #f0f0f0; |
| | | } |
| | | |
| | | .info-item { |
| | | display: flex; |
| | | padding: 14px 16px; |
| | | border-bottom: 1px solid #f8f8f8; |
| | | align-items: flex-start; |
| | | } |
| | | |
| | | .info-item:last-child { |
| | | border-bottom: none; |
| | | } |
| | | |
| | | .info-label { |
| | | font-size: 14px; |
| | | color: #666666; |
| | | min-width: 80px; |
| | | flex-shrink: 0; |
| | | line-height: 22px; |
| | | } |
| | | |
| | | .info-value { |
| | | font-size: 14px; |
| | | color: #333333; |
| | | flex: 1; |
| | | line-height: 22px; |
| | | text-align: right; |
| | | } |
| | | |
| | | .multi-line { |
| | | text-align: left; |
| | | word-break: break-all; |
| | | line-height: 1.6; |
| | | } |
| | | |
| | | .remark-item { |
| | | padding-bottom: 16px; |
| | | } |
| | | </style> |
| | |
| | | <up-action-sheet :show="typeSheetVisible" |
| | | :actions="typeOptions" |
| | | @select="handleTypeSelect" |
| | | @close="typeSheetVisible = false" |
| | | title="éæ©å±é©æºç±»å" /> |
| | | <!-- é£é©ççº§éæ©å¨ --> |
| | | <up-action-sheet :show="riskLevelSheetVisible" |
| | | :actions="riskLevelOptions" |
| | | @select="handleRiskLevelSelect" |
| | | @close="riskLevelSheetVisible = false" |
| | | title="éæ©é£é©ç级" /> |
| | | <!-- 管æ§è´£ä»»äººéæ©å¨ --> |
| | | <up-action-sheet :show="principalSheetVisible" |
| | | :actions="principalOptions" |
| | | @select="handlePrincipalSelect" |
| | | @close="principalSheetVisible = false" |
| | | title="éæ©ç®¡æ§è´£ä»»äºº" /> |
| | | </view> |
| | | </template> |
| | |
| | | v-if="visitList.length > 0"> |
| | | <view v-for="(item, index) in visitList" |
| | | :key="index"> |
| | | <view class="ledger-item"> |
| | | <view class="ledger-item" |
| | | :class="{ 'high-risk': item.riskLevel === 'é大é£é©' }"> |
| | | <view class="item-header"> |
| | | <view class="item-left"> |
| | | <view class="document-icon"> |
| | |
| | | background: #667eea; // ä¿æé¡µé¢ç¹æçèæ¯è² |
| | | box-shadow: 0 4px 16px rgba(102, 126, 234, 0.3); // ä¿æé¡µé¢ç¹æçé´å½±ææ |
| | | } |
| | | |
| | | // é大é£é©ç¹çéç®è¦ç¤ºæ è¯ |
| | | .high-risk { |
| | | border-left: 8rpx solid #ff4d4f; |
| | | box-shadow: 0 2rpx 12rpx rgba(255, 77, 79, 0.2); |
| | | position: relative; |
| | | background-color: rgba(255, 77, 79, 0.02); |
| | | } |
| | | |
| | | .high-risk .item-header { |
| | | position: relative; |
| | | padding-left: 20rpx; |
| | | } |
| | | |
| | | .high-risk .item-header::after { |
| | | // content: "é大é£é©"; |
| | | position: absolute; |
| | | top: 16rpx; |
| | | right: 20rpx; |
| | | font-size: 24rpx; |
| | | font-weight: 500; |
| | | color: #ff4d4f; |
| | | background-color: rgba(255, 77, 79, 0.1); |
| | | padding: 4rpx 16rpx; |
| | | border-radius: 16rpx; |
| | | border: 1rpx solid rgba(255, 77, 79, 0.3); |
| | | } |
| | | |
| | | .high-risk .detail-row:nth-child(3) .u-tag { |
| | | font-size: 26rpx; |
| | | padding: 6rpx 16rpx; |
| | | border-radius: 16rpx; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .high-risk .detail-row { |
| | | padding-left: 20rpx; |
| | | } |
| | | </style> |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="hazard-source-detail"> |
| | | <PageHeader :title="isEdit ? 'å½è¿' : 'é¢ç¨å±é©æº'" |
| | | @back="goBack" /> |
| | | <u-form @submit="handleSubmit" |
| | | ref="formRef" |
| | | label-width="110"> |
| | | <!-- å±é©æºä¿¡æ¯ --> |
| | | <u-cell-group v-if="!isEdit" |
| | | title="å±é©æºä¿¡æ¯"> |
| | | <u-form-item v-if="!isEdit" |
| | | label="å±é©æºåç§°" |
| | | prop="name" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.name" |
| | | placeholder="è¯·éæ©å±é©æº" |
| | | @click="showHazardSourceSheet" |
| | | readonly /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | @click="showHazardSourceSheet"></up-icon> |
| | | </template> |
| | | </u-form-item> |
| | | <u-form-item label="å±é©æºç¼ç " |
| | | prop="code" |
| | | border-bottom> |
| | | <u-input v-model="form.code" |
| | | disabled |
| | | placeholder="èªå¨å¸¦åº" |
| | | readonly /> |
| | | </u-form-item> |
| | | <u-form-item v-if="!isEdit" |
| | | label="å±é©æºç±»å" |
| | | prop="type" |
| | | border-bottom> |
| | | <u-input v-model="form.type" |
| | | disabled |
| | | placeholder="èªå¨å¸¦åº" |
| | | readonly /> |
| | | </u-form-item> |
| | | <u-form-item v-if="!isEdit" |
| | | label="é£é©ç级" |
| | | prop="riskLevel" |
| | | border-bottom> |
| | | <u-input v-model="form.riskLevel" |
| | | disabled |
| | | placeholder="èªå¨å¸¦åº" |
| | | readonly /> |
| | | </u-form-item> |
| | | <u-form-item v-if="!isEdit" |
| | | label="æå¨ä½ç½®" |
| | | prop="location" |
| | | border-bottom> |
| | | <u-input v-model="form.location" |
| | | disabled |
| | | placeholder="èªå¨å¸¦åº" |
| | | readonly /> |
| | | </u-form-item> |
| | | <u-form-item v-if="!isEdit" |
| | | label="é¢ç¨æ¶é´" |
| | | prop="applyTime" |
| | | border-bottom> |
| | | <u-input v-model="form.applyTime" |
| | | disabled /> |
| | | </u-form-item> |
| | | <u-form-item v-if="!isEdit" |
| | | label="é¢ç¨äºº" |
| | | prop="applyUserName" |
| | | border-bottom> |
| | | <u-input v-model="form.applyUserName" |
| | | disabled /> |
| | | </u-form-item> |
| | | <u-form-item v-if="!isEdit" |
| | | label="é¢ç¨ç¨é" |
| | | prop="applyPurpose" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.applyPurpose" |
| | | placeholder="请è¾å
¥é¢ç¨ç¨é" /> |
| | | </u-form-item> |
| | | <u-form-item v-if="!isEdit" |
| | | label="é¢ç¨æ°é" |
| | | prop="applyQty" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.applyQty" |
| | | type="number" |
| | | @blur="validateApplyQty" |
| | | min="1" |
| | | placeholder="请è¾å
¥é¢ç¨æ°é" /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | <u-cell-group v-if="isEdit" |
| | | title="å½è¿ä¿¡æ¯"> |
| | | <u-form-item label="å½è¿äºº" |
| | | prop="returnUserName" |
| | | border-bottom> |
| | | <u-input v-model="form.returnUserName" |
| | | disabled /> |
| | | </u-form-item> |
| | | <u-form-item label="å½è¿æ¶é´" |
| | | prop="returnTime" |
| | | border-bottom> |
| | | <u-input v-model="form.returnTime" |
| | | disabled /> |
| | | </u-form-item> |
| | | <u-form-item label="å½è¿æ
åµè¯´æ" |
| | | prop="returnRemark" |
| | | required |
| | | border-bottom> |
| | | <u-textarea v-model="form.returnRemark" |
| | | placeholder="请è¾å
¥å½è¿æ
åµè¯´æ" |
| | | :rows="4" |
| | | :autoHeight="true" /> |
| | | </u-form-item> |
| | | </u-cell-group> |
| | | <!-- æäº¤æé® --> |
| | | <view class="footer-btns"> |
| | | <u-button class="cancel-btn" |
| | | @click="goBack">åæ¶</u-button> |
| | | <u-button class="sign-btn" |
| | | type="primary" |
| | | @click="handleSubmit" |
| | | :loading="loading">{{ isEdit ? 'å½è¿' : 'é¢ç¨' }}</u-button> |
| | | </view> |
| | | </u-form> |
| | | <!-- å±é©æºéæ©å¨ --> |
| | | <up-action-sheet :show="hazardSourceSheetVisible" |
| | | :actions="hazardSourceOptions" |
| | | @select="handleHazardSourceSelect" |
| | | @close="hazardSourceSheetVisible = false" |
| | | title="éæ©å±é©æº" /> |
| | | <!-- æ¶é´éæ©å¨ --> |
| | | <up-datetime-picker :show="applyTimeVisible" |
| | | v-model="applyTime" |
| | | @confirm="onApplyTimeConfirm" |
| | | @cancel="applyTimeVisible = false" |
| | | mode="datetime" /> |
| | | <up-datetime-picker :show="returnTimeVisible" |
| | | v-model="returnTime" |
| | | @confirm="onReturnTimeConfirm" |
| | | @cancel="returnTimeVisible = false" |
| | | mode="date" /> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // æ¿æ¢ toast æ¹æ³ |
| | | defineOptions({ name: "hazard-source-detail" }); |
| | | const showToast = message => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: "none", |
| | | }); |
| | | }; |
| | | |
| | | import { ref, onMounted } from "vue"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import { |
| | | safeHazardRecordAdd, |
| | | safeHazardRecordUpdate, |
| | | } from "@/api/safeProduction/hazardousMaterialsControl"; |
| | | import { safeHazardListPage } from "@/api/safeProduction/hazardSourceLedger"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import dayjs from "dayjs"; |
| | | import { onLoad } from "@dcloudio/uni-app"; |
| | | |
| | | const userStore = useUserStore(); |
| | | |
| | | // è¡¨åæ°æ® |
| | | const form = ref({ |
| | | name: "", |
| | | code: "", |
| | | type: "", |
| | | riskLevel: "", |
| | | location: "", |
| | | applyPurpose: "", |
| | | applyTime: "", |
| | | applyQty: "", |
| | | returnTime: "", |
| | | returnRemark: "", |
| | | safeHazardId: "", |
| | | }); |
| | | |
| | | // 页é¢ç¶æ |
| | | const loading = ref(false); |
| | | const formRef = ref(null); |
| | | const isEdit = ref(false); |
| | | |
| | | // å±é©æºéæ©å¨ |
| | | const hazardSourceSheetVisible = ref(false); |
| | | const hazardSourceOptions = ref([]); |
| | | const hazardSourceList = ref([]); |
| | | const showHazardSourceSheet = () => { |
| | | if (hazardSourceOptions.value.length === 0) { |
| | | getHazardSourceList(); |
| | | } else { |
| | | hazardSourceSheetVisible.value = true; |
| | | } |
| | | }; |
| | | const stockQty = ref(0); |
| | | const handleHazardSourceSelect = item => { |
| | | const hazardSource = hazardSourceList.value.find(h => h.id === item.value); |
| | | if (hazardSource) { |
| | | form.value.name = hazardSource.name; |
| | | form.value.code = hazardSource.code; |
| | | form.value.type = hazardSource.type; |
| | | form.value.riskLevel = hazardSource.riskLevel; |
| | | form.value.location = hazardSource.location; |
| | | form.value.safeHazardId = hazardSource.id; |
| | | stockQty.value = hazardSource.stockQty || 0; |
| | | } |
| | | hazardSourceSheetVisible.value = false; |
| | | }; |
| | | const validateApplyQty = () => { |
| | | if (!form.value.applyQty) { |
| | | showToast("请è¾å
¥é¢ç¨æ°é"); |
| | | return false; |
| | | } |
| | | if (isNaN(form.value.applyQty)) { |
| | | showToast("é¢ç¨æ°éå¿
é¡»æ¯æ°å"); |
| | | form.value.applyQty = 0; |
| | | return false; |
| | | } |
| | | if (form.value.applyQty < 0) { |
| | | showToast("é¢ç¨æ°éå¿
须大äºçäº1"); |
| | | form.value.applyQty = 0; |
| | | return false; |
| | | } |
| | | if (form.value.applyQty > stockQty.value) { |
| | | showToast("é¢ç¨æ°éä¸è½å¤§äºåºåæ°é"); |
| | | form.value.applyQty = 0; |
| | | return false; |
| | | } |
| | | return true; |
| | | }; |
| | | |
| | | // è·åå±é©æºå表 |
| | | const getHazardSourceList = () => { |
| | | const params = { |
| | | current: -1, |
| | | size: -1, |
| | | }; |
| | | safeHazardListPage(params).then(res => { |
| | | if (res.code === 200) { |
| | | hazardSourceList.value = res.records || res.data?.records || []; |
| | | // è¿æ»¤æåºåæ°éå°äºçäº0çé项 |
| | | const validHazardSources = hazardSourceList.value.filter( |
| | | item => item.stockQty > 0 |
| | | ); |
| | | hazardSourceOptions.value = validHazardSources.map(item => ({ |
| | | value: item.id, |
| | | name: item.name, |
| | | subname: `åºå: ${item.stockQty}`, |
| | | })); |
| | | hazardSourceSheetVisible.value = true; |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | // æ¶é´éæ©å¨ |
| | | const applyTimeVisible = ref(false); |
| | | const applyTime = ref(Date.now()); |
| | | const showApplyTimePicker = () => { |
| | | applyTimeVisible.value = true; |
| | | }; |
| | | const onApplyTimeConfirm = e => { |
| | | form.value.applyTime = dayjs(e.value).format("YYYY-MM-DD HH:mm:ss"); |
| | | applyTime.value = e.value; |
| | | applyTimeVisible.value = false; |
| | | }; |
| | | |
| | | const returnTimeVisible = ref(false); |
| | | const returnTime = ref(Date.now()); |
| | | const showReturnTimePicker = () => { |
| | | returnTimeVisible.value = true; |
| | | }; |
| | | const onReturnTimeConfirm = e => { |
| | | form.value.returnTime = dayjs(e.value).format("YYYY-MM-DD"); |
| | | returnTime.value = e.value; |
| | | returnTimeVisible.value = false; |
| | | }; |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | // è¿åæ¶æ¸
餿¬å°åå¨çæ°æ® |
| | | uni.removeStorageSync("hazardousMaterialsControl"); |
| | | uni.navigateBack(); |
| | | }; |
| | | |
| | | // æäº¤è¡¨å |
| | | const handleSubmit = async () => { |
| | | if (!form.value.safeHazardId) { |
| | | showToast("è¯·éæ©å±é©æº"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.applyPurpose) { |
| | | showToast("请è¾å
¥é¢ç¨ç¨é"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.applyQty) { |
| | | showToast("请è¾å
¥é¢ç¨æ°é"); |
| | | return; |
| | | } |
| | | |
| | | if (isEdit.value) { |
| | | if (!form.value.returnTime) { |
| | | showToast("è¯·éæ©å½è¿æ¶é´"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.returnRemark) { |
| | | showToast("请è¾å
¥å½è¿æ
åµè¯´æ"); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | try { |
| | | loading.value = true; |
| | | |
| | | // 使ç¨å®å
¨æµ
æ·è´ï¼é¿å
对象å±å¼å¨æäºè¿è¡æ¶æé |
| | | const source = |
| | | form.value && typeof form.value === "object" ? form.value : {}; |
| | | const submitData = {}; |
| | | Object.keys(source).forEach(k => { |
| | | submitData[k] = source[k]; |
| | | }); |
| | | console.log("submitData", submitData); |
| | | if (isEdit.value) { |
| | | const { code } = await safeHazardRecordUpdate(submitData); |
| | | if (code === 200) { |
| | | showToast("å½è¿æå"); |
| | | setTimeout(() => { |
| | | goBack(); |
| | | }, 500); |
| | | } else { |
| | | loading.value = false; |
| | | showToast("å½è¿å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | } else { |
| | | const { code } = await safeHazardRecordAdd(submitData); |
| | | if (code === 200) { |
| | | showToast("é¢ç¨æå"); |
| | | setTimeout(() => { |
| | | goBack(); |
| | | }, 500); |
| | | } else { |
| | | loading.value = false; |
| | | showToast("é¢ç¨å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | } |
| | | } catch (e) { |
| | | loading.value = false; |
| | | console.error("æäº¤å¤±è´¥:", e); |
| | | showToast("æäº¤å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | }; |
| | | |
| | | onLoad(() => { |
| | | // ç¼è¾å±é©æºæ¶ï¼ä»æ¬å°åå¨è·åæ°æ® |
| | | const hazardousMaterials = uni.getStorageSync("hazardousMaterialsControl"); |
| | | console.log("hazardousMaterials", hazardousMaterials); |
| | | if (hazardousMaterials.id) { |
| | | form.value = hazardousMaterials; |
| | | isEdit.value = true; |
| | | userStore.getInfo().then(res => { |
| | | form.value.returnUserId = res.user.userId; |
| | | form.value.returnUserName = res.user.nickName; |
| | | }); |
| | | console.log("form.value", form.value); |
| | | } else { |
| | | userStore.getInfo().then(res => { |
| | | form.value.applyUserId = res.user.userId; |
| | | form.value.applyUserName = res.user.nickName; |
| | | }); |
| | | isEdit.value = false; |
| | | } |
| | | }); |
| | | |
| | | onMounted(() => { |
| | | // 设置é»è®¤æ¶é´ |
| | | if (!isEdit.value) { |
| | | form.value.applyTime = dayjs().format("YYYY-MM-DD"); |
| | | applyTime.value = Date.now(); |
| | | } else { |
| | | form.value.returnTime = dayjs().format("YYYY-MM-DD"); |
| | | returnTime.value = Date.now(); |
| | | } |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import "@/static/scss/form-common.scss"; |
| | | .client-visit { |
| | | min-height: 100vh; |
| | | background: #f8f9fa; |
| | | padding-bottom: 5rem; |
| | | } |
| | | |
| | | .footer-btns { |
| | | position: fixed; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | background: #fff; |
| | | display: flex; |
| | | justify-content: space-around; |
| | | align-items: center; |
| | | padding: 0.75rem 0; |
| | | box-shadow: 0 -0.125rem 0.5rem rgba(0, 0, 0, 0.05); |
| | | z-index: 1000; |
| | | } |
| | | |
| | | .cancel-btn { |
| | | font-weight: 400; |
| | | font-size: 1rem; |
| | | color: #666; |
| | | background: #f5f5f5; |
| | | border: 1px solid #ddd; |
| | | width: 45%; |
| | | height: 2.5rem; |
| | | border-radius: 2.5rem 2.5rem 2.5rem 2.5rem; |
| | | } |
| | | |
| | | .sign-btn { |
| | | font-weight: 500; |
| | | font-size: 1rem; |
| | | color: #fff; |
| | | background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
| | | border: none; |
| | | width: 45%; |
| | | height: 2.5rem; |
| | | border-radius: 2.5rem 2.5rem 2.5rem 2.5rem; |
| | | } |
| | | |
| | | .location-icon { |
| | | color: #1989fa; |
| | | font-size: 1.2rem; |
| | | } |
| | | </style> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="sales-accoun"> |
| | | <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> |
| | | <PageHeader title="å±é©ç©æç®¡æ§" |
| | | @back="goBack" /> |
| | | <!-- æç´¢åçéåºå --> |
| | | <view class="search-section"> |
| | | <view class="search-bar"> |
| | | <view class="search-input"> |
| | | <up-input class="search-text" |
| | | placeholder="请è¾å
¥å±é©æºåç§°" |
| | | v-model="customerName" |
| | | @blur="getList" |
| | | clearable /> |
| | | </view> |
| | | <view class="filter-button" |
| | | @click="getList"> |
| | | <u-icon name="search" |
| | | size="24" |
| | | color="#999"></u-icon> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <!-- æè®¿è®°å½å表 --> |
| | | <view class="ledger-list" |
| | | v-if="visitList.length > 0"> |
| | | <view v-for="(item, index) in visitList" |
| | | :key="index"> |
| | | <view class="ledger-item"> |
| | | <view class="item-header"> |
| | | <view class="item-left"> |
| | | <view class="document-icon"> |
| | | <up-icon name="file-text" |
| | | size="16" |
| | | color="#ffffff"></up-icon> |
| | | </view> |
| | | <text class="item-id">é¢ç¨åå·ï¼{{ item.materialRecordCode }}</text> |
| | | </view> |
| | | </view> |
| | | <up-divider></up-divider> |
| | | <view class="item-details"> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">å±é©æºåç§°</text> |
| | | <text class="detail-value">{{ item.name || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">å±é©æºç¼ç </text> |
| | | <text class="detail-value">{{ item.code || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">å±é©æºç±»å</text> |
| | | <text class="detail-value">{{ hazard_source_type.find(i => i.value === item.type)?.label || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">é£é©ç级</text> |
| | | <u-tag :type="getRiskLevelType(item.riskLevel)"> |
| | | {{ item.riskLevel || '-' }} |
| | | </u-tag> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">æå¨ä½ç½®</text> |
| | | <text class="detail-value">{{ item.location || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">é¢ç¨ç¨é</text> |
| | | <text class="detail-value">{{ item.applyPurpose || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">é¢ç¨æ¶é´</text> |
| | | <text class="detail-value">{{ item.applyTime || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">é¢ç¨æ°é</text> |
| | | <text class="detail-value">{{ item.applyQty || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">å½è¿æ¶é´</text> |
| | | <text class="detail-value">{{ item.returnTime || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">å½è¿äºº</text> |
| | | <text class="detail-value">{{ item.returnUserName || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">å½è¿æ
åµè¯´æ</text> |
| | | <text class="detail-value">{{ item.returnRemark || '-' }}</text> |
| | | </view> |
| | | </view> |
| | | <!-- æé®åºå --> |
| | | <view class="action-buttons"> |
| | | <!-- <u-button type="info" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="viewDetail(item)"> |
| | | æ¥ç详æ
|
| | | </u-button> --> |
| | | <u-button type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | | :disabled="item.returnUserId" |
| | | @click="editVisit(item)"> |
| | | å½è¿ |
| | | </u-button> |
| | | <u-button type="error" |
| | | size="small" |
| | | class="action-btn" |
| | | @click="deleteVisit(item)"> |
| | | å é¤ |
| | | </u-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view v-else |
| | | class="no-data"> |
| | | <text>ææ æè®¿è®°å½</text> |
| | | </view> |
| | | <!-- æµ®å¨æ°å¢æé® --> |
| | | <view class="fab-button" |
| | | @click="addVisit"> |
| | | <up-icon name="plus" |
| | | size="24" |
| | | color="#ffffff"></up-icon> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, onMounted } from "vue"; |
| | | |
| | | import { onShow } from "@dcloudio/uni-app"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import { |
| | | safeHazardRecordListPage, |
| | | safeHazardRecordDel, |
| | | } from "@/api/safeProduction/hazardousMaterialsControl"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { useDict } from "@/utils/dict"; |
| | | // æ¿æ¢ toast æ¹æ³ |
| | | defineOptions({ name: "client-visit-index" }); |
| | | const showToast = message => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: "none", |
| | | }); |
| | | }; |
| | | const getRiskLevelType = riskLevel => { |
| | | const typeMap = { |
| | | ä½é£é©: "info", |
| | | ä¸è¬é£é©: "info", |
| | | è¾å¤§é£é©: "warning", |
| | | é大é£é©: "error", |
| | | }; |
| | | return typeMap[riskLevel] || "info"; |
| | | }; |
| | | |
| | | import dayjs from "dayjs"; |
| | | |
| | | const userStore = useUserStore(); |
| | | |
| | | // æç´¢å
³é®è¯ |
| | | const customerName = ref(""); |
| | | |
| | | // æè®¿è®°å½æ°æ® |
| | | const visitList = ref([]); |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | uni.navigateBack(); |
| | | }; |
| | | |
| | | // æ¥è¯¢å表 |
| | | const getList = () => { |
| | | showLoadingToast("å è½½ä¸..."); |
| | | const params = { |
| | | current: -1, |
| | | size: -1, |
| | | name: customerName.value, |
| | | }; |
| | | safeHazardRecordListPage(params) |
| | | .then(res => { |
| | | visitList.value = res.records || res.data?.records || []; |
| | | closeToast(); |
| | | }) |
| | | .catch(() => { |
| | | closeToast(); |
| | | showToast("è·åæ°æ®å¤±è´¥"); |
| | | }); |
| | | }; |
| | | |
| | | // æ¾ç¤ºå è½½æç¤º |
| | | const showLoadingToast = message => { |
| | | uni.showLoading({ |
| | | title: message, |
| | | mask: true, |
| | | }); |
| | | }; |
| | | |
| | | // å
³éæç¤º |
| | | const closeToast = () => { |
| | | uni.hideLoading(); |
| | | }; |
| | | |
| | | // æ°å¢å±é©æº |
| | | const addVisit = () => { |
| | | uni.setStorageSync("hazardousMaterialsControl", {}); |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/hazardousMaterialsControl/detail", |
| | | }); |
| | | }; |
| | | // ç¼è¾å±é©æº |
| | | const editVisit = item => { |
| | | uni.setStorageSync("hazardousMaterialsControl", item); |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/hazardousMaterialsControl/detail", |
| | | }); |
| | | }; |
| | | // å é¤å±é©æº |
| | | const deleteVisit = item => { |
| | | uni.showModal({ |
| | | title: "å é¤ç¡®è®¤", |
| | | content: `ç¡®å®è¦å é¤è¯¥è®°å½åï¼`, |
| | | success: res => { |
| | | if (res.confirm) { |
| | | deleteClientVisit(item.id); |
| | | } |
| | | }, |
| | | }); |
| | | }; |
| | | const { hazard_source_type } = useDict("hazard_source_type"); |
| | | const { risk_level } = useDict("risk_level"); |
| | | |
| | | // å é¤å±é©æºè®°å½ |
| | | const deleteClientVisit = id => { |
| | | showLoadingToast("å é¤ä¸..."); |
| | | safeHazardRecordDel([id]) |
| | | .then(() => { |
| | | closeToast(); |
| | | showToast("å 餿å"); |
| | | getList(); |
| | | }) |
| | | .catch(() => { |
| | | closeToast(); |
| | | showToast("å é¤å¤±è´¥"); |
| | | }); |
| | | }; |
| | | // æ¥ç详æ
|
| | | const viewDetail = item => { |
| | | uni.setStorageSync("hazardSourceLedger", item); |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/hazardSourceLedger/view", |
| | | }); |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | getList(); |
| | | }); |
| | | |
| | | onShow(() => { |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import "../../../styles/sales-common.scss"; |
| | | |
| | | // 页é¢ç¹å®çæ ·å¼è¦ç |
| | | .sales-accoun { |
| | | min-height: 100vh; |
| | | background: #f8f9fa; |
| | | position: relative; |
| | | padding-bottom: 80px; |
| | | } |
| | | |
| | | // ç¹å®ç徿 æ ·å¼ |
| | | .document-icon { |
| | | background: #667eea; // ä¿æé¡µé¢ç¹æçèæ¯è² |
| | | } |
| | | |
| | | // ç¹ææ ·å¼ |
| | | .visit-status { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .detail-value { |
| | | word-break: break-all; // ä¿ç页é¢ç¹æçææ¬æ¢è¡æ ·å¼ |
| | | } |
| | | |
| | | // ç¹å®çæµ®å¨æé®æ ·å¼ |
| | | .fab-button { |
| | | background: #667eea; // ä¿æé¡µé¢ç¹æçèæ¯è² |
| | | box-shadow: 0 4px 16px rgba(102, 126, 234, 0.3); // ä¿æé¡µé¢ç¹æçé´å½±ææ |
| | | } |
| | | </style> |
| | | |
| | |
| | | <up-action-sheet :show="typeSheetVisible" |
| | | :actions="typeOptions" |
| | | @select="handleTypeSelect" |
| | | @close="typeSheetVisible = false" |
| | | title="éæ©è§ç¨èµè´¨ç±»å" /> |
| | | </view> |
| | | </template> |
| | |
| | | v-if="visitList.length > 0"> |
| | | <view v-for="(item, index) in visitList" |
| | | :key="index"> |
| | | <view class="ledger-item"> |
| | | <view class="ledger-item" |
| | | :class="{ 'expiring-soon': isExpiringSoon(item.effectiveTime) }"> |
| | | <view class="item-header"> |
| | | <view class="item-left"> |
| | | <view class="document-icon"> |
| | |
| | | import dayjs from "dayjs"; |
| | | |
| | | const userStore = useUserStore(); |
| | | |
| | | // æ£æ¥èµè´¨æ¯å¦å³å°å°æï¼å°æå15å¤©ï¼ |
| | | const isExpiringSoon = effectiveTime => { |
| | | if (!effectiveTime) return false; |
| | | |
| | | const today = dayjs(); |
| | | const expireDate = dayjs(effectiveTime); |
| | | const daysDiff = expireDate.diff(today, "day"); |
| | | |
| | | return daysDiff >= 0 && daysDiff <= 15; |
| | | }; |
| | | |
| | | // æç´¢å
³é®è¯ |
| | | const customerName = ref(""); |
| | |
| | | background: #667eea; // ä¿æé¡µé¢ç¹æçèæ¯è² |
| | | box-shadow: 0 4px 16px rgba(102, 126, 234, 0.3); // ä¿æé¡µé¢ç¹æçé´å½±ææ |
| | | } |
| | | |
| | | // å³å°å°æçèµè´¨å¡çæ ·å¼ |
| | | .expiring-soon { |
| | | border: 2rpx solid #ff4d4f; |
| | | box-shadow: 0 2rpx 16rpx rgba(255, 77, 79, 0.2); |
| | | } |
| | | |
| | | .expiring-soon .item-header { |
| | | background-color: rgba(255, 77, 79, 0.05); |
| | | } |
| | | |
| | | .expiring-soon .detail-row:last-child .detail-value { |
| | | color: #ff4d4f; |
| | | font-weight: 500; |
| | | } |
| | | </style> |
| | | |