From dfe413e25a9684a2d0efedbf26603bc0e48da9bb Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 13 八月 2025 13:20:24 +0800
Subject: [PATCH] 1.销售台账模块开发联调

---
 src/pages.json                          |    7 +
 src/pages/sales/salesAccount/view.vue   |  311 ++++++++++++++++++++++++++++++++++++++++++++
 src/pages/sales/salesAccount/detail.vue |   16 +
 src/config.js                           |    4 
 src/pages/sales/salesAccount/index.vue  |   71 ++++++---
 5 files changed, 377 insertions(+), 32 deletions(-)

diff --git a/src/config.js b/src/config.js
index 47daed0..65baaa4 100644
--- a/src/config.js
+++ b/src/config.js
@@ -1,7 +1,7 @@
 // 搴旂敤鍏ㄥ眬閰嶇疆
 const config = {
-  // baseUrl: 'http://114.132.189.42:8089', // 娴嬭瘯搴�
-  baseUrl: 'http://192.168.1.147:7003', // 鏈湴鑱旇皟
+  baseUrl: 'http://114.132.189.42:8089', // 娴嬭瘯搴�
+  // baseUrl: 'http://192.168.1.147:7003', // 鏈湴鑱旇皟
    //cloud鍚庡彴缃戝叧鍦板潃
   //  baseUrl: 'http://192.168.10.3:8080',
    // 搴旂敤淇℃伅
diff --git a/src/pages.json b/src/pages.json
index ef5ee74..491f7f1 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -59,6 +59,13 @@
     {
       "path": "pages/sales/salesAccount/detail",
       "style": {
+        "navigationBarTitleText": "淇敼鍙拌处",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/sales/salesAccount/view",
+      "style": {
         "navigationBarTitleText": "鍙拌处璇︽儏",
         "navigationStyle": "custom"
       }
diff --git a/src/pages/sales/salesAccount/detail.vue b/src/pages/sales/salesAccount/detail.vue
index 56c92a9..d5b2522 100644
--- a/src/pages/sales/salesAccount/detail.vue
+++ b/src/pages/sales/salesAccount/detail.vue
@@ -58,9 +58,9 @@
 			</van-popup>
 			<van-field label="浠樻鏂瑰紡" name="paymentMethod" borderBottom="true" v-model="form.paymentMethod" placeholder="璇疯緭鍏ヤ粯娆炬柟寮�">
 			</van-field>
-			<van-field label="褰曞叆浜�" name="entryPersonName" borderBottom="true" v-model="form.entryPersonName" placeholder="璇疯緭鍏�" readonly>
+			<van-field label="褰曞叆浜�" name="entryPersonName" borderBottom="true" v-model="form.entryPersonName" placeholder="璇疯緭鍏�" disabled>
 			</van-field>
-			<van-field label="褰曞叆鏃ユ湡" name="entryDate" borderBottom="true" v-model="form.entryDate" placeholder="璇疯緭鍏�" readonly>
+			<van-field label="褰曞叆鏃ユ湡" name="entryDate" borderBottom="true" v-model="form.entryDate" placeholder="璇疯緭鍏�" disabled>
 			</van-field>
 			<van-popup v-model:show="showPicker" destroy-on-close position="bottom">
 				<van-picker
@@ -129,7 +129,7 @@
 			<view class="product-section">
 				<view class="section-header">
 					<text class="section-title">浜у搧淇℃伅</text>
-					<van-button type="primary" size="small" @click="addProduct" class="add-btn" icon="plus">鏂板</van-button>
+					<van-button type="primary" size="small" @click="addProduct" class="add-btn" icon="plus"  v-if="operationType !== 'view'">鏂板</van-button>
 				</view>
 				<view class="product-card" v-for="(product, idx) in productData" :key="idx">
 					<!-- 浜у搧绫� -->
@@ -139,7 +139,7 @@
 							<text class="product-productCategory">浜у搧 {{ idx + 1 }}</text>
 						</view>
 						<!-- 鎿嶄綔鎸夐挳 -->
-						<view class="product-actions">
+						<view class="product-actions"  v-if="operationType !== 'view'">
 							<van-button type="danger" size="mini" @click="removeProduct(idx)" class="del-btn" icon="delete">鍒犻櫎</van-button>
 						</view>
 					</view>
@@ -258,7 +258,7 @@
 					</view>
 				</view>
 			</view>
-			<view class="footer-btns">
+			<view class="footer-btns" v-if="operationType !== 'view'">
 				<van-button class="cancel-btn" @click="goBack">鍙栨秷</van-button>
 				<van-button class="save-btn" native-type="submit" form-type="submit">淇濆瓨</van-button>
 			</view>
@@ -343,6 +343,9 @@
 ]);
 
 const addProduct = () => {
+	if (productData.value === null) {
+		productData.value = []
+	}
 	productData.value.push({
     productCategory: '',
     specificationModel: '',
@@ -596,6 +599,7 @@
 			title: '璇锋坊鍔犱骇鍝佷俊鎭�',
 			icon: 'none'
 		});
+		return
 	}
 	form.value.type = 1;
 	addOrUpdateSalesLedger(form.value).then((res) => {
@@ -724,7 +728,7 @@
 		try {
 			editData.value = JSON.parse(editDataStr);
 			// 濡傛灉鏄紪杈戞ā寮忥紝绛夊緟鏁版嵁鍔犺浇瀹屾垚鍚庡~鍏呰〃鍗曟暟鎹�
-			if (operationType.value === 'edit' && editData.value) {
+			if (operationType.value !== 'add' && editData.value) {
 				// 浣跨敤 nextTick 纭繚鏁版嵁鍔犺浇瀹屾垚鍚庡啀濉厖
 				setTimeout(() => {
 					fillFormData();
diff --git a/src/pages/sales/salesAccount/index.vue b/src/pages/sales/salesAccount/index.vue
index 7f93241..336e593 100644
--- a/src/pages/sales/salesAccount/index.vue
+++ b/src/pages/sales/salesAccount/index.vue
@@ -102,6 +102,8 @@
 import { ref } from 'vue';
 import { onShow } from '@dcloudio/uni-app';
 import {ledgerListPage} from "@/api/salesManagement/salesLedger";
+import useUserStore from "@/store/modules/user";
+const userStore = useUserStore()
 
 // 鎼滅储鍏抽敭璇�
 const searchKeyword = ref('');
@@ -127,33 +129,54 @@
 			// tableLoading.value = false;
 	});
 };
-// 鏄剧ず绛涢�夐�夐」
-const showFilterOptions = () => {
-	uni.showActionSheet({
-		itemList: ['鎸夋棩鏈熺瓫閫�', '鎸夌姸鎬佺瓫閫�', '鎸夐噾棰濈瓫閫�'],
-		success: (res) => {
-			console.log('閫夋嫨浜嗙瓫閫夐�夐」:', res.tapIndex);
-		}
-	});
-};
 
-// 鐐瑰嚮鍒楄〃椤�
-const handleItemClick = (item) => {
-	uni.showToast({
-		title: `鏌ョ湅鍚堝悓: ${item.contractId}`,
-		icon: 'none'
-	});
-};
-
-// 娣诲姞鏂拌褰�
+// 澶勭悊鍙拌处淇℃伅鎿嶄綔锛堟煡鐪�/缂栬緫/鏂板锛�
 const handleInfo = (type, row) => {
-  uni.setStorageSync('operationType', type);
-  if (row) {
-    uni.setStorageSync('editData', JSON.stringify(row));
+  try {
+    // 璁剧疆鎿嶄綔绫诲瀷
+    uni.setStorageSync('operationType', type);
+    
+    // 濡傛灉鏄煡鐪嬫垨缂栬緫鎿嶄綔
+    if (type !== 'add') {
+      // 楠岃瘉琛屾暟鎹槸鍚﹀瓨鍦�
+      if (!row) {
+        uni.showToast({
+          title: '鏁版嵁涓嶅瓨鍦�',
+          icon: 'error'
+        });
+        return;
+      }
+      
+      // 妫�鏌ユ潈闄愶細鍙湁褰曞叆浜烘墠鑳界紪杈�
+      if (row.entryPerson !== userStore.id) {
+        // 闈炲綍鍏ヤ汉璺宠浆鍒板彧璇昏鎯呴〉闈�
+        uni.setStorageSync('editData', JSON.stringify(row));
+        uni.navigateTo({
+          url: '/pages/sales/salesAccount/view'
+        });
+        return;
+      }
+      
+      // 褰曞叆浜虹紪杈戯細瀛樺偍鏁版嵁骞惰烦杞埌缂栬緫椤甸潰
+      uni.setStorageSync('editData', JSON.stringify(row));
+      uni.navigateTo({
+        url: '/pages/sales/salesAccount/detail'
+      });
+      return;
+    }
+    
+    // 鏂板鎿嶄綔锛氱洿鎺ヨ烦杞埌缂栬緫椤甸潰
+    uni.navigateTo({
+      url: '/pages/sales/salesAccount/detail'
+    });
+    
+  } catch (error) {
+    console.error('澶勭悊鍙拌处淇℃伅鎿嶄綔澶辫触:', error);
+    uni.showToast({
+      title: '鎿嶄綔澶辫触锛岃閲嶈瘯',
+      icon: 'error'
+    });
   }
-  uni.navigateTo({
-    url: '/pages/sales/salesAccount/detail'
-  });
 };
 
 onShow(() => {
diff --git a/src/pages/sales/salesAccount/view.vue b/src/pages/sales/salesAccount/view.vue
new file mode 100644
index 0000000..99a76b2
--- /dev/null
+++ b/src/pages/sales/salesAccount/view.vue
@@ -0,0 +1,311 @@
+<template>
+  <view class="account-view">
+    <!-- 椤堕儴鏍囬鏍� -->
+    <view class="header">
+      <up-icon name="arrow-left" size="20" color="#333" @click="goBack" />
+      <text class="title">鍙拌处璇︽儏</text>
+    </view>
+
+    <!-- 鍩烘湰淇℃伅灞曠ず -->
+    <view class="info-section">
+      <view class="section-title">鍩烘湰淇℃伅</view>
+      <view class="info-grid">
+        <view class="info-item">
+          <text class="info-label">閿�鍞悎鍚屽彿</text>
+          <text class="info-value">{{ form.salesContractNo }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">瀹㈡埛鍚堝悓鍙�</text>
+          <text class="info-value highlight">{{ form.customerContractNo }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">瀹㈡埛鍚嶇О</text>
+          <text class="info-value">{{ form.customerName }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">涓氬姟鍛�</text>
+          <text class="info-value">{{ form.salesman }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">椤圭洰鍚嶇О</text>
+          <text class="info-value">{{ form.projectName }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">绛捐鏃ユ湡</text>
+          <text class="info-value">{{ form.executionDate }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">浠樻鏂瑰紡</text>
+          <text class="info-value">{{ form.paymentMethod }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">褰曞叆浜�</text>
+          <text class="info-value">{{ form.entryPersonName }}</text>
+        </view>
+        <view class="info-item">
+          <text class="info-label">褰曞叆鏃ユ湡</text>
+          <text class="info-value">{{ form.entryDate }}</text>
+        </view>
+      </view>
+    </view>
+
+    <!-- 浜у搧淇℃伅灞曠ず -->
+    <view class="product-section" v-if="productData && productData.length > 0">
+      <view class="section-title">浜у搧淇℃伅</view>
+      <view class="product-card" v-for="(product, idx) in productData" :key="idx">
+        <view class="product-header">
+          <view class="product-title">
+            <van-icon name="description" color="#2979ff" size="15" />
+            <text class="product-productCategory">浜у搧 {{ idx + 1 }}</text>
+          </view>
+        </view>
+        
+        <view class="product-info">
+          <view class="info-grid">
+            <view class="info-item">
+              <text class="info-label">浜у搧澶х被</text>
+              <text class="info-value">{{ product.productCategory }}</text>
+            </view>
+            <view class="info-item">
+              <text class="info-label">瑙勬牸鍨嬪彿</text>
+              <text class="info-value">{{ product.specificationModel }}</text>
+            </view>
+            <view class="info-item">
+              <text class="info-label">鍗曚綅</text>
+              <text class="info-value">{{ product.unit }}</text>
+            </view>
+            <view class="info-item">
+              <text class="info-label">绋庣巼(%)</text>
+              <text class="info-value">{{ product.taxRate }}</text>
+            </view>
+            <view class="info-item">
+              <text class="info-label">鍚◣鍗曚环(鍏�)</text>
+              <text class="info-value highlight">{{ product.taxInclusiveUnitPrice }}</text>
+            </view>
+            <view class="info-item">
+              <text class="info-label">鏁伴噺</text>
+              <text class="info-value highlight">{{ product.quantity }}</text>
+            </view>
+            <view class="info-item">
+              <text class="info-label">鍚◣鎬讳环(鍏�)</text>
+              <text class="info-value highlight">{{ product.taxInclusiveTotalPrice }}</text>
+            </view>
+            <view class="info-item">
+              <text class="info-label">涓嶅惈绋庢�讳环(鍏�)</text>
+              <text class="info-value highlight">{{ product.taxExclusiveTotalPrice }}</text>
+            </view>
+            <view class="info-item">
+              <text class="info-label">鍙戠エ绫诲瀷</text>
+              <text class="info-value">{{ product.invoiceType }}</text>
+            </view>
+          </view>
+        </view>
+      </view>
+    </view>
+
+    <!-- 鏃犱骇鍝佷俊鎭彁绀� -->
+    <view class="no-product" v-else>
+      <text>鏆傛棤浜у搧淇℃伅</text>
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { onMounted, ref } from 'vue';
+import { getSalesLedgerWithProducts } from "@/api/salesManagement/salesLedger";
+
+// 琛ㄥ崟鏁版嵁
+const form = ref({
+  id: '',
+  salesContractNo: '',
+  customerContractNo: '',
+  customerId: '',
+  customerName: '',
+  projectName: '',
+  executionDate: '',
+  paymentMethod: '',
+  entryPerson: '',
+  entryPersonName: '',
+  entryDate: '',
+  salesman: ''
+});
+
+// 浜у搧鏁版嵁
+const productData = ref([]);
+
+// 缂栬緫鏁版嵁
+const editData = ref(null);
+
+// 杩斿洖涓婁竴椤�
+const goBack = () => {
+  // 娓呯悊鏈湴瀛樺偍鐨勬暟鎹�
+  uni.removeStorageSync('editData');
+  uni.navigateBack();
+};
+
+// 濉厖琛ㄥ崟鏁版嵁
+const fillFormData = () => {
+  if (!editData.value) return;
+  
+  // 鑾峰彇瀹屾暣鐨勪骇鍝佷俊鎭�
+  getSalesLedgerWithProducts({ id: editData.value.id, type: 1 }).then((res) => {
+    productData.value = res.productData || [];
+  });
+  
+  // 濉厖鍩烘湰淇℃伅
+  form.value.salesContractNo = editData.value.salesContractNo || '';
+  form.value.customerContractNo = editData.value.customerContractNo || '';
+  form.value.customerName = editData.value.customerName || '';
+  form.value.projectName = editData.value.projectName || '';
+  form.value.executionDate = editData.value.executionDate || '';
+  form.value.paymentMethod = editData.value.paymentMethod || '';
+  form.value.salesman = editData.value.salesman || '';
+  form.value.entryPerson = editData.value.entryPerson || '';
+  form.value.entryPersonName = editData.value.entryPersonName || '';
+  form.value.entryDate = editData.value.entryDate || '';
+  form.value.id = editData.value.id || '';
+  form.value.customerId = editData.value.customerId || '';
+};
+
+onMounted(() => {
+  // 鑾峰彇缂栬緫鏁版嵁骞跺~鍏呰〃鍗�
+  const editDataStr = uni.getStorageSync('editData');
+  if (editDataStr) {
+    try {
+      editData.value = JSON.parse(editDataStr);
+      // 浣跨敤 nextTick 纭繚鏁版嵁鍔犺浇瀹屾垚鍚庡啀濉厖
+      setTimeout(() => {
+        fillFormData();
+      }, 100);
+    } catch (error) {
+      console.error('瑙f瀽缂栬緫鏁版嵁澶辫触:', error);
+    }
+  }
+});
+</script>
+
+<style scoped lang="scss">
+.account-view {
+  min-height: 100vh;
+  background: #f8f9fa;
+  padding-bottom: 2rem;
+}
+
+.header {
+  display: flex;
+  align-items: center;
+  background: #fff;
+  padding: 1rem 1.25rem;
+  border-bottom: 0.0625rem solid #f0f0f0;
+  position: sticky;
+  top: 0;
+  z-index: 100;
+  /* 鍏煎 iOS 鍒樻捣/鐏靛姩宀涘畨鍏ㄥ尯 */
+  padding-top: env(safe-area-inset-top);
+}
+
+.title {
+  flex: 1;
+  text-align: center;
+  font-size: 1.125rem;
+  font-weight: 600;
+  color: #333;
+}
+
+.info-section {
+  background: #fff;
+  margin: 1rem;
+  padding: 1rem;
+  border-radius: 0.5rem;
+  box-shadow: 0 0.125rem 0.5rem rgba(0,0,0,0.04);
+}
+
+.section-title {
+  font-size: 1rem;
+  font-weight: 600;
+  color: #333;
+  margin-bottom: 1rem;
+  padding-bottom: 1rem;
+  border-bottom: 0.0625rem solid #e8e8e8;
+}
+
+.info-grid {
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+  gap: 0.75rem;
+}
+
+.info-item {
+  display: flex;
+  flex-direction: column;
+  gap: 0.25rem;
+}
+
+.info-label {
+  font-size: 0.75rem;
+  color: #666;
+  font-weight: 400;
+}
+
+.info-value {
+  font-size: 0.875rem;
+  color: #333;
+  font-weight: 500;
+}
+
+.info-value.highlight {
+  color: #2979ff;
+  font-weight: 600;
+}
+
+.product-section {
+  background: #fff;
+  margin: 1rem;
+  padding: 1rem;
+  border-radius: 0.5rem;
+  box-shadow: 0 0.125rem 0.5rem rgba(0,0,0,0.04);
+}
+
+.product-card {
+  background: #f8f9fa;
+  border-radius: 0.5rem;
+  padding: 1rem;
+  margin-bottom: 1rem;
+}
+
+.product-card:last-child {
+  margin-bottom: 0;
+}
+
+.product-header {
+  display: flex;
+  align-items: center;
+  padding-bottom: 0.75rem;
+  border-bottom: 0.0625rem solid #e8e8e8;
+  margin-bottom: 1rem;
+}
+
+.product-title {
+  display: flex;
+  align-items: center;
+  gap: 0.5rem;
+}
+
+.product-productCategory {
+  font-size: 0.875rem;
+  font-weight: 500;
+  color: #333;
+}
+
+.product-info .info-grid {
+  grid-template-columns: 1fr 1fr;
+  gap: 0.5rem;
+}
+
+.no-product {
+  text-align: center;
+  padding: 2rem;
+  color: #999;
+  font-size: 0.875rem;
+}
+</style>

--
Gitblit v1.9.3