From 94c29f755a210eb4967f3f286de00caa2b162f25 Mon Sep 17 00:00:00 2001
From: llj <132905093+newwwwwwtree@users.noreply.github.com>
Date: 星期一, 02 二月 2026 09:57:29 +0800
Subject: [PATCH] 客诉处理单

---
 pages/CustomerComplaintsBill/CustomerComplaintsBillEdit.vue   | 1093 ++++++++++++++++++++++++++
 pages/CustomerComplaintsBill/CustomerComplaintsBillDetail.vue |  742 +++++++++++++++++
 pages/CustomerComplaintsBill/CustomerComplaintsBillList.vue   |  618 ++++++++++++++
 pages.json                                                    |   21 
 pages/index/tab4.vue                                          |    7 
 5 files changed, 2,481 insertions(+), 0 deletions(-)

diff --git a/pages.json b/pages.json
index ae32e70..6a34ef1 100644
--- a/pages.json
+++ b/pages.json
@@ -1723,6 +1723,27 @@
 		    {
 		        "navigationBarTitleText" : "鐗规壒鍗�"
 		    }
+		},
+		{
+		    "path" : "pages/CustomerComplaintsBill/CustomerComplaintsBillList",
+		    "style" : 
+		    {
+		        "navigationBarTitleText" : "瀹㈣瘔鍗曞垪琛�"
+		    }
+		},
+		{
+		    "path" : "pages/CustomerComplaintsBill/CustomerComplaintsBillDetail",
+		    "style" : 
+		    {
+		        "navigationBarTitleText" : "瀹㈣瘔鍗�"
+		    }
+		},
+		{
+		    "path" : "pages/CustomerComplaintsBill/CustomerComplaintsBillEdit",
+		    "style" : 
+		    {
+		        "navigationBarTitleText" : "瀹㈣瘔鍗曠紪杈�"
+		    }
 		}
 		
 
