Procházet zdrojové kódy

添加数据下载(接口地址需要配置)

ZhangLeo před 5 dny
rodič
revize
e942b07866
5 změnil soubory, kde provedl 351 přidání a 111 odebrání
  1. 160 99
      api/work.uts
  2. 31 6
      pages/work/record/InfoList.uvue
  3. binární
      static/db/QT800.db
  4. 129 0
      utils/dataProcessor.uts
  5. 31 6
      utils/sqlite.uts

+ 160 - 99
api/work.uts

@@ -1,108 +1,108 @@
 // #ifdef APP-ANDROID
-import {selectTableData, insertTableData, updateTableData, selectJoinTableData, selectRecordData, selectRecordInfo} from '@/utils/sqlite'
+import { selectTableData, insertTableData, updateTableData, selectJoinTableData, selectRecordData, selectRecordInfo } from '@/utils/sqlite'
 // #endif
 
 export type Download = {
-		pdid : number,
-		workorder : string,
-		invname : string,
-		productno : string,
-		graphid : string,
-		cardno : string,
-		processno : string,
-		ver : string,
-		updatetime : string,
-		progress : string,
-		status : number
-	}
+	pdid : number,
+	workorder : string,
+	invname : string,
+	productno : string,
+	graphid : string,
+	cardno : string,
+	processno : string,
+	ver : string,
+	updatetime : string,
+	progress : string,
+	status : number
+}
 
 export type Record = {
-		sxid : number,
-		senum : number,
-		photoitem : string,
-		productno : string,
-		part : string,
-		descb : string,
-		date : string,
-		partno : string,
-		num : number,
-		status : number,
-		urlspl : string[],
-		imgname : string[],
-		urlpdt : string[]
-	}
+	sxid : number,
+	senum : number,
+	photoitem : string,
+	productno : string,
+	part : string,
+	descb : string,
+	date : string,
+	partno : string,
+	num : number,
+	status : number,
+	urlspl : string[],
+	imgname : string[],
+	urlpdt : string[]
+}
+
+export type TaskProcess = {
+	id : number
+	name : string
+	num : number
+	step : number
+	status : number
+}
 
- export type TaskProcess = {
-		id : number
-		name : string
-		num : number
-		step : number
-		status : number
- }
- 
- export type JoinRecord = {
-	 sxid : number,
-	 senum : number,
-	 photoitem : string,
-	 productno : string,
-	 part : string,
-	 descb : string,
-	 date : string,
-	 partno : string,
-	 num : number,
-	 status : number,
-	 urlspl : string
-	 imgname : string,
-	 urlpdt : string,
-	 pid: number,
-	 workorder: string,
-	 invname: string
- }
+export type JoinRecord = {
+	sxid : number,
+	senum : number,
+	photoitem : string,
+	productno : string,
+	part : string,
+	descb : string,
+	date : string,
+	partno : string,
+	num : number,
+	status : number,
+	urlspl : string
+	imgname : string,
+	urlpdt : string,
+	pid : number,
+	workorder : string,
+	invname : string
+}
 
 export type RecordCalculate = {
-	photoitem: string,
-	pid: number,
-	step: number,
-	total: number,
-	status: number
-}  
-
-export function offlineData(data:UTSJSONObject):Promise<UTSJSONObject> {
-	return new Promise((resolve, reject) => {	
-		let result = JSON.parseObject(JSON.stringify(data)) as UTSJSONObject 
+	photoitem : string,
+	pid : number,
+	step : number,
+	total : number,
+	status : number
+}
+
+export function offlineData(data : UTSJSONObject) : Promise<UTSJSONObject> {
+	return new Promise((resolve, reject) => {
+		let result = JSON.parseObject(JSON.stringify(data)) as UTSJSONObject
 		resolve(result)
-	});	
+	});
 }
 
-export const statusDict = {'1':'未执行','2':'执行中','3':'已执行','4':'执行错误','5':'已取消'}
-export const recordStatusDict = {'1':'未拍照','2':'拍照中','3':'拍照完成','4':'检验不清晰','5':'拍照取消'}
+export const statusDict = { '1': '未执行', '2': '执行中', '3': '已执行', '4': '执行错误', '5': '已取消' }
+export const recordStatusDict = { '1': '未拍照', '2': '拍照中', '3': '拍照完成', '4': '检验不清晰', '5': '拍照取消' }
 
