预约记录导出功能

master
liuqingkun 3 years ago
parent 6f65476ebc
commit 0a4ca04505
  1. 41
      src/main/java/org/springblade/common/enums/ApmRecordStatusEnum.java
  2. 62
      src/main/java/org/springblade/modules/business/controller/ApmRecordController.java
  3. 22
      src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.java
  4. 67
      src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.xml
  5. 8
      src/main/java/org/springblade/modules/business/service/IApmRecordService.java
  6. 52
      src/main/java/org/springblade/modules/business/service/impl/ApmRecordServiceImpl.java
  7. 4
      src/main/java/org/springblade/modules/business/timer/QuartzConfig.java
  8. 73
      src/main/java/org/springblade/modules/business/vo/ApmRecordExcelVO.java
  9. 16
      src/main/resources/log/logback-dev.xml

@ -0,0 +1,41 @@
package org.springblade.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 错误信息枚举类
*
* @author Chill
*/
@Getter
@AllArgsConstructor
public enum ApmRecordStatusEnum {
CANCEL(1, "已取消"),
UNREGISTER(2, "未报到"),
REGISTER(3, "已报到"),
;
final Integer name;
final String value;
public static Integer getName(String val) {
for (ApmRecordStatusEnum value : ApmRecordStatusEnum.values()) {
if (value.getValue().equals(val)) {
return value.getName();
}
}
return -1;
}
public static String getValue(Integer name) {
for (ApmRecordStatusEnum value : ApmRecordStatusEnum.values()) {
if (value.getName().equals(name)) {
return value.getValue();
}
}
return "";
}
}

