收藏 分销(赏)

无线仓储管理系统--说明书.doc

上传人:天**** 文档编号:4000770 上传时间:2024-07-24 格式:DOC 页数:76 大小:480.54KB
下载 相关 举报
无线仓储管理系统--说明书.doc_第1页
第1页 / 共76页
无线仓储管理系统--说明书.doc_第2页
第2页 / 共76页
无线仓储管理系统--说明书.doc_第3页
第3页 / 共76页
无线仓储管理系统--说明书.doc_第4页
第4页 / 共76页
无线仓储管理系统--说明书.doc_第5页
第5页 / 共76页
点击查看更多>>
资源描述

1、无线仓储管理系统 说明书第一章项目简介3第二章系统概述5第三章前端数据中心(A8)总体设计5第一节:系统框图,线程间关系5第二节:主进程模块7第三节:数据库模块10第四节:数据接收模块19第五节:数据处理模块22第六节:处理客户请求模块(设备控制)33第七节:红外(按键模拟)模块38第八节:蜂鸣器模块39第九节:LED模块40第十节:摄像头模块41第十一节:SMS模块42第十二节:共享内存刷新模块54第十三节:WIFI模块58第十四节:QT进程59第十五节:CGI进程72第十六节:控制M0命令发送模块89第四章数据采集端(M0)总体设计91第一章 项目简介1. 项目背景随着社会经济的迅速发展和

2、科学技术的全面进步,计算机事业的飞速发展,以计算机与通信技术为基础的信息系统正处于蓬勃发展的时期.随着经济文化水平的显著提高,人们对于生活质量及工作环境的要求也越来越高。与此同时为了管理大量的物品,仓库也大量的出现,仓库的管理问题也就提上了日程。随着仓库大量的增加, 其管理难度也越来越大,如何优化仓库的日常管理也就成为了一个大众化的课题。传统的仓库管理,一般依赖于一个非自动化的、以纸张文件为基础的系统来记录、追踪进出的货物,完全由人工实施仓库内部的管理,因此仓库管理的效率极其低下.对此,我们利用基于ZIGBEE 无线射频技术的仓库智能管理系统,该系统能够增强库房作业的准确性和快捷性、减少整个仓

3、库物资出入库中由于管理不到位造成的非法出入库、误置、偷窃和库存、出货错误等损失,并最大限度地减少储存成本、保障仓库物资的安全。2. 需求分析传统:非自动化的、以纸张文件来记录、追踪进出的货物。 目前多数:计算机数据系统管理,数据先纸张记录、再手工输入计算机的方式进行采集和统计整理.数据录入速度慢、准确率低。 随着仓库智能化的不断发展,仓库管理的物资种类,数量在不断增加、出入库频率剧增,仓库管理作业也已十分复杂和多样化,传统的人工仓库作业模式和数据采集方式已难以满足仓库管理的快速、准确要求,严重影响了仓库的管理. ZIGBEE 技术正在为仓库管理带来一场巨大的变革,以识别距离远,快速,不易损坏,

4、容量大等条码无法比拟的优势,简化繁杂的工作流程,有效改善供应链的效率和透明度.基于物联网的智能战备仓库管理系统是在现有仓库管理和车辆管理中引入ZIGBEE 技术,对仓库到货检验、入库、出库、调拨、移库移位、库存盘点等各个作业环节的数据进行自动化的数据采集,保证仓库管理各个环节数据输入的速度和准确性,确保管理人员及时准确地掌握库存的真实数据,合理保持和控制仓库库存.通过科学的编码,还可方便地对物品的批次、保质期等进行管理.利用系统的库位管理功能,更可以及时掌握所有库存物资当前所在位置,有利于提高仓库管理的工作效率。3. 术语定义Linux: Linux是一种自由和开放源码的类Unix操作系统。目

5、前存在着许多不同的Linux,但它们都使用了Linux内核.Linux可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机。RFID:射频识别即RFID(Radio Frequency IDentification)技术,又称电子标签、无线射频识别,是一种通信技术,可通过无线电讯号识别特定目标并读写相关数据,而无需识别系统与特定目标之间建立机械或光学接触.ZIGBEE :Zigbee是基于IEEE802.15。4标准的个域网协议.根据这个协议规定的技术是一种短距离、低功耗的无线通信技术。这一名称来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和

