项目十四物联网技术综合实践

上传人:ta****u 文档编号:181526481 上传时间:2023-01-14 格式:DOC 页数:35 大小:607.50KB
收藏 版权申诉 举报 下载
项目十四物联网技术综合实践_第1页
第1页 / 共35页
项目十四物联网技术综合实践_第2页
第2页 / 共35页
项目十四物联网技术综合实践_第3页
第3页 / 共35页
资源描述:

《项目十四物联网技术综合实践》由会员分享,可在线阅读,更多相关《项目十四物联网技术综合实践(35页珍藏版)》请在装配图网上搜索。

1、项目十四智能电子商务配送系统功能扩展与实现一、教学目标1、掌握物联网综合实践开发技巧。2、掌握物联网综合实践开发流程。3、掌握物联网工程集成技术。二、教学内容14.1智能电子商务仓储配送系统项目任务单项目名称智能电子商务仓储物流配送系统开发任务内容任务1:企业一卡通系统及岀厂商品登记功能开发; 任务2:智能电子商务物流仓储拣货、备货、出库; 任务3:智能电子商务仓储环境参数监控功能开发; 任务4:货物在途跟踪与数据监测;任务5:货到签收及动态盘点功能开发。任务说明1、电子商务订货下达订单,订单中的货物在货架上显示标记。冋时在大学城职教新干线 相应的板块上加以展示。2、仓库拣货提醒、备货、出库扫

2、描等,出库时对接物流公共信息平台的综合配货系统, 将该条货源数据发布到物流公共信息平台上,同时在大学城职教新干线相应的板块上加 以展示。3、仓库环境参数监测,包括仓库温度、湿度、烟传感、视频监控等。仓管员可以通过智 能手机通过 WIFI或3G网络获取仓库内相应的环境参数数据。同时在大学城职教新干线 相应的板块上加以展示。4、 物流配送货物在途跟踪,对接物流公共信息平台的GPS One定位系统,GPS系统可查相应订单信息。货主或用户可通过PC端或智能手机通过 WIFI或3G网络获取货物在途的相应环境参数数据。同时在大学城职教新干线相应的板块上加以展示。5、货到签收,采用客户手机签收方案。对电子商

3、务系统智能仓库进行动态盘点,同时在 大学城职教新干线相应的板块上加以展示。使用设备及材料物联网应用开发实验台1套(包含主要设备:高频RFID读写器1台、多路复用器1台、高频RFID小天线8个、WSN工业级网关1台、温湿度传感器节点1个、乙gbee数码显示模块1个、串口通信数码管 8个、高频RFID电子标签 若干、智能仓储管理系统配套 开发教学资源包 1套),PC电脑1套,实验桌椅1套,智能手机8台。指导教师刘洋(主讲、北京京胜世纪物联网事业部部门经理),杨晓峰(助讲、湖南省物流公共信 息平台有限公司技术总监),班主任时间4天提交资料1、实训报告;2、设计文档。送系统当前的仓储配送系统借助于传统

4、的人工管理方法和手段,数据的采集和录入一直都是手工操作,效率低14.2智 能 电 子 商 务 仓 储 配 送 系 统 需 求 概 述 智 能 电 子 商 务 仓 储 配下、差错率高,且资产实物信息与管理系统信息无法实时同步RFID技术作为物理世界与现有IT系统的桥梁,可将资产日常管理活动与资产管理系统有效的整合在一起,从而达到实物信息与系统信息的实时同步一致。通过RFID这项新技术实现远程、动态、实时的资产数据采集,替换传统资产管理方式的前台人工数据采集,更 好的与后台计算机数据库结合,实现对日常管理中的资产新增、调拨和盘点等信息进行实时监控、记录和自动更新,同时采集人员信息,从而避免因人为因

