代码提交

master
liuqingkun 3 years ago
parent 3f1b46cc57
commit 9b47491db2
  1. 9
      pom.xml
  2. 39
      src/main/java/org/springblade/common/cache/DictBizCache.java
  3. 5
      src/main/java/org/springblade/common/config/SwaggerConfiguration.java
  4. 22
      src/main/java/org/springblade/common/constant/BusinessConstant.java
  5. 23
      src/main/java/org/springblade/modules/business/controller/ApmConfigController.java
  6. 15
      src/main/java/org/springblade/modules/business/controller/ApmRecordController.java
  7. 2
      src/main/java/org/springblade/modules/business/controller/ArticleController.java
  8. 15
      src/main/java/org/springblade/modules/business/controller/BlacklistController.java
  9. 43
      src/main/java/org/springblade/modules/business/controller/CommonApiController.java
  10. 2
      src/main/java/org/springblade/modules/business/mapper/ApmConfigMapper.java
  11. 10
      src/main/java/org/springblade/modules/business/mapper/ApmConfigMapper.xml
  12. 13
      src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.java
  13. 10
      src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.xml
  14. 11
      src/main/java/org/springblade/modules/business/service/IApmRecordService.java
  15. 40
      src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java
  16. 16
      src/main/java/org/springblade/modules/business/service/impl/ApmRecordServiceImpl.java
  17. 4
      src/main/java/org/springblade/modules/business/service/impl/ArticleServiceImpl.java
  18. 93
      src/main/java/org/springblade/modules/business/timer/BlacklistTimerJob.java
  19. 44
      src/main/java/org/springblade/modules/business/timer/QuartzConfig.java
  20. 16
      src/main/java/org/springblade/modules/system/controller/DictBizController.java
  21. 2
      src/main/resources/application-dev.yml

@ -186,6 +186,15 @@
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
</dependencies>
<build>

@ -16,9 +16,11 @@
*/
package org.springblade.common.cache;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.common.enums.DictBizEnum;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.SpringUtil;
import org.springblade.core.tool.utils.StringPool;
import org.springblade.modules.system.entity.DictBiz;
@ -113,4 +115,41 @@ public class DictBizCache {
return CacheUtil.get(DICT_CACHE, keyPrefix, code, () -> dictService.getList(code));
}
private static final String COMMON_BUSINESS_DICT_KEY = "1";
/**
* 从redis中获取配置数据, 默认过期时间60分钟
*
* @param dictCode
* @return
*/
public static Integer getDictValueWithOffset(String dictCode) {
Integer value = CacheUtil.get(DICT_VALUE, dictCode, COMMON_BUSINESS_DICT_KEY, () -> null);
if (Func.isEmpty(value)) {
String valueStr = dictService.getValue(dictCode, DictBizCache.COMMON_BUSINESS_DICT_KEY);
if (Func.isBlank(valueStr)) {
switch (dictCode) {
case "hc_blacklist_outdate":
value = BusinessConstant.DEFAULT_BLACKLIST_OUTDATE;
break;
case "hc_apm_config_deadline":
value = BusinessConstant.DEFAULT_APM_CONFIG_DEADLINE;
break;
case "hc_reneged_times_to_blacklist":
value = BusinessConstant.DEFAULT_RENEGED_TIMES_TO_BLACKLIST;
break;
default:
value = 0;
break;
}
} else {
value = Integer.parseInt(valueStr);
}
CacheUtil.put(DICT_VALUE, dictCode, COMMON_BUSINESS_DICT_KEY, value);
}
return value;
}
}

