| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from "@/utils/request"; |
| | | |
| | | export function getDeviceAreaTree(params) { |
| | | return request({ |
| | | url: "/device/area/tree", |
| | | method: "get", |
| | | params, |
| | | }); |
| | | } |
| | | |
| | | export function getDeviceAreaTreeWithDevices(params) { |
| | | return request({ |
| | | url: "/device/area/treeWithDevices", |
| | | method: "get", |
| | | }); |
| | | } |
| | | |
| | | export function getDeviceAreaPage(params) { |
| | | return request({ |
| | | url: "/device/area/page", |
| | | method: "get", |
| | | params, |
| | | }); |
| | | } |
| | | |
| | | export function getDeviceAreaDetail(id) { |
| | | return request({ |
| | | url: `/device/area/${id}`, |
| | | method: "get", |
| | | }); |
| | | } |
| | | |
| | | export function addDeviceArea(data) { |
| | | return request({ |
| | | url: "/device/area", |
| | | method: "post", |
| | | data, |
| | | }); |
| | | } |
| | | |
| | | export function updateDeviceArea(data) { |
| | | return request({ |
| | | url: "/device/area", |
| | | method: "put", |
| | | data, |
| | | }); |
| | | } |
| | | |
| | | export function deleteDeviceArea(ids) { |
| | | return request({ |
| | | url: "/device/area", |
| | | method: "delete", |
| | | data: ids, |
| | | }); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from "@/utils/request"; |
| | | |
| | | export const getEnvironmentalRealData = () => { |
| | | return request({ |
| | | url: "/iot/getRealData", |
| | | method: "get", |
| | | }); |
| | | }; |
| | |
| | | // éè´å°è´¦é¡µé¢æ¥å£ |
| | | import request from "@/utils/request"; |
| | | |
| | | // å页æ¥è¯¢ |
| | | /** 仿¬¾å°è´¦ - ä¾åºå徿¥æ±æ» */ |
| | | export function paymentLedgerList(query) { |
| | | return request({ |
| | | url: "/purchase/paymentRegistration/supplierNameListPage", |
| | | url: "/purchase/report/supplierTransactions", |
| | | method: "get", |
| | | params: query, |
| | | }); |
| | | } |
| | | |
| | | // å页æ¥è¯¢ |
| | | export function paymentRecordList(supplierId) { |
| | | /** 仿¬¾å°è´¦ - ä¾åºå徿¥æç» */ |
| | | export function paymentRecordList(params) { |
| | | return request({ |
| | | url: "/purchase/paymentRegistration/supplierNameListPageDetails", |
| | | url: "/purchase/report/supplierTransactionsDetails", |
| | | method: "get", |
| | | params: supplierId, |
| | | params, |
| | | }); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // åè´§å°è´¦é¡µé¢æ¥å£ |
| | | import request from "@/utils/request"; |
| | | |
| | | // å页æ¥è¯¢åè´§å°è´¦ï¼æ ¹æ®å®¢æ·IDï¼ |
| | | export function deliveryLedgerListPage(query) { |
| | | return request({ |
| | | url: "/shippingInfo/listPage", |
| | | method: "get", |
| | | params: query, |
| | | }); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | // ææ ç»è®¡é¡µé¢æ¥å£ |
| | | import request from "@/utils/request"; |
| | | |
| | | // 头é¨ç»è®¡æ¥å£ |
| | | export function getTotalStatistics(query) { |
| | | return request({ |
| | | url: "/metricStatistics/total", |
| | | method: "get", |
| | | params: query, |
| | | }); |
| | | } |
| | | |
| | | // æ±ç¶å¾æ°æ®æ¥å£ |
| | | export function getStatisticsTable(query) { |
| | | return request({ |
| | | url: "/metricStatistics/statisticsTable", |
| | | method: "get", |
| | | params: query, |
| | | }); |
| | | } |
| | | |
| | | // 客æ·å¾æ¥å表 |
| | | export function customewTransactions(query) { |
| | | return request({ |
| | | url: "/metricStatistics/customewTransactions", |
| | | method: "get", |
| | | params: query, |
| | | }); |
| | | } |
| | | |
| | | // 客æ·å¾æ¥æç» |
| | | export function customewTransactionsDetails(query) { |
| | | return request({ |
| | | url: "/metricStatistics/customewTransactionsDetails", |
| | | method: "get", |
| | | params: query, |
| | | }); |
| | | } |
| | |
| | | import { OA_NAV } from "./oaPaths.js"; |
| | | |
| | | /** |
| | | * OA 模ååç»ï¼å·¥ä½å°å±ç¤º / ææ¡£å¯¹ç
§ï¼ |
| | | * 注ï¼äººäºç®¡ç/åå¤ç®¡ç/æ¥é管ç/审æ¹ç®¡ç å·²è¿ç§»è³å¯¹åºä¸å¡æ¨¡å |
| | | */ |
| | | export const OA_MODULES = [ |
| | | { |
| | | key: "HrManage", |
| | | name: "人äºç®¡ç", |
| | | children: [ |
| | | // { label: "å工档æ¡", icon: "/static/images/icon/renyuanxinzi.svg", path: OA_NAV.staffArchive }, |
| | | // { label: "åå·¥åå", icon: "/static/images/icon/hetongguanli.svg", path: OA_NAV.staffContract }, |
| | | { label: "转æ£ç³è¯·", icon: "/static/images/icon/hetongguanli.svg", path: OA_NAV.regularApply }, |
| | | { label: "è°å²ç³è¯·", icon: "/static/images/icon/renyuanxinzi.svg", path: OA_NAV.transferApply }, |
| | | // { label: "离èç³è¯·", icon: "/static/images/icon/qingjiaguanli.svg", path: OA_NAV.resignApply }, |
| | | { label: "å·¥ä½äº¤æ¥", icon: "/static/images/icon/gongchuguanli.svg", path: OA_NAV.workHandover }, |
| | | // { label: "å²ä½ç®¡ç", icon: "/static/images/icon/gongxuguanli.svg", path: OA_NAV.postManage }, |
| | | ], |
| | | }, |
| | | { |
| | | key: "AttendManage", |
| | | name: "åå¤ç®¡ç", |
| | | children: [ |
| | | { label: "请åç³è¯·", icon: "/static/images/icon/qingjiaguanli.svg", path: OA_NAV.leaveApply }, |
| | | { label: "å çç³è¯·", icon: "/static/images/icon/dakaqiandao.svg", path: OA_NAV.overtimeApply }, |
| | | ], |
| | | }, |
| | | { |
| | | key: "ReimburseManage", |
| | | name: "æ¥é管ç", |
| | | children: [ |
| | | { label: "å·®æ
æ¥é", icon: "/static/images/icon/chuchaiguanli.svg", path: OA_NAV.travelReimburse }, |
| | | { label: "è´¹ç¨æ¥é", icon: "/static/images/icon/baoxiaoguanli.svg", path: OA_NAV.costReimburse }, |
| | | ], |
| | | }, |
| | | // { |
| | | // key: "ContractManage", |
| | | // name: "åå管ç", |
| | | // children: [ |
| | | // { label: "éè´åå", icon: "/static/images/icon/caigoutaizhang.svg", path: OA_NAV.purchaseContract }, |
| | | // { label: "éå®åå", icon: "/static/images/icon/xiaoshoutaizhang.svg", path: OA_NAV.saleContract }, |
| | | // ], |
| | | // }, |
| | | { |
| | | key: "ApproveManage", |
| | | name: "审æ¹ç®¡ç", |
| | | children: [ |
| | | { label: "审æ¹å表", icon: "/static/images/icon/xietongshenpi.svg", path: OA_NAV.approveList }, |
| | | { label: "å®¡æ¹æ¨¡æ¿", icon: "/static/images/icon/guizhangzhidu.svg", path: OA_NAV.approveTemplate }, |
| | | ], |
| | | }, |
| | | // { |
| | | // key: "EnterpriseNews", |
| | | // name: "ä¼ä¸æ°é»", |
| | | // children: [ |
| | | // { label: "ä¼ä¸æ°é»", icon: "/static/images/icon/zhishiku.svg", path: OA_NAV.enterpriseNews }, |
| | | // ], |
| | | // }, |
| | | // { |
| | | // key: "NoticeAnnouncement", |
| | | // name: "å
¬åéç¥", |
| | | // children: [ |
| | | // { label: "å
¬åéç¥", icon: "/static/images/icon/tongzhigonggao.svg", path: OA_NAV.noticeAnnouncement }, |
| | | // ], |
| | | // }, |
| | | ]; |
| | | export const OA_MODULES = []; |
| | | |
| | | /** å·¥ä½å°æå¹³èåï¼çº¯å端é
ç½®ï¼ */ |
| | | export const OA_WORKBENCH_ITEMS = OA_MODULES.flatMap(module => |
| | |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/inventoryManagement/environmentalMonitoring/index", |
| | | "style": { |
| | | "navigationBarTitleText": "ç¯å¢æ£æµ", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| | | { |
| | | "path": "pages/safeProduction/safeQualifications/index", |
| | | "style": { |
| | | "navigationBarTitleText": "è§ç¨ä¸èµè´¨", |
| | |
| | | { |
| | | "path": "pages/qualityManagement/materialInspection/index", |
| | | "style": { |
| | | "navigationBarTitleText": "åæææ£éª", |
| | | "navigationBarTitleText": "åææ£éª", |
| | | "navigationStyle": "custom" |
| | | } |
| | | }, |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <view class="environment-page"> |
| | | <PageHeader title="ç¯å¢çæµ" @back="goBack" /> |
| | | |
| | | <scroll-view scroll-y class="page-scroll"> |
| | | <view class="summary-card"> |
| | | <view class="summary-header"> |
| | | <text class="summary-title">宿¶ç¯å¢æ¦è§</text> |
| | | <text class="summary-desc">æ¯15ç§èªå¨å·æ°ä¸æ¬¡è®¾å¤ç¯å¢æ°æ®</text> |
| | | </view> |
| | | |
| | | <view v-if="deviceCards.length" class="summary-grid"> |
| | | <view class="summary-item"> |
| | | <text class="summary-label">è®¾å¤æ°é</text> |
| | | <text class="summary-value">{{ deviceCards.length }}</text> |
| | | </view> |
| | | <view class="summary-item"> |
| | | <text class="summary-label">平忏©åº¦</text> |
| | | <text class="summary-value">{{ averageMetrics.temperature }}</text> |
| | | </view> |
| | | <view class="summary-item"> |
| | | <text class="summary-label">平忹¿åº¦</text> |
| | | <text class="summary-value">{{ averageMetrics.humidity }}</text> |
| | | </view> |
| | | <view class="summary-item"> |
| | | <text class="summary-label">å¹³åå
ç
§</text> |
| | | <text class="summary-value">{{ averageMetrics.light }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view v-else class="empty-block"> |
| | | <text class="empty-text">ææ ç¯å¢æ°æ®</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="section-block"> |
| | | <view class="section-header"> |
| | | <text class="section-title">设å¤çæµå表</text> |
| | | </view> |
| | | |
| | | <view v-if="deviceCards.length" class="device-list"> |
| | | <view |
| | | v-for="item in deviceCards" |
| | | :key="item.name" |
| | | class="device-card" |
| | | > |
| | | <view class="device-card__header"> |
| | | <view class="device-base"> |
| | | <text class="device-name">{{ item.name }}</text> |
| | | <text class="device-meta">设å¤ç¼ç ï¼{{ item.guid || "--" }}</text> |
| | | </view> |
| | | <text class="device-tag">å¨çº¿çæµ</text> |
| | | </view> |
| | | |
| | | <view class="metrics-grid"> |
| | | <view |
| | | v-for="metric in metricConfig" |
| | | :key="metric.key" |
| | | class="metric-item" |
| | | > |
| | | <text class="metric-label">{{ metric.label }}</text> |
| | | <text class="metric-value" :style="{ color: metric.color }"> |
| | | {{ item[metric.key] }} |
| | | </text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <view v-else class="empty-block"> |
| | | <text class="empty-text">ææ è®¾å¤çæµä¿¡æ¯</text> |
| | | </view> |
| | | </view> |
| | | </scroll-view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { computed, ref } from "vue"; |
| | | import { onHide, onShow, onUnload } from "@dcloudio/uni-app"; |
| | | import PageHeader from "@/components/PageHeader.vue"; |
| | | import { getEnvironmentalRealData } from "@/api/inventoryManagement/environmentalMonitoring"; |
| | | |
| | | const POLL_INTERVAL = 17000; |
| | | const TEMP_MARK_1 = "\u2103"; |
| | | const TEMP_MARK_2 = "\u00B0C"; |
| | | const TEMP_UNIT = TEMP_MARK_2; |
| | | |
| | | const latestDevices = ref([]); |
| | | let pollTimer = null; |
| | | |
| | | const metricConfig = [ |
| | | { key: "temperature", label: "温度", color: "#ff7a59", unit: TEMP_UNIT }, |
| | | { key: "humidity", label: "湿度", color: "#1ea7fd", unit: "%RH" }, |
| | | { key: "co2", label: "CO2", color: "#12c48b", unit: "ppm" }, |
| | | { key: "light", label: "å
ç
§", color: "#8b5cf6", unit: "Lux" }, |
| | | ]; |
| | | |
| | | const extractNumericValue = (rawValue) => { |
| | | const matched = String(rawValue ?? "").match(/-?\d+(\.\d+)?/); |
| | | return matched ? Number(matched[0]) : 0; |
| | | }; |
| | | |
| | | const normalizeMetricObject = (source, index) => { |
| | | const normalized = { |
| | | name: source?.deviceName || source?.name || source?.deviceNo || `设å¤${index + 1}`, |
| | | guid: source?.guid || source?.deviceGuid || source?.id || "", |
| | | deviceCode: source?.deviceCode || source?.deviceNo || source?.code || "", |
| | | temperature: 0, |
| | | humidity: 0, |
| | | co2: 0, |
| | | light: 0, |
| | | }; |
| | | |
| | | Object.entries(source || {}).forEach(([key, value]) => { |
| | | const rawText = String(value ?? ""); |
| | | |
| | | if (rawText.includes(TEMP_MARK_1) || rawText.includes(TEMP_MARK_2)) { |
| | | normalized.temperature = extractNumericValue(rawText); |
| | | return; |
| | | } |
| | | if (rawText.includes("%RH")) { |
| | | normalized.humidity = extractNumericValue(rawText); |
| | | return; |
| | | } |
| | | if (rawText.includes("ppm")) { |
| | | normalized.co2 = extractNumericValue(rawText); |
| | | return; |
| | | } |
| | | if (rawText.includes("Lux")) { |
| | | normalized.light = extractNumericValue(rawText); |
| | | return; |
| | | } |
| | | |
| | | if (key === "temperature") { |
| | | normalized.temperature = extractNumericValue(rawText); |
| | | } else if (key === "humidity") { |
| | | normalized.humidity = extractNumericValue(rawText); |
| | | } else if (key === "co2") { |
| | | normalized.co2 = extractNumericValue(rawText); |
| | | } else if (key === "light") { |
| | | normalized.light = extractNumericValue(rawText); |
| | | } |
| | | }); |
| | | |
| | | return normalized; |
| | | }; |
| | | |
| | | const formatMetric = (value, unit) => `${Number(value || 0).toFixed(2)}${unit}`; |
| | | |
| | | const deviceCards = computed(() => |
| | | latestDevices.value.map((item) => ({ |
| | | name: item.name, |
| | | guid: item.guid, |
| | | deviceCode: item.deviceCode, |
| | | temperature: formatMetric(item.temperature, TEMP_UNIT), |
| | | humidity: formatMetric(item.humidity, "%RH"), |
| | | co2: formatMetric(item.co2, "ppm"), |
| | | light: formatMetric(item.light, "Lux"), |
| | | })) |
| | | ); |
| | | |
| | | const averageMetrics = computed(() => { |
| | | if (!latestDevices.value.length) { |
| | | return { |
| | | temperature: `0.00${TEMP_UNIT}`, |
| | | humidity: "0.00%RH", |
| | | light: "0.00Lux", |
| | | }; |
| | | } |
| | | |
| | | const total = latestDevices.value.reduce( |
| | | (result, item) => { |
| | | result.temperature += Number(item.temperature || 0); |
| | | result.humidity += Number(item.humidity || 0); |
| | | result.light += Number(item.light || 0); |
| | | return result; |
| | | }, |
| | | { temperature: 0, humidity: 0, light: 0 } |
| | | ); |
| | | |
| | | const count = latestDevices.value.length; |
| | | |
| | | return { |
| | | temperature: formatMetric(total.temperature / count, TEMP_UNIT), |
| | | humidity: formatMetric(total.humidity / count, "%RH"), |
| | | light: formatMetric(total.light / count, "Lux"), |
| | | }; |
| | | }); |
| | | |
| | | const fetchRealData = async () => { |
| | | try { |
| | | const res = await getEnvironmentalRealData(); |
| | | const dataList = Array.isArray(res?.data) ? res.data : []; |
| | | latestDevices.value = dataList.map((item, index) => normalizeMetricObject(item, index)); |
| | | } catch (error) { |
| | | latestDevices.value = []; |
| | | } |
| | | }; |
| | | |
| | | const clearPolling = () => { |
| | | if (pollTimer) { |
| | | clearInterval(pollTimer); |
| | | pollTimer = null; |
| | | } |
| | | }; |
| | | |
| | | const startPolling = () => { |
| | | clearPolling(); |
| | | fetchRealData(); |
| | | pollTimer = setInterval(fetchRealData, POLL_INTERVAL); |
| | | }; |
| | | |
| | | const goBack = () => { |
| | | uni.navigateBack(); |
| | | }; |
| | | |
| | | onShow(() => { |
| | | startPolling(); |
| | | }); |
| | | |
| | | onHide(() => { |
| | | clearPolling(); |
| | | }); |
| | | |
| | | onUnload(() => { |
| | | clearPolling(); |
| | | }); |
| | | |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .environment-page { |
| | | min-height: 100vh; |
| | | background: #f4f7fb; |
| | | } |
| | | |
| | | .page-scroll { |
| | | height: calc(100vh - 88rpx); |
| | | padding: 24rpx; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .summary-card, |
| | | .section-block { |
| | | background: #ffffff; |
| | | border-radius: 24rpx; |
| | | padding: 28rpx; |
| | | box-shadow: 0 8rpx 24rpx rgba(31, 54, 88, 0.06); |
| | | } |
| | | |
| | | .section-block { |
| | | margin-top: 24rpx; |
| | | } |
| | | |
| | | .summary-header, |
| | | .section-header { |
| | | margin-bottom: 24rpx; |
| | | } |
| | | |
| | | .summary-title, |
| | | .section-title { |
| | | display: block; |
| | | font-size: 32rpx; |
| | | font-weight: 600; |
| | | color: #1d344f; |
| | | } |
| | | |
| | | .summary-desc { |
| | | display: block; |
| | | margin-top: 12rpx; |
| | | font-size: 24rpx; |
| | | color: #7b8aa0; |
| | | } |
| | | |
| | | .summary-grid, |
| | | .metrics-grid { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 20rpx; |
| | | } |
| | | |
| | | .summary-item { |
| | | width: calc(50% - 10rpx); |
| | | padding: 24rpx; |
| | | border-radius: 20rpx; |
| | | background: linear-gradient(135deg, #f8fbff 0%, #eef5ff 100%); |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .summary-label, |
| | | .metric-label { |
| | | display: block; |
| | | font-size: 24rpx; |
| | | color: #7b8aa0; |
| | | } |
| | | |
| | | .summary-value, |
| | | .metric-value { |
| | | display: block; |
| | | margin-top: 14rpx; |
| | | font-size: 30rpx; |
| | | font-weight: 600; |
| | | color: #1d344f; |
| | | } |
| | | |
| | | .device-list { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 20rpx; |
| | | } |
| | | |
| | | .device-card { |
| | | padding: 24rpx; |
| | | border-radius: 20rpx; |
| | | background: #f8fbff; |
| | | } |
| | | |
| | | .device-card__header { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | justify-content: space-between; |
| | | margin-bottom: 20rpx; |
| | | gap: 20rpx; |
| | | } |
| | | |
| | | .device-base { |
| | | min-width: 0; |
| | | flex: 1; |
| | | } |
| | | |
| | | .device-name { |
| | | display: block; |
| | | font-size: 30rpx; |
| | | font-weight: 600; |
| | | color: #1d344f; |
| | | } |
| | | |
| | | .device-meta { |
| | | display: block; |
| | | margin-top: 8rpx; |
| | | font-size: 22rpx; |
| | | color: #7b8aa0; |
| | | word-break: break-all; |
| | | } |
| | | |
| | | .device-tag { |
| | | flex-shrink: 0; |
| | | padding: 8rpx 16rpx; |
| | | border-radius: 999rpx; |
| | | background: rgba(18, 196, 139, 0.12); |
| | | font-size: 22rpx; |
| | | color: #12c48b; |
| | | } |
| | | |
| | | .metric-item { |
| | | width: calc(50% - 10rpx); |
| | | padding: 20rpx; |
| | | border-radius: 16rpx; |
| | | background: #ffffff; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .empty-block { |
| | | padding: 60rpx 0; |
| | | text-align: center; |
| | | } |
| | | |
| | | .empty-text { |
| | | font-size: 26rpx; |
| | | color: #98a6b9; |
| | | } |
| | | </style> |
| | |
| | | <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> |
| | | <PageHeader title="ä¾åºå徿¥è¯¦æ
" |
| | | @back="goBack" /> |
| | | <!-- ç»è®¡ä¿¡æ¯ --> |
| | | <view class="summary-info" |
| | | v-if="tableData.length > 0"> |
| | | <view class="summary-item"> |
| | | <text class="summary-label">æ»è®°å½æ°</text> |
| | | <text class="summary-value">{{ tableData.length }}</text> |
| | | </view> |
| | | <view class="summary-item"> |
| | | <text class="summary-label">å¼ç¥¨æ»éé¢</text> |
| | | <text class="summary-value">{{ formatAmount(invoiceTotal) }}</text> |
| | | </view> |
| | | <view class="summary-item"> |
| | | <text class="summary-label">忬¾æ»éé¢</text> |
| | | <text class="summary-value highlight">{{ formatAmount(receiptTotal) }}</text> |
| | | </view> |
| | | <view class="summary-item"> |
| | | <text class="summary-label">åºæ¶æ»éé¢</text> |
| | | <text class="summary-value danger">{{ formatAmount(unReceiptTotal) }}</text> |
| | | </view> |
| | | </view> |
| | | <!-- 忬¾è®°å½æç»å表 --> |
| | | <!-- éè´å°è´¦æç» --> |
| | | <view class="detail-list" |
| | | v-if="tableData.length > 0"> |
| | | <view v-for="(item, index) in tableData" |
| | |
| | | size="16" |
| | | color="#ffffff"></up-icon> |
| | | </view> |
| | | <text class="item-index">{{ index + 1 }}</text> |
| | | <text class="item-index">{{ item.purchaseContractNumber }}</text> |
| | | </view> |
| | | <view class="item-date">{{ item.happenTime }}</view> |
| | | <view class="item-status"> |
| | | <text class="status-tag" |
| | | :class="getReceiptStatusClass(item.status)">{{ receiptStatusText[item.status] || 'æªç¥ç¶æ' }}</text> |
| | | </view> |
| | | </view> |
| | | <up-divider></up-divider> |
| | | <view class="item-details"> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">å票éé¢(å
)</text> |
| | | <text class="detail-value">{{ formatAmount(item.invoiceAmount) }}</text> |
| | | <text class="detail-label">ååç¾è®¢æ¥æ</text> |
| | | <text class="detail-value">{{ item.executionDate }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">仿¬¾éé¢(å
)</text> |
| | | <text class="detail-value highlight">{{ formatAmount(item.currentPaymentAmount) }}</text> |
| | | <text class="detail-label">项ç®åç§°</text> |
| | | <text class="detail-value">{{ item.projectName }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">åºä»éé¢(å
)</text> |
| | | <text class="detail-value danger">{{ formatAmount(item.payableAmount) }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">åçæ¥æ</text> |
| | | <text class="detail-value">{{ item.paymentDate }}</text> |
| | | <text class="detail-label">ååéé¢(å
)</text> |
| | | <text class="detail-value">{{ formatAmount(item.contractAmount) }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view v-else |
| | | class="no-data"> |
| | | <text>ææ åæ¬¾è®°å½</text> |
| | | <text>ææ éè´å°è´¦è®°å½</text> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, computed, onMounted } from "vue"; |
| | | import { onShow } from "@dcloudio/uni-app"; |
| | | import { |
| | | paymentLedgerList, |
| | | paymentRecordList, |
| | | } from "@/api/procurementManagement/paymentLedger"; |
| | | import { ref, onMounted } from "vue"; |
| | | import { gePurchaseListPage } from "@/api/procurementManagement/invoiceEntry.js"; |
| | | |
| | | // 客æ·ä¿¡æ¯ |
| | | const supplierId = ref(""); |
| | | const supplierName = ref(""); |
| | | |
| | | // è¡¨æ ¼æ°æ® |
| | | const tableData = ref([]); |
| | | |
| | | const invoiceTotal = computed(() => { |
| | | return tableData.value.reduce((sum, item) => { |
| | | return sum + (parseFloat(item.invoiceAmount) || 0); |
| | | }, 0); |
| | | }); |
| | | // æ¶è´§ç¶æææ¬æ å° |
| | | const receiptStatusText = { |
| | | 1: 'å¾
æ¶è´§', |
| | | 2: 'æ¶è´§ä¸', |
| | | 3: 'å·²æ¶è´§' |
| | | }; |
| | | |
| | | const receiptTotal = computed(() => { |
| | | return tableData.value.reduce((sum, item) => { |
| | | return sum + (parseFloat(item.receiptAmount) || 0); |
| | | }, 0); |
| | | }); |
| | | |
| | | const unReceiptTotal = computed(() => { |
| | | return tableData.value.reduce((sum, item) => { |
| | | return sum + (parseFloat(item.unReceiptAmount) || 0); |
| | | }, 0); |
| | | }); |
| | | // æ¶è´§ç¶ææ ç¾æ ·å¼ |
| | | const getReceiptStatusClass = (status) => { |
| | | const classMap = { |
| | | 1: 'status-info', |
| | | 2: 'status-warning', |
| | | 3: 'status-success' |
| | | }; |
| | | return classMap[status] || 'status-info'; |
| | | }; |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | | uni.removeStorageSync("supplierId"); |
| | | uni.removeStorageSync("supplierName"); |
| | | uni.navigateBack(); |
| | | }; |
| | | |
| | | // è·å页é¢åæ° |
| | | const getPageParams = () => { |
| | | // 仿¬å°åå¨è·åä¾åºåID |
| | | const storedSupplierId = uni.getStorageSync("supplierId"); |
| | | if (storedSupplierId) { |
| | | supplierId.value = storedSupplierId; |
| | | const storedSupplierName = uni.getStorageSync("supplierName"); |
| | | if (storedSupplierName) { |
| | | supplierName.value = storedSupplierName; |
| | | } |
| | | }; |
| | | |
| | | // æ¥è¯¢å表 |
| | | const getList = () => { |
| | | if (!supplierId.value) { |
| | | if (!supplierName.value) { |
| | | uni.showToast({ |
| | | title: "客æ·ä¿¡æ¯ç¼ºå¤±", |
| | | title: "ä¾åºåä¿¡æ¯ç¼ºå¤±", |
| | | icon: "error", |
| | | }); |
| | | return; |
| | | } |
| | | showLoadingToast("å è½½ä¸..."); |
| | | paymentRecordList({ supplierId: supplierId.value }) |
| | | gePurchaseListPage({ supplierName: supplierName.value, current: 1, size: 1000 }) |
| | | .then(res => { |
| | | tableData.value = res.data; |
| | | let orders = []; |
| | | if (res.data) { |
| | | if (Array.isArray(res.data)) { |
| | | orders = res.data; |
| | | } else if (res.data.records && Array.isArray(res.data.records)) { |
| | | orders = res.data.records; |
| | | } |
| | | } |
| | | tableData.value = orders; |
| | | closeToast(); |
| | | }) |
| | | .catch(() => { |
| | |
| | | |
| | | .u-divider { |
| | | margin: 0 !important; |
| | | } |
| | | |
| | | .summary-info { |
| | | background: #ffffff; |
| | | margin: 20px 20px 0 20px; |
| | | border-radius: 12px; |
| | | padding: 16px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); |
| | | } |
| | | |
| | | .summary-item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 8px; |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | } |
| | | |
| | | .summary-label { |
| | | font-size: 14px; |
| | | color: #666; |
| | | } |
| | | |
| | | .summary-value { |
| | | font-size: 14px; |
| | | color: #333; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .summary-value.highlight { |
| | | color: #2979ff; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .summary-value.danger { |
| | | color: #ff4757; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .detail-list { |
| | |
| | | color: #666; |
| | | } |
| | | |
| | | .item-status { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .status-tag { |
| | | font-size: 12px; |
| | | padding: 2px 8px; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .status-success { |
| | | color: #67c23a; |
| | | background: rgba(103, 194, 58, 0.1); |
| | | } |
| | | |
| | | .status-warning { |
| | | color: #e6a23c; |
| | | background: rgba(230, 162, 60, 0.1); |
| | | } |
| | | |
| | | .status-info { |
| | | color: #909399; |
| | | background: rgba(144, 147, 153, 0.1); |
| | | } |
| | | |
| | | .item-details { |
| | | padding: 16px 0; |
| | | } |
| | |
| | | text-align: right; |
| | | flex: 1; |
| | | margin-left: 16px; |
| | | } |
| | | |
| | | .detail-value.highlight { |
| | | color: #2979ff; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .detail-value.danger { |
| | | color: #ff4757; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .no-data { |
| | |
| | | <view class="item-details"> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">ååéé¢(å
)</text> |
| | | <text class="detail-value">{{ formattedNumber(item.invoiceAmount) }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">仿¬¾éé¢(å
)</text> |
| | | <text class="detail-value">{{ formattedNumber(item.paymentAmount) }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">åºä»éé¢(å
)</text> |
| | | <text class="detail-value highlight danger">{{ formattedNumber(item.payableAmount) }}</text> |
| | | <text class="detail-value">{{ formattedNumber(item.contractAmounts) }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | |
| | | const rowClickMethod = (row) => { |
| | | // ä½¿ç¨ uni.setStorageSync åå¨ä¾åºåä¿¡æ¯ |
| | | uni.setStorageSync('supplierId', row.supplierId); |
| | | uni.setStorageSync('supplierName', row.supplierName); |
| | | // 跳转å°åæ¬¾è®°å½æç»é¡µé¢ |
| | | uni.navigateTo({ |
| | | url: '/pages/procurementManagement/paymentLedger/detail' |
| | |
| | | <u-button type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | | :disabled="item.inspectState" |
| | | :disabled="!!item.inspectState" |
| | | @click.stop="startInspection(item)"> |
| | | ç¼è¾ |
| | | </u-button> |
| | |
| | | <u-button type="success" |
| | | size="small" |
| | | class="action-btn" |
| | | :disabled="item.inspectState" |
| | | :disabled="!!item.inspectState" |
| | | @click.stop="submitInspection(item)"> |
| | | æäº¤ |
| | | </u-button> |
| | |
| | | <u-button type="warning" |
| | | size="small" |
| | | class="action-btn" |
| | | :disabled="item.inspectState || item.checkName !== ''" |
| | | :disabled="!!item.inspectState || item.checkName !== ''" |
| | | @click.stop="assignInspector(item)"> |
| | | åé
æ£éªå |
| | | </u-button> |
| | |
| | | <template> |
| | | <view class="material-inspection-page"> |
| | | <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> |
| | | <PageHeader title="åæææ£éª" |
| | | <PageHeader title="åææ£éª" |
| | | @back="goBack" /> |
| | | <!-- æç´¢åºå --> |
| | | <view class="search-section"> |
| | |
| | | <u-button type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | | :disabled="item.inspectState" |
| | | :disabled="!!item.inspectState" |
| | | @click.stop="startInspection(item)"> |
| | | ç¼è¾ |
| | | </u-button> |
| | |
| | | <u-button type="success" |
| | | size="small" |
| | | class="action-btn" |
| | | :disabled="item.inspectState" |
| | | :disabled="!!item.inspectState" |
| | | @click.stop="submitInspection(item)"> |
| | | æäº¤ |
| | | </u-button> |
| | |
| | | <u-button type="warning" |
| | | size="small" |
| | | class="action-btn" |
| | | :disabled="item.inspectState || item.checkName !== ''" |
| | | :disabled="!!item.inspectState || item.checkName !== ''" |
| | | @click.stop="assignInspector(item)"> |
| | | åé
æ£éªå |
| | | </u-button> |
| | |
| | | <u-button type="primary" |
| | | size="small" |
| | | class="action-btn" |
| | | :disabled="item.inspectState" |
| | | :disabled="!!item.inspectState" |
| | | @click.stop="startInspection(item)"> |
| | | ç¼è¾ |
| | | </u-button> |
| | |
| | | <u-button type="success" |
| | | size="small" |
| | | class="action-btn" |
| | | :disabled="item.inspectState" |
| | | :disabled="!!item.inspectState" |
| | | @click.stop="submitInspection(item)"> |
| | | æäº¤ |
| | | </u-button> |
| | |
| | | <u-button type="warning" |
| | | size="small" |
| | | class="action-btn" |
| | | :disabled="item.inspectState || item.checkName !== ''" |
| | | :disabled="!!item.inspectState || item.checkName !== ''" |
| | | @click.stop="assignInspector(item)"> |
| | | åé
æ£éªå |
| | | </u-button> |
| | |
| | | <!-- 使ç¨éç¨é¡µé¢å¤´é¨ç»ä»¶ --> |
| | | <PageHeader title="客æ·å¾æ¥è¯¦æ
" |
| | | @back="goBack" /> |
| | | <!-- ç»è®¡ä¿¡æ¯ --> |
| | | <view class="summary-info" |
| | | v-if="tableData.length > 0"> |
| | | <view class="summary-item"> |
| | | <text class="summary-label">æ»è®°å½æ°</text> |
| | | <text class="summary-value">{{ tableData.length }}</text> |
| | | </view> |
| | | <view class="summary-item"> |
| | | <text class="summary-label">å¼ç¥¨æ»éé¢</text> |
| | | <text class="summary-value">{{ formatAmount(invoiceTotal) }}</text> |
| | | </view> |
| | | <view class="summary-item"> |
| | | <text class="summary-label">忬¾æ»éé¢</text> |
| | | <text class="summary-value highlight">{{ formatAmount(receiptTotal) }}</text> |
| | | </view> |
| | | <view class="summary-item"> |
| | | <text class="summary-label">åºæ¶æ»éé¢</text> |
| | | <text class="summary-value danger">{{ formatAmount(unReceiptTotal) }}</text> |
| | | </view> |
| | | </view> |
| | | <!-- 忬¾è®°å½æç»å表 --> |
| | | <!-- åè´§å°è´¦æç» --> |
| | | <view class="detail-list" |
| | | v-if="tableData.length > 0"> |
| | | <view v-for="(item, index) in tableData" |
| | |
| | | size="16" |
| | | color="#ffffff"></up-icon> |
| | | </view> |
| | | <text class="item-index">{{ index + 1 }}</text> |
| | | <text class="item-index">{{ item.salesContractNo }}</text> |
| | | </view> |
| | | <view class="item-date">{{ item.happenTime }}</view> |
| | | <view class="item-status"> |
| | | <text class="status-tag" |
| | | :class="getStatusClass(item.status)">{{ item.status || '--' }}</text> |
| | | </view> |
| | | </view> |
| | | <up-divider></up-divider> |
| | | <view class="item-details"> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">å¼ç¥¨éé¢(å
)</text> |
| | | <text class="detail-value">{{ formatAmount(item.invoiceTotal) }}</text> |
| | | <text class="detail-label">客æ·åç§°</text> |
| | | <text class="detail-value">{{ item.customerName }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">忬¾éé¢(å
)</text> |
| | | <text class="detail-value highlight">{{ formatAmount(item.receiptPaymentAmount) }}</text> |
| | | <text class="detail-label">产ååç§°</text> |
| | | <text class="detail-value">{{ item.productName }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">åºæ¶éé¢(å
)</text> |
| | | <text class="detail-value danger">{{ formatAmount(item.unReceiptPaymentAmount) }}</text> |
| | | <text class="detail-label">è§æ ¼åå·</text> |
| | | <text class="detail-value">{{ item.specificationModel }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">åçæ¥æ</text> |
| | | <text class="detail-value">{{ item.receiptPaymentDate }}</text> |
| | | <text class="detail-label">åè´§æ¶é´</text> |
| | | <text class="detail-value">{{ item.shippingDate }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">åè´§æ°é</text> |
| | | <text class="detail-value">{{ item.totalQuantity }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">åºåºåå·</text> |
| | | <text class="detail-value">{{ item.outboundBatches }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view v-else |
| | | class="no-data"> |
| | | <text>ææ åæ¬¾è®°å½</text> |
| | | <text>ææ åè´§è®°å½</text> |
| | | </view> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, computed, onMounted } from "vue"; |
| | | import { ref, onMounted } from "vue"; |
| | | import { onShow } from "@dcloudio/uni-app"; |
| | | import { customerInteractions } from "@/api/salesManagement/receiptPayment.js"; |
| | | import { deliveryLedgerListPage } from "@/api/salesManagement/deliveryLedger.js"; |
| | | |
| | | // 客æ·ä¿¡æ¯ |
| | | const customerId = ref(""); |
| | | |
| | | // è¡¨æ ¼æ°æ® |
| | | const tableData = ref([]); |
| | | |
| | | const invoiceTotal = computed(() => { |
| | | return tableData.value.reduce((sum, item) => { |
| | | return sum + (parseFloat(item.invoiceTotal) || 0); |
| | | }, 0); |
| | | }); |
| | | |
| | | const receiptTotal = computed(() => { |
| | | return tableData.value.reduce((sum, item) => { |
| | | return sum + (parseFloat(item.receiptPaymentAmount) || 0); |
| | | }, 0); |
| | | }); |
| | | |
| | | const unReceiptTotal = computed(() => { |
| | | return tableData.value.reduce((sum, item) => { |
| | | return sum + (parseFloat(item.unReceiptPaymentAmount) || 0); |
| | | }, 0); |
| | | }); |
| | | |
| | | // è¿åä¸ä¸é¡µ |
| | | const goBack = () => { |
| | |
| | | |
| | | // è·å页é¢åæ° |
| | | const getPageParams = () => { |
| | | // 仿¬å°åå¨è·å客æ·ID |
| | | const storedCustomerId = uni.getStorageSync("customerId"); |
| | | if (storedCustomerId) { |
| | | customerId.value = storedCustomerId; |
| | |
| | | } |
| | | |
| | | showLoadingToast("å è½½ä¸..."); |
| | | const param = { |
| | | deliveryLedgerListPage({ |
| | | customerId: customerId.value, |
| | | current: -1, |
| | | size: -1, |
| | | }; |
| | | |
| | | customerInteractions(param) |
| | | current: 1, |
| | | size: 1000, |
| | | }) |
| | | .then(res => { |
| | | tableData.value = res.data; |
| | | let orders = []; |
| | | if (res.data) { |
| | | if (Array.isArray(res.data)) { |
| | | orders = res.data; |
| | | } else if (res.data.records && Array.isArray(res.data.records)) { |
| | | orders = res.data.records; |
| | | } |
| | | } |
| | | tableData.value = orders; |
| | | closeToast(); |
| | | }) |
| | | .catch(() => { |
| | |
| | | }); |
| | | }; |
| | | |
| | | // æ ¼å¼åéé¢ |
| | | const formatAmount = amount => { |
| | | return amount ? parseFloat(amount).toFixed(2) : "0.00"; |
| | | // åè´§ç¶ææ ·å¼ |
| | | const getStatusClass = (status) => { |
| | | const statusMap = { |
| | | 'å·²åè´§': 'status-success', |
| | | 'å®¡æ ¸éè¿': 'status-success', |
| | | 'å®¡æ ¸ä¸': 'status-warning', |
| | | 'å®¡æ ¸ä¸éè¿': 'status-danger', |
| | | }; |
| | | return statusMap[status] || 'status-info'; |
| | | }; |
| | | |
| | | // æ¾ç¤ºå è½½æç¤º |
| | |
| | | |
| | | .u-divider { |
| | | margin: 0 !important; |
| | | } |
| | | |
| | | .summary-info { |
| | | background: #ffffff; |
| | | margin: 20px 20px 0 20px; |
| | | border-radius: 12px; |
| | | padding: 16px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); |
| | | } |
| | | |
| | | .summary-item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-bottom: 8px; |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | } |
| | | |
| | | .summary-label { |
| | | font-size: 14px; |
| | | color: #666; |
| | | } |
| | | |
| | | .summary-value { |
| | | font-size: 14px; |
| | | color: #333; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .summary-value.highlight { |
| | | color: #2979ff; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .summary-value.danger { |
| | | color: #ff4757; |
| | | font-weight: 600; |
| | | } |
| | | |
| | | .detail-list { |
| | |
| | | color: #666; |
| | | } |
| | | |
| | | .item-status { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | |
| | | .status-tag { |
| | | font-size: 12px; |
| | | padding: 2px 8px; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .status-success { |
| | | color: #67c23a; |
| | | background: rgba(103, 194, 58, 0.1); |
| | | } |
| | | |
| | | .status-warning { |
| | | color: #e6a23c; |
| | | background: rgba(230, 162, 60, 0.1); |
| | | } |
| | | |
| | | .status-danger { |
| | | color: #f56c6c; |
| | | background: rgba(245, 108, 108, 0.1); |
| | | } |
| | | |
| | | .status-info { |
| | | color: #909399; |
| | | background: rgba(144, 147, 153, 0.1); |
| | | } |
| | | |
| | | .item-details { |
| | | padding: 16px 0; |
| | | } |
| | |
| | | margin-left: 16px; |
| | | } |
| | | |
| | | .detail-value.highlight { |
| | | color: #2979ff; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .detail-value.danger { |
| | | color: #ff4757; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .no-data { |
| | | padding: 40px 0; |
| | | text-align: center; |
| | | color: #999; |
| | | } |
| | | |
| | | </style> |
| | |
| | | <up-divider></up-divider> |
| | | <view class="item-details"> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">å¼ç¥¨éé¢(å
)</text> |
| | | <text class="detail-value">{{ formattedNumber(item.invoiceTotal) }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">忬¾éé¢(å
)</text> |
| | | <text class="detail-value">{{ formattedNumber(item.receiptPaymentAmount) }}</text> |
| | | </view> |
| | | <view class="detail-row"> |
| | | <text class="detail-label">åºæ¶éé¢(å
)</text> |
| | | <text class="detail-value highlight danger">{{ formattedNumber(item.unReceiptPaymentAmount) }}</text> |
| | | <text class="detail-label">ååéé¢(å
)</text> |
| | | <text class="detail-value">{{ formattedNumber(item.contractAmounts) }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | <script setup> |
| | | import { onMounted, ref, reactive, toRefs } from "vue"; |
| | | import { onShow } from "@dcloudio/uni-app"; |
| | | import { invoiceLedgerSalesAccount } from "@/api/salesManagement/invoiceLedger"; |
| | | import { customewTransactions } from "@/api/salesManagement/indicatorStats.js"; |
| | | |
| | | const tableData = ref([]); |
| | | |
| | |
| | | |
| | | const getList = () => { |
| | | showLoadingToast("å è½½ä¸..."); |
| | | invoiceLedgerSalesAccount({ ...searchForm.value, ...page }) |
| | | customewTransactions({ ...searchForm.value, ...page }) |
| | | .then(res => { |
| | | tableData.value = res.data.records; |
| | | closeToast(); |
| | |
| | | |
| | | const rowClickMethod = row => { |
| | | // ä½¿ç¨ uni.setStorageSync åå¨å®¢æ·ä¿¡æ¯ |
| | | uni.setStorageSync("customerId", row.id); |
| | | uni.setStorageSync("customerId", row.customerId); |
| | | // 跳转å°åæ¬¾è®°å½æç»é¡µé¢ |
| | | uni.navigateTo({ |
| | | url: "/pages/sales/receiptPaymentLedger/detail", |
| | |
| | | |
| | | <script setup> |
| | | import { ref, onMounted, nextTick, reactive, computed } from "vue"; |
| | | import { onShow } from "@dcloudio/uni-app"; |
| | | import { userLoginFacotryList } from "@/api/login"; |
| | | import { getProductWorkOrderById } from "@/api/productionManagement/productionReporting"; |
| | | import { createVersionUpgradeChecker } from "@/utils/versionUpgrade"; |
| | | import DownloadProgressMask from "@/components/DownloadProgressMask.vue"; |
| | | import { OA_WORKBENCH_ITEMS } from "@/config/oaWorkbench.js"; |
| | | import modal from "@/plugins/modal"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | |
| | | const userStore = useUserStore(); |
| | | const { triggerVersionCheck } = createVersionUpgradeChecker({ logPrefix: "[version-works]" }); |
| | | const show = ref(false); |
| | | const factoryList = ref([]); |
| | | const factoryListTem = ref([]); |
| | |
| | | icon: "/static/images/icon/kucunguanli.svg", |
| | | label: "åºå管ç", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/weixianzuoye.svg", |
| | | label: "ç¯å¢æ£æµ", |
| | | }, |
| | | ]); |
| | | |
| | | const humanResourcesItems = reactive([ |
| | |
| | | icon: "/static/images/icon/hetongguanli.svg", |
| | | label: "åå管ç", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/hetongguanli.svg", |
| | | label: "转æ£ç³è¯·", |
| | | path: "/pages/oa/HrManage/regular-apply/index", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/renyuanxinzi.svg", |
| | | label: "è°å²ç³è¯·", |
| | | path: "/pages/oa/HrManage/transfer-apply/index", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/gongchuguanli.svg", |
| | | label: "å·¥ä½äº¤æ¥", |
| | | path: "/pages/oa/HrManage/work-handover/index", |
| | | }, |
| | | ]); |
| | | const qualityItems = reactive([ |
| | | { |
| | | icon: "/static/images/icon/yuancailiaojianyan.svg", |
| | | label: "åæææ£éª", |
| | | label: "åææ£éª", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/guochengjianyan.svg", |
| | |
| | | { |
| | | icon: "/static/images/icon/kehubaifang.svg", |
| | | label: "å®¢æ·æè®¿", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/qingjiaguanli.svg", |
| | | label: "请åç³è¯·", |
| | | path: "/pages/oa/AttendManage/leave-apply/index", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/dakaqiandao.svg", |
| | | label: "å çç³è¯·", |
| | | path: "/pages/oa/AttendManage/overtime-apply/index", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/chuchaiguanli.svg", |
| | | label: "å·®æ
æ¥é", |
| | | path: "/pages/oa/ReimburseManage/travel-reimburse/index", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/baoxiaoguanli.svg", |
| | | label: "è´¹ç¨æ¥é", |
| | | path: "/pages/oa/ReimburseManage/cost-reimburse/index", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/xietongshenpi.svg", |
| | | label: "审æ¹å表", |
| | | path: "/pages/oa/ApproveManage/approve-list/index", |
| | | }, |
| | | { |
| | | icon: "/static/images/icon/guizhangzhidu.svg", |
| | | label: "å®¡æ¹æ¨¡æ¿", |
| | | path: "/pages/oa/ApproveManage/approve-template/index", |
| | | }, |
| | | ]); |
| | | |
| | |
| | | url: "/pages/humanResources/contractManagement/index", |
| | | }); |
| | | break; |
| | | case "åæææ£éª": |
| | | case "åææ£éª": |
| | | uni.navigateTo({ |
| | | url: "/pages/qualityManagement/materialInspection/index", |
| | | }); |
| | |
| | | url: "/pages/inventoryManagement/stockManagement/index", |
| | | }); |
| | | break; |
| | | case "ç¯å¢æ£æµ": |
| | | uni.navigateTo({ |
| | | url: "/pages/inventoryManagement/environmentalMonitoring/index", |
| | | }); |
| | | break; |
| | | case "åé¦ç»è®°": |
| | | uni.navigateTo({ |
| | | url: "/pages/customerService/feedbackRegistration/index", |