5、素造成的信息失真引起管理效能的下降,为单位领导、网络规划投资与设计等部门提供更准确、 实时的网络资产实物信息,提高资产使用效率,有效降低和控制日常管理和生产成本,从而创造良好的社会及经济效益图 14-1 智能电子商务仓储配送系统框架图14.3 智能电子商务仓储配送系统开发环境准备(1)安装 SQL Sever 2005 (省略);(2)安装 Visual Studio 2010 (省略);( 3)安装 PowerDesigner (省略)。14.4 智能电子商务仓储配送系统功能设计 主要包括出厂商品登记、环境参数监控、商品入库、商品出库、入库/ 拣货提醒、商品监控和动态盘点出厂商品登记:针对于

6、桌面读写器对 RFID 多卡的操作。 实现对多卡卡号的读取。同时对多卡进行信息的写入。 根据实际情况对写入信息进行校验。环境参数监控:通过 WSN 无线传感网络的温湿度节点获取当前环境的温度和湿度,并在程序界面上显示。 商品入库:通过桌面读写器进行商品入库操作。自动生成入库单号以“ i”开头,最初的入库单号为“”为13位。通过桌面读写器进行多卡识别并进行绑定内容包括一级分类、二级分类、商品名称、规格型号、商品 编码、单位、货位。自动为入库商品分配货位。显示入库商品数量。 打印入库单,入库单内容包括商品名称、所分配货架、商品数量。 在入库单右下角显示条形码,在条码下方显示条码值。商品出库: 通过

7、复用读写器进行出库操作。自动生成岀库单号以“ 0”开头,最初的岀库单号为“”为13位。可选择商品名称、所在货位、出库数量。对岀库商品进行绑定包括商品卡号、商品名称、数量、所在货位编号。 打印岀库单,岀库单内容包括商品名称、所在货位、商品数量。 在岀库单右下角显示条形码,在条码下方显示条码值。入库 /拣货提醒: 通过入库单或岀库单对货架进行操作实现智能岀库或入库。 通过条码枪扫描打印好的岀库单或入库单判断岀库还是入库。 对岀库或入库商品进行绑定显示并显示数量,对要操作的货位使其指示灯亮起。 岀库或入库完成后指示灯熄灭。商品监控:对货架的整体监控。 对货架进行整体实时监控。 绑定每个货位的商品信息

8、,包括商品卡号和名称,并绑定数量。 当货架上的商品数量与库存数量不同时,指示灯亮起。动态盘点:对货架的盘点操作。 绑定商品的名称、库存数量和实际数量。对比库存数量和实际数量。 显示盘点结果。14.5智能电子商务仓储配送系统数据库设计图14-2数据库表结构汇总展示14.6智能电子商务仓储配送系统程序设计注:因为给合实践项目所涉及的程序代码比较多,以下只将关键代码信息列岀来,关于变量定义、串口打开与 关闭、构造函数、一些操作事件都在教学资源中提供。1、出厂商品登记(1 )界面设计图14-3岀厂商品登记界面(2)窗体属性设置向控件中添加 2个groupbox控件,6个标签,6个textbox , 4

9、个按钮和1个添加滚动条的 textbox控件。(3)编写后 台代码 获取读取到 的卡号的泛 型集合。控件名称NameTextgroupboxgbCardsID商品标签groupboxgbGoods Info商品信息控件名称NameTextLabellblCategory一级分类LabellblType二级分类LabellblName商品名称LabellblSpecificati on规格型号LabellblCode商品编码LabellblU nit单位控件名称NameTextTextboxlblCategoryTextboxlblTypeTextboxlblNameTextboxlblSpec

10、ificati onTextboxlblCodeTextboxlblU nit控件名称NameScrollBarsTexttxtCardsIDVertical控件名称NameTextButt onbtn ReadCardsID读卡IDButt onbt nClearCardsID清空(商品标签中)Butt onbtn WriteCard:写卡Butt onbtn ClearI nfo清空(商品信息中)进行校验。/获取ID的泛型集合方法/v/summaryprivate voidGetID()/VCPOGetCardNumberMultiple()读写器读取多卡 卡号方法校验方法, 对写入信息/

