Explorar el Código

关键工序记录逻辑补充完整

zhangxike hace 1 semana
padre
commit
0f67d726d3

+ 18 - 2
api/work.uts

@@ -186,6 +186,22 @@ export type QcRecord = {
 	measuredvaluemax: string
 }
 
+export type TaskKeyProcess = {
+	sxid: number,
+	pdid: number,
+	senum : number,
+	parameterorder: number,
+	parametername: string,
+	prodno: string,
+	testapparatus?: string,
+	testrequirelower?: string,
+	testrequireupper?: string,
+	memo?: string,
+	measuredvaluemin?: string,
+	measuredvaluemax?: string,
+	result?: string,
+}
+
 export function offlineData(data : UTSJSONObject) : Promise<UTSJSONObject> {
 	return new Promise((resolve, reject) => {
 		let result = JSON.parseObject(JSON.stringify(data)) as UTSJSONObject
@@ -490,10 +506,10 @@ export async function saveTaskKeyProcess(data ?: UTSJSONObject | null) : Promise
 	const tableName = 'app_task_keyprocess';
 
 	// 构造插入的数据字符串,注意数据库字段名和类型
-	const values = `'${data?.getNumber('pdid') ?? 0}','${data?.getString('pk') ?? ''}','${data?.getString('testapparatus') ?? ''}','${data?.getString('tableid') ?? ''}','${data?.getString('testrequirelower') ?? ''}','${data?.getString('testrequireupper') ?? ''}','${data?.getString('parametername') ?? ''}','${data?.getString('parameterorder') ?? ''}','${data?.getString('measureunit') ?? ''}','${data?.getString('parameterinstruction') ?? ''}', '${data?.getString('parameterid') ?? ''}','${data?.getString('fk_creator') ?? ''}','${data?.getString('fk_prodcode') ?? ''}','${data?.getString('prodno') ?? ''}','${data?.getString('processstep') ?? ''}','${data?.getString('fk_processtask') ?? ''}','${data?.getString('measuredvaluemin') ?? ''}','${data?.getString('measuredvaluemax') ?? ''}','${data?.getString('fks_operator') ?? ''}','${data?.getString('cs') ?? ''}','${data?.getString('ts') ?? ''}'`;
+	const values = `'${data?.getNumber('pdid') ?? 0}','${data?.getString('pk') ?? ''}','${data?.getString('testapparatus') ?? ''}','${data?.getString('tableid') ?? ''}','${data?.getString('testrequirelower') ?? ''}','${data?.getString('testrequireupper') ?? ''}','${data?.getString('parametername') ?? ''}','${data?.getString('parameterorder') ?? ''}','${data?.getString('measureunit') ?? ''}','${data?.getString('parameterinstruction') ?? ''}', '${data?.getString('parameterid') ?? ''}','${data?.getString('fk_creator') ?? ''}','${data?.getString('fk_prodcode') ?? ''}','${data?.getString('prodno') ?? ''}','${data?.getString('processstep') ?? ''}','${data?.getString('fk_processtask') ?? ''}','${data?.getString('measuredvaluemin') ?? ''}','${data?.getString('measuredvaluemax') ?? ''}','${data?.getString('result') ?? ''}','${data?.getString('memo') ?? ''}','${data?.getString('fks_operator') ?? ''}','${data?.getString('cs') ?? ''}','${data?.getString('ts') ?? ''}'`;
 
 	// 构造字段名字符串
-	const fields = 'pdid,pk,testapparatus,tableid,testrequirelower,testrequireupper,parametername,parameterorder,measureunit,parameterinstruction,parameterid,fk_creator,fk_prodcode,prodno,processstep,fk_processtask,measuredvaluemin,measuredvaluemax,fks_operator,cs,ts';
+	const fields = 'pdid,pk,testapparatus,tableid,testrequirelower,testrequireupper,parametername,parameterorder,measureunit,parameterinstruction,parameterid,fk_creator,fk_prodcode,prodno,processstep,fk_processtask,measuredvaluemin,measuredvaluemax,result,memo,fks_operator,cs,ts';
 
 	try {
 		// 调用sqlite的插入方法

+ 5 - 3
pages/work/download/DownloadDetail.uvue

@@ -51,14 +51,16 @@
 					<uni-td class="grid-text">关键工序记录</uni-td>
 					<uni-td class="grid-text">
 						<text :class="{
-							'bg-green bg-text': item.keyStatus == '已完成',
+							'bg-green bg-text': item.keyCount == item.keyTotal,
 							'bg-yellow bg-text': item.keyCount > 0 && item.keyCount < item.keyTotal,
 							'bg-black bg-text': item.keyCount == 0,
 						  }">
 							{{item.keyCount}} / {{item.keyTotal}}
 						</text>
 					</uni-td>
-					<uni-td class="grid-text">{{item.keyStatus}}</uni-td>
+					<uni-td class="grid-text"><text :class="{
+						'ft-red':item.keyStatus == '不合格'
+					}">{{item.keyStatus}}</text></uni-td>
 				</uni-tr>
 			</uni-table>
 		</view>
@@ -167,7 +169,7 @@
 		} else if (type == 1) {
 			url = `/pages/work/report/InspectionList?pdid=${id}`
 		} else if (type == 2) {
-			url = `/pages/work/process/ProcessList`
+			url = `/pages/work/process/ProcessList?pdid=${id}`
 		}
 		uni.navigateTo({
 			url

+ 1 - 1
pages/work/download/DownloadList.uvue

@@ -3,7 +3,7 @@
     <!-- 搜索栏 -->
     <view class="info-row btn-panel search-bar">
       <view class="search-input">
-		  <input type="text" v-model="productNo" placeholder="请输入产品号"/>
+		  <input type="text" v-model="productNo" placeholder="请输入工序编号"/>
 	  </view>
       <view class="scan-btn" @click="scanQRCode">
         <uni-icons type="scan" size="32" color="#00aaff"></uni-icons>

+ 0 - 2
pages/work/download/PhotoRecord.uvue

@@ -135,12 +135,10 @@
 		// 清空现有数据
 		initRecords = [];
 		closeTags.value = [];
-		console.log(pid)
 		// #ifdef APP-ANDROID
 		getListByOrder('app_task_photo', 'pdid', pid, ' order by sxid desc', null).then((res : UTSJSONObject) => {
 			let dataList = res?.['data'] as UTSJSONObject[] ?? Array<UTSJSONObject>()
 			if (dataList != null && dataList.length > 0) {
-				console.log(dataList);
 				let index = 1
 				dataList.forEach(item => {
 					if (item != null) {

+ 293 - 134
pages/work/process/ProcessList.uvue

@@ -1,90 +1,88 @@
 <template>
 	<view class="record-card flex-row">
-		<!-- <uni-tag class="tag-circle" v-for="(tag,index) in 6" :key="index" :text="tag+''" size="medium" type="primary" circle
-			@click="tabsClick(tag)"></uni-tag> -->
-		<view class="tag-circle" v-for="(tag,index) in maxcount" :key="index" @click="tabsClick(tag)"
-		:class="{'checked-tag' : tag === current}">
+		<view class="tag-circle" v-for="(item, index) in initRecords" :key="index" @click="tabsClick(item.senum)"
+			:class="{'checked-tag' : item.senum == current}">
 			<text class="circle" :class="{
-							'bg-green': tag<=2,
-							'bg-yellow': tag%3 === 0,
-							'bg-red': tag%2 === 0,
-							'bg-black': tag>=4
-						  }">{{tag}}</text>
+							'bg-green': item.result == '合格',
+							'bg-red': item.result == '不合格',
+							'bg-black': item.result != '不合格' && item.result != '合格'
+						  }">{{item.senum}}</text>
 		</view>
 	</view>
 	<!-- #ifdef APP -->
 	<scroll-view style="flex:1">
 	<!-- #endif -->
 
-		<!-- 		<view class="card-list" style="flex-direction: row;">
-				  <uni-tag
-				        v-for="(tag,index) in 6" :key="index"
-						:text="tag +''"					
-						 size="medium"
-						 type="primary"
-						circle								
-						@click="tabsClick(tag)"
-						style="width:40rpx;margin: 0 10rpx;"	  
-					></uni-tag>
-		</view> -->
-
-		<!-- 检查报告卡片列表 -->
-		<view v-if="processList.length" class="card-list">
-			<view class="card card-view" v-for="item in processList" :key="item.id" v-show="current == item.id">
+		<view v-if="initRecords.length" class="card-list">
+			<!-- 注意:v-for 遍历 initRecords 时,item 是响应式的,但内部字段需通过计算属性转换 -->
+			<view class="card" v-for="item in initRecords" :key="item.senum" v-show="current == item.senum">
+				<!-- 序号:绑定计算属性 parsedMinNum(对应 item.minNum) -->
 				<view class="info-row">
-					<text class="label info-text">序号</text>
-					<view class="value info-text">
-						<uni-number-box v-model="item.id" disabled></uni-number-box>
+					<text class="label">序号</text>
+					<view class="value">
+						{{item.senum}}
 					</view>
 				</view>
 				<view class="info-row">
-					<text class="label info-text">产品码</text>
-					<view class="value info-text">
-						<input v-model="item.productcode" class="surround" disabled></input>
+					<text class="label">产品码</text>
+					<view class="value">
+						{{item.prodno}}
 					</view>
 				</view>
 				<view class="info-row">
-					<text class="label info-text">检测项目</text>
-					<view class="value info-text">
-						<input v-model="item.invname" class="surround" disabled></input>
+					<text class="label">检测项目</text>
+					<view class="value">
+						{{item.parametername}}
 					</view>
 				</view>
 				<view class="info-row">
-					<text class="label info-text">分类</text>
-					<view class="value info-text">
-						<input v-model="item.model" class="surround" disabled></input>
+					<text class="label">分类</text>
+					<view class="value">
+						{{item.testapparatus}}
 					</view>
 				</view>
+				<!-- 上限要求:绑定计算属性 parsedMinNum -->
 				<view class="info-row">
-					<text class="label info-text">上限要求</text>
-					<view class="value info-text">
-						<uni-number-box v-model="item.upperlimit" :step="0.1" :min="0.5" disabled></uni-number-box>
+					<text class="label">上限要求</text>
+					<view class="value">
+						{{item.testrequireupper}}
 					</view>
 				</view>
+				<!-- 下限要求:绑定计算属性 parsedMaxNum(对应 item.maxNum) -->
 				<view class="info-row">
-					<text class="label info-text">下限要求</text>
-					<view class="value info-text">
-						<uni-number-box v-model="item.lowerlimit" :min="0" disabled></uni-number-box>
+					<text class="label">下限要求</text>
+					<view class="value">
+						{{item.testrequirelower}}
 					</view>
 				</view>
-
 				<view class="divider"></view>
+				<!-- 实测值小:绑定计算属性 parsedMeasuredValue(对应 item.measuredvalue) -->
+				<view class="info-row">
+					<text class="label">实测值小</text>
+					<view class="value">
+						<input class="surround uni-input number-input" v-model="item.measuredvaluemin" @confirm="minNumberChange"></input>
+					</view>
+				</view>
+				<!-- 实测值大:绑定计算属性 parsedMeasuredMaxValue(对应 item.measuredvaluemax) -->
 				<view class="info-row">
-					<text class="label info-text">实测值小</text>
-					<view class="value info-text">
-						<uni-number-box v-model="item.minactval" :min="0"></uni-number-box>
+					<text class="label">实测值大</text>
+					<view class="value">
+						<input class="surround uni-input number-input" v-model="item.measuredvaluemax" @confirm="maxNumberChange"></input>
 					</view>
 				</view>
 				<view class="info-row">
-					<text class="label info-text">实测值大</text>
-					<view class="value info-text">
-						<uni-number-box v-model="item.maxactval" :min="0"></uni-number-box>
+					<text class="label">结论</text>
+					<view class="value">
+						<radio-group class="radio-group-horizontal" @change="resultChange">
+							<radio class="radio-group-horizontal-rg" value="合格" :checked="item.result == '合格'" >合格</radio>
+							<radio class="radio-group-horizontal-rg" value="不合格" :checked="item.result == '不合格'" >不合格</radio>
+						</radio-group>	
 					</view>
 				</view>
 				<view class="info-row">
-					<text class="label info-text">结论</text>
-					<view class="value info-text">
-						<input v-model="item.conclusion" class="surround"></input>
+					<text class="label">备注</text>
+					<view class="value">
+						<input v-model="item.memo" class="surround uni-input" @confirm="remarksChange"></input>
 					</view>
 				</view>
 			</view>
@@ -104,97 +102,223 @@
 				下一项
 			</button>
 		</view>
-
 	<!-- #ifdef APP -->
 	</scroll-view>
 	<!-- #endif -->
 </template>
 
 <script setup>
-	import {
-		ref
-	} from 'vue'
-
-	type Process = {
-		id : number,
-		productcode : string,
-		invname : string,
-		model : string,
-		upperlimit : number,
-		lowerlimit : number,
-		minactval : number,
-		maxactval : number,
-		conclusion : string,
-		applyDate : string,
-		reportDate : string
-	}
-	//检查项目最大数量
+	import { ref, computed } from 'vue' // 1. 引入 computed(计算属性核心)
+	import { getListByOrder, TaskKeyProcess, recordStatusDict, updateData } from '@/api/work';
+
+	// 存储页面参数
+	let pdid = "";
+	let senum = "";
+	// 检查项目最大数量(改为 ref 响应式,避免值变化不更新)
 	var maxcount = 5
-	var current = ref(1)
-	var processList = ref<Process[]>([])
-
-	const initProcessList = [{
-		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'
-	}
-	] as Process[];
-
-	processList.value = initProcessList.filter(item => item.id == current.value);
+	const current = ref(1)
+	const initRecords = ref<TaskKeyProcess[]>([])
+	var records = ref<TaskKeyProcess[]>([]);
+	const closeTags = ref<boolean[]>([]);
+
+	// 下拉框选项数组 - 定性分析选项
+	const array = ref(['合格', '不合格']);
+	
+	//自定义返回行为,覆盖系统默认返回按钮
+	const backPressOptions = reactive({
+		from: 'backbutton'
+	} as OnBackPressOptions)
+	
+	onBackPress((options : OnBackPressOptions) : boolean | null => {
+		uni.navigateTo({
+			url: `/pages/work/download/DownloadDetail?id=${pdid}`,
+			// 修改动画方向为从左到右退回
+			animationType: 'slide-in-left', // 使用从左到右滑出的动画效果
+			animationDuration: 300 // 动画持续时间,单位ms
+		})
+		// 返回true表示拦截默认返回行为
+		return true
+	})
+	
+	const getParsedValue = computed(() => {
+		return (value : string | number) => {
+			if (typeof value === 'number') {
+				return value;
+			}
+			if (typeof value === 'string') {
+				const num = parseFloat(value);
+				return isNaN(num) ? 0 : num;
+			}
+			return 0;
+		}
+	});
+
+	// 4. 切换标签时更新 initRecords(使用响应式的 initRecords)
 	const tabsClick = (obj : number) => {
 		current.value = obj
-		processList.value = initProcessList.filter(item => item.id == current.value)
+		records.value = initRecords.value.filter(item => item['senum'] == current.value)
+	}
+
+	const refreshRecords = (index : number) => {
+		// 清空现有数据(响应式数组需操作 .value)
+		initRecords.value = [];
+		closeTags.value = [];
+		// #ifdef APP-ANDROID
+		getListByOrder(
+			'app_task_keyprocess', 'pdid', pdid, ' order by sxid desc', null
+		).then((res : UTSJSONObject) => {
+			const dataList = res?.['data'] as UTSJSONObject[] ?? []
+			if (dataList.length > 0) {
+				let index = 1
+				dataList.forEach(item => {
+					if (item != null) {
+						item['senum'] = index
+						const record = JSON.parse<TaskKeyProcess>(item.toJSONString());
+						if (record != null) {
+							console.log(record);
+							initRecords.value.push(record)
+							index++;
+						}
+						
+					}
+				});
+				maxcount = index-1;
+			}
+			// 对initRecords按照no字段进行升序排序
+			if (initRecords.value.length > 0) {
+				if (index > 0) {
+					current.value = index
+				} else {
+					current.value = initRecords.value[0].senum
+				}
+				records.value = initRecords.value.filter(item => item['senum'] == current.value)
+			}
+		});
+		// #endif
+	}
+	
+	
+	const resultChange = (event : UniRadioGroupChangeEvent) => {
+		
+		// 获取当前选中的报告项
+		const currentItem = initRecords.value.find(item => item.senum === current.value);
+		if (currentItem != null) {
+			// 更新结果值
+			currentItem.result = event.detail.value;
+			//更新数据库
+			let updatedData = "result='" + currentItem.result + "'"
+			updateData('app_task_keyprocess', updatedData, 'sxid', currentItem.sxid.toString()).then((res : UTSJSONObject) => {
+				let data = res?.['data'] as boolean ?? false
+				if (data != null && data== true) {
+					uni.showToast({
+						title: "保存成功!",
+					});
+				}
+			});
+		}
+	}
+	
+	const minNumberChange = (event : UniInputConfirmEvent) => {
+		// 获取当前选中的报告项
+		const currentItem = initRecords.value.find(item => item.senum === current.value);
+		if (currentItem != null) {
+			// 更新结果值
+			currentItem.measuredvaluemin = event.detail.value;
+			// 检查measuredvalue是否为null或undefined,避免空指针异常
+			const measuredValue = currentItem.measuredvaluemin ?? '';
+			let updatedData = "measuredvaluemin='" + measuredValue + "'"
+			
+			//更新数据库
+			updateData('app_task_keyprocess', updatedData, 'sxid', currentItem.sxid.toString()).then((res : UTSJSONObject) => {
+				let data = res?.['data'] as boolean ?? false
+				if (data != null && data== true) {
+					uni.showToast({
+						title: "保存成功!",
+					});
+				}
+			});
+		}
 	}
+	
+	const maxNumberChange = (event : UniInputConfirmEvent) => {
+		// 获取当前选中的报告项
+		const currentItem = initRecords.value.find(item => item.senum === current.value);
+		if (currentItem != null) {
+			// 更新结果值
+			currentItem.measuredvaluemax = event.detail.value;
+			//更新数据库
+			let updatedData = "measuredvaluemax='" + currentItem.measuredvaluemax + "'"
+		
+			updateData('app_task_keyprocess', updatedData, 'sxid', currentItem.sxid.toString()).then((res : UTSJSONObject) => {
+				let data = res?.['data'] as boolean ?? false
+				if (data != null && data== true) {
+					uni.showToast({
+						title: "保存成功!",
+					});
+				}
+			});
+		}
+	}
+	
+	const remarksChange = (event : UniInputConfirmEvent) => {
+		// 获取当前选中的报告项
+		const currentItem = initRecords.value.find(item => item.senum === current.value);
+		if (currentItem != null) {
+			// 更新结果值
+			currentItem.memo = event.detail.value;
+			//更新数据库
+			let updatedData = "memo='" + currentItem.memo + "'"
+			updateData('app_task_keyprocess', updatedData, 'sxid', currentItem.sxid.toString()).then((res : UTSJSONObject) => {
+				let data = res?.['data'] as boolean ?? false
+				if (data != null && data== true) {
+					uni.showToast({
+						title: "保存成功!",
+					});
+				}
+			});
+		}
+	}
+	
+	onLoad((options) => {
+		pdid = options?.pdid ?? "1"
+		senum = options?.senum ?? "1"
+		// 加载初始数据(转换 senum 为数值,避免字符串类型问题)
+		refreshRecords(getParsedValue.value(senum))
+	});
+	
+	defineExpose({
+		backPressOptions
+	})
 </script>
 
 <style scoped>
+	/* 样式部分保持不变,仅修复标签颜色冲突(tag=3时优先黄色) */
 	.container {
-		padding: 40rpx;
+		padding: 20px;
 		background-color: #f5f7fa;
-		height: 100%;
+		flex: 1;
 		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);
+		border-radius: 12px;
+		padding: 20px 15px;
+		margin-bottom: 20px;
+		box-shadow: 0 4px 8px rgba(33, 147, 176, 0.3);
 	}
 
 	.banner-title {
 		color: white;
-		font-size: 36rpx;
+		font-size: 18px;
 		font-weight: bold;
 		text-align: center;
 	}
 
 	.box {
-		width: 40rpx;
+		width: 20px;
 		background-color: #909193;
-		border-radius: 15rpx;
+		border-radius: 7.5px;
 	}
 
 	.card-list {
@@ -202,15 +326,22 @@
 		flex-direction: column;
 	}
 
-	.card-list .card-view {
-		margin-bottom: 30rpx;
+	.card-list>.card {
+		margin-bottom: 15px;
+	}
+
+	/* #ifndef APP-ANDROID */
+	.card-list>.card:last-child {
+		margin-bottom: 0;
 	}
 
+	/* #endif */
+
 	.card {
 		background-color: white;
-		border-radius: 20rpx;
-		padding: 30rpx;
-		box-shadow: 0 6rpx 20rpx rgba(0, 0, 0, 0.05);
+		border-radius: 10px;
+		padding: 15px;
+		box-shadow: 0 3px 10px rgba(0, 0, 0, 0.05);
 		display: flex;
 		flex-direction: column;
 	}
@@ -233,37 +364,29 @@
 	.info-row {
 		display: flex;
 		flex-direction: row;
-		/* #ifdef APP-NVUE */
-		font-size: 28rpx;
+		font-size: 14px;
 		color: #33475b;
-		/* #endif */
 		align-items: center;
-		padding: 20rpx;
-	}
-
-	.info-row .info-text {
-		margin-right: 10rpx;
+		padding: 10px;
 	}
 
 	.label {
 		font-weight: bold;
 		color: #102a43;
-		min-width: 150rpx;
+		min-width: 75px;
 	}
 
 	.value {
 		flex: 1;
-		/* #ifdef APP-NVUE */
 		white-space: nowrap;
-		text-overflow: ellipsis;
-		/* #endif */
 		overflow: hidden;
+		text-overflow: ellipsis;
 	}
 
 	.divider {
 		height: 1px;
 		background-color: #eee;
-		margin: 20rpx 0;
+		margin: 10px 0;
 	}
 
 	.card-info {
@@ -274,10 +397,16 @@
 		flex-direction: column;
 	}
 
-	.card-info .card-info-view {
+	.card-info>.card-info-item {
 		margin-bottom: 10rpx;
 	}
 
+	/* #ifndef APP-ANDROID */
+	.card-info>.card-info-item:last-child {
+		margin-bottom: 0;
+	}
+
+	/* #endif */
 	.btn-group {
 		display: flex;
 		justify-content: flex-end;
@@ -328,6 +457,18 @@
 	.surround {
 		border: 1px solid silver;
 		border-radius: 10rpx;
+		min-height: 60rpx;
+	}
+
+	.selectable {
+		/* 确保在安卓设备上文字可以正常显示为可点击状态 */
+		user-select: text;
+		-webkit-user-select: text;
+		cursor: pointer;
+		/* #ifdef APP-ANDROID */
+		/* 安卓设备特别处理,增强可点击性 */
+		background-color: #f8f8f8;
+		/* #endif */
 	}
 
 	.record-card {
@@ -340,6 +481,17 @@
 		margin-bottom: 20rpx;
 		margin-top: 20rpx;
 	}
+	
+	/* 横向排列radio的样式 */
+	.radio-group-horizontal {
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+	}
+	
+	.radio-group-horizontal-rg{
+		margin-right: 30rpx;
+	}
 
 	.flex-row {
 		flex-direction: row;
@@ -353,7 +505,7 @@
 		justify-content: center;
 		align-items: center;
 	}
-	
+
 	.circle {
 		height: 50rpx;
 		width: 50rpx;
@@ -363,7 +515,7 @@
 		line-height: 50rpx;
 		border-radius: 50rpx;
 	}
-	
+
 	.checked-tag {
 		height: 60rpx;
 		width: 60rpx;
@@ -380,6 +532,8 @@
 
 	.bg-yellow {
 		background-color: yellow;
+		color: #333;
+		/* 黄色标签加深色文字,避免看不清 */
 	}
 
 	.bg-black {
@@ -417,4 +571,9 @@
 	.btn-second {
 		right: 15rpx;
 	}
+	
+	.number-input {
+		width: 50%;
+	}
+	
 </style>

BIN
static/db/QT800.db


+ 1 - 1
utils/qcDataProcessor.uts

@@ -205,7 +205,7 @@ export const downloadDataFromAPI = async (productCode : string, callback ?: () =
 					//可以被覆盖,需要有提示框,给用户确认
 					uni.showModal({
 						title: '系统提示',
-						content: '该产品号已存在任务是否覆盖掉?',
+						content: '该工序编号已存在任务是否覆盖掉?',
 						cancelText: '取消',
 						confirmText: '确定',
 						success: function (res) {

+ 7 - 4
utils/sqlite.uts

@@ -603,7 +603,7 @@ export function selectLatestInfoData (
 					SELECT 
 					  pdid,
 					  COUNT(pdid) as keyTotal,
-					  SUM(CASE WHEN (measuredvaluemin IS NOT NULL and measuredvaluemin != '') OR ( measuredvaluemax IS NOT NULL  and measuredvaluemax !='' )THEN 1 ELSE 0 END) as keyCount
+					  SUM(CASE WHEN result in ('合格', '不合格') THEN 1 ELSE 0 END) as keyCount
 					FROM app_task_keyprocess 
 					GROUP BY pdid
 				  ) k ON m.pdid = k.pdid
@@ -737,7 +737,9 @@ export function selectLatestInfoData (
 					CASE WHEN p.photoCount = p.photoTotal THEN '已完成' ELSE '' END as photoStatus,
 					k.keyTotal,
 					k.keyCount,
-					CASE WHEN k.keyCount = k.keyTotal THEN '已完成' ELSE '' END as keyStatus,
+					CASE 
+					WHEN k.errorCount > 0 then '不合格'
+					WHEN k.keyCount = k.keyTotal THEN '已完成' ELSE '' END as keyStatus,
 					i.recordTotal,
 					i.recordCount,
 					CASE 
@@ -758,7 +760,8 @@ export function selectLatestInfoData (
 					SELECT 
 					  pdid,
 					  COUNT(pdid) as keyTotal,
-					  SUM(CASE WHEN (measuredvaluemin IS NOT NULL and measuredvaluemin != '') OR ( measuredvaluemax IS NOT NULL  and measuredvaluemax !='' )THEN 1 ELSE 0 END) as keyCount
+					  SUM(CASE WHEN result in ('合格', '不合格') THEN 1 ELSE 0 END) as keyCount,
+					  SUM(case when result = '不合格' then 1 else 0 end) as errorCount
 					FROM app_task_keyprocess 
 					GROUP BY pdid
 				  ) k ON m.pdid = k.pdid
@@ -766,7 +769,7 @@ export function selectLatestInfoData (
 					SELECT 
 					  r.pdid,
 					  COUNT(i.sxid) as recordTotal,
-					  SUM(CASE WHEN i.result = '合格' or i.result = '不合格' THEN 1 ELSE 0 END) as recordCount,
+					  SUM(CASE WHEN i.result in ('合格', '不合格') THEN 1 ELSE 0 END) as recordCount,
 					  SUM(case when i.result = '不合格' then 1 else 0 end) as errorCount
 					FROM app_task_record r
 					LEFT JOIN app_task_record_item i ON r.sxid = i.psxid