diff --git a/pages/CustomerComplaintsBill/CustomerComplaintsBillDetail.vue b/pages/CustomerComplaintsBill/CustomerComplaintsBillDetail.vue
new file mode 100644
index 0000000..8364894
--- /dev/null
+++ b/pages/CustomerComplaintsBill/CustomerComplaintsBillDetail.vue
@@ -0,0 +1,742 @@
+<template>
+	<view class="container">
+		<view class="header">
+			<view class="title">瀹㈣瘔澶勭悊鍗曟槑缁�</view>
+			<view class="sub-title">{{ HBillNo }}</view>
+		</view>		
+		<!-- Tab鍒囨崲 -->
+		<view class="tab-container">
+			<view class="tabs">
+				<view 
+					class="tab-item" 
+					:class="{'active': currentTab === 0}" 
+					@click="switchTab(0)"
+				>
+					鍩烘湰淇℃伅
+				</view>
+				<view 
+					class="tab-item" 
+					:class="{'active': currentTab === 1}" 
+					@click="switchTab(1)"
+				>
+					瀹℃牳淇℃伅
+				</view>
+				<!-- <view 
+					class="tab-item" 
+					:class="{'active': currentTab === 2}" 
+					@click="switchTab(2)"
+				>
+					鐗╂枡淇℃伅
+				</view> -->
+			</view>
+			<view class="tab-indicator" :style="indicatorStyle"></view>
+		</view>
+		
+		<scroll-view 
+			scroll-y 
+			class="content" 
+			:style="{height: scrollHeight + 'px'}"
+		>
+			<!-- Tab 0: 鍩烘湰淇℃伅 -->
+			<view v-if="currentTab === 0" class="tab-content">
+				<view class="info-card">
+					<view class="card-title">璁㈠崟鍩烘湰淇℃伅</view>
+					<view class="info-grid">
+						<view class="info-item" v-if="orderInfo.鏃ユ湡">
+							<text class="label">鏃ユ湡锛�</text>
+							<text class="value">{{ orderInfo.鏃ユ湡 }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.鍗曟嵁鍙�">
+							<text class="label">鍗曟嵁鍙凤細</text>
+							<text class="value">{{ orderInfo.鍗曟嵁鍙� }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.鍗曟嵁鐘舵��">
+							<text class="label">鍗曟嵁鐘舵�侊細</text>
+							<text class="value">{{ orderInfo.鍗曟嵁鐘舵�� }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.涓婚">
+							<text class="label">涓婚锛�</text>
+							<text class="value">{{ orderInfo.涓婚 }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.璁㈠崟鍙�">
+							<text class="label">璁㈠崟鍙凤細</text>
+							<text class="value">{{ orderInfo.璁㈠崟鍙� }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.涓诲浜�">
+							<text class="label">涓诲浜猴細</text>
+							<text class="value">{{ orderInfo.涓诲浜� }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.瀹㈡湇">
+							<text class="label">瀹㈡湇锛�</text>
+							<text class="value">{{ orderInfo.瀹㈡湇 }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.瀹㈡埛">
+							<text class="label">瀹㈡埛锛�</text>
+							<text class="value">{{ orderInfo.瀹㈡埛 }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.瀹㈡埛鑱旂郴浜�">
+							<text class="label">瀹㈡埛鑱旂郴浜猴細</text>
+							<text class="value">{{ orderInfo.瀹㈡埛鑱旂郴浜� }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.鎶曡瘔鍒嗙被">
+							<text class="label">鎶曡瘔鍒嗙被锛�</text>
+							<text class="value">{{ orderInfo.鎶曡瘔鍒嗙被 }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.鎶曡瘔鏃堕棿">
+							<text class="label">鎶曡瘔鏃堕棿锛�</text>
+							<text class="value">{{ orderInfo.鎶曡瘔鏃堕棿 }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.鍙戠敓鏃堕棿">
+							<text class="label">鍙戠敓鏃堕棿锛�</text>
+							<text class="value">{{ orderInfo.鍙戠敓鏃堕棿 }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.绱ф�ョ▼搴�">
+							<text class="label">绱ф�ョ▼搴︼細</text>
+							<text class="value">{{ orderInfo.绱ф�ョ▼搴� }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.杞﹂棿">
+							<text class="label">杞﹂棿锛�</text>
+							<text class="value">{{ orderInfo.杞﹂棿 }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.瀹屾垚鏁伴噺">
+							<text class="label">瀹屾垚鏁伴噺锛�</text>
+							<text class="value">{{ orderInfo.瀹屾垚鏁伴噺 }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.涓嶈壇鏁伴噺">
+							<text class="label">涓嶈壇鏁伴噺锛�</text>
+							<text class="value">{{ orderInfo.涓嶈壇鏁伴噺 }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.涓嶈壇鍘熷洜">
+							<text class="label">涓嶈壇鍘熷洜锛�</text>
+							<text class="value">{{ orderInfo.涓嶈壇鍘熷洜 }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.闂鏉ユ簮">
+							<text class="label">闂鏉ユ簮锛�</text>
+							<text class="value">{{ orderInfo.闂鏉ユ簮 }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.鍙戠敓宸ュ簭">
+							<text class="label">鍙戠敓宸ュ簭锛�</text>
+							<text class="value">{{ orderInfo.鍙戠敓宸ュ簭 }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.澶勭悊缁撴灉">
+							<text class="label">澶勭悊缁撴灉锛�</text>
+							<text class="value">{{ orderInfo.澶勭悊缁撴灉 }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.鏄惁鍋滅嚎">
+							<text class="label">鏄惁鍋滅嚎锛�</text>
+							<text class="value">{{ orderInfo.鏄惁鍋滅嚎 }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.鏄惁閲嶅鍙戠敓">
+							<text class="label">鏄惁閲嶅鍙戠敓锛�</text>
+							<text class="value">{{ orderInfo.鏄惁閲嶅鍙戠敓 }}</text>
+						</view>
+						<view class="info-item full-width" v-if="orderInfo.鏄惁娑夊強鐗╂枡">
+							<text class="label">鏄惁娑夊強鐗╂枡锛�</text>
+							<text class="value">{{ orderInfo.鏄惁娑夊強鐗╂枡 }}</text>
+						</view>
+					</view>
+				</view>
+			</view>
+			
+			<!-- Tab 1: 瀹℃牳淇℃伅 -->
+			<view v-if="currentTab === 1" class="tab-content">
+				<view class="info-card">
+					<view class="card-title">瀹℃壒娴佺▼淇℃伅</view>
+					<view class="info-grid">
+						<view class="info-item" v-if="orderInfo.鍒跺崟浜�">
+							<text class="label">鍒跺崟浜猴細</text>
+							<text class="value">{{ orderInfo.鍒跺崟浜� }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.鍒跺崟鏃ユ湡">
+							<text class="label">鍒跺崟鏃ユ湡锛�</text>
+							<text class="value">{{ formatDate(orderInfo.鍒跺崟鏃ユ湡) }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.瀹℃牳浜�">
+							<text class="label">瀹℃牳浜猴細</text>
+							<text class="value">{{ orderInfo.瀹℃牳浜� }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.瀹℃牳鏃ユ湡">
+							<text class="label">瀹℃牳鏃ユ湡锛�</text>
+							<text class="value">{{ formatDate(orderInfo.瀹℃牳鏃ユ湡) }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.淇敼浜�">
+							<text class="label">淇敼浜猴細</text>
+							<text class="value">{{ orderInfo.淇敼浜� }}</text>
+						</view>
+						<view class="info-item" v-if="orderInfo.淇敼鏃ユ湡">
+							<text class="label">淇敼鏃ユ湡锛�</text>
+							<text class="value">{{ formatDate(orderInfo.淇敼鏃ユ湡) }}</text>
+						</view>
+					</view>
+				</view>
+			</view>
+			
+			<!-- Tab 2: 鐗╂枡淇℃伅 -->
+			<view v-if="currentTab === 2" class="tab-content">
+				<view class="material-list">
+					<view 
+						v-for="(item, index) in materialList" 
+						:key="index" 
+						class="material-card"
+					>
+						<view class="material-header">
+							<text class="material-code">{{ item.鐗╂枡缂栫爜 || '鐗╂枡' + (index + 1) }}</text>
+							<text class="material-name">{{ item.鐗╂枡鍚嶇О }}</text>
+						</view>
+						<view class="material-info">
+							<view class="info-row">
+								<view class="info-col" v-if="item.瑙勬牸鍨嬪彿">
+									<text class="label">瑙勬牸鍨嬪彿锛�</text>
+									<text class="value">{{ item.瑙勬牸鍨嬪彿 }}</text>
+								</view>
+								<view class="info-col" v-if="item.璁¢噺鍗曚綅浠g爜">
+									<text class="label">鍗曚綅浠g爜锛�</text>
+									<text class="value">{{ item.璁¢噺鍗曚綅浠g爜 }}</text>
+								</view>
+								<view class="info-col" v-if="item.璁¢噺鍗曚綅鍚嶇О">
+									<text class="label">璁¢噺鍗曚綅鍚嶇О锛�</text>
+									<text class="value">{{ item.璁¢噺鍗曚綅鍚嶇О }}</text>
+								</view>
+								<view class="info-col" v-if="item.鐗╂枡鏂欏彿">
+									<text class="label">鐗╂枡鏂欏彿锛�</text>
+									<text class="value">{{ item.鐗╂枡鏂欏彿 }}</text>
+								</view>
+								<view class="info-col" v-if="item.涓嶈壇鍝丼N鐮�">
+									<text class="label">涓嶈壇鍝丼N鐮侊細</text>
+									<text class="value">{{ item.涓嶈壇鍝丼N鐮� }}</text>
+								</view>
+								<view class="info-col" v-if="闂鐜拌薄绠�杩�">
+									<text class="label">闂鐜拌薄绠�杩帮細</text>
+									<text class="value">{{ item.闂鐜拌薄绠�杩� }}</text>
+								</view>
+								<view class="info-col" v-if="闂璇︾粏鎻忚堪">
+									<text class="label">闂璇︾粏鎻忚堪锛�</text>
+									<text class="value">{{ item.闂璇︾粏鎻忚堪 }}</text>
+								</view>
+							</view>
+							
+							<view class="info-row">
+								<view class="info-col" v-if="item.鎵瑰彿">
+									<text class="label">鎵瑰彿锛�</text>
+									<text class="value">{{ item.鎵瑰彿 }}</text>
+								</view>
+								<view class="info-col" v-if="item.鏁伴噺">
+									<text class="label">鏁伴噺锛�</text>
+									<text class="value">{{ item.鏁伴噺 }}</text>
+								</view>
+								<view class="info-col" v-if="item.鐢熶骇鍏ュ簱鏁伴噺">
+									<text class="label">鐢熶骇鍏ュ簱鏁伴噺锛�</text>
+									<text class="value">{{ item.鐢熶骇鍏ュ簱鏁伴噺 }}</text>
+								</view>
+								<view class="info-col" v-if="item.寮�绁ㄦ暟閲�">
+									<text class="label">寮�绁ㄦ暟閲忥細</text>
+									<text class="value">{{ item.寮�绁ㄦ暟閲� }}</text>
+								</view>
+							</view>
+							
+							<view class="info-row">
+								<view class="info-col" v-if="item.鍏宠仈鏁伴噺">
+									<text class="label">鍏宠仈鏁伴噺锛�</text>
+									<text class="value">{{ item.鍏宠仈鏁伴噺 }}</text>
+								</view>
+								<view class="info-col" v-if="item.鏈叧鑱旀暟閲�">
+									<text class="label">鏈叧鑱旀暟閲忥細</text>
+									<text class="value">{{ item.鏈叧鑱旀暟閲� }}</text>
+								</view>
+							</view>
+							
+							<view class="info-row">
+								<view class="info-col" v-if="item.鍚◣鍗曚环">
+									<text class="label">鍚◣鍗曚环锛�</text>
+									<text class="value">{{ item.鍚◣鍗曚环 }}</text>
+								</view>
+								<view class="info-col" v-if="item.鎶樻墸鐜�">
+									<text class="label">鎶樻墸鐜囷細</text>
+									<text class="value">{{ item.鎶樻墸鐜� }}</text>
+								</view>
+								<view class="info-col" v-if="item.瀹為檯鍚◣鍗曚环">
+									<text class="label">瀹為檯鍗曚环锛�</text>
+									<text class="value">{{ item.瀹為檯鍚◣鍗曚环 }}</text>
+								</view>
+							</view>
+							
+							<view class="info-row">
+								<view class="info-col" v-if="item.鍗曚环">
+									<text class="label">鍗曚环锛�</text>
+									<text class="value">{{ item.鍗曚环 }}</text>
+								</view>
+								<view class="info-col" v-if="item.閲戦">
+									<text class="label">閲戦锛�</text>
+									<text class="value">{{ item.閲戦 }}</text>
+								</view>
+								<view class="info-col" v-if="item.閿�鍞嚭搴撳鏍搁噾棰�">
+									<text class="label">閿�鍞嚭搴撳鏍搁噾棰濓細</text>
+									<text class="value">{{ item.閿�鍞嚭搴撳鏍搁噾棰� }}</text>
+								</view>
+								<view class="info-col" v-if="item.閿�鍞嚭搴撳鏍搁噾棰�">
+									<text class="label">閿�鍞嚭搴撳鏍搁噾棰濓細</text>
+									<text class="value">{{ item.閿�鍞嚭搴撳鏍搁噾棰� }}</text>
+								</view>
+								<view class="info-col" v-if="item.閿�鍞��搴撴暟閲�">
+									<text class="label">閿�鍞��搴撴暟閲忥細</text>
+									<text class="value">{{ item.閿�鍞��搴撴暟閲� }}</text>
+								</view>
+								<view class="info-col" v-if="item.閿�鍞��搴撳鏍告暟閲�">
+									<text class="label">閿�鍞��搴撳鏍告暟閲忥細</text>
+									<text class="value">{{ item.閿�鍞��搴撳鏍告暟閲� }}</text>
+								</view>
+								<view class="info-col" v-if="item.鏄惁涓嬫帹鐢熶骇璁㈠崟">
+									<text class="label">鏄惁涓嬫帹鐢熶骇璁㈠崟锛�</text>
+									<text class="value">{{ item.鏄惁涓嬫帹鐢熶骇璁㈠崟 }}</text>
+								</view>
+							</view>
+							
+							<view class="info-row">
+								<view class="info-col" v-if="item.瀹㈡埛鐗╂枡缂栫爜">
+									<text class="label">瀹㈡埛鐗╂枡缂栫爜锛�</text>
+									<text class="value">{{ item.瀹㈡埛鐗╂枡缂栫爜 }}%</text>
+								</view>
+								<view class="info-col" v-if="item.瀹㈡埛瑙勬牸鍨嬪彿">
+									<text class="label">瀹㈡埛瑙勬牸鍨嬪彿锛�</text>
+									<text class="value">{{ item.瀹㈡埛瑙勬牸鍨嬪彿 }}%</text>
+								</view>
+								<view class="info-col" v-if="item.瀹㈡埛鐗╂枡鍚嶇О">
+									<text class="label">瀹㈡埛鐗╂枡鍚嶇О锛�</text>
+									<text class="value">{{ item.瀹㈡埛鐗╂枡鍚嶇О }}%</text>
+								</view>
+								<view class="info-col" v-if="item.鏄惁鍙栧簱瀛�">
+									<text class="label">鏄惁鍙栧簱瀛橈細</text>
+									<text class="value">{{ item.鏄惁鍙栧簱瀛� }}%</text>
+								</view>
+								<view class="info-col" v-if="item.鍓╀綑璁㈤噾">
+									<text class="label">鍓╀綑璁㈤噾锛�</text>
+									<text class="value">{{ item.鍓╀綑璁㈤噾 }}%</text>
+								</view>
+								<view class="info-col" v-if="item.鎶ュ簾鏁伴噺">
+									<text class="label">鎶ュ簾鏁伴噺锛�</text>
+									<text class="value">{{ item.鎶ュ簾鏁伴噺 }}%</text>
+								</view>
+								<view class="info-col" v-if="item.鐢熶骇鍏ュ簱鏁伴噺">
+									<text class="label">鐢熶骇鍏ュ簱鏁伴噺锛�</text>
+									<text class="value">{{ item.鐢熶骇鍏ュ簱鏁伴噺 }}%</text>
+								</view>
+								<!-- -->
+								<view class="info-col" v-if="item.绋庣巼">
+									<text class="label">绋庣巼锛�</text>
+									<text class="value">{{ item.绋庣巼 }}%</text>
+								</view>
+								<view class="info-col" v-if="item.绋庨">
+									<text class="label">绋庨锛�</text>
+									<text class="value">{{ item.绋庨 }}</text>
+								</view>
+								<view class="info-col" v-if="item.浠风◣鍚堣">
+									<text class="label">浠风◣鍚堣锛�</text>
+									<text class="value">{{ item.浠风◣鍚堣 }}</text>
+								</view>
+							</view>
+							
+							<view class="info-row" v-if="item.浜よ揣鏃ユ湡">
+								<view class="info-col full-width">
+									<text class="label">浜よ揣鏃ユ湡锛�</text>
+									<text class="value">{{ item.浜よ揣鏃ユ湡 }}</text>
+								</view>
+							</view>
+							<view class="info-row" v-if="item.鎶曟枡">
+								<view class="info-col full-width">
+									<text class="label">鎶曟枡锛�</text>
+									<text class="value">{{ item.鎶曟枡 }}</text>
+								</view>
+							</view>
+							<view class="info-row" v-if="item.娣卞姞宸�">
+								<view class="info-col full-width">
+									<text class="label">娣卞姞宸ワ細</text>
+									<text class="value">{{ item.娣卞姞宸� }}</text>
+								</view>
+							</view>
+						</view>
+					</view>
+					
+					<view v-if="materialList.length === 0" class="empty-state">
+						<uni-icons type="list" size="50" color="#ccc"></uni-icons>
+						<text class="empty-text">鏆傛棤鐗╂枡淇℃伅</text>
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+		
+		<view class="footer">
+			<button class="back-btn" @click="goBack">杩斿洖</button>
+		</view>
+		
+		<uni-load-more v-if="loading" status="loading" :content-text="loadingText"></uni-load-more>
+	</view>
+</template>
+
+<script>
+	import { CommonUtils } from '@/utils/common.js'
+	import { getUserInfo } from "../../utils/auth";
+	
+	export default {
+		data() {
+			return {
+				// 鍙傛暟
+				linterid: '',
+				HBillNo: '',
+				
+
+				currentTab: 0,
+				scrollHeight: 0,
+				loading: false,
+				loadingText: {
+					contentdown: '涓婃媺鏄剧ず鏇村',
+					contentrefresh: '姝e湪鍔犺浇...',
+					contentnomore: '娌℃湁鏇村鏁版嵁浜�'
+				},
+				
+	
+				orderInfo: {},
+				materialList: [], 
+				allData: [], 
+			}
+		},
+		computed: {
+			indicatorStyle() {
+				const tabWidth = 100 / 3;
+				return {
+					width: tabWidth + '%',
+					transform: `translateX(${this.currentTab * 100}%)`
+				};
+			}
+		},
+		onLoad(options) {
+			if (options.linterid && options.HBillNo) {
+				this.linterid = options.linterid;
+				this.HBillNo = options.HBillNo;
+				this.loadOrderDetail();
+			} else {
+				uni.showToast({
+					title: '鍙傛暟閿欒',
+					icon: 'error'
+				});
+				setTimeout(() => {
+					uni.navigateBack();
+				}, 1500);
+			}
+			
+			// 璁$畻婊氬姩鍖哄煙楂樺害
+			this.calcScrollHeight();
+		},
+		onReady() {
+			
+			uni.onWindowResize(() => {
+				this.calcScrollHeight();
+			});
+		},
+		methods: {
+			
+			calcScrollHeight() {
+				const systemInfo = uni.getSystemInfoSync();
+				const windowHeight = systemInfo.windowHeight;
+				const query = uni.createSelectorQuery().in(this);
+				query.select('.header').boundingClientRect();
+				query.select('.tab-container').boundingClientRect();
+				query.select('.footer').boundingClientRect();
+				query.exec((res) => {
+					if (res[0] && res[1] && res[2]) {
+						const headerHeight = res[0].height;
+						const tabHeight = res[1].height;
+						const footerHeight = res[2].height;
+						const margin = 5; // 瀹夊叏杈硅窛
+						
+						this.scrollHeight = windowHeight - headerHeight - tabHeight - footerHeight - margin;
+					}
+				});
+			},
+			
+			
+			switchTab(index) {
+				this.currentTab = index;
+			},
+			
+			
+			loadOrderDetail() {
+				this.loading = true;
+				
+				
+				const sWhere = ` and HInterID = '${this.linterid}'`;
+				
+				CommonUtils.doRequest2({
+					url: '/Crm_CustomerAppealBill/list',
+					data: {
+						sWhere: sWhere,
+						user: getUserInfo()["Czymc"],
+						// Organization:getUserInfo()["Organization"],
+						// page:1,
+						// size:50
+					},
+					resFunction: (res) => {
+						this.loading = false;
+						
+						if (res.data.Message === "鏃犳煡鐪嬫潈闄愶紒") {
+							uni.showToast({
+								icon: 'none',
+								title: res.data.Message
+							});
+							return;
+						}
+						
+						if (res.data.code === "1" && res.data.data && res.data.data.length > 0) {
+							this.allData = res.data.data;
+							
+							this.orderInfo = { ...this.allData[0] };
+							
+							this.materialList = this.allData;
+							
+							
+							if (!this.orderInfo.鍗曟嵁鍙� && this.HBillNo) {
+								this.orderInfo.鍗曟嵁鍙� = this.HBillNo;
+							}
+						} else {
+							uni.showToast({
+								title: '鏈壘鍒拌鍗曚俊鎭�',
+								icon: 'none'
+							});
+						}
+					},
+					errFunction: (err) => {
+						this.loading = false;
+						uni.showToast({
+							title: '鍔犺浇澶辫触',
+							icon: 'error'
+						});
+						console.error('鍔犺浇璁㈠崟璇︽儏澶辫触:', err);
+					}
+				});
+			},
+			
+			
+			formatDate(dateStr) {
+				if (!dateStr) return '';
+				
+				if (dateStr.length >= 10) {
+					return dateStr.substr(0, 10);
+				}
+				return dateStr;
+			},
+			
+			// 杩斿洖涓婁竴椤�
+			goBack() {
+				uni.navigateBack();
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.container {
+		display: flex;
+		flex-direction: column;
+		height: 100vh;
+		background-color: #f5f5f5;
+	}
+	
+	.header {
+		padding: 30rpx;
+		background: linear-gradient(135deg, #3a78ff 0%, #5a9cff 100%);
+		color: white;
+		text-align: center;
+		
+		.title {
+			font-size: 36rpx;
+			font-weight: bold;
+			margin-bottom: 10rpx;
+		}
+		
+		.sub-title {
+			font-size: 28rpx;
+			opacity: 0.9;
+		}
+	}
+	
+	.tab-container {
+		background-color: white;
+		position: relative;
+		box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
+		
+		.tabs {
+			display: flex;
+			
+			.tab-item {
+				flex: 1;
+				text-align: center;
+				padding: 25rpx 0;
+				font-size: 30rpx;
+				color: #666;
+				transition: all 0.3s;
+				
+				&.active {
+					color: #3a78ff;
+					font-weight: bold;
+				}
+			}
+		}
+		
+		.tab-indicator {
+			height: 4rpx;
+			background-color: #3a78ff;
+			transition: transform 0.3s ease;
+		}
+	}
+	
+	.content {
+		flex: 1;
+	}
+	
+	.tab-content {
+		padding: 20rpx;
+	}
+	
+	.info-card {
+		background-color: white;
+		border-radius: 16rpx;
+		padding: 30rpx;
+		margin-bottom: 20rpx;
+		box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
+		
+		.card-title {
+			font-size: 32rpx;
+			font-weight: bold;
+			color: #333;
+			margin-bottom: 30rpx;
+			padding-bottom: 15rpx;
+			border-bottom: 1rpx solid #eee;
+		}
+		
+		.info-grid {
+			display: flex;
+			flex-wrap: wrap;
+			
+			.info-item {
+				width: 50%;
+				margin-bottom: 25rpx;
+				
+				&.full-width {
+					width: 100%;
+				}
+				
+				.label {
+					color: #666;
+					font-size: 28rpx;
+					margin-right: 10rpx;
+				}
+				
+				.value {
+					color: #333;
+					font-size: 28rpx;
+					font-weight: 500;
+					word-break: break-all;
+				}
+			}
+		}
+	}
+	
+	.material-list {
+		.material-card {
+			background-color: white;
+			border-radius: 16rpx;
+			margin-bottom: 20rpx;
+			padding: 30rpx;
+			box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
+			
+			.material-header {
+				display: flex;
+				align-items: center;
+				margin-bottom: 25rpx;
+				padding-bottom: 15rpx;
+				border-bottom: 1rpx solid #eee;
+				
+				.material-code {
+					font-size: 30rpx;
+					font-weight: bold;
+					color: #3a78ff;
+					margin-right: 20rpx;
+					background-color: #f0f7ff;
+					padding: 5rpx 15rpx;
+					border-radius: 8rpx;
+				}
+				
+				.material-name {
+					font-size: 28rpx;
+					color: #333;
+					flex: 1;
+				}
+			}
+			
+			.material-info {
+				.info-row {
+					display: flex;
+					flex-wrap: wrap;
+					margin-bottom: 15rpx;
+					
+					&:last-child {
+						margin-bottom: 0;
+					}
+					
+					.info-col {
+						width: 50%;
+						margin-bottom: 10rpx;
+						
+						&.full-width {
+							width: 100%;
+						}
+						
+						.label {
+							color: #888;
+							font-size: 26rpx;
+							margin-right: 8rpx;
+						}
+						
+						.value {
+							color: #333;
+							font-size: 26rpx;
+							font-weight: 500;
+						}
+					}
+				}
+			}
+		}
+	}
+	
+	.empty-state {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		padding: 100rpx 0;
+		
+		.empty-text {
+			color: #999;
+			font-size: 28rpx;
+			margin-top: 20rpx;
+		}
+	}
+	
+	.footer {
+		padding: 20rpx 30rpx;
+		background-color: white;
+		border-top: 1rpx solid #eee;
+		
+		.back-btn {
+			background-color: #3a78ff;
+			color: white;
+			border-radius: 50rpx;
+			height: 80rpx;
+			line-height: 80rpx;
+			font-size: 32rpx;
+			
+			&:active {
+				background-color: #2c5fcc;
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/pages/CustomerComplaintsBill/CustomerComplaintsBillEdit.vue b/pages/CustomerComplaintsBill/CustomerComplaintsBillEdit.vue
new file mode 100644
index 0000000..cf182b6
--- /dev/null
+++ b/pages/CustomerComplaintsBill/CustomerComplaintsBillEdit.vue
@@ -0,0 +1,1093 @@
+<template>
+	<view>
+		<view class="form">
+			<view class="tabs">
+				<view :class="tabs == 0 ? 'on':''" @tap="() => { tabs = 0;  }">鍗曟嵁淇℃伅</view>
+				<view :class="tabs == 1 ? 'on':''" @tap="() => { tabs = 1; }">鍏朵粬淇℃伅</view>
+				<view :class="tabs == 2 ? 'on':''" @tap="() => { tabs = 2;  }">鍒跺崟淇℃伅</view>
+			</view>
+
+			<!-- 鍗曟嵁淇℃伅 -->
+			<view v-if="tabs == 0">
+				<view class="form-item">
+					<view class="title">鍗曟嵁鍙�:</view>
+					<view class="righton">
+						<input name="HBillNo" disabled v-model="hform.HBillNo" />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">鍗曟嵁鏃ユ湡:</view>
+					<view class="right">
+						<picker mode="date" v-model="hform.HDate" @change="HDateChange">
+							<input disabled v-model="hform.HDate" placeholder="璇烽�夋嫨鏃ユ湡" />
+						</picker>
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">涓婚:</view>
+					<view class="righton">
+						<input name="HContext"  v-model="hform.HContext" />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">璁㈠崟鍙�:</view>
+					<view class="righton">
+						<input name="HOrderBillNo"  v-model="hform.HOrderBillNo" />
+					</view>
+				</view>
+				
+				<view class="form-item">
+					<view class="title"><text>*</text>涓诲浜�:</view>
+					<view class="right">
+						<uni-combox :candidates="arrayHEmpName" placeholder="璇烽�夋嫨涓诲浜�" v-model="hform.HManagerName"
+							@input="HManagerNameChange"></uni-combox>
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title"><text>*</text>瀹㈡湇:</view>
+					<view class="right">
+						<uni-combox :candidates="arrayHEmpName" placeholder="璇烽�夋嫨瀹㈡湇" v-model="hform.HServiceManName"
+							@input="HEmpNameChange"></uni-combox>
+					</view>
+				</view>
+				
+				<view class="form-item">
+				    <view class="title">浜у搧浠g爜</view>
+				    <view class="righton disabled">
+				        <input type="text" disabled :value="hform.HMaterNumber" />
+				    </view>
+				    <view class="icon-wrapper-big">
+				        <uni-icons type="search" size="20" @click="showSelectorModule(hform, 1)"></uni-icons>
+				    </view>
+				</view>
+				<view class="form-item">
+				    <view class="title">浜у搧鍚嶇О</view>
+				    <view class="righton disabled">
+				        <input type="text" disabled :value="hform.HMaterName" />
+				    </view>
+				</view>
+				<view class="form-item">
+					<view class="title">瀹㈡埛鑱旂郴浜�:</view>
+					<view class="righton">
+						<input name="HLinkMan"  v-model="hform.HLinkMan" />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">鎶曡瘔鍒嗙被:</view>
+					<view class="righton">
+						<uni-combox :candidates="roleOptions" placeholder="璇烽�夋嫨婧愬崟绫诲瀷" v-model="hform.HAppealType"
+						    @input="arrayOptionChange"></uni-combox>
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">鎶曡瘔鏃ユ湡:</view>
+					<view class="right">
+						<picker mode="date" v-model="hform.HAppealTime" @change="HDateChangeappeal">
+							<input  v-model="hform.HAppealTime" placeholder="璇烽�夋嫨鏃ユ湡" />
+						</picker>
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">鍙戠敓鏃ユ湡:</view>
+					<view class="right">
+						<picker mode="date" v-model="hform.HHappenTime" @change="HDateChangeHappened">
+							<input  v-model="hform.HHappenTime" placeholder="璇烽�夋嫨鏃ユ湡" />
+						</picker>
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">绱ф�ョ▼搴�:</view>
+					<view class="righton">
+						<uni-combox :candidates="roleOptions_em" placeholder="璇烽�夋嫨" v-model="hform.HLevel"
+						    @input="arrayOptionChange_em"></uni-combox>
+					</view>
+				</view>
+				
+
+				<view class="form-item">
+					<view class="title">澶囨敞:</view>
+					<view class="right">
+						<textarea name="HRemark" v-model="hform.HRemark" auto-height placeholder="璇疯緭鍏ュ娉�"></textarea>
+					</view>
+				</view>
+
+			</view>
+			<view v-if="tabs == 1">
+				<view class="form-item">
+					<view class="title"><text>*</text>杞﹂棿:</view>
+					<view class="right">
+						<uni-combox :candidates="arrayHDeptName" placeholder="璇烽�夋嫨杞﹂棿" v-model="hform.HWorkShopName"
+							@input="HDeptNameChange"></uni-combox>
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">璁¢噺鍗曚綅:</view>
+					<view class="righton">
+						<input v-model="hform.HUnitName" disabled />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">浜у搧绫诲瀷:</view>
+					<view class="righton">
+						<input v-model="hform.HMaterType"  />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">瀹屾垚鏁伴噺:</view>
+					<view class="righton">
+						<input v-model="hform.HQty" />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">涓嶈壇鏁伴噺:</view>
+					<view class="righton">
+						<input v-model="hform.HBadQty" />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">涓嶈壇鐜�:</view>
+					<view class="righton">
+						<input v-model="hform.HBadRate" disabled />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">闂鏉ユ簮	:</view>
+					<view class="righton">
+						<input v-model="hform.HBadSource"  />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">鍙戠敓宸ュ簭:</view>
+					<view class="right">
+						<uni-combox :candidates="arrayHProcName" placeholder="璇烽�夋嫨宸ュ簭" v-model="hform.HProcName"
+							@input="HProcNameChange"></uni-combox>
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">澶勭悊缁撴灉:</view>
+					<view class="right">
+						<uni-combox :candidates="roleOptions_dealresult" placeholder="璇烽�夋嫨澶勭悊缁撴灉" v-model="hform.HWorkedResult"
+							@input="HWorkedResultChange"></uni-combox>
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">鏄惁鍋滅嚎:</view>
+					<view class="right">
+						<uni-data-select v-model="hform.HIsStopLine" :localdata="arrayCheck" placeholder="璇烽�夋嫨" @change="onChange">
+						</uni-data-select>
+						<!-- <uni-combox :candidates="roleOptions_check" placeholder="璇烽�夋嫨" v-model="hform.HIsStopLine"
+							@input="HWorkedResultChange">
+							
+							</uni-combox> -->
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">鏄惁閲嶅鍙戠敓:</view>
+					<view class="right">
+						<uni-data-select v-model="hform.HIsRepeat" :localdata="arrayCheck" placeholder="璇烽�夋嫨" @change="onChange">
+						</uni-data-select>
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">鏄惁娑夊強鐗╂枡:</view>
+					<view class="right">
+						<uni-data-select v-model="hform.HIsMater" :localdata="arrayCheck" placeholder="璇烽�夋嫨" @change="onChange">
+						</uni-data-select>
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">涓嶈壇鍝丼N鐮�:</view>
+					<view class="righton">
+						<input v-model="hform.HBarCode"  />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">闂鐜拌薄绠�杩�:</view>
+					<view class="righton">
+						<input v-model="hform.HBadNote"  />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">闂璇︾粏鎻忚堪:</view>
+					<view class="righton">
+						<input v-model="hform.HBadRemark"  />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">澶囨敞:</view>
+					<view class="righton">
+						<input v-model="hform.HRemark"  />
+					</view>
+				</view>
+			</view>
+			<view v-if="tabs == 2">
+				<view class="form-item">
+					<view class="title">鍒跺崟浜�:</view>
+					<view class="righton">
+						<input v-model="hform.HMaker" disabled />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">鍒跺崟鏃ユ湡:</view>
+					<view class="righton">
+						<input v-if="hform.HMakeDate" v-model="hform.HMakeDate.substr(0,10)" disabled />
+						<input v-else v-model="hform.HMakeDate" disabled />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">淇敼浜�:</view>
+					<view class="righton">
+						<input v-model="hform.HUpDater" disabled />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">淇敼鏃ユ湡:</view>
+					<view class="righton">
+						<input v-if="hform.HUpDateDate" v-model="hform.HUpDateDate.substr(0,10)" disabled />
+						<input v-else v-model="hform.HUpDateDate" disabled />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">瀹℃牳浜�:</view>
+					<view class="righton">
+						<input v-model="hform.HChecker" disabled />
+					</view>
+				</view>
+				<view class="form-item">
+					<view class="title">瀹℃牳鏃ユ湡:</view>
+					<view class="righton">
+						<input v-if="hform.HCheckDate" v-model="hform.HCheckDate.substr(0,10)" disabled />
+						<input v-else v-model="hform.HCheckDate" disabled />
+					</view>
+				</view>
+
+			</view>
+
+			<view class="bottom-btn">
+				<button v-if="btnType == 1 && !isEdit" class="btn-a" size="mini" @tap="submit">鎻愪氦</button>
+				<button v-if="btnType != 1 && !isEdit" class="btn-a" size="mini" @tap="ifEdit">淇敼</button>
+				<button v-if="btnType != 1 && isEdit" class="btn-a" size="mini" @tap="submit">鎻愪氦</button>
+				<button class="btn-c" size="mini" @tap="goBack">閫�鍑�</button>
+			</view>
+		</view>
+		<MaterialPopupVue v-if="enablePopupModule == PopupModuleNameList[1]" ref="listPopup" @update="MaterComplete"
+	    :bindKey="0">
+		</MaterialPopupVue>
+	</view>
+	
+</template>
+
+<script>
+	import dayjs from "dayjs";
+	import {
+	    CommonUtils
+	} from "@/utils/common";
+	import getDateTime from '@/utils/getdateTime.js';
+	import MaterialPopupVue from "@/components/ZLGL/MaterialPopup.vue";
+	import {
+		getUserInfo
+	} from "@/utils/auth.js";
+	export default {
+		components: {
+		    MaterialPopupVue,
+		},
+		data() {
+		  return {
+			  calcTimer: null,
+		    operationType: 1,
+		    // 鎺у埗褰撳墠鏄剧ず鐨勫脊绐楁ā鍧�
+		    enablePopupModule: "",
+		    PopupModuleNameList: [
+		      "",
+		      "Material",
+		      "Process",
+		    ],
+		    // 璁$畻鍒楄〃楂樺害
+		    bottomBtnTop: 0,
+		    listTableTop: 0,
+		    tabs: 0,
+		
+		    userInfo: getUserInfo(),
+		    serverUrl: uni.getStorageSync('serverUrl') || 'http://47.96.97.237/API',
+		    linterid: '',
+		    HBillNo: '',
+		    btnType: 1, //1鏂板锛�3淇敼
+		    showmore: false,
+		    HBarCodeFocus: false,
+		
+		    arrayHDeptName: [], //閮ㄩ棬
+		    HDeptNameList: [],
+		    arrayHEmpName: [], //鍙戠幇浜�/璐熻矗浜�
+		    HEmpNameList: [],
+		    arrayHSourceName: [], //鐢熶骇璧勬簮
+		    HSourceNameList: [],
+		    //涓嬫媺妗�
+		    roleOptions: ['浜у搧鎶曡瘔','鏈嶅姟鎶曡瘔','瀹㈡埛鎰忚','鍏跺畠'], // 涓嬫媺妗嗛�夐」
+		    arrayOption:{浜у搧鎶曡瘔:"浜у搧鎶曡瘔",鏈嶅姟鎶曡瘔:'鏈嶅姟鎶曡瘔',瀹㈡埛鎰忚:'瀹㈡埛鎰忚',鍏跺畠:'鍏跺畠'},
+		    roleOptions_em:['鏅��','绱ф��','闈炲父绱ф��'],
+		    arrayOption_em:{鏅��:"鏅��",绱ф��:'绱ф��',闈炲父绱ф��:'闈炲父绱ф��'},
+		    roleOptions_dealresult:['鏈鐞�','澶勭悊涓�','澶勭悊瀹屾垚'],
+		    arrayOption_dealresult:{鏈鐞�:"鏈鐞�",澶勭悊涓�:'澶勭悊涓�',澶勭悊瀹屾垚:'澶勭悊瀹屾垚'},
+		    arrayCheck:[{value:'鏄�',text:'鏄�'},{value:'鍚�',text:'鍚�'}],
+		    isEdit: false,
+		    listOption: [], // 鍒楄〃閫夐」
+		    listData: [], // 琛ㄦ牸鏁版嵁
+		    selectedRows: [], // 琛ㄦ牸閫変腑鐨勬暟鎹�
+		    arrayHProcName: [], //宸ュ簭
+		    HProcNameList: [],
+		    hform: {
+		      
+		      HContext: '', // 涓婚
+		      HOrderBillNo: '', // 璁㈠崟鍙�
+		      HLinkMan: '', // 瀹㈡埛鑱旂郴浜�
+		      HHappenTime: '', // 鍙戠敓鏃ユ湡
+		      HProcName: '', // 鍙戠敓宸ュ簭鍚嶇О
+		      HProcID: '', // 鍙戠敓宸ュ簭ID
+		      HUnitName: '', // 璁¢噺鍗曚綅
+		      HMaterType: '', // 浜у搧绫诲瀷
+		      HQty: '', // 瀹屾垚鏁伴噺
+		      HBadQty: '', // 涓嶈壇鏁伴噺
+		      HBadRate: '', // 涓嶈壇鐜�
+		      HBadSource: '', // 闂鏉ユ簮
+		      HWorkedResult: '', // 澶勭悊缁撴灉
+		      HIsStopLine: '', // 鏄惁鍋滅嚎
+		      HIsRepeat: '', // 鏄惁閲嶅鍙戠敓
+		      HIsMater: '', // 鏄惁娑夊強鐗╂枡
+		      HBarCode: '', // 涓嶈壇鍝丼N鐮�
+		      HBadNote: '', // 闂鐜拌薄绠�杩�
+		      HBadRemark: '', // 闂璇︾粏鎻忚堪
+		      HUpdater: '', // 淇敼浜�
+		      HUpDateDate: '', // 淇敼鏃ユ湡
+		      
+		      // 鍘熸湁灞炴��
+		      HAppealTime: '',
+		      HAppealType: '',
+		      HLevel: '',
+		      HInterID: '',
+		      HBillNo: '',
+		      HDate: getDateTime.dateTimeStr('y-m-d'),
+		      HWorkShopName: uni.getStorageSync('HDeptName'),
+		      HWorkShopID: uni.getStorageSync('HDeptID'),
+		      HServiceManName: uni.getStorageSync('HEmpName'),
+		      HServiceMan: uni.getStorageSync('HEmpID'),
+		      HManagerName: uni.getStorageSync('HMangerName'),
+		      HMangerID: uni.getStorageSync('HMangerID'),
+		      HSourceName: '',
+		      HSourceID: '0',
+		      HScanDate: getDateTime.dateTimeStr('y-m-d h:i:s'),
+		      HMaterID: '0',
+		      HMaterNumber: '',
+		      HMaterName: '',
+		      HICMOBillNo: '',
+		      HICMOInterID: '0',
+		      HICMOEntryID: '0',
+		      HProcExchBillNo: '',
+		      HProcExchInterID: '0',
+		      HProcExchEntryID: '0',
+		      HOrgID: uni.getStorageSync('OrganizationID'),
+		      HMaker: '',
+		      HMakeDate: '',
+		      // HUpDater: '', // 宸插湪涓婃柟娣诲姞涓篐Updater
+		      // HUpDateDate: '', // 宸插湪涓婃柟娣诲姞
+		      HChecker: '',
+		      HCheckDate: '',
+		      HCloseMan: '',
+		      HCloseDate: '',
+		      HDeleteMan: '',
+		      HDeleteDate: '',
+		      HRemark: '', // 澶囨敞
+		      eventType: 'Add'
+		    }
+		  }
+		},
+		onLoad(e) {
+			this.HBarCodeFocus = true
+			this.getHDeptList()
+			this.getHEmpList()
+			this.getHProcList()
+			
+			this.hform.HMaker = uni.getStorageSync('HUserName')
+			console.log(e, this.userInfo)
+			if (e.linterid) {
+				this.btnType = 3
+				this.linterid = e.linterid
+				this.HBillNo = e.HBillNo
+				this.getEditData(e.linterid, e.HBillNo)
+				this.getMouldDetailData(e.linterid, e.HBillNo);
+			} else {
+				this.getNewData()
+			}
+			this.tabs = 0
+		},
+		// ==================== 璁$畻灞炴�� ====================
+		computed: {
+			// 璁$畻琛ㄦ牸楂樺害
+			listTableHeight: {
+				get() {
+					return this.bottomBtnTop - this.listTableTop - 10
+				}
+			},
+			
+		},
+		watch: {
+		  // 鐩戝惉瀹屾垚鏁伴噺鐨勫彉鍖�
+		  'hform.HQty': {
+		    handler(newVal, oldVal) {
+		      if (newVal !== oldVal) {
+		        // 寤惰繜璁$畻锛岄伩鍏嶉绻佽绠�
+		        clearTimeout(this.calcTimer);
+		        this.calcTimer = setTimeout(() => {
+		          this.calcBadRate();
+		        }, 300);
+		      }
+		    },
+		    immediate: true // 鍒濆鍖栨椂涔熻绠椾竴娆�
+		  },
+		  
+		  // 鐩戝惉涓嶈壇鏁伴噺鐨勫彉鍖�
+		  'hform.HBadQty': {
+		    handler(newVal, oldVal) {
+		      if (newVal !== oldVal) {
+		        // 寤惰繜璁$畻锛岄伩鍏嶉绻佽绠�
+		        clearTimeout(this.calcTimer);
+		        this.calcTimer = setTimeout(() => {
+		          this.calcBadRate();
+		        }, 300);
+		      }
+		    },
+		    immediate: true // 鍒濆鍖栨椂涔熻绠椾竴娆�
+		  }
+		},
+		methods: {
+			calcBadRate() {
+			  try {
+			    const completeQty = parseFloat(this.hform.HQty) || 0;
+			    const badQty = parseFloat(this.hform.HBadQty) || 0;
+			    
+			    if (completeQty > 0) {
+			      // 璁$畻涓嶈壇鐜囩櫨鍒嗘瘮锛屼繚鐣欎袱浣嶅皬鏁�
+			      const badRate = (badQty / completeQty * 100).toFixed(2);
+			      this.hform.HBadRate = `${badRate}%`;
+			    } else {
+			      this.hform.HBadRate = '0%';
+			    }
+			  } catch (error) {
+			    console.error('璁$畻涓嶈壇鐜囧嚭閿�:', error);
+			    this.hform.HBadRate = '0%';
+			  }
+			},
+			onChange(e){
+				console.log("this",this.hform.HIsStopLine)
+				console.log("this",this.hform.HIsRepeat)
+			},
+			arrayOptionChange(e) {
+				console.log('閫変腑鐨勮鑹�:', this.hform.HAppealType);
+				this.hform.HAppealType=this.arrayOption[this.hform.HAppealType]
+			},
+			arrayOptionChange_em(e)
+			{
+				this.hform.HLevel=this.arrayOption_em[this.hform.HLevel]
+			},
+			HWorkedResultChange(d)
+			{
+				this.hform.HWorkedResult=this.arrayOption_dealresult[this.hform.HWorkedResult]
+			},
+			//鏃ユ湡
+			HDateChange(e) {
+				console.log(e.detail.value)
+				this.hform.HDate = e.detail.value
+			},
+			HDateChangeappeal(e)
+			{
+				this.hform.HAppealTime = e.detail.value
+			},
+			HDateChangeHappened(e)
+			{
+				this.hform.HHappenTime=e.detail.value
+			},
+			//鑾峰彇浣跨敤閮ㄩ棬鏁版嵁
+			getHDeptList() {
+				uni.request({
+					url: this.serverUrl + '/PublicPageMethod/DeptList',
+					data: {
+						sWhere: "where HStopFlag=0 and HEndFlag=1 and HUSEORGID = " + uni.getStorageSync(
+							'OrganizationID') + ""
+					},
+					success: (res) => {
+						if (res.data.count == 1) {
+							this.HDeptNameList = res.data.data
+							for (var i = 0; i < res.data.data.length; i++) {
+								this.arrayHDeptName[i] = res.data.data[i].HName
+							}
+							this.$forceUpdate();
+						} else {
+							uni.showToast({
+								title: res.data.Message,
+								icon: 'none'
+							})
+						}
+					},
+					fail: (res) => {
+						console.log(res);
+						uni.showToast({
+							title: '鎺ュ彛璇锋眰澶辫触',
+							icon: 'none'
+						})
+					},
+				});
+			},
+			//閫夋嫨浣跨敤閮ㄩ棬
+			HDeptNameChange(e) {
+				for (var i = 0; i < this.HDeptNameList.length; i++) {
+					if (this.HDeptNameList[i].HName == e) {
+						this.hform.HWorkShopID = this.HDeptNameList[i].HItemID
+					}
+				}
+			},
+			//鎿嶄綔鍛樸�佽礋璐d汉
+			getHEmpList() {
+				uni.request({
+					url: this.serverUrl + '/Web/GetEmployeeList_Json',
+					data: {
+						Employee: '',
+						HGroupID: 0
+					},
+					success: (res) => {
+						if (res.data.count == 1) {
+							this.HEmpNameList = res.data.data
+							for (var i = 0; i < res.data.data.length; i++) {
+								this.arrayHEmpName[i] = res.data.data[i].HName
+							}
+							this.$forceUpdate();
+						} else {
+							uni.showToast({
+								title: res.data.Message,
+								icon: 'none'
+							})
+						}
+					},
+					fail: (res) => {
+						console.log(res);
+						uni.showToast({
+							title: '鎺ュ彛璇锋眰澶辫触',
+							icon: 'none'
+						})
+					},
+				});
+			},
+			//閫夋嫨鎿嶄綔鍛�
+			HEmpNameChange(e) {
+				for (var i = 0; i < this.HEmpNameList.length; i++) {
+					if (this.HEmpNameList[i].HName == e) {
+						this.hform.HServiceMan = this.HEmpNameList[i].HItemID
+					}
+				}
+			},
+			//閫夋嫨璐熻矗浜�
+			HManagerNameChange(e) {
+				for (var i = 0; i < this.HEmpNameList.length; i++) {
+					if (this.HEmpNameList[i].HName == e) {
+						this.hform.HMangerID = this.HEmpNameList[i].HItemID
+					}
+				}
+			},
+			//鐢熶骇璧勬簮
+			getHSourceList() {
+				uni.request({
+					url: this.serverUrl + '/api/newBill/getSourceList',
+					data: {
+						sWhere: " and HUSEORGID = " + uni.getStorageSync('OrganizationID') + ""
+					},
+					success: (res) => {
+						if (res.data.code == 1) {
+							this.HSourceNameList = res.data.data.Gy_Source
+							for (var i = 0; i < res.data.data.Gy_Source.length; i++) {
+								this.arrayHSourceName[i] = res.data.data.Gy_Source[i].鐢熶骇璧勬簮
+							}
+							this.$forceUpdate();
+						} else {
+							uni.showToast({
+								title: res.data.Message,
+								icon: 'none'
+							})
+						}
+					},
+					fail: (res) => {
+						console.log(res);
+						uni.showToast({
+							title: '鎺ュ彛璇锋眰澶辫触',
+							icon: 'none'
+						})
+					},
+				});
+			},
+			//閫夋嫨鐢熶骇璧勬簮
+			HSourceNameChange(e) {
+				for (var i = 0; i < this.HSourceNameList.length; i++) {
+					if (this.HSourceNameList[i].鐢熶骇璧勬簮 == e) {
+						this.hform.HSourceID = this.HSourceNameList[i].HItemID
+					}
+				}
+			},
+			ifEdit() {
+				this.isEdit = true
+				this.hform.eventType = 'Modify'
+			},
+			// 鏄剧ず寮圭獥
+			async showSelectorModule(item, index) {
+			   // this.currentChechItemIDCache = item.num || 0; // 0 琛ㄧず娌℃湁浠讳綍瀛愯〃琚�変腑
+			    this.enablePopupModule = this.PopupModuleNameList[index];
+			    console.log("this.$refs: ", this.$refs);
+				console.log('listPopup鏄惁瀛樺湪:', !!this.$refs.listPopup);
+			    await this.$nextTick();
+			    this.$refs.listPopup.showPopup();
+			},
+			// 浜у搧浠g爜杩斿洖
+			async MaterComplete(e) {
+			    console.log("MaterRet: ", e);
+			    for (var key in e["retVal"]) {
+			        let data = e["retVal"][key];
+			        Object.assign(this.hform, {
+			            HMaterNumber: data["鐗╂枡浠g爜"],
+			            HMaterName: data["鐗╂枡鍚嶇О"],
+			            HMaterID: data["HItemID"],
+			        });
+			        await this.$nextTick();
+			        this.$refs.listPopup.exit();
+			        // 纭繚鍦ㄥ脊绐楃粨鏉熷悗锛屽啀灏嗛〉闈笂鎸傚湪鐨勭粍浠剁疆绌�
+			        await this.$nextTick();
+			        this.enablePopupModule = this.PopupModuleNameList[0];
+			        
+			    }
+			},
+			//宸ュ簭
+			async getHProcList() {
+				try {
+					let res = await CommonUtils.doRequest2Async({
+						url: '/Gy_Process/list',
+						data: {
+							sWhere: '',
+							user: getUserInfo()['Czymc'] || '',
+						},
+					})
+			
+					console.log('宸ュ簭res: ', res);
+					if (res.data.count > 0) {
+						console.log('宸ュ簭res.data.data: ', res.data.data);
+						this.HProcNameList = res.data.data
+						this.arrayHProcName = res.data.data.map(item => item.宸ュ簭鍚嶇О)
+						this.$forceUpdate();
+					} else {
+						uni.showToast({
+							title: res.data.Message,
+							icon: 'none'
+						})
+					}
+				} catch (err) {
+					uni.showToast({
+						title: err,
+						icon: 'none'
+					})
+				}
+			
+			},
+			//閫夋嫨Proc
+			HProcNameChange(e) {
+				for (var i = 0; i < this.HProcNameList.length; i++) {
+					if (this.HProcNameList[i].宸ュ簭鍚嶇О == e) {
+						this.hform.HProcID = this.HProcNameList[i].HItemID
+					}
+				}
+			},
+			//缂栬緫鍥炴樉
+			getEditData(linterid, HBillNo) {
+				//涓昏〃
+				uni.request({
+					url: this.serverUrl + '/Crm_CustomerAppealBill/editInit',
+					data: {
+						HInterID: linterid,
+						user: uni.getStorageSync('HUserName')
+					},
+					success: (res) => {
+						console.log(1, res.data.data[0]);
+						if (res.data.code == 1) {
+							var data = res.data.data[0]
+							this.btnType = 3
+							this.hform.HInterID = data.HInterID
+							this.hform.HBillNo = data.鍗曟嵁鍙�
+							this.hform.HDate = data.鏃ユ湡 ? data.鏃ユ湡.substr(0, 10) : ''
+							this.hform.HContext = data.涓婚 || ''
+							this.hform.HOrderBillNo = data.璁㈠崟鍙� || ''
+							this.hform.HMaterID = data.HMaterID || '0'
+							this.hform.HMaterNumber = data.鐗╂枡缂栫爜 || ''
+							this.hform.HMaterName = data.鐗╂枡鍚嶇О || ''
+							this.hform.HUnitName = data.璁¢噺鍗曚綅鍚嶇О || ''
+							this.hform.HMaterType = data.鐗╂枡绫诲瀷 || ''
+							this.hform.HManagerName = data.涓诲浜� || ''
+							this.hform.HMangerID = data.HManager || '0'
+							this.hform.HServiceManName = data.瀹㈡湇 || ''
+							this.hform.HServiceMan = data.HServiceMan || '0'
+							this.hform.HLinkMan = data.瀹㈡埛鑱旂郴浜� || ''
+							this.hform.HAppealType = data.鎶曡瘔鍒嗙被 || ''
+							this.hform.HAppealTime = data.鎶曡瘔鏃堕棿 ? data.鎶曡瘔鏃堕棿.substr(0, 10) : ''
+							this.hform.HHappenTime = data.鍙戠敓鏃堕棿 ? data.鍙戠敓鏃堕棿.substr(0, 10) : ''
+							this.hform.HLevel = data.绱ф�ョ▼搴� || ''
+							this.hform.HWorkShopName = data.杞﹂棿 || ''
+							this.hform.HWorkShopID = data.HWorkShopID || '0'
+							this.hform.HQty = data.瀹屾垚鏁伴噺 || '0'
+							this.hform.HBadQty = data.涓嶈壇鏁伴噺 || '0'
+							this.hform.HBadSource = data.闂鏉ユ簮 || ''
+							this.hform.HProcName = data.鍙戠敓宸ュ簭 || ''
+							this.hform.HProcID = data.HProcID || '0'
+							this.hform.HWorkedResult = data.澶勭悊缁撴灉 || ''
+							this.hform.HIsStopLine = data.鏄惁鍋滅嚎 || ''
+							this.hform.HIsRepeat = data.鏄惁閲嶅鍙戠敓 || ''
+							this.hform.HIsMater = data.鏄惁娑夊強鐗╂枡 || ''
+							this.hform.HBarCode = data.涓嶈壇鍝丼N鐮� || ''
+							this.hform.HBadNote = data.闂鐜拌薄绠�杩� || ''
+							this.hform.HBadRemark = data.闂璇︾粏鎻忚堪 || ''
+							this.hform.HRemark = data.澶囨敞 || ''
+							
+							// 璁$畻涓嶈壇鐜�
+							this.calcBadRate();
+							
+							// 绯荤粺瀛楁
+							this.hform.HMaker = data.鍒跺崟浜� || ''
+							this.hform.HMakeDate = data.鍒跺崟鏃堕棿 || ''
+							this.hform.HUpdater = data.淇敼浜� || ''
+							this.hform.HUpDateDate = data.淇敼鏃堕棿 || ''
+							this.hform.HChecker = data.瀹℃牳浜� || ''
+							this.hform.HCheckDate = data.瀹℃牳鏃堕棿 || ''
+
+						} else {
+							uni.showToast({
+								title: res.data.Message,
+								icon: 'none'
+							})
+						}
+					},
+					fail: (res) => {
+						console.log(res);
+						uni.showToast({
+							title: '鎺ュ彛璇锋眰澶辫触',
+							icon: 'none'
+						})
+					},
+				});
+			},
+			
+			
+			//鏂板
+			getNewData() {
+				uni.request({
+					url: this.serverUrl + '/Web/GetMAXNum',
+					data: {
+						HBillType: '3846'
+					},
+					success: (res) => {
+						console.log(res.data)
+						if (res.data.count == 1) {
+							this.hform.HInterID = res.data.data[0].HInterID
+							this.hform.HBillNo = res.data.data[0].HBillNo
+							this.hform.HMakeDate = getDateTime.dateTimeStr('y-m-d')
+							this.btnType = 1
+						} else {
+							uni.showToast({
+								title: res.data.Message,
+								icon: 'none'
+							})
+						}
+					},
+					fail: (res) => {
+						console.log(res);
+						uni.showToast({
+							title: '鎺ュ彛璇锋眰澶辫触',
+							icon: 'none'
+						})
+					},
+				});
+			},
+			submit() {
+				if (!this.hform.HServiceManName) {
+					uni.showToast({
+						title: '璇烽�夋嫨瀹㈡湇',
+						icon: 'none'
+					})
+				} else if (!this.hform.HManagerName) {
+					uni.showToast({
+						title: '璇烽�夋嫨璐熻矗浜�',
+						icon: 'none'
+					})
+				} else if (!this.hform.HMaterNumber) {
+					uni.showToast({
+						title: '璇烽�夋嫨浜у搧',
+						icon: 'none'
+					})
+				} else {
+					uni.showLoading({
+						title: '璇风◢鍊�'
+					})
+					// ========== 绗竴姝ワ細鏋勫缓涓昏〃鏁版嵁 ==========
+				  const mainData = {
+					// 鍗曟嵁鍩烘湰淇℃伅
+					HBillNo: this.hform.HBillNo,
+					HInterID: this.hform.HInterID,
+					HDate: this.hform.HDate,
+					HContext: this.hform.HContext || "", // 涓婚
+					HOrderBillNo: this.hform.HOrderBillNo || "", // 璁㈠崟鍙�
+					HRemark: this.hform.HRemark || "", // 澶囨敞
+					
+					// 浜哄憳淇℃伅
+					HManagerName: this.hform.HManagerName || "",
+					HMangerID: this.hform.HMangerID || "",
+					HServiceManName: this.hform.HServiceManName || "",
+					HServiceMan: this.hform.HServiceMan || "",
+					HLinkMan: this.hform.HLinkMan || "", // 瀹㈡埛鑱旂郴浜�
+					
+					// 浜у搧淇℃伅
+					HMaterID: this.hform.HMaterID || "0",
+					HMaterNumber: this.hform.HMaterNumber || "",
+					HMaterName: this.hform.HMaterName || "",
+					HMaterType: this.hform.HMaterType || "", // 浜у搧绫诲瀷
+					HUnitName: this.hform.HUnitName || "", // 璁¢噺鍗曚綅
+					
+					// 鎶曡瘔/闂淇℃伅
+					HAppealType: this.hform.HAppealType || "", // 鎶曡瘔鍒嗙被
+					HAppealTime: this.hform.HAppealTime || "", // 鎶曡瘔鏃ユ湡
+					HHappenTime: this.hform.HHappenTime || "", // 鍙戠敓鏃ユ湡
+					HLevel: this.hform.HLevel || "", // 绱ф�ョ▼搴�
+					
+					// 杞﹂棿/宸ュ簭淇℃伅
+					HWorkShopName: this.hform.HWorkShopName || "",
+					HWorkShopID: this.hform.HWorkShopID || "",
+					HProcName: this.hform.HProcName || "", // 鍙戠敓宸ュ簭
+					HProcID: this.hform.HProcID || "", // 鍙戠敓宸ュ簭ID
+					
+					// 鏁伴噺淇℃伅
+					HQty: this.hform.HQty || "0", // 瀹屾垚鏁伴噺
+					HBadQty: this.hform.HBadQty || "0", // 涓嶈壇鏁伴噺
+					HBadRate: this.hform.HBadRate || "0", // 涓嶈壇鐜�
+					
+					// 闂璇︽儏
+					HBadSource: this.hform.HBadSource || "", // 闂鏉ユ簮
+					HWorkedResult: this.hform.HWorkedResult || "", // 澶勭悊缁撴灉
+					HIsStopLine: this.hform.HIsStopLine || "", // 鏄惁鍋滅嚎
+					HIsRepeat: this.hform.HIsRepeat || "", // 鏄惁閲嶅鍙戠敓
+					HIsMater: this.hform.HIsMater || "", // 鏄惁娑夊強鐗╂枡
+					HBarCode: this.hform.HBarCode || "", // 涓嶈壇鍝丼N鐮�
+					HBadNote: this.hform.HBadNote || "", // 闂鐜拌薄绠�杩�
+					HBadRemark: this.hform.HBadRemark || "", // 闂璇︾粏鎻忚堪
+					
+					// 缁勭粐淇℃伅
+					HOrgID: this.hform.HOrgID || uni.getStorageSync('OrganizationID'),
+					
+					// 绯荤粺瀛楁
+					HMaker: this.hform.HMaker || uni.getStorageSync('HUserName'),
+					HMakeDate: this.hform.HMakeDate || getDateTime.dateTimeStr('y-m-d'),
+					HUpdater: this.hform.HUpdater || uni.getStorageSync('HUserName'), // 淇敼浜�
+					HUpDateDate: this.hform.HUpDateDate || getDateTime.dateTimeStr('y-m-d'), // 淇敼鏃ユ湡
+					HChecker: this.hform.HChecker || "", // 瀹℃牳浜�
+					HCheckDate: this.hform.HCheckDate || "", // 瀹℃牳鏃ユ湡
+					// HCloseMan: this.hform.HCloseMan || "", // 鍏抽棴浜� 
+					// HCloseDate: this.hform.HCloseDate || "", // 鍏抽棴鏃ユ湡 
+					// HDeleteMan: this.hform.HDeleteMan || "", // 浣滃簾浜� 
+					// HDeleteDate: this.hform.HDeleteDate || "", // 浣滃簾鏃ユ湡 
+
+					
+					
+					eventType: this.hform.eventType || 'Add'
+				  };
+		
+					
+
+					// ========== 绗笁姝ワ細鎷兼帴瀹屾暣鏁版嵁 ==========
+					const submitStr = JSON.stringify(mainData) + ";" + this.btnType +
+						";" + uni.getStorageSync('HUserName');
+
+
+					console.log(submitStr);
+					uni.request({
+						url: this.serverUrl + '/Crm_CustomerAppealBill/SaveCustomerAppealBill',
+						method: 'POST',
+						dataType: "json",
+						data: {
+							msg: submitStr
+						},
+						success: (res) => {
+							console.log(1, res);
+							uni.hideLoading()
+							if (res.data.count == 1) {
+								let pages = getCurrentPages();
+								let prePage = pages[pages.length - 2];
+
+								if (this.isEdit) {
+									setTimeout(() => {
+										uni.redirectTo({
+											url: '/pages/shangmudan/MouldUpperBill?linterid=' +
+												this.linterid + '&HBillNo=' + this.HBillNo
+										})
+									}, 1000)
+								} else {
+									setTimeout(() => {
+										uni.navigateBack()
+									}, 1000)
+								}
+							}
+							uni.showToast({
+								title: res.data.Message,
+								icon: 'none'
+							})
+						},
+						fail: (res) => {
+							console.log(res);
+							uni.showToast({
+								title: '鎺ュ彛璇锋眰澶辫触',
+								icon: 'none'
+							})
+						},
+					});
+				}
+			},
+			goBack() {
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '纭瑕侀��鍑哄綋鍓嶉〉闈㈠悧锛�',
+					success: (res) => {
+						if (res.confirm) {
+							console.log('鐢ㄦ埛鐐瑰嚮纭畾');
+							uni.navigateBack()
+						} else if (res.cancel) {
+							console.log('鐢ㄦ埛鐐瑰嚮鍙栨秷');
+						}
+					}
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.form {
+		width: 668rpx;
+		margin: 20rpx auto;
+		padding-bottom: 240rpx;
+	}
+
+	.tab_area {
+		width: 100%;
+		height: 50rpx;
+	}
+
+	.other {
+		margin-top: 8rpx;
+		text-align: center;
+		font-size: 28rpx;
+		padding: 4rpx 18rpx;
+		color: #1890FF;
+	}
+
+	.form-item {
+		display: flex;
+		align-items: center;
+		font-size: 30rpx;
+		padding: 6rpx 0;
+
+		.title {
+			width: 208rpx;
+
+			text {
+				color: red;
+				font-weight: bold;
+			}
+		}
+
+		.right {
+			width: 450rpx;
+			border-radius: 22rpx;
+			border: 1px solid #acacac;
+		}
+
+		.righton {
+			width: 450rpx;
+			border-radius: 22rpx;
+			border: 1px solid #e4e4e4;
+			background-color: #e4e4e4;
+		}
+
+		input {
+			width: 100%;
+			padding: 8rpx 20rpx;
+			font-size: 30rpx;
+		}
+
+		textarea {
+			width: 98%;
+			padding: 8rpx 20rpx;
+			font-size: 30rpx;
+		}
+
+	}
+
+	.bottom-btn {
+		width: 100%;
+		// height: 120rpx;
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		background-color: #fff;
+		box-shadow: 0 2rpx 10rpx 2rpx rgba(0, 0, 0, 0.4);
+		padding: 30rpx 40rpx 40rpx 40rpx;
+
+		button {
+			border-radius: 50rpx;
+			width: 180rpx;
+			height: 66rpx;
+			line-height: 66rpx;
+			font-size: 28rpx;
+		}
+
+		.btn-a {
+			background-color: #3A78FF;
+			color: #fff;
+		}
+
+		.btn-b {
+			background-color: #41a863;
+			color: #fff;
+		}
+
+		.btn-c {
+			background-color: #FFA500;
+			color: #fff;
+			position: absolute;
+			right: 120rpx;
+		}
+
+		.btn-d {
+			background-color: #ff8901;
+			color: #fff;
+		}
+	}
+
+	.tabs {
+		width: 100%;
+		display: flex;
+		border-bottom: 1px solid #ddd;
+		margin: 20rpx 0;
+
+		view {
+			width: 25%;
+			font-size: 30rpx;
+			color: #555;
+			text-align: center;
+			padding: 16rpx 0;
+		}
+
+		.on {
+			color: #3a78ff;
+			font-weight: bold;
+			border-bottom: 3px solid #3a78ff;
+		}
+	}
+
+</style>
\ No newline at end of file
diff --git a/pages/CustomerComplaintsBill/CustomerComplaintsBillList.vue b/pages/CustomerComplaintsBill/CustomerComplaintsBillList.vue
new file mode 100644
index 0000000..62a34e2
--- /dev/null
+++ b/pages/CustomerComplaintsBill/CustomerComplaintsBillList.vue
@@ -0,0 +1,618 @@
+<template>
+	<view>
+		<view class="page-header">
+			<view class="search-item">
+				<view class="left">鏃ユ湡闂撮殧</view>
+				<view class="right">
+					<picker mode="selector" :value="curDateGap" :range="dateRangePicker"
+						@change="onDateRangePickerChangeHandler">
+						<input disabled v-model="curDateGap" placeholder="璇烽�夋嫨鏃ユ湡闂撮殧" />
+						<view class="picker-overlay"></view>
+					</picker>
+				</view>
+			</view>
+			<view class="search-item">
+				<view class="left">寮�濮嬫棩鏈�</view>
+				<view class="right">
+					<uni-datetime-picker :clear-icon="false" type="date" v-model="startDate"
+						:disabled="!enableCustomDateRange">
+						<view class="datetime-picker-inner"
+							:class="enableCustomDateRange?'font__enable':'font__disable'">
+							<text>{{ startDate }}</text>
+						</view>
+					</uni-datetime-picker>
+				</view>
+			</view>
+			<view class="search-item">
+				<view class="left">缁撴潫鏃ユ湡</view>
+				<view class="right">
+					<uni-datetime-picker :clear-icon="false" type="date" v-model="endDate"
+						:disabled="!enableCustomDateRange">
+						<view class="datetime-picker-inner"
+							:class="enableCustomDateRange?'font__enable':'font__disable'">{{ endDate }}</view>
+					</uni-datetime-picker>
+				</view>
+			</view>
+			<view class="search-item">
+				<view class="left">鍗曟嵁鍙�</view>
+				<view class="right">
+					<input type="text" auto-focus v-model="HBillNo" />
+				</view>
+			</view>
+
+			<view class="button-groups">
+				<button type="default" size="mini" class="btn-b" @tap.stop="onAddClickHandler">鏂板</button>
+				<button type="default" size="mini" class="btn-c" @tap.stop="onSearchClickHandler">鏌ヨ</button>
+				<button type="default" size="mini" class="btn-a" @tap.stop="onResetClickHandler">閲嶇疆</button>
+			</view>
+		</view>
+		<view style="width: 100%;height: 16rpx;background-color: #e5e5e5;"></view>
+		<scroll-view id="pageContent" scroll-y class="page-content" :style="{height: pageContentHeight + 'px'}">
+			<view v-for="(item,index) in listData" :key="index">
+				<uni-card :title="item.璁㈠崟鍙�" :extra="item.鍗曟嵁鍙�" style="margin: 10px;"
+					@tap="showDetail = showDetail==index?-1:index">
+					<view class="card-detail">
+
+						<view class="detail" v-if="item.涓婚">
+							<text>涓婚锛�</text>{{item.涓婚}}
+						</view>
+						<view class="detail" v-if="item.鍗曟嵁鐘舵��">
+							<text>鍗曟嵁鐘舵�侊細</text>{{item.鍗曟嵁鐘舵�亇}
+						</view>
+						<view class="detail" v-if="item.鏃ユ湡">
+							<text>鏃ユ湡锛�</text>{{item.鏃ユ湡}}
+						</view>
+						<view class="detail" v-if="item.鐗╂枡缂栫爜">
+							<text>鐗╂枡缂栫爜锛�</text>{{item.鐗╂枡缂栫爜}}
+						</view>
+						<view class="detail" v-if="item.鐗╂枡鍚嶇О">
+							<text>鐗╂枡鍚嶇О锛�</text>{{item.鐗╂枡鍚嶇О}}
+						</view>
+						<view class="detail" v-if="item.瑙勬牸鍨嬪彿">
+							<text>瑙勬牸鍨嬪彿锛�</text>{{item.瑙勬牸鍨嬪彿}}
+						</view>
+						<view class="detail" v-if="item.璁¢噺鍗曚綅鍚嶇О">
+							<text>璁¢噺鍗曚綅鍚嶇О锛�</text>{{item.璁¢噺鍗曚綅鍚嶇О}}
+						</view>
+						<view class="detail" v-if="item.鐗╂枡绫诲瀷">
+							<text>鐗╂枡绫诲瀷锛�</text>{{item.鐗╂枡绫诲瀷}}
+						</view>
+						<view class="detail" v-if="item.涓诲浜�">
+							<text>涓诲浜猴細</text>{{item.涓诲浜簘}
+						</view>
+						<view class="detail" v-if="item.HServiceMan">
+							<text>HServiceMan锛�</text>{{item.HServiceMan}}
+						</view>
+						<!--  -->
+						<view class="detail" v-if="item.瀹㈡湇">
+							<text>瀹㈡湇锛�</text>{{item.瀹㈡湇}}
+						</view>
+						<view class="detail" v-if="item.瀹㈡埛">
+							<text>瀹㈡埛锛�</text>{{item.瀹㈡埛}}
+						</view>
+						<view class="detail" v-if="item.瀹㈡埛鑱旂郴浜�">
+							<text>瀹㈡埛鑱旂郴浜猴細</text>{{item.瀹㈡埛鑱旂郴浜簘}
+						</view>
+						<view class="detail" v-if="item.鎶曡瘔鍒嗙被">
+							<text>鎶曡瘔鍒嗙被锛�</text>{{item.鎶曡瘔鍒嗙被}}
+						</view>
+						
+						<view class="detail" v-if="item.鎶曡瘔鏃堕棿">
+							<text>鎶曡瘔鏃堕棿锛�</text>{{item.鎶曡瘔鏃堕棿}}
+						</view>
+						<view class="detail" v-if="item.鍙戠敓鏃堕棿">
+							<text>鍙戠敓鏃堕棿锛�</text>{{item.鍙戠敓鏃堕棿}}
+						</view>
+						<view class="detail" v-if="item.绱ф�ョ▼搴�">
+							<text>绱ф�ョ▼搴︼細</text>{{item.绱ф�ョ▼搴}
+						</view>
+						<view class="detail" v-if="item.杞﹂棿">
+							<text>杞﹂棿锛�</text>{{item.杞﹂棿}}
+						</view>
+						<view class="detail" v-if="item.瀹屾垚鏁伴噺">
+							<text>瀹屾垚鏁伴噺锛�</text>{{item.瀹屾垚鏁伴噺}}
+						</view>
+						<view class="detail" v-if="item.涓嶈壇鍘熷洜">
+							<text>涓嶈壇鍘熷洜锛�</text>{{item.涓嶈壇鍘熷洜}}
+						</view>
+						<view class="detail" v-if="item.闂鏉ユ簮">
+							<text>闂鏉ユ簮锛�</text>{{item.闂鏉ユ簮}}
+						</view>
+						<view class="detail" v-if="item.鍙戠敓宸ュ簭">
+							<text>鍙戠敓宸ュ簭锛�</text>{{item.鍙戠敓宸ュ簭}}
+						</view>
+					</view>
+					<view class="card-detail" v-if="showDetail == index">
+						<view class="detail" v-if="item.鍒跺崟浜�">
+							<text>鍒跺崟浜猴細</text>{{item.鍒跺崟浜簘}
+						</view>
+						<view class="detail" v-if="item.鍒跺崟鏃ユ湡">
+							<text>鍒跺崟鏃ユ湡锛�</text>{{item.鍒跺崟鏃ユ湡.substr(0,10)}}
+						</view>
+						<view class="detail" v-if="item.瀹℃牳浜�">
+							<text>瀹℃牳浜猴細</text>{{item.瀹℃牳浜簘}
+						</view>
+						<view class="detail" v-if="item.瀹℃牳鏃ユ湡">
+							<text>瀹℃牳鏃ユ湡锛�</text>{{item.瀹℃牳鏃ユ湡.substr(0,10)}}
+						</view>
+						<view class="detail" v-if="item.淇敼浜�">
+							<text>淇敼浜猴細</text>{{item.淇敼浜簘}
+						</view>
+						<view class="detail" v-if="item.淇敼鏃ユ湡">
+							<text>淇敼鏃ユ湡锛�</text>{{item.淇敼鏃ユ湡.substr(0,10)}}
+						</view>
+						<view class="detail" v-if="item.鍏抽棴浜�">
+							<text>鍏抽棴浜猴細</text>{{item.鍏抽棴浜簘}
+						</view>
+						<view class="detail" v-if="item.鍏抽棴鏃ユ湡">
+							<text>鍏抽棴鏃ユ湡锛�</text>{{item.鍏抽棴鏃ユ湡.substr(0,10)}}
+						</view>
+						<view class="detail" v-if="item.浣滃簾浜�">
+							<text>浣滃簾浜猴細</text>{{item.浣滃簾浜簘}
+						</view>
+						<view class="detail" v-if="item.浣滃簾鏃ユ湡">
+							<text>浣滃簾鏃ユ湡锛�</text>{{item.浣滃簾鏃ユ湡.substr(0,10)}}
+						</view>
+					</view>
+
+
+					<view class="more" v-if="showDetail == index && operations != index">
+						<view class="part" style="border-right: 1px solid #eee;">
+							<uni-icons type="top" style="color: #888;margin-right: 10rpx;" size="14"></uni-icons>鏀惰捣
+						</view>
+						<view class="part" @tap.stop="operations = operations==index?-1:index">
+							<uni-icons type="more-filled" style="color: #888;margin-right: 10rpx;"
+								size="14"></uni-icons>鎿嶄綔
+						</view>
+					</view>
+					<view class="more" v-if="showDetail != index && operations != index">
+						<view class="part" style="border-right: 1px solid #eee;">
+							<uni-icons type="bottom" style="color: #888;margin-right: 10rpx;" size="14"></uni-icons>鏇村淇℃伅
+						</view>
+						<view class="part" @tap.stop="operations = operations==index?-1:index">
+							<uni-icons type="more-filled" style="color: #888;margin-right: 10rpx;"
+								size="14"></uni-icons>鎿嶄綔
+						</view>
+					</view>
+
+					<view class="op" v-if="operations == index">
+						<button class="op3" size="mini" plain @tap.stop="edit(item)">缂栬緫</button>
+						<button class="op6" size="mini" plain @tap.stop="Browse(item)">鏌ョ湅鏄庣粏</button>
+						<button class="op4" size="mini" plain @tap.stop="del(item)">鍒犻櫎</button>
+						<button class="op5" size="mini" plain @tap.stop="operations = -1">鍙栨秷鎿嶄綔</button>
+					</view>
+				</uni-card>
+			</view>
+			<view class="over" v-if="listData.length == 0">鏆傛棤鏁版嵁</view>
+		</scroll-view>
+		<!-- 鍒嗛〉鍣� -->
+		<view class="page-footer">
+			<uni-pagination id="pagination" title="鏍囬鏂囧瓧" v-model="pageMeta.curPage" :pageSize="pageMeta.size"
+				:total="pageMeta.total" @change="onPageChangeHandler"></uni-pagination>
+		</view>
+	</view>
+</template>
+
+<script>
+	import dayjs from 'dayjs'
+	import {
+		CommonUtils
+	} from '@/utils/common.js'
+	import {
+		getUserInfo
+	} from "../../utils/auth";
+	export default {
+		data() {
+			return {
+				// 璁$畻鍗$墖鍒楄〃楂樺害
+				pagination_top: 0,
+				pageContent_top: 0,
+				// 鍒嗛〉鎺у埗
+				pageMeta: {
+					curPage: 1,
+					size: 50,
+					total: 0,
+				},
+				// 婊氬姩鎺у埗
+				scrollTop: 0,
+				old: {
+					scrollTop: 0
+				},
+
+				dateRangePicker: ["浠绘剰闂撮殧", "浠婂ぉ", "杩戜袱澶�", "杩戜笁澶�", "杩戝洓澶�", "杩戜簲澶�", "杩戝叚澶�", "杩戜竷澶�", "杩�30澶�"],
+				curDateGap: "杩戜竷澶�",
+				enableCustomDateRange: false,
+				startDate: dayjs(new Date()).subtract(7, 'day').format('YYYY-MM-DD'),
+				endDate: dayjs(new Date()).format('YYYY-MM-DD'),
+				HBillNo: '',
+
+				listData: [],
+				showDetail: -1,
+				operations: -1,
+			}
+		},
+		computed: {
+			pageContentHeight: {
+				get() {
+					return (this.pagination_top - this.pageContent_top)
+				}
+			},
+		},
+		onLoad() {
+			this.onSearchClickHandler()
+		},
+		onPullDownRefresh() {
+			this.onSearchClickHandler()
+		},
+		async onReady() {
+			// #ifndef MP-WEIXIN
+			let query = uni.createSelectorQuery().in(this)
+			query.select("#pagination")
+				.boundingClientRect((data) => {
+					if (data) {
+						this.pagination_top = data.top
+					} else {
+						console.log("鏈壘鍒�#pagination鑺傜偣");
+					}
+				})
+				.exec();
+			query.select("#pageContent")
+				.boundingClientRect((data) => {
+					if (data) {
+						this.pageContent_top = data.top
+					} else {
+						console.log("鏈壘鍒�#pageContent鑺傜偣");
+					}
+				})
+				.exec();
+			// #endif
+
+		},
+		methods: {
+			goTop: function(e) {
+				// 瑙e喅view灞備笉鍚屾鐨勯棶棰�
+				this.scrollTop = this.old.scrollTop
+				this.$nextTick(function() {
+					this.scrollTop = 0
+				});
+			},
+			onDateRangePickerChangeHandler({
+				detail
+			}) {
+				this.enableCustomDateRange = false
+				this.curDateGap = this.dateRangePicker[detail.value]
+				let date = new Date()
+				switch (this.curDateGap) {
+					case "浠婂ぉ":
+						this.startDate = dayjs(date).format("YYYY-MM-DD")
+						break;
+					case "杩戜竴澶�":
+						this.startDate = dayjs(date).subtract(1, 'day').format("YYYY-MM-DD")
+						break;
+					case "杩戜袱澶�":
+						this.startDate = dayjs(date).subtract(2, 'day').format("YYYY-MM-DD")
+						break;
+					case "杩戜笁澶�":
+						this.startDate = dayjs(date).subtract(3, 'day').format("YYYY-MM-DD")
+						break;
+					case "杩戝洓澶�":
+						this.startDate = dayjs(date).subtract(4, 'day').format("YYYY-MM-DD")
+						break;
+					case "杩戜簲澶�":
+						this.startDate = dayjs(date).subtract(5, 'day').format("YYYY-MM-DD")
+						break;
+					case "杩戝叚澶�":
+						this.startDate = dayjs(date).subtract(6, 'day').format("YYYY-MM-DD")
+						break;
+					case "杩戜竷澶�":
+						this.startDate = dayjs(date).subtract(7, 'day').format("YYYY-MM-DD")
+						break;
+					case "杩�30澶�":
+						this.startDate = dayjs(date).subtract(30, 'day').format("YYYY-MM-DD")
+						break;
+				}
+				if (this.curDateGap == '浠绘剰闂撮殧') {
+					this.enableCustomDateRange = true
+				}
+			},
+			onSearchClickHandler() {
+				let sWhere = ""
+				if (this.startDate) {
+					sWhere += " and CONVERT(varchar(100),鏃ユ湡, 23) >= '" + this.startDate + "'";
+				}
+				if (this.endDate) {
+					sWhere += " and CONVERT(varchar(100),鏃ユ湡, 23) <= '" + this.endDate + "'";
+				}
+				if (this.HBillNo) {
+					sWhere += " and 鍗曟嵁鍙� like '%" + this.HBillNo + "%'";
+				}
+				this.get_DisplayPage(sWhere);
+			},
+			clear() {
+				this.curDateGap = "杩戜竷澶�"
+				this.enableCustomDateRange = false
+				this.startDate = dayjs(new Date()).subtract(7, 'day').format('YYYY-MM-DD')
+				this.endDate = dayjs(new Date()).format('YYYY-MM-DD')
+				this.HBillNo = ''
+			},
+			async onResetClickHandler() {
+				this.clear()
+				await this.$nextTick()
+				this.onSearchClickHandler()
+			},
+			get_DisplayPage(sWhere) {
+				CommonUtils.doRequest2({
+					url: '/Crm_CustomerAppealBill/list',
+					data: {
+						"sWhere": sWhere,
+						"user": getUserInfo()["Czymc"],
+						
+					},
+					resFunction: (res) => {
+						let {
+							data,
+							Message,
+							count
+						} = res.data
+						console.log('res.data: ', res.data.data);
+						if(res.data.Message=="鏃犳煡鐪嬫潈闄愶紒")
+						{
+							uni.showToast({
+								icon: 'none',
+								title: res.data.Message
+							})
+							return;
+						}
+						this.listData = res.data.data;
+						this.pageMeta.total = count
+						uni.stopPullDownRefresh()
+					}
+				})
+			},
+			onPageChangeHandler() {
+				this.onSearchClickHandler()
+				this.goTop()
+			},
+			// 鏂板
+			onAddClickHandler() {
+				uni.navigateTo({
+					url: "/pages/CustomerComplaintsBill/CustomerComplaintsBillEdit?btnType=1"
+				})
+			},
+			//鍒犻櫎鐐规璁板綍鍗�
+			del(item) {
+				console.log(item);
+				uni.showModal({
+					title: '鍒犻櫎纭',
+					content: '纭瑕佸垹闄ゅ悧锛屽垹闄ゅ悗涓嶈兘鎭㈠',
+					success: (res) => {
+						if (res.confirm) {
+							console.log('鐢ㄦ埛鐐瑰嚮纭畾');
+							CommonUtils.doRequest2({
+								url: '/Crm_CustomerAppealBill/delete',
+								data: {
+									HInterID: item['HInterID'],
+									user: getUserInfo()['Czymc']
+								},
+								resFunction: (res) => {
+									let {
+										data,
+										count,
+										Message
+									} = res.data
+									if (count == 1) {
+										uni.showToast({
+											icon: count === 1 ? 'success' : 'error',
+											title: Message,
+											duration: 2000
+										});
+
+										// 绛夊緟鎻愮ず鏄剧ず瀹屾垚鍐嶅埛鏂�
+										setTimeout(() => {
+											this.onSearchClickHandler();
+										}, 2000);
+									} else {
+										uni.showToast({
+											icon: 'none',
+											title: Message
+										})
+									}
+								}
+							})
+						} else if (res.cancel) {
+							console.log('鐢ㄦ埛鐐瑰嚮鍙栨秷');
+						}
+					}
+				});
+			},
+			Browse(item)
+			{
+				console.log(item.HInterID)
+				uni.navigateTo({
+					url: '/pages/CustomerComplaintsBill/CustomerComplaintsBillDetail?linterid=' + item.HInterID + '&HBillNo=' + item.鍗曟嵁鍙�
+				})
+			},
+			edit(item)
+			{
+				console.log(item)
+				uni.navigateTo({
+					url: '/pages/CustomerComplaintsBill/CustomerComplaintsBillEdit?linterid=' + item.HInterID + '&btnType=' + 3
+				})
+			}
+		},
+	}
+</script>
+
+<style lang="scss">
+	.page-header {
+		display: flex;
+		box-sizing: border-box;
+		padding: 20rpx;
+		flex-direction: column;
+		gap: 10rpx;
+		font-size: 32rpx;
+
+		.search-item {
+			display: flex;
+			flex-direction: row;
+			gap: 10rpx;
+			justify-content: center;
+			align-items: center;
+
+			.left {
+				width: 4em;
+			}
+
+			.right {
+				flex: 1;
+				position: relative;
+				border-radius: 22rpx;
+				border: 1px solid #acacac;
+				display: flex;
+				padding: 4rpx 10rpx;
+
+				picker {
+					width: 100%;
+				}
+			}
+		}
+
+		input {
+			width: inherit;
+			padding: 8rpx 20rpx;
+			font-size: 30rpx;
+		}
+
+		.datetime-picker-inner {
+			padding: 8rpx 20rpx;
+			font-size: 30rpx;
+			display: flex;
+			align-items: center;
+		}
+
+		.font__enable {
+			color: #000;
+		}
+
+		.font__disable {
+			color: #cccccc;
+		}
+	}
+
+	.button-groups {
+		box-sizing: border-box;
+		padding: 10rpx 0 0 0;
+		display: flex;
+		flex-direction: row;
+		gap: 10rpx;
+		justify-content: space-between;
+
+		button {
+			border-radius: 50rpx;
+			width: 180rpx;
+			height: 66rpx;
+			line-height: 66rpx;
+			font-size: 28rpx;
+		}
+
+		.btn-a {
+			background-color: #acacac;
+			color: #fff;
+		}
+
+		.btn-b {
+			background-color: #41a863;
+			color: #fff;
+		}
+
+		.btn-c {
+			background-color: #3a78ff;
+			color: #fff;
+		}
+	}
+
+	.page-content {
+		// height: 40vh;
+		box-sizing: border-box;
+		padding: 10rpx 0;
+
+		.card-detail {
+			width: 100%;
+			display: flex;
+			flex-wrap: wrap;
+			justify-content: space-between;
+			line-height: 120%;
+
+			.detail {
+				// width: 50%;
+				font-size: 26rpx;
+				margin-bottom: 12rpx;
+				color: #555;
+				margin-right: 20rpx;
+
+				text {
+					color: #999;
+					font-size: 26rpx;
+				}
+			}
+		}
+
+		.more {
+			color: #888;
+			font-size: 24rpx;
+			display: flex;
+			border-top: 1px solid #eee;
+			padding-top: 20rpx;
+
+			.part {
+				width: 50%;
+				text-align: center;
+			}
+		}
+
+		.op {
+			display: flex;
+			justify-content: space-around;
+			margin-top: 20rpx;
+
+			button {
+				padding: 0;
+				width: 150rpx;
+				font-size: 25rpx;
+			}
+
+			.op1 {
+				border: 1px solid #41a863;
+				color: #41a863;
+			}
+
+			.op2 {
+				border: 1px solid #d98d00;
+				color: #d98d00;
+			}
+
+			.op3 {
+				border: 1px solid #3a78ff;
+				color: #3a78ff;
+			}
+
+			.op4 {
+				border: 1px solid #da0000;
+				color: #da0000;
+			}
+
+			.op5 {
+				border: 1px solid #888;
+				color: #888;
+			}
+		}
+	}
+
+	.page-footer {
+		position: fixed;
+		bottom: 0;
+		width: 100%;
+		box-sizing: border-box;
+		padding: 32rpx 40rpx;
+	}
+</style>
\ No newline at end of file
diff --git a/pages/index/tab4.vue b/pages/index/tab4.vue
index fbeebe6..bbd27cf 100644
--- a/pages/index/tab4.vue
+++ b/pages/index/tab4.vue
@@ -203,6 +203,13 @@
 						"id": 22,
 						"hidden": false
 					},
+					{
+						"img": "../../static/icon/icon15.png",
+						"text": "瀹㈣瘔澶勭悊鍗曞垪琛�",
+						"url": "/pages/CustomerComplaintsBill/CustomerComplaintsBillList",
+						"id": 23,
+						"hidden": false
+					},
 				]
 			}
 		},

--
Gitblit v1.9.1