-export async function getList(tableName:string, condition?:string|null, value?:string|null,condition2?:string|null, value2?:string|null, initData?:UTSJSONObject|null):Promise<UTSJSONObject> {
-   
-    // #ifdef APP-ANDROID
-    const result = await selectTableData(tableName, condition, value, condition2, value2);
-    console.log(result);
+export async function getList(tableName : string, condition ?: string | null, value ?: string | null, condition2 ?: string | null, value2 ?: string | null, initData ?: UTSJSONObject | null) : Promise<UTSJSONObject> {
+
+	// #ifdef APP-ANDROID
+	const result = await selectTableData(tableName, condition, value, condition2, value2);
+	console.log(result);
 	return result;
 	// #endif
-   
-  // #ifdef H5
-   return offlineData(initData)
-  // #endif
+
+	// #ifdef H5
+	return offlineData(initData)
+	// #endif
 }
 
 
-export async function getJoinList(dbTable:string, joinTable:string, labels:string, joinCondition:string, lname?:string, lvalue?:string, others?:string):Promise<UTSJSONObject> {
-   
-    // #ifdef APP-ANDROID
-    const result = await selectJoinTableData(dbTable, joinTable, labels, joinCondition, lname, lvalue, others);
-    console.log(result);
+export async function getJoinList(dbTable : string, joinTable : string, labels : string, joinCondition : string, lname ?: string, lvalue ?: string, others ?: string) : Promise<UTSJSONObject> {
+
+	// #ifdef APP-ANDROID
+	const result = await selectJoinTableData(dbTable, joinTable, labels, joinCondition, lname, lvalue, others);
+	console.log(result);
 	return result;
 	// #endif
 }
 
 
 
-export async function updateData(tableName: string, data: string, lname?: string, lvalue?: string):Promise<UTSJSONObject>{
+export async function updateData(tableName : string, data : string, lname ?: string, lvalue ?: string) : Promise<UTSJSONObject> {
 	// #ifdef APP-ANDROID
 	const result = await updateTableData(tableName, data, lname, lvalue);
 	console.log(result);
@@ -111,28 +111,89 @@ export async function updateData(tableName: string, data: string, lname?: string
 }
 
 
-export async function getRecordCalculate(tableName: string, value?:string|null, initData?:UTSJSONObject|null):Promise<UTSJSONObject> {
-   
-    // #ifdef APP-ANDROID
-    const result = await selectRecordData(tableName, value);
-    console.log(result); 
+export async function getRecordCalculate(tableName : string, value ?: string | null, initData ?: UTSJSONObject | null) : Promise<UTSJSONObject> {
+
+	// #ifdef APP-ANDROID
+	const result = await selectRecordData(tableName, value);
+	console.log(result);
 	return result;
 	// #endif
-   
-  // #ifdef H5
-   return offlineData(initData)
-  // #endif
+
+	// #ifdef H5
+	return offlineData(initData)
+	// #endif
 }
 
-export async function getRecordInfoList(initData?:UTSJSONObject|null):Promise<UTSJSONObject> {
-   
-    // #ifdef APP-ANDROID
-    const result = await selectRecordInfo();
-    console.log(result); 
+export async function getRecordInfoList(initData ?: UTSJSONObject | null) : Promise<UTSJSONObject> {
+
+	// #ifdef APP-ANDROID
+	const result = await selectRecordInfo();
+	console.log(result);
 	return result;
 	// #endif
-   
-  // #ifdef H5
-   return offlineData(initData)
-  // #endif
+
+	// #ifdef H5
+	return offlineData(initData)
+	// #endif
+}
+
+/**
+ * 保存媒体信息数据到数据库
+ * @param data MediaInfoData类型的数据
+ * @returns Promise<UTSJSONObject> 保存结果
+ */
+export async function saveMediaInfo(data ?: UTSJSONObject | null) : Promise<UTSJSONObject> {
+	// #ifdef APP-ANDROID
+	// 表名
+	const tableName = 'app_media_info';
+
+	// 构造插入的数据字符串,注意数据库字段名和类型
+	const values = `'${data?.getString('workorder') ?? ''}','${data?.getString('invname') ?? ''}','${data?.getString('productcode') ?? ''}','${data?.getString('cardno') ?? ''}','${data?.getString('model') ?? ''}','${data?.getString('graphid') ?? ''}','${data?.getString('ver') ?? ''}','${data?.getString('phase') ?? ''}','${data?.getString('processno') ?? ''}','${data?.getString('progress') ?? ''}',${data?.getNumber('status') ?? 1},'${data?.getString('createtime') ?? ''}',${data?.getNumber('createuser') ?? 0},'${data?.getString('updatetime') ?? ''}',${data?.getNumber('updateuser') ?? 0}`;
+
+	// 构造字段名字符串
+	const fields = 'workorder,invname,productno,cardno,model,graphid,ver,phase,processno,progress,status,createtime,createuser,updatetime,updateuser';
+
+	try {
+		// 调用sqlite的插入方法
+		const result = await insertTableData(tableName, values, fields);
+		console.log('保存app_media_info成功:', result);
+		return result;
+	} catch (error) {
+		console.error('保存app_media_info失败:', error);
+		return { errMsg: '保存失败', data: [] as any[] } as UTSJSONObject;
+	}
+	// #endif
+
+	// #ifdef H5
+	return offlineData({ success: true, data: [] } as UTSJSONObject);
+	// #endif
+}
+
+/**
+ * 保存媒体信息数据到数据库
+ * @param data saveMediaRecord类型的数据
+ * @returns Promise<UTSJSONObject> 保存结果
+ */
+export async function saveMediaRecord(values : string) : Promise<UTSJSONObject> {
+	// #ifdef APP-ANDROID
+	// 表名
+	const tableName = 'app_media_record';
+
+	// 构造字段名字符串
+	const fields = 'senum,photoitem,productno,part,partno,descb,num,status,date,urlspl,imgname,urlpdt,createtime,createuser,updatetime,updateuser,pid';
+
+	try {
+		// 调用sqlite的插入方法
+		const result = await insertTableData(tableName, values, fields);
+		console.log('保存app_media_record成功:', result);
+		return result;
+	} catch (error) {
+		console.error('保存app_media_record失败:', error);
+		return { errMsg: '保存失败', data: [] as any[] } as UTSJSONObject;
+	}
+	// #endif
+
+	// #ifdef H5
+	return offlineData({ success: true, data: [] } as UTSJSONObject);
+	// #endif
 }

+ 31 - 6
pages/work/record/InfoList.uvue

@@ -41,7 +41,7 @@
 					'bg-green': item.statusRecordCount === item.totalRecord,
 					'bg-yellow': item.statusRecordCount < item.totalRecord,
 					'bg-black': item.statusRecordCount === 0
-				  }">{{ item.statusRecordCount}}  / {{item.totalRecord}} </text>
+				  }">{{ item.statusRecordCount}} / {{item.totalRecord}} </text>
 			</view>
 		</view>
 	<!-- #ifdef APP -->
@@ -54,6 +54,7 @@
 		ref
 	} from 'vue'
 	import { getRecordInfoList } from '@/api/work';
+	import { downloadDataFromAPI } from '@/utils/dataProcessor';
 
 	const backPressOptions = reactive({
 		from: 'backbutton'
@@ -80,9 +81,9 @@
 		updatetime : string,
 		progress : string,
 		status : number,
-		totalRecord: number,
-		statusRecordCount: number,
-		status4RecordCount: number
+		totalRecord : number,
+		statusRecordCount : number,
+		status4RecordCount : number
 	}
 
 	var initDownloads = [] as Download[]
@@ -103,7 +104,6 @@
 				}
 			});
 		}