6、“嗡嗡”(zig)地抖动翅膀的“舞蹈”来与同伴传递花粉所在方位信息,也就是说蜜蜂依靠这样的方式构成了群体中的通信网络。其特点是近距离、低复杂度、自组织、低功耗、低数据速率、低成本.主要适合用于自动控制和远程控制领域,可以嵌入各种设备.简而言之,ZigBee就是一种便宜的,低功耗的近距离无线组网通讯技术.A8: ARM Cortex-A8处理器是第一款基于ARMv7架构的应用处理器,并且是有史以来ARM开发的性能最高、最具功率效率的处理器.M0:Cortex-M0处理器,是市场上现有的最小、能耗最低、最节能的ARM处理器.WIFI:Wi-Fi是一种可以将个人电脑、手持设备(如PDA、手机)等终端

7、以无线方式互相连接的技术.WiFi是一个无线网路通信技术的品牌,由Wi-Fi联盟(WiFi Alliance)所持有。目的是改善基于IEEE 802.11标准的无线网路产品之间的互通性。第二章 系统概述本系统是基于PC,A8及M0等设备,依托在各项互联网,物联网,传感器等技术的基础上编写,以实现食品物联网仓储系统,使用户更方便的管理仓库内的所有信息及其特殊情况。本系统主要分为三大模块:核心服务器端(PC)、前端数据中心(A8)和远程监控终端(M0) .第三章 前端数据中心(A8)总体设计6第一节:系统框架,线程间关系1. 系统框架:a。通过M0进行实时采集环境参数,例如温度、湿度、光感数据,进

8、行物品刷卡;b.再通过ZigBee把采集到的环境参数或物品信息发送给A8;c.由A8的M0线程负责接收环境参数或物品信息,激活数据库线程对数据库进行相应的处理,然后如果是环境参数则对环境参数进行判断处理进行报警.d。用摄像头采集图片,存储到A8上.e。构建嵌入式web服务器,使用户通过网络利用pc机进行监控。f.在web页面上设置控制按钮,监控设备识别用户指令并进行相应动作g。A8通过GPRS短信息功能向用户报警.2. 线程间关系:pthread_client_request():处理消息队列里请求的线程。pthread_refresh():更新共享内存里的实时数据。pthread_sqlit

9、e():数据库线程.pthread_transfer():接收M0数据线程。pthread_analysis():M0数据分析线程。pthread_uart_cmd():M0控制命令发送线程。pthread_sms():短信模块控制线程。pthread_buzzer():A8蜂鸣器控制线程。pthread_infrared():红外(按键模拟)监测线程。pthread_led():A8LED模块线程。pthread_camera():摄像头模块控制线程.第二节:数据描述1. 结构体描述结构体名成员类型成员名功能描述storage_goods_infounsigned chargoods_typ

10、e物品类型unsigned intgoods_count物品数量storage_infounsigned charstorage_status仓库开关状态led_status仓库LED状态buzzer_status仓库Buzzer状态fan_status仓库风扇状态seg_status仓库数码管状态signed charx仓库采集端三轴状态yzcharsamplingTime20采集数据的时间floattemperature仓库当前温度temperatureMAX仓库温度上限temperatureMIN仓库温度下限humidity仓库当前湿度humidityMAX仓库湿度上限humidityM

11、IN仓库湿度下限illumination仓库当前光照illuminationMAX仓库光照上限illuminationMIN仓库光照下限battery仓库采集端电池电压adc仓库ADC采集电压adcMIN仓库电池电压最小值storage_goods_infogoods_infoGOODS_NUM采集货物信息env_info_clien_addrstorage_info storage_noSTORAGE_NUM所以仓库实时信息storage_nointtable_select_maskenv_operation_masktable_operation_maskgoods_operation_m

12、askmsglongtype消息队列里的消息类型msgtype区别消息的类型unsigned chartextQUEUE_MSG_LEN消息正文长度2、全局变量描述类型变量名pthread_cond_tcond_sqlite数据库线程被唤醒条件变量cond_analysis数据分析线程被唤醒条件变量cond_uart_cmdM0控制命令发送线程被唤醒条件变量cond_client_request处理消息队列里请求的线程被唤醒条件变量cond_infrared红外(按键模拟)监测线程被唤醒条件变量cond_buzzerA8蜂鸣器控制线程被唤醒条件变量cond_ledA8LED模块线程被唤醒条件变

