From ad1130e4bd03661df016dc3fd4bf8b60ce8b1ca2 Mon Sep 17 00:00:00 2001
From: 周宾 <2802492122@qq.com>
Date: 星期三, 17 十二月 2025 10:14:20 +0800
Subject: [PATCH] 海川开心-修改生产管控-生产订单

---
 src/pages/cooperativeOffice/collaborativeApproval/detail.vue |  386 ++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 240 insertions(+), 146 deletions(-)

diff --git a/src/pages/cooperativeOffice/collaborativeApproval/detail.vue b/src/pages/cooperativeOffice/collaborativeApproval/detail.vue
index f8ecb68..7dbf5b2 100644
--- a/src/pages/cooperativeOffice/collaborativeApproval/detail.vue
+++ b/src/pages/cooperativeOffice/collaborativeApproval/detail.vue
@@ -3,75 +3,129 @@
     <PageHeader title="瀹℃壒娴佺▼" @back="goBack" />
 
     <!-- 琛ㄥ崟鍖哄煙 -->
-    <view class="form-section">
-      <van-form ref="formRef" @submit="submitForm" :rules="rules" input-align="right" error-message-align="right" scroll-to-error scroll-to-error-position="center">
-				<van-cell-group style="margin-bottom: 16px;">
-					<van-field
-						v-model="form.approveReason"
-						name="approveReason"
-						rows="2"
-						autosize
-						label="鐢宠浜嬬敱"
-						type="textarea"
-						maxlength="200"
-						:rules="[{ required: true, message: '鐢宠浜嬬敱涓嶈兘涓虹┖' }]"
-						placeholder="璇疯緭鍏ョ敵璇蜂簨鐢�"
-						show-word-limit
-						required
-					/>
-				</van-cell-group>
-				<van-cell-group>
-					<van-field
-						v-model="form.approveDeptName"
-						readonly
-						name="picker"
-						label="鐢宠閮ㄩ棬"
-						placeholder="璇烽�夋嫨鐢宠閮ㄩ棬"
-						:rules="[{ required: true, message: '璇烽�夋嫨鐢宠閮ㄩ棬' }]"
+    <u-form ref="formRef" @submit="submitForm" :rules="rules" :model="form" label-width="140rpx">
+      <u-form-item prop="approveReason" label="鐢宠浜嬬敱" required>
+        <u-input
+          v-model="form.approveReason"
+          type="textarea"
+          rows="2"
+          auto-height
+          maxlength="200"
+          placeholder="璇疯緭鍏ョ敵璇蜂簨鐢�"
+          show-word-limit
+        />
+      </u-form-item>
+      <u-form-item prop="approveDeptName" label="鐢宠閮ㄩ棬" required>
+        <u-input
+          v-model="form.approveDeptName"
+          readonly
+          placeholder="璇烽�夋嫨鐢宠閮ㄩ棬"
+          @click="showPicker = true"
+        />
+        <template #right>
+					<up-icon
+						name="arrow-right"
 						@click="showPicker = true"
-						required
-					/>
-          <van-field
-            v-model="form.approveUserName"
-            name="taxPrice"
-            label="鐢宠浜�"
-            placeholder="璇疯緭鍏ョ敵璇蜂汉"
-            :rules="[{ required: true, message: '鐢宠浜轰笉鑳戒负绌�' }]"
-            required
+					></up-icon>
+				</template>
+      </u-form-item>
+      <u-form-item prop="approveUser" label="鐢宠浜�" required>
+        <u-input
+          v-model="form.approveUserName"
+          placeholder="璇疯緭鍏ョ敵璇蜂汉"
+          readonly
+        />
+      </u-form-item>
+      <u-form-item prop="approveTime" label="鐢宠鏃ユ湡" required>
+        <u-input
+          v-model="form.approveTime"
+          readonly
+          placeholder="璇烽�夋嫨"
+          @click="showDatePicker"
+        />
+      </u-form-item>
+      
+      <!-- approveType=2 璇峰亣鐩稿叧瀛楁 -->
+      <template v-if="approveType === 2">
+        <u-form-item prop="startDate" label="璇峰亣寮�濮嬫椂闂�" required>
+          <u-input
+            v-model="form.startDate"
             readonly
