package com.ltkj.web.controller.system; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import cn.hutool.core.date.DateUtil; import cn.hutool.extra.pinyin.PinyinUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.base.Joiner; import com.ltkj.common.excelConfig.ExcelUtils; import com.ltkj.common.utils.SecurityUtils; import com.ltkj.common.utils.StringUtils; import com.ltkj.framework.config.MatchUtils; import com.ltkj.hosp.domain.*; import com.ltkj.hosp.dto.ConfirmDto; import com.ltkj.hosp.dto.ExcelImportDto; import com.ltkj.hosp.service.*; import com.ltkj.web.config.redis.OrderDelayService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import com.ltkj.common.core.controller.BaseController; import com.ltkj.common.core.domain.AjaxResult; import com.ltkj.common.core.page.TableDataInfo; import org.springframework.web.multipart.MultipartFile; /** * 体检预约Controller * * @author ltkj * @date 2022-11-28 */ @RestController @RequestMapping("/reservation/reservation") @Api(tags = "体检预约管理接口") public class TjReservationController extends BaseController { @Resource private ITjReservationService tjReservationService; @Resource private ITjProjectService projectService; @Resource private ITjPackageService packageService; @Resource private ITjPackageProjectService tjPackageProjectService; @Resource private IDictCompService compService; @Resource private ITbTransitionService transitionService; @Resource private ITjCompPayService compPayService; @Resource private ITjTeamSelectRecordService selectRecordService; @Resource private ITjDwDeptService dwDeptService; @Resource private ITjDwGroupingService dwGroupingService; @Resource private ITjGroupingProService groupingProService; @Resource private TjAsyncService asyncService; @Resource private OrderDelayService delayService; @PostMapping("/importTemplate") @ApiOperation(value = "导出excel表模板") public void importTemplate(HttpServletResponse response) { ExcelUtils.exportTemplate(response, "体检预约Excel模板", TjReservation.class); } /** * 查询体检预约列表 */ @PreAuthorize("@ss.hasPermi('reservation:reservation:list')") @GetMapping("/list") @ApiOperation(value = "查询体检预约列表接口(默认)") public TableDataInfo list(TjReservation tjReservation) { startPage(); List list = tjReservationService.selectTjReservationList(tjReservation); if(null !=list && list.size()>0){ for (TjReservation reservation : list) { reservation.setName(MatchUtils.hideCusName(reservation.getName())); reservation.setPhoe(MatchUtils.hidePhoneNum(reservation.getPhoe())); reservation.setIdCard(MatchUtils.hideIdCardNum(reservation.getIdCard())); } } return getDataTable(list); } /** * 查询体检预约撤销列表接口 */ @GetMapping("/selectTjReservationByDelete") @ApiOperation(value = "查询撤销预约列表接口") public TableDataInfo selectTjReservationByDelete(TjReservation tjReservation) { startPage(); List list = tjReservationService.selectTjReservationByDelete(tjReservation); if(null !=list && list.size()>0){ for (TjReservation reservation : list) { reservation.setName(MatchUtils.hideCusName(reservation.getName())); reservation.setPhoe(MatchUtils.hidePhoneNum(reservation.getPhoe())); reservation.setIdCard(MatchUtils.hideIdCardNum(reservation.getIdCard())); } } return getDataTable(list); } @GetMapping("/likeGetComp") @ApiOperation(value = "模糊查询公司名称接口") public AjaxResult likeGetComp(@ApiParam(value = "公司名称(中文或英文都可以)") String compName) { if (null != compName && !"".equals(compName)) { LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); wq.like(DictComp::getCnName, compName).or().like(DictComp::getEnName, compName); List compList = compService.list(wq); return AjaxResult.success(compList); } return AjaxResult.error("请输入要查询的内容"); } /** * 导入团体体检预约列表 */ @PostMapping("/excelImport") @ApiOperation(value = "团体导入 (旧版本)") public AjaxResult excelImport(@RequestPart(value = "file") @ApiParam(value = "Excel文件") MultipartFile file) { List tjReservations = null; try { tjReservations = ExcelUtils.readMultipartFile(file, TjReservation.class); } catch (Exception e) { return AjaxResult.error("导入文件有误请检查导入文件!"); } List wrongList = new ArrayList<>(); List rightList = new ArrayList<>(); for (TjReservation tjReservation : tjReservations) { String idCard = tjReservation.getIdCard(); String phoe = tjReservation.getPhoe(); if (null != idCard && null != phoe) { if (!MatchUtils.isIdCard(idCard) || !MatchUtils.isMobileNO(phoe)) { wrongList.add(tjReservation.getName()); } else { rightList.add(tjReservation); } } else { wrongList.add(tjReservation.getName()); } } if (wrongList.size() > 0) { return AjaxResult.success("操作失败", wrongList); } else { return AjaxResult.success("操作成功",rightList); } } /** * 导入团体体检预约列表 */ @PostMapping("/newExcelImport") @ApiOperation(value = "团体导入 (新版本)") public AjaxResult newExcelImport(@RequestPart(value = "file") @ApiParam(value = "Excel文件") MultipartFile file, @RequestParam @ApiParam(value = "单位id") String dwId, @RequestParam @ApiParam(value = "单位部门id") String dwDeptId) { List tjReservations = null; try { tjReservations = ExcelUtils.readMultipartFile(file, TjReservation.class); } catch (Exception e) { return AjaxResult.error("导入文件有误请检查导入文件!"); } List wrongList = new ArrayList<>(); List rightList = new ArrayList<>(); List yyList = new ArrayList<>(); Map map = new HashMap<>(); TjDwGrouping groupingMan = null;//男 TjDwGrouping groupingWoMan = null;//女 TjDwGrouping groupingWz = null;//未知(不分性别) try { groupingMan = dwGroupingService.getOne(new LambdaQueryWrapper().eq(TjDwGrouping::getDwId,dwId) .eq(TjDwGrouping::getDwDeptId,dwDeptId).eq(TjDwGrouping::getSex, 0)); groupingWoMan = dwGroupingService.getOne(new LambdaQueryWrapper().eq(TjDwGrouping::getDwId,dwId) .eq(TjDwGrouping::getDwDeptId,dwDeptId).eq(TjDwGrouping::getSex, 1)); groupingWz = dwGroupingService.getOne(new LambdaQueryWrapper().eq(TjDwGrouping::getDwId,dwId) .eq(TjDwGrouping::getDwDeptId,dwDeptId).eq(TjDwGrouping::getSex, 2)); } catch (Exception e) { return AjaxResult.error("分组信息有误请重新分组!"); } //计算合计 BigDecimal hjMoney = new BigDecimal("0.00"); //男组金额 BigDecimal manMoney = new BigDecimal("0.00"); //女组金额 BigDecimal woManMoney = new BigDecimal("0.00"); int count=0;//总计人数 int manCount=0;//男组人数 int woManCount=0;//女组人数 for (TjReservation tjReservation : tjReservations) { String idCard = tjReservation.getIdCard(); String phoe = tjReservation.getPhoe(); if (null != idCard && null != phoe) { if (!MatchUtils.isIdCard(idCard) || !MatchUtils.isMobileNO(phoe)) { wrongList.add(tjReservation.getName()); } else { if (null != groupingMan && groupingMan.getSex().equals(String.valueOf(tjReservation.getSex()))) { tjReservation.setGroupingId(groupingMan.getId()); tjReservation.setGroupingName(groupingMan.getGroupingName()); tjReservation.setYsPrice(groupingMan.getYsPrice()); //合计 hjMoney = hjMoney.add(groupingMan.getYsPrice()); count+=1; //男组人数 manMoney=manMoney.add(groupingMan.getYsPrice()); manCount+=1; } else if (null != groupingWoMan && groupingWoMan.getSex().equals(String.valueOf(tjReservation.getSex()))) { tjReservation.setGroupingId(groupingWoMan.getId()); tjReservation.setGroupingName(groupingWoMan.getGroupingName()); tjReservation.setYsPrice(groupingWoMan.getYsPrice()); //合计 hjMoney = hjMoney.add(groupingWoMan.getYsPrice()); count+=1; woManMoney=woManMoney.add(groupingWoMan.getYsPrice());woManCount+=1; } else if (null != groupingWz && groupingWz.getSex().equals(String.valueOf(tjReservation.getSex()))) { tjReservation.setGroupingId(groupingWz.getId()); tjReservation.setGroupingName(groupingWz.getGroupingName()); tjReservation.setYsPrice(groupingWz.getYsPrice()); //合计 hjMoney = hjMoney.add(groupingWz.getYsPrice()); count+=1; } LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); wq.eq(TjReservation::getIdCard, tjReservation.getIdCard()); wq.eq(TjReservation::getIsExpire, 2); TjReservation one = tjReservationService.getOne(wq); if (null != one) { yyList.add(one); } rightList.add(tjReservation); } } else { wrongList.add(tjReservation.getName()); } } if (yyList.size() > 0) { map.put("list", yyList); map.put("hjMoney", hjMoney); return AjaxResult.error("操作失败,以上人员已经预约无需导入!!!", map); } if (wrongList.size() > 0) { map.put("list", wrongList); map.put("hjMoney", hjMoney); return AjaxResult.error("操作失败, 请核对信息后重新导入!!!", map); } else { map.put("list", rightList); map.put("count", count); map.put("hjMoney", hjMoney); map.put("manCount", manCount); map.put("manMoney", manMoney); map.put("woManCount", woManCount); map.put("woManMoney", woManMoney); return AjaxResult.success("操作成功", map); } } @PostMapping("/reservationConfirm") @ApiOperation(value = "团体预约确认接口 (旧版本)") public AjaxResult reservationConfirm(@RequestBody Map map) { List rightLists = (List) map.get("rightList"); String pacId = map.get("pacId").toString(); String copeWith = map.get("copeWith").toString(); String[] proIds = (String[]) map.get("proIds"); Object compId1 = map.get("compId"); if (null == compId1 || compId1.equals("")) { return AjaxResult.error("请选择单位信息"); } String compId = map.get("compId").toString(); Object reservationTime1 = map.get("reservationTime"); if (null == reservationTime1) { return AjaxResult.error("请选择预约时间!"); } String reservationTime = map.get("reservationTime").toString(); String payType = map.get("payType").toString(); String jsonString = JSON.toJSONString(rightLists); List rightList = JSON.parseArray(jsonString, TjReservation.class); if (null != rightList) { if (null != pacId || null != proIds && proIds.length > 0) { String teamNo = PinyinUtil.getFirstLetter(compService.getById(compId).getCnName(), "") + DateUtil.format(new Date(), "yyMMddHHmmss"); for (TjReservation reservation : rightList) { LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); wq.eq(TjReservation::getIdCard, reservation.getIdCard()); wq.eq(TjReservation::getIsExpire, 2); TjReservation one = tjReservationService.getOne(wq); if (null != one) { continue; } if (null != pacId) { reservation.setPacId(pacId); } if (null != proIds && proIds.length > 0) { reservation.setProIds(Joiner.on(",").join(proIds)); } reservation.setReservationTime(DateUtil.parse(reservationTime, "yyyy-MM-dd")); reservation.setCompanyId(compId); reservation.setCompany(compService.getById(compId).getCnName()); reservation.setPayType(Long.valueOf(payType)); reservation.setTjType(String.valueOf(1)); reservation.setTeamNo(teamNo); tjReservationService.save(reservation); delayService.reservation(reservation.getId()); } LambdaQueryWrapper wq0 = new LambdaQueryWrapper<>(); wq0.eq(TjCompPay::getCompId, compId); wq0.eq(TjCompPay::getTeamNo, teamNo); TjCompPay one = compPayService.getOne(wq0); if (null != one) { one.setCopeWith(new BigDecimal(copeWith)); one.setSerialNumber(SecurityUtils.getUsername() + DateUtil.format(new Date(), "yyMMddHHmmssSSS")); one.setInvoiceNo("FP" + DateUtil.format(new Date(), "yyMMddHHmmssSSS")); one.setPaidIn(new BigDecimal("0.00")); compPayService.updateById(one); } else { TjCompPay tjCompPay = new TjCompPay(); tjCompPay.setCompId(compId); tjCompPay.setTeamNo(teamNo); tjCompPay.setCopeWith(new BigDecimal(copeWith)); tjCompPay.setSerialNumber(SecurityUtils.getUsername() + DateUtil.format(new Date(), "yyMMddHHmmssSSS")); tjCompPay.setInvoiceNo("FP" + DateUtil.format(new Date(), "yyMMddHHmmssSSS")); tjCompPay.setPaidIn(new BigDecimal("0.00")); tjCompPay.setDifference(tjCompPay.getCopeWith().subtract(BigDecimal.valueOf(0.00))); compPayService.save(tjCompPay); } LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); wq.eq(TjTeamSelectRecord::getTeamNo, teamNo); wq.eq(TjTeamSelectRecord::getCompId, compId); TjTeamSelectRecord recordServiceOne = selectRecordService.getOne(wq); if (null != recordServiceOne) { if (null != pacId) recordServiceOne.setPacId(pacId); recordServiceOne.setProIds(Joiner.on(";").join(proIds != null ? proIds : new String[0])); recordServiceOne.setTeamNo(teamNo); recordServiceOne.setTransactionAmount(new BigDecimal("0.00")); recordServiceOne.setCount(rightList.size()); selectRecordService.updateById(recordServiceOne); } TjTeamSelectRecord selectRecord = new TjTeamSelectRecord(); selectRecord.setCompId(compId); if (null != pacId) selectRecord.setPacId(pacId); selectRecord.setProIds(Joiner.on(";").join(proIds != null ? proIds : new String[0])); selectRecord.setTeamNo(teamNo); selectRecord.setTransactionAmount(new BigDecimal("0.00")); selectRecord.setCount(rightList.size()); selectRecordService.save(selectRecord); return AjaxResult.success("预约成功"); } return AjaxResult.error("请选择体检内容"); } return AjaxResult.error("请选择预约对象"); } /** * 个人预约接口 */ @PostMapping("/addTjReservation") @ApiOperation(value = "个人预约接口") public AjaxResult addTjReservation(@RequestBody TjReservation tjReservation) { if (null == tjReservation) return AjaxResult.error(); if (null == tjReservation.getName()) return AjaxResult.error("姓名不能为空"); if (null == tjReservation.getReservationTime()) return AjaxResult.error("请选择预约时间"); boolean b=true; if(null !=tjReservation.getIdType()){ if(tjReservation.getIdType().equals("1")){ b = MatchUtils.isIdCard(tjReservation.getIdCard()); }else { b = MatchUtils.cardValidate(tjReservation.getIdCard(), tjReservation.getIdType()); } }else { return AjaxResult.error("请选择证件类型"); } if(!b) return AjaxResult.error("证件号有误"); LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); wq.eq(TjReservation::getIdCard, tjReservation.getIdCard()); wq.eq(TjReservation::getIsExpire, 2); TjReservation reservation = tjReservationService.getOne(wq); if (null != reservation) return AjaxResult.success("您已成功预约,无需再约"); //tjReservation.setAge(MatchUtils.getAgeByIdCard(tjReservation.getIdCard())); try { tjReservation.setBirthday(DateUtil.parse(MatchUtils.getBirthDayByIdCard(tjReservation.getIdCard()), "yyyy-MM-dd")); } catch (Exception e) { e.printStackTrace(); } tjReservation.setPayType(0L); tjReservation.setIsExpire(2); tjReservation.setTjType(String.valueOf(2)); if (tjReservationService.save(tjReservation)) { delayService.reservation(tjReservation.getId()); return AjaxResult.success("预约成功!!!"); } return AjaxResult.error("预约失败"); } /** * 获取体检预约详细信息 */ @GetMapping(value = "/{id}") @ApiOperation(value = "根据预约id获取预约详情") public AjaxResult getInfo(@PathVariable("id") @ApiParam(value = "预约id") Integer id) { TjReservation tjReservation = tjReservationService.selectTjReservationById(id); if (null != tjReservation) { if (null != tjReservation.getPacId()) { tjReservation.setPacName(packageService.getById(tjReservation.getPacId()).getPacName()); } if (null != tjReservation.getProIds()) { List proNames = new ArrayList<>(); String[] proIds = StringUtils.split(tjReservation.getProIds(), ","); if (null != proIds && proIds.length > 0) { for (String proId : proIds) { proNames.add(projectService.getById(proId).getProName()); } tjReservation.setProNames(proNames); } } return AjaxResult.success(tjReservation); } return error(); } /** * 体检预约撤销接口 */ @DeleteMapping("/tjCancel/{id}") @ApiOperation(value = "体检预约撤销接口") public AjaxResult tjCancel(@PathVariable("id") @ApiParam(value = "预约id") String id) { TjReservation reservation = tjReservationService.getById(id); if (null != reservation && reservation.getIsExpire() == 2) { if (tjReservationService.removeById(id)) { transitionService.remove(new LambdaQueryWrapper().eq(TbTransition::getCusId, reservation.getIdCard())); return AjaxResult.success("撤销成功"); } return AjaxResult.error("撤销失败"); } return AjaxResult.error("预约不存在或已失效,暂不能撤销预约!!!"); } /** * 体检预约撤销接口 */ @PostMapping("/tjCancelTjReservation") @ApiOperation(value = "体检预约批量撤销接口") public AjaxResult tjCancelTjReservation(@RequestBody @ApiParam(value = "预约id") String[] ids) { if (null != ids && ids.length > 0) { for (String id : ids) { TjReservation reservation = tjReservationService.getById(id); if (null != reservation && reservation.getIsExpire() == 2) { if (tjReservationService.removeById(id)) { transitionService.remove(new LambdaQueryWrapper().eq(TbTransition::getCusId, reservation.getIdCard())); } } } return AjaxResult.success("撤销成功"); } return AjaxResult.error("请选择要撤销的数据!!!"); } /** * 体检修改预约接口 */ @PostMapping("/tjReappoint") @ApiOperation(value = "体检预约修改接口") public AjaxResult tjReappoint(@RequestBody TjReservation tjReservation) { if (tjReservation.getIsExpire() == 1) { return AjaxResult.error("预约已过期不可修改"); } if (tjReservationService.updateById(tjReservation)) { return AjaxResult.success("操作成功"); } return AjaxResult.error("操作失败"); } /** * 获取体检预约详细信息 */ @GetMapping(value = "getSelectRecordByTeamNo") @ApiOperation(value = "根据单位id和团队编号获取预约详情") public AjaxResult getSelectRecordByTeamNo(@RequestParam @ApiParam(value = "分组id") String groupingId) { LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); wq.eq(TjGroupingPro::getGroupingId,groupingId); List proList = groupingProService.list(wq); if(null !=proList && proList.size()>0){ for (TjGroupingPro groupingPro : proList) { TjProject project = projectService.getById(groupingPro.getProId()); if(null !=project){ if (project.getProType().equals("") || project.getProType()==null) { groupingPro.setProType("2"); }else { groupingPro.setProType(project.getProType()); } groupingPro.setProCheckMethod(project.getProCheckMethod()); } } } return AjaxResult.success(proList); } @PostMapping("/newReservationConfirm") @ApiOperation(value = "团体预约确认接口 (新版本)") public AjaxResult newReservationConfirm(@RequestBody ConfirmDto dto) { //预约的所有人 List rightList = dto.getReservations(); //预约时间 String reservationTime = dto.getReservationTime(); if (null == reservationTime) { return AjaxResult.error("请选择预约时间!"); } //体检单位部门 TjDwDept dwDept = dwDeptService.getById(dto.getDwDeptId()); //异步数据 asyncService.addNewReservationConfirm(rightList); //团体人数合计价格 BigDecimal compPay=new BigDecimal("0.00"); //团体人数 int tramNum=0; if (null != rightList && rightList.size() > 0) { String teamNo = PinyinUtil.getFirstLetter(dwDept.getDwName(), "") + DateUtil.format(new Date(), "yyMMddHHmmss"); for (TjReservation reservation : rightList) { TjDwGrouping dwGrouping = dwGroupingService.getById(reservation.getGroupingId()); LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); wq.eq(TjReservation::getIdCard, reservation.getIdCard()); wq.eq(TjReservation::getIsExpire, 2); TjReservation one = tjReservationService.getOne(wq); if (null != one) { continue; } LambdaQueryWrapper wq1 = new LambdaQueryWrapper<>(); wq1.eq(TjGroupingPro::getGroupingId, reservation.getGroupingId()); List proIds = groupingProService.list(wq1).stream().map(TjGroupingPro::getProId).collect(Collectors.toList()); reservation.setProIds(Joiner.on(",").join(proIds)); reservation.setReservationTime(DateUtil.parse(reservationTime, "yyyy-MM-dd")); reservation.setCompanyId(dwGrouping.getDwId()); reservation.setCompany(dwGrouping.getDwName()); reservation.setPayType(Long.valueOf(dwGrouping.getPayType())); reservation.setPacId(dwDept.getId()); if(dwGrouping.getPayType().equals("1")){ compPay=compPay.add(dwGrouping.getYsPrice()); tramNum+=1; reservation.setTjType(String.valueOf(1)); reservation.setTeamNo(teamNo); }else { reservation.setTjType(String.valueOf(2)); } tjReservationService.save(reservation); delayService.reservation(reservation.getId()); } LambdaQueryWrapper wq0 = new LambdaQueryWrapper<>(); wq0.eq(TjCompPay::getCompId, dwDept.getDwId()); wq0.eq(TjCompPay::getTeamNo, teamNo); TjCompPay one = compPayService.getOne(wq0); if (null != one) { one.setCopeWith(compPay); one.setSerialNumber(SecurityUtils.getUsername() + DateUtil.format(new Date(), "yyMMddHHmmssSSS")); one.setInvoiceNo("FP" + DateUtil.format(new Date(), "yyMMddHHmmssSSS")); one.setPaidIn(new BigDecimal("0.00")); compPayService.updateById(one); } else { TjCompPay tjCompPay = new TjCompPay(); tjCompPay.setCompId(dwDept.getDwId()); tjCompPay.setTeamNo(teamNo); tjCompPay.setCopeWith(compPay); tjCompPay.setSerialNumber(SecurityUtils.getUsername() + DateUtil.format(new Date(), "yyMMddHHmmssSSS")); tjCompPay.setInvoiceNo("FP" + DateUtil.format(new Date(), "yyMMddHHmmssSSS")); tjCompPay.setPaidIn(new BigDecimal("0.00")); tjCompPay.setDifference(tjCompPay.getCopeWith().subtract(BigDecimal.valueOf(0.00))); compPayService.save(tjCompPay); } LambdaQueryWrapper wq = new LambdaQueryWrapper<>(); wq.eq(TjTeamSelectRecord::getTeamNo, teamNo); wq.eq(TjTeamSelectRecord::getCompId, dwDept.getDwId()); TjTeamSelectRecord recordServiceOne = selectRecordService.getOne(wq); if (null != recordServiceOne) { recordServiceOne.setPacId(dwDept.getId()); recordServiceOne.setCompId(dwDept.getDwId()); recordServiceOne.setTeamNo(teamNo); recordServiceOne.setTransactionAmount(new BigDecimal("0.00")); recordServiceOne.setCount(tramNum); recordServiceOne.setDifference(compPay); selectRecordService.updateById(recordServiceOne); }else { TjTeamSelectRecord selectRecord = new TjTeamSelectRecord(); selectRecord.setCompId(dwDept.getDwId()); selectRecord.setPacId(dwDept.getId()); selectRecord.setTeamNo(teamNo); selectRecord.setTransactionAmount(new BigDecimal("0.00")); selectRecord.setCount(tramNum); selectRecord.setDifference(compPay); selectRecordService.save(selectRecord); } return AjaxResult.success("预约成功"); } return AjaxResult.error("请选择预约对象"); } }