11、 /写入信息校验/ / v/retur nsprivate bool Check In put()MessageBox.Show( 级分类不能为空!);return false;MessageBox.Show( 二级分类不能为空! ); return false;MessageBox.Show( 商品名称不能为空! ); return false;MessageBox.Show( 规格型号不能为空! ); return false;MessageBox.Show( 商品编码不能为空! ); return false;MessageBox.Show( 单位不能为空! ); return fals

12、e;elsereturn true;窗体载入事件,打开读写器连接串口。/ / 窗体载入事件/ / / private void frmInitReg_Load(object sender, EventArgs e)OpenRFID();读卡按钮事件,每条卡号分别占一行,所以在添加是后要跟“rn ”换行。/ / 读卡按钮事件/ / / private void btnReadCardsID_Click(object sender, EventArgs e)txtCardsID.Text = ;GetID();for (int i = 0; i cardNo.Count; i+)txtCardsI

13、D.Text += cardNoi + rn;商品标签清空按钮事件/ / 清空 ID 按钮事件/ / / private void btnClearCardsID_Click(object sender, EventArgs e)txtCardsID.Text = ;写卡按钮事件/ / 写卡按钮事件/ / / private void btnWriteCard_Click(object sender, EventArgs e)if (CheckInput()for (int i = 0; i cardNo.Count; i+) +stri ng in formation = txtCatego

14、ry.Text + ” + txtType.Text + + txtName.Text + txtSpecification.Text + + txtCode.Text + + txtUnit.Text;MessageBox.Show( 写入成功! );商品信息清空按钮/ / 清空信息按钮事件/ / / private void btnClearInfo_Click(object sender, EventArgs e)if (c is TextBox)c.Text = ; 2、环境参数监控(1 )界面设计窗体StartPositi on属性MaximizeBox属性Mini mizeBox属

15、性FormBorderStyle属性Text属性frmGoodsOutCen terPare ntFalseFalseFixedS in gle环境参数监控图14-4环境参数监控界面(2)窗体属性设置控件Name属性Text属性LablelblTemperature温度:LableLabel1温度:LablelblHumidity湿度:LableLabel2湿度:LablelblE nvrio nmen tValue0LablelblE nvrio nmen tValue10LablelblHumidityValue0LablelblHumidityValue10控件Name属性Text属性G

16、roupBoxgbE nviro nmen tParam环境参数本信息设置 Lable控件属性设置GroupBox控件属性(3)编写后 台代码: 获取节点的 基本信息, 向对应的节 点发送了信 息后,节点 会返回信 息。即可获 取节点的基/ III Sensor_Read 指令/ / vparam n ame=se nderx/param/ vparam n ame=eprivate void Sen sorRead()trythis.time = 0;/获取流水号/实例化节点泛型List nodeList = new List();/实例化节点GRIP_Node n ode = new GR

17、IP_Node();/获取节点编号n ode.lEEEAddress = dtb.RowsiIEEEAddress.ToStri ng();/获取节点地址n ode.ShortAddress = Con vert.ToUI nt16(10255, 16);n ode.ShortAddress = Con vert.ToUI nt16(dtb.RowsiShortAddress.ToStri ng(), 16);/将节点信息添加到节点泛型中no deList.Add( no de);/将节点数量转换成byte类型byte deviceCou nt = Con vert.ToByte (no de

18、List.Cou nt);/将节点类型转换成byte类型byte sen sorClass = Con vert.ToByte(dtb.RowsiNodeClass);/将节点型号转换成byte类型UInt16 sensorType = Convert.ToUInt16(dtb.RowsiNodeType.ToString(), 16);/读取数据GRIP_MessageBody_Sensor_Read msgBodySend = new GRIP_MessageBody_Sensor_Read(deviceCount, sensorClass, sensorType, nodeList);/

19、获取发送的消息GRIP_MessageHead msgHeadSend = new GRIP_MessageHead(msgBodySend.BodyLength, (UInt16)GRIP_Message_CommandID.NWM_SENSOR_READ, this.sequenceID_T1);/ 获取发送的数据包的 byte 数组int lenSend = 0;/Socket 发送消息SendMsg(this.socket_T1, msgSend, Sensor_Report_Resp);/ 接收消息的长度的 byte 数组byte msgRecv = new byte(int)GRI

20、P_MessageBody_Length.HEADLENGTH + (int)GRIP_MessageBody_Length.SENSOR_READ_RESP_LENGTH;int lenRecv = 0;/Socket 接收消息RecvMsg(this.socket_T1, msgRecv, Sensor_Report);/实例化接收的消息头GRIP_MessageHead msgHeadRecv = new GRIP_MessageHead();/实例化接收的消息体GRIP_MessageBody_Sensor_Read_Resp msgBodyRecv = new GRIP_Messag

21、eBody_Sensor_Read_Resp();/获取接收的数据包信息/判断消息体长度和流水号if (msgHeadRecv.MessageLength = (UInt16)GRIP_MessageBody_Length.SENSOR_READ_RESP_LENGTH & this.sequenceID_T1 = msgHeadRecv.SequenceID)/在控件中显示数据信息if (msgBodyRecv.Status = 0)GRIP_MessageBody_Sensor_Read_Resp msgBodyRecv1 = new GRIP_MessageBody_Sensor_Rea

22、d_Resp();this.sessionID = msgBodyRecv.SessionID;elsecatch (Exception ex)MessageBox.Show(Sensor_Read 指令错误: + ex.Message);编写线程方法,实时监控的线程方法,在该线程中使用的是对温湿度节点实时的读取并获取温湿度信息。#region T2_Threadprivate void Run()while (true)try#region T2_HeadGRIP_MessageHead msgHeadRecv = new GRIP_MessageHead();byte msgRecv_He

23、ad = new byte6;RecvMsg(this.socket_T2, msgRecv_Head, T2_Thread_Head_Recv); msgHeadRecv.GetHeadBytesOfRecive(msgRecv_Head, 0, 6); UInt16 messageLength = msgHeadRecv.MessageLength; UInt16 messageCommand = msgHeadRecv.MessageCommand; UInt16 sequenceID = msgHeadRecv.SequenceID;#endregion#region T2_Heart

24、Beatif (messageCommand = (UInt16)GRIP_Message_CommandID.NWM_HEARTBEAT)GRIP_MessageHead msgHeadSend = new GRIP_MessageHead(0, (UInt16)GRIP_Message_CommandID.NWM_HEARTBEAT_RESP, sequenceID);byte msgSend = msgHeadSend.GetHeadBytesOfSend();SendMsg(this.socket_T2, msgSend, T2_HeartBeat);#endregion#region

25、 T2_Status_Reportif (messageCommand = (UInt16)GRIP_Message_CommandID.NWM_STATUS_REPORT)GRIP_MessageBody_Status_Report msgBodyRecv = new GRIP_MessageBody_Status_Report();byte msgRecv_Body = new bytemsgHeadRecv.MessageLength;RecvMsg(this.socket_T2, msgRecv_Body, Status_Report); msgBodyRecv.ConvertReci

26、veBytes(msgRecv_Body);GRIP_MessageBody_Status_Report_Resp msgBodySend = new GRIP_MessageBody_Status_Report_Resp(0);GRIP_MessageHead msgHeadSend = new GRIP_MessageHead(msgBodySend.BodyLength, (UInt16)GRIP_Message_CommandID.NWM_STATUS_REPORT_RESP, sequenceID);byte msgSend = this.msg_T2.GetSendMessage(

27、msgHeadSend, msgBodySend);SendMsg(this.socket_T2, msgSend, Status_Report_Resp);if (msgBodyRecv.SessionID = this.sessionID)bool isExist = false;if (msgBodyRecv.SensorClass = 3 | msgBodyRecv.SensorClass = 5)if (flag = 2)isExist = true;elseisExist = false;if (!isExist)ShelfNode shelfNode = new ShelfNod

28、e();byte sensorClass = msgBodyRecv.SensorClass; UInt16 sensorType = msgBodyRecv.SensorType; count += 1;#endregion#region T2_Sensor_Reportif (messageCommand = (UInt16)GRIP_Message_CommandID.NWM_SENSOR_REPORT)GRIP_MessageBody_Sensor_Report msgBodyRecv = new GRIP_MessageBody_Sensor_Report();byte msgRec

29、v_Body = new bytemessageLength; RecvMsg(this.socket_T2, msgRecv_Body, Sensor_Report); msgBodyRecv.ConvertReciveBytes(msgRecv_Body);GRIP_MessageBody_Sensor_Report_Resp msgBodySend = new GRIP_MessageBody_Sensor_Report_Resp(0);GRIP_MessageHead msgHeadSend = new GRIP_MessageHead(msgBodySend.BodyLength,

30、(int)GRIP_Message_CommandID.NWM_SENSOR_REPORT_RESP, sequenceID);byte msgSend = this.msg_T2.GetSendMessage(msgHeadSend, msgBodySend); SendMsg(this.socket_T2, msgSend, Sensor_Report_Resp);if (this.sessionID = msgBodyRecv.SessionID)List iEEEAddress = new List();for (int i = 0; i iEEEAddress.Count; i+)

31、ObjClass.ObjCargoNode ocn = new ObjClass.ObjCargoNode(); ocn.Insert();if (k 1) ShowLabelMessage(this.lblEnvrionmentValue, (GRIP_SensorData)msgBodyRecv.Data).Temp_H.ToString() + . (GRIP_SensorData)msgBodyRecv.Data).Temp_L.ToString() + C ?);ShowLabelMessage(this.lblHumidityValue, (GRIP_SensorData)msgB

32、odyRecv.Data).Humi_H.ToString()+.(GRIP_SensorData)msgBodyRecv.Data).Humi_L.ToString() + %);elseShowLabelMessage(this.lblEnvrionmentValue1, (GRIP_SensorData)msgBodyRecv.Data).Temp_H.ToString()+.(GRIP_SensorData)msgBodyRecv.Data).Temp_L.ToString() + C ?);ShowLabelMessage(this.lblHumidityValue1, (GRIP_

33、SensorData)msgBodyRecv.Data).Humi_H.ToString()+.(GRIP_SensorData)msgBodyRecv.Data).Humi_L.ToString() + %);break;#endregion#region T2_Event_Reportif (messageCommand = (UInt16)GRIP_Message_CommandID.NWM_EVENT_REPORT)newnewnewGRIP_MessageBody_Event_ReportmsgBodyRecv=GRIP_MessageBody_Event_Report();byte