+            placeholder="璇烽�夋嫨寮�濮嬫椂闂�"
+            @click="showStartDatePicker"
           />
-          <van-popup
-            v-model:show="showPicker"
-            position="bottom"
-          >
-            <van-picker
-              :columns="productOptions"
-              :model-value="pickerValue"
-              @confirm="onConfirm"
-              @cancel="showPicker = false"
-            />
-          </van-popup>
-					<van-field
-						v-model="form.approveTime"
-						label="鐢宠鏃ユ湡"
-						placeholder="璇烽�夋嫨"
-						readonly
-						required
-						@click="showDatePicker"
-						:rules="[{ required: true, message: '璇烽�夋嫨鏉ユ鏃ユ湡' }]"
-					/>
-					<!-- 鏃ユ湡閫夋嫨鍣� -->
-					<van-popup v-model:show="showDate" position="bottom">
-						<van-date-picker
-							v-model="currentDate"
-							title="閫夋嫨鏃ユ湡"
-							@confirm="onDateConfirm"
-							@cancel="showDate = false"
-						/>
-					</van-popup>
-        </van-cell-group>
-      </van-form>
-    </view>
+        </u-form-item>
+        <u-form-item prop="endDate" label="璇峰亣缁撴潫鏃堕棿" required>
+          <u-input
+            v-model="form.endDate"
+            readonly
+            placeholder="璇烽�夋嫨缁撴潫鏃堕棿"
+            @click="showEndDatePicker"
+          />
+        </u-form-item>
+      </template>
+      
+      <!-- approveType=3 鍑哄樊鐩稿叧瀛楁 -->
+      <u-form-item v-if="approveType === 3" prop="location" label="鍑哄樊鍦扮偣" required>
+        <u-input
+          v-model="form.location"
+          placeholder="璇疯緭鍏ュ嚭宸湴鐐�"
+          clearable
+        />
+      </u-form-item>
+      
+      <!-- approveType=4 鎶ラ攢鐩稿叧瀛楁 -->
+      <u-form-item v-if="approveType === 4" prop="price" label="鎶ラ攢閲戦" required>
+        <u-input
+          v-model="form.price"
+          type="number"
+          placeholder="璇疯緭鍏ユ姤閿�閲戦"
+          clearable
+        />
+      </u-form-item>
+    </u-form>
+
+    <!-- 閫夋嫨鍣ㄥ脊绐� -->
+    <up-action-sheet
+      :show="showPicker"
+      :actions="productOptions"
+      title="閫夋嫨閮ㄩ棬"
+      @select="onConfirm"
+      @close="showPicker = false"
+    />
+
+    <!-- 鏃ユ湡閫夋嫨鍣� -->
+    <up-popup :show="showDate" mode="bottom" @close="showDate = false">
+      <up-datetime-picker
+        :show="true"
+        v-model="currentDate"
+        @confirm="onDateConfirm"
+        @cancel="showDate = false"
+        mode="date"
+      />
+    </up-popup>
+    
+    <!-- 璇峰亣寮�濮嬫椂闂撮�夋嫨鍣� -->
+    <up-popup :show="showStartDate" mode="bottom" @close="showStartDate = false">
+      <up-datetime-picker
+        :show="true"
+        v-model="startDateValue"
+        @confirm="onStartDateConfirm"
+        @cancel="showStartDate = false"
+        mode="date"
+      />
+    </up-popup>
+    
+    <!-- 璇峰亣缁撴潫鏃堕棿閫夋嫨鍣� -->
+    <up-popup :show="showEndDate" mode="bottom" @close="showEndDate = false">
+      <up-datetime-picker
+        :show="true"
+        v-model="endDateValue"
+        @confirm="onEndDateConfirm"
+        @cancel="showEndDate = false"
+        mode="date"
+      />
+    </up-popup>
     <!-- 瀹℃牳娴佺▼鍖哄煙 -->
     <view class="approval-process">
       <view class="approval-header">