13、量cond_camera摄像头模块控制线程被唤醒条件变量cond_sms短信模块控制线程被唤醒条件变量cond_refresh更新共享内存里的实时数据被唤醒条件变量pthread_mutex_tmutex_slinklist数据库缓存互斥锁mutex_sqlite数据库线程互斥锁mutex_analysis数据分析线程互斥锁mutex_uart_cmdM0控制命令发送线程互斥锁mutex_client_request处理消息队列里请求的线程互斥锁mutex_infrared红外(按键模拟)监测线程互斥锁mutex_buzzerA8蜂鸣器控制线程互斥锁mutex_ledA8LED模块线程互斥锁m

14、utex_camera摄像头模块控制线程互斥锁mutex_sms短信模块控制线程互斥锁mutex_refresh更新共享内存里的实时数据互斥锁mutex_refresh_updatamutex_global全局变量保护互斥锁mutex_linklist接收数据缓存互斥锁storage_infostorage_RTSTORAGE_NUM各仓库实时信息unsigned chardev_sms_maskA8短信模块操作掩码dev_infrared_maskA8按键模块操作掩码dev_buzzer_maskA8蜂鸣器模块操作掩码dev_led_maskA8 LED模块操作掩码dev_camera_ma

15、skA8摄像头模块操作掩码dev_uart_maskA8串口发送命令掩码intdev_infrared_fdA8按键模块设备节点dev_buzzer_fdA8蜂鸣器模块设备节点dev_led_fdA8 LED模块设备节点dev_camera_fdA8摄像头模块设备节点dev_sms_fdA8短信模块设备节点dev_uart_fdA8U转串设备节点msgid消息队列IDshmid共享内存IDsemid信号灯集IDstorageNumgoodsKindsenv_info_clien_addrenv_info_clien_addr_sall_info_RT各仓库实时信息第三节:数据库模块1、sqli

16、te3介绍(1)sqlite3基础介绍sqlite3 提供C 函数接口,你可以用这些函数操作数据库.通过使用这些接口,传递一些标准 sql 语句(以 char * 类型)给 sqlite 函数, sqlite 就会为你操作数据库.sqlite3 跟 MS 的 access 一样是文件型数据库.一个数据库就是一个文件,此数据库里可以建立很多的表,可以建立索引、触发器等等,但是,它实际上得到的就是一个文件。备份这个文件就备份了整个数据库.sqlite3 不需要任何数据库引擎,这意味着如果你需要 sqlite 来保存一些用户数据,甚至都不需要安装数据库。(2)介绍数据库基本操作-基本流程l 关键数据

17、结构sqlite3 里最常用到的是 sqlite3 类型。从数据库打开开始, sqlite3 就要为这个类型准备好内存,直到数据库关闭,整个过程都需要用到这个类型。当数据库打开时开始,这个类型的变量就代表了你要操作的数据库。下面再详细介绍。l 打开数据库int sqlite3_open( 文件名 , sqlite3 * );作用:用这个函数开始数据库操作。文件名:数据库文件名,比如: c:warehouse.db 。注意:文件名不需要一定存在,如果此文件不存在, sqlite 会自动建立它。如果它存在,就尝试把它当数据库文件来打开.sqlite3 * :参数即前面提到的关键数据结构。这个结构底

18、层细节如何,你不要关它。函数返回值:表示操作是否正确,如果是 SQLITE_OK 则表示操作正常.反之则不正常.l 关闭数据库int sqlite3_close(sqlite3 *);作用:用这个函数关闭数据库操作。l 执行 sql 语句int sqlite3_exec(sqlite3, const char *sql, sqlite3_callback, void , char errmsg );这就是执行一条 sql 语句的函数。第 1 个参数:open 函数得到的指针。是关键数据结构。第 2 个参数:const char sql 是一条 sql 语句,以 0 结尾.第 3 个参数: sq