34、 msgRecv = new bytemessageLength;RecvMsg(this.socket_T2, msgRecv, T2_Event_Report); msgBodyRecv.ConvertReciveBytes(msgRecv);GRIP_MessageBody_Event_Report_RespmsgBodySend=GRIP_MessageBody_Event_Report_Resp(0);GRIP_MessageHeadmsgHeadSend=GRIP_MessageHead(msgBodySend.BodyLength,(UInt16)GRIP_Message_Com

35、mandID.NWM_EVENT_REPORT_RESP, sequenceID);byte msgSend = this.msg_T2.GetSendMessage(msgHeadSend, msgBodySend);SendMsg(this.socket_T2, msgSend, T2_Event_Report_Resp);#endregioncatch (Exception ex)MessageBox.Show(Thread_T2_Error! + ex);40秒时发送一个空的心跳包。并接收心跳包方法,为了防止在没有通信的时候网关将连接的用户踢岀连接,在 返回信息。#regi on T1

36、_HeartBeatprivate void timer1_Tick(object sen der, Eve ntArgs e)this.sec on d+;if (this.sec ond = 5)/这里是为了将放回的温湿度节点的信息显示,每隔5秒将程序界面的信息进行更新。重新显示温湿度信息。this.Refresh();if (this.sec ond = 40)trythis.seque ncelD_T1 = this.msg_T1.GetSeque ncelD();GRIP_MessageHeadmsgHeadSe nd=newGRIP_MessageHead(0,(in t)GRIP

37、_Message_Comma ndlD.NWM_HEARTBEAT, this.seque ncelD_T1);byte msgSe nd = msgHeadSe nd.GetHeadBytesOfSe nd();SendMsg(this.socket_T1, msgSend, T1_HeartBeat);GRIP_MessageHead msgHeadRecv = new GRIP_MessageHead();byte msgRecv = new byte6;RecvMsg(this.socket_T1, msgRecv, T1_HeartBeat_Resp);msgHeadRecv.Get

