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