1.需求分析1.前面我们已经完成了检查项管理、检查组管理、套餐管理等。接下来我们需要进行预约设置,其实就是设置每一天的体检预约最大数量。客户可以通过微信端在线预约,在线预约时需要选择体检的时间,如果客户选择的时间已经预约满则无法进行预约。
2.批量导入预约设置信息2.预约设置信息对应的数据表为t_ordersetting,预约设置操作对应的页面为ordersetting.htmlt_ordersetting表结构:orderDate:预约日期
3.number:可预约人数
4.reservations:已预约人数
5.批量导入预约设置信息操作过程:
点击模板下载按钮下载Excel模板文件将预约设置信息录入到模板文件中点击上传文件按钮将录入完信息的模板文件上传到服务器通过POI读取上传文件的数据并保存到数据库6.本章解析Excel文件使用的技术为ApachePOI
2.1完善页面2.1.1提供模板文件7.资料中已经提供了Excel模板文件ordersetting_template.xlsx,将文件放在health_backend工程的template目录
2.1.2实现模板文件下载8.为模板下载按钮绑定事件实现模板文件下载
el-buttonstyle"margin-bottom:20px;margin-right:20px"type"primary"@click"downloadTemplate()"模板下载/el-button//模板文件下载downloadTemplate(){window.location.href"../../template/ordersetting_template.xlsx";}2.1.3文件上传9.使用ElementUI的上传组件实现文件上传并绑定相关事件
el-uploadaction"/ordersetting/upload.do"name"excelFile":show-file-list"false":on-success"handleSuccess":before-upload"beforeUpload"el-buttontype"primary"上传文件/el-button/el-uploadhandleSuccess(response,file){if(response.flag){this.$message({message:response.message,type:'success'});}else{this.$message.error(response.message);}}beforeUpload(file){constisXLSfile.type'application/vnd.ms-excel';if(isXLS){returntrue;}constisXLSXfile.type'application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet';if(isXLSX){returntrue;}this.$message.error('上传文件只能是xls或者xlsx格式!');returnfalse;}2.2后台代码2.2.1Controller10.将资料中的POIUtils工具类复制到health_common工程在health_backend工程创建OrderSettingController并提供upload方法
importcom.alibaba.dubbo.config.annotation.Reference;importcom.itheima.constant.MessageConstant;importcom.itheima.entity.Result;importcom.itheima.pojo.OrderSetting;importcom.itheima.service.OrderSettingService;importcom.itheima.utils.POIUtils;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importorg.springframework.web.multipart.MultipartFile;importjavax.xml.ws.handler.MessageContext;importjava.util.Date;importjava.util.LinkedList;importjava.util.List;/***@author嘿嘿嘿1212*@version1.0*@date2019/10/1819:39*/@RestController@RequestMapping("ordersetting")publicclassOrderSettingController{@ReferenceprivateOrderSettingServiceorderSettingService;/***文件上传,实现预约设置数据批量导入**@paramexcelFile*@return*/@RequestMapping("upload")publicResultupload(@RequestParam("excelFile")MultipartFileexcelFile){try{//使用POI解析Excel表格ListString[]excelPOIUtils.readExcel(excelFile);//转换数据类型ListOrderSettinglistnewLinkedListOrderSetting();for(String[]strings:excel){StringorderDatestrings[0];Stringnumberstrings[1];OrderSettingorderSettingnewOrderSetting(newDate(orderDate),Integer.parseInt(number));list.add(orderSetting);}orderSettingService.add(list);}catch(Exceptione){e.printStackTrace();returnnewResult(false,MessageConstant.IMPORT_ORDERSETTING_FAIL);}returnnewResult(true,MessageConstant.IMPORT_ORDERSETTING_SUCCESS);}}POIUtilspackagecom.itheima.utils;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.InputStream;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.List;importorg.apache.poi.hssf.usermodel.HSSFWorkbook;importorg.apache.poi.ss.usermodel.Cell;importorg.apache.poi.ss.usermodel.Row;importorg.apache.poi.ss.usermodel.Sheet;importorg.apache.poi.ss.usermodel.Workbook;importorg.apache.poi.xssf.usermodel.XSSFWorkbook;importorg.springframework.web.multipart.MultipartFile;publicclassPOIUtils{privatefinalstaticStringxls"xls";privatefinalstaticStringxlsx"xlsx";privatefinalstaticStringDATE_FORMAT"yyyy/MM/dd";/***读入excel文件,解析后返回*@paramfile*@throwsIOException*/publicstaticListString[]readExcel(MultipartFilefile)throwsIOException{//检查文件checkFile(file);//获得Workbook工作薄对象WorkbookworkbookgetWorkBook(file);//创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回ListString[]listnewArrayListString[]();if(workbook!null){for(intsheetNum0;sheetNumworkbook.getNumberOfSheets();sheetNum++){//获得当前sheet工作表Sheetsheetworkbook.getSheetAt(sheetNum);if(sheetnull){continue;}//获得当前sheet的开始行intfirstRowNumsheet.getFirstRowNum();//获得当前sheet的结束行intlastRowNumsheet.getLastRowNum();//循环除了第一行的所有行for(introwNumfirstRowNum+1;rowNumlastRowNum;rowNum++){//获得当前行Rowrowsheet.getRow(rowNum);if(rownull){continue;}//获得当前行的开始列intfirstCellNumrow.getFirstCellNum();//获得当前行的列数intlastCellNumrow.getPhysicalNumberOfCells();String[]cellsnewString[row.getPhysicalNumberOfCells()];//循环当前行for(intcellNumfirstCellNum;cellNumlastCellNum;cellNum++){Cellcellrow.getCell(cellNum);cells[cellNum]getCellValue(cell);}list.add(cells);}}workbook.close();}returnlist;}//校验文件是否合法publicstaticvoidcheckFile(MultipartFilefile)throwsIOException{//判断文件是否存在if(nullfile){thrownewFileNotFoundException("文件不存在!");}//获得文件名StringfileNamefile.getOriginalFilename();//判断文件是否是excel文件if(!fileName.endsWith(xls)!fileName.endsWith(xlsx)){thrownewIOException(fileName+"不是excel文件");}}publicstaticWorkbookgetWorkBook(MultipartFilefile){//获得文件名StringfileNamefile.getOriginalFilename();//创建Workbook工作薄对象,表示整个excelWorkbookworkbooknull;try{//获取excel文件的io流InputStreamisfile.getInputStream();//根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象if(fileName.endsWith(xls)){//2003workbooknewHSSFWorkbook(is);}elseif(fileName.endsWith(xlsx)){//2007workbooknewXSSFWorkbook(is);}}catch(IOExceptione){e.printStackTrace();}returnworkbook;}publicstaticStringgetCellValue(Cellcell){StringcellValue"";if(cellnull){returncellValue;}//如果当前单元格内容为日期类型,需要特殊处理StringdataFormatStringcell.getCellStyle().getDataFormatString();if(dataFormatString.equals("m/d/yy")){cellValuenewSimpleDateFormat(DATE_FORMAT).format(cell.getDateCellValue());returncellValue;}//把数字当成String来读,避免出现1读成1.0的情况if(cell.getCellType()Cell.CELL_TYPE_NUMERIC){cell.setCellType(Cell.CELL_TYPE_STRING);}//判断数据的类型switch(cell.getCellType()){caseCell.CELL_TYPE_NUMERIC://数字cellValueString.valueOf(cell.getNumericCellValue());break;caseCell.CELL_TYPE_STRING://字符串cellValueString.valueOf(cell.getStringCellValue());break;caseCell.CELL_TYPE_BOOLEAN://BooleancellValueString.valueOf(cell.getBooleanCellValue());break;caseCell.CELL_TYPE_FORMULA://公式cellValueString.valueOf(cell.getCellFormula());break;caseCell.CELL_TYPE_BLANK://空值cellValue"";break;caseCell.CELL_TYPE_ERROR://故障cellValue"非法字符";break;default:cellValue"未知类型";break;}returncellValue;}}2.2.2服务接口11.创建OrderSettingService服务接口并提供新增方法
packagecom.itheima.service;importcom.itheima.pojo.OrderSetting;importjava.util.List;publicinterfaceOrderSettingService{publicvoidadd(ListOrderSettinglist)throwsException;}2.2.3服务实现类12.创建服务实现类OrderSettingServiceImpl并实现新增方法
packagecom.itheima.service.impl;importcom.alibaba.dubbo.config.annotation.Service;importcom.itheima.dao.OrderSettingDao;importcom.itheima.pojo.OrderSetting;importcom.itheima.service.OrderSettingService;importorg.springframework.beans.factory.annotation.Autowired;importjava.util.List;/***@author嘿嘿嘿1212*@version1.0*@date2019/10/1820:09*/@Service(interfaceClassOrderSettingService.class)publicclassOrderSettingServiceImplimplementsOrderSettingService{@AutowiredprivateOrderSettingDaoorderSettingDao;@Overridepublicvoidadd(ListOrderSettinglist)throwsException{//批量导入预约人数if(list!nulllist.size()0){for(OrderSettingorderSetting:list){//判断当前日期是否已经进行了预约设置longcountByOrderDateorderSettingDao.findCountByOrderDate(orderSetting.getOrderDate());if(countByOrderDate0){//已经进行了预约设置,执行更新操作orderSettingDao.editNumberByOrderDate(orderSetting);}else{//没有进行预约设置,执行插入操作orderSettingDao.add(orderSetting);}}}}}2.2.4Dao接口13.创建Dao接口OrderSettingDao并提供更新和新增方法与查询
packagecom.itheima.dao;importcom.itheima.pojo.OrderSetting;importjava.util.Date;/***@author嘿嘿嘿1212*@version1.0*@date2019/10/1820:17*/publicinterfaceOrderSettingDao{/***根据预约时间查询是否存在预约*@paramorderDate*@return*/publiclongfindCountByOrderDate(DateorderDate);/***添加预约*@paramorderSetting*/publicvoidadd(OrderSettingorderSetting);/***根据预约时间修改预约人数*@paramorderSetting*/publicvoideditNumberByOrderDate(OrderSettingorderSetting);}2.2.5Mapper映射文件14.创建Mapper映射文件OrderSettingDao.xml并提供相关SQL
?xmlversion"1.0"encoding"UTF-8"?!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"mappernamespace"com.itheima.dao.OrderSettingDao"!--根据预约时间查询--selectid"findCountByOrderDate"resultType"long"parameterType"date"selectcount(*)fromt_ordersettingwhereorderDate#{orderDate}/select!--添加预约数据--insertid"add"parameterType"com.itheima.pojo.OrderSetting"insertintot_ordersetting(orderDate,number,reservations)values(#{orderDate},#{number},#{reservations})/insert!--根据预约时间修改可预约人数--updateid"editNumberByOrderDate"parameterType"com.itheima.pojo.OrderSetting"updatet_ordersettingsetnumber#{number}whereorderDate#{orderDate}/update/mapper3.日历展示预约设置信息15.前面已经完成了预约设置功能,现在就需要通过日历的方式展示出来每天设置的预约人数。在页面中已经完成了日历的动态展示,我们只需要查询当前月份的预约设置信息并展示到日历中即可,同时在日历中还需要展示已经预约的人数,效果如下:
3.1完善页面3.1.1使用静态数据调试16.为了能够快速看到效果,我们可以先使用静态数据模拟,然后再改为发送ajax请求查询数据库。实现步骤:(1)预约设置数据对应的模型数据为leftobj,在initData方法最后为leftobj模型数据赋值:
this.leftobj[{date:1,number:120,reservations:1},{date:3,number:120,reservations:1},{date:4,number:120,reservations:120},{date:6,number:120,reservations:1},{date:8,number:120,reservations:1}];17.其中date表示日期,number表示可预约人数,reservations表示已预约人数(2)使用VUE的v-for标签遍历上面的leftobj模型数据,展示到日历上:
templatetemplatev-for"objinleftobj"templatev-if"obj.datedayobject.day.getDate()"templatev-if"obj.numberobj.reservations"divclass"usual"p可预约{{obj.number}}人/pp已预约{{obj.reservations}}人/p/div/templatetemplatev-elsedivclass"fulled"p可预约{{obj.number}}人/pp已预约{{obj.reservations}}人/pp已满/p/div/template/template/templatebuttonv-if"dayobject.daytoday"@click"handleOrderSet(dayobject.day)"class"orderbtn"设置/button/template/div/template3.1.2发送ajax获取动态数据18.将上面的静态模拟数据去掉,改为发送ajax请求,根据当前页面对应的月份查询数据库获取预约设置信息,将查询结果赋值给leftobj模型数据
//发送ajax请求,根据当前页面对应的月份查询预约设置信息axios.post("/ordersetting/getOrderSettingByMonth.do?date"+this.currentYear+'-'+this.currentMonth).then((response){if(response.data.flag){//为模型数据赋值,通过双向绑定展示到日历中this.leftobjresponse.data.data;}else{this.$message.error(response.data.message);}});3.2后台代码3.2.1Controller19.在OrderSettingController中提供getOrderSettingByMonth方法,根据月份查询预约设置信息
/***根据日期查询预约设置数据(获取指定日期所在月份的预约设置数据)*@paramdate*@return*/@RequestMapping("/getOrderSettingByMonth")publicResultgetOrderSettingByMonth(Stringdate){//参数格式为:2019-03try{ListMaplistorderSettingService.getOrderSettingByMonth(date);//获取预约设置数据成功returnnewResult(true,MessageConstant.GET_ORDERSETTING_SUCCESS,list);}catch(Exceptione){e.printStackTrace();//获取预约设置数据失败returnnewResult(false,MessageConstant.GET_ORDERSETTING_FAIL);}}20.注意:ListMap中Map是为灵活的进行返回数据绑定,指定属性名称,减少封装实体类
3.2.2服务接口21.在OrderSettingService服务接口中扩展方法getOrderSettingByMonth
publicListMapgetOrderSettingByMonth(Stringdate);//参数格式为:2019-033.2.3服务实现类22.在OrderSettingServiceImpl服务实现类中实现方法getOrderSettingByMonth
//根据日期查询预约设置数据publicListMapgetOrderSettingByMonth(Stringdate){//2019-3Stringbegindate+"-1";//无论是哪个月份都是小于31号的Stringenddate+"-31";//进行封装查询数据MapString,StringmapnewHashMapString,String(2);map.put("begin",begin);map.put("end",end);//调用orderSettingDao进行查询ListOrderSettinglistorderSettingDao.getOrderSettingByMonth(map);//进行封装数据ListMapString,IntegerresultnewArrayListMapString,Integer();if(list!nulllist.size()0){for(OrderSettingorderSetting:list){MapString,IntegerleftnewHashMapString,Integer();//获取需要的数据intdayorderSetting.getOrderDate().getDate();intnumberorderSetting.getNumber();intreservationsorderSetting.getReservations();//封装到指定属性名中left.put("date",date);left.put("number",number);left.put("reservations",reservations);result.add(left);}}returnresult}3.2.4Dao接口23.在OrderSettingDao接口中扩展方法getOrderSettingByMonth
publicListOrderSettinggetOrderSettingByMonth(Mapdate);3.2.5Mapper映射文件24.在OrderSettingDao.xml文件中扩展SQL
!--根据月份查询预约设置信息--selectid"getOrderSettingByMonth"parameterType"map"resultType"com.itheima.pojo.OrderSetting"select*fromt_ordersettingwhereorderDatebetween#{dateBegin}and#{dateEnd}/select4.基于日历实现预约设置25.本章节要完成的功能为通过点击日历中的设置按钮来设置对应日期的可预约人数。效果如下:
4.1完善页面4.1.1为设置按钮绑定事件26.为日历中的设置按钮绑定单击事件,当前日期作为参数
buttonv-if"dayobject.daytoday"@click"handleOrderSet(dayobject.day)"class"orderbtn"设置/button//预约设置handleOrderSet(day){alert(day);}4.1.2弹出预约设置窗口并发送ajax请求27.完善handleOrderSet方法,弹出预约设置窗口,用户点击确定按钮则发送ajax请求
//预约设置handleOrderSet(day){this.$prompt('请输入可预约人数','预约设置',{confirmButtonText:'确定',cancelButtonText:'取消',inputPattern:/^[0-9]*[1-9][0-9]*$/,inputErrorMessage:'只能输入正整数'}).then(({value}){//发送ajax请求根据日期修改可预约人数axios.post("/ordersetting/editNumberByDate.do",{orderDate:this.formatDate(day.getFullYear(),day.getMonth()+1,day.getDate()),//日期number:value//可预约人数}).then((response){if(response.data.flag){this.initData(this.formatDate(day.getFullYear(),day.getMonth()+1,1));this.$message({type:'success',message:response.data.message});}else{this.$message.error(response.data.message);}});}).catch((){this.$message({type:'info',message:'已取消'});});4.2后台代码4.2.1Controller28.在OrderSettingController中提供方法editNumberByDate
/***根据指定日期修改可预约人数*@paramorderSetting*@return*/@RequestMapping("editNumberByDate")publicResulteditNumberByDate(@RequestBodyOrderSettingorderSetting){try{orderSettingService.editNumberByDate(orderSetting);returnnewResult(true,MessageConstant.ORDERSETTING_SUCCESS);}catch(Exceptione){e.printStackTrace();returnnewResult(false,MessageConstant.ORDERSETTING_FAIL);}}4.2.2服务接口29.在OrderSettingService服务接口中提供方法editNumberByDate
publicvoideditNumberByDate(OrderSettingorderSetting);4.2.3服务实现类30.在OrderSettingServiceImpl服务实现类中实现editNumberByDate
//根据日期修改可预约人数@OverridepublicvoideditNumberByDate(OrderSettingorderSetting){//查询当前日期是否进行了预约设置longcountorderSettingDao.findCountByOrderDate(orderSetting.getOrderDate());if(count0){//当前日期已经进行了预约设置,需要进行修改操作orderSettingDao.editNumberByOrderDate(orderSetting);}else{//当前日期未进行预约设置,需要进行插入操作orderSettingDao.add(orderSetting);}}4.2.4Dao接口31.在OrderSettingDao接口中提供方法
publicvoideditNumberByOrderDate(OrderSettingorderSetting);publiclongfindCountByOrderDate(DateorderDate);publicvoidadd(OrderSettingorderSetting);4.2.5Mapper映射文件32.在OrderSettingDao.xml映射文件中提供SQL
!--根据日期更新可预约人数--updateid"editNumberByOrderDate"parameterType"com.itheima.pojo.OrderSetting"updatet_ordersettingsetnumber#{number}whereorderDate#{orderDate}/update!--根据预约日期查询--selectid"findCountByOrderDate"parameterType"java.util.Date"resultType"long"selectcount(*)fromt_ordersettingwhereorderDate#{orderDate}/select
XX健康:预约管理-预约设置&日历插件&文件简单下载&Excel文件解析&Excel表数据批量导入-excel制作预约表格-会议室预定小程序
浏览量:1658
时间:
来源:嘿嘿嘿1212
版权声明
即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。
最新资讯
-

即速应用,赋能企业玩转微信小程序智慧经营
作为国内领军的智慧商业经营服务商,即速应用始终秉承“让每个企业都拥有自己的智慧店铺”的愿景,持续赋能更多企业玩转智慧经营。即速应用旗下拥有“小程序搭建工具-即速应用”、“私域流量专家-即客云”等产品,帮助商家打通互联网全生态营销闭环。 -

即客云2.0重磅更新,让微信小程序运营更简单!
即客云作为一款基于企业微信的第三方工具,现从多维度提供超过30种功能,自上线以来,已服务多家企业,受到一致好评。近期,我们根据客户反馈和市场调研正式推出升级版 即客云2.0!更新了私域运营SOP,群日历功能,批量拓客,客户雷达,消息推送,个人欢迎语,帮助企业更好运用企业微信;同时提升了社群运营工作标准化,提升运营效率,帮助企业实现客户增长,玩转私域流量。 -

零代码 + AI 双轮驱动|即速应用解锁人工智能小程序开发新范式
无需代码、无需 AI 算法功底,普通人也能快速搭建智能小程序。即速应用将人工智能与零代码开发深度融合,推出 AI 智能生成能力,用户通过自然语言描述需求,AI 自动生成小程序页面、功能模块与后台配置,覆盖商城、预约、同城、社区团购等全场景。平台内置 AI 智能推荐、智能客服、用户画像分析等能力,一键对接微信生态,打通视频号、企业微信、短信跳转,帮企业快速落地 AI 应用,抢占智慧经营先机,让每家企业都拥有 AI 驱动的智慧店铺。










