瀏覽代碼

前端静态页面开发

oyq28 1 周之前
父節點
當前提交
838638d399

二進制
db/qt_app_800.db


+ 16 - 2
pages.json

@@ -40,9 +40,9 @@
   	}
   }, 
   {
-  	"path": "pages/work/report/InspectionDetail",
+  	"path": "pages/work/process/ProcessList",
   	"style": {
-  		"navigationBarTitleText": "检验记录详情"
+  		"navigationBarTitleText": "关键工序"
   	}
   },
   {
@@ -128,6 +128,20 @@
     "style": {
         "navigationBarTitleText": ""
     }
+},
+{
+	"path" : "pages/work/download/DownloadList",
+	"style" : 
+	{
+		"navigationBarTitleText" : "数据下载"
+	}
+},
+{
+	"path" : "pages/work/task/TaskList",
+	"style" : 
+	{
+		"navigationBarTitleText" : "任务管理"
+	}
 }
 ],
   "tabBar": {

+ 140 - 0
pages/work/download/DownloadList.uvue

@@ -0,0 +1,140 @@
+<template>
+	<!-- #ifdef APP -->
+	<scroll-view style="flex:1" scroll-y class="container">
+	<!-- #endif -->
+	    <view class="info-row" >
+			<button class="btn" @click="download()">
+				下载数据
+			</button>
+			<button class="btn" @click="upload()">
+				上传数据
+			</button>
+		</view>	 
+	
+		<view class="download-card" v-for="item in downloads" :key="item.pdid">
+		    <view class="info-row">
+		    	<text class="label">工作令:</text>
+		    	<text class="value">{{ item.workorder }}</text>
+		    </view>
+			<view class="info-row">
+				<text class="label">产品名称:</text>
+				<text class="value">{{ item.productNo }}</text>
+			</view>
+			<view class="info-row">
+				<text class="label">图号:</text>
+				<text class="value">{{ item.graphid }}</text>
+			</view>
+			<view class="info-row">
+				<text class="label">路卡号:</text>
+				<text class="value">{{ item.cardno }}</text>
+			</view>
+			<view class="info-row">
+				<text class="label">工艺编号:</text>
+				<text class="value">{{ item.processno }}</text>
+			</view>
+			<view class="info-row">
+				<text class="label">版本号:</text>
+				<text class="value">{{ item.ver }}</text>
+			</view>
+			<view class="info-row">
+				<text class="label">最近更新时间:</text>
+				<text class="value">{{ item.updatetime }}</text>
+			</view>
+			<view class="info-row">
+				<text class="label">进度:</text>
+				<text class="value">{{ item.progress }}</text>
+			</view>
+		</view>
+	<!-- #ifdef APP -->
+	</scroll-view>
+	<!-- #endif -->
+</template>
+
+<script setup>
+	import {
+		ref
+	} from 'vue'
+	
+	const downloads = ref([{
+		pdid:1,
+		workorder:"632-P-01",
+		graphid:"HBJ0100-00",
+		cardno: "LK20230707070012",
+		processno: "Pb/XXX-E11",
+		ver: "A.1",
+		updatetime: "2025-06-23",
+		progress: "1/3"
+		
+	},{
+		pdid:2,
+		workorder:"712-SY-10-6",
+		graphid:"1XC002-00",
+		cardno: "LK20250215003",
+		processno: "Pb/XXX-E11",
+		ver: "B.1",
+		updatetime: "2025-08-25",
+		progress: "0/4"		
+	}]);
+	const download = () => {
+		
+	}  
+	const upload = () => {
+		
+	} 
+	
+</script>
+
+<style>
+  .container {
+  	padding: 40rpx;
+  	background-color: #f5f7fa;
+  	min-height: 100vh;
+  	box-sizing: border-box;
+  }
+  .download-card {
+  	background: #ffffff;
+  	border-radius: 20rpx;
+  	padding: 24rpx 32rpx;
+  	box-shadow: 0 8rpx 15rpx rgba(0, 43, 92, 0.1);
+  	display: flex;
+  	flex-direction: column;
+  	gap: 16rpx;
+  	margin-bottom: 20rpx;
+  	margin-top: 40rpx;
+  }
+  /* 信息行 */
+  .info-row {
+  	display: flex;
+  	flex-direction: row;
+  	gap: 10rpx;
+  	font-size: 28rpx;
+  	color: #33475b;
+  	align-items: center;
+  }
+  
+  .label {
+  	font-weight: 600;
+  	color: #102a43;
+  	min-width: 100rpx;
+  }
+  
+  .value {
+  	flex: 1;
+  	white-space: nowrap;
+  	overflow: hidden;
+  	text-overflow: ellipsis;
+  }
+  .btn {
+  	align-self: flex-end;
+  	background-color: #0000ff;
+  	color: #fff;
+  	border: none;
+  	border-radius: 32rpx;
+  	padding: 5rpx 30rpx;
+  	font-size: 24rpx;
+  	font-weight: 700;
+  	cursor: pointer;
+  	transition: background-color 0.3s ease;
+	margin-top:30rpx;
+  }
+</style>

+ 3 - 3
pages/work/index.uvue

@@ -52,11 +52,11 @@
       return {
 		items: [
 		      {colorClass: 'blue', iconType: "person-filled", text: "用户管理",path:"" },
-			  {colorClass: 'blue', iconType: "download", text: "数据下载",path:"" },
-			  {colorClass: 'blue', iconType: "list", text: "任务管理",path:"" },
+			  {colorClass: 'blue', iconType: "download", text: "数据下载",path:"/pages/work/download/DownloadList" },
+			  {colorClass: 'blue', iconType: "list", text: "任务管理",path:"/pages/work/task/TaskList" },
 			  {colorClass: 'orange', iconType: "mic", text: "声像记录", path:"/pages/work/record/RecordList"},
 			  {colorClass: 'orange', iconType: "calendar", text: "检验记录",path:"/pages/work/report/InspectionList" },
-			  {colorClass: 'orange', iconType: "gear-filled", text: "关键工序",path:"" },
+			  {colorClass: 'orange', iconType: "gear-filled", text: "关键工序",path:"/pages/work/process/ProcessList" },
 			  {colorClass: 'green', iconType: "folder-add-filled", text: "文档查阅",path:"" },
 			  {colorClass: 'green', iconType: "cloud-upload", text: "数据上传",path:"" },
 			  {colorClass: 'green', iconType: "wallet-filled", text: "日志管理",path:"" }

+ 301 - 0
pages/work/process/ProcessList.uvue

@@ -0,0 +1,301 @@
+<template>
+	<scroll-view scroll-y class="container">
+		<!-- Banner -->
+		<view class="banner">
+			<text class="banner-title">关键工序</text>
+		</view>
+		<view class="card-list">
+			<u-sticky bgColor="#fff">
+				<u-tabs :list="tabsList" 
+				lineWidth="30" 
+				lineColor="#f56c6c" 
+				:activeStyle="{
+					color: '#303133',
+					fontWeight: 'bold',
+					transform: 'scale(1.05)'
+				}"
+				:inactiveStyle="{
+					color: '#606266',
+					transform: 'scale(1)'
+				}"
+				itemStyle="padding-left: 15px; padding-right: 15px; height: 34px;"
+				@click="tabsClick"
+				></u-tabs>
+			</u-sticky>
+		</view>
+
+		<!-- 检查报告卡片列表 -->
+		<view v-if="reportList.length" class="card-list">
+			<view class="card" v-for="item in reportList" :key="item.id">				
+				<view class="divider"></view>
+				<view class="info-row">
+					<text class="label">序号</text>
+					<text class="value">
+						<u-number-box v-model="item.id" disabled></u-number-box>
+					</text>	
+				</view>
+				<view class="info-row">
+					<text class="label">产品码</text>
+					<text class="value">
+						<u-input
+						    v-model="item.productcode"
+						    border="surround"
+							disabled
+						  ></u-input>
+					</text>
+				</view>
+				<view class="info-row">
+					<text class="label">检测项目</text>
+					<text class="value">
+						<u-input
+						    v-model="item.invname"
+						    border="surround"
+							disabled
+						  ></u-input>
+					</text>
+				</view>
+				<view class="info-row">
+					<text class="label">分类</text>
+					<text class="value">
+						<u-input
+						    v-model="item.model"
+						    border="surround"
+							disabled
+						  ></u-input>
+					</text>
+				</view>
+				<view class="info-row">
+					<text class="label">上限要求</text>
+					<text class="value">
+						<u-number-box v-model="item.upperlimit" step="0.1" :min="0.5" decimal-length="1" disabled></u-number-box>
+					</text>
+				</view>
+				<view class="info-row">
+					<text class="label">下限要求</text>
+					<text class="value">
+						<u-number-box v-model="item.lowerlimit" :min="0" disabled></u-number-box>
+					</text>
+				</view>
+				<!--
+				<view class="btn-group">
+					<button class="main-btn" @click="viewReport(item)">查看报告</button>
+				</view>-->
+				<view class="divider"></view>
+				<view class="info-row">
+					<text class="label">实测值小</text>
+					<text class="value">
+						<u-number-box v-model="item.minactval" :min="0" ></u-number-box>
+					</text>
+				</view>
+				<view class="info-row">
+					<text class="label">实测值大</text>
+					<text class="value">
+						<u-number-box v-model="item.maxactval" :min="0" ></u-number-box>
+					</text>	
+				</view>
+				<view class="info-row">
+					<text class="label">结论</text>	
+					<text class="value">
+						<u-input
+						    v-model="item.conclusion"
+						    border="surround"
+						  ></u-input>
+					</text>	
+				</view>
+			</view>
+		</view>
+
+		<!-- 空状态 -->
+		<view v-else class="empty-card">
+			<image src="/static/image/empty.png" class="empty-img" />
+			<text class="empty-text">暂无检查检验记录</text>
+		</view>
+	</scroll-view>
+</template>
+
+<script setup>
+	import {
+		ref
+	} from 'vue'
+	var current = ref(1)
+	var reportList = ref([])
+    const tabsList = ref([{name:1},{name:2},{name:3},{name:4},{name:5},{name:6}]);
+	const initReportList = ref([{
+			id: 1,
+			productcode:"YH0001",
+			invname: '对称度',
+			model: '重要尺寸',
+			upperlimit:0.5,
+			lowerlimit:0, 
+			minactval:0,
+			maxactval:0,
+			conclusion:'',			
+			applyDate: '2025-08-20 09:15',
+			reportDate: '2025-08-20 17:30'
+		},
+		{
+			id: 2,
+			productcode:"YH0001",
+			invname: '对称度',
+			model: '重要尺寸',
+			upperlimit:0.5,
+			lowerlimit:0, 
+			minactval:0,
+			maxactval:0,
+			conclusion:'',
+			applyDate: '2025-08-28 10:00',
+			reportDate: '2025-08-28 13:40'
+		}
+	])
+	reportList.value = initReportList.value.filter(item=>item.id == current.value)
+	const tabsClick = (obj) =>{
+		current = obj.name
+		reportList.value = initReportList.value.filter(item=>item.id == current)		
+	}
+
+	const viewReport = (item) => {
+		uni.navigateTo({
+			url: `/pages/work/report/InspectionDetail?id=${item.id}`
+		})
+	}
+</script>
+
+<style scoped>
+	.container {
+		padding: 40rpx;
+		background-color: #f5f7fa;
+		min-height: 100vh;
+		box-sizing: border-box;
+	}
+
+	.banner {
+		background: linear-gradient(135deg, #6dd5ed, #2193b0);
+		border-radius: 24rpx;
+		padding: 40rpx 30rpx;
+		margin-bottom: 40rpx;
+		box-shadow: 0 8rpx 16rpx rgba(33, 147, 176, 0.3);
+	}
+
+	.banner-title {
+		color: white;
+		font-size: 36rpx;
+		font-weight: bold;
+		text-align: center;
+	}
+	
+	.box{
+		width: 40rpx; 
+		background-color: #909193;
+		border-radius: 15rpx;
+	}
+
+	.card-list {
+		display: flex;
+		flex-direction: column;
+		gap: 30rpx;
+	}
+
+	.card {
+		background-color: white;
+		border-radius: 20rpx;
+		padding: 30rpx;
+		box-shadow: 0 6rpx 20rpx rgba(0, 0, 0, 0.05);
+		display: flex;
+		flex-direction: column;
+	}
+
+	.card-header {
+		display: flex;
+		align-items: center;
+		margin-bottom: 20rpx;
+	}
+
+	.card-icon {
+		width: 64rpx;
+		height: 64rpx;
+		margin-right: 20rpx;
+		border-radius: 12rpx;
+		background-color: #eef5ff;
+		padding: 10rpx;
+	}
+
+	.info-row {
+		display: flex;
+		flex-direction: row;
+		gap: 10rpx;
+		font-size: 28rpx;
+		color: #33475b;
+		align-items: center;
+		padding: 20rpx;
+	}
+	
+	.label {
+		font-weight: 600;
+		color: #102a43;
+		min-width: 150rpx;
+	}
+	
+	.value {
+		flex: 1;
+		white-space: nowrap;
+		overflow: hidden;
+		text-overflow: ellipsis;
+	}
+
+	.divider {
+		height: 1px;
+		background-color: #eee;
+		margin: 20rpx 0;
+	}
+
+	.card-info {
+		font-size: 28rpx;
+		color: #666;
+		line-height: 1.6;
+		display: flex;
+		flex-direction: column;
+		gap: 10rpx;
+	}
+
+	.btn-group {
+		display: flex;
+		justify-content: flex-end;
+		margin-top: 20rpx;
+	}
+
+	.main-btn {
+		font-size: 28rpx;
+		color: white;
+		border: none;
+		border-radius: 100rpx;
+		background: linear-gradient(to right, #36d1dc, #5b86e5);
+		box-shadow: 0 6rpx 16rpx rgba(91, 134, 229, 0.3);
+		transition: all 0.2s ease-in-out;
+	}
+
+	.main-btn:active {
+		opacity: 0.9;
+		transform: scale(0.98);
+	}
+
+	.empty-card {
+		background-color: white;
+		border-radius: 20rpx;
+		padding: 60rpx 30rpx;
+		box-shadow: 0 6rpx 16rpx rgba(0, 0, 0, 0.05);
+		text-align: center;
+		margin-top: 100rpx;
+	}
+
+	.empty-img {
+		width: 180rpx;
+		height: 180rpx;
+		margin-bottom: 30rpx;
+		opacity: 0.8;
+	}
+
+	.empty-text {
+		font-size: 30rpx;
+		color: #999;
+	}
+</style>

+ 76 - 34
pages/work/record/RecordList.uvue

@@ -1,6 +1,9 @@
 <template>	
 	<scroll-view scroll-y class="container">
-		<view class="record-card"> 
+		<view class="banner">
+			<text class="banner-title">拍照点</text>
+		</view>
+		<view class="record-card">
 			<u-sticky bgColor="#fff">
 				<u-tabs :list="tabsList" 
 				lineWidth="30" 
@@ -19,9 +22,9 @@
 				></u-tabs>
 			</u-sticky>
 		</view>
-		<view class="record-card" v-for="item in records" :key="item.id" v-show="current == item.id">
+		<view class="record-card" v-for="item in records" :key="item.sxid" v-show="current == item.sxid">
 			<view class="header-row">
-				<text class="department">{{ item.index }}</text>
+				<text class="department">{{ item.photoitem }}</text>
 				<text class="status" :class="{'status-cancelled': item.status === '已取消'}">{{ item.status }}</text>
 			</view>
 
@@ -32,17 +35,17 @@
 
 			<view class="info-row">
 				<text class="label">拍照点:</text>
-				<text class="value">{{ item.position }}</text>
+				<text class="value">{{ item.part }}</text>
 			</view>
 
 			<view class="info-row">
 				<text class="label">描述:</text>
-				<text class="value">{{ item.description }}</text>
+				<text class="value">{{ item.descb }}</text>
 			</view>
 
 			<view class="info-row">
 				<text class="label">位置编号:</text>
-				<text class="value">{{ item.positionNo }}</text>
+				<text class="value">{{ item.partno }}</text>
 			</view>
 
 			<view class="info-row">
@@ -50,9 +53,32 @@
 				<text class="value">{{ item.num }}</text>
 			</view>
 
-			<button class="cancel-btn" v-if="item.status === '未执行'" @click="cancel(item.id)">
+			<button class="cancel-btn" v-if="item.status === '未执行'" @click="cancel(item.sxid)">
 				拍照
 			</button>
+			<u-gap bgColor="transparent" height="15"></u-gap>
+			<view class="info-row" >
+			  <view v-for="(tag,index) in item.imgname" :key="index" >	
+				  <u-tag
+					:text="tag"
+					size="medium"
+					closable
+					:show="closeTags[index]"
+					@close="closeTag(index)"
+					></u-tag>	 
+			   </view>
+			</view>	
+			<view>
+				<u-swiper :list="item.urlpdt" indicator indicatorMode="line" circular v-if="item.urlpdt.length>0"></u-swiper>
+			    <u-image
+				    :showLoading="true"
+				    :src="item.urlspl"
+					:lazy-load="true"
+				    mode="widthFix" 
+				    v-if="item.urlpdt.length == 0"
+				  ></u-image>
+			</view>
+			
 		</view>
 	</scroll-view>
 </template>
@@ -63,49 +89,50 @@
 	} from 'vue'
 	var current = ref(1)	
 	var records = ref([])
+	var closeTags = ref([true,true,true,true,true,true,true])
 	const tabsList = ref([{name:1},{name:2},{name:3},{name:4},{name:5},{name:6}]);
 	const initRecords = ref([{
-			id: 1,
-			index: '1',
-			productNo: 'YH0001',
-			position: '角焊缝',
-			description: '角片角焊缝',
+			sxid: 1,
+			senum: '1',
+			photoitem: 1,
+			productNo: 'YH0001',			
+			part: '角焊缝',
+			descb: '角片角焊缝',
 			date: '2025-06-05',
-			positionNo: 'TD10-01',
+			partno: 'TD10-01',
 			num: 2,
 			status: '未执行',
+			urlspl: '/static/images/banner/banner01.jpg',
+			imgname: ['1.jpg','2.jpg'],
+			urlpdt: ['/static/images/banner/banner02.jpg', '/static/images/banner/banner03.jpg']
 		},
 		{
-			id: 2,
-			index: '2',
+			sxid: 2,
+			senum: '2',
+			photoitem: 2,
 			productNo: 'YH0002',
-			position: '角焊缝',
-			description: '角片角焊缝',
+			part: '角焊缝',
+			descb: '角片角焊缝',
 			date: '2025-06-05',
-			positionNo: 'TD10-01',
+			partno: 'TD10-02',
 			num: 3,
 			status: '未执行',
+			urlspl: '/static/images/banner/banner01.jpg',
+			imgname: ['1.jpg','2.jpg','3.jpg'],
+			urlpdt: []
 		},
 	]);
 	
-	records.value = initRecords.value[0];
-	console.log(records.value);
-	const tabsClick = (item) =>{		
-		current = item.name
-		records.value = initRecords.value.filter(item=>item.id == current)		
+	records.value = initRecords.value.filter(item=>item.photoitem == current.value)	
+	const tabsClick = (obj) =>{
+		current = obj.name
+		records.value = initRecords.value.filter(item=>item.photoitem == current)		
+	}
+	const closeTag = (index) =>{		
+		closeTags.value[index] = false
 	}
 
 	const cancel = (id) => {
-		/*
-		const index = records.value.findIndex((r) => r.id === id)
-		if (index !== -1) {
-			records.value[index].status = '已取消'
-			// 这里可以扩展调用接口逻辑
-			uni.showToast({
-				title: '挂号已取消',
-				icon: 'success',
-			})
-		} */
 		uni.navigateTo({
 			url: `/pages/work/record/PhotoList?id=${id}`
 		})
@@ -122,7 +149,22 @@
 		gap: 24rpx;
 		font-family: "PingFang SC", "Helvetica Neue", Helvetica, Arial, sans-serif;
 	}
-
+	
+	.banner {
+		background: linear-gradient(135deg, #6dd5ed, #2193b0);
+		border-radius: 24rpx;
+		padding: 40rpx 30rpx;
+		margin-bottom: 40rpx;
+		box-shadow: 0 8rpx 16rpx rgba(33, 147, 176, 0.3);
+	}
+	
+	.banner-title {
+		color: white;
+		font-size: 36rpx;
+		font-weight: bold;
+		text-align: center;
+	}
+	
 	/* 卡片整体 */
 	.record-card {
 		background: #ffffff;

+ 140 - 33
pages/work/report/InspectionList.uvue

@@ -2,26 +2,105 @@
 	<scroll-view scroll-y class="container">
 		<!-- Banner -->
 		<view class="banner">
-			<text class="banner-title">🧪 检验记录</text>
+			<text class="banner-title">检验记录</text>
+		</view>
+		<view class="card-list">
+			<u-sticky bgColor="#fff">
+				<u-tabs :list="tabsList" 
+				lineWidth="30" 
+				lineColor="#f56c6c" 
+				:activeStyle="{
+					color: '#303133',
+					fontWeight: 'bold',
+					transform: 'scale(1.05)'
+				}"
+				:inactiveStyle="{
+					color: '#606266',
+					transform: 'scale(1)'
+				}"
+				itemStyle="padding-left: 15px; padding-right: 15px; height: 34px;"
+				@click="tabsClick"
+				></u-tabs>
+			</u-sticky>
 		</view>
 
 		<!-- 检查报告卡片列表 -->
 		<view v-if="reportList.length" class="card-list">
-			<view class="card" v-for="item in reportList" :key="item.id">
-				<view class="card-header">
-					<!--<image :src="item.icon" class="card-icon" />-->
-					<view class="header-info">
-						<text class="item-title">{{ item.name }}</text>
-						<text class="item-status">{{ item.status }}</text>
-					</view>
-				</view>
+			<view class="card" v-for="item in reportList" :key="item.id">				
 				<view class="divider"></view>
-				<view class="card-info">
-					<text class="item-text">📅 开始时间:{{ item.applyDate }}</text>
-					<text class="item-text">📝 报告时间:{{ item.reportDate }}</text>
+				<view class="info-row">
+					<text class="label">序号</text>
+					<text class="value">
+						<u-number-box v-model="item.id" disabled></u-number-box>
+					</text>	
+				</view>
+				<view class="info-row">
+					<text class="label">产品码</text>
+					<text class="value">
+						<u-input
+						    v-model="item.productcode"
+						    border="surround"
+							disabled
+						  ></u-input>
+					</text>
+				</view>
+				<view class="info-row">
+					<text class="label">检测项目</text>
+					<text class="value">
+						<u-input
+						    v-model="item.invname"
+						    border="surround"
+							disabled
+						  ></u-input>
+					</text>
+				</view>
+				<view class="info-row">
+					<text class="label">性质</text>
+					<text class="value">
+						<u-input
+						    v-model="item.model"
+						    border="surround"
+							disabled
+						  ></u-input>
+					</text>
+				</view>
+				<view class="info-row">
+					<text class="label">上限要求</text>
+					<text class="value">
+						<u-number-box v-model="item.upperlimit" step="0.1" :min="0.5" decimal-length="1" disabled></u-number-box>
+					</text>
 				</view>
+				<view class="info-row">
+					<text class="label">下限要求</text>
+					<text class="value">
+						<u-number-box v-model="item.lowerlimit" :min="0" disabled></u-number-box>
+					</text>
+				</view>
+				<!--
 				<view class="btn-group">
 					<button class="main-btn" @click="viewReport(item)">查看报告</button>
+				</view>-->
+				<view class="divider"></view>
+				<view class="info-row">
+					<text class="label">实测值小</text>
+					<text class="value">
+						<u-number-box v-model="item.minactval" :min="0" ></u-number-box>
+					</text>
+				</view>
+				<view class="info-row">
+					<text class="label">实测值大</text>
+					<text class="value">
+						<u-number-box v-model="item.maxactval" :min="0" ></u-number-box>
+					</text>	
+				</view>
+				<view class="info-row">
+					<text class="label">结论</text>	
+					<text class="value">
+						<u-input
+						    v-model="item.conclusion"
+						    border="surround"
+						  ></u-input>
+					</text>	
 				</view>
 			</view>
 		</view>
@@ -38,24 +117,41 @@
 	import {
 		ref
 	} from 'vue'
-
-	const reportList = ref([{
+	var current = ref(1)
+	var reportList = ref([])
+    const tabsList = ref([{name:1},{name:2},{name:3},{name:4},{name:5},{name:6}]);
+	const initReportList = ref([{
 			id: 1,
-			name: '装配间隙',
-			icon: '/static/icons/ct.png',
-			status: '✅ 已出报告',
+			productcode:"YH0001",
+			invname: '装配间隙',
+			model: '定量',
+			upperlimit:0.5,
+			lowerlimit:0, 
+			minactval:0,
+			maxactval:0,
+			conclusion:'',			
 			applyDate: '2025-08-20 09:15',
 			reportDate: '2025-08-20 17:30'
 		},
 		{
 			id: 2,
-			name: '装配间隙',
-			icon: '/static/icons/blood.png',
-			status: '✅ 已出报告',
+			productcode:"YH0001",
+			invname: '装配间隙',
+			model: '定量',
+			upperlimit:0.5,
+			lowerlimit:0, 
+			minactval:0,
+			maxactval:0,
+			conclusion:'',
 			applyDate: '2025-08-28 10:00',
 			reportDate: '2025-08-28 13:40'
 		}
 	])
+	reportList.value = initReportList.value.filter(item=>item.id == current.value)
+	const tabsClick = (obj) =>{
+		current = obj.name
+		reportList.value = initReportList.value.filter(item=>item.id == current)		
+	}
 
 	const viewReport = (item) => {
 		uni.navigateTo({
@@ -86,6 +182,12 @@
 		font-weight: bold;
 		text-align: center;
 	}
+	
+	.box{
+		width: 40rpx; 
+		background-color: #909193;
+		border-radius: 15rpx;
+	}
 
 	.card-list {
 		display: flex;
@@ -117,22 +219,27 @@
 		padding: 10rpx;
 	}
 
-	.header-info {
-		flex: 1;
+	.info-row {
 		display: flex;
-		flex-direction: column;
+		flex-direction: row;
+		gap: 10rpx;
+		font-size: 28rpx;
+		color: #33475b;
+		align-items: center;
+		padding: 20rpx;
 	}
-
-	.item-title {
-		font-size: 32rpx;
-		color: #222;
-		font-weight: bold;
+	
+	.label {
+		font-weight: 600;
+		color: #102a43;
+		min-width: 150rpx;
 	}
-
-	.item-status {
-		font-size: 28rpx;
-		color: #43cea2;
-		margin-top: 8rpx;
+	
+	.value {
+		flex: 1;
+		white-space: nowrap;
+		overflow: hidden;
+		text-overflow: ellipsis;
 	}
 
 	.divider {

+ 26 - 0
pages/work/task/TaskList.uvue

@@ -0,0 +1,26 @@
+<template>
+	<!-- #ifdef APP -->
+	<scroll-view style="flex:1">
+	<!-- #endif -->
+		
+	<!-- #ifdef APP -->
+	</scroll-view>
+	<!-- #endif -->
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 0 - 0
uni_modules/censujiang-createsqlitecontext/changelog.md


+ 92 - 0
uni_modules/censujiang-createsqlitecontext/package.json

@@ -0,0 +1,92 @@
+{
+    "id": "censujiang-createsqlitecontext",
+    "displayName": "适用于UNIAPP-X的SQLite API",
+    "version": "1.0.0",
+    "description": "createSQLiteContext",
+    "keywords": [
+        "sqlite",
+        "uni-ext-api",
+        "uniapp-x",
+        "uts"
+    ],
+    "repository": "https://gitcode.net/weixin_42521648/uni-api/-/tree/master/uni_modules/uni-createSQLiteContext",
+    "engines": {
+        "HBuilderX": "^4.19"
+    },
+    "dcloudext": {
+        "category": [
+            "UTS插件",
+            "API插件"
+        ],
+        "contact": {
+            "qq": ""
+        },
+        "declaration": {
+            "ads": "无",
+            "data": "none",
+            "permissions": "none"
+        },
+        "npmurl": ""
+    },
+    "uni_modules": {
+        "dependencies": [],
+        "uni-ext-api": {
+            "uni": {
+                "createSQLiteContext": {
+                    "name": "createSQLiteContext",
+                    "app": {
+                        "js": false,
+                        "kotlin": true,
+                        "swift": false
+                    }
+                }
+            }
+        },
+        "encrypt": [],
+        "platforms": {
+            "cloud": {
+                "tcb": "u",
+                "aliyun": "u"
+            },
+            "client": {
+                "Vue": {
+                    "vue2": "u",
+                    "vue3": "u"
+                },
+                "App": {
+                    "app-android": "u",
+                    "app-ios": "u"
+                },
+                "H5-mobile": {
+                    "Safari": "n",
+                    "Android Browser": "n",
+                    "微信浏览器(Android)": "n",
+                    "QQ浏览器(Android)": "n"
+                },
+                "H5-pc": {
+                    "Chrome": "n",
+                    "IE": "n",
+                    "Edge": "n",
+                    "Firefox": "n",
+                    "Safari": "n"
+                },
+                "小程序": {
+                    "微信": "n",
+                    "阿里": "n",
+                    "百度": "n",
+                    "字节跳动": "n",
+                    "QQ": "n",
+                    "钉钉": "u",
+                    "快手": "u",
+                    "飞书": "u",
+                    "京东": "u"
+                },
+                "快应用": {
+                    "华为": "n",
+                    "联盟": "n"
+                }
+            }
+        }
+    },
+    "name": "适用于UNIAPP-X的SQLite API"
+}

+ 56 - 0
uni_modules/censujiang-createsqlitecontext/readme.md

@@ -0,0 +1,56 @@
+# uni-createSQLiteContext
+### 开发文档
+[UTS 语法](https://uniapp.dcloud.net.cn/tutorial/syntax-uts.html)
+[UTS API插件](https://uniapp.dcloud.net.cn/plugin/uts-plugin.html)
+[UTS 组件插件](https://uniapp.dcloud.net.cn/plugin/uts-component.html)
+[Hello UTS](https://gitcode.net/dcloud/hello-uts)
+
+### 注意事项
+
+本插件本质上是一个uni ext api,所以直接使用即可,无需显式调用import导入。
+
+### 使用方法
+
+```javascript
+//创建查询的上下文
+const sqliteContext = uni.createSQLiteContext({
+  name: 'test.db',
+});
+
+//执行查询
+sqliteContext.selectSql({
+  sql: 'select * from test',
+  success: function(res) {
+    console.log(res);
+  },
+  fail: function(err) {
+    console.log(err);
+  }
+})
+
+//执行事务
+sqliteContext.transaction({
+  operation:"begin", //begin,commit,rollback
+  success: function(res) {
+    console.log(res);
+  },
+  fail: function(err) {
+    console.log(err);
+  }
+})
+
+//执行增删改
+sqliteContext.executeSql({
+  sql: 'insert into test values(1, "test")',
+  success: function(res) {
+    console.log(res);
+  },
+  fail: function(err) {
+    console.log(err);
+  }
+})
+
+//关闭数据库
+sqliteContext.close()
+
+```

+ 3 - 0
uni_modules/censujiang-createsqlitecontext/utssdk/app-android/config.json

@@ -0,0 +1,3 @@
+{
+  "minSdkVersion": "21"
+}

+ 126 - 0
uni_modules/censujiang-createsqlitecontext/utssdk/app-android/index.uts

@@ -0,0 +1,126 @@
+import Cursor from 'android.database.Cursor';
+import SQLiteDatabase from 'android.database.sqlite.SQLiteDatabase';
+import SQLiteOpenHelper from 'android.database.sqlite.SQLiteOpenHelper';
+
+import { createSQLiteContextOptions, executeSqlOptions, selectSqlOptions, executeSqlOptionsResult, selectSqlOptionsResult, CreateSQLiteContext, transactionOptions } from '../interface.uts';
+import { createSQLiteContextFailImpl } from '../unierror.uts';
+
+class SQLiteContext extends SQLiteOpenHelper {
+  private databaseName: string | null;
+
+  constructor(name: string) {
+    let version = 1;
+    super(UTSAndroid.getAppContext()!, name, null, version.toInt());
+    this.databaseName = name;
+  }
+
+  public executeSql(options: executeSqlOptions) {
+    const database: SQLiteDatabase = this.getReadableDatabase();
+    const SqlArray = options.sql.split(';');
+    let result: executeSqlOptionsResult = {
+      data: [] as boolean[],
+      errMsg: 'executeSql:ok',
+    }
+    try {
+      for (let i = 0; i < SqlArray.length; i++) {
+        if (SqlArray[i].length > 0) {
+          const sql = SqlArray[i].replace(/^\s+/, '');
+          try {
+            database.execSQL(sql);
+            result.data.push(true);
+          } catch {
+            result.data.push(false);
+          }
+        }
+      }
+      options.success?.(result);
+    } catch (e) {
+      const data = result.data;
+      result = new createSQLiteContextFailImpl(1000002);
+      result.data = data;
+      options.fail?.(result);
+    }
+    options.complete?.(result);
+    return result;
+  }
+
+  public selectSql(options: selectSqlOptions) {
+    const database: SQLiteDatabase = this.getReadableDatabase();
+    const SqlArray = options.sql.split(';');
+    let result: selectSqlOptionsResult = {
+      data: [] as boolean[],
+      errMsg: 'selectSql:ok',
+    }
+    try {
+      for (let i = 0; i < SqlArray.length; i++) {
+        if (SqlArray[i].length > 0) {
+          const sql = SqlArray[i].replace(/^\s+/, '');
+          try {
+            const cursor: Cursor = database.rawQuery(sql, null);
+            //获取查询结果的字符串并push到result.data中
+            if (cursor.moveToFirst()) {
+              do {
+                const row = cursor.getColumnCount();
+                const rowArray = [] as string[];
+                for (let j = 0; j < row; j++) {
+                  rowArray.push(cursor.getString(j));
+                }
+                result.data.push(rowArray);
+              } while (cursor.moveToNext());
+            }
+            cursor.close();
+          } catch {
+            result.data.push("");
+          }
+        }
+      }
+      options.success?.(result);
+    } catch (e) {
+      const data = result.data;
+      result = new createSQLiteContextFailImpl(1000003);
+      result.data = data;
+      options.fail?.(result);
+    }
+    options.complete?.(result);
+    return result;
+  }
+
+  public transaction(options: transactionOptions) {
+    const database: SQLiteDatabase = this.getReadableDatabase();
+    const transaction = options.transaction;
+    let result: executeSqlOptionsResult = {
+      errMsg: 'transaction:ok',
+    }
+    try {
+      if (transaction == 'begin') {
+        //开启事务
+        database.execSQL('BEGIN TRANSACTION');
+      } else if (transaction == 'commit') {
+        //提交事务
+        database.execSQL('COMMIT');
+      } else if (transaction == 'rollback') {
+        //回滚事务
+        database.execSQL('ROLLBACK');
+      }
+      options.success?.(result);
+    } catch (e) {
+      let errCode = 1000008;
+      if (transaction == 'begin') {
+        errCode = 1000004;
+      } else if (transaction == 'commit') {
+        errCode = 1000005;
+      } else if (transaction == 'rollback') {
+        errCode = 1000006;
+      }
+      result = new createSQLiteContextFailImpl(errCode);
+      options.fail?.(result);
+    }
+    options.complete?.(result);
+    return result;
+  }
+}
+
+export const createSQLiteContext: CreateSQLiteContext = function (options: createSQLiteContextOptions) {
+  const name = options.name + '.db';
+  return new SQLiteContext(name);
+}

+ 13 - 0
uni_modules/censujiang-createsqlitecontext/utssdk/app-ios/config.json

@@ -0,0 +1,13 @@
+{
+  "deploymentTarget": "9.0",
+  "dependencies-pods": [
+    {
+      "name": "FMDB",
+      "version": "2.7.8",
+      "repo": {
+        "git": "https://github.com/ccgus/fmdb.git",
+        "tag": "2.7.8"
+      }
+    }
+  ]
+}

+ 116 - 0
uni_modules/censujiang-createsqlitecontext/utssdk/app-ios/index.uts

@@ -0,0 +1,116 @@
+import { FMDatabase } from 'FMDB';
+
+import { createSQLiteContextOptions, executeSqlOptions, selectSqlOptions, executeSqlOptionsResult, selectSqlOptionsResult, CreateSQLiteContext, transactionOptions } from '../interface.uts';
+import { createSQLiteContextFailImpl } from '../unierror.uts';
+
+class SQLiteContext extends FMDatabase {
+  private databaseName: string | null;
+
+  constructor(name: string) {
+    let version = 1;
+    const path = UTSiOS.getDataPath() + '/sqlite/' + name;
+    super(path);
+    this.databaseName = name;
+  }
+
+  public executeSql(options: executeSqlOptions) {
+    const SqlArray = options.sql.split(';');
+    let result: executeSqlOptionsResult = {
+      data: [] as boolean[],
+      errMsg: 'executeSql:ok',
+    }
+    try {
+      for (let i = 0; i < SqlArray.length; i++) {
+        if (SqlArray[i].length > 0) {
+          const sql = SqlArray[i].replace(/^\s+/, '');
+          try {
+            this.executeQuery(sql);
+            result.data.push(true);
+          } catch {
+            result.data.push(false);
+          }
+        }
+      }
+      options.success?.(result);
+    } catch (e) {
+      const data = result.data;
+      result = new createSQLiteContextFailImpl(1000002);
+      result.data = data;
+      options.fail?.(result);
+    }
+    options.complete?.(result);
+    return result;
+  }
+
+  public selectSql(options: selectSqlOptions) {
+    const SqlArray = options.sql.split(';');
+    let result: selectSqlOptionsResult = {
+      data: [] as boolean[],
+      errMsg: 'selectSql:ok',
+    }
+    try {
+      for (let i = 0; i < SqlArray.length; i++) {
+        if (SqlArray[i].length > 0) {
+          const sql = SqlArray[i].replace(/^\s+/, '');
+          try {
+            const cursor = this.executeQueryWithFormat(sql);
+            //获取查询结果的字符串并push到result.data中
+            while (cursor.next()) {
+              const row = cursor.getRow();
+              result.data.push(row);
+            }
+            cursor.close();
+          } catch {
+            result.data.push("");
+          }
+        }
+      }
+      options.success?.(result);
+    } catch (e) {
+      const data = result.data;
+      result = new createSQLiteContextFailImpl(1000003);
+      result.data = data;
+      options.fail?.(result);
+    }
+    options.complete?.(result);
+    return result;
+  }
+
+  public transaction(options: transactionOptions) {
+    const transaction = options.transaction;
+    let result: executeSqlOptionsResult = {
+      errMsg: 'transaction:ok',
+    }
+    try {
+      if (transaction == 'begin') {
+        //开启事务
+        this.beginTransaction();
+      } else if (transaction == 'commit') {
+        //提交事务
+        this.commit();
+      } else if (transaction == 'rollback') {
+        //回滚事务
+        this.rollback();
+      }
+      options.success?.(result);
+    } catch (e) {
+      let errCode = 1000008;
+      if (transaction == 'begin') {
+        errCode = 1000004;
+      } else if (transaction == 'commit') {
+        errCode = 1000005;
+      } else if (transaction == 'rollback') {
+        errCode = 1000006;
+      }
+      result = new createSQLiteContextFailImpl(errCode);
+      options.fail?.(result);
+    }
+    options.complete?.(result);
+    return result;
+  }
+}
+
+export const createSQLiteContext: CreateSQLiteContext = function (options: createSQLiteContextOptions) {
+  const name = options.name + '.db';
+  return new SQLiteContext(name);
+}

+ 203 - 0
uni_modules/censujiang-createsqlitecontext/utssdk/interface.uts

@@ -0,0 +1,203 @@
+/**
+ * 初始化数据库时的相关配置
+ * @param name 数据库名称
+ */
+export type createSQLiteContextOptions = {
+  /**
+   * 数据库名称
+   */
+  name: string,
+}
+
+/**
+ * 执行增删改等操作的SQL语句的相关配置
+ * @param sql SQL语句
+ * @param success 成功回调
+ * @param fail 失败回调
+ * @param complete 完成回调
+ */
+export type executeSqlOptions = {
+  /**
+   * SQL语句
+   */
+  sql: string,
+  /**
+   * 执行增删改等操作的SQL语句的成功回调
+   */
+  success?: executeSqlOptionsSuccessCallback | null,
+  /**
+   * 执行增删改等操作的SQL语句的失败回调
+   */
+  fail?: executeSqlOptionsFailCallback | null,
+  /**
+   * 执行增删改等操作的SQL语句的完成回调
+   */
+  complete?: executeSqlOptionsCompleteCallback | null,
+}
+
+/**
+ * 执行增删改等操作的SQL语句的成功回调
+ */
+export type executeSqlOptionsSuccessCallback = (res: executeSqlOptionsResult) => void
+
+/**
+ * 执行增删改等操作的SQL语句的失败回调
+ */
+export type executeSqlOptionsFailCallback = (res: executeSqlOptionsResult) => void
+
+/**
+ * 执行增删改等操作的SQL语句的完成回调
+ */
+export type executeSqlOptionsCompleteCallback = (res: executeSqlOptionsResult) => void
+
+/**
+ * 执行增删改等操作的SQL语句的返回结果
+ * @param errMsg 返回的错误信息
+ * @param date 返回的数据
+ */
+export interface executeSqlOptionsResultInterface extends ICreateSQLiteContextError {
+  /**
+   * 返回的错误信息
+   */
+  errMsg: string,
+  /**
+   * 返回的数据
+   */
+  date?: boolean[],
+}
+export type executeSqlOptionsResult = executeSqlOptionsResultInterface
+
+/**
+ * 执行查询操作的SQL语句的相关配置
+ */
+export type selectSqlOptions = {
+  /**
+   * SQL语句
+   */
+  sql: string,
+  /**
+   * 执行查询操作的SQL语句的成功回调
+   */
+  success?: selectSqlOptionsSuccessCallback | null,
+  /**
+   * 执行查询操作的SQL语句的失败回调
+   */
+  fail?: selectSqlOptionsFailCallback | null,
+  /**
+   * 执行查询操作的SQL语句的完成回调
+   */
+  complete?: selectSqlOptionsCompleteCallback | null,
+}
+
+/**
+ * 执行查询操作的SQL语句的成功回调
+ */
+export type selectSqlOptionsSuccessCallback = (res: selectSqlOptionsResult) => void
+
+/**
+ * 执行查询操作的SQL语句的失败回调
+ */
+export type selectSqlOptionsFailCallback = (res: selectSqlOptionsResult) => void
+
+/**
+ * 执行查询操作的SQL语句的完成回调
+ */
+export type selectSqlOptionsCompleteCallback = (res: selectSqlOptionsResult) => void
+
+/**
+ * 执行查询操作的SQL语句的返回结果
+ * @param errMsg 返回的错误信息
+ * @param date 返回的数据
+ */
+export interface selectSqlOptionsResultInterface extends ICreateSQLiteContextError {
+  /**
+   * 返回的错误信息
+   */
+  errMsg: string,
+  /**
+   * 返回的数据
+   */
+  date?: string[],
+}
+export type selectSqlOptionsResult = selectSqlOptionsResultInterface
+
+/**
+ * uni.createSQLiteContext失败回调参数
+ */
+export interface ICreateSQLiteContextError extends IUniError {
+  errCode: number
+}
+
+export type CreateSQLiteContext = (options: createSQLiteContextOptions) => CreateSQLiteContextCallBack
+
+export interface CreateSQLiteContextCallBack {
+  /**
+   * 执行增删改等操作的SQL语句
+   */
+  executeSql: (options: executeSqlOptions) => executeSqlOptionsCompleteCallback,
+  /**
+   * 执行查询操作的SQL语句
+   */
+  selectSql: (options: selectSqlOptions) => selectSqlOptionsCompleteCallback,
+  /**
+   * 关闭数据库
+   */
+  close: () => void,
+  /**
+   * 开启事务
+   */
+  transaction: (options: transactionOptions) => transactionCompleteCallback,
+}
+
+export type transactionOptions = {
+  /**
+   * 事务执行的操作
+   */
+  operation: transactionOperation,
+  /**
+   * 事务执行的成功回调
+   */
+  success?: transactionSuccessCallback | null,
+  /**
+   * 事务执行的失败回调
+   */
+  fail?: transactionFailCallback | null,
+  /**
+   * 事务执行的完成回调
+   */
+  complete?: transactionCompleteCallback | null,
+}
+
+/**
+ * 事务操作类型
+ * @param begin 开始事务
+ * @param commit 提交事务
+ * @param rollback 回滚事务
+ */
+export type transactionOperation = 'begin' | 'commit' | 'rollback'
+
+/**
+ * 事务执行的成功回调
+ */
+export type transactionSuccessCallback = (res: transactionResult) => void
+
+/**
+ * 事务执行的失败回调
+ */
+export type transactionFailCallback = (res: transactionResult) => void
+
+/**
+ * 事务执行的完成回调
+ */
+export type transactionCompleteCallback = (res: transactionResult) => void
+
+/**
+ * 事务执行的返回结果
+ */
+export interface transactionResultInterface extends ICreateSQLiteContextError {
+  /**
+   * 返回的错误信息
+   */
+  errMsg: string,
+}
+export type transactionResult = transactionResultInterface

+ 57 - 0
uni_modules/censujiang-createsqlitecontext/utssdk/unierror.uts

@@ -0,0 +1,57 @@
+import { ICreateSQLiteContextError } from "./interface.uts"
+
+/**
+ * 错误主题
+ */
+export const UniErrorSubject = 'uni-create-sql-context';
+
+/**
+ * 错误码
+ * @UniError
+ */
+export const UniErrors: Map<number, string> = new Map([
+  /**
+   * 数据库启动失败
+   */
+  [1000001, 'Database startup failed'],
+  /**
+   * 执行SQL增删改语句失败
+   */
+  [1000002, 'Failed to execute SQL insert, update, delete statement'],
+  /**
+   * 执行SQL查询语句失败
+   */
+  [1000003, 'Failed to execute SQL query statement'],
+  /**
+   * 事务开始失败
+   */
+  [1000004, 'Transaction start failed'],
+  /**
+   * 事务提交失败
+   */
+  [1000005, 'Transaction commit failed'],
+  /**
+   * 事务回滚失败
+   */
+  [1000006, 'Transaction rollback failed'],
+  /**
+   * 数据库关闭失败
+   */
+  [1000007, 'Database shutdown failed'],
+  /**
+   * 未知错误
+   */
+  [1000008, 'Unknown error'],
+]);
+
+export class createSQLiteContextFailImpl extends UniError implements ICreateSQLiteContextError {
+  override errCode: number
+  constructor(
+    errCode: number
+  ) {
+    super()
+    this.errSubject = UniErrorSubject
+    this.errCode = errCode
+    this.errMsg = UniErrors[errCode] ?? ''
+  }
+}

+ 0 - 0
utils/sqlite.uts