@ -68,6 +68,11 @@ public class SwaggerConfiguration {
Arrays.asList(AppConstant.BASE_PACKAGES + ".modules.system", AppConstant.BASE_PACKAGES + ".modules.resource"));
}
@Bean
public Docket businessDocket() {
return docket("业务模块", Collections.singletonList(AppConstant.BASE_PACKAGES + ".modules.business"));
}
@Bean
public Docket flowDocket() {
return docket("工作流模块", Collections.singletonList(AppConstant.BASE_PACKAGES + ".flow"));

@ -7,7 +7,8 @@ package org.springblade.common.constant;
*/
public interface BusinessConstant {
String DATE_STR_HMS = " 00:00:00";
String DATE_STR_DAY_START_HMS = " 00:00:00";
String DATE_STR_DAY_END_HMS = " 23:59:59";
String ROLE_NAME_HOSPITAL = "医院";
@ -36,17 +37,22 @@ public interface BusinessConstant {
String MAP_KEY_APM_CONFIG_LIST_ENABLE_APM = "enableApm"; // 是否可预约
/**
* 预约记录状态 0:已保存,1已取消,2:未报到, 3:已报到
* 预约记录状态 1已取消,2:未报到, 3:已报到
*/
Integer RECORD_STATUS_SAVE = 0;
Integer RECORD_STATUS_CANCEL = 1;
Integer RECORD_STATUS_UNREGISTER = 2;
Integer RECORD_STATUS_REGISTER = 3;
// 黑名单自动解除时间
Integer BLACKLIST_RANGE = 10;
// 医院放号限制时间
Integer HOSPITAL_APM_CONFIG_RANGE = 7;
// 默认值-黑名单自动解除时间
Integer DEFAULT_BLACKLIST_OUTDATE = 10;
// 默认值-医院放号限制时间
Integer DEFAULT_APM_CONFIG_DEADLINE = 7;
// 默认值-添加黑名单的违约次数
Integer DEFAULT_RENEGED_TIMES_TO_BLACKLIST = 2;
String DICT_KEY_HC_HEALTH = "hc_project";
String DICT_KEY_BLACKLIST_OUTDATE = "hc_blacklist_outdate";
String DICT_KEY_APM_CONFIG_DEADLINE = "hc_apm_config_deadline";
String DICT_KEY_RENEGED_TIMES_TO_BLACKLIST = "hc_reneged_times_to_blacklist";
}

@ -2,9 +2,9 @@ package org.springblade.modules.business.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.xiaoymin.knife4j.annotations.ApiSort;
import io.swagger.annotations.*;
import lombok.AllArgsConstructor;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.common.constant.CommonConstant;
import org.springblade.common.enums.ErrorMsgEnum;
import org.springblade.common.utils.CommonDateUtil;
@ -13,6 +13,7 @@ import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tenant.annotation.TenantDS;
import org.springblade.core.tool.api.R;
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.ApmConfig;
@ -22,6 +23,7 @@ import org.springblade.modules.business.vo.ApmConfigVO;
import org.springblade.modules.business.wrapper.ApmConfigWrapper;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -34,7 +36,6 @@ import java.util.Map;
@RestController
@RequestMapping(CommonConstant.APPLICATION_BUSINESS_NAME + "/apm-config")
@AllArgsConstructor
@ApiSort(2)
@Api(value = "放号配置接口", tags = "放号配置接口")
public class ApmConfigController extends BladeController {
@ -132,6 +133,9 @@ public class ApmConfigController extends BladeController {
return R.fail(ErrorMsgEnum.PARAMS_NULL_CREATE_DEPT.getValue());
}
startTime = Func.isNotBlank(startTime) ? startTime + BusinessConstant.DATE_STR_DAY_START_HMS : startTime;
endTime = Func.isNotBlank(endTime) ? endTime + BusinessConstant.DATE_STR_DAY_END_HMS : endTime;
return R.data(apmConfigService.selectPage(Condition.getPage(query), createDept, startTime, endTime, project));
}
@ -139,10 +143,19 @@ public class ApmConfigController extends BladeController {
* 新增
*/
@PostMapping("/save")
public R save(Long createDept, List<String> dayList, List<ApmConfigListVO> configListVOS) {
String msg = apmConfigService.saveCheck(createDept, dayList, configListVOS);
public R save(@RequestBody Map<String, Object> request) {
Long createDept = Long.valueOf((String) request.get("createDept"));
List<String> dayList = (List<String>) request.get("dayList");
List<Object> configListVOS = (List<Object>) request.get("configListVOS");
List<ApmConfigListVO> vos = new ArrayList<>();
configListVOS.forEach(vo ->{
vos.add(BeanUtil.copy(vo, ApmConfigListVO.class));
});
String msg = apmConfigService.saveCheck(createDept, dayList, vos);
if (Func.isBlank(msg)) {
apmConfigService.saveApmConfig(createDept, dayList, configListVOS);
apmConfigService.saveApmConfig(createDept, dayList, vos);
return R.status(true);
} else {
return R.fail(msg);

@ -2,7 +2,6 @@ package org.springblade.modules.business.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSort;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@ -36,7 +35,6 @@ import java.util.List;
@RestController
@RequestMapping(CommonConstant.APPLICATION_BUSINESS_NAME + "/apm-record")
@AllArgsConstructor
@ApiSort(2)
@Api(value = "预约记录接口", tags = "预约记录接口")
public class ApmRecordController extends BladeController {
@ -86,7 +84,7 @@ public class ApmRecordController extends BladeController {
@PostMapping("/cancel")
@ApiOperationSupport(order = 3)
@ApiOperation(value = "取消预约", notes = "取消预约")
public R cancel(Long id) {
public R cancel(@RequestParam Long id) {
if (Func.isEmpty(id)) {
return R.fail(ErrorMsgEnum.PARAMS_NULL_OBJECT_ID.getValue());
}
@ -94,7 +92,7 @@ public class ApmRecordController extends BladeController {
ApmRecord record = recordService.getById(id);
if (Func.isNotEmpty(record)) {
record.setApmStatus(BusinessConstant.RECORD_STATUS_CANCEL);
recordService.save(record);
recordService.updateById(record);
} else {
return R.fail("取消预约失败, 未找到对应预约记录");
}
@ -110,12 +108,13 @@ public class ApmRecordController extends BladeController {
@ApiImplicitParam(name = "createDept", value = "医院ID", paramType = "query", dataType = "integer"),
@ApiImplicitParam(name = "startTime", value = "查询开始时间", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "endTime", value = "查询结束时间", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "cupCardNo", value = "体检人证件号", paramType = "query", dataType = "String")
@ApiImplicitParam(name = "cupCardNo", value = "体检人证件号", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "project", value = "体检项目", paramType = "query", dataType = "String")
})
@ApiOperationSupport(order = 4)
@ApiOperation(value = "分页", notes = "传入notice")
public R<IPage<ApmRecordVO>> selectPage(Query query, Long createDept, String startTime, String endTime, String cupCardNo) {
IPage<ApmRecordVO> page = recordService.selectPage(Condition.getPage(query), createDept, startTime, endTime, cupCardNo);
public R<IPage<ApmRecordVO>> selectPage(Query query, Long createDept, String startTime, String endTime, String cupCardNo, String project) {
IPage<ApmRecordVO> page = recordService.selectPage(Condition.getPage(query), createDept, startTime, endTime, cupCardNo, project);
return R.data(page);
}
@ -149,7 +148,7 @@ public class ApmRecordController extends BladeController {
}
record.setApmTime(DateUtil.now());
record.setApmStatus(BusinessConstant.RECORD_STATUS_SAVE);
record.setApmStatus(BusinessConstant.RECORD_STATUS_UNREGISTER);
}
String checkMsg = recordService.checkApmRecordSave(apmRecordList);

@ -2,7 +2,6 @@ package org.springblade.modules.business.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSort;
import io.swagger.annotations.*;
import lombok.AllArgsConstructor;
import org.springblade.common.constant.BusinessConstant;
@ -28,7 +27,6 @@ import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping(CommonConstant.APPLICATION_BUSINESS_NAME + "/article")
@AllArgsConstructor
@ApiSort(2)
@Api(value = "文章接口", tags = "文章接口")
public class ArticleController extends BladeController {

@ -3,9 +3,9 @@ package org.springblade.modules.business.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSort;
import io.swagger.annotations.*;
import lombok.AllArgsConstructor;
import org.springblade.common.cache.DictBizCache;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.common.constant.CommonConstant;
import org.springblade.common.enums.ErrorMsgEnum;
@ -15,20 +15,14 @@ import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tenant.annotation.TenantDS;
import org.springblade.core.tool.api.R;
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.Blacklist;
import org.springblade.modules.business.service.IBlacklistService;
import org.springblade.modules.business.vo.BlacklistVO;
import org.springblade.modules.business.vo.DeptCmpVO;
import org.springblade.modules.business.wrapper.BlacklistWrapper;
import org.springblade.modules.system.entity.Dept;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
* 控制器
*
@ -38,7 +32,6 @@ import java.util.List;
@RestController
@RequestMapping(CommonConstant.APPLICATION_BUSINESS_NAME + "/blacklist")
@AllArgsConstructor
@ApiSort(2)
@Api(value = "黑名单接口", tags = "黑名单接口")
public class BlacklistController extends BladeController {
@ -95,12 +88,12 @@ public class BlacklistController extends BladeController {
}
Blacklist blacklist = blacklistService.getLatelyRecord(cupCardNo);
if (Func.isNotEmpty(blacklist) && CommonDateUtil.daysBetween(DateUtil.now(), blacklist.getCreateTime()) < BusinessConstant.BLACKLIST_RANGE) {
int blacklistOutdate = DictBizCache.getDictValueWithOffset(BusinessConstant.DICT_KEY_BLACKLIST_OUTDATE);
if (Func.isNotEmpty(blacklist) && CommonDateUtil.daysBetween(DateUtil.now(), blacklist.getCreateTime()) < blacklistOutdate) {
int days = CommonDateUtil.daysBetween(blacklist.getCreateTime(), DateUtil.now());
return R.data("由于您未及时进行报到,已被拉黑请于" + (BusinessConstant.BLACKLIST_RANGE - days) + "日后再次进行预约");
return R.data("由于您未及时进行报到,已被拉黑请于" + (blacklistOutdate - days) + "日后再次进行预约");
}
return R.data("");

@ -0,0 +1,43 @@
package org.springblade.modules.business.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.*;
import lombok.AllArgsConstructor;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.common.constant.CommonConstant;
import org.springblade.common.utils.CommonDateUtil;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tenant.annotation.TenantDS;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.business.entity.Article;
import org.springblade.modules.business.service.IArticleService;
import org.springblade.modules.business.vo.ArticleVO;
import org.springblade.modules.business.wrapper.ArticleWrapper;
import org.springframework.web.bind.annotation.*;
/**
* 控制器
*
* @author Chill
*/
@TenantDS
@RestController
@RequestMapping(CommonConstant.APPLICATION_BUSINESS_NAME + "/common-api")
@AllArgsConstructor
@Api(value = "公共接口", tags = "公共接口")
public class CommonApiController extends BladeController {
/**
* 获取系统时间
*/
@GetMapping("/get-system-datetime")
@ApiOperationSupport(order = 1)
@ApiOperation(value = "获取系统时间", notes = "获取系统时间")
public R getSystemDatetime() {
return R.data(CommonDateUtil.getNowString());
}
}

@ -39,6 +39,6 @@ public interface ApmConfigMapper extends BaseMapper<ApmConfig> {
List<ApmConfig> selectConfigList(@Param("createDept") Long createDept, @Param("apmDay") String apmDay, @Param("project") String project);
void deleteConfig(@Param("createDept") Long createDept, @Param("apmDayList") List<String> apmDayList, @Param("projectList") List<String> projectList);
void deleteConfig(@Param("createDept") Long createDept, @Param("apmDayListStr") String apmDayListStr, @Param("projectListStr") String projectListStr);
}

@ -58,13 +58,7 @@
<delete id="deleteConfig">
delete from ca_apm_config ac where ac.create_dept = #{createDept}
and ac.project in
<foreach collection="list" item="project" index="index" open="(" close=")" separator=", ">
#{projectList}
</foreach>
and ac.apm_day in
<foreach collection="list" item="dayStr" index="index" open="(" close=")" separator=", ">
#{apmDayList}
</foreach>
and ac.project in ${projectListStr}
and ac.apm_day in ${apmDayListStr}
</delete>
</mapper>

@ -26,11 +26,20 @@ public interface ApmRecordMapper extends BaseMapper<ApmRecord> {
* @param cupCardNo
* @return
*/
List<ApmRecord> selectPage(IPage page, @Param("createDept") Long createDept, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("cupCardNo") String cupCardNo);
List<ApmRecord> selectPage(IPage page, @Param("createDept") Long createDept, @Param("startTime") String startTime, @Param("endTime") String endTime,
@Param("cupCardNo") String cupCardNo, @Param("project") String project);
List<ApmRecordCountDTO> countAmpNum(@Param("createDept") Long createDept, @Param("apmDay") String apmDay);
List<ApmRecordCountDTO> countAmpNumWithDays(@Param("createDept") Long createDept, @Param("apmDay") List<String> apmDayList);
List<ApmRecordCountDTO> countAmpNumWithDays(@Param("createDept") Long createDept, @Param("apmDayList") List<String> apmDayList);
/**
* 统计所有违约预约记录, 查询条件: blacklistFlag = 0 and apmTime < DateUtil.now() and apmStatus in [0, 2]
* <p>
* 按预约人分组
*
* @return
*/
List<Map<String, Object>> getRenegedCountList();
}

@ -48,6 +48,9 @@
<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>
</select>
<select id="countAmpNum" resultMap="ApmRecordCountDTOResultMap">
@ -66,4 +69,11 @@
</foreach>
group by DATE_FORMAT(apm_day, '%Y-%m-%d'), project, period, time_frame
</select>
<select id="getRenegedCountList" resultType="map">
SELECT create_dept AS createDept, cup_name AS cupName, cup_card_no AS cupCardNo,cup_phone AS cupPhone, COUNT(id) AS renegedTimes
FROM ca_apm_record
WHERE blacklist_flag = 0 AND apm_day &lt;= NOW() AND apm_status = 2
GROUP BY create_dept, cup_name, cup_card_no,cup_phone
</select>
</mapper>

@ -30,11 +30,20 @@ public interface IApmRecordService extends BaseService<ApmRecord> {
* @param cupCardNo
* @return
*/
IPage<ApmRecordVO> selectPage(IPage<ApmRecordVO> page, Long createDept, String startTime, String endTime, String cupCardNo);
IPage<ApmRecordVO> selectPage(IPage<ApmRecordVO> page, Long createDept, String startTime, String endTime, String cupCardNo, String project);
String checkApmRecordSave(List<ApmRecord> apmRecordList);
List<ApmRecordCountDTO> countAmpNum(Long createDept, String apmDay);
List<ApmRecordCountDTO> countAmpNum(Long createDept, List<String> apmDayList);
/**
* 统计所有违约预约记录, 查询条件: blacklistFlag = 0 and apmTime < DateUtil.now() and apmStatus = 2
* <p>
* 按预约人分组
*
* @return
*/
List<Map<String, Object>> getRenegedCountList();
}

@ -3,6 +3,8 @@ package org.springblade.modules.business.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.apache.ibatis.annotations.Param;
import org.springblade.common.cache.DictBizCache;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.common.utils.CommonDateUtil;
import org.springblade.core.mp.base.BaseServiceImpl;
@ -165,10 +167,13 @@ public class ApmConfigServiceImpl extends BaseServiceImpl<ApmConfigMapper, ApmCo
// 1. 先根据用户角色判断放号的天是否短于提前几天放号的配置
BladeUser user = AuthUtil.getUser();
int configSubDays = BusinessConstant.ROLE_NAME_HOSPITAL.equals(user.getRoleName()) ? BusinessConstant.HOSPITAL_APM_CONFIG_RANGE : 1;
if (Func.isEmpty(user)) {
return "请先登录";
}
int configSubDays = BusinessConstant.ROLE_NAME_HOSPITAL.equals(user.getRoleName()) ? DictBizCache.getDictValueWithOffset(BusinessConstant.DICT_KEY_APM_CONFIG_DEADLINE) : 1;
List<ApmConfig> configList = new ArrayList<>();
for (String day : dayList) {
Date configApmDay = DateUtil.parse(day + BusinessConstant.DATE_STR_HMS, DateUtil.PATTERN_DATETIME);
Date configApmDay = DateUtil.parse(day + BusinessConstant.DATE_STR_DAY_START_HMS, DateUtil.PATTERN_DATETIME);
int subDays = CommonDateUtil.daysBetween(DateUtil.now(), configApmDay);
if (subDays < configSubDays) {
return "保存失败, 只能保存" + configSubDays + "天之后的放号配置";
@ -189,7 +194,7 @@ public class ApmConfigServiceImpl extends BaseServiceImpl<ApmConfigMapper, ApmCo
}
}
daySearchList.add(day + BusinessConstant.DATE_STR_HMS);
daySearchList.add(day + BusinessConstant.DATE_STR_DAY_START_HMS);
}
// 根据医院, 日期 查询该日期是否已有放号配置, 若有且已被预约, 放号数量只能增加, 不能减少
@ -198,9 +203,13 @@ public class ApmConfigServiceImpl extends BaseServiceImpl<ApmConfigMapper, ApmCo
.in(ApmConfig::getApmDay, daySearchList));
Map<String, ApmConfig> alreadyConfMap = new HashMap<>();
if (Func.isNotEmpty(alreadyConfList)) {
alreadyConfMap = alreadyConfList.stream().collect(Collectors.toMap(
config -> config.getProject() + config.getApmDay() + config.getProject() + config.getTimeFrame(), Function.identity()
));
for (ApmConfig config : alreadyConfList) {
String key = config.getProject() + config.getApmDay() + config.getProject() + config.getTimeFrame();
if (alreadyConfMap.containsKey(key)){
continue;
}
alreadyConfMap.put(key, config);
}
List<ApmRecordCountDTO> records = recordService.countAmpNum(createDept, daySearchList);
if (Func.isEmpty(records)) {
@ -214,7 +223,7 @@ public class ApmConfigServiceImpl extends BaseServiceImpl<ApmConfigMapper, ApmCo
String key = config.getProject() + config.getApmDay() + config.getProject() + config.getTimeFrame();
// 若此次修改的放号没有对应的放号配置或已预约统计为0, 验证通过
if (alreadyConfCountMap.containsKey(key) || alreadyConfCountMap.containsKey(key)) {
if (alreadyConfMap.containsKey(key) || alreadyConfCountMap.containsKey(key)) {
continue;
}
@ -246,21 +255,30 @@ public class ApmConfigServiceImpl extends BaseServiceImpl<ApmConfigMapper, ApmCo
Integer numberNum = detail.containsKey(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_NUMBER_NUM) ? (Integer) detail.get(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_NUMBER_NUM) : 0;
ApmConfig config = BeanUtil.copy(vo, ApmConfig.class);
config.setApmDay(DateUtil.parse(day, DateUtil.PATTERN_DATETIME));
config.setApmDay(DateUtil.parse(day, DateUtil.PATTERN_DATE));
config.setPeriod(period);
config.setTimeFrame(timeFrame);
config.setNumberNum(numberNum);
configList.add(config);
}
}
daySearchList.add(day + BusinessConstant.DATE_STR_HMS);
daySearchList.add(day + BusinessConstant.DATE_STR_DAY_START_HMS);
}
// 首先, 根据(医院,体检项目,日期)将放号配置删除, 然后重新添加放号配置
deleteConfig(createDept, daySearchList, projectList);
saveBatch(configList);
}
baseMapper.deleteConfig(createDept, daySearchList, projectList);
private void deleteConfig(Long createDept, List<String> apmDayList, List<String> projectList) {
String apmDayStr = "('" + String.join("', '", apmDayList) + "')";
String projectStr = "('" + String.join("', '", projectList) + "')";
saveBatch(configList);
System.out.println("==========================================");
System.out.println(apmDayStr);
System.out.println(projectStr);
System.out.println("==========================================");
baseMapper.deleteConfig(createDept, apmDayStr, projectStr);
}
}

@ -3,6 +3,7 @@ package org.springblade.modules.business.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springblade.common.cache.DictBizCache;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.common.enums.ErrorMsgEnum;
import org.springblade.common.utils.CommonDateUtil;
@ -24,6 +25,7 @@ import org.springblade.modules.system.service.IDictService;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
@ -39,8 +41,8 @@ public class ApmRecordServiceImpl extends BaseServiceImpl<ApmRecordMapper, ApmRe
private final IBlacklistService blacklistService;
@Override
public IPage<ApmRecordVO> selectPage(IPage<ApmRecordVO> page, Long createDept, String startTime, String endTime, String cupCardNo) {
List<ApmRecord> recordList = baseMapper.selectPage(page, createDept, startTime, endTime, cupCardNo);
public IPage<ApmRecordVO> selectPage(IPage<ApmRecordVO> page, Long createDept, String startTime, String endTime, String cupCardNo, String project) {
List<ApmRecord> recordList = baseMapper.selectPage(page, createDept, startTime, endTime, cupCardNo, project);
return page.setRecords(ApmRecordWrapper.build().listVO(recordList));
}
@ -51,7 +53,7 @@ public class ApmRecordServiceImpl extends BaseServiceImpl<ApmRecordMapper, ApmRe
// 判断用户是否正在被拉黑
Blacklist blacklist = blacklistService.getLatelyRecord(cupCardNo);
if (Func.isNotEmpty(blacklist) && CommonDateUtil.daysBetween(DateUtil.now(), blacklist.getCreateTime()) < BusinessConstant.BLACKLIST_RANGE) {
if (Func.isNotEmpty(blacklist) && CommonDateUtil.daysBetween(DateUtil.now(), blacklist.getCreateTime()) < DictBizCache.getDictValueWithOffset(BusinessConstant.DICT_KEY_BLACKLIST_OUTDATE)) {
return ErrorMsgEnum.USER_IN_BLACKLIST.getValue();
}
@ -78,7 +80,8 @@ public class ApmRecordServiceImpl extends BaseServiceImpl<ApmRecordMapper, ApmRe
@Override
public List<ApmRecordCountDTO> countAmpNum(Long createDept, String apmDay) {
return baseMapper.countAmpNum(createDept, apmDay);
// String[] days = {apmDay};
return baseMapper.countAmpNumWithDays(createDept, Arrays.asList(apmDay));
}
@Override
@ -86,4 +89,9 @@ public class ApmRecordServiceImpl extends BaseServiceImpl<ApmRecordMapper, ApmRe
return baseMapper.countAmpNumWithDays(createDept, apmDayList);
}
@Override
public List<Map<String, Object>> getRenegedCountList() {
return baseMapper.getRenegedCountList();
}
}

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.business.entity.Article;
import org.springblade.modules.business.mapper.ArticleMapper;
@ -56,7 +57,8 @@ public class ArticleServiceImpl extends BaseServiceImpl<ArticleMapper, Article>
baseMapper.updatePublishSta(articleCheck.getId(), BusinessConstant.ARTICLE_STATUS_CANCEL);
}
article.setPublishSta(BusinessConstant.ARTICLE_STATUS_CANCEL + "");
article.setPublishSta(BusinessConstant.ARTICLE_STATUS_PUBLISH + "");
article.setPublishTime(DateUtil.now());
saveOrUpdate(article);
return true;
}

@ -0,0 +1,93 @@
package org.springblade.modules.business.timer;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springblade.common.cache.DictBizCache;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.common.utils.CommonDateUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.modules.business.entity.ApmRecord;
import org.springblade.modules.business.entity.Blacklist;
import org.springblade.modules.business.service.IApmRecordService;
import org.springblade.modules.business.service.IBlacklistService;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* 黑名单定时任务处理
*
* @author Administrator
*/
@Component
@Slf4j
@RequiredArgsConstructor
public class BlacklistTimerJob extends QuartzJobBean {
private final IBlacklistService blacklistService;
private final IApmRecordService recordService;
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
addToBlacklist();
}
/**
* 添加黑名单
*/
public void addToBlacklist() {
// 获取配置的加入黑名单违约次数
int configRenegedTimes = DictBizCache.getDictValueWithOffset(BusinessConstant.DICT_KEY_RENEGED_TIMES_TO_BLACKLIST);
// 1. 查询所有违约预约记录, 查询条件: blacklistFlag = 0 and apmTime < DateUtil.now() and apmStatus = 2
// 2. 若未记录的违约记录 >= renegedTimes, 添加黑名单, 更新违约记录的 blacklistFlag = 1
List<ApmRecord> renegedList = recordService.list(Wrappers.<ApmRecord>lambdaQuery()
.eq(ApmRecord::getBlacklistFlag, BusinessConstant.BOOLEAN_INT_FALSE)
.eq(ApmRecord::getApmStatus, BusinessConstant.RECORD_STATUS_UNREGISTER)
.le(ApmRecord::getApmTime, DateUtil.now()));
List<ApmRecord> recordUpdateList = new ArrayList<>();
List<Blacklist> blacklists = new ArrayList<>();
List<Map<String, Object>> renegedCountList = recordService.getRenegedCountList();
for (Map<String, Object> item : renegedCountList) {
Long createDept = (Long) item.get("createDept");
String cupName = (String) item.get("cupName");
String cupCardNo = (String) item.get("cupCardNo");
String cupPhone = (String) item.get("cupPhone");
int renegedTimes = (Integer) item.get("renegedTimes");
// 若未达到
if (renegedTimes < configRenegedTimes) {
continue;
}
// 2. 若未记录的违约记录 >= renegedTimes, 添加黑名单,
Blacklist blacklist = new Blacklist();
blacklist.setCreateDept(createDept);
blacklist.setCupName(cupName);
blacklist.setCupCardNo(cupCardNo);
blacklist.setCupPhone(cupPhone);
blacklist.setApmTime(DateUtil.now());
blacklists.add(blacklist);
// 更新违约记录的 blacklistFlag = 1
for (ApmRecord record : renegedList) {
if (record.getCupCardNo().equals(cupCardNo)) {
record.setBlacklistFlag(BusinessConstant.BOOLEAN_INT_TRUE);
recordUpdateList.add(record);
}
}
blacklistService.saveBatch(blacklists);
recordService.updateBatchById(recordUpdateList);
}
}
}

@ -0,0 +1,44 @@
package org.springblade.modules.business.timer;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QuartzConfig {
/**
* 添加黑名单定时任务表达式, 每天23:00执行
*/
private String CRON_BLACKLIST_JOB = "0 0 23 * * ?";
/**
* 创建定时任务
*/
@Bean
public JobDetail blacklistTimerJobDetail() {
JobDetail jobDetail = JobBuilder.newJob(BlacklistTimerJob.class)
.withIdentity("blacklistTimerJobDetail", "blacklist_job")
.usingJobData("userName", "admin")
.storeDurably()
.build();
return jobDetail;
}
/**
* 创建触发器
*/
@Bean
public Trigger blacklistTimerJobTrigger() {
//每隔5秒执行一次
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(CRON_BLACKLIST_JOB);
//创建触发器
Trigger trigger = TriggerBuilder.newTrigger()
.forJob(blacklistTimerJobDetail())
.withIdentity("blacklistTimerJobTrigger", "BLACKLIST_JOB_TRIGGER")
.withSchedule(cronScheduleBuilder)
.build();
return trigger;
}
}

@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.annotations.*;
import lombok.AllArgsConstructor;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.cache.utils.CacheUtil;
import org.springblade.core.launch.constant.AppConstant;
@ -176,5 +177,20 @@ public class DictBizController extends BladeController {
return R.data(DictBizWrapper.build().listNodeVO(tree));
}
@GetMapping("/get-hc-project")
@ApiOperationSupport(order = 10)
@ApiOperation(value = "获取体检项目", notes = "获取体检项目")
public R<List<DictBizVO>> getHcProject() {
List<DictBiz> tree = dictService.getList(BusinessConstant.DICT_KEY_HC_HEALTH);
return R.data(DictBizWrapper.build().listNodeVO(tree));
}
@GetMapping("/get-apm-config-deadline")
@ApiOperationSupport(order = 11)
@ApiOperation(value = "获取医院放号截至时间", notes = "获取医院放号截至时间")
public R<List<DictBizVO>> getHcApmConfigDeadline() {
List<DictBiz> tree = dictService.getList(BusinessConstant.DICT_KEY_APM_CONFIG_DEADLINE);
return R.data(DictBizWrapper.build().listNodeVO(tree));
}
}

@ -23,7 +23,7 @@ blade:
address: redis://127.0.0.1:6379
#本地文件上传
file:
remote-mode: true
remote-mode: false
upload-domain: http://localhost:8999
remote-path: /usr/share/nginx/html

Loading…
Cancel
Save