@ -1,36 +1,38 @@
package org.springblade.modules.business.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import io.swagger.annotations.*;
import lombok.AllArgsConstructor;
import org.springblade.common.cache.DictBizCache;
import org.springblade.common.cache.DeptCache;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.common.constant.CommonConstant;
import org.springblade.common.enums.ApmRecordStatusEnum;
import org.springblade.common.enums.ErrorMsgEnum;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tenant.annotation.TenantDS;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Base64Util;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.business.entity.ApmRecord;
import org.springblade.modules.business.service.IApmRecordService;
import org.springblade.modules.business.vo.ApmRecordDetailVO;
import org.springblade.modules.business.vo.ApmRecordExcelVO;
import org.springblade.modules.business.vo.ApmRecordListVO;
import org.springblade.modules.business.vo.ApmRecordVO;
import org.springblade.modules.business.wrapper.ApmRecordWrapper;
import org.springframework.context.annotation.Bean;
import org.springblade.modules.system.entity.Dept;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
/**
@ -153,13 +155,13 @@ public class ApmRecordController extends BladeController {
})
@ApiOperationSupport(order = 4)
@ApiOperation(value = "分页", notes = "分页")
public R<IPage<ApmRecordListVO>> selectPage(Query query, Long createDept, String startTime, String endTime, String cupCardNo, String project) {
public R<IPage<ApmRecordListVO>> selectPage(Query query, Long createDept, String startTime, String endTime, String cupCardNo, String project, String apmStatus) {
BladeUser user = AuthUtil.getUser();
if (Func.isNotEmpty(user) && !BusinessConstant.ROLE_NAME_HOSPITAL.equals(user.getRoleName())) {
createDept = null;
}
IPage<ApmRecordListVO> page = recordService.selectRecordPage(Condition.getPage(query), createDept, startTime, endTime, cupCardNo, project);
IPage<ApmRecordListVO> page = recordService.selectDistinctRecordPage(Condition.getPage(query), createDept, startTime, endTime, cupCardNo, project, apmStatus);
return R.data(page);
}
@ -206,4 +208,48 @@ public class ApmRecordController extends BladeController {
}
return R.fail(checkMsg);
}
@GetMapping("/export-page")
public R<IPage<ApmRecordExcelVO>> exportPage(Query query, Long createDept, String startTime, String endTime, String cupCardNo, String project, String apmStatus) {
IPage<ApmRecord> records = recordService.selectRecordPage(Condition.getPage(query), createDept, startTime, endTime, cupCardNo, project, apmStatus);
List<ApmRecordExcelVO> vos = new ArrayList<>();
records.getRecords().forEach(record -> {
ApmRecordExcelVO vo = BeanUtil.copy(record, ApmRecordExcelVO.class);
Dept hospital = DeptCache.getDept(record.getCreateDept());
vo.setCreateDeptName(Func.isNotEmpty(hospital) ? hospital.getDeptName() : "");
vo.setProject(record.getProject());
vo.setApmTimeStr(DateUtil.format(record.getApmDay(), DateUtil.PATTERN_DATE) + " " + record.getPeriod() + " " + record.getTimeFrame());
vo.setApmStatusName(ApmRecordStatusEnum.getValue(record.getApmStatus()));
vos.add(vo);
});
IPage<ApmRecordExcelVO> page = new Page<>();
page.setTotal(records.getTotal());
page.setSize(records.getSize());
page.setCurrent(records.getCurrent());
page.setRecords(vos);
return R.data(page);
}
@GetMapping("/export-excel")
public void exportExcel(HttpServletResponse response, Long createDept, String startTime, String endTime, String cupCardNo, String project, String status) {
List<ApmRecord> records = recordService.selectRecordList(createDept, startTime, endTime, cupCardNo, project, status);
List<ApmRecordExcelVO> vos = new ArrayList<>();
records.forEach(record -> {
ApmRecordExcelVO vo = BeanUtil.copy(record, ApmRecordExcelVO.class);
Dept hospital = DeptCache.getDept(record.getCreateDept());
vo.setCreateDeptName(Func.isNotEmpty(hospital) ? hospital.getDeptName() : "");
vo.setCupName(Base64Util.decode(vo.getCupName()));
vo.setCupCardNo(Base64Util.decode(vo.getCupCardNo()));
vo.setCupPhone(Base64Util.decode(vo.getCupPhone()));
vo.setProject(record.getProject());
vo.setApmTimeStr(DateUtil.format(record.getApmDay(), DateUtil.PATTERN_DATE) + " " + record.getPeriod() + " " + record.getTimeFrame());
vo.setApmStatusName(ApmRecordStatusEnum.getValue(record.getApmStatus()));
vos.add(vo);
});
ExcelUtil.export(response, "预约统计导出数据", "预约统计数据表", vos, ApmRecordExcelVO.class);
}
}

@ -17,22 +17,18 @@ import java.util.Map;
*/
public interface ApmRecordMapper extends BaseMapper<ApmRecord> {
/**
* 自定义分页
*
* @param page
* @param createDept
* @param startTime
* @param endTime
* @param cupCardNo
* @return
*/
IPage<ApmRecord> selectRecordPage(IPage page, @Param("createDept") Long createDept, @Param("startTime") String startTime, @Param("endTime") String endTime,
@Param("cupCardNo") String cupCardNo, @Param("project") String project);
IPage<ApmRecord> selectDistinctRecordPage(IPage page, @Param("createDept") Long createDept, @Param("startTime") String startTime, @Param("endTime") String endTime,
@Param("cupCardNo") String cupCardNo, @Param("project") String project, @Param("apmStatus") String apmStatus);
List<ApmRecord> selectDistinctRecordList(@Param("createDept") Long createDept, @Param("startTime") String startTime, @Param("endTime") String endTime,
@Param("cupCardNo") String cupCardNo, @Param("project") String project, @Param("apmStatus") String apmStatus);
IPage<ApmRecord> selectRecordPage(IPage page, @Param("createDept") Long createDept, @Param("startTime") String startTime, @Param("endTime") String endTime,
@Param("cupCardNo") String cupCardNo, @Param("project") String project, @Param("apmStatus") String apmStatus);
List<ApmRecord> selectRecordList(@Param("createDept") Long createDept, @Param("startTime") String startTime, @Param("endTime") String endTime,
@Param("cupCardNo") String cupCardNo, @Param("project") String project);
@Param("cupCardNo") String cupCardNo, @Param("project") String project, @Param("apmStatus") String apmStatus);
List<ApmRecordCountDTO> countAllAmpNumByDept(@Param("createDept") Long createDept, @Param("startTime") String startTime, @Param("endTime") String endTime);