19、lite3_callback 是回调函数,当这条语句执行之后, sqlite3 会去调用你提供的这个函数。第 4 个参数:void 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填 NULL 。第 5 个参数:char * errmsg 是错误信息。注意是指针的指针。2、数据库模块流程图及结构图(1)sqlite线程流程图主程序开始运行之后,各任务线程开始运行,其中就包括的了数据库的pthread_sqlite。pthread_sqlite线程开始创建一个用于存储对数据库操作的链表(用来操作数据库的链表),链表创建之后进入

20、while(1)循环。循环中,用pthread_cond_wait函数语句进行睡眠等待,等待其他线程的唤醒函数pthread_cond_signal发来的信号,唤醒之后再次进入一个while(1)的循环语句,在这个循环中,我们进行对链表头的判空工作。如果链表头不为空,则读取第一个节点的内容,把借点中的内容解析出来,把解析出来的内容作为参数传到sqlite_task函数中,完成相应的数据库操作并释放节点空间,如此循环;如果链表头为空,则直接跳出while(1)循环,再回到外部循环的pthread_cond_wait函数进行睡眠等待,等待下一次被其他线程唤醒。(2)sqlite_task()结构图

21、在上面的pthread_sqlite线程流程图中,提到了sqlite_task函数。它用来完成读取节点信息之后的数据库操作.对数据库的操作主要是读取sqlite_operation结构中成员变量来完成的.通过sqlite_operation中的table_select_mask来判断是对数据库中的哪个表进行操作,然后再分别通过env_operation_mask、table_operation_mask和goods_operation_mask来判断对选择的表进行什么具体的操作,例如,更新、查看和插入等等.3、数据库模块使用的相关结构体(1)结构体一:所有仓库的信息struct env_inf

22、o_clien_addrstruct storage_info storage_noSTORAGE_NUM;;作用:用来保存所有仓库的信息storage_noSTORAGE_NUM结构体数组,分别代表不同的存库信息。(2)结构体二:某个仓库的所有信息struct storage_infounsigned char storage_status;/ 0:open 1:closeunsigned char led_status;unsigned char buzzer_status;unsigned char fan_status;unsigned char seg_status;signed c

23、har x;signed char y;signed char z;char samplingTime20;float temperature;float temperatureMIN;float temperatureMAX;float humidity;float humidityMIN;float humidityMAX;float illumination;float illuminationMIN;float illuminationMAX;float battery;float adc;float adcMIN;struct storage_goods_info goods_inf

24、oGOODS_NUM;作用:用来保存某一个仓库的所有信息。storage_statusled_status上灯的开关状态buzzer_status蜂鸣器的开关状态fan_status风扇的开关状态seg_status数码管的状态x;三轴中X的数值y;三轴中y的数值z;三轴中z的数值samplingTime20;获取仓库环境信息的时间temperature;仓库中温度的大小temperatureMIN;仓库中温度的预警最小值temperatureMAX;仓库中温度的预警最大值humidity;仓库中湿度的大小humidityMIN;仓库中湿度的预警最小值humidityMAX;仓库中湿度的预警最

25、大值illumination;仓库中光照强度的大小illuminationMIN;仓库中光照强度的预警最小值illuminationMAX;仓库中光照强度的预警最大值battery;剩余电池的百分比adc;模数转换的数值adcMIN;模数转换的预警最小值goods_infoGOODS_NUM;结构体数组,分别代表不同的货物信息。(3)结构体三:某种货物的信息struct storage_goods_infounsigned char goods_type;unsigned int goods_count;;作用:用来保存某种货物的信息goods_type货物编号goods_count货物数量(

26、4)结构体四:struct sqlite_operationint table_select_mask;int env_operation_mask;int table_operation_mask;int goods_operation_mask;;作用:用来保存数据库操作信息table_select_mask;标记对数据库中的哪个表进行操作env_operation_mask;标记对数据库中的env表进行什么操作table_operation_mask;标记对数据库中的collect_env表进行什么操作goods_operation_mask;标记对数据库中的goods表进行什么操作4、

27、Sqlite3数据库中数据的存储形式表一:仓库环境表(environment)temperatureMax温度最大值当环境温度大于最大值,需要发送报警信号temperatureMin温度最小值当环境温度小于最小值,需要发送报警信号humidityMax湿度最大值当环境湿度大于最大值,需要发送报警信号humidityMin湿度最小值当环境湿度小于最小值,需要发送报警信号illuminationMax光照强度最大值当环境光照强度大于最大值,需要发送报警信号illuminationMin光照强度最小值当环境光照强度小于最小值,需要发送报警信号telephoneNum手机号报警之后发短信给管理员mod