38、HeadBytesOfRecive(msgRecv, 0, 6);if (msgHeadRecv.Seque ncelD = this.seque ncelD_T1)this.sec ond = 0;elseMessageBox.Show(T1_HeartBeat_Resp_Seque ncelD_Error!);catch (Excepti on ex)MessageBox.Show(T1_HeartBeat_Error!+ex.Message);#en dregi on3、商品入库在商品入库的操作前,我们需要编写一个类来将要处理的对象进行封装。如:入库单,每个货物的信息等。(1 )界面设计

39、图14-5商品入库界面(2)修改控件属性设置控件名称NameTextLabellbll nCode:入库单号:LabellblNum数量:LabellblGoodsI nDetail入库详单:控件名称NameReadO nlyTextBoxtxtln CodeTrueTextBoxtxtNumTrue控件名称NameTextButt onbtn Pri nt入库单打印Butt onbt nOk确定Butt onbtn Clear清空索引号NameText0colCategory一级分类1colType二级分类2cloName商品名称3colSpecificati on规格型号4colCode商

40、品编码5colU nit单位6colCargo货位商品入库(3)模块编 写后台代码 定义私有变 量,接口类 需要实例化 两次,不同 名称,因为 在调用过程 中打开后读 写器串口后 无法对复用 器的方法进 行调用:获取商品数 量,读取到 的卡号的数 量:/ /获取商品数量/ private void GetNumber()对扫描的货物做操作,界面显示,货位分配任务的方法:/ /对扫描的货物做操作,界面显示,货位分配任务/ private void AllocateLocati on()bool isOk = true;if (cardNoi = lsvGoodsI nDetail.ltemsj.

41、Tag.ToStri ng() isOk = false;if(isOk)int cargo = distributeCargo();Bin dListview(cardNoi, cargo); elseint cargo = distributeCargo();BindListview(cardNoi, cargo);elseMessageBox.Show( 没有检测到货物,请检查 );自动为商品分配货位,设定分配货位每个货位最多存放 6 个商品。分配货位/ / 货位分配/ / private int distributeCargo()int cargo = 0;for (int k = 1

42、; k = 8; k+)int lsvNum = 0; lsvNum += 1;if (lsvNum + StatusNum1 + StatusNum2 6)cargo = k; break;if (k = 8)MessageBox.Show( 货架上应该存放的货物数量已满,请查看 );return cargo;绑定 ListView 的方法/ / 绑定 ListView 控件方法/ private void BindListview(string goods,int goodsCargo)try str in g in formati on = value.Split( );goodsCat

43、egory = information0;goodsType = information1;goodsName = information0;/goodsSpecification 信息是货物的保质期,这里为了演示我们可以直接添加上一个值。货物有 其它的信息是也是可以再进行添加的。goodsSpecification = 12;goodsCode = information2;unit = information3;ListViewItem item = new ListViewItem(new string goodsCategory, goodsType, goodsName, goods

44、Specification, goodsCode, unit, goodsCargo.ToString() );item.Tag = goods;catch(Exception ex)MessageBox.Show( 商品 RFID 卡中尚未录入信息! + ex.Message);生成入库单号方法/ / 生成入库单号/ private string GenerateCode()/code = I + Num.ToString();string code = ;string codeLast = ;if (codeLast=)code = i + codeNo.ToString();elseco

45、deNo = Convert.ToInt64(codeLast.Substring(1, 12);code = i + (codeNo + 1).ToString();return code;窗体载入事件,打开串口,启动 timer 控件/ / 窗体载入事件/ / / private void frmGoodsIn_Load(object sender, EventArgs e)OpenRFID();txtInCode.Text = GenerateCode();/ / 入库单打印按钮事件/ / / private void btnPrint_Click(object sender, Even

46、tArgs e)elseMessageBox.Show( 无数据! );/ / 确定按钮事件 ,此处完成了相关信息的数据库绑定添加/ / / private void btnOk_Click(object sender, EventArgs e)ObjClass.GoodsInInfo gii = new ObjClass.GoodsInInfo();/GoodsInInfo 表操作, GoodsInCode 这里是入库单的条码 gii.Insert();ObjClass.ObjGoodsInDetail gid = new ObjClass.ObjGoodsInDetail(); gid.C

47、ardNum = lsvGoodsInDetail.Itemsi.Tag.ToString(); gid.GoodsCategory = lsvGoodsInDetail.Itemsi.SubItems0.Text; gid.GoodsType = lsvGoodsInDetail.Itemsi.SubItems1.Text; gid.GoodsName = lsvGoodsInDetail.Itemsi.SubItems2.Text; gid.GoodsSpecification = 12;gid.GoodsCode = lsvGoodsInDetail.Itemsi.SubItems4.T

48、ext; gid.Unit=lsvGoodsInDetail.Itemsi.SubItems5.Text;gid.Cargo = Convert.ToInt32(lsvGoodsInDetail.Itemsi.SubItems6.Text); int id=gii.InsertGoodsInDetail(gid);gii.GoodsInDetail(gii.ID,id);MessageBox.Show( 商品入库登记完成 );/ / 清空按钮事件/ / / private void btnClear_Click(object sender, EventArgs e)/ / 关闭窗体事件/ /

49、/ private void frmGoodsIn_FormClosing(object sender, FormClosingEventArgs e)CloseRFID();/ / timer 控件事件/ / / private void timer1_Tick(object sender, EventArgs e)GetNumber();AllocateLocation();出库单绘制事件/ / 出库单绘制事件/ / / private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)Graphics g

50、= e.Graphics;List list1 = new List();string row1 = new string ;string header = new string 商品名称 , 所在货架 , 商品数量 ;Pen pen = new Pen(Brushes.Black, 3);row1 = new string lsvGoodsInDetail.Itemsi.SubItems2.Text.ToString(), lsvGoodsInDetail.Itemsi.SubItems6.Text.ToString(), 1 ;int x = 100;int y = 300;Font fo

51、nt = new Font( 宋体 , 20);Point point1 = new Point(x, y + i * 30);/ 横向起点Point point2 = new Point(x + 600, y + i * 30);/ 横向终点Point pointLine3 = new Point(x, y + 10 + (i + 1) * 30);/左边线纵向终点Point pointLine4 = new Point(x + 600, y + 10 + (i + 1) * 30);/右边线纵向终点Point point7 = new Point(x + 40 + 2, y + 2 + i

52、 * 30);/ 左侧文字起点Point point8 = new Point(x + 190 + 102, y + 2 + i * 30);/中间文字起点Point point9 = new Point(x + 290 + 202, y + 2 + i * 30);/右侧位子起点/最后一条线 g.DrawL in e(pe n, pointLin e3, pointLin e4);横线g.DrawString(row10, font, Brushes.Black, point7);g.DrawString(row11, font, Brushes.Black, point8);g.DrawS

53、tring(row12, font, Brushes.Black, point9);Point pointLine1 = new Point(100, 280);Point pointLine2 = new Point(700, 280);Point pointTitle = new Point(200 + 102, 100 + 2 + 30);Font titlefont = new Font(宋体, 40);Font headerfont = new Font(宋体, 20);Point pointHeader1 = new Point(142, 204 + 30);Point pointHeader2 = new Point(342, 204 + 30);Point pointHeader3 = new Point(542, 204 + 30);g.DrawL in e(pe n, pointLin e1, pointLin e2);g.DrawStri ng(header0, headerfo nt, Brushes.Black, poin tHeader1); g.DrawStr in g(header1, headerfo nt

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!