@ -32,7 +32,32 @@
<result column="apmNum" property="apmNum"/>
</resultMap>
<select id="selectRecordPage" resultMap="apmRecordResultMap">
<select id="selectDistinctRecordPage" resultMap="apmRecordResultMap">
SELECT distinct ar.create_dept, ar.apm_day, ar.cup_name,ar.cup_card_no,ar.cup_phone
FROM ca_apm_record ar
WHERE ar.is_deleted = 0
<if test="createDept != '' and createDept != null">
and ar.create_dept = #{createDept}
</if>
<if test="startTime != '' and startTime != null">
and ar.apm_day &gt;= #{startTime}
</if>
<if test="endTime != '' and endTime != null">
and ar.apm_day &lt;= #{endTime}
</if>
<if test="cupCardNo != '' and cupCardNo != null">
and ar.cup_card_no like concat(concat('%', #{cupCardNo}), '%')
</if>
<if test="project != '' and project != null">
and ar.project like concat(concat('%', #{project}), '%')
</if>
<if test="apmStatus != '' and apmStatus != null">
and ar.apm_status = #{apmStatus}
</if>
order by apm_day desc
</select>
<select id="selectDistinctRecordList" resultMap="apmRecordResultMap">
SELECT distinct ar.create_dept, ar.apm_day, ar.cup_name,ar.cup_card_no,ar.cup_phone
FROM ca_apm_record ar
WHERE ar.is_deleted = 0
@ -51,9 +76,37 @@
<if test="project != '' and project != null">
and ar.project like concat(concat('%', #{project}), '%')
</if>
<if test="apmStatus != '' and apmStatus != null">
and ar.apm_status = #{apmStatus}
</if>
order by apm_day desc
</select>
<select id="selectRecordPage" resultMap="apmRecordResultMap">
SELECT *
FROM ca_apm_record ar
WHERE ar.is_deleted = 0
<if test="createDept != '' and createDept != null">
and ar.create_dept = #{createDept}
</if>
<if test="startTime != '' and startTime != null">
and ar.apm_day &gt;= #{startTime}
</if>
<if test="endTime != '' and endTime != null">
and ar.apm_day &lt;= #{endTime}
</if>
<if test="cupCardNo != '' and cupCardNo != null">
and ar.cup_card_no like concat(concat('%', #{cupCardNo}), '%')
</if>
<if test="project != '' and project != null">
and ar.project like concat(concat('%', #{project}), '%')
</if>
<if test="apmStatus != '' and apmStatus != null">
and ar.apm_status = #{apmStatus}
</if>
order by apm_day desc, cup_card_no, project
</select>
<select id="selectRecordList" resultMap="apmRecordResultMap">
SELECT *
FROM ca_apm_record ar
@ -73,6 +126,10 @@
<if test="project != '' and project != null">
and ar.project like concat(concat('%', #{project}), '%')
</if>
<if test="apmStatus != '' and apmStatus != null">
and ar.apm_status = #{apmStatus}
</if>
order by apm_day desc, cup_card_no, project
</select>
<select id="countAllAmpNumByDept" resultMap="ApmRecordCountDTOResultMap">
@ -96,10 +153,10 @@
and create_dept = #{createDept}
</if>
<if test="apmDayList != null">
and apm_day in
<foreach collection="apmDayList" item="dayStr" index="index" open="(" close=")" separator=", ">
#{dayStr}
</foreach>
and apm_day in
<foreach collection="apmDayList" item="dayStr" index="index" open="(" close=")" separator=", ">
#{dayStr}
</foreach>
</if>
group by DATE_FORMAT(apm_day, '%Y-%m-%d'), project, period, time_frame
</select>

@ -31,7 +31,13 @@ public interface IApmRecordService extends BaseService<ApmRecord> {
* @param cupCardNo
* @return
*/
IPage<ApmRecordListVO> selectRecordPage(IPage<ApmRecordVO> page, Long createDept, String startTime, String endTime, String cupCardNo, String project);
IPage<ApmRecordListVO> selectDistinctRecordPage(IPage<ApmRecordVO> page, Long createDept, String startTime, String endTime, String cupCardNo, String project, String status);
List<ApmRecordListVO> selectDistinctRecordList(Long createDept, String startTime, String endTime, String cupCardNo, String project, String status);
IPage<ApmRecord> selectRecordPage(IPage<ApmRecord> page, Long createDept, String startTime, String endTime, String cupCardNo, String project, String status);
List<ApmRecord> selectRecordList(Long createDept, String startTime, String endTime, String cupCardNo, String project, String status);
String checkApmRecordSave(List<ApmRecord> apmRecordList);

@ -13,19 +13,15 @@ import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.business.dto.ApmRecordCountDTO;
import org.springblade.modules.business.entity.ApmConfig;
import org.springblade.modules.business.entity.ApmRecord;
import org.springblade.modules.business.entity.Blacklist;
import org.springblade.modules.business.mapper.ApmRecordMapper;
import org.springblade.modules.business.service.IApmRecordService;
import org.springblade.modules.business.service.IBlacklistService;
import org.springblade.modules.business.vo.ApmConfigListVO;
import org.springblade.modules.business.vo.ApmRecordDetailVO;
import org.springblade.modules.business.vo.ApmRecordListVO;
import org.springblade.modules.business.vo.ApmRecordVO;
import org.springblade.modules.business.wrapper.ApmConfigListWrapper;
import org.springblade.modules.business.wrapper.ApmRecordListWrapper;
import org.springblade.modules.business.wrapper.ApmRecordWrapper;
import org.springblade.modules.system.entity.Dept;
import org.springframework.stereotype.Service;
@ -42,11 +38,11 @@ public class ApmRecordServiceImpl extends BaseServiceImpl<ApmRecordMapper, ApmRe
private final IBlacklistService blacklistService;
@Override
public IPage<ApmRecordListVO> selectRecordPage(IPage<ApmRecordVO> page, Long createDept, String startTime, String endTime, String cupCardNo, String project) {
public IPage<ApmRecordListVO> selectDistinctRecordPage(IPage<ApmRecordVO> page, Long createDept, String startTime, String endTime, String cupCardNo, String project, String status) {
// 由于每个项目的预约保存了一条记录, 故分页时, 先使用distinct查询(医院, 预约人 配置天)进行分页
IPage<ApmRecord> pageRecord = baseMapper.selectRecordPage(page, createDept, startTime, endTime, cupCardNo, project);
IPage<ApmRecord> pageRecord = baseMapper.selectDistinctRecordPage(page, createDept, startTime, endTime, cupCardNo, project, status);
List<ApmRecord> allRecord = baseMapper.selectRecordList(createDept, startTime, endTime, cupCardNo, project);
List<ApmRecord> allRecord = baseMapper.selectRecordList(createDept, startTime, endTime, cupCardNo, project, status);
Map<String, List<ApmRecord>> recordMap = new HashMap<>();
allRecord.forEach(record -> {
String key = record.getCreateDept() + DateUtil.format(record.getApmDay(), DateUtil.PATTERN_DATE) + record.getCupCardNo();
@ -73,6 +69,48 @@ public class ApmRecordServiceImpl extends BaseServiceImpl<ApmRecordMapper, ApmRe
return recordList;
}
@Override
public List<ApmRecordListVO> selectDistinctRecordList(Long createDept, String startTime, String endTime, String cupCardNo, String project, String status) {
// 由于每个项目的预约保存了一条记录, 故分页时, 先使用distinct查询(医院, 预约人 配置天)进行分页
List<ApmRecord> pageRecord = baseMapper.selectDistinctRecordList(createDept, startTime, endTime, cupCardNo, project, status);
List<ApmRecord> allRecord = baseMapper.selectRecordList(createDept, startTime, endTime, cupCardNo, project, status);
Map<String, List<ApmRecord>> recordMap = new HashMap<>();
allRecord.forEach(record -> {
String key = record.getCreateDept() + DateUtil.format(record.getApmDay(), DateUtil.PATTERN_DATE) + record.getCupCardNo();
List<ApmRecord> records = recordMap.containsKey(key) ? recordMap.get(key) : new ArrayList<>();
records.add(record);
recordMap.put(key, records);
});
List<ApmRecordListVO> recordList = ApmRecordListWrapper.build().listVO(pageRecord);
recordList.forEach(vo -> {
Dept hospital = DeptCache.getDept(vo.getCreateDept());
vo.setCreateDeptName(Func.isNotEmpty(hospital) ? hospital.getDeptName() : "");
String key = vo.getCreateDept() + DateUtil.format(vo.getApmDay(), DateUtil.PATTERN_DATE) + vo.getCupCardNo();
List<ApmRecord> records = recordMap.containsKey(key) ? recordMap.get(key) : new ArrayList<>();
List<ApmRecordDetailVO> details = new ArrayList<>();
for (ApmRecord record : records) {
details.add(BeanUtil.copy(record, ApmRecordDetailVO.class));
}
vo.setDetails(details);
});
return recordList;
}
@Override
public IPage<ApmRecord> selectRecordPage(IPage<ApmRecord> page, Long createDept, String startTime, String endTime, String cupCardNo, String project, String status) {
return baseMapper.selectRecordPage(page, createDept, startTime, endTime, cupCardNo, project, status);
}
@Override
public List<ApmRecord> selectRecordList(Long createDept, String startTime, String endTime, String cupCardNo, String project, String status) {
return baseMapper.selectRecordList(createDept, startTime, endTime, cupCardNo, project, status);
}
@Override
public String checkApmRecordSave(List<ApmRecord> apmRecordList) {
String cupCardNo = apmRecordList.get(0).getCupCardNo();

@ -10,7 +10,7 @@ public class QuartzConfig {
* 添加黑名单定时任务表达式, 每天23:00执行
*/
private String CRON_BLACKLIST_JOB = "0 0 23 * * ?";
private String CRON_BLACKLIST_JOB_TEST = "0 0/1 * * * ?";
// private String CRON_BLACKLIST_JOB_TEST = "0 0/1 * * * ?";
/**
* 创建定时任务
@ -31,7 +31,7 @@ public class QuartzConfig {
@Bean
public Trigger blacklistTimerJobTrigger() {
//每隔5秒执行一次
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(CRON_BLACKLIST_JOB_TEST);
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(CRON_BLACKLIST_JOB);
//创建触发器
Trigger trigger = TriggerBuilder.newTrigger()

@ -0,0 +1,73 @@
package org.springblade.modules.business.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import java.io.Serializable;
/**
* 预约记录导出视图类
*
* @author Chill
*/
@Data
@ColumnWidth(30)
@HeadRowHeight(25)
@ContentRowHeight(25)
public class ApmRecordExcelVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 创建部门名称
*/
@ColumnWidth(25)
@ExcelProperty(value = "医院名称")
private String createDeptName;
/**
* 体检人用户名
*/
@ColumnWidth(20)
@ExcelProperty(value = "体检人姓名")
private String cupName;
/**
* 体检人证件号
*/
@ColumnWidth(25)
@ExcelProperty(value = "身份证号码")
private String cupCardNo;
/**
* 体检人联系方式
*/
@ColumnWidth(20)
@ExcelProperty(value = "联系方式")
private String cupPhone;
/**
* 体检项目
*/
@ColumnWidth(20)
@ExcelProperty(value = "检测项目")
private String project;
/**
* 预约时间 放号天 + 时段(上午,下午) + 时段范围
*/
@ColumnWidth(30)
@ExcelProperty(value = "预约时间")
private String apmTimeStr;
/**
* 预约状态名称, 0:已保存,1已取消,2:未报到, 3:已报到
*/
@ColumnWidth(20)
@ExcelProperty(value = "预约状态")
private String apmStatusName;
}

@ -58,20 +58,20 @@
</if>
<!-- 日志输出级别 -->
<root level="INFO">
<root level="WARN">
<appender-ref ref="STDOUT"/>
<appender-ref ref="${STDOUT_APPENDER}"/>
</root>
<logger name="net.sf.ehcache" level="INFO"/>
<logger name="druid.sql" level="INFO"/>
<logger name="net.sf.ehcache" level="WARN"/>
<logger name="druid.sql" level="WARN"/>
<!-- MyBatis log configure -->
<logger name="com.apache.ibatis" level="INFO"/>
<logger name="org.mybatis.spring" level="INFO"/>
<logger name="java.sql.Connection" level="INFO"/>
<logger name="java.sql.Statement" level="INFO"/>
<logger name="java.sql.PreparedStatement" level="INFO"/>
<logger name="com.apache.ibatis" level="WARN"/>
<logger name="org.mybatis.spring" level="WARN"/>
<logger name="java.sql.Connection" level="WARN"/>
<logger name="java.sql.Statement" level="WARN"/>
<logger name="java.sql.PreparedStatement" level="WARN"/>
<!-- 减少部分debug日志 -->
<logger name="druid.sql" level="INFO"/>

Loading…
Cancel
Save