28、eIfnociceIntervalupdatePeriodusername姓名仓库管理者姓名password密码进入仓库时的,需要密码验证表二:仓库环境温度表(collect_env)temperatureVal环境温度值这个一个实时数据,1秒采集一次humidityVal环境湿度值这个一个实时数据,1秒采集一次illuminationVal环境光照强度值这个一个实时数据,1秒采集一次envTime采集环境温度的时间采集环境温度的时候,保存采集时间,方便管理者进行数据分析表三:仓库货物表(goods)goodsId货物编号货物编号,是货物的唯一标识goodsCount货物数量仓库中所有货物的数

29、量goodsTime货物入库时间记录货物入库的时间5、pthread_sqlite。h文件详解(1)互斥锁及条件变量部分l extern pthread_cond_t cond_sqlite;解析:数据库线程部分的条件变量,pthread_cond_wait之后,当其他线程使用相同的条件变量才能唤醒数据库线程。程序实例:l extern pthread_mutex_t mutex_sqlite;解析:数据库线程锁,这个线程锁是和条件变量一起配套使用的。这两者在条件变量的使用中缺一不可。程序实例:l extern pthrea_mutex_t mutex_slinklist;解析:数据库线程锁,

30、这个线程锁是用来保护链表资源的。防止链表在同一时刻被多个对象访问。程序实例:(2)结构体部分l extern struct env_info_clien_addr env_info_clien_addr_s;解析:全局结构体变量,pthread_analysis线程对数据库进行查询操作之后把查询的结果保存到该结构体中,这样pthread_analysis线程就可以读取到数据库中的数据了。程序实例:l extern struct env_info_clien_addr all_info_RT;解析:全局结构体变量,pthread_analysis线程对数据库进行查询操作之后把查询的结果保存到该结

31、构体中,这样pthread_analysis线程就可以读取到数据库中的数据了。程序实例:(3)函数接口部分(具体的函数参数信息见文档数据库接口函数详解)l int Create_table (void); 解析:用于在数据库中创建空表.在main函数开始执行时,就要调用该函数创建好数据库表,以供后面的线程使用。l int Init_table_env (void);解析:用于初始化env表的数据。在main函数开始执行时,创建好数据库表之后就对调用该函数初始化env表.l int updateEnv (struct env_info_clien_addr env_info_clien_addr

32、_t, int storageNum_t); 解析:用于更新env表中的信息.l int getEnv (struct env_info_clien_addr *env_info_clien_addr_t, int storageNum_t); 解析:用于得到env表中的信息。l int insertCollect_env (struct env_info_clien_addr env_info_clien_addr_t, int storage_num);解析:用于向collect_env中插入新的仓库环境信息。l int getCollect_env (char itime_t, int

33、storage_num_t);解析:用于按指定时间获得collect_env表中的仓库环境信息.l int getCollect_Current_env (int storage_num_t);解析:用于获得最新的collect_env表中的仓库环境信息。l int insertGoods (struct env_info_clien_addr env_info_clien_addr_t, int storageNum_t, int goodsKinds_t); 解析:用于向goods表总插入新的货物信息.l int deletGoods (int storageNum_t, int good

34、sKinds_t); 解析:用于从goods表中删除指定的货物信息。l int getGoods (int storageNum_t, int goods_kinds_t); 解析:用于获得goods表中指定的货物信息。l int viewGoods (int storageNum_t, int goodsKinds_t);解析:用于查看goods表中是否有指定的货物信息.l int addGoods (struct env_info_clien_addr env_info_clien_addr_t, int storageNum_t, int goodsKinds_t);解析:用于货物入仓时

35、的goods表的更新。l int reduceGoods (struct env_info_clien_addr env_info_clien_addr_t, int storageNum_t, int goodsKinds_t);解析:用于货物出仓时的goods表的更新。l void sqlite_task(struct env_info_clien_addr env_info_clien_addr_t, struct sqlite_operation sqlite_operation_t, int storageNum_t, int goodsKinds_t);解析:用于专门执行对sqli

