diff --git a/pom.xml b/pom.xml index dc99a61..5801c63 100644 --- a/pom.xml +++ b/pom.xml @@ -186,6 +186,15 @@ lombok provided + + org.springframework.boot + spring-boot-starter-quartz + + + org.quartz-scheduler + quartz + 2.3.2 + diff --git a/src/main/java/org/springblade/common/cache/DictBizCache.java b/src/main/java/org/springblade/common/cache/DictBizCache.java index 180b49d..8ae5acc 100644 --- a/src/main/java/org/springblade/common/cache/DictBizCache.java +++ b/src/main/java/org/springblade/common/cache/DictBizCache.java @@ -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; + } } diff --git a/src/main/java/org/springblade/common/config/SwaggerConfiguration.java b/src/main/java/org/springblade/common/config/SwaggerConfiguration.java index 1a0bdd4..4f9d3cd 100644 --- a/src/main/java/org/springblade/common/config/SwaggerConfiguration.java +++ b/src/main/java/org/springblade/common/config/SwaggerConfiguration.java @@ -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")); diff --git a/src/main/java/org/springblade/common/constant/BusinessConstant.java b/src/main/java/org/springblade/common/constant/BusinessConstant.java index b97b6f3..78c3759 100644 --- a/src/main/java/org/springblade/common/constant/BusinessConstant.java +++ b/src/main/java/org/springblade/common/constant/BusinessConstant.java @@ -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"; } diff --git a/src/main/java/org/springblade/modules/business/controller/ApmConfigController.java b/src/main/java/org/springblade/modules/business/controller/ApmConfigController.java index 8a3c093..ced1c2c 100644 --- a/src/main/java/org/springblade/modules/business/controller/ApmConfigController.java +++ b/src/main/java/org/springblade/modules/business/controller/ApmConfigController.java @@ -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 dayList, List configListVOS) { - String msg = apmConfigService.saveCheck(createDept, dayList, configListVOS); + public R save(@RequestBody Map request) { + Long createDept = Long.valueOf((String) request.get("createDept")); + List dayList = (List) request.get("dayList"); + List configListVOS = (List) request.get("configListVOS"); + + List 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); diff --git a/src/main/java/org/springblade/modules/business/controller/ApmRecordController.java b/src/main/java/org/springblade/modules/business/controller/ApmRecordController.java index 97da61a..9d44793 100644 --- a/src/main/java/org/springblade/modules/business/controller/ApmRecordController.java +++ b/src/main/java/org/springblade/modules/business/controller/ApmRecordController.java @@ -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> selectPage(Query query, Long createDept, String startTime, String endTime, String cupCardNo) { - IPage page = recordService.selectPage(Condition.getPage(query), createDept, startTime, endTime, cupCardNo); + public R> selectPage(Query query, Long createDept, String startTime, String endTime, String cupCardNo, String project) { + IPage 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); diff --git a/src/main/java/org/springblade/modules/business/controller/ArticleController.java b/src/main/java/org/springblade/modules/business/controller/ArticleController.java index 3e772a9..c7b7705 100644 --- a/src/main/java/org/springblade/modules/business/controller/ArticleController.java +++ b/src/main/java/org/springblade/modules/business/controller/ArticleController.java @@ -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 { diff --git a/src/main/java/org/springblade/modules/business/controller/BlacklistController.java b/src/main/java/org/springblade/modules/business/controller/BlacklistController.java index 1bab03e..dee0b2a 100644 --- a/src/main/java/org/springblade/modules/business/controller/BlacklistController.java +++ b/src/main/java/org/springblade/modules/business/controller/BlacklistController.java @@ -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(""); diff --git a/src/main/java/org/springblade/modules/business/controller/CommonApiController.java b/src/main/java/org/springblade/modules/business/controller/CommonApiController.java new file mode 100644 index 0000000..d0da8a2 --- /dev/null +++ b/src/main/java/org/springblade/modules/business/controller/CommonApiController.java @@ -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()); + } +} diff --git a/src/main/java/org/springblade/modules/business/mapper/ApmConfigMapper.java b/src/main/java/org/springblade/modules/business/mapper/ApmConfigMapper.java index 5b9381d..112d534 100644 --- a/src/main/java/org/springblade/modules/business/mapper/ApmConfigMapper.java +++ b/src/main/java/org/springblade/modules/business/mapper/ApmConfigMapper.java @@ -39,6 +39,6 @@ public interface ApmConfigMapper extends BaseMapper { List selectConfigList(@Param("createDept") Long createDept, @Param("apmDay") String apmDay, @Param("project") String project); - void deleteConfig(@Param("createDept") Long createDept, @Param("apmDayList") List apmDayList, @Param("projectList") List projectList); + void deleteConfig(@Param("createDept") Long createDept, @Param("apmDayListStr") String apmDayListStr, @Param("projectListStr") String projectListStr); } diff --git a/src/main/java/org/springblade/modules/business/mapper/ApmConfigMapper.xml b/src/main/java/org/springblade/modules/business/mapper/ApmConfigMapper.xml index 59f6d33..2fa1c32 100644 --- a/src/main/java/org/springblade/modules/business/mapper/ApmConfigMapper.xml +++ b/src/main/java/org/springblade/modules/business/mapper/ApmConfigMapper.xml @@ -58,13 +58,7 @@ delete from ca_apm_config ac where ac.create_dept = #{createDept} - and ac.project in - - #{projectList} - - and ac.apm_day in - - #{apmDayList} - + and ac.project in ${projectListStr} + and ac.apm_day in ${apmDayListStr} diff --git a/src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.java b/src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.java index 29b25a4..4e7297d 100644 --- a/src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.java +++ b/src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.java @@ -26,11 +26,20 @@ public interface ApmRecordMapper extends BaseMapper { * @param cupCardNo * @return */ - List selectPage(IPage page, @Param("createDept") Long createDept, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("cupCardNo") String cupCardNo); + List selectPage(IPage page, @Param("createDept") Long createDept, @Param("startTime") String startTime, @Param("endTime") String endTime, + @Param("cupCardNo") String cupCardNo, @Param("project") String project); List countAmpNum(@Param("createDept") Long createDept, @Param("apmDay") String apmDay); - List countAmpNumWithDays(@Param("createDept") Long createDept, @Param("apmDay") List apmDayList); + List countAmpNumWithDays(@Param("createDept") Long createDept, @Param("apmDayList") List apmDayList); + /** + * 统计所有违约预约记录, 查询条件: blacklistFlag = 0 and apmTime < DateUtil.now() and apmStatus in [0, 2] + * + * 按预约人分组 + * + * @return + */ + List> getRenegedCountList(); } diff --git a/src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.xml b/src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.xml index 2180f32..6af2128 100644 --- a/src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.xml +++ b/src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.xml @@ -48,6 +48,9 @@ and ar.cup_card_no like concat(concat('%', #{cupCardNo}), '%') + + and ar.project like concat(concat('%', #{project}), '%') + @@ -66,4 +69,11 @@ group by DATE_FORMAT(apm_day, '%Y-%m-%d'), project, period, time_frame + + + 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 <= NOW() AND apm_status = 2 + GROUP BY create_dept, cup_name, cup_card_no,cup_phone + diff --git a/src/main/java/org/springblade/modules/business/service/IApmRecordService.java b/src/main/java/org/springblade/modules/business/service/IApmRecordService.java index 99839d5..d2d8ac3 100644 --- a/src/main/java/org/springblade/modules/business/service/IApmRecordService.java +++ b/src/main/java/org/springblade/modules/business/service/IApmRecordService.java @@ -30,11 +30,20 @@ public interface IApmRecordService extends BaseService { * @param cupCardNo * @return */ - IPage selectPage(IPage page, Long createDept, String startTime, String endTime, String cupCardNo); + IPage selectPage(IPage page, Long createDept, String startTime, String endTime, String cupCardNo, String project); String checkApmRecordSave(List apmRecordList); List countAmpNum(Long createDept, String apmDay); List countAmpNum(Long createDept, List apmDayList); + + /** + * 统计所有违约预约记录, 查询条件: blacklistFlag = 0 and apmTime < DateUtil.now() and apmStatus = 2 + * + * 按预约人分组 + * + * @return + */ + List> getRenegedCountList(); } diff --git a/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java index 1f1c7f3..5676f5e 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java @@ -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 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 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 records = recordService.countAmpNum(createDept, daySearchList); if (Func.isEmpty(records)) { @@ -214,7 +223,7 @@ public class ApmConfigServiceImpl extends BaseServiceImpl apmDayList, List 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); } } diff --git a/src/main/java/org/springblade/modules/business/service/impl/ApmRecordServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/ApmRecordServiceImpl.java index 9398f6e..b4ab121 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/ApmRecordServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/ApmRecordServiceImpl.java @@ -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 selectPage(IPage page, Long createDept, String startTime, String endTime, String cupCardNo) { - List recordList = baseMapper.selectPage(page, createDept, startTime, endTime, cupCardNo); + public IPage selectPage(IPage page, Long createDept, String startTime, String endTime, String cupCardNo, String project) { + List 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 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> getRenegedCountList() { + return baseMapper.getRenegedCountList(); + } + } diff --git a/src/main/java/org/springblade/modules/business/service/impl/ArticleServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/ArticleServiceImpl.java index 886c005..f15ece0 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/ArticleServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/ArticleServiceImpl.java @@ -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 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; } diff --git a/src/main/java/org/springblade/modules/business/timer/BlacklistTimerJob.java b/src/main/java/org/springblade/modules/business/timer/BlacklistTimerJob.java new file mode 100644 index 0000000..da6f11b --- /dev/null +++ b/src/main/java/org/springblade/modules/business/timer/BlacklistTimerJob.java @@ -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 renegedList = recordService.list(Wrappers.lambdaQuery() + .eq(ApmRecord::getBlacklistFlag, BusinessConstant.BOOLEAN_INT_FALSE) + .eq(ApmRecord::getApmStatus, BusinessConstant.RECORD_STATUS_UNREGISTER) + .le(ApmRecord::getApmTime, DateUtil.now())); + + List recordUpdateList = new ArrayList<>(); + List blacklists = new ArrayList<>(); + + + List> renegedCountList = recordService.getRenegedCountList(); + for (Map 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); + } + } +} diff --git a/src/main/java/org/springblade/modules/business/timer/QuartzConfig.java b/src/main/java/org/springblade/modules/business/timer/QuartzConfig.java new file mode 100644 index 0000000..4eb207c --- /dev/null +++ b/src/main/java/org/springblade/modules/business/timer/QuartzConfig.java @@ -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; + } +} diff --git a/src/main/java/org/springblade/modules/system/controller/DictBizController.java b/src/main/java/org/springblade/modules/system/controller/DictBizController.java index f64c48e..d7e198d 100644 --- a/src/main/java/org/springblade/modules/system/controller/DictBizController.java +++ b/src/main/java/org/springblade/modules/system/controller/DictBizController.java @@ -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> getHcProject() { + List 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> getHcApmConfigDeadline() { + List tree = dictService.getList(BusinessConstant.DICT_KEY_APM_CONFIG_DEADLINE); + return R.data(DictBizWrapper.build().listNodeVO(tree)); + } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 8861c11..04842df 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -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
+ * 按预约人分组 + * + * @return + */ + List> getRenegedCountList(); } diff --git a/src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.xml b/src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.xml index 2180f32..6af2128 100644 --- a/src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.xml +++ b/src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.xml @@ -48,6 +48,9 @@ and ar.cup_card_no like concat(concat('%', #{cupCardNo}), '%') + + and ar.project like concat(concat('%', #{project}), '%') + @@ -66,4 +69,11 @@ group by DATE_FORMAT(apm_day, '%Y-%m-%d'), project, period, time_frame + + + 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 <= NOW() AND apm_status = 2 + GROUP BY create_dept, cup_name, cup_card_no,cup_phone + diff --git a/src/main/java/org/springblade/modules/business/service/IApmRecordService.java b/src/main/java/org/springblade/modules/business/service/IApmRecordService.java index 99839d5..d2d8ac3 100644 --- a/src/main/java/org/springblade/modules/business/service/IApmRecordService.java +++ b/src/main/java/org/springblade/modules/business/service/IApmRecordService.java @@ -30,11 +30,20 @@ public interface IApmRecordService extends BaseService { * @param cupCardNo * @return */ - IPage selectPage(IPage page, Long createDept, String startTime, String endTime, String cupCardNo); + IPage selectPage(IPage page, Long createDept, String startTime, String endTime, String cupCardNo, String project); String checkApmRecordSave(List apmRecordList); List countAmpNum(Long createDept, String apmDay); List countAmpNum(Long createDept, List apmDayList); + + /** + * 统计所有违约预约记录, 查询条件: blacklistFlag = 0 and apmTime < DateUtil.now() and apmStatus = 2 + * + * 按预约人分组 + * + * @return + */ + List> getRenegedCountList(); } diff --git a/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java index 1f1c7f3..5676f5e 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java @@ -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 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 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 records = recordService.countAmpNum(createDept, daySearchList); if (Func.isEmpty(records)) { @@ -214,7 +223,7 @@ public class ApmConfigServiceImpl extends BaseServiceImpl apmDayList, List 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); } } diff --git a/src/main/java/org/springblade/modules/business/service/impl/ApmRecordServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/ApmRecordServiceImpl.java index 9398f6e..b4ab121 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/ApmRecordServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/ApmRecordServiceImpl.java @@ -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 selectPage(IPage page, Long createDept, String startTime, String endTime, String cupCardNo) { - List recordList = baseMapper.selectPage(page, createDept, startTime, endTime, cupCardNo); + public IPage selectPage(IPage page, Long createDept, String startTime, String endTime, String cupCardNo, String project) { + List 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 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> getRenegedCountList() { + return baseMapper.getRenegedCountList(); + } + } diff --git a/src/main/java/org/springblade/modules/business/service/impl/ArticleServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/ArticleServiceImpl.java index 886c005..f15ece0 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/ArticleServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/ArticleServiceImpl.java @@ -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 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; } diff --git a/src/main/java/org/springblade/modules/business/timer/BlacklistTimerJob.java b/src/main/java/org/springblade/modules/business/timer/BlacklistTimerJob.java new file mode 100644 index 0000000..da6f11b --- /dev/null +++ b/src/main/java/org/springblade/modules/business/timer/BlacklistTimerJob.java @@ -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 renegedList = recordService.list(Wrappers.lambdaQuery() + .eq(ApmRecord::getBlacklistFlag, BusinessConstant.BOOLEAN_INT_FALSE) + .eq(ApmRecord::getApmStatus, BusinessConstant.RECORD_STATUS_UNREGISTER) + .le(ApmRecord::getApmTime, DateUtil.now())); + + List recordUpdateList = new ArrayList<>(); + List blacklists = new ArrayList<>(); + + + List> renegedCountList = recordService.getRenegedCountList(); + for (Map 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); + } + } +} diff --git a/src/main/java/org/springblade/modules/business/timer/QuartzConfig.java b/src/main/java/org/springblade/modules/business/timer/QuartzConfig.java new file mode 100644 index 0000000..4eb207c --- /dev/null +++ b/src/main/java/org/springblade/modules/business/timer/QuartzConfig.java @@ -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; + } +} diff --git a/src/main/java/org/springblade/modules/system/controller/DictBizController.java b/src/main/java/org/springblade/modules/system/controller/DictBizController.java index f64c48e..d7e198d 100644 --- a/src/main/java/org/springblade/modules/system/controller/DictBizController.java +++ b/src/main/java/org/springblade/modules/system/controller/DictBizController.java @@ -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> getHcProject() { + List 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> getHcApmConfigDeadline() { + List tree = dictService.getList(BusinessConstant.DICT_KEY_APM_CONFIG_DEADLINE); + return R.data(DictBizWrapper.build().listNodeVO(tree)); + } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 8861c11..04842df 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -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
+ * 按预约人分组 + * + * @return + */ + List> getRenegedCountList(); } diff --git a/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java index 1f1c7f3..5676f5e 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java @@ -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 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 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 records = recordService.countAmpNum(createDept, daySearchList); if (Func.isEmpty(records)) { @@ -214,7 +223,7 @@ public class ApmConfigServiceImpl extends BaseServiceImpl apmDayList, List 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); } } diff --git a/src/main/java/org/springblade/modules/business/service/impl/ApmRecordServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/ApmRecordServiceImpl.java index 9398f6e..b4ab121 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/ApmRecordServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/ApmRecordServiceImpl.java @@ -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 selectPage(IPage page, Long createDept, String startTime, String endTime, String cupCardNo) { - List recordList = baseMapper.selectPage(page, createDept, startTime, endTime, cupCardNo); + public IPage selectPage(IPage page, Long createDept, String startTime, String endTime, String cupCardNo, String project) { + List 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 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> getRenegedCountList() { + return baseMapper.getRenegedCountList(); + } + } diff --git a/src/main/java/org/springblade/modules/business/service/impl/ArticleServiceImpl.java b/src/main/java/org/springblade/modules/business/service/impl/ArticleServiceImpl.java index 886c005..f15ece0 100644 --- a/src/main/java/org/springblade/modules/business/service/impl/ArticleServiceImpl.java +++ b/src/main/java/org/springblade/modules/business/service/impl/ArticleServiceImpl.java @@ -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 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; } diff --git a/src/main/java/org/springblade/modules/business/timer/BlacklistTimerJob.java b/src/main/java/org/springblade/modules/business/timer/BlacklistTimerJob.java new file mode 100644 index 0000000..da6f11b --- /dev/null +++ b/src/main/java/org/springblade/modules/business/timer/BlacklistTimerJob.java @@ -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 renegedList = recordService.list(Wrappers.lambdaQuery() + .eq(ApmRecord::getBlacklistFlag, BusinessConstant.BOOLEAN_INT_FALSE) + .eq(ApmRecord::getApmStatus, BusinessConstant.RECORD_STATUS_UNREGISTER) + .le(ApmRecord::getApmTime, DateUtil.now())); + + List recordUpdateList = new ArrayList<>(); + List blacklists = new ArrayList<>(); + + + List> renegedCountList = recordService.getRenegedCountList(); + for (Map 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); + } + } +} diff --git a/src/main/java/org/springblade/modules/business/timer/QuartzConfig.java b/src/main/java/org/springblade/modules/business/timer/QuartzConfig.java new file mode 100644 index 0000000..4eb207c --- /dev/null +++ b/src/main/java/org/springblade/modules/business/timer/QuartzConfig.java @@ -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; + } +} diff --git a/src/main/java/org/springblade/modules/system/controller/DictBizController.java b/src/main/java/org/springblade/modules/system/controller/DictBizController.java index f64c48e..d7e198d 100644 --- a/src/main/java/org/springblade/modules/system/controller/DictBizController.java +++ b/src/main/java/org/springblade/modules/system/controller/DictBizController.java @@ -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> getHcProject() { + List 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> getHcApmConfigDeadline() { + List tree = dictService.getList(BusinessConstant.DICT_KEY_APM_CONFIG_DEADLINE); + return R.data(DictBizWrapper.build().listNodeVO(tree)); + } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 8861c11..04842df 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -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