| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="work-order-page"> |
| | | <!-- 页é¢å¤´é¨ --> |
| | | <PageHeader title="ç产æ¥å·¥" /> |
| | | <!-- æç´¢åºå --> |
| | | <view class="search-section"> |
| | | <view class="search-bar"> |
| | | <view class="search-input"> |
| | | <up-input class="search-text" |
| | | placeholder="请è¾å
¥å·¥åç¼å·" |
| | | v-model="searchForm.workOrderNo" |
| | | @change="handleQuery" |
| | | clearable /> |
| | | </view> |
| | | <view class="filter-button" |
| | | @click="handleQuery"> |
| | | <u-icon name="search" |
| | | size="24" |
| | | color="#999"></u-icon> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <!-- å·¥åå表 --> |
| | | <view v-if="tableData.length > 0" |
| | | class="work-order-list"> |
| | | <view v-for="(item, index) in tableData" |
| | | :key="index" |
| | | class="work-order-item"> |
| | | <view class="item-header"> |
| | | <view class="item-title"> |
| | | <text class="work-order-no">{{ item.workOrderNo || 'æ ç¼å·' }}</text> |
| | | <up-tag :type="getWorkOrderTypeTag(item.workOrderType)" |
| | | size="small" |
| | | class="type-tag"> |
| | | {{ item.workOrderType || 'æªç¥' }} |
| | | </up-tag> |
| | | </view> |
| | | <up-tag :type="getCompletionStatusTag(item.completionStatus)" |
| | | size="small"> |
| | | {{ getCompletionStatusText(item.completionStatus) }} |
| | | </up-tag> |
| | | </view> |
| | | <view class="item-content"> |
| | | <view class="content-row"> |
| | | <text class="label">产ååç§°ï¼</text> |
| | | <text class="value">{{ item.productName || '-' }}</text> |
| | | </view> |
| | | <view class="content-row"> |
| | | <text class="label">è§æ ¼ï¼</text> |
| | | <text class="value">{{ item.model || '-' }}</text> |
| | | </view> |
| | | <view class="content-row"> |
| | | <text class="label">åä½ï¼</text> |
| | | <text class="value">{{ item.unit || '-' }}</text> |
| | | </view> |
| | | <view class="content-row"> |
| | | <text class="label">å·¥åºåç§°ï¼</text> |
| | | <text class="value">{{ item.processName || '-' }}</text> |
| | | </view> |
| | | <view class="content-row"> |
| | | <text class="label">éæ±æ°éï¼</text> |
| | | <text class="value">{{ item.planQuantity || 0 }}</text> |
| | | </view> |
| | | <view class="content-row"> |
| | | <text class="label">宿æ°éï¼</text> |
| | | <text class="value">{{ item.completeQuantity || 0 }}</text> |
| | | </view> |
| | | <view class="content-row"> |
| | | <text class="label">宿è¿åº¦ï¼</text> |
| | | <view class="progress-container"> |
| | | <!-- <up-progress :percentage="toProgressPercentage(item.completionStatus)" |
| | | :color="progressColor(toProgressPercentage(item.completionStatus))" |
| | | :active-color="progressColor(toProgressPercentage(item.completionStatus))" |
| | | :height="6" |
| | | :show-percentage="false" |
| | | class="progress-bar" /> --> |
| | | <text class="progress-text">{{ toProgressPercentage(item.completionStatus) }}%</text> |
| | | </view> |
| | | </view> |
| | | <view class="content-row"> |
| | | <text class="label">è®¡åæ¶é´ï¼</text> |
| | | <text class="value">{{ formatDate(item.planStartTime) }} è³ {{ formatDate(item.planEndTime) }}</text> |
| | | </view> |
| | | <view v-if="item.actualStartTime" |
| | | class="content-row"> |
| | | <text class="label">å®é
æ¶é´ï¼</text> |
| | | <text class="value">{{ formatDate(item.actualStartTime) }} è³ {{ formatDate(item.actualEndTime) }}</text> |
| | | </view> |
| | | </view> |
| | | <view class="item-footer"> |
| | | <u-button size="small" |
| | | @click="handleEdit(item)"> |
| | | ç¼è¾ |
| | | </u-button> |
| | | <u-button size="small" |
| | | @click="viewFileList(item)"> |
| | | éä»¶ |
| | | </u-button> |
| | | <u-button type="primary" |
| | | size="small" |
| | | :disabled="item.planQuantity <= 0" |
| | | @click="showReportDialog(item)"> |
| | | æ¥å·¥ |
| | | </u-button> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <!-- ç©ºç¶æ --> |
| | | <view v-else |
| | | class="no-data"> |
| | | <up-empty mode="data" |
| | | text="ææ å·¥åæ°æ®" /> |
| | | </view> |
| | | <!-- å页ç»ä»¶ --> |
| | | <!-- ç¼è¾æ¶é´å¼¹çª --> |
| | | <up-popup v-model:show="editDialogVisible" |
| | | mode="center" |
| | | round> |
| | | <view class="dialog-content"> |
| | | <view class="dialog-header"> |
| | | <text class="dialog-title">ç¼è¾æ¶é´</text> |
| | | <up-icon name="close" |
| | | size="20" |
| | | color="#999" |
| | | @click="editDialogVisible = false" /> |
| | | </view> |
| | | <view class="dialog-body"> |
| | | <view class="form-item"> |
| | | <text class="form-label">计åå¼å§æ¶é´</text> |
| | | <view class="fake-input-wrapper" |
| | | @click="showDatePicker('planStartTime',editrow.planStartTime)"> |
| | | <text class="fake-input-text" |
| | | :class="{ 'placeholder': !editrow.planStartTime }"> |
| | | {{ editrow.planStartTime || 'è¯·éæ©è®¡åå¼å§æ¶é´' }} |
| | | </text> |
| | | <up-icon name="calendar" |
| | | size="20" |
| | | color="#999" /> |
| | | </view> |
| | | </view> |
| | | <view class="form-item"> |
| | | <text class="form-label">计åç»ææ¶é´</text> |
| | | <view class="fake-input-wrapper" |
| | | @click="showDatePicker('planEndTime',editrow.planEndTime)"> |
| | | <text class="fake-input-text" |
| | | :class="{ 'placeholder': !editrow.planEndTime }"> |
| | | {{ editrow.planEndTime || 'è¯·éæ©è®¡åç»ææ¶é´' }} |
| | | </text> |
| | | <up-icon name="calendar" |
| | | size="20" |
| | | color="#999" /> |
| | | </view> |
| | | </view> |
| | | <view class="form-item"> |
| | | <text class="form-label">å®é
å¼å§æ¶é´</text> |
| | | <view class="fake-input-wrapper" |
| | | @click="showDatePicker('actualStartTime',editrow.actualStartTime)"> |
| | | <text class="fake-input-text" |
| | | :class="{ 'placeholder': !editrow.actualStartTime }"> |
| | | {{ editrow.actualStartTime || 'è¯·éæ©å®é
å¼å§æ¶é´' }} |
| | | </text> |
| | | <up-icon name="calendar" |
| | | size="20" |
| | | color="#999" /> |
| | | </view> |
| | | </view> |
| | | <view class="form-item"> |
| | | <text class="form-label">å®é
ç»ææ¶é´</text> |
| | | <view class="fake-input-wrapper" |
| | | @click="showDatePicker('actualEndTime',editrow.actualEndTime)"> |
| | | <text class="fake-input-text" |
| | | :class="{ 'placeholder': !editrow.actualEndTime }"> |
| | | {{ editrow.actualEndTime || 'è¯·éæ©å®é
ç»ææ¶é´' }} |
| | | </text> |
| | | <up-icon name="calendar" |
| | | size="20" |
| | | color="#999" /> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view class="dialog-footer"> |
| | | <u-button type="default" |
| | | class="footer-btn" |
| | | @click="editDialogVisible = false"> |
| | | åæ¶ |
| | | </u-button> |
| | | <u-button type="primary" |
| | | class="footer-btn" |
| | | @click="handleUpdate"> |
| | | ç¡®å® |
| | | </u-button> |
| | | </view> |
| | | </view> |
| | | </up-popup> |
| | | <!-- æ¥å·¥å¼¹çª --> |
| | | <up-popup v-model:show="reportDialogVisible" |
| | | mode="center" |
| | | round |
| | | style="width: 500px"> |
| | | <view class="dialog-content"> |
| | | <view class="dialog-header"> |
| | | <text class="dialog-title">æ¥å·¥</text> |
| | | <up-icon name="close" |
| | | size="20" |
| | | color="#999" |
| | | @click="reportDialogVisible = false" /> |
| | | </view> |
| | | <view class="dialog-body"> |
| | | <view class="form-item"> |
| | | <text class="form-label">å¾
ç产æ°é</text> |
| | | <up-input v-model="reportForm.planQuantity" |
| | | disabled |
| | | readonly /> |
| | | </view> |
| | | <view class="form-item"> |
| | | <text class="form-label required">æ¬æ¬¡ç产æ°é</text> |
| | | <up-input v-model.number="reportForm.quantity" |
| | | type="number" |
| | | placeholder="请è¾å
¥æ¬æ¬¡ç产æ°é" /> |
| | | </view> |
| | | <view class="form-item"> |
| | | <text class="form-label">æ¥åºæ°é</text> |
| | | <up-input v-model.number="reportForm.scrapQty" |
| | | type="number" |
| | | placeholder="请è¾å
¥æ¥åºæ°é" /> |
| | | </view> |
| | | <view class="form-item"> |
| | | <text class="form-label">çç»ä¿¡æ¯</text> |
| | | <view class="fake-input-wrapper" |
| | | @click="showUserSheet = true"> |
| | | <text class="fake-input-text" |
| | | :class="{ 'placeholder': !reportForm.userName }"> |
| | | {{ reportForm.userName || 'è¯·éæ©çç»ä¿¡æ¯' }} |
| | | </text> |
| | | <up-icon name="arrow-right" |
| | | size="20" |
| | | color="#999" /> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view class="dialog-footer"> |
| | | <u-button type="default" |
| | | class="footer-btn" |
| | | @click="reportDialogVisible = false"> |
| | | åæ¶ |
| | | </u-button> |
| | | <u-button type="primary" |
| | | class="footer-btn" |
| | | @click="handleReport"> |
| | | ç¡®å® |
| | | </u-button> |
| | | </view> |
| | | </view> |
| | | </up-popup> |
| | | <!-- æ¥æéæ©å¨ --> |
| | | <!-- <up-popup v-model:show="showDate" |
| | | mode="date" |
| | | :start-year="2020" |
| | | :end-year="2030" |
| | | @close="showDate = false" |
| | | @confirm="confirmDate" /> --> |
| | | <u-datetime-picker :show="showDate" |
| | | v-model="value1" |
| | | @close="showDate = false" |
| | | @confirm="confirmDate" |
| | | @cancel="showDate = false" |
| | | mode="date" |
| | | format="YYYY-MM-DD"></u-datetime-picker> |
| | | <!-- çç»éæ© --> |
| | | <up-action-sheet :show="showUserSheet" |
| | | :actions="userSheetOptions" |
| | | @select="selectUser" |
| | | @close="showUserSheet = false" |
| | | title="éæ©çç»ä¿¡æ¯" /> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, onMounted, computed } from "vue"; |
| | | import { onShow } from "@dcloudio/uni-app"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import dayjs from "dayjs"; |
| | | import { |
| | | productWorkOrderPage, |
| | | updateProductWorkOrder, |
| | | addProductMain, |
| | | } from "@/api/productionManagement/workOrder.js"; |
| | | import { getUserProfile, userListNoPageByTenantId } from "@/api/system/user.js"; |
| | | |
| | | // æ¾ç¤ºæç¤ºä¿¡æ¯ |
| | | const showToast = message => { |
| | | uni.showToast({ |
| | | title: message, |
| | | icon: "none", |
| | | }); |
| | | }; |
| | | |
| | | // æç´¢è¡¨å |
| | | const searchForm = ref({ |
| | | workOrderNo: "", |
| | | }); |
| | | |
| | | // å·¥ååè¡¨æ°æ® |
| | | const tableData = ref([]); |
| | | const tableLoading = ref(false); |
| | | const value1 = ref(new Date()); |
| | | // åé¡µæ°æ® |
| | | const page = reactive({ |
| | | current: -1, |
| | | size: -1, |
| | | total: 0, |
| | | }); |
| | | |
| | | // ç¼è¾å¼¹çª |
| | | const editDialogVisible = ref(false); |
| | | const editrow = ref(null); |
| | | |
| | | // æ¥å·¥å¼¹çª |
| | | const reportDialogVisible = ref(false); |
| | | const reportForm = reactive({ |
| | | planQuantity: 0, |
| | | quantity: 0, |
| | | userName: "", |
| | | workOrderId: "", |
| | | reportWork: "", |
| | | productProcessRouteItemId: "", |
| | | userId: "", |
| | | productMainId: null, |
| | | scrapQty: 0, |
| | | }); |
| | | const currentReportRowData = ref(null); |
| | | |
| | | // æ¥æéæ©å¨ |
| | | const showDate = ref(false); |
| | | const currentDateField = ref(""); |
| | | |
| | | // çç»éæ© |
| | | const showUserSheet = ref(false); |
| | | const userOptions = ref([]); |
| | | const userSheetOptions = computed(() => { |
| | | return userOptions.value.map(user => ({ |
| | | name: user.nickName, |
| | | value: user.userId, |
| | | })); |
| | | }); |
| | | |
| | | // æ ¼å¼åæ¥æ |
| | | const formatDate = dateStr => { |
| | | if (!dateStr) return "-"; |
| | | return dayjs(dateStr).format("YYYY-MM-DD"); |
| | | }; |
| | | |
| | | // è¿åº¦ç¾åæ¯è½¬æ¢ |
| | | const toProgressPercentage = val => { |
| | | const n = Number(val); |
| | | if (!Number.isFinite(n)) return 0; |
| | | if (n <= 0) return 0; |
| | | if (n >= 100) return 100; |
| | | return Math.round(n); |
| | | }; |
| | | |
| | | // è¿åº¦æ¡é¢è² |
| | | const progressColor = percentage => { |
| | | const p = toProgressPercentage(percentage); |
| | | if (p < 30) return "#f56c6c"; |
| | | if (p < 50) return "#e6a23c"; |
| | | if (p < 80) return "#409eff"; |
| | | return "#67c23a"; |
| | | }; |
| | | |
| | | // è·åå·¥åç±»åæ ç¾ |
| | | const getWorkOrderTypeTag = type => { |
| | | switch (type) { |
| | | case "ç产工å": |
| | | return "success"; |
| | | case "维修工å": |
| | | return "warning"; |
| | | case "æ£éªå·¥å": |
| | | return "info"; |
| | | default: |
| | | return "info"; |
| | | } |
| | | }; |
| | | |
| | | // è·åå®æç¶ææ ç¾ |
| | | const getCompletionStatusTag = status => { |
| | | const percentage = toProgressPercentage(status); |
| | | if (percentage >= 100) return "success"; |
| | | if (percentage >= 50) return "warning"; |
| | | return "error"; |
| | | }; |
| | | |
| | | // è·åå®æç¶æææ¬ |
| | | const getCompletionStatusText = status => { |
| | | const percentage = toProgressPercentage(status); |
| | | if (percentage >= 100) return "已宿"; |
| | | return `${percentage}%`; |
| | | }; |
| | | |
| | | // æ¥è¯¢å表 |
| | | const handleQuery = () => { |
| | | page.current = -1; |
| | | getList(); |
| | | }; |
| | | |
| | | const getList = () => { |
| | | tableLoading.value = true; |
| | | const params = { ...searchForm.value, ...page }; |
| | | productWorkOrderPage(params) |
| | | .then(res => { |
| | | tableLoading.value = false; |
| | | tableData.value = res.data.records || []; |
| | | // tableData.value = [ |
| | | // { |
| | | // id: "WO20260304001", |
| | | // workOrderNo: "WO20260304001", |
| | | // workOrderType: "ç产工å", |
| | | // productName: "ä¸é颿¿æ", |
| | | // model: "304-2B", |
| | | // unit: "kg", |
| | | // processName: "åå²å·¥åº", |
| | | // planQuantity: 1000, |
| | | // completeQuantity: 650, |
| | | // completionStatus: 65, |
| | | // planStartTime: "2026-03-01", |
| | | // planEndTime: "2026-03-10", |
| | | // actualStartTime: "2026-03-02", |
| | | // actualEndTime: null, |
| | | // remark: "ç´§æ¥è®¢åï¼è¯·ä¼å
å¤ç", |
| | | // }, |
| | | // ]; |
| | | page.total = res.data.total || 0; |
| | | }) |
| | | .catch(() => { |
| | | tableLoading.value = false; |
| | | showToast("è·åå·¥åå表失败"); |
| | | }); |
| | | }; |
| | | |
| | | // ç¼è¾å·¥å |
| | | const handleEdit = row => { |
| | | editrow.value = JSON.parse(JSON.stringify(row)); |
| | | editDialogVisible.value = true; |
| | | }; |
| | | |
| | | // æ´æ°å·¥å |
| | | const handleUpdate = () => { |
| | | updateProductWorkOrder(editrow.value) |
| | | .then(res => { |
| | | showToast("ä¿®æ¹æå"); |
| | | editDialogVisible.value = false; |
| | | getList(); |
| | | }) |
| | | .catch(() => { |
| | | showToast("ä¿®æ¹å¤±è´¥"); |
| | | }); |
| | | }; |
| | | |
| | | // æ¾ç¤ºæ¥æéæ©å¨ |
| | | const showDatePicker = (field, defaultValue) => { |
| | | currentDateField.value = field; |
| | | // 设置é»è®¤å¼ |
| | | if (defaultValue) { |
| | | value1.value = dayjs(defaultValue); |
| | | } else { |
| | | value1.value = dayjs(); |
| | | } |
| | | showDate.value = true; |
| | | }; |
| | | |
| | | // ç¡®è®¤æ¥æéæ© |
| | | const confirmDate = e => { |
| | | if (currentDateField.value && editrow.value) { |
| | | // ç¡®ä¿æ¥ææ ¼å¼ä¸º YYYY-MM-DD |
| | | const formattedDate = dayjs(e.value).format("YYYY-MM-DD"); |
| | | editrow.value[currentDateField.value] = formattedDate; |
| | | } |
| | | showDate.value = false; |
| | | }; |
| | | |
| | | // æ¾ç¤ºæ¥å·¥å¼¹çª |
| | | const showReportDialog = row => { |
| | | currentReportRowData.value = row; |
| | | reportForm.planQuantity = row.planQuantity || 0; |
| | | reportForm.quantity = row.quantity || 0; |
| | | reportForm.productProcessRouteItemId = row.productProcessRouteItemId; |
| | | reportForm.workOrderId = row.id; |
| | | reportForm.reportWork = row.reportWork; |
| | | reportForm.productMainId = row.productMainId; |
| | | reportForm.scrapQty = row.scrapQty || 0; |
| | | |
| | | // è·åå½åç»å½ç¨æ·ä¿¡æ¯ï¼è®¾ç½®ä¸ºé»è®¤éä¸ |
| | | getUserProfile() |
| | | .then(res => { |
| | | if (res.code === 200) { |
| | | reportForm.userId = res.data.userId; |
| | | reportForm.userName = res.data.nickName; |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | console.error("è·åç¨æ·ä¿¡æ¯å¤±è´¥", err); |
| | | }); |
| | | |
| | | reportDialogVisible.value = true; |
| | | }; |
| | | |
| | | // å¤çæ¥å·¥ |
| | | const handleReport = () => { |
| | | if (reportForm.planQuantity <= 0) { |
| | | showToast("å¾
ç产æ°é为0ï¼æ æ³æ¥å·¥"); |
| | | return; |
| | | } |
| | | if (!reportForm.quantity || reportForm.quantity <= 0) { |
| | | showToast("请è¾å
¥ææçæ¬æ¬¡ç产æ°é"); |
| | | return; |
| | | } |
| | | if (reportForm.quantity > reportForm.planQuantity) { |
| | | showToast("æ¬æ¬¡ç产æ°éä¸è½è¶
è¿å¾
ç产æ°é"); |
| | | return; |
| | | } |
| | | |
| | | addProductMain(reportForm) |
| | | .then(res => { |
| | | if (res.code === 200) { |
| | | showToast("æ¥å·¥æå"); |
| | | reportDialogVisible.value = false; |
| | | getList(); |
| | | } else { |
| | | showToast(res.msg || "æ¥å·¥å¤±è´¥"); |
| | | } |
| | | }) |
| | | .catch(() => { |
| | | showToast("æ¥å·¥å¤±è´¥"); |
| | | }); |
| | | }; |
| | | |
| | | const viewFileList = item => { |
| | | uni.setStorageSync("workOrderFileId", item.id); |
| | | uni.navigateTo({ |
| | | url: "/pages/productionManagement/workOrder/fileList", |
| | | }); |
| | | }; |
| | | |
| | | // è·åç¨æ·å表 |
| | | const getUserList = () => { |
| | | userListNoPageByTenantId() |
| | | .then(res => { |
| | | if (res.code === 200) { |
| | | userOptions.value = res.data || []; |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | console.error("è·åç¨æ·å表失败", err); |
| | | }); |
| | | }; |
| | | |
| | | // éæ©ç¨æ· |
| | | const selectUser = e => { |
| | | reportForm.userId = e.value; |
| | | const selectedUser = userOptions.value.find(user => user.userId === e.value); |
| | | if (selectedUser) { |
| | | reportForm.userName = selectedUser.nickName; |
| | | } |
| | | showUserSheet.value = false; |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | getList(); |
| | | getUserList(); |
| | | }); |
| | | |
| | | onShow(() => { |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | @import "../../../styles/sales-common.scss"; |
| | | |
| | | .work-order-page { |
| | | min-height: 100vh; |
| | | background-color: #f5f5f5; |
| | | } |
| | | |
| | | // æç´¢åºå |
| | | .search-container { |
| | | padding: 16px; |
| | | background-color: #ffffff; |
| | | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); |
| | | } |
| | | |
| | | .search-box { |
| | | display: flex; |
| | | gap: 12px; |
| | | align-items: center; |
| | | } |
| | | |
| | | .search-box :deep(.up-input) { |
| | | flex: 1; |
| | | } |
| | | |
| | | // å·¥åå表 |
| | | .work-order-list { |
| | | padding: 16px; |
| | | } |
| | | |
| | | .work-order-item { |
| | | background: #ffffff; |
| | | border-radius: 12px; |
| | | margin-bottom: 16px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .item-header { |
| | | padding: 16px; |
| | | border-bottom: 1px solid #f0f0f0; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | } |
| | | |
| | | .item-title { |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 8px; |
| | | } |
| | | |
| | | .work-order-no { |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | color: #303133; |
| | | } |
| | | |
| | | .type-tag { |
| | | margin-left: 8px; |
| | | } |
| | | |
| | | .item-content { |
| | | padding: 16px; |
| | | } |
| | | |
| | | .content-row { |
| | | display: flex; |
| | | margin-bottom: 12px; |
| | | align-items: flex-start; |
| | | } |
| | | |
| | | .content-row:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | |
| | | .label { |
| | | width: 90px; |
| | | font-size: 14px; |
| | | color: #606266; |
| | | } |
| | | |
| | | .value { |
| | | flex: 1; |
| | | font-size: 14px; |
| | | color: #303133; |
| | | } |
| | | |
| | | .progress-container { |
| | | flex: 1; |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 8px; |
| | | } |
| | | |
| | | .progress-bar { |
| | | flex: 1; |
| | | } |
| | | |
| | | .progress-text { |
| | | font-size: 12px; |
| | | color: #606266; |
| | | min-width: 40px; |
| | | } |
| | | |
| | | .item-footer { |
| | | padding: 16px; |
| | | border-top: 1px solid #f0f0f0; |
| | | display: flex; |
| | | gap: 12px; |
| | | justify-content: flex-end; |
| | | } |
| | | |
| | | // ç©ºç¶æ |
| | | .no-data { |
| | | padding: 60px 20px; |
| | | text-align: center; |
| | | } |
| | | |
| | | // å页ç»ä»¶ |
| | | .pagination { |
| | | padding: 20px; |
| | | background: #fff; |
| | | margin-top: 10px; |
| | | display: flex; |
| | | justify-content: center; |
| | | } |
| | | |
| | | // å¼¹çªæ ·å¼ |
| | | .dialog-content { |
| | | padding: 24px; |
| | | background: #ffffff; |
| | | border-radius: 12px; |
| | | width: 90vw; |
| | | } |
| | | |
| | | .dialog-header { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 24px; |
| | | padding-bottom: 16px; |
| | | border-bottom: 1px solid #f0f0f0; |
| | | } |
| | | |
| | | .dialog-title { |
| | | font-size: 18px; |
| | | font-weight: 600; |
| | | color: #303133; |
| | | } |
| | | |
| | | .dialog-body { |
| | | margin-bottom: 24px; |
| | | } |
| | | |
| | | .form-item { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .form-label { |
| | | display: block; |
| | | font-size: 14px; |
| | | color: #606266; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | .form-label.required::before { |
| | | content: "*"; |
| | | color: #f56c6c; |
| | | margin-right: 4px; |
| | | } |
| | | |
| | | .dialog-body :deep(.up-input) { |
| | | width: 100%; |
| | | } |
| | | |
| | | .fake-input-wrapper { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | height: 44px; |
| | | padding: 0 12px; |
| | | // background-color: #f5f7fa; |
| | | border: 1px solid #dcdfe6; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .fake-input-text { |
| | | font-size: 14px; |
| | | color: #303133; |
| | | } |
| | | |
| | | .fake-input-text.placeholder { |
| | | color: #c0c4cc; |
| | | } |
| | | |
| | | .dialog-footer { |
| | | display: flex; |
| | | gap: 16px; |
| | | padding-top: 16px; |
| | | border-top: 1px solid #f0f0f0; |
| | | } |
| | | |
| | | .footer-btn { |
| | | flex: 1; |
| | | height: 44px; |
| | | } |
| | | </style> |