36、te3数据库操作的函数接口,通过读取函数参数来实现对sqlite3数据库中的具体表进行增、删、改、查的操作。第四节:数据接收模块1. 功能描述接收M0通过Zigbee传输上来的消息,经过接收端的Zigbee,再通过U转串,此线程负责从串口读取消息,并交给数据处理模块,并继续接收消息2. 数据描述类型名称功能intdev_uart_fd串口文件描述符linklistlinkHead数据缓存链表头pthread_cond_tcond_analysis数据处理模块唤醒条件变量pthread_mutex_tmutex_linklist数据缓存保护互斥锁3. 流程图4. 详细说明本线程被创建后,先打开串

37、口ttyUSB0这一设备节点,得到文件描述符dev_uart_fd,通过调用serial_init (dev_uart_fd)来进行串口的初始化;之后线程通过read串口进行睡眠,一旦有数据,就从串口里读取,并判断包头是否正确,若正确则读取数据,加入数据链表缓存.include link_list。hinclude data_global。hdefine LEN_ENV 20#define LEN_RFID 4 extern int dev_uart_fd;extern linklist linkHead;extern pthread_cond_t cond_analysis;extern p

38、thread_mutex_t mutex_linklist;void serial_init(int fd)struct termios options;tcgetattr(fd, options);/读取终端参数options.c_cflag |= ( CLOCAL CREAD );/忽略调制调解器线路状态,使用接收器options。c_cflag &= CSIZE;/清目前字符长度options。c_cflag = CRTSCTS;/不实用RTS/CTS流控制options.c_cflag = CS8;/字符长度设置为8options.c_cflag = CSTOPB; /设置1个标志位o

39、ptions。c_iflag = IGNPAR;/允许输入奇偶校验options.c_iflag = (ICRNL IXON);/回车不转为换行,不允许输入时对XON/XOFF流进行控制options.c_oflag = 0;options。c_lflag = 0;cfsetispeed(&options, B115200);/设置波特率为115200cfsetospeed(options, B115200);tcsetattr(fd,TCSANOW,&options);/设置终端参数void pthread_transfer (void *arg)int i = 0, len;char fl

40、ag = 0, check;link_datatype buf;linkHead = CreateEmptyLinklist ();if (dev_uart_fd = open (DEV_ZIGBEE, O_RDWR)) 0)perror (”open ttyUSB0);exit (1);serial_init (dev_uart_fd);printf (pthread_transfer is okn”);while (1)memset (buf, 0, sizeof (link_datatype);read (dev_uart_fd, &check, 1);if (check = s)che

41、ck = 0;read (dev_uart_fd, &check, 1);if (check = t)check = 0;read (dev_uart_fd, check, 1);if (check = :)check = 0;read (dev_uart_fd, check, 1);if (check = e)buf。msg_type = e;usleep(1);if (len = read (dev_uart_fd, buf.text, LEN_ENV) != LEN_ENV)for (i = len; i LEN_ENV; i+)read (dev_uart_fd, buf。text+i

42、, 1);flag = 1;else if (check = r)buf。msg_type = r;usleep(1);if ((len = read (dev_uart_fd, buf。text, LEN_RFID) != LEN_RFID)for (i = len; i LEN_RFID; i+)read (dev_uart_fd, buf.text+i, 1);flag = 1;if (1 = flag)pthread_mutex_lock (mutex_linklist);if (InsertLinknode (buf) = 1)pthread_mutex_unlock (mutex_

43、linklist);printf (”NONMEMn”);pthread_mutex_unlock (mutex_linklist);flag = 0;pthread_cond_signal (&cond_analysis);return 0;第五节:数据处理模块1. 功能描述处理接收到的信息,因为接收到的信息是按一定规律进行编码的,所以进行解码后,激活数据库线程,保存数据,激活内存刷新数据,更新实时环境信息,判断数据是否越界,若越界则激活设备控制线程进行相应的控制.2. 数据描述结构体名成员类型成员名称功能struct getEnvMsgunsigned charsto_no仓库号tem2温度hum2湿度x三轴yzunsigned intill光照battery电池电压比例adcADC电压比例struct getGoodsMsgunsigned charsto_no仓库号io进出标志goodsno货物编号goodsnum货物数量类型名称功能linklistlinkHead数据缓存链表头,用来读取数据slinkHead

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 应用文书 > 技术指导

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服