@@ -107,14 +161,14 @@
       </view>
 
       <view class="add-step-btn">
-				<van-button icon="plus" plain type="primary" style="width: 100%" @click="addApprovalStep">鏂板鑺傜偣</van-button>
+			<u-button icon="plus" plain type="primary" style="width: 100%" @click="addApprovalStep">鏂板鑺傜偣</u-button>
       </view>
     </view>
 
     <!-- 搴曢儴鎸夐挳 -->
     <view class="footer-btns">
-      <van-button class="cancel-btn" @click="goBack">鍙栨秷</van-button>
-      <van-button class="save-btn" @click="submitForm">淇濆瓨</van-button>
+      <u-button class="cancel-btn" @click="goBack">鍙栨秷</u-button>
+      <u-button class="save-btn" @click="submitForm">淇濆瓨</u-button>
     </view>
   </view>
 </template>
@@ -123,8 +177,14 @@
 import { ref, onMounted, onUnmounted, reactive, toRefs } from "vue";
 import PageHeader from "@/components/PageHeader.vue";
 import useUserStore from "@/store/modules/user";
+import { formatDateToYMD } from '@/utils/ruoyi'
 import {getDept, approveProcessGetInfo, approveProcessAdd, approveProcessUpdate} from "@/api/collaborativeApproval/approvalProcess";
-import { showToast } from 'vant'
+const showToast = (message) => {
+	uni.showToast({
+		title: message,
+		icon: 'none'
+	})
+}
 import {userListNoPageByTenantId} from "@/api/system/user";
 
 const data = reactive({
@@ -138,20 +198,26 @@
 		approveReason: "",
 		checkResult: "",
 		tempFileIds: [],
-		approverList: [] // 鏂板瀛楁锛屽瓨鍌ㄦ墍鏈夎妭鐐圭殑瀹℃壒浜篿d
+		approverList: [], // 鏂板瀛楁锛屽瓨鍌ㄦ墍鏈夎妭鐐圭殑瀹℃壒浜篿d
+		startDate: "",
+		endDate: "",
+		location: "",
+		price: ""
 	},
 	rules: {
 		approveTime: [{ required: false, message: "璇疯緭鍏�", trigger: "change" },],
 		approveId: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
-		approveUser: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
 		approveDeptId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
 		approveReason: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
 		checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+		startDate: [{ required: false, message: "璇烽�夋嫨寮�濮嬫椂闂�", trigger: "change" }],
+		endDate: [{ required: false, message: "璇烽�夋嫨缁撴潫鏃堕棿", trigger: "change" }],
+		location: [{ required: false, message: "璇疯緭鍏ュ嚭宸湴鐐�", trigger: "blur" }],
+		price: [{ required: false, message: "璇疯緭鍏ユ姤閿�閲戦", trigger: "blur" }],
 	},
 });
 const { form, rules } = toRefs(data);
 const result = ref("");
-const pickerValue = ref([]);
 const showPicker = ref(false);
 const productOptions = ref([]);
 const operationType = ref("");
@@ -161,14 +227,19 @@
 const formRef = ref(null);
 const message = ref("");
 const showDate = ref(false)
-const currentDate = ref([new Date().getFullYear(), new Date().getMonth() + 1, new Date().getDate()])
+const currentDate = ref(Date.now())
+const showStartDate = ref(false)
+const startDateValue = ref(Date.now())
+const showEndDate = ref(false)
+const endDateValue = ref(Date.now())
 const userStore = useUserStore()
+const approveType = ref(0)
 
 const getProductOptions = () => {
 	getDept().then((res) => {
 		productOptions.value = res.data.map(item => ({
 			value: item.deptId,
-			text: item.deptName
+			name: item.deptName
 		}))
 	});
 };
@@ -185,11 +256,9 @@
 		form.value.approveUserName = userStore.nickName
 		form.value.approveTime = getCurrentDate();
 		
