




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/sundae_meng软件设计题 目: 公司计薪系统 专 业计算机科学与技术学 生 姓 名班 级 学 号指 导 教 师指 导 单 位计算机学院软件工程系日 期2001教师评语 教师签名: 年 月 日成绩评定备 注一、 课题名称公司记薪系统功能内容:计算不同员工的薪水且不同的工作范围就会有不同的税收,可以设置员工的基本信息,在登录时用户需要密码。2、 课程内容和要求因为本课程的要求的功能对于一个公司是在过于简单,所以我自己的任务和目标如下:1任务和目标:(1). 三种员工的记薪方式:总经理的工资 = 基本工资 + 加班获得的津贴 - 缺勤的扣除 - 个人所得税;时薪人员的工资 = 工作小时数 * 每小时工资 + 加班获得的津贴 - 缺勤的扣除 - 个人所得税;销售人员的工资 =工作小时数 * 每小时工资 + 佣金 * 销售额 + 加班获得的津贴 - 缺勤的扣除 - 个人所得税。(2)员工基本信息的录入和修改:能够添加员工的基本信息,修改以及删除。用Access来保存员工的基本信息且能够在窗体上立即显示,而且如果员工的编号重复时能够包出错误信息。(3)员工的考勤和加班以及用户的添加员工工资的基本设置:在有关的窗体上添加的时候即时的把更新的内容存到数据库中。(4)查询工资:员工只能查询关于本人的工资信息,换个角度也就是关于权限的问题。(5). 关于年终奖金:能够间接地体现员工本身的敬业态度核对公司的贡献多少。(6)退出时的数据保存:对于数据库的操作问题,在上述的功能中已经实现。2. 个人进一步想要扩展的功能:工资信息用Excel的文件输出的报表功能,以及软件信息的帮助功能。3各功能的模块:基本模块如下:工资设置的模块,员工信息的模块,加班信息的模块,考勤信息的模块,医疗保险的模块,登陆信息的模块。三、 算法分析和流程图1开发环境: 开发工具Dephi 7.0,数据源文件Access。 2总体设计: 主要窗体:一个主窗体frmMain,一个登陆的窗体frmLogin,一个修改和增加登陆信息的窗体frmAdminLogin,一个增加用户的窗体frmAdminLoginAdd,一个修改用户密码的窗体frmAdminLoginModify,一个修改工种的窗体frmGz,一个修改加班类别的窗体frmJblb,一个修改缺勤类别的窗口frmQqlb,一个修改员工基本信息的窗体frmYgxx,一个修改考勤信息的窗体frmKqxx,一个修改医疗保险的窗体frmYlbx, 3数据设计:工种的数据表的设置:字段名称数据类型说明gz_id自动编号主键gz文本工种jbgz货币基本月工资津贴信息的数据表设置:字段名称数据类型说明jt_id自动编号主键yg_id数字jbsj日期/时间加班时间jbts数字加班天数jblb_id数字加班类别考勤信息的数据表设置:字段名称数据类型说明kq_id自动编号主键yg_id数字kqsj日期/时间考勤时间qqts数字缺勤天数qqlb_id数字缺勤类别年终奖金的数据表设置:字段名称数据类型说明nzjj_id自动编号主键yg_id数字员工编号nian数字年zj货币总计医疗保险的数据表设置字段名称数据类型说明ylbx_id自动编号主键yg_id数字ylfy货币医疗报销费bxfy货币保险费sj日期/时间时间缺勤类别的数据表的设置:字段名称数据类型说明qqlb_id自动编号主键qqlb文本缺勤类别jbgz货币扣除月工资ndxs数字扣除年度分红系数加班类别的数据表的设置:加班类别数据类型说明jblb_id自动编号主键jblb文本加班类别jbgz货币增加月工资ndxs数字增加年度分红系数年度效益的数据表的设置:字段名称数据类型说明ndxy_id自动编号主键ndxy货币年度效益nian数字年月工资信息数据表的设置:字段名称数据类型说明ygz_id自动编号主键yg_id数字员工编号nian数字年yue数字月jbgz货币原本工资gs数字工时sgz货币元/时jt货币津贴kc货币扣除bx货币医疗保险zj货币总计yj数字佣金xse数字销售额员工基本信息的数据表设置:字段名称数据类型说明yg_id自动编号主键ygh文本员工号、主键xm文本姓名gz_id数字工种bm文本部门gzsj日期/时间工作时间gs数字每月工时sgz数字元/时yj数字佣金xse数字销售额用户信息的数据表设置:字段名称数据类型说明uid文本用户名、主键Pwd文本用户密码Pwd_level文本用户权限界面的主要流程是这样的:然后主界面的各个子页面通过一些按钮来弹出各自所需的窗体。4 详细设计主界面的设计如下:主界面的组件主要是一个TpageControl,然后在这个TpageControl上一个个的添加页面,如上图所示,总共有9个页面,在工资标准设定的界面上有如下组件:TradioGroup,TDBGrid还有几个TspeedButton.里面有四个TDBGrid,每个都有三个TspeedButton,然后不同的TspeedButton对应不同的窗体显示,比如说在选中TradioGroup中的工种,然后按下其界面下的添加就会显示下面的窗体如果选其他的选项的话就会出现与之想对应的界面。其他与之相同的界面设计,这里就不多介绍了。在主界面的定义的组件有:TapplicationEvents,Tlabel,Timage,TbitBtn,Tbutton,TspeedButton,TDBGrid,Tsplitter,Tedit,TcomboBox,Tpanel,TtabSheet主界面里面定义的函数主要有以下: procedure showGzbz(Index: Integer);/工资标准设定窗体显示内容不同的函数 function AddDbData(frm: TfrmPBase): Boolean;/往数据库里面写数据的函数 function ModifyDbData(frm: TfrmPBase; ds: TDataSet): Boolean;/修改数据库 function DelDbData(ds: TDataSet): Boolean;/删除数据库里面的数据function IsHaveRelation(ds: TDataSet; field1, table2, field2: string):Boolean; /两个内容的比较 procedure CalcYgz();/计算月工资的函数procedure CalcNzjj();/计算年终奖金的函数还有一个比较不一样的是DataModule的建立,也就是实现各个窗体之间的数据连接。其里面包括ADO里面的组件:TADOConnection,TADOQuery,TdataSource。其最主要的功能就是用起连接数据库。TADOQuery用于使用SQL语句查询数据 ,TADOConnection用与联接数据库使用,然后每一个TADOQuery都有一个TdataSource与之相连接,且要把数据表中的各个属性给添加进TADOQuery的fields里面。四 主要部分源程序工资标准设定也面不同显示的代码 procedure TfrmMain.showGzbz(Index: Integer); procedure showcontrol(Index: Integer; show: Boolean); begin case Index of 0:begin /选不同选相时显示界面的不同,按钮和页面与之相对应 dbgrd1.Visible := show; btn1.Visible := show; btn2.Visible := show; btn3.Visible := show; end; 1:begin /选择加班时显示的页面 dbgrd2.Visible := show; btn4.Visible := show; btn5.Visible := show; btn6.Visible := show; end; 2:begin /选择缺勤时显示的页面 dbgrd3.Visible := show; btn7.Visible := show; btn8.Visible := show; btn9.Visible := show; end; 3:begin /选择年度效益时显示的页面 dbgrd4.Visible := show; btn10.Visible := show; btn11.Visible := show; btn12.Visible := show; end; end; end;begin case Index of 0:begin/显示工种设置的信息,其他屏蔽,其他类似 showcontrol(1, False); showcontrol(2, False); showcontrol(3, False); showcontrol(0, True); end; 1:begin showcontrol(0, False); showcontrol(2, False); showcontrol(3, False); showcontrol(1, True); end; 2:begin showcontrol(0, False); showcontrol(1, False); showcontrol(3, False); showcontrol(2, True); end; 3:begin showcontrol(0, False); showcontrol(1, False); showcontrol(2, False); showcontrol(3, True); btn10.Visible := False; / 不能更改企业年度效益 btn11.Visible := False; btn12.Visible := False; end; end;end;/ 添加资料的函数function TfrmMain.AddDbData(frm: TfrmPBase): Boolean;begin frm.strState := N; / 这几个函数都是继承了另外一个窗体TPBase上的信息 if mrOk = frm.ShowModal then Result := True else Result := False;end;/ 修改资料的函数function TfrmMain.ModifyDbData(frm: TfrmPBase; ds: TDataSet): Boolean;begin Result := False; if ds.RecordCount 0 then begin /当数据库中有内容可以修改的时候 frm.strState := M; if mrOk = frm.ShowModal then /是否按下确定 Result := True; end else Application.MessageBox(没有可以修改的信息。, PChar(Application.Title),MB_OK + MB_ICONINFORMATION); /没有可以提供修改消息的时候出现提示对话框end;/ 删除资料function TfrmMain.DelDbData(ds: TDataSet): Boolean;begin Result := False; if ds.RecordCount 0 then begin /看数据库中是否还有信息 if Application.MessageBox(是否要删除此信息?, PChar(Application.Title), MB_YESNO + MB_ICONQUESTION) = IDYES then /提示是否删除数据 begin ds.Delete;/删除数据 Result := True; end; end else Application.MessageBox(没有可以删除的信息。, PChar(Application.Title), MB_OK + MB_ICONINFORMATION); /没有可以删除的信息时应该有报错end;/IsHaveRelation函数functionTfrmMain.IsHaveRelation(ds: TDataSet; field1, table2, field2: string):Boolean;var v: Variant; q: TADOQuery;begin Result := False; if ds.RecordCount 0 then begin /判断数据库中是否为空 if dsfield1 null then begin/判断数据库中的第一个属性是否为空 v := dsfield1; q := TADOQuery.Create(nil); q.Connection := dm.con1; /进行数据库的链接 q.SQL.Text := select+field2+from+table2+where+field2+ = :field2; q.Parameters.ParamByName(field2).Value := v; q.Prepared := True; q.Open; if q.RecordCount 0 then /判断是否有数据 Result := True; q.Close; q.Free; end; end;end;/ 计算月工资procedure TfrmMain.CalcYgz();var id, n, y, r: string; sql: string; qry: TADOQuery; jbgz, jt, kc, bx, zj,gs,sgz,yj,xse: Double;begin id := dm.qryYgxxyg_id; /将员工信息中的员工号赋值给id n := edt1.Text; y := IntToStr(cbb1.ItemIndex+1); r := IntToStr(DaysInAMonth(StrToInt(n), StrToInt(y); / 删除旧数据 sql := delete +from ygz +where nian=+n+ and yue=+y+ and yg_id=+id;/将月工资那个页面里面的值给删掉 dm.con1.Execute(sql); dm.qryYgz.Close; dm.qryYgz.Open; qry := TADOQuery.Create(nil); qry.Connection := dm.con1; / 查找原本工资 sql := SELECT Sum(gz.jbgz+ygxx.gs*ygxx.sgz+ygxx.yj*xse) AS jbgz +FROM gz INNER JOIN ygxx ON gz.gz_id = ygxx.gz_id +WHERE (ygxx.yg_id)=+id+); ; /原本工资的算法 qry.SQL.Text := sql; qry.Open; jbgz :=qry.FieldByName(jbgz).AsFloat; /将jbgz里的内容转换 qry.Close; / 计算津贴 sql := SELECT Sum(jtxx.jbts * jblb.jbgz) AS jt +FROM jblb INNER JOIN jtxx ON jblb.jblb_id=jtxx.jblb_id+WHERE(jtxx.yg_id)=+id+)AND(jtxx.jbsj)=#+y+/1/+n+#) AND +(jtxx.jbsj)=#+y+/1/+n+#) AND + (kqxx.kqsj)=#+y+/1/+n+#) AND +(ylbx.sj)=#+y+/+r+/+n+#); ; /保险和报销的算法 qry.SQL.Text := sql; qry.Open; bx :=qry.FieldByName(bx).AsFloat; /对保险和报销的结果进行变量类型的转换 qry.Close; qry.Close; qry.Free; / 计算总计 zj := jbgz + jt - kc - bx;/这个用来计算不同工资的税收算法 if zj0 then if zj 800 then if zj1000 then if zj =5000 then zj := zj * 0.9 /工资在1000到5000之间的情况 else zj := zj * 0.8; /工资大于5000的情况 /将算好的数据写入数据库 dm.qryYgz.Append; dm.qryYgzyg_id := StrToInt(id); dm.qryYgznian := StrToInt(n); dm.qryYgzyue := StrToInt(y); dm.qryYgzjbgz := jbgz; dm.qryYgzjt := jt; dm.qryYgzkc := kc; dm.qryYgzbx := bx; dm.qryYgzzj := zj; dm.qryYgz.Post;end;/ 月工资报表procedure TfrmMain.btn28Click(Sender: TObject);var sql, n, y, filename: String; qry: TADOQuery; i, z: Integer; ExcelApp: Variant; sheet, template: Variant;begin try StrToInt(edt1.Text); except Application.MessageBox(请输入正确的年份, PChar(Application.Title), MB_OK + MB_ICONWARNING); /看是否和已有的工资信息的年分是否相同 exit; end; n := edt1.Text; y := IntToStr(cbb1.ItemIndex+1); qry := TADOQuery.Create(nil); qry.Connection := dm.con1; sql := SELECT ygxx.yg_id +FROM ygz INNER JOIN ygxx ON ygz.yg_id = ygxx.yg_id +WHERE (ygz.nian)=+n+) AND (ygz.yue)=+y+); / 是否生成了月工资 qry.SQL.Text := sql; qry.Open; z := qry.RecordCount; qry.Close; if z=0 then begin qry.Free; Application.MessageBox(请生成月工资记录,然后使用报表功能。, PChar(Application.Title), MB_OK + MB_ICONINFORMATION);/没有可以报表的工资信息 exit; end;try pb1.Min := 0; pb1.Max := z+4;pb1.Step := 1;pb1.Position := 0;pb1.Visible := True; pgc1.Enabled := False; Screen.Cursor := crHourGlass;创建 Excel 例程 ExcelApp := CreateOleObject(Excel.Application); ExcelApp.Visible := False; filename := ExtractFilePath(Application.ExeName) + templateygz.xls; ExcelApp.WorkBooks.Open(filename); sheet := ExcelApp.WorkBooks1.Sheets1; template := ExcelApp.WorkBooks1.Sheets2; ExcelApp.Caption := ExcelApp.WorkBooks1.Sheets1.Name+报表; pb1.StepIt; CopyRange(template, 1,1, 8,3, sheet, 1,1); / 复制模板样子 FillValue(sheet, 1,8, Sheet.Cells1,8.Value+n+年+y+月,0,False); / 填写日期 pb1.StepIt; sql := SELECT ygxx.ygh, ygxx.xm, gz.gz, ygz.jbgz, ygz.jt, ygz.kc, ygz.bx, ygz.zj +FROM gz INNER JOIN (ygz INNER JOIN ygxx ON ygz.yg_id = + ygxx.yg_id) ON gz.gz_id = ygxx.gz_id + WHERE (ygz.nian)=+n+) AND (ygz.yue)=+y+) +ORDER BY ygxx.bm, gz.gz, ygxx.xm; / 统计月工资 qry.SQL.Text := sql; qry.Open; pb1.StepIt; i := 4; while not qry.Eof do begin Application.ProcessMessages; FillValue(sheet, i,1, qry.FieldByName(ygh).AsString,3); / 填写数据 FillValue(sheet, i,2, qry.FieldByName(xm).AsString,3); FillValue(sheet, i,3, qry.FieldByName(gz).AsString,3); FillValue(sheet, i,4, qry.FieldByName(jbgz).AsFloat); FillValue(sheet, i,5, qry.FieldByName(jt).AsFloat); FillValue(sheet, i,6, qry.FieldByName(kc).AsFloat); FillValue(sheet, i,7, qry.FieldByName(bx).AsFloat); FillValue(sheet, i,8, qry.FieldByName(zj).AsFloat); qry.Next; Inc(i); pb1.StepIt; end; filename := ExtractFilePath(Application.ExeName) + 报表+n+.+y+ 员工月工资报表.xls; / 保存报表 if FileExists(filename) then DeleteFile(filename); ExcelApp.DisplayAlerts := False; template.Delete; ExcelApp.WorkBooks1.SaveAs(filename); pb1.StepIt; ExcelApp.Visible := True; sheet.PrintPreview; / 打印预览 ExcelApp.WorkBooks.Close; ExcelApp.Quit; / 结束except on E: Exception do begin ExcelApp.WorkBooks1.Saved := True; ExcelApp.WorkBooks.Close;ExcelApp.Quit; Application.MessageBox(PChar(E.Message + #13+#13+ 生成报表失败), PChar(Application.Title), MB_OK + MB_ICONSTOP); end;end; pgc1.Enabled := True;Screen.Cursor := crDefault;qry.Close;qry.Free; pb1.Visible := False;end;主界面的其他函数或事件都大致原理和以上所述差不多,所以也不一一写上。DataSet 函数 /保存DataSet的事件function SaveCDSEvents(ds: TDataSet): cdsEventsArray;/恢复DataSet的事件procedure RestoreCDSEvents(ds: TDataSet; e: cdsEventsArray);/ 将 TDataSet 的某个字段,形成 StringListprocedure AssignDsStrings(ds: TDataSet; s: string; sl: TStrings);/ Excel 函数 / 数字转换成Excel的格式function IntToExcelStr(n: Integer): string;/ 为单元格加边框procedure RangeBorder(sheet: Variant; y, x: Integer);/ 复制 Sheet1.Range 到 Sheet2procedure CopyRange(src: Variant; x1, y1, x2, y2: Integer; dest: Variant; x,y: Integer);/ 填充单元格内容 align=1 left, 2 right 3 centerprocedure FillValue(sheet:Variant; y, x:Integer; value:Variant ; align:Integer = 0; border: Boolean = True);/ 合并单元格procedure MergeCells(sheet: Variant; x1, y1, x2, y2: Integer);implementation/保存CLIENTDATASET的事件function SaveCDSEvents(ds: TDataSet): cdsEventsArray;begin Result 1.ne := ds.AfterCancel; Result 2.ne := ds.AfterClose; Result 3.ne := ds.AfterDelete;Result 4.ne := ds.AfterEdit; Result 5.ne := ds.AfterInsert;Result 6.ne := ds.AfterOpen; Result 7.ne := ds.AfterPost;Result 8.ne := ds.AfterRefresh; Result 9.ne := ds.AfterScroll;Result10.ne := ds.BeforeCancel; Result11.ne := ds.BeforeClose;Result12.ne := ds.BeforeDelete; Result13.ne := ds.BeforeEdit;Result14.ne := ds.BeforeInsert; Result15.ne := ds.BeforeOpen;Result16.ne := ds.BeforePost; Result17.ne := ds.BeforeRefresh;Result18.ne := ds.BeforeScroll; Result19.ne := ds.OnCalcFields;Result20.ne := ds.OnNewRecord; Result 1.ee := ds.OnDeleteError;Result 2.ee := ds.OnEditError; Result 3.ee := ds.OnPostError;Result 1.fe := ds.OnFilterRecord;end;/恢复CLIENTDATASET的事件procedure RestoreCDSEvents(ds: TDataSet; e: cdsEventsArray);begin ds.AfterCancel := e 1.ne;ds.AfterClose := e 2.ne; ds.AfterDelete := e 3.ne;ds.AfterEdit := e 4.ne; ds.AfterInsert := e 5.ne;ds.AfterOpen := e 6.ne; ds.AfterPost := e 7.ne;ds.AfterRefresh := e 8.ne; ds.AfterScroll := e 9.ne;ds.BeforeCancel := e10.ne; ds.BeforeClose := e11.ne;ds.BeforeDelete := e12.ne; ds.BeforeEdit := e13.ne;ds.BeforeInsert := e14.ne; ds.BeforeOpen := e15.ne;ds.BeforePost := e16.ne; ds.BeforeRefresh := e17.ne; ds.BeforeScroll := e18.ne; ds.OnCalcFields := e19.ne ;ds.OnNewRecord := e20.ne; ds.OnDeleteError := e 1.ee; ds.OnEditError := e 2.ee; ds.OnPostError := e 3.ee; ds.OnFilterRecord := e 1.fe;end;/ 将 TDataSet 的某个字段,形成 StringListprocedure AssignDsStrings(ds: TDataSet; s: string; sl: TStrings);var b: TBookmarkStr;begin b := ds.Bookmark; sl.Clear; ds.First; while not ds.Eof do begin if ds.FieldValuess null then sl.Add(ds.FieldByName(s).AsString); ds.Next; end; ds.Bookmark := b;end;/ 数字转换成Excel的格式function IntToExcelStr(n: Integer): string;var s: string;begin if n 26 then s := char(integer(A)+(n-1) div 26)-1); if n mod 26 = 0 then s := s+Z else s := s+char(integer(A)+(n mod 26)-1); Result := s;end;/ 为单元格加边框procedure RangeBorder(sheet: Variant; y, x: Integer);var R: string;begin R := IntToExcelStr(x)+IntToStr(y)+:+IntToExcelStr(x)+IntToStr(y); sheet.RangeR.Borders1.Weight := sheet.RangeA4:A4.Borders1.Weight; sheet.RangeR.Borders2.Weight := sheet.RangeA4:A4.Borders2.Weight; sheet.RangeR.Borders3.Weight := sheet.RangeA4:A4.Borders3.Weight; sheet.RangeR.Borders4.Weight := sheet.RangeA4:A4.Borders4.Weight;end;/ 复制 Sheet1.Range 到 Sheet2procedure CopyRange(src: Variant; x1, y1, x2, y2: Integer; dest: Variant; x,y: Integer);var R: string; i: Integer;begin / 内容与格式 R := IntToExcelStr(x1)+IntToStr(y1)+:+IntToExcelStr(x2)+IntToStr(y2); src.RangeR.Copy; R := IntToExcelStr(x)+IntToStr(y); dest.RangeR.PasteSpecial; dest.RangeA1.Select; / 单元格属性 for i:= x1 to x2 do dest.Columnsx+i-x1.ColumnWidth := src.Columnsi.ColumnWidth; for i:= y1 to y2 do dest.Rowsy+i-y1.RowHeight := src.Rowsi.RowHeight;end;/ 填充单元格内容 align=1 left, 2 right 3 centerprocedure FillValue(sheet:Variant; y, x:Integer; value:Variant ; align:Integer = 0; border: Boolean = True);begin sheet.Cellsy, x.Value := value; case align of 1:sheet.Cellsy, x.HorizontalAlignment := xlLeft; 2:sheet.Cellsy, x.HorizontalAlignment := xlRi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 3D打印医疗设备创新-洞察阐释
- 网红绝对计划秦瑾舟
- 2024年宜昌市教育系统事业单位招聘真题
- 缙云县国有企业招聘笔试真题2024
- 通化医药健康职业学院《社会工作生涯指导》2023-2024学年第二学期期末试卷
- 汉口学院《工程结构荷载与可靠度设计原理》2023-2024学年第二学期期末试卷
- 东南大学《商务英语函电与合同》2023-2024学年第二学期期末试卷
- 陕西艺术职业学院《录音与编辑技术》2023-2024学年第二学期期末试卷
- 湖北生物科技职业学院《生物制药专业实验(下)》2023-2024学年第二学期期末试卷
- 伊春职业学院《主项理论与实践(五)》2023-2024学年第二学期期末试卷
- 预防接种门诊验收表4-副本
- 离心泵的结构与工作原理通用课件
- 焊接规范的基本要求
- 畜牧业的生物安全与疫情防控
- 国开电大可编程控制器应用实训形考任务5
- 关于皮肤科药物知识讲座
- 【小学心理健康教育分析国内外文献综述4100字】
- 办公室主任聘用合同
- 焊接施工流程图
- 阜阳混凝土框架结构高层住宅项目实体检验及材料送检专项方案
- 心内科用药安全管理课件
评论
0/150
提交评论