695593266@qq.com 1 miesiąc temu
rodzic
commit
742966655d

+ 89 - 64
api/pda/workOrder.js

@@ -6,7 +6,7 @@ export async function workorderPage(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workorder/page`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -19,7 +19,7 @@ export async function workorderMyPage(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/mes/workorder/my-page`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -31,7 +31,7 @@ export async function workorderMyPage(params) {
 
 export async function getTaskInstanceList(id) {
   const data = await get(
-    Vue.prototype.apiUrl + `/pda/mes/workorder/getTaskInstanceById/${id}`
+    Vue.prototype.apiUrl + `/pda/mes/workorder/getTaskInstanceById/${id}`,
   );
   if (data.code == 0) {
     return data.data;
@@ -42,7 +42,7 @@ export async function getTaskInstanceList(id) {
 export async function currentStockQuery(id) {
   // 通过get请求获取数据
   const data = await get(
-    Vue.prototype.apiUrl + `/pda/mes/workreport/currentStockQuery/${id}`
+    Vue.prototype.apiUrl + `/pda/mes/workreport/currentStockQuery/${id}`,
   );
   if (data.code == 0) {
     return data.data;
@@ -55,7 +55,7 @@ export async function workorderInfo(id) {
   let timeStamp = new Date().getTime();
   const data = await get(
     Vue.prototype.apiUrl +
-      `/pda/mes/workorder/getById/${id}?timeStamp=${timeStamp}`
+      `/pda/mes/workorder/getById/${id}?timeStamp=${timeStamp}`,
   );
   if (data.code == 0) {
     return data.data;
@@ -69,7 +69,7 @@ export async function workorderList(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workorder/list`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -82,7 +82,7 @@ export async function treeByPid(params) {
   const data = await get(
     Vue.prototype.apiUrl + `/pda/main/categoryLevel/pdaTreeByPid`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -94,7 +94,7 @@ export async function treeByPid(params) {
 
 export async function getTwoTreeByPid(parentId) {
   const data = await get(
-    Vue.prototype.apiUrl + `/main/categoryLevel/getTwoTreeByPid/${parentId}`
+    Vue.prototype.apiUrl + `/main/categoryLevel/getTwoTreeByPid/${parentId}`,
   );
   if (data.code == 0) {
     return data.data;
@@ -105,7 +105,7 @@ export async function getTwoTreeByPid(parentId) {
 // 只查最后一层的分类
 export async function getLastTreeByPid(parentId) {
   const data = await get(
-    Vue.prototype.apiUrl + `/main/categoryLevel/getLastTreeByPid/${parentId}`
+    Vue.prototype.apiUrl + `/main/categoryLevel/getLastTreeByPid/${parentId}`,
   );
   if (data.code == 0) {
     return data.data;
@@ -118,7 +118,7 @@ export async function listWorkOrderByTaskId(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workorder/listWorkOrderByTaskId`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -131,7 +131,7 @@ export async function disposeorder(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/disposeorder/batchSave`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -143,7 +143,7 @@ export async function qualityReview(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/feed/qualityReview`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -156,7 +156,7 @@ export async function feedOutInOrder(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/feed/feedOutInOrder`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -169,7 +169,32 @@ export async function pageeLedgerMain(params) {
   const data = await get(
     Vue.prototype.apiUrl + `/wms/outInDetailPda/page`,
     params,
-    true
+    true,
+  );
+  if (data.code == 0) {
+    return data.data;
+  }
+  return Promise.reject(data.message);
+}
+
+//批次维度查库存
+export async function getBatchListInventory(params) {
+  const data = await get(
+    Vue.prototype.apiUrl + `/wms/outindetailtwo/batchPage`,
+    params,
+    true,
+  );
+  if (data.code == 0) {
+    return data.data;
+  }
+  return Promise.reject(data.message);
+}
+// 物品维度查库存
+export async function getProductListInventory(params) {
+  const data = await get(
+    Vue.prototype.apiUrl + `/wms/outindetailtwo/page`,
+    params,
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -182,7 +207,7 @@ export async function assetPage(params) {
   const data = await get(
     Vue.prototype.apiUrl + `/main/asset/pdaPage`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -195,7 +220,7 @@ export async function getInventoryDetails(params) {
   const data = await get(
     Vue.prototype.apiUrl + `/wms/outin/getInventoryDetails`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -208,7 +233,7 @@ export async function getMaterielDetails(params) {
   const data = await get(
     Vue.prototype.apiUrl + `/wms/outin/getMaterielDetails`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -221,7 +246,7 @@ export async function listInProduct(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/feed/listInProduct`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -234,7 +259,7 @@ export async function listOutsourceInWarehouse(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/mes/applyoutsource/listOutsourceInWarehouse`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -247,7 +272,7 @@ export async function outsourceEndPick(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/pickorder/outsourceEndPick`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -261,7 +286,7 @@ export async function realTimeInventory(params) {
   const data = await get(
     Vue.prototype.apiUrl + `/wms/outin/getRealTimeInventory`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -273,7 +298,7 @@ export async function categoryGetList(params) {
   const data = await get(
     Vue.prototype.apiUrl + `/main/category/getList`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -285,7 +310,7 @@ export async function assetPdaPage(params) {
   const data = await get(
     Vue.prototype.apiUrl + `/main/asset/pdaPage`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -296,7 +321,7 @@ export async function assetPdaPage(params) {
 // 生产明细
 export async function produceDetail(id) {
   const data = await get(
-    Vue.prototype.apiUrl + `/pda/mes/workorder/produceDetail/${id}`
+    Vue.prototype.apiUrl + `/pda/mes/workorder/produceDetail/${id}`,
   );
   if (data.code == 0) {
     return data.data;
@@ -309,7 +334,7 @@ export async function producerouting(params) {
   const data = await get(
     Vue.prototype.apiUrl + `/main/producerouting/page`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -320,7 +345,7 @@ export async function producerouting(params) {
 // PDA检查投料状态
 export async function checkStatus(id, taskId) {
   const data = await get(
-    Vue.prototype.apiUrl + `/pda/mes/feed/checkStatus/${id}/${taskId}`
+    Vue.prototype.apiUrl + `/pda/mes/feed/checkStatus/${id}/${taskId}`,
   );
   if (data.code == 0) {
     return data.data;
@@ -332,7 +357,7 @@ export async function checkStatus(id, taskId) {
 
 export async function getByCode(code) {
   const data = await get(
-    Vue.prototype.apiUrl + `/pda/mes/workorder/getByCode/${code}`
+    Vue.prototype.apiUrl + `/pda/mes/workorder/getByCode/${code}`,
   );
 
   if (data.code == 0) {
@@ -345,7 +370,7 @@ export async function getByCode(code) {
 
 export async function scanLedger(code) {
   const data = await get(
-    Vue.prototype.apiUrl + `/main/asset/getByCode/${code}`
+    Vue.prototype.apiUrl + `/main/asset/getByCode/${code}`,
   );
 
   if (data.code == 0) {
@@ -358,7 +383,7 @@ export async function scanLedger(code) {
 
 export async function getWarehouseList() {
   const data = await post(
-    Vue.prototype.apiUrl + `/wms/warehouse/getWarehouseList`
+    Vue.prototype.apiUrl + `/wms/warehouse/getWarehouseList`,
   );
 
   if (data.code == 0) {
@@ -372,7 +397,7 @@ export async function getVehicle(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/getVehicle`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -386,7 +411,7 @@ export async function transferVehicle(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/transferVehicle`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -400,7 +425,7 @@ export async function qualityTransferVehicle(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/qualityTransferVehicle`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -414,7 +439,7 @@ export async function getNewVehicle(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/getNewVehicle`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -428,7 +453,7 @@ export async function listWorkReport(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/listWorkReport`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -442,7 +467,7 @@ export async function listApplystorage(params) {
   const data = await get(
     Vue.prototype.apiUrl + `/mes/applystorage/list`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -457,7 +482,7 @@ export async function cancelPacking(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/cancelPacking`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -472,7 +497,7 @@ export async function packingReport(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/packingReport`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -484,7 +509,7 @@ export async function packingReport(params) {
 //最小包装
 export async function packageDisposition(taskId) {
   const data = await get(
-    Vue.prototype.apiUrl + `/main/category/packageDisposition/${taskId}`
+    Vue.prototype.apiUrl + `/main/category/packageDisposition/${taskId}`,
   );
 
   if (data.code == 0) {
@@ -499,7 +524,7 @@ export async function getPackingReport(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/getPackingReport`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -513,7 +538,7 @@ export async function packingReportRepeat(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/packingReportRepeat`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -527,7 +552,7 @@ export async function getPackingReportRepeat(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/getPackingReportRepeat`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -542,7 +567,7 @@ export async function sampleTurnoverReview(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/feed/sampleTurnoverReview`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -554,7 +579,7 @@ export async function sampleTurnoverReview(params) {
 // PDA抽样质检 ( 获取工序参数)
 export async function paramByTaskId(taskId) {
   const data = await get(
-    Vue.prototype.apiUrl + `/main/taskqualityparam/listByTaskId/${taskId}`
+    Vue.prototype.apiUrl + `/main/taskqualityparam/listByTaskId/${taskId}`,
   );
 
   if (data.code == 0) {
@@ -568,7 +593,7 @@ export async function listPDAToWarehouse(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/listPDAToWarehouse`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -582,7 +607,7 @@ export async function listPDAToWarehouseTG(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/listPDAToWarehouseTG`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -595,7 +620,7 @@ export async function listPDAToWarehouseTG(params) {
 export async function checkOutsource(param) {
   const data = await get(
     Vue.prototype.apiUrl + `/mes/applyoutsource/checkOutsource`,
-    param
+    param,
   );
 
   if (data.code == 0) {
@@ -609,7 +634,7 @@ export async function applyoutsourceSave(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/mes/applyoutsource/save`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -623,7 +648,7 @@ export async function updateStatusPause(params) {
   const data = await putJ(
     Vue.prototype.apiUrl + `/mes/workorder/updateStatusPause`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -636,7 +661,7 @@ export async function updateStatusPauseRecover(params) {
   const data = await putJ(
     Vue.prototype.apiUrl + `/mes/workorder/updateStatusPauseRecover`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -649,7 +674,7 @@ export async function updateStatusTerminate(params) {
   const data = await putJ(
     Vue.prototype.apiUrl + `/mes/workorder/updateStatusTerminate`,
     params,
-    true
+    true,
   );
   if (data.code == 0) {
     return data.data;
@@ -662,7 +687,7 @@ export async function skipTask(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/skipTask`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -677,7 +702,7 @@ export async function saveCache(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/saveCache`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -692,7 +717,7 @@ export async function getCache(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/getCache`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -707,7 +732,7 @@ export async function feedSaveCache(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/feed/saveCache`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -721,7 +746,7 @@ export async function feedGetCache(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/feed/getCache`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -735,7 +760,7 @@ export async function removeCache(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/removeCache`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -750,7 +775,7 @@ export async function znPdaPage(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/main/asset/znPdaPage`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -765,7 +790,7 @@ export async function qualityParamApi(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/mes/workorder/qualityParam`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -780,7 +805,7 @@ export async function qualityQy(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workorder/qualityParam`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -794,7 +819,7 @@ export async function qualityQy(params) {
 export async function listOutsource(param) {
   const data = await get(
     Vue.prototype.apiUrl + `/mes/applyoutsource/listOutsource`,
-    param
+    param,
   );
 
   if (data.code == 0) {
@@ -808,7 +833,7 @@ export async function listOutsource(param) {
 export async function checkOutsourceMaterial(param) {
   const data = await get(
     Vue.prototype.apiUrl + `/mes/applyoutsource/checkOutsourceMaterial`,
-    param
+    param,
   );
 
   if (data.code == 0) {
@@ -819,7 +844,7 @@ export async function checkOutsourceMaterial(param) {
 
 export async function productReceiveCreate(param) {
   const data = await get(
-    Vue.prototype.apiUrl + `/pda/mes/workreport/productReceiveCreate/${param}`
+    Vue.prototype.apiUrl + `/pda/mes/workreport/productReceiveCreate/${param}`,
   );
 
   if (data.code == 0) {
@@ -832,7 +857,7 @@ export async function getInventoryTotal(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/wms/stocktwo/getInventoryTotal`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {
@@ -847,7 +872,7 @@ export async function getPackingList(params) {
   const data = await postJ(
     Vue.prototype.apiUrl + `/pda/mes/workreport/packingReportRework`,
     params,
-    true
+    true,
   );
 
   if (data.code == 0) {

+ 9 - 0
pages.json

@@ -1824,6 +1824,15 @@
 			}
 		},
 
+				{
+			"path": "pages/pda/workOrder/search/newIndex",
+			"style": {
+				"navigationBarTitleText": "搜索",
+				"navigationStyle": "custom",
+				"navigationBarTextStyle": "white"
+			}
+		},
+
 		{
 			"path": "pages/pda/selfBuiltPickOrder/components/choosePickList",
 			"style": {

+ 1 - 1
pages/pda/components/bottomOperate.vue

@@ -1052,7 +1052,7 @@ export default {
 
 .nav_box {
   width: 750rpx;
-  height: 40rpx;
+  height: 56rpx;
   background: $theme-color;
 
   .open_icon {

+ 163 - 112
pages/pda/feeding/components/feedCard.vue

@@ -1,70 +1,64 @@
 <template>
-	<view>
-
+	<view class="feed-card-list">
 		<checkbox-group v-for="(item, index) in list" :key="index" @change="e => selectVal(e, item, index)">
-		     <label>
-			<view class="card_box" @click="openDetails(item.feedStatus, item.id)">
-				<view class="item_box rx-bc">
-					<view class="rx-sc">
-						<checkbox  v-if='item.feedStatus == 0' :checked="item.checked" />
-							
-						<view class="orderId">{{item.code}} </view>
-					</view>
-					<view class="status " :class="[item.feedStatus == 0 ? 'FAA': '' ]"> {{ item.feedStatus == 0 ? '未投料' : item.feedStatus == 1 ? '已投料' : ''}}</view>
-				</view>
-
-				<view class="item_box rx-bc">
-					<view class="item_one perce50 rx-sc">
-						<view class="lable">产品编码:</view>
-						<view>{{item.productCode}}</view>
-					</view>
-					<view class="item_one perce50 rx-sc">
-						<view>名称:</view>
-						<view>{{item.productName}}</view>
-					</view>
-				</view>
-
-
-				<view class="item_box rx-bc">
-					<view class="item_one perce50 rx-sc">
-						<view class="lable">牌号:</view>
-						<view>{{item.brandNo}}</view>
-					</view>
-					<view class="item_one perce50 rx-sc">
-						<view>型号:</view>
-						<view>{{item.model}}</view>
-					</view>
-				</view>
-
-
-				<view class="item_box rx-bc">
-					<view class="item_one perce50 rx-sc">
-						<view class="lable">生产数量:</view>
-						<view>{{item.formingNum}}</view>
-						<view>{{item.unit}}</view>
-					</view>
-					<view class="item_one perce50 rx-sc">
-						<view>状态:</view>
-						<view>{{statusList[item.status]}}</view>
+			<label>
+				<view class="card-item" @click="openDetails(item.feedStatus, item.id)">
+					<!-- 卡片头部:编码 + 状态 -->
+					<view class="card-header">
+						<view class="header-left">
+							<checkbox v-if="item.feedStatus == 0" :checked="item.checked" class="card-checkbox" />
+							<text class="order-code">{{ item.code }}</text>
+						</view>
+						<view class="status-tag" :class="item.feedStatus == 0 ? 'status-pending' : 'status-done'">
+							{{ item.feedStatus == 0 ? '未投料' : item.feedStatus == 1 ? '已投料' : '' }}
+						</view>
 					</view>
-				</view>
-
 
-				<view class="item_box rx-sc">
-					<view class="item_one rx-sc">
-						<view class="lable">工艺路线:</view>
-						<view class="gylx">{{item.produceRoutingName}}</view>
+					<!-- 卡片内容 -->
+					<view class="card-body">
+						<view class="info-row">
+							<view class="info-col">
+								<text class="info-label">产品编码</text>
+								<text class="info-value">{{ item.productCode }}</text>
+							</view>
+							<view class="info-col">
+								<text class="info-label">名称</text>
+								<text class="info-value">{{ item.productName }}</text>
+							</view>
+						</view>
+
+						<view class="info-row">
+							<view class="info-col">
+								<text class="info-label">牌号</text>
+								<text class="info-value">{{ item.brandNo }}</text>
+							</view>
+							<view class="info-col">
+								<text class="info-label">型号</text>
+								<text class="info-value">{{ item.model }}</text>
+							</view>
+						</view>
+
+						<view class="info-row">
+							<view class="info-col">
+								<text class="info-label">生产数量</text>
+								<text class="info-value">{{ item.formingNum }} {{ item.unit }}</text>
+							</view>
+							<view class="info-col">
+								<text class="info-label">状态</text>
+								<text class="info-value">{{ statusList[item.status] }}</text>
+							</view>
+						</view>
+
+						<view class="info-row info-row--full">
+							<view class="info-col info-col--full">
+								<text class="info-label">工艺路线</text>
+								<text class="info-value info-value--highlight">{{ item.produceRoutingName }}</text>
+							</view>
+						</view>
 					</view>
-
 				</view>
-
-
-
-			</view>
 			</label>
-
 		</checkbox-group>
-
 	</view>
 </template>
 
@@ -92,10 +86,10 @@
 			selectVal(e, val, index) {
 				this.list[index].checked = !this.list[index].checked
 			},
-			
+
 			openDetails(feedStatus, id) {
-				if(feedStatus == 1) {
-					 let url =  `/pages/pda/feeding/bill/index?id=${id}`
+				if (feedStatus == 1) {
+					let url = `/pages/pda/feeding/bill/index?id=${id}`
 					uni.navigateTo({
 						url
 					})
@@ -108,61 +102,118 @@
 
 
 <style lang="scss" scoped>
-	.card_box {
-		width: 750rpx;
-		padding: 16rpx 24rpx;
-		box-sizing: border-box;
-		border-bottom: 2rpx solid #E1E1E1;
-
-
-		.item_box {
-			margin-top: 10rpx;
-
-		
-
-			.orderId {
-				color: #000;
-				font-family: PingFang HK;
-				font-size: 28rpx;
-				font-style: normal;
-				font-weight: 600;
-				margin-left: 16rpx;
-				margin-top: 8rpx;
-			}
+	.feed-card-list {
+		padding: 0 24rpx;
+	}
 
-			.item_one {
-				width: 100%;
-				font-size: 26rpx;
-				font-style: normal;
-				font-weight: 400;
-				line-height: 38rpx;
-				word-wrap: break-word;
-			}
+	.card-item {
+		background-color: #fff;
+		border-radius: 16rpx;
+		margin-bottom: 20rpx;
+		overflow: hidden;
+		box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
+	}
 
-			.gylx {
-				color: $theme-color;
-			}
+	.card-header {
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		justify-content: space-between;
+		padding: 24rpx 28rpx;
+		border-bottom: 1rpx solid #f0f0f0;
+
+		.header-left {
+			display: flex;
+			flex-direction: row;
+			align-items: center;
+			flex: 1;
+			overflow: hidden;
+		}
 
-			.perce50 {
-				width: 50%;
-			}
+		.card-checkbox {
+			flex-shrink: 0;
+			margin-right: 16rpx;
+		}
+
+		.order-code {
+			color: $uni-text-color;
+			font-size: $j-font-text-default;
+			font-weight: 600;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			white-space: nowrap;
+		}
 
-			.status {
-				font-size: 26rpx;
+		.status-tag {
+			flex-shrink: 0;
+			font-size: $uni-font-size-ssm;
+			padding: 6rpx 20rpx;
+			border-radius: 20rpx;
+			margin-left: 16rpx;
+		}
 
-				&.FAA {
-					color: #FFA929;
-				}
-			}
-			
-			
-			/deep/ .uni-checkbox-input-checked {
-				background-color: $theme-color !important;
-				border-color: $theme-color !important;
+		.status-pending {
+			color: #E6A23C;
+			background-color: rgba(230, 162, 60, 0.1);
+		}
+
+		.status-done {
+			color: $theme-color;
+			background-color: rgba(21, 122, 44, 0.1);
+		}
+
+		/deep/ .uni-checkbox-input-checked {
+			background-color: $theme-color !important;
+			border-color: $theme-color !important;
+		}
+	}
+
+	.card-body {
+		padding: 20rpx 28rpx 24rpx;
+	}
+
+	.info-row {
+		display: flex;
+		flex-direction: row;
+		margin-bottom: 16rpx;
+
+		&:last-child {
+			margin-bottom: 0;
+		}
+
+		&--full {
+			flex-direction: column;
+		}
+	}
+
+	.info-col {
+		flex: 1;
+		display: flex;
+		flex-direction: column;
+		min-width: 0;
+
+		&--full {
+			flex: none;
+			width: 100%;
+		}
+
+		.info-label {
+			font-size: $uni-font-size-ssm;
+			color: $uni-text-color-grey;
+			line-height: 36rpx;
+			margin-bottom: 4rpx;
+		}
+
+		.info-value {
+			font-size: $uni-font-size-sm;
+			color: $uni-text-color;
+			line-height: 40rpx;
+			word-break: break-all;
+
+			&--highlight {
+				color: $theme-color;
+				font-weight: 500;
 			}
 		}
 	}
-	
-	
-	
-</style>
+</style>

+ 40 - 31
pages/pda/feeding/index/index.vue

@@ -5,11 +5,6 @@
 		</uni-nav-bar>
 
 		<view class="top-wrapper">
-			<!-- 	<view class="tab_box rx-sc">
-				<view class="tab_item" :class="{active: tabType == 1}" @click="handTab(1)">生产工单列表</view>
-				<view class="tab_item" :class="{active: tabType == 2}" @click="handTab(2)">领料工单列表</view>
-			</view> -->
-
 			<view class="nav_box">
 				<view class="nav_inner">
 					<view class="nav_item" :class="{active: feedStatus == 0}" @click="handNav(0)">
@@ -310,21 +305,24 @@
 	}
 
 	.top-wrapper {
+		flex-shrink: 0;
 		background-color: #fff;
-		box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
+		box-shadow: 0 2rpx 16rpx rgba(0, 0, 0, 0.05);
+		z-index: 10;
 	}
 
 	.tab_box {
 		width: 100%;
-		height: 80rpx;
+		height: 88rpx;
 		background: #fff;
 		display: flex;
+		flex-direction: row;
 		align-items: center;
 
 		.tab_item {
-			height: 80rpx;
-			line-height: 80rpx;
-			padding: 0 30rpx;
+			height: 88rpx;
+			line-height: 88rpx;
+			padding: 0 36rpx;
 			font-size: $uni-font-size-base;
 			color: $uni-text-color-grey;
 			position: relative;
@@ -333,7 +331,7 @@
 
 		.active {
 			color: $theme-color;
-			font-weight: 500;
+			font-weight: 600;
 
 			&::after {
 				content: '';
@@ -341,7 +339,7 @@
 				bottom: 0;
 				left: 50%;
 				transform: translateX(-50%);
-				width: 60%;
+				width: 56%;
 				height: 6rpx;
 				background-color: $theme-color;
 				border-radius: 6rpx;
@@ -354,7 +352,7 @@
 		flex-direction: row;
 		align-items: center;
 		justify-content: space-between;
-		padding: 16rpx 24rpx;
+		padding: 20rpx 24rpx;
 		background-color: #fff;
 
 		.nav_inner {
@@ -371,8 +369,8 @@
 			font-weight: 400;
 			color: $theme-color;
 			background: rgba(21, 122, 44, 0.06);
-			padding: 10rpx 28rpx;
-			border-radius: 32rpx;
+			padding: 12rpx 32rpx;
+			border-radius: 36rpx;
 			border: 2rpx solid rgba(21, 122, 44, 0.2);
 			transition: all 0.25s ease;
 			white-space: nowrap;
@@ -383,7 +381,7 @@
 			border-color: $theme-color;
 			color: #fff;
 			font-weight: 500;
-			box-shadow: 0 4rpx 12rpx rgba(21, 122, 44, 0.3);
+			box-shadow: 0 4rpx 16rpx rgba(21, 122, 44, 0.25);
 		}
 
 		.menu_box {
@@ -391,11 +389,15 @@
 			display: flex;
 			align-items: center;
 			justify-content: center;
-			width: 64rpx;
-			height: 64rpx;
+			width: 68rpx;
+			height: 68rpx;
 			border-radius: 50%;
 			background-color: $page-bg;
-			margin-left: 16rpx;
+			margin-left: 20rpx;
+
+			&:active {
+				opacity: 0.7;
+			}
 
 			.menu_icon {
 				width: 36rpx;
@@ -407,7 +409,7 @@
 	.list_box {
 		flex: 1;
 		overflow: hidden;
-		padding: 12rpx 0;
+		padding-top: 16rpx;
 
 		.u-list {
 			height: 100% !important;
@@ -418,13 +420,13 @@
 		display: flex;
 		align-items: center;
 		justify-content: center;
-		padding-top: 20vh;
+		padding-top: 25vh;
 	}
 
 	.bottom-wrapper {
+		flex-shrink: 0;
 		background: #fff;
-		padding: 0;
-		box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.06);
+		box-shadow: 0 -4rpx 16rpx rgba(0, 0, 0, 0.05);
 		/* 适配底部安全区域(iPhone X 等机型) */
 		padding-bottom: constant(safe-area-inset-bottom);
 		padding-bottom: env(safe-area-inset-bottom);
@@ -434,12 +436,13 @@
 			flex-direction: row;
 			align-items: center;
 			justify-content: space-between;
-			height: 100rpx;
+			height: 110rpx;
 			padding: 0 32rpx;
 		}
 
 		.check-area {
 			display: flex;
+			flex-direction: row;
 			align-items: center;
 			font-size: $uni-font-size-sm;
 			color: $uni-text-color;
@@ -447,8 +450,10 @@
 
 		.btn-area {
 			.submit-btn {
-				min-width: 180rpx;
-				border-radius: 40rpx;
+				min-width: 200rpx;
+				height: 72rpx;
+				border-radius: 36rpx;
+				font-size: $uni-font-size-sm;
 			}
 		}
 
@@ -460,10 +465,10 @@
 
 	.search_list {
 		min-height: 100rpx;
-		padding: 20rpx 0;
+		padding: 24rpx 0;
 
 		/deep/ .baseForm {
-			padding: 0 30rpx;
+			padding: 0 32rpx;
 		}
 	}
 
@@ -472,17 +477,21 @@
 		flex-direction: row;
 		align-items: center;
 		justify-content: space-between;
-		padding: 20rpx 32rpx 30rpx;
+		padding: 24rpx 32rpx 32rpx;
 		gap: 24rpx;
 
 		.reset-btn {
 			flex: 1;
-			border-radius: 40rpx;
+			height: 72rpx;
+			border-radius: 36rpx;
+			font-size: $uni-font-size-sm;
 		}
 
 		.confirm-btn {
 			flex: 1;
-			border-radius: 40rpx;
+			height: 72rpx;
+			border-radius: 36rpx;
+			font-size: $uni-font-size-sm;
 		}
 	}
 </style>

+ 147 - 173
pages/pda/outsourcing/components/outsourcingDetail.vue

@@ -1,5 +1,5 @@
 <template>
-  <view class="content-box">
+  <view class="page-container">
     <uni-nav-bar
       fixed="true"
       statusBar="true"
@@ -10,60 +10,35 @@
       @clickLeft="back"
     ></uni-nav-bar>
 
-    <view class="title_box rx-bc">
-      <view class="name">基本信息 </view>
-    </view>
+    <!-- 基本信息卡片 -->
+    <view class="info-card">
+      <view class="card-header">
+        <view class="header-line"></view>
+        <view class="header-title">基本信息</view>
+      </view>
 
-    <view class="material">
-      <view class="content_table">
-        <view class="item">
-          <view class="lable rx-cc">委外单编码</view>
-          <view class="content">
-            {{ item.code }}
+      <view class="info-content">
+        <view class="info-item" v-for="(infoItem, idx) in infoList" :key="idx">
+          <view class="info-label">{{ infoItem.label }}</view>
+          <view
+            class="info-value"
+            :class="{ 'status-badge': infoItem.isStatus }"
+          >
+            {{ infoItem.value }}
           </view>
         </view>
-
-        <view class="item">
-          <view class="lable rx-cc">委外单名称</view>
-          <view class="content">{{ item.name }}</view>
-        </view>
-        <view class="item">
-          <view class="lable rx-cc">委外发起工序</view>
-          <view class="content">{{ item.taskName }}</view>
-        </view>
-
-        <view class="item">
-          <view class="lable rx-cc">委外工序</view>
-          <view class="content">{{ item.taskNames }}</view>
-        </view>
-
-        <view class="item">
-          <view class="lable rx-cc">工单编码</view>
-          <view class="content">{{ item.workOrderCode }}</view>
-        </view>
-
-        <view class="item">
-          <view class="lable rx-cc">预计到货日期</view>
-          <view class="content">{{ item.requireDeliveryTime }}</view>
-        </view>
-
-        <view class="item">
-          <view class="lable rx-cc">创建时间</view>
-          <view class="content">{{ item.createTime }}</view>
-        </view>
-        <view class="item">
-          <view class="lable rx-cc">状态</view>
-          <view class="content">{{
-            item.status == 0 ? "未提交" : item.status == 1 ? "已提交" : "已发布"
-          }}</view>
-        </view>
       </view>
     </view>
 
-    <view class="list_box">
+    <!-- 明细列表 -->
+    <view class="detail-section">
+      <view class="section-title">委外明细</view>
       <u-list key="list">
-        <u-list-item v-for="(item, index) in item.detailList" :key="index">
-          <outsourcingData :item="item" :index="index" />
+        <u-list-item
+          v-for="(detailItem, index) in item.detailList"
+          :key="index"
+        >
+          <outsourcingData :item="detailItem" :index="index" />
         </u-list-item>
       </u-list>
     </view>
@@ -83,6 +58,30 @@ export default {
     };
   },
 
+  computed: {
+    infoList() {
+      if (!this.item) return [];
+
+      const statusText =
+        this.item.status == 0
+          ? "未提交"
+          : this.item.status == 1
+            ? "已提交"
+            : "已发布";
+
+      return [
+        { label: "委外单编码", value: this.item.code || "-" },
+        { label: "委外单名称", value: this.item.name || "-" },
+        { label: "委外发起工序", value: this.item.taskName || "-" },
+        { label: "委外工序", value: this.item.taskNames || "-" },
+        { label: "工单编码", value: this.item.workOrderCode || "-" },
+        { label: "预计到货日期", value: this.item.requireDeliveryTime || "-" },
+        { label: "创建时间", value: this.item.createTime || "-" },
+        { label: "状态", value: statusText, isStatus: true },
+      ];
+    },
+  },
+
   onLoad(options) {
     this.item = JSON.parse(options.item);
   },
@@ -94,147 +93,122 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.content-box {
-  height: 100vh;
+.page-container {
+  min-height: 100vh;
+  background: #f5f7fa;
+  padding-bottom: 20rpx;
+}
+
+// 信息卡片
+.info-card {
+  margin: 20rpx 24rpx;
+  background: #ffffff;
+  border-radius: 16rpx;
+  box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.04);
   overflow: hidden;
-  display: flex;
-  flex-direction: column;
-  background-color: $page-bg;
-  background: #fff;
 }
 
-.title_box {
-  .name {
-    font-size: 28rpx;
-    font-style: normal;
-    font-weight: 400;
-    color: $theme-color;
-    padding-left: 20rpx;
-
-    position: relative;
-
-    &:before {
-      position: absolute;
-      content: "";
-      left: 0rpx;
-      top: 0rpx;
-      bottom: 0rpx;
-      width: 4rpx;
-      height: 28rpx;
-      background: $theme-color;
-      margin: auto;
-    }
+.card-header {
+  display: flex;
+  align-items: center;
+  padding: 28rpx 24rpx 20rpx;
+
+  .header-line {
+    width: 6rpx;
+    height: 32rpx;
+    background: linear-gradient(180deg, #157a2c 0%, #1ea03a 100%);
+    border-radius: 3rpx;
+    margin-right: 16rpx;
   }
 
-  .btn_box {
-    padding: 0 18rpx;
-    height: 60rpx;
-    background: $theme-color;
-    font-size: 26rpx;
-    font-style: normal;
-    font-weight: 400;
-    font-size: 24rpx;
-    color: #fff;
-    border-radius: 4rpx;
-
-    .scan {
-      width: 34rpx;
-      height: 34rpx;
-      margin-right: 12rpx;
-    }
+  .header-title {
+    font-size: 32rpx;
+    font-weight: 600;
+    color: #303133;
   }
 }
 
-.material {
-  margin-top: 10rpx;
-
-  .content_table {
-    width: 100%;
-    border: 2rpx solid $border-color;
-
-    .item {
-      display: flex;
-      border-bottom: 2rpx solid $border-color;
-
-      .lable {
-        width: 150rpx;
-        text-align: center;
-        background-color: #f7f9fa;
-        font-size: 26rpx;
-        border-right: 2rpx solid $border-color;
-        flex-shrink: 0;
-      }
-
-      .lable150 {
-        width: 156rpx !important;
-        font-size: 24rpx;
-      }
-
-      .ww80 {
-        width: 80rpx;
-      }
-
-      .content {
-        width: 518rpx;
-        min-height: 64rpx;
-        font-size: 28rpx;
-        line-height: 28rpx;
-        font-style: normal;
-        font-weight: 400;
-        padding: 18rpx 8rpx;
-        box-sizing: border-box;
-        word-wrap: break-word;
-        flex-grow: 1 !important;
-
-        .unit {
-          padding: 0 4rpx;
-          font-size: 24rpx;
-          color: #404446;
-        }
-      }
-
-      .content_num {
-        display: flex;
-        align-items: center;
-        padding: 0 4rpx;
-
-        /deep/ .uni-input-input {
-          border: 2rpx solid #f0f8f2;
-          background: #f0f8f2;
-          color: $theme-color;
-        }
-      }
-
-      .pd4 {
-        padding: 4rpx 8rpx;
-      }
-
-      &:last-child {
-        border-bottom: none;
-      }
-    }
-
-    .ww55 {
-      width: 55%;
-    }
-
-    .ww45 {
-      width: 45%;
-    }
+.info-content {
+  padding: 0 24rpx 24rpx;
+}
+
+.info-item {
+  display: flex;
+  align-items: flex-start;
+  padding: 20rpx 0;
+  border-bottom: 1rpx solid #f0f2f5;
+
+  &:last-child {
+    border-bottom: none;
   }
 }
 
-.mt20 {
-  margin-top: 20rpx;
+.info-label {
+  flex-shrink: 0;
+  width: 200rpx;
+  font-size: 28rpx;
+  color: #909399;
+  line-height: 40rpx;
 }
 
-.list_box {
+.info-value {
   flex: 1;
-  overflow: hidden;
-  padding: 16rpx 0;
+  font-size: 28rpx;
+  color: #303133;
+  line-height: 40rpx;
+  word-break: break-all;
+
+  &.status-badge {
+    display: inline-block;
+    padding: 4rpx 16rpx;
+    background: linear-gradient(135deg, #e8f5e9 0%, #f1f8f2 100%);
+    color: #157a2c;
+    border-radius: 8rpx;
+    font-weight: 500;
+  }
+}
+
+// 明细列表区域
+.detail-section {
+  margin: 0 24rpx;
+
+  .section-title {
+    font-size: 28rpx;
+    font-weight: 600;
+    color: #303133;
+    padding: 24rpx 0 16rpx;
+  }
 
   .u-list {
-    height: 100% !important;
+    background: transparent;
+  }
+}
+
+// 响应式适配
+@media screen and (max-width: 375px) {
+  .info-label {
+    width: 180rpx;
+    font-size: 26rpx;
+  }
+
+  .info-value {
+    font-size: 26rpx;
+  }
+
+  .card-header .header-title {
+    font-size: 30rpx;
+  }
+}
+
+@media screen and (min-width: 768px) {
+  .info-card {
+    margin: 30rpx auto;
+    max-width: 1200rpx;
+  }
+
+  .detail-section {
+    margin: 0 auto;
+    max-width: 1200rpx;
   }
 }
 </style>

+ 229 - 101
pages/pda/picking/components/pickCard.vue

@@ -1,70 +1,66 @@
 <template>
-	<view>
-
+	<view class="pick-card-container">
 		<checkbox-group v-for="(item, index) in list" :key="index" @change="e => selectVal(e, item, index)">
-		     <label>
-			<view class="card_box" @click="openDetails(item.pickStatus, item.id)">
-				<view class="item_box rx-bc">
-					<view class="rx-sc">
-						<checkbox  v-if='item.pickStatus == 0' :checked="item.checked" />
-							
-						<view class="orderId">{{item.code}} </view>
-					</view>
-					<view class="status " :class="[item.pickStatus == 0 ? 'FAA': '' ]"> {{ item.pickStatus == 0 ? '未领料' : item.pickStatus == 1 ? '已领料' : item.pickStatus == 2 ? '已出库' : '' }}</view>
-				</view>
-
-				<view class="item_box rx-bc">
-					<view class="item_one perce50 rx-sc">
-						<view class="lable">产品编码:</view>
-						<view>{{item.productCode}}</view>
-					</view>
-					<view class="item_one perce50 rx-sc">
-						<view>名称:</view>
-						<view>{{item.productName}}</view>
-					</view>
-				</view>
-
-
-				<view class="item_box rx-bc">
-					<view class="item_one perce50 rx-sc">
-						<view class="lable">牌号:</view>
-						<view>{{item.brandNo}}</view>
-					</view>
-					<view class="item_one perce50 rx-sc">
-						<view>型号:</view>
-						<view>{{item.model}}</view>
+			<label class="card-label">
+				<view class="card-wrapper" :class="{'card-active': item.checked}" @click="openDetails(item.pickStatus, item.id)">
+					<!-- 卡片头部 -->
+					<view class="card-header">
+						<view class="header-left">
+							<checkbox v-if='item.pickStatus == 0' :checked="item.checked" class="card-checkbox" />
+							<text class="order-code">{{ item.code }}</text>
+						</view>
+						<view class="status-badge" :class="getStatusClass(item.pickStatus)">
+							{{ getStatusText(item.pickStatus) }}
+						</view>
 					</view>
-				</view>
 
+					<!-- 卡片内容 -->
+					<view class="card-content">
+						<!-- 产品信息行 -->
+						<view class="info-row">
+							<view class="info-item">
+								<text class="info-label">产品编码</text>
+								<text class="info-value">{{ item.productCode }}</text>
+							</view>
+							<view class="info-item">
+								<text class="info-label">名称</text>
+								<text class="info-value">{{ item.productName }}</text>
+							</view>
+						</view>
 
-				<view class="item_box rx-bc">
-					<view class="item_one perce50 rx-sc">
-						<view class="lable">生产数量:</view>
-						<view>{{item.formingNum}}</view>
-						<view>{{ item.unit }}</view>
-					</view>
-					<view class="item_one perce50 rx-sc">
-						<view>状态:</view>
-						<view>{{statusList[item.status]}}</view>
-					</view>
-				</view>
+						<!-- 规格信息行 -->
+						<view class="info-row">
+							<view class="info-item">
+								<text class="info-label">牌号</text>
+								<text class="info-value">{{ item.brandNo }}</text>
+							</view>
+							<view class="info-item">
+								<text class="info-label">型号</text>
+								<text class="info-value">{{ item.model }}</text>
+							</view>
+						</view>
 
+						<!-- 数量状态行 -->
+						<view class="info-row">
+							<view class="info-item">
+								<text class="info-label">生产数量</text>
+								<text class="info-value">{{ item.formingNum }} {{ item.unit }}</text>
+							</view>
+							<view class="info-item">
+								<text class="info-label">状态</text>
+								<text class="info-value">{{ statusList[item.status] }}</text>
+							</view>
+						</view>
 
-				<view class="item_box rx-sc">
-					<view class="item_one rx-sc">
-						<view class="lable">工艺路线:</view>
-						<view class="gylx">{{item.produceRoutingName}}</view>
+						<!-- 工艺路线 -->
+						<view class="info-row route-row">
+							<text class="info-label">工艺路线</text>
+							<text class="route-value">{{ item.produceRoutingName }}</text>
+						</view>
 					</view>
-
 				</view>
-
-
-
-			</view>
 			</label>
-
 		</checkbox-group>
-
 	</view>
 </template>
 
@@ -100,6 +96,26 @@
 						url
 					})
 				}
+			},
+			
+			// 获取状态文本
+			getStatusText(pickStatus) {
+				const statusMap = {
+					0: '未领料',
+					1: '已领料',
+					2: '已出库'
+				}
+				return statusMap[pickStatus] || ''
+			},
+			
+			// 获取状态样式类
+			getStatusClass(pickStatus) {
+				const classMap = {
+					0: 'status-pending',
+					1: 'status-picked',
+					2: 'status-out'
+				}
+				return classMap[pickStatus] || ''
 			}
 		}
 
@@ -108,61 +124,173 @@
 
 
 <style lang="scss" scoped>
-	.card_box {
-		width: 750rpx;
-		padding: 16rpx 24rpx;
-		box-sizing: border-box;
-		border-bottom: 2rpx solid #E1E1E1;
-
+	.pick-card-container {
+		width: 100%;
+		padding: 0;
+	}
 
-		.item_box {
-			margin-top: 10rpx;
+	.card-label {
+		display: block;
+		width: 100%;
+	}
 
+	.card-wrapper {
+		margin: 24rpx;
+		background: #FFFFFF;
+		border-radius: 16rpx;
+		box-shadow: 0 4rpx 12rpx 0 rgba(0, 0, 0, 0.05);
+		overflow: hidden;
+		transition: all 0.3s ease;
 		
+		&.card-active {
+			box-shadow: 0 4rpx 16rpx 0 rgba(64, 158, 255, 0.2);
+			border: 2rpx solid rgba(64, 158, 255, 0.3);
+		}
+	}
 
-			.orderId {
-				color: #000;
-				font-family: PingFang HK;
-				font-size: 28rpx;
-				font-style: normal;
-				font-weight: 600;
-				margin-left: 16rpx;
-				margin-top: 8rpx;
-			}
+	/* 卡片头部 */
+	.card-header {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 24rpx 28rpx;
+		background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%);
+		border-bottom: 1rpx solid #f0f0f0;
+	}
 
-			.item_one {
-				width: 100%;
-				font-size: 26rpx;
-				font-style: normal;
-				font-weight: 400;
-				line-height: 38rpx;
-				word-wrap: break-word;
-			}
+	.header-left {
+		display: flex;
+		align-items: center;
+		flex: 1;
+		min-width: 0;
+	}
 
-			.gylx {
-				color: $theme-color;
-			}
+	.card-checkbox {
+		flex-shrink: 0;
+		margin-right: 16rpx;
+		transform: scale(1.1);
+	}
 
-			.perce50 {
-				width: 50%;
-			}
+	.order-code {
+		font-size: 30rpx;
+		font-weight: 600;
+		color: #303133;
+		flex: 1;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+	}
+
+	/* 状态徽章 */
+	.status-badge {
+		flex-shrink: 0;
+		padding: 8rpx 20rpx;
+		border-radius: 24rpx;
+		font-size: 24rpx;
+		font-weight: 500;
+		margin-left: 16rpx;
+		
+		&.status-pending {
+			background: #FFF7E6;
+			color: #FA8C16;
+		}
+		
+		&.status-picked {
+			background: #E6F7FF;
+			color: #1890FF;
+		}
+		
+		&.status-out {
+			background: #F6FFED;
+			color: #52C41A;
+		}
+	}
 
-			.status {
-				font-size: 26rpx;
+	/* 卡片内容 */
+	.card-content {
+		padding: 24rpx 28rpx;
+	}
 
-				&.FAA {
-					color: #FFA929;
-				}
-			}
-			
-			
-			/deep/ .uni-checkbox-input-checked {
-				background-color: $theme-color !important;
-				border-color: $theme-color !important;
-			}
+	.info-row {
+		display: flex;
+		align-items: flex-start;
+		margin-bottom: 20rpx;
+		
+		&:last-child {
+			margin-bottom: 0;
+		}
+		
+		&.route-row {
+			flex-direction: column;
+			padding-top: 8rpx;
+			border-top: 1rpx solid #f5f5f5;
 		}
 	}
+
+	.info-item {
+		flex: 1;
+		display: flex;
+		flex-direction: column;
+		min-width: 0;
+		padding-right: 16rpx;
+		
+		&:last-child {
+			padding-right: 0;
+		}
+	}
+
+	.info-label {
+		font-size: 24rpx;
+		color: #909399;
+		margin-bottom: 8rpx;
+		line-height: 1.4;
+	}
+
+	.info-value {
+		font-size: 28rpx;
+		color: #303133;
+		font-weight: 500;
+		line-height: 1.5;
+		word-break: break-all;
+	}
+
+	.route-value {
+		font-size: 28rpx;
+		color: $theme-color;
+		font-weight: 500;
+		margin-top: 8rpx;
+		line-height: 1.6;
+		word-break: break-all;
+	}
+
+	/* 复选框选中样式 */
+	/deep/ .uni-checkbox-input {
+		border-radius: 6rpx;
+	}
 	
-	
-	
+	/deep/ .uni-checkbox-input-checked {
+		background-color: $theme-color !important;
+		border-color: $theme-color !important;
+	}
+
+	/* 响应式适配 */
+	@media screen and (max-width: 375px) {
+		.card-wrapper {
+			margin: 20rpx;
+		}
+		
+		.card-header,
+		.card-content {
+			padding: 20rpx 24rpx;
+		}
+		
+		.order-code {
+			font-size: 28rpx;
+		}
+		
+		.info-value,
+		.route-value {
+			font-size: 26rpx;
+		}
+	}
 </style>

+ 70 - 19
pages/pda/picking/components/pickWorkCard.vue

@@ -122,58 +122,90 @@ export default {
 
 <style lang="scss" scoped>
 .card_box {
-  width: 750rpx;
-  padding: 16rpx 24rpx;
+  width: 100%;
+  margin: 20rpx 24rpx;
+  padding: 24rpx;
   box-sizing: border-box;
-  border-bottom: 2rpx solid #e1e1e1;
+  background: #ffffff;
+  border-radius: 16rpx;
+  box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.06);
+  transition: all 0.3s ease;
+
+  &:active {
+    transform: scale(0.98);
+    box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.08);
+  }
 
   .item_box {
-    margin-top: 10rpx;
+    margin-top: 20rpx;
+
+    &:first-child {
+      margin-top: 0;
+    }
 
     .round {
-      width: 40rpx;
-      height: 40rpx;
-      line-height: 40rpx;
+      width: 44rpx;
+      height: 44rpx;
+      line-height: 44rpx;
       border-radius: 50%;
-      background: $theme-color;
+      background: linear-gradient(135deg, $theme-color 0%, lighten($theme-color, 10%) 100%);
       color: #fff;
       text-align: center;
-      font-size: 20rpx;
-      margin-right: 10px;
+      font-size: 22rpx;
+      font-weight: 600;
+      flex-shrink: 0;
+      box-shadow: 0 2rpx 8rpx rgba($theme-color, 0.3);
     }
 
     .orderId {
-      color: #000;
-      font-family: PingFang HK;
-      font-size: 28rpx;
-      font-style: normal;
+      color: #333333;
+      font-size: 30rpx;
       font-weight: 600;
       margin-left: 16rpx;
-      margin-top: 8rpx;
+      flex: 1;
+      line-height: 44rpx;
     }
 
     .item_one {
       width: 100%;
       font-size: 26rpx;
-      font-style: normal;
       font-weight: 400;
-      line-height: 38rpx;
+      line-height: 40rpx;
+      color: #666666;
       word-wrap: break-word;
+      display: flex;
+      align-items: center;
+
+      .lable {
+        color: #999999;
+        flex-shrink: 0;
+      }
     }
 
     .gylx {
       color: $theme-color;
+      font-weight: 500;
     }
 
     .perce50 {
       width: 50%;
+      padding-right: 12rpx;
+      box-sizing: border-box;
     }
 
     .status {
-      font-size: 26rpx;
+      padding: 8rpx 20rpx;
+      font-size: 24rpx;
+      font-weight: 500;
+      border-radius: 24rpx;
+      background: #f0f0f0;
+      color: #666666;
+      flex-shrink: 0;
 
       &.FAA {
-        color: #ffa929;
+        background: linear-gradient(135deg, #fff3e6 0%, #ffe8cc 100%);
+        color: #ff8800;
+        border: 1rpx solid #ffd699;
       }
     }
 
@@ -183,4 +215,23 @@ export default {
     }
   }
 }
+
+// 响应式适配
+@media screen and (max-width: 375px) {
+  .card_box {
+    margin: 16rpx 20rpx;
+    padding: 20rpx;
+
+    .item_box {
+      .orderId {
+        font-size: 28rpx;
+      }
+
+      .item_one {
+        font-size: 24rpx;
+        line-height: 36rpx;
+      }
+    }
+  }
+}
 </style>

+ 466 - 426
pages/pda/picking/details.vue

@@ -1,5 +1,5 @@
-<template>
-  <view class="content-box">
+<template>
+  <view class="page-container">
     <uni-nav-bar
       fixed="true"
       statusBar="true"
@@ -9,60 +9,55 @@
       color="#fff"
       @clickLeft="back"
     ></uni-nav-bar>
-    <u-button
-      type="success"
-      size="small"
-      class="u-reset-button-ii"
-      v-if="clientEnvironmentId == 21"
-      @click="undatePicking()"
-      text="刷新库存"
-    ></u-button>
-
-    <view class="list_box">
+
+    <view class="refresh-bar" v-if="clientEnvironmentId == 21">
+      <u-button
+        type="success"
+        size="small"
+        class="refresh-btn"
+        @click="undatePicking()"
+        text="刷新库存"
+      ></u-button>
+    </view>
+
+    <view class="scroll-area">
       <u-list @scrolltolower="scrolltolower">
-        <view v-for="(item, index) in List" :key="index" class="card_box">
-          <view class="title_box rx-bc">
-            <view class="left rx-sc">
-              <view class="round">{{ index + 1 }}</view>
-              <view class="code">工单编号:{{ item.code }}</view>
+        <view v-for="(item, index) in List" :key="index" class="order-card">
+          <!-- 卡片头部 -->
+          <view class="card-header">
+            <view class="header-left">
+              <view class="serial-num">{{ index + 1 }}</view>
+              <text class="order-code">工单编号:{{ item.code }}</text>
             </view>
-
-            <view class="right_box rx-ec" v-if="clientEnvironmentId !== 9">
+            <view class="header-right" v-if="clientEnvironmentId !== 9">
               <u-button
                 type="success"
-                size="small"
-                class="u-reset-button"
+                size="mini"
+                class="add-btn"
                 v-if="isOutsource == 0"
                 @click="addPicking(item.workOrderId, item)"
                 text="添加物料"
               ></u-button>
             </view>
           </view>
-          <view style="display: flex; justify-items: start">
-            <view
-              class="select"
-              @click="selectAll(item.bomList)"
-              style="width: 64px"
-              >全选/取消</view
-            >
-            <!-- <view
-              class="select"
-              @click="warehouseShowFn(item.id)"
-              style="width: 85px; margin-left: 10px"
-            >
-              一键选择仓库</view
-            > -->
+
+          <!-- 操作栏 -->
+          <view class="action-bar">
+            <view class="select-all-btn" @click="selectAll(item.pickList)">
+              全选/取消
+            </view>
           </view>
 
+          <!-- 物料列表 -->
           <view
-            class="material rx-ss"
+            class="material-item"
             v-for="(mate, idx) in item.pickList"
             :key="idx"
           >
-            <view class="left rx-ss" @click="mate.checked = !mate.checked">
+            <view class="check-col" @click="mate.checked = !mate.checked">
               <view
-                class="zdy_check rx-cc"
-                :class="{ check_active: mate.checked }"
+                class="checkbox"
+                :class="{ 'checkbox--active': mate.checked }"
               >
                 <u-icon
                   size="28"
@@ -71,77 +66,85 @@
                 ></u-icon>
               </view>
             </view>
-            <view class="content_table">
-              <view class="item">
-                <view class="lable rx-cc">物料编码</view>
-                <view class="content ellipsis">
+
+            <view class="material-detail">
+              <view class="detail-row">
+                <view class="detail-label">物料编码</view>
+                <view class="detail-value text-ellipsis">
                   {{ mate.categoryCode }}
                 </view>
+                <view class="delete-btn" @click.stop="deletePick(index, idx)">
+                  <u-icon name="close" size="28" color="#F56C6C"></u-icon>
+                </view>
               </view>
 
-              <view class="item">
-                <view class="lable rx-cc">名称</view>
-                <view class="content ellipsis">{{ mate.categoryName }}</view>
+              <view class="detail-row">
+                <view class="detail-label">名称</view>
+                <view class="detail-value text-ellipsis">
+                  {{ mate.categoryName }}
+                </view>
               </view>
 
-              <view class="item rx-sc">
-                <view class="rx ww55">
-                  <view class="lable rx-cc">型号</view>
-                  <view class="content ellipsis">{{ mate.modelType }}</view>
+              <view class="detail-row detail-row--split">
+                <view class="split-cell split-cell--left">
+                  <view class="detail-label">型号</view>
+                  <view class="detail-value text-ellipsis">
+                    {{ mate.modelType }}
+                  </view>
                 </view>
-
-                <view class="rx ww45">
-                  <view class="lable rx-cc ww80">规格</view>
-                  <view class="content ellipsis">{{ mate.specification }}</view>
+                <view class="split-cell split-cell--right">
+                  <view class="detail-label detail-label--sm">规格</view>
+                  <view class="detail-value text-ellipsis">
+                    {{ mate.specification }}
+                  </view>
                 </view>
               </view>
 
-              <view class="item rx-sc">
-                <view class="rx ww55">
-                  <view class="lable rx-cc">类型</view>
-                  <view class="content">{{
-                    typeName[Number(mate.rootCategoryLevelId)]
-                  }}</view>
+              <view class="detail-row detail-row--split">
+                <view class="split-cell split-cell--left">
+                  <view class="detail-label">类型</view>
+                  <view class="detail-value">
+                    {{ typeName[Number(mate.rootCategoryLevelId)] }}
+                  </view>
                 </view>
-
-                <view class="rx ww45">
-                  <view class="lable rx-cc ww80">数量</view>
-                  <view class="content content_num">
+                <view class="split-cell split-cell--right">
+                  <view class="detail-label detail-label--sm">数量</view>
+                  <view class="detail-value detail-value--input">
                     <input
-                      class="uni-input"
+                      class="qty-input"
                       v-model="mate.demandQuantity"
                       type="digit"
                       :disabled="clientEnvironmentId == 9"
                       @input="changeInput(mate, idx, index)"
                     />
-                    <view class="unit">{{ mate.unit }}</view>
+                    <text class="qty-unit">{{ mate.unit }}</text>
                   </view>
                 </view>
               </view>
-              <view class="item">
-                <view class="lable rx-cc">计量库存数量</view>
-                <view class="content pd4">
-                  <view v-for="it of mate.warehouseList">
+
+              <view class="detail-row">
+                <view class="detail-label">计量库存数量</view>
+                <view class="detail-value detail-value--stock">
+                  <view
+                    v-for="it of mate.warehouseList"
+                    :key="it.warehouse_id || it.id"
+                  >
                     <view
                       v-if="it.availableCountBase != '0'"
-                      class="content"
+                      class="stock-item"
                       @click="chooseInventoryData(mate, it, idx)"
-                      style="cursor: pointer"
-                      >{{ it.name ? it.name : it.warehouse_name }}库存数:<span
-                        style="color: green"
-                        >{{ it.availableCountBase }}</span
-                      >{{ mate.measuringUnit }}</view
                     >
+                      {{ it.name ? it.name : it.warehouse_name }}库存数:
+                      <text class="stock-num">{{ it.availableCountBase }}</text>
+                      {{ mate.measuringUnit }}
+                    </view>
                   </view>
-                  <!-- <view class="content"
-                    >{{ mate.availableCountBase }} {{ mate.unit }}</view
-                  > -->
                 </view>
               </view>
 
-              <view class="item">
-                <view class="lable rx-cc">领料仓库</view>
-                <view class="content pd4">
+              <view class="detail-row">
+                <view class="detail-label">领料仓库</view>
+                <view class="detail-value detail-value--select">
                   <zxz-uni-data-select
                     :localdata="mate.warehouseList"
                     v-model="mate.warehouseIdList"
@@ -153,14 +156,16 @@
                   ></zxz-uni-data-select>
                 </view>
               </view>
-              <view class="item" v-if="clientEnvironmentId == 21">
-                <view class="lable rx-cc">库存可用量</view>
-                <view class="content">{{ mate.waitOutInWeight }}</view>
+
+              <view class="detail-row" v-if="clientEnvironmentId == 21">
+                <view class="detail-label">库存可用量</view>
+                <view class="detail-value">{{ mate.waitOutInWeight }}</view>
               </view>
             </view>
           </view>
 
-          <view>
+          <!-- 子组件区域 -->
+          <view class="sub-components">
             <instanceBom
               :list="item.instanceList2"
               :warehouseList="warehouseList"
@@ -173,8 +178,7 @@
               :modelList2="item.modelList2"
               :code="item.code"
               @hendDel="hendDel"
-            >
-            </modelBom>
+            ></modelBom>
 
             <boatBom
               :palletList="item.palletList"
@@ -183,8 +187,7 @@
               :warehouseList="warehouseList"
               :resObj="item"
               @hendDel="hendDel"
-            >
-            </boatBom>
+            ></boatBom>
 
             <packingBom
               :list="item.packingList2"
@@ -198,33 +201,34 @@
                 ...item.productList2,
                 ...item.junkProductList2,
               ]"
-            >
-            </semiProductBom>
+            ></semiProductBom>
 
             <view style="height: 80rpx"></view>
 
-            <view class="flex_btn" v-if="isPick" @click="openDetails"
-              >已有领料单</view
-            >
+            <view class="exist-pick-btn" v-if="isPick" @click="openDetails">
+              已有领料单
+            </view>
           </view>
         </view>
 
-        <view class="out_box" v-if="isOutsource == 1">
-          <view class="out_text" @click="getListOutsource()"
-            >重新获取委外领料单</view
-          >
+        <view class="outsource-bar" v-if="isOutsource == 1">
+          <view class="outsource-link" @click="getListOutsource()">
+            重新获取委外领料单
+          </view>
         </view>
       </u-list>
     </view>
+
+    <!-- 弹窗 -->
     <u-popup
       :show="warehouseShow"
       mode="center"
       v-if="warehouseShow"
       :closeOnClickOverlay="false"
     >
-      <view class="popup_list">
-        <view class="lable rx-cc">领料仓库</view>
-        <view class="content pd4">
+      <view class="popup-content">
+        <view class="popup-title">选择领料仓库</view>
+        <view class="popup-body">
           <zxz-uni-data-select
             :localdata="warehouseList"
             v-model="warehouseId"
@@ -235,28 +239,29 @@
             :clear="false"
           ></zxz-uni-data-select>
         </view>
-      </view>
-
-      <view class="operate_box rx-bc">
-        <u-button
-          size="small"
-          class="u-reset-button"
-          @click="warehouseShow = fasle"
-        >
-          取消
-        </u-button>
-        <u-button
-          type="success"
-          size="small"
-          class="u-reset-button"
-          @click="handOK"
-        >
-          确认
-        </u-button>
+        <view class="popup-footer">
+          <u-button
+            size="small"
+            class="popup-btn"
+            @click="warehouseShow = fasle"
+          >
+            取消
+          </u-button>
+          <u-button
+            type="success"
+            size="small"
+            class="popup-btn"
+            @click="handOK"
+          >
+            确认
+          </u-button>
+        </view>
       </view>
     </u-popup>
-    <view class="bottom-wrapper">
-      <view class="btn_box" @click="save">{{ submitText }}</view>
+
+    <!-- 底部提交按钮 -->
+    <view class="footer-bar">
+      <view class="submit-btn" @click="save">{{ submitText }}</view>
     </view>
 
     <outsourceOrder
@@ -311,7 +316,7 @@ export default {
       idsList: [],
       List: [],
       currentId: "",
-      pagination: {},
+      pagination: null,
       classificationList: [], //分类数据
       newListOne: [],
       taskId: null,
@@ -360,77 +365,40 @@ export default {
 
     uni.$on("setSelectList", (selectList, id) => {
       selectList.forEach((item) => {
-        item.warehouseList = item.warehouseList
-          ? item.warehouseList
-          : item.warehouseLists;
+        item.code = item.categoryCode;
+        item.name = item.categoryName;
+        item.modelType = item.modelType ? item.modelType : item.categoryModel;
+        item.measuringUnit = item.measuringUnit
+          ? item.measuringUnit
+          : item.measureUnit;
+        item.unit = item.unit ? item.unit : item.measureUnit;
+        // item.categoryCode = item.categoryCode ? item.categoryCode : item.code;
+        // item.categoryName = item.categoryName ? item.categoryName : item.name;
+        // item.modelType = item.modelType ? item.modelType : item.categoryModel;
+        // item.unit = item.unit ? item.unit : item.measureUnit;
+        // item.measuringUnit = item.measuringUnit
+        //   ? item.measuringUnit
+        //   : item.measureUnit;
+        // item.warehouseList = item.warehouseList
+        //   ? item.warehouseList
+        //   : item.warehouseLists;
       });
 
-      // list.forEach((it) => {
-      //   if (it.warehouseList.length != 0) {
-      //     if (!it.warehouseIdList) {
-      //       it.warehouseIdList = [];
-      //       it.warehouseIdList.push(it.warehouseList[0].warehouse_id);
-      //     }
-      //   }
-      // });
-
       this.List.forEach((e) => {
         if (e.id == id) {
           e.pickList = [...e.pickList, ...selectList];
           this.$forceUpdate();
         }
       });
-
-      // this.List.forEach((m) => {
-      //   if (m.workOrderId == id) {
-      //     let instanceList2 = []; // 投料
-      //     let modelList2 = []; // 模具
-      //     let palletList2 = [];
-      //     let packingList2 = []; // 包装
-      //     let semiProductList2 = []; //半成品
-      //     let productList2 = []; // 产品
-      //     let junkProductList2 = []; //废品
-
-      //     selectList.forEach((f) => {
-      //       if (![5, 8, 13, 23, 9, 28].includes(f.rootCategoryLevelId)) {
-      //         f.automatic = 1;
-      //         instanceList2 = instanceList2.concat(f);
-      //       } else if (f.rootCategoryLevelId == 5) {
-      //         // 模具
-      //         f.automatic = 1;
-      //         modelList2 = modelList2.concat(f);
-      //       } else if (f.rootCategoryLevelId == 8) {
-      //         // 舟皿
-      //         f.automatic = 1;
-      //         palletList2 = palletList2.concat(f);
-      //       } else if (f.rootCategoryLevelId == 13) {
-      //         f.automatic = 1;
-      //         packingList2 = packingList2.concat(f);
-      //       } else if (f.rootCategoryLevelId == 23) {
-      //         f.automatic = 1;
-      //         semiProductList2 = semiProductList2.concat(f);
-      //       } else if (f.rootCategoryLevelId == 9) {
-      //         f.automatic = 1;
-      //         productList2 = productList2.concat(f);
-      //       } else if (f.rootCategoryLevelId == 28) {
-      //         f.automatic = 1;
-      //         junkProductList2 = junkProductList2.concat(f);
-      //       }
-      //     });
-
-      //     this.$set(m, "instanceList2", instanceList2);
-      //     this.$set(m, "modelList2", modelList2);
-      //     this.$set(m, "palletList2", palletList2);
-      //     this.$set(m, "packingList2", packingList2);
-      //     this.$set(m, "semiProductList2", semiProductList2);
-      //     this.$set(m, "productList2", productList2);
-      //     this.$set(m, "junkProductList2", junkProductList2);
-      //   }
-      // });
     });
   },
 
   methods: {
+    deletePick(orderIndex, pickIndex) {
+      this.List[orderIndex].pickList.splice(pickIndex, 1);
+      this.$forceUpdate();
+    },
+
     selectAll(list) {
       if (Array.isArray(list) && list.length) {
         // let a = list.some(v=>v.checked = true)
@@ -500,67 +468,12 @@ export default {
 
     scrolltolower() {
       let arr = this.pagination ? this.pagination.nextPage() : [];
-      if (arr.length) {
+      if (arr && arr.length) {
         this.List[0].bomList = [...this.List[0].bomList, ...arr];
       }
     },
 
     save() {
-      // let _arr = [];
-      // console.log(this.newList, "m");
-
-      // if (this.clientEnvironmentId !== 21) {
-      //   _arr = this.List.map((m) => {
-      //     console.log(m, "m");
-      //     if (m.bomList.length > 0) {
-      //       let bomList = m.bomList.filter((f) => f.checked);
-      //       m["bomDetailDTOSList"] = [
-      //         ...bomList,
-      //         ...m.modelList,
-      //         ...m.palletList,
-      //       ];
-      //     }
-      //     m.instanceList = [
-      //       ...m.instanceList2,
-      //       ...m.modelList2,
-      //       ...m.palletList2,
-      //       ...m.packingList2,
-      //       ...m.semiProductList2,
-      //       ...m.productList2,
-      //       ...m.junkProductList2,
-      //     ];
-      //     m.isOutsource = this.isOutsource;
-      //     return {
-      //       ...m,
-      //     };
-      //   });
-      // }
-
-      // if (this.clientEnvironmentId == 21) {
-      //   this.submitText = "领料中";
-      //   findVoucherList({
-      //     workOrderId: this.idsList[0],
-      //   }).then((res) => {
-      //     // uni.navigateTo({
-      //     // 	url: `/pages/pda/picking/index/index?pickStatus=1`,
-      //     // });
-      //     uni.showToast({
-      //       title: "领料成功",
-      //       mask: true,
-      //       duration: 1500,
-      //     });
-      //     uni.navigateBack({
-      //       delta: 1,
-      //     });
-      //   });
-      // } else {
-      //   batchSave(_arr).then((res) => {
-      //     uni.navigateTo({
-      //       url: `/pages/pda/picking/index/index?pickStatus=1`,
-      //     });
-      //   });
-      // }
-
       if (this.List.length > 0) {
         let bol;
         let _i;
@@ -634,39 +547,7 @@ export default {
           ...m,
         };
       });
-      // this.loadingBtn = true;
-
-      // _arr.forEach((item) => {
-      //   item.pickList.forEach((it) => {
-      //     const warehousePick = [];
-      //     if (it.warehouseIdList.length != 0) {
-      //       it.warehouseIdList.forEach((i) => {
-      //         const data = it.warehouseList.find((ii) => ii.id == i);
-      //         if (data) {
-      //           warehousePick.push({
-      //             availableCountBase: data.availableCountBase,
-      //             demandQuantity: data.demandQuantity,
-      //             warehouseId: data.id
-      //           });
-      //         }
-      //       });
-      //     }
-      //     it.warehousePick = warehousePick;
-      //   });
-      // });
-      // console.log(_arr, "_arr");
-      // return;
-
-      // if (this.clientEnvironmentId == 21) {
-      //   let param = {
-      //     workOrderId: this.workListIds[0],
-      //     pickingCode: this.pickCode
-      //   };
-      //   znfindVoucherList(param).then((res) => {
-      //     this.loadingBtn = false;
-      //     this.$message.success('领料成功');
-      //   });
-      // }
+
       let param = {
         allPickList: _arr,
         pickName: this.pickName,
@@ -801,8 +682,6 @@ export default {
         ids: this.idsList,
         taskId: this.taskId,
       }).then((res) => {
-        console.log("领料列表", res);
-
         this.List = res.map((m) => {
           m.workOrderId = m.id;
           let modelList = [];
@@ -825,6 +704,8 @@ export default {
             }
           });
 
+          m.bomDetailDTOS = [];
+
           m["modelList"] = modelList;
           m["palletList"] = palletList;
           m["pickList"] = bomList;
@@ -849,7 +730,6 @@ export default {
 
           console.log(m, "mmmm");
 
-          // delete m.id;
           return {
             ...m,
           };
@@ -956,7 +836,7 @@ export default {
       ];
       uni.setStorageSync(storageKey, arr);
       uni.navigateTo({
-        url: `/pages/pda/workOrder/search/index?id=${id}&storageKey=${storageKey}&isType=pick&taskId=${this.taskId}`,
+        url: `/pages/pda/workOrder/search/newIndex?id=${id}&storageKey=${storageKey}&isType=pick&taskId=${this.taskId}`,
       });
     },
 
@@ -1003,209 +883,369 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.select {
+/* ========== 页面容器 ========== */
+.page-container {
+  height: 100vh;
   display: flex;
-  align-items: center;
-  justify-content: center;
-  padding: 5rpx 0;
-  width: 150rpx;
-  background-color: #157a2c;
-  color: #fff;
-  font-size: 24rpx;
-  border-radius: 5rpx;
-}
-
-.u-reset-button-ii {
-  position: relative;
-  right: -251rpx;
-  width: 200rpx;
+  flex-direction: column;
+  background-color: $uni-bg-color-grey;
+  overflow: hidden;
 }
 
-.content-box {
-  height: 100vh;
-  overflow: hidden;
+/* ========== 刷新库存按钮栏 ========== */
+.refresh-bar {
   display: flex;
-  flex-direction: column;
+  justify-content: flex-end;
+  padding: 16rpx 24rpx 0;
+
+  .refresh-btn {
+    min-width: 180rpx;
+    border-radius: 32rpx;
+  }
 }
 
-.list_box {
+/* ========== 滚动区域 ========== */
+.scroll-area {
   flex: 1;
   overflow: hidden;
-  padding: 4rpx 0;
 
   .u-list {
     height: 100% !important;
   }
+}
 
-  .card_box {
-    padding: 16rpx 24rpx;
-  }
+/* ========== 工单卡片 ========== */
+.order-card {
+  margin: 20rpx 24rpx;
+  padding: 24rpx;
+  background: #fff;
+  border-radius: 16rpx;
+  box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.06);
+}
 
-  .title_box {
-    .round {
-      width: 32rpx;
-      height: 32rpx;
-      line-height: 32rpx;
-      border-radius: 50%;
-      background: $theme-color;
-      color: #fff;
-      text-align: center;
-      font-size: 20rpx;
-    }
+/* ========== 卡片头部 ========== */
+.card-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding-bottom: 20rpx;
+  border-bottom: 1rpx solid $border-color;
+
+  .header-left {
+    display: flex;
+    align-items: center;
+    flex: 1;
+    min-width: 0;
+  }
 
-    .code {
-      margin-left: 16rpx;
-      font-family: PingFang SC;
-      font-size: 28rpx;
-      font-style: normal;
-      font-weight: 400;
-      color: $theme-color;
-    }
+  .serial-num {
+    width: 40rpx;
+    height: 40rpx;
+    line-height: 40rpx;
+    border-radius: 50%;
+    background: $theme-color;
+    color: #fff;
+    text-align: center;
+    font-size: 24rpx;
+    flex-shrink: 0;
   }
 
-  .material {
-    margin-top: 10rpx;
+  .order-code {
+    margin-left: 16rpx;
+    font-size: 28rpx;
+    font-weight: 500;
+    color: $theme-color;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
 
-    .left {
-      width: 40rpx;
-    }
+  .header-right {
+    flex-shrink: 0;
+    margin-left: 16rpx;
+  }
 
-    .zdy_check {
-      width: 30rpx;
-      height: 30rpx;
-      border: 2rpx solid #c8c9cc;
-      border-radius: 4rpx;
-    }
+  .add-btn {
+    border-radius: 32rpx;
+    min-width: 150rpx;
+  }
+}
 
-    .check_active {
-      background: $theme-color;
-      border: 2rpx solid $theme-color;
+/* ========== 操作栏 ========== */
+.action-bar {
+  display: flex;
+  align-items: center;
+  padding: 16rpx 0;
+}
 
-      /deep/ .u-icon__icon {
-        color: #fff !important;
-      }
-    }
+.select-all-btn {
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  padding: 8rpx 24rpx;
+  background-color: $theme-color;
+  color: #fff;
+  font-size: 24rpx;
+  border-radius: 32rpx;
+  line-height: 1.4;
+}
 
-    .content_table {
-      width: 652rpx;
-      border: 2rpx solid $border-color;
-
-      .item {
-        display: flex;
-        border-bottom: 2rpx solid $border-color;
-
-        .lable {
-          width: 132rpx;
-          text-align: center;
-          background-color: #f7f9fa;
-          font-size: 26rpx;
-          border-right: 2rpx solid $border-color;
-          flex-shrink: 0;
-        }
+/* ========== 物料项 ========== */
+.material-item {
+  display: flex;
+  align-items: flex-start;
+  margin-top: 16rpx;
+  padding-top: 16rpx;
+  border-top: 1rpx dashed $border-color;
+
+  &:first-of-type {
+    border-top: none;
+    padding-top: 0;
+  }
+}
 
-        .ww80 {
-          width: 80rpx;
-        }
+/* 复选框列 */
+.check-col {
+  width: 56rpx;
+  padding-top: 12rpx;
+  flex-shrink: 0;
+}
 
-        .content {
-          width: 518rpx;
-          min-height: 64rpx;
-          font-size: 28rpx;
-          line-height: 28rpx;
-          font-style: normal;
-          font-weight: 400;
-          padding: 18rpx 8rpx;
-          box-sizing: border-box;
-          word-wrap: break-word;
-          flex-grow: 1 !important;
-        }
+.checkbox {
+  width: 36rpx;
+  height: 36rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  border: 2rpx solid #c8c9cc;
+  border-radius: 6rpx;
+  transition: all 0.2s;
 
-        .content_num {
-          display: flex;
-          align-items: center;
-          padding: 0 4rpx;
+  &--active {
+    background: $theme-color;
+    border-color: $theme-color;
 
-          /deep/ .uni-input-input {
-            border: 2rpx solid #f0f8f2;
-            background: #f0f8f2;
-            color: $theme-color;
-          }
+    /deep/ .u-icon__icon {
+      color: #fff !important;
+    }
+  }
+}
 
-          .unit {
-            width: 90rpx;
-            text-align: center;
-            font-size: 24rpx;
-            color: #404446;
-          }
-        }
+/* ========== 物料详情表格 ========== */
+.material-detail {
+  flex: 1;
+  min-width: 0;
+  border: 1rpx solid $border-color;
+  border-radius: 8rpx;
+}
 
-        .pd4 {
-          padding: 4rpx 8rpx;
-        }
+.detail-row {
+  display: flex;
+  border-bottom: 1rpx solid $border-color;
 
-        &:last-child {
-          border-bottom: none;
-        }
-      }
+  &:last-child {
+    border-bottom: none;
+  }
 
-      .ww55 {
-        width: 55%;
-      }
+  &--split {
+    .split-cell {
+      display: flex;
+      flex: 1;
+      min-width: 0;
 
-      .ww45 {
-        width: 45%;
+      &--left {
+        border-right: 1rpx solid $border-color;
       }
     }
   }
 }
 
-.ellipsis {
-  white-space: nowrap; /* 强制不换行 */
-  overflow: hidden; /* 超出部分隐藏 */
-  text-overflow: ellipsis; /* 显示省略号 */
+.detail-label {
+  width: 140rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-color: #f7f9fa;
+  font-size: 24rpx;
+  color: $uni-text-regular-color;
+  border-right: 1rpx solid $border-color;
+  flex-shrink: 0;
+  padding: 12rpx 8rpx;
+  text-align: center;
+  word-break: keep-all;
+
+  &--sm {
+    width: 100rpx;
+  }
+}
+
+.detail-value {
+  flex: 1;
+  min-width: 0;
+  min-height: 64rpx;
+  font-size: 26rpx;
+  line-height: 1.5;
+  color: $uni-text-color;
+  padding: 12rpx 16rpx;
+  box-sizing: border-box;
+  display: flex;
+  align-items: center;
+  word-break: break-all;
+
+  &--input {
+    display: flex;
+    align-items: center;
+    padding: 6rpx 8rpx;
+  }
+
+  &--stock {
+    flex-direction: column;
+    align-items: flex-start;
+    padding: 8rpx 16rpx;
+  }
+
+  &--select {
+    padding: 4rpx 8rpx;
+  }
 }
 
-.bottom-wrapper {
-  .btn_box {
-    width: 750rpx;
-    height: 88rpx;
-    line-height: 88rpx;
-    background: $theme-color;
-    text-align: center;
-    font-size: 36rpx;
-    font-style: normal;
-    font-weight: 400;
-    color: #fff;
+.delete-btn {
+  width: 60rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  flex-shrink: 0;
+  border-left: 1rpx solid #e3e5e5;
+  background-color: #fff5f5;
+  cursor: pointer;
+
+  &:active {
+    background-color: #fee;
   }
 }
 
-.flex_btn {
-  position: fixed;
+.text-ellipsis {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  display: block;
+}
 
+/* 数量输入 */
+.qty-input {
+  flex: 1;
+  height: 52rpx;
+  border: 2rpx solid #e8f5e9;
+  background: #f0f8f2;
+  border-radius: 8rpx;
+  padding: 0 12rpx;
+  font-size: 26rpx;
+  color: $theme-color;
+  text-align: center;
+}
+
+.qty-unit {
+  width: 80rpx;
+  text-align: center;
+  font-size: 24rpx;
+  color: $uni-text-color-grey;
+  flex-shrink: 0;
+}
+
+/* 库存信息 */
+.stock-item {
+  font-size: 24rpx;
+  color: $uni-text-color;
+  padding: 4rpx 0;
+  line-height: 1.6;
+}
+
+.stock-num {
+  color: $theme-color;
+  font-weight: 600;
+}
+
+/* ========== 子组件区域 ========== */
+.sub-components {
+  margin-top: 20rpx;
+}
+
+/* ========== 已有领料单按钮 ========== */
+.exist-pick-btn {
+  position: fixed;
   right: 0;
-  bottom: 160rpx;
-  width: 140rpx;
-  height: 66rpx;
-  line-height: 66rpx;
-  border-radius: 22rpx 0 0 22rpx;
+  bottom: 180rpx;
+  padding: 14rpx 24rpx;
+  border-radius: 32rpx 0 0 32rpx;
   background: $theme-color;
-  text-align: center;
-  font-size: 22rpx;
-  font-style: normal;
-  font-weight: 400;
   color: #fff;
+  font-size: 24rpx;
+  box-shadow: 0 4rpx 12rpx rgba(21, 122, 44, 0.3);
+  z-index: 10;
 }
 
-.out_box {
-  margin: 20rpx;
+/* ========== 委外领料 ========== */
+.outsource-bar {
+  padding: 30rpx 0;
   display: flex;
   justify-content: center;
+}
+
+.outsource-link {
   color: $theme-color;
   font-size: 28rpx;
+  text-decoration: underline;
+}
+
+/* ========== 弹窗 ========== */
+.popup-content {
+  width: 600rpx;
+  padding: 40rpx 32rpx 32rpx;
+  background: #fff;
+  border-radius: 16rpx;
 }
 
-.popup_list {
-  width: 400rpx;
-  height: 400rpx;
+.popup-title {
+  font-size: 32rpx;
+  font-weight: 600;
+  color: $uni-text-color;
+  text-align: center;
+  margin-bottom: 32rpx;
+}
+
+.popup-body {
+  margin-bottom: 40rpx;
+}
+
+.popup-footer {
+  display: flex;
+  justify-content: space-between;
+  gap: 24rpx;
+
+  .popup-btn {
+    flex: 1;
+    border-radius: 32rpx;
+  }
+}
+
+/* ========== 底部提交栏 ========== */
+.footer-bar {
+  flex-shrink: 0;
+
+  .submit-btn {
+    width: 100%;
+    height: 100rpx;
+    line-height: 100rpx;
+    background: $theme-color;
+    text-align: center;
+    font-size: 34rpx;
+    font-weight: 500;
+    color: #fff;
+    letter-spacing: 4rpx;
+
+    &:active {
+      opacity: 0.85;
+    }
+  }
 }
 </style>

+ 207 - 84
pages/pda/picking/index/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <view class="content-box">
+  <view class="page-container">
     <uni-nav-bar
       fixed="true"
       statusBar="true"
@@ -19,36 +19,41 @@
 				<view class="tab_item" :class="{active: tabType == 2}" @click="handTab(2)">领料工单列表</view>
 			</view> -->
 
-      <view class="nav_box rx-sc">
-        <view
-          class="nav_item"
-          :class="{ active: pickStatus == 0 }"
-          @click="handNav(0)"
-        >
-          工单({{ navObj.unclaimedQuantity || 0 }})</view
-        >
-        <view
-          class="nav_item"
-          :class="{ active: pickStatus == 1 }"
-          @click="handNav(1)"
-        >
-          领料中({{ navObj.claimedQuantity || 0 }})</view
-        >
-        <view
-          class="nav_item"
-          :class="{ active: pickStatus == 2 }"
-          @click="handNav(2)"
-        >
-          已出库({{ navObj.outInQuantity || 0 }})</view
-        >
+      <view class="nav-tabs">
+        <view class="nav-tabs__inner">
+          <view
+            class="nav-tabs__item"
+            :class="{ 'nav-tabs__item--active': pickStatus == 0 }"
+            @click="handNav(0)"
+          >
+            <text class="nav-tabs__text">工单</text>
+            <view class="nav-tabs__badge">{{ navObj.unclaimedQuantity || 0 }}</view>
+          </view>
+          <view
+            class="nav-tabs__item"
+            :class="{ 'nav-tabs__item--active': pickStatus == 1 }"
+            @click="handNav(1)"
+          >
+            <text class="nav-tabs__text">领料中</text>
+            <view class="nav-tabs__badge">{{ navObj.claimedQuantity || 0 }}</view>
+          </view>
+          <view
+            class="nav-tabs__item"
+            :class="{ 'nav-tabs__item--active': pickStatus == 2 }"
+            @click="handNav(2)"
+          >
+            <text class="nav-tabs__text">已出库</text>
+            <view class="nav-tabs__badge">{{ navObj.outInQuantity || 0 }}</view>
+          </view>
+        </view>
 
-        <view class="menu_box" @click="handleSearch">
-          <image class="menu_icon" src="~@/static/pda/menu.svg"></image>
+        <view class="nav-tabs__filter" @click="handleSearch">
+          <image class="nav-tabs__filter-icon" src="~@/static/pda/menu.svg"></image>
         </view>
       </view>
     </view>
 
-    <view class="list_box">
+    <view class="list-container">
       <u-list @scrolltolower="scrolltolower">
         <pickCard v-if="dataList.length && pickStatus == 0" :list="dataList">
         </pickCard>
@@ -59,14 +64,14 @@
         >
         </pickWorkCard>
 
-        <view v-else style="margin-top: 20vh">
+        <view v-else class="empty-wrapper">
           <u-empty iconSize="150" textSize="32" text="暂无工单"> </u-empty>
         </view>
       </u-list>
     </view>
 
-    <view class="bottom-wrapper rx-bc" v-if="pickStatus == 0">
-      <view>
+    <view class="footer-bar" v-if="pickStatus == 0">
+      <view class="footer-bar__left">
         <checkbox
           v-if="!seletedAll"
           color="#fff"
@@ -75,7 +80,7 @@
           >全选</checkbox
         >
         <checkbox
-          class="select-all"
+          class="footer-bar__checkbox--active"
           color="#fff"
           v-else
           :checked="seletedAll"
@@ -83,28 +88,28 @@
           >取消全选
         </checkbox>
       </view>
-      <view>
+      <view class="footer-bar__right">
         <u-button
           type="success"
           size="small"
-          class="u-reset-button"
+          class="footer-bar__btn"
           :disabled="!checkListLen"
           @click="jumpAdd"
         >
-          <view> 选择( {{ checkListLen }} ) </view>
+          <text class="footer-bar__btn-text">选择( {{ checkListLen }} )</text>
         </u-button>
       </view>
     </view>
 
     <SearchPopup mode="top" v-if="searchShow">
       <template v-slot:list>
-        <view class="search_list">
+        <view class="search-panel">
           <u-form
             labelPosition="left"
             :model="formData"
             labelWidth="180"
             labelAlign="left"
-            class="baseForm"
+            class="search-panel__form"
           >
             <u-form-item
               label="工艺路线:"
@@ -126,15 +131,15 @@
       </template>
 
       <template v-slot:operate>
-        <view class="operate_box rx-bc">
-          <u-button size="small" class="u-reset-button" @click="searchCancel">
+        <view class="search-panel__actions">
+          <u-button size="small" class="search-panel__btn search-panel__btn--reset" @click="searchCancel">
             重置
           </u-button>
 
           <u-button
             type="success"
             size="small"
-            class="u-reset-button"
+            class="search-panel__btn search-panel__btn--confirm"
             @click="search"
           >
             确定
@@ -346,25 +351,32 @@ export default {
 </script>
 
 <style lang="scss" scoped>
-.content-box {
+/* 页面容器 */
+.page-container {
   height: 100vh;
   overflow: hidden;
   display: flex;
   flex-direction: column;
-  background-color: $page-bg;
+  background-color: $uni-bg-color-grey;
 }
 
+/* 顶部区域 */
+.top-wrapper {
+  background-color: $uni-bg-color;
+}
+
+/* Tab 导航栏 */
 .tab_box {
   width: 100%;
-  height: 68rpx;
-  background: #fff;
+  height: $tab-height;
+  background: $uni-bg-color;
 
   .tab_item {
-    height: 68rpx;
-    line-height: 68rpx;
-    padding: 0 20rpx;
-    font-size: 32rpx;
-    color: #979c9e;
+    height: $tab-height;
+    line-height: $tab-height;
+    padding: 0 24rpx;
+    font-size: $uni-font-size-base;
+    color: $uni-text-color-grey;
   }
 
   .active {
@@ -374,53 +386,143 @@ export default {
   }
 }
 
-.nav_box {
-  padding: 6rpx 32rpx;
-  position: relative;
+/* 状态导航标签 */
+.nav-tabs {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 20rpx 24rpx;
+  background-color: $uni-bg-color;
+  border-bottom: 1rpx solid $border-color;
+
+  &__inner {
+    display: flex;
+    align-items: center;
+    flex: 1;
+    gap: 16rpx;
+  }
 
-  .nav_item {
-    font-size: 28rpx;
-    font-weight: 400;
-    color: $theme-color;
-    background: #f0f8f2;
-    margin-right: 16rpx;
-    padding: 4rpx 16rpx;
-    border-radius: 8rpx;
-    border: 2rpx solid #acd4b5;
+  &__item {
+    display: flex;
+    align-items: center;
+    padding: 12rpx 24rpx;
+    border-radius: 40rpx;
+    font-size: $uni-font-size-sm;
+    color: $uni-text-regular-color;
+    background-color: $uni-bg-color-grey;
+    transition: all 0.2s;
+
+    &--active {
+      background-color: $theme-color;
+      color: $uni-text-color-inverse;
+      box-shadow: 0 4rpx 12rpx rgba(21, 122, 44, 0.3);
+
+      .nav-tabs__badge {
+        background-color: rgba(255, 255, 255, 0.3);
+        color: $uni-text-color-inverse;
+      }
+    }
   }
 
-  .menu_box {
-    position: absolute;
-    right: 20rpx;
-    top: 10rpx;
+  &__text {
+    font-size: $uni-font-size-sm;
+    line-height: 1;
+  }
+
+  &__badge {
+    min-width: 36rpx;
+    height: 36rpx;
+    line-height: 36rpx;
+    text-align: center;
+    font-size: $uni-font-size-ssm;
+    border-radius: 20rpx;
+    padding: 0 8rpx;
+    margin-left: 8rpx;
+    background-color: #e8e8e8;
+    color: $uni-text-regular-color;
+  }
 
-    .menu_icon {
-      width: 44rpx;
-      height: 44rpx;
+  &__filter {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 64rpx;
+    height: 64rpx;
+    border-radius: 50%;
+    background-color: $uni-bg-color-grey;
+    flex-shrink: 0;
+    margin-left: 16rpx;
+
+    &:active {
+      background-color: $uni-bg-color-hover;
     }
   }
 
-  .active {
-    background: $theme-color;
-    border: 2rpx solid $theme-color;
-    color: #fff;
+  &__filter-icon {
+    width: 40rpx;
+    height: 40rpx;
   }
 }
 
-.list_box {
+/* 列表区域 */
+.list-container {
   flex: 1;
   overflow: hidden;
-  padding: 4rpx 0;
+  padding: 12rpx 0;
 
   .u-list {
     height: 100% !important;
   }
 }
 
-.bottom-wrapper {
-  height: 80rpx;
-  background: #fff;
+/* 空数据占位 */
+.empty-wrapper {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding-top: 30vh;
+}
+
+/* 底部操作栏 */
+.footer-bar {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  height: 100rpx;
+  background-color: $uni-bg-color;
   padding: 0 32rpx;
+  box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.06);
+  /* 适配底部安全区域 */
+  padding-bottom: constant(safe-area-inset-bottom);
+  padding-bottom: env(safe-area-inset-bottom);
+
+  &__left {
+    display: flex;
+    align-items: center;
+    font-size: $uni-font-size-sm;
+    color: $uni-text-color;
+  }
+
+  &__right {
+    display: flex;
+    align-items: center;
+  }
+
+  &__btn {
+    min-width: 180rpx;
+    height: 68rpx;
+    border-radius: 34rpx;
+    font-size: $uni-font-size-sm;
+  }
+
+  &__btn-text {
+    font-size: $uni-font-size-sm;
+    color: $uni-text-color-inverse;
+  }
+
+  &__checkbox--active {
+    /* 选中状态样式 */
+  }
 
   /deep/ .uni-checkbox-input-checked {
     background-color: $theme-color !important;
@@ -428,19 +530,40 @@ export default {
   }
 }
 
-.search_list {
-  min-height: 100rpx;
+/* 搜索面板 */
+.search-panel {
+  min-height: 120rpx;
+  padding: 20rpx 0;
 
-  /deep/ .baseForm {
-    padding: 0 20rpx;
+  &__form {
+    padding: 0 32rpx;
   }
-}
 
-.operate_box {
-  padding: 10rpx 32rpx;
+  &__actions {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 20rpx 32rpx 32rpx;
+    gap: 24rpx;
+  }
+
+  &__btn {
+    flex: 1;
+    height: 76rpx;
+    border-radius: 38rpx;
+    font-size: $uni-font-size-sm;
 
-  /deep/ .u-button {
-    width: 40%;
+    &--reset {
+      background-color: $uni-bg-color-grey;
+      color: $uni-text-regular-color;
+      border: none;
+    }
+
+    &--confirm {
+      background-color: $theme-color;
+      color: $uni-text-color-inverse;
+      border: none;
+    }
   }
 }
 </style>

+ 981 - 0
pages/pda/workOrder/search/newIndex.vue

@@ -0,0 +1,981 @@
+<template>
+  <view class="page-container">
+    <uni-nav-bar
+      fixed="true"
+      statusBar="true"
+      left-icon="back"
+      title="搜索"
+      @clickLeft="back"
+    >
+      <!--右菜单-->
+      <template slot="right">
+        <u-button
+          type="success"
+          size="small"
+          class="u-reset-button nav-right-btn"
+          @click="openTreePicker"
+          text="选择分类"
+        ></u-button>
+      </template>
+    </uni-nav-bar>
+
+    <!-- 搜索栏 -->
+    <view class="search-wrapper">
+      <view class="search-bar">
+        <view class="search-input-box">
+          <uni-icons type="search" size="18" color="#999"></uni-icons>
+          <input
+            v-model="keyWord"
+            placeholder="请输入关键字搜索"
+            placeholder-class="search-placeholder"
+            class="search-input"
+            confirm-type="search"
+            @confirm="doSearch"
+          />
+        </view>
+        <view class="search-actions">
+          <view class="filter-btn" @click="handleSearch">
+            <image
+              class="filter-icon"
+              src="~@/static/pda/menu.svg"
+            ></image>
+          </view>
+          <view class="search-btn" @click="doSearch">
+            <text class="search-btn-text">搜索</text>
+          </view>
+        </view>
+      </view>
+    </view>
+
+    <!-- 列表区域 -->
+    <view class="list-container">
+      <u-list @scrolltolower="scrolltolower">
+        <checkbox-group
+          v-for="(item, index) in list"
+          :key="index"
+          @change="(e) => selectVal(e, item, index)"
+        >
+          <label class="list-card">
+            <view class="card-checkbox">
+              <checkbox
+                v-if="
+                  item.rootCategoryLevelId != 11 ||
+                  (item.rootCategoryLevelId == 11 && item.status != 1)
+                "
+                :value="item.code"
+                color="#fff"
+                :disabled="item.disabled"
+                :checked="item.checked"
+              />
+            </view>
+
+            <view class="card-content">
+              <view class="card-header">
+                <text class="card-title">{{ item.categoryName }}</text>
+                <text class="card-code">{{
+                  item.rootCategoryLevelId == 4
+                    ? item.codeNumber
+                    : item.categoryCode
+                }}</text>
+              </view>
+
+              <view class="card-body">
+                <view
+                  v-for="(itm, idx) in tableH(item.rootCategoryLevelId)"
+                  :key="idx"
+                  class="info-item"
+                  v-if="!itm.formatter"
+                >
+                  <text class="info-label">{{ itm.label }}</text>
+                  <text class="info-value">{{ item[itm.prop] }}</text>
+                </view>
+
+                <view class="info-item">
+                  <text class="info-label">批次号</text>
+                  <text class="info-value">{{ item.batchNo }}</text>
+                </view>
+
+                <view class="info-item">
+                  <text class="info-label">计量库存数量</text>
+                  <text class="info-value">{{ item.measureQuantity }} {{ item.measureUnit }}</text>
+                </view>
+
+                <view class="info-item">
+                  <text class="info-label">重量</text>
+                  <text class="info-value">{{ item.weight }} {{ item.weightUnit }}</text>
+                </view>
+
+                <view class="info-item">
+                  <text class="info-label">编号</text>
+                  <text class="info-value">{{ item.codeNumber }}</text>
+                </view>
+
+                <view class="info-item">
+                  <text class="info-label">仓库</text>
+                  <text class="info-value">{{ item.warehouseName }}</text>
+                </view>
+              </view>
+            </view>
+          </label>
+        </checkbox-group>
+
+        <view v-if="list.length == 0" class="empty-state">
+          <u-empty iconSize="150" textSize="32" text="暂无数据"> </u-empty>
+        </view>
+      </u-list>
+    </view>
+
+    <!-- 底部操作栏 -->
+    <view class="footer-bar">
+      <view class="footer-left">
+        <checkbox
+          v-if="!seletedAll"
+          color="#fff"
+          :checked="seletedAll"
+          @tap="_seletedAll"
+          >全选</checkbox
+        >
+        <checkbox
+          class="select-all"
+          color="#fff"
+          v-else
+          :checked="seletedAll"
+          @tap="_seletedAll"
+          >取消全选
+        </checkbox>
+      </view>
+      <view class="footer-right">
+        <u-button
+          type="success"
+          size="small"
+          class="u-reset-button confirm-btn"
+          :disabled="!checkListLen"
+          @click="jumpAdd(1)"
+        >
+          <view> 选择( {{ checkListLen }} ) </view>
+        </u-button>
+
+        <!-- 	<u-button v-if='rootCategoryLevelId == 23' type="success" size="small" class="u-reset-button"
+					@click="jumpAdd(2)">
+					<view> 确认 </view>
+				</u-button> -->
+      </view>
+    </view>
+
+    <ba-tree-picker
+      ref="treePicker"
+      key="verify"
+      :multiple="false"
+      @select-change="confirm"
+      title="选择分类"
+      :localdata="classificationList"
+      valueKey="id"
+      textKey="name"
+      childrenKey="children"
+    />
+
+    <SearchPopup mode="top" v-if="searchShow">
+      <template v-slot:list>
+        <view class="search_list">
+          <u-form
+            labelPosition="left"
+            :model="formData"
+            labelWidth="180"
+            labelAlign="left"
+            class="baseForm"
+          >
+            <u-form-item
+              label="仓库:"
+              class="required-form"
+              borderBottom
+              prop="warehouseId"
+            >
+              <zxz-uni-data-select
+                :localdata="warehouseList"
+                v-model="formData.warehouseId"
+                dataValue="id"
+                format="{name}"
+                dataKey="name"
+                filterable
+              ></zxz-uni-data-select>
+            </u-form-item>
+
+            <u-form-item
+              label="维度:"
+              v-if="isType == 'pick'"
+              class="required-form"
+              borderBottom
+              prop="warehouseId"
+            >
+              <zxz-uni-data-select
+                :localdata="dimensionList"
+                v-model="formData.dimension"
+                dataValue="id"
+                format="{name}"
+                dataKey="name"
+                filterable
+              ></zxz-uni-data-select>
+            </u-form-item>
+          </u-form>
+        </view>
+      </template>
+
+      <template v-slot:operate>
+        <view class="operate_box rx-bc">
+          <u-button size="small" class="u-reset-button" @click="searchCancel">
+            重置
+          </u-button>
+
+          <u-button
+            type="success"
+            size="small"
+            class="u-reset-button"
+            @click="doSearch"
+          >
+            确定
+          </u-button>
+        </view>
+      </template>
+    </SearchPopup>
+  </view>
+</template>
+
+<script>
+import baTreePicker from "@/components/ba-tree-picker/ba-tree-picker.vue";
+import { tableHeader } from "../../common.js";
+import {
+  treeByPid,
+  pageeLedgerMain,
+  assetPage,
+  getWarehouseList,
+  listInProduct,
+  outsourceEndPick,
+  categoryGetList,
+  getBatchListInventory,
+  getProductListInventory,
+} from "@/api/pda/workOrder.js";
+
+import SearchPopup from "../../components/searchPopup.vue";
+
+import { EventBus } from "@/utils/eventBus.js";
+
+let [isEnd] = [false];
+export default {
+  components: {
+    baTreePicker,
+    SearchPopup,
+  },
+  data() {
+    return {
+      keyWord: null,
+      rootCategoryLevelId: null,
+      categoryLevelId: null,
+      classificationList: [],
+      treePickerShow: false,
+      list: [],
+      page: 1,
+
+      seletedAll: false, //全选状态
+      memoList: [],
+
+      isType: null,
+      taskId: null,
+
+      pid: null, // 上个页面id
+      storageKey: null,
+
+      formData: {
+        produceRoutingId: "",
+        dimension: 2,
+      },
+      warehouseList: [],
+
+      searchShow: false,
+
+      stateList: [
+        "启动",
+        "空闲",
+        "运行",
+        "故障",
+        "检修",
+        "停机",
+        "待料",
+        "占用",
+      ],
+      classIds: [],
+
+      dimensionList: [
+        {
+          id: 1,
+          name: "物品维度",
+        },
+        {
+          id: 2,
+          name: "批次维度",
+        },
+      ],
+
+      clientEnvironmentId:
+        uni.getStorageSync("userInfo") &&
+        uni.getStorageSync("userInfo").clientEnvironmentId, // *1 主环境-601环境   2 soll-索尔环境    3 tg-碳谷环境
+    };
+  },
+
+  //选择的列表长度
+  computed: {
+    checkListLen() {
+      return this.memoList.length;
+    },
+  },
+
+  onLoad(option) {
+    this.pid = option.id;
+    this.classIds = option.classIds || [];
+
+    this.isType = option.isType;
+    if (option.taskId == "undefined") {
+      this.taskId = null;
+    } else {
+      this.taskId = option.taskId || null;
+    }
+    if (Object.prototype.hasOwnProperty.call(option, "classIds")) {
+      this.classIds = option.classIds;
+    }
+
+    if (option.storageKey) {
+      this.storageKey = option.storageKey;
+
+      this.memoList = [];
+
+      if (this.isType == "feed") {
+        let _arr =
+          (this.storageKey && uni.getStorageSync(this.storageKey)) || [];
+        this.memoList = [
+          ..._arr[0].modelList,
+          ..._arr[0].equipmentList,
+          ..._arr[0].instanceList,
+          ..._arr[0].aridRegionList,
+          ..._arr[0].turnover,
+          ..._arr[0].palletList,
+          ..._arr[0].revolvingDiskList,
+          ..._arr[0].semiProductList,
+        ];
+      } else if (this.isType == "pick") {
+        this.memoList =
+          (this.storageKey && uni.getStorageSync(this.storageKey)) || [];
+      } else if (this.isType == "job") {
+        let _obj =
+          (this.storageKey && uni.getStorageSync(this.storageKey)) || {};
+
+        if (Object.prototype.hasOwnProperty.call(_obj, "turnover")) {
+          this.memoList = this.memoList.concat(_obj.turnover);
+        } else if (
+          Object.prototype.hasOwnProperty.call(_obj, "equipmentList")
+        ) {
+          this.memoList = this.memoList.concat(_obj.equipmentList);
+        }
+      } else if (this.isType == "zdy") {
+        let _arr =
+          (this.storageKey && uni.getStorageSync(this.storageKey)) || [];
+
+        if (
+          _arr.length != 0 &&
+          Object.prototype.hasOwnProperty.call(_arr[0], "turnover")
+        ) {
+          this.memoList = this.memoList.concat(_arr[0].turnover);
+        } else if (
+          _arr.length != 0 &&
+          Object.prototype.hasOwnProperty.call(_arr[0], "equipmentList")
+        ) {
+          this.memoList = this.memoList.concat(_arr[0].equipmentList);
+        } else if (
+          _arr.length != 0 &&
+          Object.prototype.hasOwnProperty.call(_arr[0], "standardOutputList")
+        ) {
+          this.memoList = this.memoList.concat(_arr[0].standardOutputList);
+        } else if (
+          _arr.length != 0 &&
+          Object.prototype.hasOwnProperty.call(_arr[0], "bomMaterialList")
+        ) {
+          this.memoList = this.memoList.concat(_arr[0].bomMaterialList);
+        }
+      }
+    }
+
+    this.getTreeList();
+
+    this.getWarehouseFn();
+  },
+
+  onUnload() {
+    if (this.storageKey) {
+      uni.removeStorage(this.storageKey);
+    }
+  },
+
+  methods: {
+    _seletedAll() {
+      if (!this.seletedAll) {
+        this.seletedAll = true;
+
+        this.list.map((item) => {
+          this.$set(item, "checked", true);
+          const idx = this.memoList.findIndex((itm) => itm.id === item.id);
+          if (idx === -1) {
+            this.memoList.push(item);
+          }
+        });
+      } else {
+        this.seletedAll = false;
+        this.list.map((item) => {
+          this.$set(item, "checked", false);
+
+          const idx = this.memoList.findIndex((itm) => itm.id === item.id);
+          if (idx > -1) {
+            this.memoList.splice(idx, 1);
+          }
+        });
+      }
+    },
+
+    openTreePicker() {
+      this.$refs.treePicker._show();
+    },
+    tableH(type) {
+      return [
+        {
+          label: "型号",
+          prop: "categoryModel",
+        },
+        {
+          label: "规格",
+          prop: "specification",
+        },
+        {
+          label: "牌号",
+          prop: "brandNum",
+        },
+      ];
+      // return tableHeader(type);
+    },
+
+    getTreeList() {
+      let params = {};
+      console.log(this.classIds, "option", this.isType);
+      if (this.isType == "feed") {
+        // params.ids = [1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 26, 9, 28];
+        params.ids = ["4, 5, 7, 8, 11, 14, 26"];
+      } else if (this.isType == "pick") {
+        // params.ids = [1, 5, 7, 8, 10, 13, 14, 23, 26, 9, 28]
+        params.ids = [9, 23, 2, 1, 4, 14, 5, 8, 16, 13, 15, 6, 10, 22];
+      } else if (this.isType == "job") {
+        // params["ids"] = [4, 7];
+        if (this.clientEnvironmentId == 2) {
+          params["ids"] = [7];
+        } else {
+          params["ids"] = [4, 5, 7, 8, 11, 14, 26];
+        }
+      } else if (this.isType == "zdy") {
+        params["ids"] = JSON.parse(this.classIds);
+      } else if (this.isType == "weiwai") {
+        // params['ids'] = JSON.parse(this.classIds)
+        params["ids"] = [9, 23, 2, 1, 4, 14, 5, 8, 16, 13, 15, 6, 10, 22];
+      }
+
+      treeByPid(params).then((res) => {
+        this.classificationList = res;
+        this.confirm([res[0].id], res[0].name, res[0].rootCategoryLevelId);
+      });
+    },
+
+    confirm(id, name, rootCategoryLevelId) {
+      this.rootCategoryLevelId = rootCategoryLevelId;
+
+      this.categoryLevelId = id;
+
+      this.list = [];
+
+      console.log("是这里嘛");
+      this.getList();
+    },
+
+    doSearch() {
+      this.list = [];
+      this.getList();
+      this.searchShow = false;
+    },
+
+    scrolltolower() {
+      if (isEnd) return;
+      this.page++;
+      this.getList();
+    },
+
+    getList() {
+      let param = {
+        categoryLevelId: this.categoryLevelId,
+        keyWord: this.keyWord,
+        pageNum: this.page,
+        size: 100,
+        taskId: this.taskId,
+      };
+
+      if (this.rootCategoryLevelId == "11") {
+        // 干燥区特殊处理
+        param.size = 5;
+      }
+      isEnd = false;
+      let URL = null;
+      if (this.isType == "pick") {
+        // 领料
+        // if (this.rootCategoryLevelId == 23) {
+        // 	this.list = []
+        // 	param = {}
+        // 	param.workOrderId = this.pid
+        // 	URL = listOutsourceInWarehouse
+        // } else {
+        // 	param.dimension = 1
+        // 	URL = pageeLedgerMain
+        if (this.formData.dimension == 1) {
+          URL = getProductListInventory;
+        } else if (this.formData.dimension == 2) {
+          URL = getBatchListInventory;
+        }
+        // }
+        param.dimension = this.formData.dimension;
+        // URL = pageeLedgerMain;
+      } else if (this.isType == "feed") {
+        // 投料
+
+        if ([4, 7, 14].includes(Number(this.rootCategoryLevelId))) {
+          URL = assetPage;
+        } else if (this.rootCategoryLevelId == 2) {
+          param.workOrderId = this.pid;
+          delete param.taskId;
+          delete param.categoryLevelId;
+          URL = listInProduct;
+        } else if (![2, 4, 7, 14].includes(Number(this.rootCategoryLevelId))) {
+          URL = assetPage;
+          // if (this.formData.dimension == 3) { // 包装维度
+          // 	URL = getInventoryDetails
+          // 	param.dimension = 3
+          // 	param.rootCategoryLevelId = this.rootCategoryLevelId
+          // } else if (this.formData.dimension == 4) { // 物料维度
+          // 	param.dimension = 4
+          // 	param.rootCategoryLevelId = this.rootCategoryLevelId
+          // 	URL = getMaterielDetails
+          // }
+        }
+      } else if (this.isType == "job" || this.isType == "zdy") {
+        // 报工
+        URL = assetPage;
+      } else if (this.isType == "weiwai") {
+        // 出库
+        if (this.pid == 3) {
+          URL = categoryGetList;
+        } else {
+          // URL = assetPdaPage
+          URL = pageeLedgerMain;
+        }
+      }
+
+      URL(param).then((res) => {
+        if (this.rootCategoryLevelId == "11") {
+          res.list.forEach((e) => {
+            if (e.aridRegionList && e.aridRegionList.length != 0) {
+              e.aridRegionList.map((i) => {
+                const checked =
+                  this.memoList.findIndex((itm) => itm.id === i.id) > -1;
+
+                let obj = {
+                  checked,
+                  name: e.name,
+                  region: e.extInfo.region,
+                  rootCategoryLevelId: e.rootCategoryLevelId,
+                  ...i,
+                  instanceId: i.id,
+                };
+                this.list.push(obj);
+              });
+            }
+          });
+        } else {
+          this.list.push(
+            ...res.list.map((i) => {
+              const checked =
+                this.memoList.findIndex((itm) => itm.id === i.id) > -1;
+
+              const warehouseId = i.pathIds && i.pathIds.split(",")[0];
+
+              return {
+                checked,
+                warehouseId,
+                ...i,
+                instanceId: i.id,
+              };
+            }),
+          );
+        }
+
+        isEnd = this.list.length >= res.count;
+      });
+    },
+
+    //勾选
+    selectVal(e, val, index) {
+      if (val.rootCategoryLevelId == 11 && val.status == 1) {
+        return false;
+      }
+      this.list[index].checked = !this.list[index].checked;
+      this.seletedAll = !this.list.some((item) => !item.checked);
+      const idx = this.memoList.findIndex(
+        (item) => item.id === this.list[index].id,
+      );
+
+      if (this.list[index].checked) {
+        if (idx === -1) {
+          this.memoList.push(this.list[index]);
+        }
+      } else {
+        if (idx > -1) {
+          this.memoList.splice(idx, 1);
+        }
+      }
+    },
+
+    handleSearch() {
+      this.searchShow = true;
+    },
+
+    searchCancel() {
+      this.list = [];
+      this.page = 1;
+      this.getList();
+      this.searchShow = false;
+    },
+
+    //跳转回添加页面
+    jumpAdd(type) {
+      if (type == 1) {
+        if (
+          this.isType == "pick" ||
+          this.isType == "feed" ||
+          this.isType == "job" ||
+          this.isType == "zdy" ||
+          this.isType == "weiwai"
+        ) {
+          this.memoList.map((item) => {
+            item.extInfo.heatNumber = "";
+          });
+
+          if (
+            (this.isType == "zdy" || this.isType == "weiwai") &&
+            (this.pid == 2 || this.pid == 3)
+          ) {
+            let param = {
+              memoList: this.memoList,
+              pid: this.pid,
+            };
+
+            console.log(param, "paramparamparam");
+
+            EventBus.$emit("outEvent", { message: param });
+          } else {
+            uni.$emit("setSelectList", this.memoList, this.pid);
+          }
+
+          uni.navigateBack();
+        }
+      } else if (type == 2) {
+        uni.showModal({
+          title: "提示",
+          content: "是否领取该工单半成品到此工序!",
+          confirmText: "确认", //这块是确定按钮的文字
+          success: (rr) => {
+            if (rr.confirm) {
+              let param = {
+                taskId: this.taskId,
+                workOrderId: this.pid,
+                pickOutInList: this.list,
+              };
+
+              outsourceEndPick(param).then((res) => {
+                // uni.$emit('setSelectList', this.list, this.pid)
+                uni.showToast({
+                  title: "半成品领料成功,请先去审核",
+                  icon: "none",
+                });
+
+                uni.navigateBack();
+              });
+            }
+          },
+        });
+      }
+    },
+
+    getWarehouseFn() {
+      getWarehouseList().then((res) => {
+        this.warehouseList = res;
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.page-container {
+  height: 100vh;
+  overflow: hidden;
+  display: flex;
+  flex-direction: column;
+  background-color: $page-bg;
+}
+
+/* 导航栏右侧按钮 */
+.nav-right-btn {
+  border-radius: 30rpx !important;
+  font-size: 24rpx !important;
+  padding: 0 24rpx !important;
+}
+
+/* 搜索栏 */
+.search-wrapper {
+  padding: 16rpx 24rpx;
+  background-color: #fff;
+}
+
+.search-bar {
+  display: flex;
+  align-items: center;
+  gap: 16rpx;
+}
+
+.search-input-box {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  height: 72rpx;
+  background-color: #f5f6f7;
+  border-radius: 36rpx;
+  padding: 0 24rpx;
+  gap: 12rpx;
+}
+
+.search-input {
+  flex: 1;
+  height: 72rpx;
+  font-size: 28rpx;
+  color: $uni-text-color;
+}
+
+.search-placeholder {
+  color: #c0c0c0;
+  font-size: 26rpx;
+}
+
+.search-actions {
+  display: flex;
+  align-items: center;
+  flex-shrink: 0;
+  gap: 12rpx;
+}
+
+.filter-btn {
+  width: 64rpx;
+  height: 64rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-color: #f5f6f7;
+  border-radius: 50%;
+
+  &:active {
+    opacity: 0.7;
+  }
+}
+
+.filter-icon {
+  width: 40rpx;
+  height: 40rpx;
+}
+
+.search-btn {
+  height: 64rpx;
+  padding: 0 32rpx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background-color: $theme-color;
+  border-radius: 32rpx;
+
+  &:active {
+    opacity: 0.85;
+  }
+}
+
+.search-btn-text {
+  color: #fff;
+  font-size: 26rpx;
+  white-space: nowrap;
+}
+
+/* 列表容器 */
+.list-container {
+  flex: 1;
+  overflow: hidden;
+  padding: 0 24rpx;
+
+  /deep/ .u-list {
+    height: 100% !important;
+  }
+}
+
+/* 列表卡片 */
+.list-card {
+  display: flex;
+  align-items: flex-start;
+  margin-top: 20rpx;
+  padding: 24rpx;
+  background: #fff;
+  border-radius: 16rpx;
+  box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.04);
+
+  /deep/ .uni-checkbox-input-checked {
+    background-color: $theme-color !important;
+    border-color: $theme-color !important;
+  }
+}
+
+.card-checkbox {
+  flex-shrink: 0;
+  margin-right: 16rpx;
+  padding-top: 4rpx;
+}
+
+.card-content {
+  flex: 1;
+  min-width: 0;
+}
+
+.card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding-bottom: 16rpx;
+  border-bottom: 1rpx solid #f0f0f0;
+}
+
+.card-title {
+  font-size: 30rpx;
+  font-weight: 600;
+  color: #1a1a1a;
+  flex: 1;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.card-code {
+  font-size: 24rpx;
+  color: $theme-color;
+  background-color: rgba(21, 122, 44, 0.08);
+  padding: 4rpx 16rpx;
+  border-radius: 20rpx;
+  flex-shrink: 0;
+  margin-left: 16rpx;
+}
+
+.card-body {
+  display: flex;
+  flex-wrap: wrap;
+  margin-top: 16rpx;
+  gap: 0;
+}
+
+.info-item {
+  width: 50%;
+  display: flex;
+  flex-direction: column;
+  padding: 12rpx 0;
+  box-sizing: border-box;
+
+  &:nth-child(odd) {
+    padding-right: 16rpx;
+  }
+
+  &:nth-child(even) {
+    padding-left: 16rpx;
+    border-left: 1rpx solid #f0f0f0;
+  }
+}
+
+.info-label {
+  font-size: 22rpx;
+  color: #999;
+  margin-bottom: 4rpx;
+  line-height: 1.4;
+}
+
+.info-value {
+  font-size: 26rpx;
+  color: #333;
+  word-break: break-all;
+  line-height: 1.5;
+}
+
+/* 空状态 */
+.empty-state {
+  margin-top: 20vh;
+}
+
+/* 底部操作栏 */
+.footer-bar {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  height: 110rpx;
+  background: #fff;
+  padding: 0 32rpx;
+  box-shadow: 0 -2rpx 12rpx rgba(0, 0, 0, 0.06);
+  /* 适配底部安全区域 */
+  padding-bottom: constant(safe-area-inset-bottom);
+  padding-bottom: env(safe-area-inset-bottom);
+
+  /deep/ .uni-checkbox-input-checked {
+    background-color: $theme-color !important;
+    border-color: $theme-color !important;
+  }
+}
+
+.footer-left {
+  font-size: 28rpx;
+  color: #333;
+}
+
+.footer-right {
+  display: flex;
+  align-items: center;
+}
+
+.confirm-btn {
+  border-radius: 32rpx !important;
+  padding: 0 36rpx !important;
+  height: 68rpx !important;
+  line-height: 68rpx !important;
+  font-size: 28rpx !important;
+}
+
+/* 搜索弹窗 */
+.search_list {
+  min-height: 100rpx;
+
+  /deep/ .baseForm {
+    padding: 0 24rpx;
+  }
+}
+
+.operate_box {
+  padding: 16rpx 24rpx;
+}
+</style>