-		// 鑾峰彇URL鍙傛暟
-		const pages = getCurrentPages();
-		const currentPage = pages[pages.length - 1];
-		const options = currentPage && currentPage.options ? currentPage.options : {};
-		operationType.value = options.operationType || 'add';
+		// 浠庢湰鍦板瓨鍌ㄨ幏鍙栧弬鏁�
+		operationType.value = uni.getStorageSync('operationType') || 'add';
+		approveType.value = uni.getStorageSync('approveType') || 0;
 		
 		// 濡傛灉鏄紪杈戞ā寮忥紝浠庢湰鍦板瓨鍌ㄨ幏鍙栨暟鎹�
 		if (operationType.value === 'edit') {
@@ -240,16 +309,23 @@
   uni.$off('selectContact', handleSelectContact);
 });
 
-const onConfirm = ({ selectedValues, selectedOptions }) => {
-  form.value.approveDeptName = selectedOptions[0]?.text;
-  form.value.approveDeptId = selectedOptions[0]?.value;
-  pickerValue.value = selectedValues;
+const onConfirm = (item) => {
+  // 璁剧疆閫変腑鐨勯儴闂�
+  form.value.approveDeptName = item.name;
+  // 纭繚璁剧疆鐨勬槸瀛楃涓茬被鍨嬬殑閮ㄩ棬ID
+  form.value.approveDeptId = String(item.value || '');
+  console.log('閮ㄩ棬閫夋嫨鍚庣殑鍊�:', {
+    approveDeptId: form.value.approveDeptId,
+    approveDeptName: form.value.approveDeptName
+  });
   showPicker.value = false;
 };
 
 const goBack = () => {
 	// 娓呴櫎鏈湴瀛樺偍鐨勬暟鎹�
+  uni.removeStorageSync('operationType');
 	uni.removeStorageSync('invoiceLedgerEditRow');
+	uni.removeStorageSync('approveType');
   uni.navigateBack();
 };
 
@@ -261,38 +337,59 @@
     return;
   }
   