-		console.log(initDownloads)
 		downloads.value = initDownloads
 	})
 	// #endif
@@ -144,11 +144,36 @@
 
 	// #endif
 
-	const download = (e : any) => {
+	const download = async (e : any) => {
 		console.log("开始下载...")
+		// 调用数据处理工具中的方法下载数据
+		// 调用数据处理工具中的方法下载数据
+		await downloadDataFromAPI(() => {
+			// 重新加载页面数据的回调函数
+			getRecordInfoList(null).then((res : UTSJSONObject) => {
+				console.log('下载完成后刷新数据:', res)
+				let dataList = res?.['data'] as UTSJSONObject[] ?? Array<UTSJSONObject>()
+				// 清空现有数据,确保不重复添加
+				initDownloads = []
+				if (dataList != null && dataList.length > 0) {
+					dataList.forEach(item => {
+						if (item != null) {
+							let download = JSON.parse<Download>(item.toJSONString());
+							if (download != null) {
+								initDownloads.push(download)
+							}
+						}
+					});
+				}
+				console.log('刷新后的数据列表:', initDownloads)
+				// 更新响应式数据,触发页面刷新
+				downloads.value = [...initDownloads]
+			})
+		})
 	}
 	const upload = (e : any) => {
 		console.log("开始上传...")
+
 	}
 	const enterItem = (id : number) => {
 		uni.navigateTo({

binární
static/db/QT800.db


+ 129 - 0
utils/dataProcessor.uts

@@ -0,0 +1,129 @@
+import { getToken } from './auth'
+import { saveMediaInfo, saveMediaRecord } from '@/api/work'
+
+// 类型定义保持不变
+export type ApiResponse = {
+	code : number;
+	msg : string;
+	data : MediaInfoData[];
+}
+
+export type MediaInfoData = {
+	pk : string;
+	workorder ?: string;
+	invname ?: string;
+	productcode ?: string;
+	cardno ?: string;
+	model ?: string;
+	graphid ?: string;
+	ver ?: string;
+	phase ?: string;
+	processno ?: string;
+	createtime ?: string;
+	createuser ?: string;
+	updatetime ?: string;
+	updateuser ?: string;
+	qmImageTaskClist ?: MediaRecordData[];
+}
+
+export type MediaRecordData = {
+	senum ?: string;
+	photoitem ?: string;
+	part ?: string;
+	partno ?: string;
+	descb ?: string;
+	num ?: number;
+	urlspl ?: string;
+	imgname ?: string;
+	urlpdt ?: string;
+	createtime ?: string;
+	createuser ?: string;
+	updatetime ?: string;
+	updateuser ?: string;
+}
+
+export const downloadDataFromAPI = async (callback ?: () => void) : Promise<boolean> => {
+	try {
+		uni.showLoading({ title: '数据下载中...' })
+
+		return new Promise<boolean>((resolve) => {
+
+			uni.request({
+				url: 'http://192.168.5.124:4523/m2/6802511-6516056-default/324225181',
+				method: 'GET',
+				success: (res) => {
+					console.log('请求成功:', res);
+					console.log(res.data);
+					let singleObject = res?.['data'] as UTSJSONObject ?? {} as UTSJSONObject
+					if (singleObject != null && singleObject.code == 666) {
+						let mediaInfoList = singleObject?.['data'] as UTSJSONObject[] ?? Array<UTSJSONObject>()
+						if (mediaInfoList != null && mediaInfoList.length > 0) {
+							mediaInfoList.forEach(item => {
+								if (item != null) {
+									let data = JSON.parse<MediaInfoData>(item.toJSONString());
+									if (data != null) {
+										saveMediaInfo(item).then((res : UTSJSONObject) => {
+											const lastIdStr = res?.['lastId'] as string | null;
+											const lastId = lastIdStr != null ? parseInt(lastIdStr) : null;
+											if (lastId != null) {
+												let recordList = data?.['qmImageTaskClist'] as UTSJSONObject[] ?? Array<UTSJSONObject>()
+												console.log(recordList)
+												if (recordList != null && recordList.length > 0) {
+													for(var i =0; i< recordList.length; i++) {
+														// 将recordList[i]断言为MediaRecordData类型
+														const record: MediaRecordData = recordList[i] as MediaRecordData;
+														console.log('完整对象:', record);
+														 
+														// 获取各个字段的值
+														const senum = record.senum; // string类型
+														const photoitem = record.photoitem; // string类型
+														const part = record.part; // string类型
+														const partno = record.partno; // string类型
+														const descb = record.descb; // string类型
+														const num = record.num; // number类型
+														const urlspl = record.urlspl; // string类型
+														const imgname = record.imgname; // string类型
+														const urlpdt = record.urlpdt; // string类型
+														const createtime = record.createtime; // string类型
+														const createuser = record.createuser; // string类型
+														const updatetime = record.updatetime; // string类型
+														const updateuser = record.updateuser; // string类型
+
+														//senum,photoitem,productno,part,partno,descb,num,status,date,urlspl,imgname,urlpdt,createtime,createuser,updatetime,updateuser,pid
+														// 使用三目运算符判断,当值为null时直接插入null,否则用单引号括起来
+														var values = `${senum === null ? '1' : `'${senum}'`}, ${photoitem === null ? 'null' : `'${photoitem}'`}, ${data?.['productcode'] === null ? 'null' : `'${data?.['productcode']}'`},${part === null ? 'null' : `'${part}'`},${partno === null ? 'null' : `'${partno}'`},${descb === null ? 'null' : `'${descb}'`},${num === null ? 0 : num},1,'', ${urlspl === null ? 'null' : `'${urlspl}'`},${imgname === null ? 'null' : `'${imgname}'`},${urlpdt === null ? 'null' : `'${urlpdt}'`}, ${createtime === null ? 'null' : `'${createtime}'`}, ${createuser === null ? 'null' : `'${createuser}'`}, ${updatetime === null ? 'null' : `'${updatetime}'`}, ${updateuser === null ? 'null' : `'${updateuser}'`}, ${lastId === null ? 0 : lastId}`
+														saveMediaRecord(values)
+														uni.showToast({ title: `下载完成`, icon: 'success' });
+													}
+												}
+											} else {
+												console.log('保存媒体信息成功,但未获取到主键ID');
+											}
+										})
+									}
+								}
+							});
+						}
+					} else {
+						uni.showToast({ title: `请求失败: ${singleObject.msg}`, icon: 'error' });
+					}
+					resolve(true);
+				},
+				fail: (err) => {
+					console.error('请求失败:', err);
+					uni.showToast({ title: `请求失败: ${err.errMsg}`, icon: 'error' });
+					resolve(false);
+				},
+				complete: () => {
+					console.log('请求完成');
+					uni.hideLoading();
+				}
+			});
+		});
+	} catch (error) {
+		console.error('下载数据总异常:', error);
+		uni.showToast({ title: '下载失败,请重试', icon: 'error' });
+		uni.hideLoading();
+		return false;
+	}
+}

+ 31 - 6
utils/sqlite.uts

@@ -208,21 +208,46 @@ export function selectTableData (
            		  sql: sql,
            		  success: (e: executeSqlOptionsResult) => {
            		    console.log(e)
-           			
+           			// 插入成功后,执行查询获取最后插入的ID
+           			const lastIdSql = 'SELECT last_insert_rowid() as lastId';
+           			const selectOptions ={
+           				sql: lastIdSql,
+           				success: (idResult: selectSqlOptionsResult) => {
+           					console.log('获取最后插入ID:', idResult);
+           				},
+           				fail: (idError: selectSqlOptionsResult) => {
+           					console.error('获取最后插入ID失败:', idError);
+           				}
+           			} as selectSqlOptions;
+           			sqlite.selectSql(selectOptions);
            		  },
            		  fail: (e: executeSqlOptionsResult) => {
            		    console.error(e)
            		  }		
            } as executeSqlOptions
 		   
-		   const info = sqlite.executeSql(executeSqlOptions) as executeSqlOptionsResult
-		   console.log(info)
+		   // 先执行插入操作
+		   const info = sqlite.executeSql(executeSqlOptions) as executeSqlOptionsResult;
+		   
+		   // 再执行获取最后插入ID的查询
+		   const lastIdSql = 'SELECT last_insert_rowid() as lastId';
+		   const lastIdOptions ={
+		    	sql: lastIdSql
+		   } as selectSqlOptions;
+		   const lastIdResult = sqlite.selectSql(lastIdOptions) as selectSqlOptionsResult;
+		   
+		   // 提取最后插入的ID
+		   const lastId = lastIdResult?.data != null && lastIdResult.data.length > 0 ? lastIdResult.data[0]['lastId'] : null;
+		   
+		   console.log('最后插入的ID:', lastId);
+		   
 		   const ret = {
 		   	errMsg: info?.errMsg ?? '',
-		   	data: info?.data ?? ['']
-		   } as UTSJSONObject
+		   	data: info?.data ?? [''],
+		   	lastId: lastId // 返回最后插入的ID
+		   } as UTSJSONObject;
 		   sqlite.close();
-		   resolve(ret)
+		   resolve(ret);
         })
       } else {
         return new Promise((resolve, reject) => {