| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // åè´§å°è´¦é¡µé¢æ¥å£ |
| | | import request from "@/utils/request"; |
| | | |
| | | // å页æ¥è¯¢ |
| | | export function safeHazardListPage(query) { |
| | | return request({ |
| | | url: "/safeHazard/page", |
| | | method: "get", |
| | | params: query, |
| | | }); |
| | | } |
| | | |
| | | // æ°å¢å±é©æºå°è´¦ |
| | | export function safeHazardAdd(query) { |
| | | return request({ |
| | | url: '/safeHazard', |
| | | method: 'post', |
| | | data: query |
| | | }) |
| | | } |
| | | // ä¿®æ¹å±é©æºå°è´¦ |
| | | export function safeHazardUpdate(query) { |
| | | return request({ |
| | | url: '/safeHazard', |
| | | method: 'put', |
| | | data: query |
| | | }) |
| | | } |
| | | // å é¤å±é©æºå°è´¦ |
| | | export function safeHazardDel(ids) { |
| | | return request({ |
| | | url: '/safeHazard/' + ids, |
| | | method: 'delete', |
| | | data: ids |
| | | }) |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // åè´§å°è´¦é¡µé¢æ¥å£ |
| | | import request from "@/utils/request"; |
| | | |
| | | // å页æ¥è¯¢ |
| | | export function qualificationsListPage(query) { |
| | | return request({ |
| | | url: "/safeCertification/page", |
| | | method: "get", |
| | | params: query, |
| | | }); |
| | | } |
| | | |
| | | // æ°å¢å®å
¨è§ç¨ä¸èµè´¨ç®¡ç |
| | | export function safeCertificationAdd(query) { |
| | | return request({ |
| | | url: '/safeCertification', |
| | | method: 'post', |
| | | data: query |
| | | }) |
| | | } |
| | | // ä¿®æ¹å®å
¨è§ç¨ä¸èµè´¨ç®¡ç |
| | | export function safeCertificationUpdate(query) { |
| | | return request({ |
| | | url: '/safeCertification', |
| | | method: 'put', |
| | | data: query |
| | | }) |
| | | } |
| | | // å é¤å®å
¨è§ç¨ä¸èµè´¨ç®¡ç |
| | | export function safeCertificationDel(ids) { |
| | | return request({ |
| | | url: '/safeCertification/' + ids, |
| | | method: 'delete', |
| | | data: ids |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢éä»¶å表 |
| | | export function fileListPage(query) { |
| | | return request({ |
| | | url: "/safeCertificationFile/listPage", |
| | | method: "get", |
| | | params: query, |
| | | }); |
| | | } |
| | | // æ·»å éä»¶ |
| | | export function safeCertificationFileAdd(query) { |
| | | return request({ |
| | | url: '/safeCertificationFile/add', |
| | | method: 'post', |
| | | data: query |
| | | }) |
| | | } |
| | | // å é¤éä»¶ |
| | | export function safeCertificationFileDel(ids) { |
| | | return request({ |
| | | url: '/safeCertificationFile/del', |
| | | method: 'delete', |
| | | data: ids |
| | | }) |
| | | } |
| | |
| | | "navigationBarTitleText": "èªå®ä¹åºåº", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/safeProduction/safeQualifications/index", |
| | | "style": { |
| | | "navigationBarTitleText": "è§ç¨èµè´¨", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/safeProduction/safeQualifications/detail", |
| | | "style": { |
| | | "navigationBarTitleText": "è§ç¨èµè´¨è¯¦æ
", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/safeProduction/safeQualifications/view", |
| | | "style": { |
| | | "navigationBarTitleText": "è§ç¨èµè´¨è¯¦æ
", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/safeProduction/hazardSourceLedger/index", |
| | | "style": { |
| | | "navigationBarTitleText": "å±é©æºå°è´¦", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/safeProduction/hazardSourceLedger/detail", |
| | | "style": { |
| | | "navigationBarTitleText": "å±é©æºè¯¦æ
", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/safeProduction/hazardSourceLedger/view", |
| | | "style": { |
| | | "navigationBarTitleText": "å±é©æºè¯¦æ
", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | ], |
| | | "subPackages": [ |
| | | { |
| | |
| | | </up-grid> |
| | | </view> |
| | | </view> |
| | | <!-- å®å
¨ç产模å --> |
| | | <view class="common-module collaboration-module"> |
| | | <view class="module-header"> |
| | | <view class="module-title-container"> |
| | | <text class="module-title">å®å
¨ç产</text> |
| | | </view> |
| | | </view> |
| | | <view class="module-content"> |
| | | <up-grid :border="false" |
| | | col="4"> |
| | | <up-grid-item v-for="(item, index) in safetyItems" |
| | | :key="index" |
| | | @click="handleCommonItemClick(item)"> |
| | | <view class="icon-container" |
| | | :style="{ background: item.bgColor }"> |
| | | <up-icon :name="item.icon" |
| | | :size="58" |
| | | color="#ffffff"></up-icon> |
| | | </view> |
| | | <text class="item-label">{{item.label}}</text> |
| | | </up-grid-item> |
| | | </up-grid> |
| | | </view> |
| | | </view> |
| | | <!-- çäº§ç®¡æ§æ¨¡å --> |
| | | <!-- <view class="common-module production-module">--> |
| | | <!-- <view class="module-header">--> |
| | |
| | | label: "ä¾åºå徿¥", |
| | | }, |
| | | ]); |
| | | |
| | | const safetyItems = reactive([ |
| | | { |
| | | icon: "/static/images/icon/caigoutaizhang@2x.png", |
| | | label: "è§ç¨èµè´¨", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/caigoutaizhang@2x.png", |
| | | label: "å±é©æºç®¡ç", |
| | | }, |
| | | ]); |
| | | // åååå
¬åè½æ°æ® |
| | | const collaborationItems = reactive([ |
| | | { |
| | |
| | | url: "/pages/equipmentManagement/verification/index", |
| | | }); |
| | | break; |
| | | case "è§ç¨èµè´¨": |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/safeQualifications/index", |
| | | }); |
| | | break; |
| | | case "å±é©æºç®¡ç": |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/hazardSourceLedger/index", |
| | | }); |
| | | break; |
| | | default: |
| | | uni.showToast({ |
| | | title: `ç¹å»äº${item.label}`, |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="hazard-source-detail"> |
| | | <PageHeader :title="isEdit ? 'ç¼è¾å±é©æº' : 'æ°å¢å±é©æº'" |
| | | @back="goBack" /> |
| | | <u-form @submit="handleSubmit" |
| | | ref="formRef" |
| | | label-width="110"> |
| | | <!-- å±é©æºä¿¡æ¯ --> |
| | | <u-cell-group title="å±é©æºä¿¡æ¯"> |
| | | <u-form-item label="å±é©æºåç§°" |
| | | prop="name" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.name" |
| | | placeholder="请è¾å
¥å±é©æºåç§°" /> |
| | | </u-form-item> |
| | | <u-form-item label="å±é©æºç¼ç " |
| | | prop="code" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.code" |
| | | placeholder="请è¾å
¥å±é©æºç¼ç " /> |
| | | </u-form-item> |
| | | <u-form-item label="å±é©æºç±»å" |
| | | prop="type" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="typeName" |
| | | placeholder="è¯·éæ©å±é©æºç±»å" |
| | | @click="showTypeSheet" |
| | | readonly /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | @click="showTypeSheet"></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="location" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.location" |
| | | placeholder="请è¾å
¥æå¨ä½ç½®" /> |
| | | </u-form-item> |
| | | <u-form-item label="ç®¡æ§æªæ½" |
| | | prop="controlMeasures" |
| | | required |
| | | border-bottom> |
| | | <u-textarea v-model="form.controlMeasures" |
| | | placeholder="请è¾å
¥ç®¡æ§æªæ½" |
| | | :maxlength="200" |
| | | count |
| | | :autoHeight="true" /> |
| | | </u-form-item> |
| | | <u-form-item label="åºåæ°é" |
| | | prop="stockQty" |
| | | border-bottom> |
| | | <u-input v-model="form.stockQty" |
| | | type="number" |
| | | min="0" |
| | | @blur="validateStockQty" |
| | | placeholder="请è¾å
¥åºåæ°é" /> |
| | | </u-form-item> |
| | | <u-form-item label="管æ§è´£ä»»äºº" |
| | | prop="principalUser" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.principalUser" |
| | | placeholder="è¯·éæ©ç®¡æ§è´£ä»»äºº" |
| | | @click="showPrincipalSheet" |
| | | readonly /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | @click="showPrincipalSheet"></up-icon> |
| | | </template> |
| | | </u-form-item> |
| | | <u-form-item label="责任人èç³»çµè¯" |
| | | prop="principalMobile" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.principalMobile" |
| | | placeholder="请è¾å
¥è´£ä»»äººèç³»çµè¯" /> |
| | | </u-form-item> |
| | | <u-form-item label="è§æ ¼ / é£é©æè¿°" |
| | | prop="specInfo" |
| | | border-bottom> |
| | | <u-textarea v-model="form.specInfo" |
| | | 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">{{ isEdit ? 'ä¿åä¿®æ¹' : 'æäº¤' }}</u-button> |
| | | </view> |
| | | </u-form> |
| | | <!-- å±é©æºç±»åéæ©å¨ --> |
| | | <up-action-sheet :show="typeSheetVisible" |
| | | :actions="typeOptions" |
| | | @select="handleTypeSelect" |
| | | title="éæ©å±é©æºç±»å" /> |
| | | <!-- é£é©ççº§éæ©å¨ --> |
| | | <up-action-sheet :show="riskLevelSheetVisible" |
| | | :actions="riskLevelOptions" |
| | | @select="handleRiskLevelSelect" |
| | | title="éæ©é£é©ç级" /> |
| | | <!-- 管æ§è´£ä»»äººéæ©å¨ --> |
| | | <up-action-sheet :show="principalSheetVisible" |
| | | :actions="principalOptions" |
| | | @select="handlePrincipalSelect" |
| | | title="éæ©ç®¡æ§è´£ä»»äºº" /> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // æ¿æ¢ toast æ¹æ³ |
| | | defineOptions({ name: "hazard-source-detail" }); |
| | | const showToast = message => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: "none", |
| | | }); |
| | | }; |
| | | |
| | | import { ref, onMounted, nextTick } from "vue"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import { |
| | | safeHazardAdd, |
| | | safeHazardUpdate, |
| | | } from "@/api/safeProduction/hazardSourceLedger"; |
| | | import { userListNoPageByTenantId } from "@/api/system/user"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { useDict } from "@/utils/dict"; |
| | | import { onLoad } from "@dcloudio/uni-app"; |
| | | |
| | | // è·ååå
¸æ°æ® |
| | | const { hazard_source_type } = useDict("hazard_source_type"); |
| | | |
| | | const userStore = useUserStore(); |
| | | |
| | | // è¡¨åæ°æ® |
| | | const form = ref({ |
| | | name: "", |
| | | code: "", |
| | | type: "", |
| | | riskLevel: "", |
| | | location: "", |
| | | controlMeasures: "", |
| | | stockQty: "", |
| | | principalUser: "", |
| | | principalUserId: "", |
| | | principalMobile: "", |
| | | specInfo: "", |
| | | }); |
| | | |
| | | // 页é¢ç¶æ |
| | | const loading = ref(false); |
| | | const formRef = ref(null); |
| | | const isEdit = ref(false); |
| | | |
| | | // å±é©æºç±»åéæ©å¨ |
| | | const typeSheetVisible = ref(false); |
| | | const typeName = ref(""); |
| | | const typeOptions = ref([]); |
| | | const showTypeSheet = () => { |
| | | typeSheetVisible.value = true; |
| | | }; |
| | | const handleTypeSelect = item => { |
| | | form.value.type = item.value; |
| | | typeName.value = item.name; |
| | | typeSheetVisible.value = false; |
| | | }; |
| | | const validateStockQty = val => { |
| | | let numVal = Number(val); |
| | | if (isNaN(numVal)) { |
| | | numVal = 0; |
| | | } |
| | | if (numVal < 0) { |
| | | showToast("åºåæ°éä¸è½å°äº0"); |
| | | numVal = 0; |
| | | } |
| | | // ä½¿ç¨ nextTick ç¡®ä¿è§å¾æ´æ° |
| | | nextTick(() => { |
| | | form.value.stockQty = numVal; |
| | | }); |
| | | }; |
| | | |
| | | // é£é©ççº§éæ©å¨ |
| | | 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 => { |
| | | console.log(item, "item"); |
| | | form.value.principalUser = item.name; |
| | | form.value.principalUserId = item.value; |
| | | form.value.principalMobile = item.phonenumber; |
| | | 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, |
| | | phonenumber: user.phonenumber, |
| | | })); |
| | | principalSheetVisible.value = true; |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | // è¿åæ¶æ¸
餿¬å°åå¨çæ°æ® |
| | | uni.removeStorageSync("hazardSourceLedger"); |
| | | uni.navigateBack(); |
| | | }; |
| | | |
| | | // æäº¤è¡¨å |
| | | const handleSubmit = async () => { |
| | | if (!form.value.name) { |
| | | showToast("请è¾å
¥å±é©æºåç§°"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.code) { |
| | | showToast("请è¾å
¥å±é©æºç¼ç "); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.type) { |
| | | showToast("è¯·éæ©å±é©æºç±»å"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.riskLevel) { |
| | | showToast("è¯·éæ©é£é©ç级"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.location) { |
| | | showToast("请è¾å
¥æå¨ä½ç½®"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.controlMeasures) { |
| | | showToast("请è¾å
¥ç®¡æ§æªæ½"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.principalUser) { |
| | | showToast("请è¾å
¥ç®¡æ§è´£ä»»äºº"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.principalMobile) { |
| | | 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 safeHazardUpdate(submitData); |
| | | if (code === 200) { |
| | | showToast("ä¿®æ¹æå"); |
| | | setTimeout(() => { |
| | | goBack(); |
| | | }, 500); |
| | | } else { |
| | | loading.value = false; |
| | | showToast("ä¿®æ¹å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | } else { |
| | | const { code } = await safeHazardAdd(submitData); |
| | | if (code === 200) { |
| | | showToast("æ°å¢æå"); |
| | | setTimeout(() => { |
| | | goBack(); |
| | | }, 500); |
| | | } else { |
| | | loading.value = false; |
| | | showToast("æ°å¢å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | } |
| | | } catch (e) { |
| | | loading.value = false; |
| | | console.error("æäº¤å¤±è´¥:", e); |
| | | showToast("æäº¤å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | }; |
| | | |
| | | onLoad(() => { |
| | | // ç¼è¾å±é©æºæ¶ï¼ä»æ¬å°åå¨è·åæ°æ® |
| | | const hazardSource = uni.getStorageSync("hazardSourceLedger"); |
| | | console.log("hazardSource", hazardSource); |
| | | if (hazardSource.id) { |
| | | form.value = hazardSource; |
| | | isEdit.value = true; |
| | | console.log("form.value", form.value); |
| | | } else { |
| | | isEdit.value = false; |
| | | } |
| | | }); |
| | | |
| | | onMounted(() => { |
| | | // åå§åéé¡¹æ°æ® |
| | | typeOptions.value = hazard_source_type.value.map(item => ({ |
| | | value: item.value, |
| | | name: item.label, |
| | | })); |
| | | riskLevelOptions.value = [ |
| | | { value: "ä½é£é©", name: "ä½é£é©" }, |
| | | { value: "ä¸è¬é£é©", name: "ä¸è¬é£é©" }, |
| | | { value: "è¾å¤§é£é©", name: "è¾å¤§é£é©" }, |
| | | { value: "é大é£é©", name: "é大é£é©" }, |
| | | ]; |
| | | |
| | | // 设置已éå¼çæ¾ç¤ºææ¬ |
| | | if (form.value.type) { |
| | | typeName.value = |
| | | typeOptions.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"; |
| | | .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.name }}</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.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.controlMeasures || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">åºåæ°é</text> |
| | | <text class="detail-value">{{ item.stockQty || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">管æ§è´£ä»»äºº</text> |
| | | <text class="detail-value">{{ item.principalUser || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">责任人èç³»çµè¯</text> |
| | | <text class="detail-value">{{ item.principalMobile || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">è§æ ¼ / é£é©æè¿°</text> |
| | | <text class="detail-value">{{ item.specInfo || '-' }}</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" |
| | | @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 { delCustomer } from "@/api/cooperativeOffice/clientVisit"; |
| | | import { |
| | | qualificationsListPage, |
| | | safeCertificationDel, |
| | | } from "@/api/safeProduction/safeQualifications"; |
| | | import { |
| | | safeHazardListPage, |
| | | safeHazardDel, |
| | | } from "@/api/safeProduction/hazardSourceLedger"; |
| | | 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, |
| | | }; |
| | | safeHazardListPage(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("hazardSourceLedger", {}); |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/hazardSourceLedger/detail", |
| | | }); |
| | | }; |
| | | // ç¼è¾å±é©æº |
| | | const editVisit = item => { |
| | | uni.setStorageSync("hazardSourceLedger", item); |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/hazardSourceLedger/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("å é¤ä¸..."); |
| | | safeHazardDel([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> |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="hazard-source-detail"> |
| | | <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.name || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">å±é©æºç¼ç </text> |
| | | <text class="info-value">{{ form.code || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">å±é©æºç±»å</text> |
| | | <text class="info-value">{{ hazard_source_type.find(item => item.value === form.type)?.label || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">é£é©ç级</text> |
| | | <text class="info-value"><u-tag :type="getRiskLevelType(form.riskLevel)"> |
| | | {{ form.riskLevel || '-' }} |
| | | </u-tag></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.controlMeasures || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">åºåæ°é</text> |
| | | <text class="info-value">{{ form.stockQty || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">管æ§è´£ä»»äºº</text> |
| | | <text class="info-value">{{ form.principalUser || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">责任人èç³»çµè¯</text> |
| | | <text class="info-value">{{ form.principalMobile || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">è§æ ¼ / é£é©æè¿°</text> |
| | | <text class="info-value">{{ form.specInfo || '-' }}</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 { useDict } from "@/utils/dict"; |
| | | |
| | | const userStore = useUserStore(); |
| | | |
| | | // è·ååå
¸æ°æ® |
| | | const { hazard_source_type } = useDict("hazard_source_type"); |
| | | const { risk_level } = useDict("risk_level"); |
| | | |
| | | // è¡¨åæ°æ® |
| | | const form = ref({ |
| | | name: "", |
| | | code: "", |
| | | type: "", |
| | | riskLevel: "", |
| | | location: "", |
| | | controlMeasures: "", |
| | | stockQty: "", |
| | | principalUser: "", |
| | | principalMobile: "", |
| | | specInfo: "", |
| | | }); |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | // è¿åæ¶æ¸
餿¬å°åå¨çæ°æ® |
| | | uni.removeStorageSync("hazardSourceLedger"); |
| | | uni.navigateBack(); |
| | | }; |
| | | const getRiskLevelType = riskLevel => { |
| | | const typeMap = { |
| | | ä½é£é©: "info", |
| | | ä¸è¬é£é©: "info", |
| | | è¾å¤§é£é©: "warning", |
| | | é大é£é©: "error", |
| | | }; |
| | | return typeMap[riskLevel] || "info"; |
| | | }; |
| | | |
| | | // åå§å页颿°æ® |
| | | const initPageData = () => { |
| | | // 仿¬å°åå¨è·åå±é©æºè¯¦æ
|
| | | const row = uni.getStorageSync("hazardSourceLedger"); |
| | | if (row) { |
| | | form.value = { ...row }; |
| | | } else { |
| | | showToast("ææ å±é©æºæ°æ®"); |
| | | } |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | initPageData(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import "@/static/scss/form-common.scss"; |
| | | |
| | | .client-visit-detail { |
| | | 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> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="safe-qualifications-detail"> |
| | | <PageHeader :title="isEdit ? 'ç¼è¾è§ç¨èµè´¨' : 'æ°å¢è§ç¨èµè´¨'" |
| | | @back="goBack" /> |
| | | <u-form @submit="handleSubmit" |
| | | ref="formRef" |
| | | label-width="110"> |
| | | <!-- è§ç¨èµè´¨ä¿¡æ¯ --> |
| | | <u-cell-group title="è§ç¨èµè´¨ä¿¡æ¯"> |
| | | <u-form-item label="è§ç¨èµè´¨åç§°" |
| | | prop="name" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.name" |
| | | placeholder="请è¾å
¥è§ç¨èµè´¨åç§°" /> |
| | | </u-form-item> |
| | | <u-form-item label="è§ç¨èµè´¨ç¼å·" |
| | | prop="code" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.code" |
| | | placeholder="请è¾å
¥è§ç¨èµè´¨ç¼å·" /> |
| | | </u-form-item> |
| | | <u-form-item label="è§ç¨èµè´¨ç±»å" |
| | | prop="type" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="typeName" |
| | | placeholder="è¯·éæ©è§ç¨èµè´¨ç±»å" |
| | | @click="showTypeSheet" |
| | | readonly /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | @click="showTypeSheet"></up-icon> |
| | | </template> |
| | | </u-form-item> |
| | | <u-form-item label="çæ¬å·" |
| | | prop="version" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.version" |
| | | placeholder="请è¾å
¥çæ¬å·" /> |
| | | </u-form-item> |
| | | <u-form-item label="æææ" |
| | | prop="effectiveTime" |
| | | required |
| | | border-bottom> |
| | | <u-input v-model="form.effectiveTime" |
| | | placeholder="è¯·éæ©æææ" |
| | | @click="showTimePicker" /> |
| | | <template #right> |
| | | <up-icon name="arrow-right" |
| | | @click="showTimePicker"></up-icon> |
| | | </template> |
| | | </u-form-item> |
| | | <u-form-item label="夿³¨" |
| | | prop="remark" |
| | | border-bottom> |
| | | <u-textarea v-model="form.remark" |
| | | 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">{{ 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="typeSheetVisible" |
| | | :actions="typeOptions" |
| | | @select="handleTypeSelect" |
| | | title="éæ©è§ç¨èµè´¨ç±»å" /> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // æ¿æ¢ toast æ¹æ³ |
| | | defineOptions({ name: "safe-qualifications-detail" }); |
| | | const showToast = message => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: "none", |
| | | }); |
| | | }; |
| | | |
| | | import { ref, onMounted } from "vue"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import { |
| | | safeCertificationAdd, |
| | | safeCertificationUpdate, |
| | | } from "@/api/safeProduction/safeQualifications"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { useDict } from "@/utils/dict"; |
| | | import dayjs from "dayjs"; |
| | | import { onLoad } from "@dcloudio/uni-app"; |
| | | |
| | | // è·åè§ç¨èµè´¨ç±»ååå
¸ |
| | | const { type_qualification } = useDict("type_qualification"); |
| | | |
| | | const userStore = useUserStore(); |
| | | |
| | | // è¡¨åæ°æ® |
| | | const form = ref({ |
| | | name: "", |
| | | code: "", |
| | | type: "", |
| | | version: "", |
| | | remark: "", |
| | | effectiveTime: "", |
| | | }); |
| | | |
| | | // 页é¢ç¶æ |
| | | const loading = ref(false); |
| | | const formRef = ref(null); |
| | | const isEdit = ref(false); |
| | | |
| | | // æ¶é´ç¸å
³ |
| | | const currentTime = ref(Date.now()); |
| | | const showTime = ref(false); |
| | | |
| | | // è§ç¨èµè´¨ç±»åéæ©å¨ |
| | | const typeSheetVisible = ref(false); |
| | | const showTypeSheet = () => { |
| | | typeSheetVisible.value = true; |
| | | }; |
| | | const typeName = ref(""); |
| | | const handleTypeSelect = item => { |
| | | form.value.type = item.value; |
| | | typeName.value = item.name; |
| | | typeSheetVisible.value = false; |
| | | }; |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | // è¿åæ¶æ¸
餿¬å°åå¨çæ°æ® |
| | | uni.removeStorageSync("safeQualifications"); |
| | | uni.navigateBack(); |
| | | }; |
| | | |
| | | // æ¾ç¤ºæ¶é´éæ©å¨ |
| | | const showTimePicker = () => { |
| | | showTime.value = true; |
| | | }; |
| | | |
| | | // 确认æ¶é´éæ© |
| | | const onTimeConfirm = e => { |
| | | form.value.effectiveTime = dayjs(e.value).format("YYYY-MM-DD"); |
| | | currentTime.value = e.value; |
| | | showTime.value = false; |
| | | }; |
| | | |
| | | // æäº¤è¡¨å |
| | | const handleSubmit = async () => { |
| | | if (!form.value.name) { |
| | | showToast("请è¾å
¥è§ç¨èµè´¨åç§°"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.code) { |
| | | showToast("请è¾å
¥è§ç¨èµè´¨ç¼å·"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.type) { |
| | | showToast("请è¾å
¥è§ç¨èµè´¨ç±»å"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.version) { |
| | | showToast("请è¾å
¥çæ¬å·"); |
| | | return; |
| | | } |
| | | |
| | | if (!form.value.effectiveTime) { |
| | | 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 safeCertificationUpdate(submitData); |
| | | if (code === 200) { |
| | | showToast("ä¿®æ¹æå"); |
| | | setTimeout(() => { |
| | | goBack(); |
| | | }, 500); |
| | | } else { |
| | | loading.value = false; |
| | | showToast("ä¿®æ¹å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | } else { |
| | | const { code } = await safeCertificationAdd(submitData); |
| | | if (code === 200) { |
| | | showToast("æ°å¢æå"); |
| | | setTimeout(() => { |
| | | goBack(); |
| | | }, 500); |
| | | } else { |
| | | loading.value = false; |
| | | showToast("æ°å¢å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | } |
| | | } catch (e) { |
| | | loading.value = false; |
| | | console.error("æäº¤å¤±è´¥:", e); |
| | | showToast("æäº¤å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | }; |
| | | |
| | | onLoad(() => { |
| | | // ç¼è¾è§ç¨èµè´¨æ¶ï¼ä»æ¬å°åå¨è·åæ°æ® |
| | | const qualification = uni.getStorageSync("safeQualifications"); |
| | | if (qualification) { |
| | | form.value = qualification; |
| | | isEdit.value = true; |
| | | |
| | | console.log("form.value", form.value); |
| | | } else { |
| | | isEdit.value = false; |
| | | } |
| | | }); |
| | | |
| | | // åå§å页颿°æ® |
| | | const initPageData = () => { |
| | | // 设置é»è®¤æææä¸ºå½åæ¶é´ |
| | | if (!isEdit.value) { |
| | | form.value.effectiveTime = dayjs().format("YYYY-MM-DD"); |
| | | currentTime.value = Date.now(); |
| | | } |
| | | }; |
| | | const typeOptions = ref([]); |
| | | onMounted(() => { |
| | | initPageData(); |
| | | typeOptions.value = type_qualification.value.map(item => ({ |
| | | value: item.value, |
| | | name: item.label, |
| | | })); |
| | | if (form.value.type) { |
| | | typeName.value = |
| | | typeOptions.value.find(item => item.value == form.value.type)?.name || ""; |
| | | } |
| | | }); |
| | | </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.name }}</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.code || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">è§ç¨èµè´¨ç±»å</text> |
| | | <text class="detail-value">{{ type_qualification.find(itemItem => itemItem.value === item.type)?.label || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">çæ¬å·</text> |
| | | <text class="detail-value">{{ item.version || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">夿³¨</text> |
| | | <text class="detail-value">{{ item.remark || '-' }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">æææ</text> |
| | | <text class="detail-value">{{ item.effectiveTime || '-' }}</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" |
| | | @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 { delCustomer } from "@/api/cooperativeOffice/clientVisit"; |
| | | import { |
| | | qualificationsListPage, |
| | | safeCertificationAdd, |
| | | safeCertificationUpdate, |
| | | safeCertificationDel, |
| | | fileListPage, |
| | | safeCertificationFileAdd, |
| | | safeCertificationFileDel, |
| | | } from "@/api/safeProduction/safeQualifications"; |
| | | |
| | | 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", |
| | | }); |
| | | }; |
| | | |
| | | import dayjs from "dayjs"; |
| | | |
| | | const userStore = useUserStore(); |
| | | |
| | | // æç´¢å
³é®è¯ |
| | | const customerName = ref(""); |
| | | |
| | | // æè®¿è®°å½æ°æ® |
| | | const visitList = ref([]); |
| | | const { type_qualification } = useDict("type_qualification"); |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | uni.navigateBack(); |
| | | }; |
| | | |
| | | // æ¥è¯¢å表 |
| | | const getList = () => { |
| | | showLoadingToast("å è½½ä¸..."); |
| | | const params = { |
| | | current: -1, |
| | | size: -1, |
| | | name: customerName.value, |
| | | }; |
| | | qualificationsListPage(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("safeQualifications", {}); |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/safeQualifications/detail", |
| | | }); |
| | | }; |
| | | // ç¼è¾è§ç¨èµè´¨ |
| | | const editVisit = item => { |
| | | uni.setStorageSync("safeQualifications", item); |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/safeQualifications/detail", |
| | | }); |
| | | }; |
| | | // å é¤è§ç¨èµè´¨ |
| | | const deleteVisit = item => { |
| | | uni.showModal({ |
| | | title: "å é¤ç¡®è®¤", |
| | | content: `ç¡®å®è¦å é¤è¯¥è§ç¨èµè´¨åï¼`, |
| | | success: res => { |
| | | if (res.confirm) { |
| | | deleteClientVisit(item.id); |
| | | } |
| | | }, |
| | | }); |
| | | }; |
| | | // å é¤è§ç¨èµè´¨è®°å½ |
| | | const deleteClientVisit = id => { |
| | | showLoadingToast("å é¤ä¸..."); |
| | | safeCertificationDel([id]) |
| | | .then(() => { |
| | | closeToast(); |
| | | showToast("å 餿å"); |
| | | getList(); |
| | | }) |
| | | .catch(() => { |
| | | closeToast(); |
| | | showToast("å é¤å¤±è´¥"); |
| | | }); |
| | | }; |
| | | // æ¥ç详æ
|
| | | const viewDetail = item => { |
| | | uni.setStorageSync("safeQualifications", item); |
| | | uni.navigateTo({ |
| | | url: "/pages/safeProduction/safeQualifications/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> |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="safe-qualifications-detail"> |
| | | <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.name || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">è§ç¨èµè´¨ç¼å·</text> |
| | | <text class="info-value">{{ form.code || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">è§ç¨èµè´¨ç±»å</text> |
| | | <text class="info-value">{{ type_qualification.find(item => item.value === form.type)?.label || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">çæ¬å·</text> |
| | | <text class="info-value">{{ form.version || '-' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="info-label">æææ</text> |
| | | <text class="info-value">{{ form.effectiveTime || '-' }}</text> |
| | | </view> |
| | | </view> |
| | | <!-- 夿³¨ä¿¡æ¯ --> |
| | | <view class="section"> |
| | | <view class="section-title">夿³¨ä¿¡æ¯</view> |
| | | <view class="info-item remark-item"> |
| | | <text class="info-label">夿³¨</text> |
| | | <text class="info-value multi-line">{{ form.remark || '-' }}</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 { useDict } from "@/utils/dict"; |
| | | |
| | | const userStore = useUserStore(); |
| | | |
| | | // è§ç¨èµè´¨ç±»ååå
¸ |
| | | const { type_qualification } = useDict("type_qualification"); |
| | | |
| | | // è¡¨åæ°æ® |
| | | const form = ref({ |
| | | name: "", |
| | | code: "", |
| | | type: "", |
| | | version: "", |
| | | remark: "", |
| | | effectiveTime: "", |
| | | }); |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | // è¿åæ¶æ¸
餿¬å°åå¨çæ°æ® |
| | | uni.removeStorageSync("safeQualifications"); |
| | | uni.navigateBack(); |
| | | }; |
| | | |
| | | // åå§å页颿°æ® |
| | | const initPageData = () => { |
| | | // 仿¬å°åå¨è·åè§ç¨èµè´¨è¯¦æ
|
| | | const row = uni.getStorageSync("safeQualifications"); |
| | | if (row) { |
| | | form.value = { ...row }; |
| | | } else { |
| | | showToast("ææ è§ç¨èµè´¨æ°æ®"); |
| | | } |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | initPageData(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import "@/static/scss/form-common.scss"; |
| | | |
| | | .client-visit-detail { |
| | | 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> |