-  formRef.value.validate().then(() => {
-    // 琛ㄥ崟鏍¢獙閫氳繃锛屽彲浠ユ彁浜ゆ暟鎹�
-		// 鏀堕泦鎵�鏈夎妭鐐圭殑瀹℃壒浜篿d
-		console.log('approverNodes---', approverNodes.value)
-		form.value.approveUserIds = approverNodes.value.map(node => node.userId).join(',')
-		form.value.approveType = 0
-		if (operationType.value === "add" || currentApproveStatus.value == 3) {
-			approveProcessAdd(form.value).then(res => {
-				showToast("鎻愪氦鎴愬姛");
-				goBack()
-			})
-		} else {
-			approveProcessUpdate(form.value).then(res => {
-				showToast("鎻愪氦鎴愬姛");
-				goBack()
-			})
-		}
+  // 鎵嬪姩妫�鏌ュ繀濉瓧娈碉紝闃叉鍥犳暟鎹被鍨嬮棶棰樺鑷寸殑鏍¢獙澶辫触
+  if (!form.value.approveReason || !form.value.approveReason.trim()) {
+    showToast('璇疯緭鍏ョ敵璇蜂簨鐢�');
+    return;
+  }
+  
+  if (!form.value.approveDeptId || String(form.value.approveDeptId).trim() === '') {
+    showToast('璇烽�夋嫨鐢宠閮ㄩ棬');
+    return;
+  }
+  
+  if (!form.value.approveTime) {
+    showToast('璇烽�夋嫨鐢宠鏃ユ湡');
+    return;
+  }
+  
+  formRef.value.validate().then((valid) => {
+    if (valid) {
+      // 琛ㄥ崟鏍¢獙閫氳繃锛屽彲浠ユ彁浜ゆ暟鎹�
+	  // 鏀堕泦鎵�鏈夎妭鐐圭殑瀹℃壒浜篿d
+	  console.log('approverNodes---', approverNodes.value)
+	  form.value.approveUserIds = approverNodes.value.map(node => node.userId).join(',')
+	  form.value.approveType = approveType.value
+	  if (operationType.value === "add" || currentApproveStatus.value == 3) {
+		approveProcessAdd(form.value).then(res => {
+		  showToast("鎻愪氦鎴愬姛");
+		  goBack()
+		})
+	  } else {
+		approveProcessUpdate(form.value).then(res => {
+		  showToast("鎻愪氦鎴愬姛");
+		  goBack()
+		})
+	  }
+    }
   }).catch((error) => {
     console.error("琛ㄥ崟鏍¢獙澶辫触:", error);
-    // 鏄剧ず鍏蜂綋鐨勯敊璇俊鎭�
-    if (error.length > 0) {
-      const firstError = error[0];
-      uni.showToast({
-        title: firstError.message || '琛ㄥ崟鏍¢獙澶辫触',
-        icon: 'none'
-      });
-    } else {
-      uni.showToast({
-        title: '琛ㄥ崟鏍¢獙澶辫触锛岃妫�鏌ュ繀濉」',
-        icon: 'none'
-      });
+    // 灏濊瘯鑾峰彇鍏蜂綋鐨勯敊璇瓧娈�
+    if (error && error.errors) {
+      const firstError = error.errors[0];
+      if (firstError) {
+        uni.showToast({
+          title: firstError.message || '琛ㄥ崟鏍¢獙澶辫触锛岃妫�鏌ュ繀濉」',
+          icon: 'none'
+        });
+        return;
+      }
     }
+    // 鏄剧ず閫氱敤閿欒淇℃伅
+    uni.showToast({
+      title: '琛ㄥ崟鏍¢獙澶辫触锛岃妫�鏌ュ繀濉」',
+      icon: 'none'
+    });
   });
 };
 
@@ -306,8 +403,9 @@
 
 const addApprover = (stepIndex) => {
   // 璺宠浆鍒拌仈绯讳汉閫夋嫨椤甸潰
+  uni.setStorageSync('stepIndex', stepIndex);
   uni.navigateTo({
-    url: `/pages/cooperativeOffice/collaborativeApproval/contactSelect?stepIndex=${stepIndex}`
+    url: "/pages/cooperativeOffice/collaborativeApproval/contactSelect"
   });
 };
 
@@ -339,11 +437,33 @@
 }
 
 // 纭鏃ユ湡閫夋嫨
-const onDateConfirm = ({ selectedValues }) => {
-	form.value.approveTime = selectedValues.join('-')
-	currentDate.value = selectedValues
-	showDate.value = false
+const onDateConfirm = (e) => {
+  form.value.approveTime = formatDateToYMD(e.value)
+	currentDate.value = formatDateToYMD(e.value)
+	showDate.value = false;
 }
+
+// 鏄剧ず璇峰亣寮�濮嬫椂闂撮�夋嫨鍣�
+const showStartDatePicker = () => {
+	showStartDate.value = true
+}
+
+// 纭璇峰亣寮�濮嬫椂闂撮�夋嫨
+const onStartDateConfirm = (e) => {
+  form.value.startDate = formatDateToYMD(e.value)
+	showStartDate.value = false
+}
+
+const showEndDatePicker = () => {
+	showEndDate.value = true
+}
+
+// 纭璇峰亣缁撴潫鏃堕棿閫夋嫨
+const onEndDateConfirm = (e) => {
+  form.value.endDate = formatDateToYMD(e.value)
+	showEndDate.value = false
+}
+
 // 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
 function getCurrentDate() {
 	const today = new Date();
@@ -352,37 +472,11 @@
 	const day = String(today.getDate()).padStart(2, "0");
 	return `${year}-${month}-${day}`;
 }
+
 </script>
 
 <style scoped lang="scss">
-.account-detail {
-  min-height: 100vh;
-  background: #f8f9fa;
-  padding-bottom: 80px;
-}
-
-.header {
-  display: flex;
-  align-items: center;
-  background: #fff;
-  padding: 16px 20px;
-  border-bottom: 1px solid #f0f0f0;
-  position: sticky;
-  top: 0;
-  z-index: 100;
-}
-
-.title {
-  flex: 1;
-  text-align: center;
-  font-size: 18px;
-  font-weight: 600;
-  color: #333;
-}
-
-.form-section {
-  margin-top: 16px;
-}
+@import '@/static/scss/form-common.scss';
 
 .approval-process {
   background: #fff;

--
Gitblit v1.9.3