From f2770f03e7251b32eb576113c522bfbe96e5e385 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 16 六月 2026 13:46:16 +0800
Subject: [PATCH] 君歌app 1.依照web端功能修改
---
src/pages/productionManagement/workOrder/index.vue | 186 +++++++++++++++++++++++++--------------------
1 files changed, 103 insertions(+), 83 deletions(-)
diff --git a/src/pages/productionManagement/workOrder/index.vue b/src/pages/productionManagement/workOrder/index.vue
index 5360a11..c1c7aa9 100644
--- a/src/pages/productionManagement/workOrder/index.vue
+++ b/src/pages/productionManagement/workOrder/index.vue
@@ -1,27 +1,34 @@
<template>
<view class="work-order">
- <!-- 閫氱敤椤甸潰澶撮儴 -->
<PageHeader title="鐢熶骇宸ュ崟" @back="goBack" />
-
+
<!-- 鎼滅储鍖哄煙 -->
<view class="search-section">
<view class="search-bar">
<view class="search-input">
- <up-input
- class="search-text"
- placeholder="璇疯緭鍏ュ伐鍗曠紪鍙锋悳绱�"
- v-model="searchForm.workOrderNo"
- @confirm="handleQuery"
- clearable
- />
+ <up-input class="search-text"
+ v-model="data.searchForm.workOrderNo"
+ placeholder="宸ュ崟缂栧彿"
+ @confirm="handleQuery"
+ clearable />
</view>
-
+ <view class="search-input">
+ <up-input class="search-text"
+ v-model="data.searchForm.npsNo"
+ placeholder="鐢熶骇璁㈠崟鍙�"
+ @confirm="handleQuery"
+ clearable />
+ </view>
<view class="filter-button" @click="handleQuery">
<up-icon name="search" size="24" color="#999"></up-icon>
</view>
</view>
+ <view class="switch-row">
+ <text class="switch-label">浠呯湅鎴戠殑</text>
+ <up-switch v-model="filterMine" @change="handleQuery" size="18" />
+ </view>
</view>
-
+
<!-- 宸ュ崟鍒楄〃 -->
<scroll-view scroll-y class="ledger-list" v-if="tableData.length > 0" @scrolltolower="loadMore">
<view v-for="(item, index) in tableData" :key="item.id || index" class="ledger-item">
@@ -36,10 +43,14 @@
<text class="item-tag tag-type">{{ item.workOrderType }}</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.npsNo || '-' }}</text>
+ </view>
<view class="detail-row">
<text class="detail-label">浜у搧鍚嶇О</text>
<text class="detail-value">{{ item.productName }}</text>
@@ -50,24 +61,24 @@
</view>
<view class="detail-row">
<text class="detail-label">宸ュ簭鍚嶇О</text>
- <text class="detail-value">{{ item.processName }}</text>
+ <text class="detail-value">{{ item.operationName }}</text>
</view>
<view class="detail-row">
<text class="detail-label">闇�姹�/瀹屾垚鏁伴噺</text>
<text class="detail-value">{{ item.planQuantity }} / {{ item.completeQuantity }} {{ item.unit }}</text>
</view>
-
+
<view class="progress-section">
<text class="detail-label">瀹屾垚杩涘害</text>
<view class="progress-bar">
- <up-line-progress
- :percentage="toProgressPercentage(item.completionStatus)"
+ <up-line-progress
+ :percentage="toProgressPercentage(item.completionStatus)"
activeColor="#2979ff"
:showText="true"
></up-line-progress>
</view>
</view>
-
+
<view class="detail-row">
<text class="detail-label">璁″垝寮�濮�</text>
<text class="detail-value">{{ item.planStartTime }}</text>
@@ -76,51 +87,52 @@
<text class="detail-label">璁″垝缁撴潫</text>
<text class="detail-value">{{ item.planEndTime }}</text>
</view>
+ <view class="detail-row">
+ <text class="detail-label">瀹為檯寮�濮�</text>
+ <text class="detail-value">{{ item.actualStartTime || '-' }}</text>
+ </view>
+ <view class="detail-row">
+ <text class="detail-label">瀹為檯缁撴潫</text>
+ <text class="detail-value">{{ item.actualEndTime || '-' }}</text>
+ </view>
+ </view>
+
+ <view class="item-actions">
+ <up-button v-if="showStartReport(item)"
+ class="action-btn"
+ size="small"
+ type="primary"
+ @click="handleStartWork(item)">寮�濮嬫姤宸�</up-button>
+ <up-button v-if="showEndReport(item)"
+ class="action-btn"
+ size="small"
+ type="success"
+ @click="goReport(item)">缁撴潫鎶ュ伐</up-button>
</view>
</view>
<up-loadmore :status="loadStatus" />
</scroll-view>
-
+
<view v-else-if="!loading" class="no-data">
<up-empty mode="data" text="鏆傛棤宸ュ崟鏁版嵁"></up-empty>
</view>
- <!-- 娴佽浆鍗″脊绐� -->
- <up-popup :show="transferCardVisible" mode="center" @close="transferCardVisible = false" round="10">
- <view class="qr-popup">
- <text class="qr-title">宸ュ崟娴佽浆鍗′簩缁寸爜</text>
- <view class="qr-box">
- <geek-qrcode
- v-if="transferCardRowData"
- :val="String(transferCardRowData.id)"
- :size="200"
- />
- </view>
- <text class="qr-info" v-if="transferCardRowData">{{ transferCardRowData.workOrderNo }}</text>
- <up-button text="鍏抽棴" @click="transferCardVisible = false" style="margin-top: 20px;"></up-button>
- </view>
- </up-popup>
-
- <!-- 闄勪欢缁勪欢 -->
- <FilesDia ref="workOrderFilesRef" />
</view>
</template>
<script setup>
-import { ref, reactive, toRefs, getCurrentInstance } from "vue";
+import { ref, reactive } from "vue";
import { onShow } from '@dcloudio/uni-app';
-import { productWorkOrderPage } from "@/api/productionManagement/workOrder.js";
+import { productWorkOrderPage, startWork } from "@/api/productionManagement/workOrder.js";
import PageHeader from "@/components/PageHeader.vue";
-import FilesDia from "./components/filesDia.vue";
+import useUserStore from "@/store/modules/user";
-const { proxy } = getCurrentInstance();
+const userStore = useUserStore();
const loading = ref(false);
const tableData = ref([]);
const loadStatus = ref('loadmore');
-const transferCardVisible = ref(false);
-const transferCardRowData = ref(null);
-const workOrderFilesRef = ref(null);
+const filterMine = ref(false);
const page = reactive({
current: 1,
@@ -131,9 +143,20 @@
const data = reactive({
searchForm: {
workOrderNo: "",
+ npsNo: "",
},
});
-const { searchForm } = toRefs(data);
+
+const isCompleted = row => {
+ const status = Number(row?.completionStatus);
+ return Number.isFinite(status) && status >= 100;
+};
+
+const canOperate = row => !row.endOrder && !isCompleted(row);
+
+const showStartReport = row => canOperate(row) && !row.actualStartTime;
+
+const showEndReport = row => canOperate(row) && !!row.actualStartTime;
const goBack = () => {
uni.navigateBack();
@@ -148,15 +171,18 @@
const getList = () => {
if (loading.value) return;
loading.value = true;
-
- const params = { ...searchForm.value, ...page };
-
+
+ const params = { ...data.searchForm, ...page };
+ if (filterMine.value) {
+ params.filterMine = true;
+ }
+
productWorkOrderPage(params).then((res) => {
loading.value = false;
const records = res.data.records || [];
tableData.value = page.current === 1 ? records : [...tableData.value, ...records];
page.total = res.data.total;
-
+
if (tableData.value.length >= page.total) {
loadStatus.value = 'nomore';
} else {
@@ -182,13 +208,34 @@
return Math.round(n);
};
-const showTransferCard = (row) => {
- transferCardRowData.value = row;
- transferCardVisible.value = true;
+const handleStartWork = (row) => {
+ uni.showModal({
+ title: "鎻愮ず",
+ content: "纭寮�濮嬫姤宸ワ紵",
+ success: res => {
+ if (res.confirm) {
+ startWork({
+ productionOperationTaskId: row.id,
+ userId: userStore.id,
+ })
+ .then(() => {
+ uni.showToast({ title: "寮�濮嬫姤宸ユ垚鍔�" });
+ handleQuery();
+ })
+ .catch(() => {
+ uni.showToast({ title: "寮�濮嬫姤宸ュけ璐�", icon: "error" });
+ });
+ }
+ },
+ });
};
-const openWorkOrderFiles = (row) => {
- workOrderFilesRef.value?.openDialog(row);
+const goReport = (row) => {
+ uni.navigateTo({
+ url: `/pages/productionManagement/productionReport/index?orderRow=${encodeURIComponent(
+ JSON.stringify(row)
+ )}`,
+ });
};
onShow(() => {
@@ -228,37 +275,10 @@
gap: 10px;
padding: 12px 0;
border-top: 1px solid #f5f5f5;
-
- :deep(.up-button) {
+
+ .action-btn {
margin: 0;
width: auto;
- }
-}
-
-.qr-popup {
- padding: 30px;
- background-color: #fff;
- display: flex;
- flex-direction: column;
- align-items: center;
-
- .qr-title {
- font-size: 18px;
- font-weight: bold;
- margin-bottom: 20px;
- }
-
- .qr-box {
- padding: 20px;
- background-color: #fff;
- box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
- border-radius: 8px;
- margin-bottom: 15px;
- }
-
- .qr-info {
- font-size: 14px;
- color: #666;
}
}
--
Gitblit v1.9.3