code commit

master
liuqingkun 3 years ago
parent 07a1ec555b
commit 756acb7ec1
  1. 34
      LICENSE
  2. 44
      README.md
  3. 224
      api_doc.md
  4. 21
      src/main/java/org/springblade/common/constant/BusinessConstant.java
  5. 12
      src/main/java/org/springblade/common/enums/ErrorMsgEnum.java
  6. 42
      src/main/java/org/springblade/common/utils/CommonDateUtil.java
  7. 48
      src/main/java/org/springblade/modules/business/controller/ApmConfigController.java
  8. 136
      src/main/java/org/springblade/modules/business/controller/ApmRecordController.java
  9. 37
      src/main/java/org/springblade/modules/business/controller/BlacklistController.java
  10. 48
      src/main/java/org/springblade/modules/business/dto/ApmRecordCountDTO.java
  11. 4
      src/main/java/org/springblade/modules/business/mapper/ApmConfigMapper.java
  12. 5
      src/main/java/org/springblade/modules/business/mapper/ApmConfigMapper.xml
  13. 16
      src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.java
  14. 26
      src/main/java/org/springblade/modules/business/mapper/ApmRecordMapper.xml
  15. 8
      src/main/java/org/springblade/modules/business/mapper/BlackListMapper.xml
  16. 2
      src/main/java/org/springblade/modules/business/mapper/BlacklistMapper.java
  17. 20
      src/main/java/org/springblade/modules/business/service/IApmConfigService.java
  18. 19
      src/main/java/org/springblade/modules/business/service/IApmRecordService.java
  19. 2
      src/main/java/org/springblade/modules/business/service/IBlacklistService.java
  20. 173
      src/main/java/org/springblade/modules/business/service/impl/ApmConfigServiceImpl.java
  21. 68
      src/main/java/org/springblade/modules/business/service/impl/ApmRecordServiceImpl.java
  22. 5
      src/main/java/org/springblade/modules/business/service/impl/BlacklistServiceImpl.java
  23. 17
      src/main/java/org/springblade/modules/business/vo/ApmConfigListVO.java
  24. 70
      src/main/java/org/springblade/modules/business/vo/DeptCmpVO.java
  25. 9
      src/main/java/org/springblade/modules/business/wrapper/ApmConfigListWrapper.java
  26. 9
      src/main/java/org/springblade/modules/business/wrapper/ApmConfigWrapper.java
  27. 33
      src/main/java/org/springblade/modules/business/wrapper/ApmRecordWrapper.java
  28. 10
      src/main/java/org/springblade/modules/business/wrapper/ArticleWrapper.java
  29. 9
      src/main/java/org/springblade/modules/business/wrapper/BlacklistWrapper.java

@ -1,34 +0,0 @@
BladeX商业授权许可协议
一、 知识产权:
BladeX系列产品知识产权归上海布雷德科技有限公司独立所有
二、 许可:
1. 在您完全接受并遵守本协议的基础上,本协议授予您使用BladeX的某些权利和非独占性许可。
2. 本协议中,将本产品使用用途分为“专业版用途”和“企业版用途”。
3. “专业版用途”定义:指个人在非团体机构中出于任何目的使用本产品(任何目的包括商业目的或非盈利目的)。
4. “企业版用途”定义:指团体机构(例如公司企业、政府、学校、军队、医院、社会团体等各类组织)(不包含集团,若集团使用则需为各个子公司分别购买企业授权)出于任何目的使用本产品(任何目的包括商业目的或非盈利目的)。
三、 约束和限制:
1. 本产品只能由您为本协议许可的目的而使用,您不得透露给任何第三方;
2. 从本产品取得的任何信息、软件、产品或服务,您不得对其进行修改、改编或基于以上内容创建同种类别的衍生产品并售卖。
3. 您不得对本产品以及与之关联的商业授权进行发布、出租、销售、分销、抵押、转让、许可或发放子许可证。
4. 本产品商业授权版可能包含一些独立功能或特性,这些功能只有在您购买商业授权后才可以使用。在未取得商业授权的情况下,您不得使用、尝试使用或复制这些授权版独立功能。
5. 若您的客户要求以源码方式交付软件,需缴纳企业版授权费用,否则本产品部分不得提供源码。
四、 不得用于非法或禁止的用途:
您在使用本产品或服务时,不得将本产品产品或服务用于任何非法用途或本协议条款、条件和声明禁止的用途。
五、 免责说明:
1. 本产品按“现状”授予许可,您须自行承担使用本产品的风险。BladeX团队不对此提供任何明示、暗示或任何其它形式的担保和表示。在任何情况下,对于因使用或无法使用本软件而导致的任何损失(包括但不仅限于商业利润损失、业务中断或业务信息丢失),BladeX团队无需向您或任何第三方负责,即使BladeX团队已被告知可能会造成此类损失。在任何情况下, BladeX团队均不就任何直接的、间接的、附带的、后果性的、特别的、惩戒性的和处罚性的损害赔偿承担任何责任,无论该主张是基于保证、合同、侵权(包括疏忽)或是基于其他原因作出。
2. 本产品可能内置有第三方服务,您应自行评估使用这些第三方服务的风险,由使用此类第三方服务而产生的纠纷,全部责任由您自行承担。
3. BladeX团队不对使用本产品构建的网站中任何信息内容以及导致的任何版权纠纷、法律争议和后果承担任何责任,全部责任由您自行承担。
4. BladeX团队可能会经常提供产品更新或升级,但BladeX团队没有为根据本协议许可的产品提供维护或更新的责任。
5. BladeX团队可能会按照官方制定的答疑规则为您进行答疑,但BladeX团队没有为根据本协议许可的产品提供技术支持的义务或责任。
六、 权利和所有权的保留:
BladeX团队保留所有未在本协议中明确授予您的所有权利。BladeX团队保留随时更新本协议的权利,并只需公示于对应产品项目的LICENSE文件,无需征得您的事先同意且无需另行通知,更新后的内容应于公示即时生效。您可以随时访问产品地址并查阅最新版许可条款,在更新生效后您继续使用本产品则被视作您已接受了新的条款。
七、 协议终止
1. 您一旦开始复制、下载、安装或者使用本产品,即被视为完全理解并接受本协议的各项条款,在享有上述条款授予的许可权力同时,也受到相关的约束和限制,本协议许可范围以外的行为,将直接违反本协议并构成侵权。
2. 一旦您违反本协议的条款,BladeX团队随时可能终止本协议、收回许可和授权,并要求您承担相应法律和经济责任。

@ -1,43 +1 @@
## 版权声明
* BladeX是一个商业化软件,系列产品知识产权归**上海布雷德科技有限公司**独立所有
* 您一旦开始复制、下载、安装或者使用本产品,即被视为完全理解并接受本协议的各项条款
* 更多详情请看:[BladeX商业授权许可协议](/LICENSE)
## 答疑流程
>1. 遇到问题或Bug
>2. 业务型问题打断点调试尝试找出问题所在
>3. 系统型问题通过百度、谷歌、社区查找解决方案
>4. 未解决问题则进入技术社区进行发帖提问:[https://sns.bladex.vip/](https://sns.bladex.vip/)
>5. 将帖子地址发至商业群,特别简单三言两语就能描述清楚的也可在答疑时间内发至商业群提问
>6. 发帖的时候一定要描述清楚,详细描述遇到问题的**重现步骤**、**报错详细信息**、**相关代码与逻辑**、**使用软件版本**以及**操作系统版本**,否则随意发帖提问将会提高我们的答疑难度。
## 答疑时间
* 工作日:9:00 ~ 17:00 提供答疑,周末、节假日休息,暂停答疑
* 请勿**私聊提问**,以免被其他用户的消息覆盖从而无法获得答疑
* 答疑时间外遇到问题可以将问题发帖至[技术社区](https://sns.bladex.vip/),我们后续会逐个回复
## 授权范围
* 专业版:只可用于**个人学习**及**个人私活**项目,不可用于公司或团队,不可泄露给任何第三方
* 企业版:可用于**企业名下**的任何项目,企业版员工在**未购买**专业版授权前,只授权开发**所在授权企业名下**的项目,**不得将BladeX用于个人私活**
* 共同遵守:若甲方需要您提供项目源码,则需代为甲方购买BladeX企业授权,甲方购买后续的所有项目都无需再次购买授权
## 商用权益
* ✔ 遵守[商业协议](/LICENSE)的前提下,将BladeX系列产品用于授权范围内的商用项目,并上线运营
* ✔ 遵守[商业协议](/LICENSE)的前提下,不限制项目数,不限制服务器数
* ✔ 遵守[商业协议](/LICENSE)的前提下,将自行编写的业务代码申请软件著作权
## 何为侵权
* ❌ 不遵守商业协议,私自销售商业源码
* ❌ 以任何理由将BladeX源码用于申请软件著作权
* ❌ 将商业源码以任何途径任何理由泄露给未授权的单位或个人
* ❌ 开发完毕项目,没有为甲方购买企业授权,向甲方提供了BladeX代码
* ❌ 基于BladeX拓展研发与BladeX有竞争关系的衍生框架,并将其开源或销售
## 侵权后果
* 情节较轻:第一次发现警告处理
* 情节较重:封禁账号,踢出商业群,并保留追究法律责任的权利
* 情节严重:与本地律师事务所合作,以公司名义起诉侵犯计算机软件著作权
## 举报有奖
* 向官方提供有用线索并成功捣毁盗版个人或窝点,将会看成果给予 500~10000 不等的现金奖励
* 官方唯一指定QQ:1272154962
### 体检预约项目

@ -13,6 +13,25 @@
##### 请求参数
##### 返回数据
```json
{
"code": 200,
"success": true,
"data": [
{
"id": "1623571646250143746",
"fullName": "青岛市海慈医院",
"deptName": "青岛市海慈医院",
"sort": 1,
"remark": "青岛市市南区栖霞路18号",
"imgUrl": "",
"deptCategoryName": "医院"
}
],
"msg": "操作成功"
}
```
### 1.2 医院文章列表
##### URL
@ -103,28 +122,26 @@
|- - timeFrame|String|时间范围, 例:9:00-9:30|
|- - numberNum|int|放号数量|
```示例
```json
[
{
createDept: 10215,
project: '视力',
cuAddr: '三楼眼科',
apmDay: '2023-03-12',
detailList: [
"createDept": 10215,
"project": "视力",
"cuAddr": "三楼眼科",
"apmDay": "2023-03-12",
"detailList": [
{
period:'上午',
timeFrame: '9:00-9:30',
numberNum: 5
"period":"上午",
"timeFrame": "9:00-9:30",
"numberNum": 5
},
{
period:'上午',
timeFrame: '9:30-10:00',
numberNum: 5
},
...
"period":"上午",
"timeFrame": "9:30-10:00",
"numberNum": 5
}
]
}
]
```
@ -132,43 +149,33 @@
##### URL
`GET` `blade-business/apm-config/detail`
##### 请求
##### 请求数
|参数名|参数类型|参数说明|
|-----|-----|-----|
|createDept|Long|医院Id|
|project|String|项目|
|cuAddr|String|体检地址|
|apmDay|String|放号天, 格式yyyy-MM-dd HH:mm:ss|
|detailList|List|放号详细|
|- period|String|时段(上午,下午)|
|- timeFrame|String|时间范围, 例:9:00-9:30|
|- numberNum|int|放号数量|
|- apmNum|int|已预约数量|
```示例
```json
[
{
createDept: 10215,
project: '视力',
cuAddr: '三楼眼科',
apmDay: '2023-03-12',
detailList: [
{
period:'上午',
timeFrame: '9:00-9:30',
numberNum: 5,
apmNum: 0
},
{
period:'上午',
timeFrame: '9:30-10:00',
numberNum: 5,
apmNum: 0
},
...
]
"createDept": 10215,
"project": "视力",
"cuAddr": "三楼眼科",
"apmDay": "2023-03-12",
"period":"上午",
"timeFrame": "9:00-9:30",
"numberNum": 5
},
{
"createDept": 10215,
"project": "视力",
"cuAddr": "三楼眼科",
"apmDay": "2023-03-12",
"period":"上午",
"timeFrame": "9:00-9:30",
"numberNum": 5
}
]
```
@ -181,32 +188,32 @@
|-----|-----|-----|
|createDept|Long|医院Id|
|project|String|项目|
|apmDay|String|放号天, 格式yyyy-MM-dd HH:mm:ss|
|startTime|String|查询开始时间, 格式yyyy-MM-dd HH:mm:ss|
|endTime|String|查询结束时间, 格式yyyy-MM-dd HH:mm:ss|
##### 返回示例
```
[
{
医院: 海慈
项目 : 视力
地址 : 三楼眼科
放号天: 2023-1-1
时间: [
"createDept": 10215,
"project": "视力",
"cuAddr": "三楼眼科",
"apmDay": "2023-03-12",
"detailList": [
{
时段: 上午
时段范围: 9:00-10:00
放号数量: 5
已预约数量: 2
"period":"上午",
"timeFrame": "9:00-9:30",
"numberNum": 5,
"apmNum": 0 // 已预约数
},
{
时段: 上午
时段范围: 9:00-10:00
放号数量: 5
已预约数量: 2
},
...
"period":"上午",
"timeFrame": "9:30-10:00",
"numberNum": 5,
"apmNum": 0
}
]
},
...
}
]
```
@ -214,6 +221,7 @@
### 3.1 检查用户是否可预约-医院
##### 说明
加载体检医院前, 调用接口判断用户是否今天已有预约, 若已有预约, 返回医院列表, 若已加入黑名单, 拒绝预约
备注: 废弃, 无法确定要预约哪天的体检, 故无法判断医院是否可预约
### 3.2 获取医院所有放号的列表
##### 说明
@ -223,34 +231,86 @@
```
[
{
project : 视力
地址 : 三楼眼科
剩余号数: 19/20
时间: [
"createDept": 10215,
"project": "视力",
"cuAddr": "三楼眼科",
"apmDay": "2023-03-12",
"totalNum" : 10, // 总号数
"totalApmNum": 0, // 总预约数
"detailList": [
{
时段: 上午
时段范围: 9:00-10:00
余号: 5
是否可预约: 0/1
"period":"上午",
"timeFrame": "9:00-9:30",
"numberNum": 5,
"apmNum": 0,
"residueNum": 0,
"enableApm: 0
},
{
"period":"上午",
"timeFrame": "9:30-10:00",
"numberNum": 5,
"apmNum": 0,
"residueNum": 0, // 剩余号数
"enableApm: 0 // 是否可预约
}
]
},
...
}
]
```
### 3.4 保存预约记录
##### URL
`POST` `blade-business/apm-record/save`
##### 请求参数
|参数名|参数类型|参数说明|
|-----|-----|-----|
|apmRecordList|List|预约记录列表|
|- createDept|Long|医院Id|
|- project|String|体检项目|
|- cuAddr|String|体检地址|
|- period|String|时段|
|- apmDay|String|体检天|
|- timeFrame|String|时间范围|
|- cupName|String|体检人名称|
|- cupCardNo|String|体检人证件号|
|- cupPhone|String|体检人手机号|
### 3.5 取消预约记录
##### URL
`GET` `blade-business/apm-record/cancel`
##### 请求参数
|参数名|参数类型|参数说明|
|-----|-----|-----|
|id|Long|预约记录ID|
### 3.6 更新预约记录状态
##### 说明
用户报到后, 调用接口, 更新预约记录为`已报到`
##### URL
`GET` `blade-business/apm-record/register`
##### 请求参数
|参数名|参数类型|参数说明|
|-----|-----|-----|
|id|Long|预约记录ID|
### 3.7 根据ID获取详细
##### URL
`GET` `blade-business/apm-record/detail-by-id`
##### 请求参数
|参数名|参数类型|参数说明|
|-----|-----|-----|
|id|Long|预约记录ID|
## 5 黑名单
### 5.1 列表
##### URL
`GET`
`GET` `blade-business/blacklist/page`
##### 请求参数
|参数名|参数类型|参数说明|
@ -263,7 +323,7 @@
### 5.2 根据用户证件号获取详细
##### URL
`POST`
`POST` `blade-business/blacklist/detail-by-cardno`
##### 请求参数
|参数名|参数类型|必填|参数说明|
@ -274,13 +334,25 @@
### 5.3 删除
##### URL
`POST`
`POST` `blade-business/blacklist/remove`
##### 请求参数
|参数名|参数类型|必填|参数说明|
|-----|-----|-----|-----|
|id|int|是|记录Id|
|ids|String|是|记录Id|
##### 返回数据
### 5.4
### 5.4 获取正在生效的黑名单
##### 说明
根据用户证件号获取正在生效的黑名单, 若无正在生效的黑名单, 返回空
##### URL
`POST` `blade-business/blacklist/user-blacklist`
##### 请求参数
|参数名|参数类型|必填|参数说明|
|-----|-----|-----|-----|
|cupCardNo|String|体检人证件号|
##### 返回数据

@ -7,6 +7,10 @@ package org.springblade.common.constant;
*/
public interface BusinessConstant {
String DATE_STR_HMS = " 00:00:00";
String ROLE_NAME_HOSPITAL = "医院";
Integer BOOLEAN_INT_TRUE = 1;
Integer BOOLEAN_INT_FALSE = 0;
String BOOLEAN_STR_TRUE = "1";
@ -15,7 +19,7 @@ public interface BusinessConstant {
Integer DEPT_CATEGORY_HOSPITAL = 2;
/**
* 0:已保存, 1:已发布, 2:已取消
* 文章状态 0:已保存, 1:已发布, 2:已取消
*/
Integer ARTICLE_STATUS_SAVE = 0;
Integer ARTICLE_STATUS_PUBLISH = 1;
@ -28,6 +32,21 @@ public interface BusinessConstant {
String MAP_KEY_APM_CONFIG_LIST_TIME_FRAME = "timeFrame"; // 时间范围
String MAP_KEY_APM_CONFIG_LIST_NUMBER_NUM = "numberNum"; // 放号数量
String MAP_KEY_APM_CONFIG_LIST_APM_NUM = "apmNum"; // 预约数量
String MAP_KEY_APM_CONFIG_LIST_RESIDUE_NUM = "residueNum"; // 剩余号数
String MAP_KEY_APM_CONFIG_LIST_ENABLE_APM = "enableApm"; // 是否可预约
/**
* 预约记录状态 0:已保存,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;
}

@ -12,12 +12,16 @@ import lombok.Getter;
@AllArgsConstructor
public enum ErrorMsgEnum {
/**
* 参数
*/
PARAMS_NULL_OBJECT_ID("PARAMS_NULL_CREATE_DEPT", "参数错误, ID为空"),
PARAMS_NULL_CREATE_DEPT("PARAMS_NULL_CREATE_DEPT", "参数错误, 医院ID为空"),
PARAMS_NULL_PROJECT("PARAMS_NULL_PROJECT", "参数错误, 体检项目为空"),
PARAMS_NULL_APM_DAY("PARAMS_NULL_APM_DAY", "参数错误, 放号天为空"),
PARAMS_NULL_APM_DAY("PARAMS_NULL_APM_DAY", "参数错误, 体检日期为空"),
PARAMS_NULL_CUP_CARD_NO("PARAMS_NULL_CUP_CARD_NO", "参数错误, 证件号为空"),
APMRECORD_SAVE_OBJ_IS_NULL("APMRECORD_SAVE_OBJ_IS_NULL", "参数错误, 预约项目为空"),
APMRECORD_SAVE_DATE_IS_NULL("APMRECORD_SAVE_DATE_IS_NULL", "参数错误, 预约时间为空"),
USER_IN_BLACKLIST("USER_IN_BLACKLIST", "预约失败, 用户已被拉黑"),
;
final String name;

@ -6,6 +6,7 @@ import org.springblade.core.tool.utils.DateUtil;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
@ -16,39 +17,32 @@ import java.util.Date;
@Slf4j
public class CommonDateUtil {
public static final String PATTERN_DATETIME_MINI = "yyyyMMdd";
public static String getNowString() {
SimpleDateFormat sdf = new SimpleDateFormat(DateUtil.PATTERN_DATETIME);
return sdf.format(DateUtil.now());
}
/**
* 日期格式化
* 计算两个日期之间相差的天数
*
* @param date 时间
* @param pattern 表达式
* @return 格式化后的时间
* @param sdate 较小的时间
* @param edate 较大的时间
* @return 相差天数
* @throws ParseException
*/
public static String format(Date date, String pattern) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
return sdf.format(date);
}
public static int daysBetween(Date sdate, Date edate) {
sdate = DateUtil.parse(DateUtil.format(sdate, DateUtil.PATTERN_DATE), DateUtil.PATTERN_DATE);
edate = DateUtil.parse(DateUtil.format(edate, DateUtil.PATTERN_DATE), DateUtil.PATTERN_DATE);
Calendar cal = Calendar.getInstance();
cal.setTime(sdate);
long time1 = cal.getTimeInMillis();
cal.setTime(edate);
long time2 = cal.getTimeInMillis();
long between_days = (time2 - time1) / (1000 * 3600 * 24);
/**
* 日期格式化
*
* @param dateStr 时间字符串
* @param pattern 表达式
* @return 格式化后的时间
*/
public static Date parse(String dateStr, String pattern) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
try {
return sdf.parse(dateStr);
} catch (ParseException e) {
log.error(e.getMessage());
e.printStackTrace();
return null;
}
return Integer.parseInt(String.valueOf(between_days)) + 1;
}
}

@ -57,7 +57,7 @@ public class ApmConfigController extends BladeController {
startTime = CommonDateUtil.getNowString();
}
if (Func.isBlank(endTime)) {
endTime = CommonDateUtil.format(DateUtil.plusMonths(DateUtil.now(), 1), DateUtil.PATTERN_DATETIME);
endTime = DateUtil.format(DateUtil.plusMonths(DateUtil.now(), 1), DateUtil.PATTERN_DATETIME);
}
if (Func.isEmpty(createDept)) {
@ -97,6 +97,30 @@ public class ApmConfigController extends BladeController {
return R.data(ApmConfigWrapper.build().listVO(list));
}
/**
* 获取放号详细, 用户用户预约
*
* @param createDept
* @param apmDay
* @param cupCardNo
* @return
*/
@GetMapping("/detail-for-apm")
public R<List<ApmConfigListVO>> detailForApm(Long createDept, String apmDay, String cupCardNo) {
if (Func.isEmpty(createDept)) {
return R.fail(ErrorMsgEnum.PARAMS_NULL_CREATE_DEPT.getValue());
}
if (Func.isEmpty(apmDay)) {
return R.fail(ErrorMsgEnum.APMRECORD_SAVE_DATE_IS_NULL.getValue());
}
if (Func.isEmpty(cupCardNo)) {
return R.fail(ErrorMsgEnum.PARAMS_NULL_CUP_CARD_NO.getValue());
}
return R.data(apmConfigService.detailForApm(createDept, apmDay, cupCardNo));
}
/**
* @param query 分页参数
* @param createDept 医院ID
@ -118,26 +142,10 @@ public class ApmConfigController extends BladeController {
* 新增
*/
@PostMapping("/save")
public R save(@RequestBody List<ApmConfigListVO> configListVOS) {
List<ApmConfig> configList = new ArrayList<>();
for (ApmConfigListVO vo : configListVOS) {
for (Map<String, Object> detail : vo.getDetailList()) {
String period = detail.containsKey(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_PERIOD) ? (String) detail.get(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_PERIOD) : "";
String timeFrame = detail.containsKey(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_TIME_FRAME) ? (String) detail.get(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_TIME_FRAME) : "";
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.setPeriod(period);
config.setTimeFrame(timeFrame);
config.setNumberNum(numberNum);
configList.add(config);
}
}
String msg = apmConfigService.saveCheck(configList);
public R save(Long createDept, List<String> dayList, List<ApmConfigListVO> configListVOS) {
String msg = apmConfigService.saveCheck(createDept, dayList, configListVOS);
if (Func.isBlank(msg)) {
apmConfigService.saveApmConfig(configList);
apmConfigService.saveApmConfig(createDept, dayList, configListVOS);
return R.status(true);
} else {
return R.fail(msg);

@ -1,6 +1,7 @@
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.Api;
@ -8,17 +9,33 @@ import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
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;
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.BeanUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.business.entity.ApmRecord;
import org.springblade.modules.business.entity.Blacklist;
import org.springblade.modules.business.service.IApmRecordService;
import org.springblade.modules.business.service.IBlacklistService;
import org.springblade.modules.business.vo.ApmRecordVO;
import org.springblade.modules.business.vo.DeptCmpVO;
import org.springblade.modules.business.wrapper.ApmRecordWrapper;
import org.springblade.modules.system.entity.Dept;
import org.springblade.modules.system.service.IDeptService;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
@ -39,47 +56,118 @@ public class ApmRecordController extends BladeController {
/**
* 详情
*/
@GetMapping("/detail")
@GetMapping("/detail-by-id")
@ApiOperationSupport(order = 1)
@ApiOperation(value = "详情", notes = "传入notice")
@ApiOperation(value = "详情", notes = "传入id")
public R<ApmRecordVO> detail(Long id) {
return null;
if (Func.isEmpty(id)) {
return R.fail(ErrorMsgEnum.PARAMS_NULL_OBJECT_ID.getValue());
}
ApmRecord record = recordService.getById(id);
return R.data(ApmRecordWrapper.build().entityVO(record));
}
/**
* 体检报到
*/
@GetMapping("/register")
@ApiOperationSupport(order = 2)
@ApiOperation(value = "体检报到", notes = "体检报到")
public R register(Long id) {
if (Func.isEmpty(id)) {
return R.fail(ErrorMsgEnum.PARAMS_NULL_OBJECT_ID.getValue());
}
ApmRecord record = recordService.getById(id);
if (Func.isNotEmpty(record)) {
record.setApmStatus(BusinessConstant.RECORD_STATUS_REGISTER);
recordService.save(record);
} else {
return R.fail("报到失败, 未找到对应预约记录");
}
return R.success("报到成功!");
}
/**
* 取消预约
*/
@PostMapping("/cancel")
@ApiOperationSupport(order = 3)
@ApiOperation(value = "取消预约", notes = "取消预约")
public R cancel(Long id) {
if (Func.isEmpty(id)) {
return R.fail(ErrorMsgEnum.PARAMS_NULL_OBJECT_ID.getValue());
}
ApmRecord record = recordService.getById(id);
if (Func.isNotEmpty(record)) {
record.setApmStatus(BusinessConstant.RECORD_STATUS_CANCEL);
recordService.save(record);
} else {
return R.fail("取消预约失败, 未找到对应预约记录");
}
return R.success("取消预约成功!");
}
/**
* 分页
*/
@GetMapping("/list")
@GetMapping("/page")
@ApiImplicitParams({
@ApiImplicitParam(name = "startTime", value = "查询开始时间", paramType = "query", dataType = "integer"),
@ApiImplicitParam(name = "endTime", value = "查询结束时间", paramType = "query", dataType = "integer"),
@ApiImplicitParam(name = "project", value = "体检项目名", paramType = "query", dataType = "integer"),
@ApiImplicitParam(name = "cardNo", value = "体检人证件号", paramType = "query", dataType = "string")
@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")
})
@ApiOperationSupport(order = 2)
@ApiOperationSupport(order = 4)
@ApiOperation(value = "分页", notes = "传入notice")
public R<IPage<ApmRecordVO>> selectPage(@ApiIgnore @RequestParam Map<String, Object> apmConfig, Query query) {
return R.data(null);
public R<IPage<ApmRecordVO>> selectPage(Query query, @RequestParam Long createDept, @RequestParam String startTime, @RequestParam String endTime, @RequestParam String cupCardNo) {
IPage<ApmRecordVO> page = recordService.selectPage(Condition.getPage(query), createDept, startTime, endTime, cupCardNo);
return R.data(page);
}
/**
* 新增
*/
@PostMapping("/save")
@ApiOperationSupport(order = 4)
@ApiOperationSupport(order = 5)
@ApiOperation(value = "新增", notes = "传入apmConfig")
public R save(@RequestBody ApmRecord apmRecord) {
return R.status(true);
}
public R save(@RequestBody List<ApmRecord> apmRecordList) {
if (Func.isEmpty(apmRecordList)) {
return R.fail(ErrorMsgEnum.APMRECORD_SAVE_OBJ_IS_NULL.getValue());
}
/**
* 取消预约
*/
@PostMapping("/cancel")
@ApiOperationSupport(order = 5)
@ApiOperation(value = "取消预约", notes = "传入id")
public R cancel(Long id) {
return R.status(true);
}
Date apmDay = null;
String cardNo = null;
for (ApmRecord record : apmRecordList) {
if (apmDay == null) {
apmDay = record.getApmDay();
}
if (cardNo == null) {
cardNo = record.getCupCardNo();
}
if (apmDay != record.getApmDay()) {
return R.fail("预约失败, 一次只能预约同一天的体检项目");
}
if (cardNo != record.getCupCardNo()) {
return R.fail("预约失败, 一次只能预约同一个人");
}
record.setApmTime(DateUtil.now());
record.setApmStatus(BusinessConstant.RECORD_STATUS_SAVE);
}
String checkMsg = recordService.checkApmRecordSave(apmRecordList);
if (Func.isBlank(checkMsg)) {
recordService.saveBatch(apmRecordList);
return R.status(true);
}
return R.fail(checkMsg);
}
}

@ -6,19 +6,29 @@ 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;
import org.springblade.common.constant.CommonConstant;
import org.springblade.common.enums.ErrorMsgEnum;
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.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;
/**
* 控制器
*
@ -53,12 +63,12 @@ public class BlacklistController extends BladeController {
@ApiImplicitParams({
@ApiImplicitParam(name = "startTime", value = "查询开始时间", paramType = "query", dataType = "integer"),
@ApiImplicitParam(name = "endTime", value = "查询结束时间", paramType = "query", dataType = "integer"),
@ApiImplicitParam(name = "cardNo", value = "体检人证件号", paramType = "query", dataType = "string")
@ApiImplicitParam(name = "cupCardNo", value = "体检人证件号", paramType = "query", dataType = "string")
})
@ApiOperationSupport(order = 2)
@ApiOperation(value = "分页", notes = "传入notice")
public R<IPage<BlacklistVO>> selectPage(Query query, @RequestParam String startTime, @RequestParam String endTime, @RequestParam String cardNo) {
IPage<Blacklist> pages = blacklistService.selectPage(Condition.getPage(query), startTime, endTime, cardNo);
public R<IPage<BlacklistVO>> selectPage(Query query, @RequestParam String startTime, @RequestParam String endTime, @RequestParam String cupCardNo) {
IPage<Blacklist> pages = blacklistService.selectPage(Condition.getPage(query), startTime, endTime, cupCardNo);
return R.data(BlacklistWrapper.build().pageVO(pages));
}
@ -73,4 +83,25 @@ public class BlacklistController extends BladeController {
return R.status(temp);
}
/**
* 根据用户证件号获取正在生效的黑名单
*/
@GetMapping("/user-blacklist")
@ApiOperationSupport(order = 4)
@ApiOperation(value = "获取正在生效的黑名单", notes = "传入用户证件号")
public R<Blacklist> userBlacklist(String cupCardNo) {
if (Func.isEmpty(cupCardNo)) {
return R.fail(ErrorMsgEnum.PARAMS_NULL_CUP_CARD_NO.getValue());
}
Blacklist blacklist = blacklistService.getLatelyRecord(cupCardNo);
String currentDayStr = DateUtil.format(DateUtil.now(), CommonDateUtil.PATTERN_DATETIME_MINI);
if ((Integer.parseInt(currentDayStr) - Integer.parseInt(blacklist.getBlacklistTime())) < BusinessConstant.BLACKLIST_RANGE) {
return R.data(blacklist);
}
return R.data(null);
}
}

@ -0,0 +1,48 @@
package org.springblade.modules.business.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 预约记录表
*
* @author Chill
*/
@Data
public class ApmRecordCountDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 体检项目
*/
@ApiModelProperty(value = "体检项目")
private String project;
/**
* 时段(上午,下午)
*/
@ApiModelProperty(value = "时段(上午,下午)")
private String period;
/**
* 放号天
*/
@ApiModelProperty(value = "放号天")
private String apmDay;
/**
* 时段范围, 格式(HH:mm-HH:mm)
*/
@ApiModelProperty(value = "时段范围, 格式(HH:mm-HH:mm)")
private String timeFrame;
/**
* 已预约数
*/
@ApiModelProperty(value = "已预约数")
private Integer apmNum;
}

@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Param;
import org.springblade.modules.business.entity.ApmConfig;
import java.util.List;
import java.util.Map;
/**
* Mapper 接口
@ -22,7 +23,7 @@ public interface ApmConfigMapper extends BaseMapper<ApmConfig> {
* @param endTime
* @return
*/
List<String> alreadyConfigDayList(@Param("createDept") Long createDept, @Param("startTime") String startTime, @Param("endTime") String endTime);
List<Map<String, Object>> alreadyConfigDayList(@Param("createDept") Long createDept, @Param("startTime") String startTime, @Param("endTime") String endTime);
/**
* 自定义分页
@ -38,4 +39,5 @@ public interface ApmConfigMapper extends BaseMapper<ApmConfig> {
List<ApmConfig> selectList(@Param("createDept") Long createDept, @Param("apmDay") String apmDay, @Param("project") String project);
}

@ -43,8 +43,8 @@
and ac.project = #{project}
</select>
<select id="alreadyConfigDayList" resultType="string">
SELECT DISTINCT DATE_FORMAT(ac.apm_day, '%Y-%m-%d') apmDay
<select id="alreadyConfigDayList" resultType="map">
SELECT DATE_FORMAT(ac.apm_day, '%Y-%m-%d') apmDay, sum(ac.number_num) allNum
FROM ca_apm_config ac
WHERE ac.is_deleted = 0 and ac.create_dept = #{createDept}
<if test="startTime != '' and startTime != null">
@ -53,5 +53,6 @@
<if test="endTime != '' and endTime != null">
and ac.apm_day &lt;= #{endTime}
</if>
group by DATE_FORMAT(ac.apm_day, '%Y-%m-%d')
</select>
</mapper>

@ -3,9 +3,11 @@ package org.springblade.modules.business.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.modules.business.dto.ApmRecordCountDTO;
import org.springblade.modules.business.entity.ApmRecord;
import java.util.List;
import java.util.Map;
/**
* Mapper 接口
@ -17,10 +19,16 @@ public interface ApmRecordMapper extends BaseMapper<ApmRecord> {
/**
* 自定义分页
*
* @param page 分页
* @param apmRecord 实体
* @return List<ApmRecord>
* @param page
* @param createDept
* @param startTime
* @param endTime
* @param cupCardNo
* @return
*/
List<ApmRecord> selectPage(IPage page, @Param("apmRecord") ApmRecord apmRecord);
List<ApmRecord> selectPage(IPage page, @Param("createDept") Long createDept, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("cupCardNo") String cupCardNo);
List<ApmRecordCountDTO> countAmpNum(@Param("createDept") Long createDept, @Param("apmDay") String apmDay);
}

@ -24,9 +24,33 @@
<result column="blacklist_flag" property="blacklistFlag"/>
</resultMap>
<resultMap id="ApmRecordCountDTOResultMap" type="org.springblade.modules.business.dto.ApmRecordCountDTO">
<result column="project" property="project"/>
<result column="period" property="period"/>
<result column="apmDay" property="apmDay"/>
<result column="timeFrame" property="timeFrame"/>
<result column="apmNum" property="apmNum"/>
</resultMap>
<select id="selectPage" resultMap="apmRecordResultMap">
SELECT ar.*
FROM ca_apm_record ar
WHERE ar.is_deleted = 0
WHERE ar.is_deleted = 0 and ar.create_dept = #{createDept}
<if test="startTime != '' and startTime != null">
and ar.apm_day &gt;= #{startTime}
</if>
<if test="endTime != '' and endTime != null">
and ar.apm_day &lt;= #{endTime}
</if>
<if test="cupCardNo != '' and cupCardNo != null">
and ar.cup_card_no like concat(concat('%', #{cupCardNo}), '%')
</if>
</select>
<select id="countAmpNum" resultMap="ApmRecordCountDTOResultMap">
select DATE_FORMAT(ac.apm_day, '%Y-%m-%d') apmDay, project, period, time_frame timeFrame, count(id) apmNum
from ca_apm_record
where ar.is_deleted = 0 and ar.create_dept = #{createDept} and apm_day = #{apmDay}
group by DATE_FORMAT(ac.apm_day, '%Y-%m-%d'), project, period, time_frame
</select>
</mapper>

@ -32,4 +32,12 @@
and blkl.cup_card_no like concat(concat('%', #{cardNo}), '%')
</if>
</select>
<select id="getLatelyRecord" resultMap="blacklistResultMap">
select *
from ca_blacklist
where is_deleted = 0 and cup_card_no = #{cupCardNo}
order by blacklistTime desc
limit 1
</select>
</mapper>

@ -22,4 +22,6 @@ public interface BlacklistMapper extends BaseMapper<Blacklist> {
*/
List<Blacklist> selectPage(IPage page, @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("cardNo") String cardNo);
Blacklist getLatelyRecord(String cupCardNo);
}

@ -38,14 +38,24 @@ public interface IApmConfigService extends BaseService<ApmConfig> {
IPage<ApmConfigListVO> selectPage(IPage<ApmConfig> page, Long createDept, String startTime, String endTime, String project);
/**
* 保存验证, 若验证通过, 返回空字符串
* 获取放号详细, 用户用户预约
*
* @param configList
* @param createDept
* @param apmDay
* @param cupCardNo
* @return
*/
String saveCheck(List<ApmConfig> configList);
List<ApmConfigListVO> detailForApm(Long createDept, String apmDay, String cupCardNo);
String updateCheck(List<ApmConfig> configList);
/**
* 保存验证, 若验证通过, 返回空字符串
*
* @param createDept
* @param dayList
* @param configListVOS
* @return
*/
String saveCheck(Long createDept, List<String> dayList, List<ApmConfigListVO> configListVOS);
void saveApmConfig(List<ApmConfig> configList);
void saveApmConfig(Long createDept, List<String> dayList, List<ApmConfigListVO> configListVOS);
}

@ -1,8 +1,17 @@
package org.springblade.modules.business.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.core.mp.base.BaseService;
import org.springblade.core.mp.support.Query;
import org.springblade.modules.business.dto.ApmRecordCountDTO;
import org.springblade.modules.business.entity.ApmRecord;
import org.springblade.modules.business.vo.ApmRecordVO;
import org.springblade.modules.business.vo.NoticeVO;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Map;
/**
* 服务类
@ -15,9 +24,15 @@ public interface IApmRecordService extends BaseService<ApmRecord> {
* 自定义分页
*
* @param page
* @param apmRecord
* @param createDept
* @param startTime
* @param endTime
* @param cupCardNo
* @return
*/
IPage<ApmRecord> selectPage(IPage<ApmRecord> page, ApmRecord apmRecord);
IPage<ApmRecordVO> selectPage(IPage<ApmRecordVO> page, Long createDept, String startTime, String endTime, String cupCardNo);
String checkApmRecordSave(List<ApmRecord> apmRecordList);
List<ApmRecordCountDTO> countAmpNum(Long createDept, String apmDay);
}

@ -19,4 +19,6 @@ public interface IBlacklistService extends BaseService<Blacklist> {
*/
IPage<Blacklist> selectPage(IPage<Blacklist> page, String startTime, String endTime, String cardNo);
Blacklist getLatelyRecord(String cupCardNo);
}

@ -1,13 +1,24 @@
package org.springblade.modules.business.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.common.utils.CommonDateUtil;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.SpringUtil;
import org.springblade.modules.business.dto.ApmRecordCountDTO;
import org.springblade.modules.business.entity.ApmConfig;
import org.springblade.modules.business.entity.ApmRecord;
import org.springblade.modules.business.mapper.ApmConfigMapper;
import org.springblade.modules.business.service.IApmConfigService;
import org.springblade.modules.business.service.IApmRecordService;
import org.springblade.modules.business.service.IBlacklistService;
import org.springblade.modules.business.vo.ApmConfigListVO;
import org.springblade.modules.business.wrapper.ApmConfigListWrapper;
import org.springframework.stereotype.Service;
@ -16,6 +27,8 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 服务实现类
@ -25,16 +38,22 @@ import java.util.Map;
@Service
public class ApmConfigServiceImpl extends BaseServiceImpl<ApmConfigMapper, ApmConfig> implements IApmConfigService {
private static final IApmRecordService recordService;
static {
recordService = SpringUtil.getBean(IApmRecordService.class);
}
@Override
public Map<String, List<String>> alreadyConfigDay(Long createDept, String startTime, String endTime) {
List<String> days = baseMapper.alreadyConfigDayList(createDept, startTime, endTime);
List<Map<String, Object>> days = baseMapper.alreadyConfigDayList(createDept, startTime, endTime);
// 将获取到的天转换为[{mon:1, days:{1, 2, 3}},{mon:2, days:{1, 2, 3}}]格式
Map<String, List<String>> monDaysMap = new HashMap<>();
for (String day : days) {
String mon = day.split("-")[1];
for (Map<String, Object> day : days) {
String mon = ((String) day.get("apmDay")).split("-")[1];
List<String> daysItem = monDaysMap.containsKey(mon) ? monDaysMap.get(mon) : new ArrayList<>();
daysItem.add(day);
daysItem.add((String) day.get("apmDay"));
monDaysMap.put(mon, daysItem);
}
@ -51,13 +70,27 @@ public class ApmConfigServiceImpl extends BaseServiceImpl<ApmConfigMapper, ApmCo
result.getRecords().forEach(vo -> {
// 根据(医院, 项目 配置天)获取配置详细
List<ApmConfig> configList = baseMapper.selectList(vo.getCreateDept(), DateUtil.format(vo.getApmDay(), DateUtil.PATTERN_DATETIME), vo.getProject());
// 获取该天的所有预约统计
List<ApmRecordCountDTO> apmCountList = recordService.countAmpNum(createDept, DateUtil.format(vo.getApmDay(), DateUtil.PATTERN_DATETIME));
List<Map<String, Object>> detailList = new ArrayList<>();
for (ApmConfig config : configList) {
Map<String, Object> detail = new HashMap<>();
detail.put(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_PERIOD, config.getPeriod());
detail.put(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_TIME_FRAME, config.getTimeFrame());
detail.put(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_NUMBER_NUM, config.getNumberNum());
detail.put(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_APM_NUM, 0);
int apmNum = 0;
for (ApmRecordCountDTO dto : apmCountList) {
if (dto.getApmDay() == DateUtil.format(config.getApmDay(), DateUtil.PATTERN_DATE)
&& dto.getProject() == config.getProject()
&& dto.getPeriod() == config.getPeriod()
&& dto.getTimeFrame() == config.getTimeFrame()) {
apmNum = dto.getApmNum();
}
}
detail.put(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_APM_NUM, apmNum);
detailList.add(detail);
}
vo.setDetailList(detailList);
@ -68,19 +101,139 @@ public class ApmConfigServiceImpl extends BaseServiceImpl<ApmConfigMapper, ApmCo
}
@Override
public String saveCheck(List<ApmConfig> configList) {
String msg = "";
return msg;
public List<ApmConfigListVO> detailForApm(Long createDept, String apmDay, String cupCardNo) {
List<ApmConfig> allConfigList = baseMapper.selectList(Wrappers.<ApmConfig>lambdaQuery()
.eq(ApmConfig::getCreateDept, createDept)
.eq(ApmConfig::getApmDay, apmDay));
Map<String, List<ApmConfig>> configProjectMap = new HashMap<>();
allConfigList.forEach(config -> {
List<ApmConfig> itemList = configProjectMap.containsKey(config.getProject()) ? configProjectMap.get(config.getProject()) : new ArrayList<>();
itemList.add(config);
configProjectMap.put(config.getProject(), itemList);
});
// 获取用户在该天预约记录
List<ApmRecord> currentApmList = recordService.list(Wrappers.<ApmRecord>lambdaQuery()
.eq(ApmRecord::getCupCardNo, cupCardNo)
.eq(ApmRecord::getApmDay, apmDay));
Map<String, ApmRecord> cupApmMap = currentApmList.stream().collect(Collectors.toMap(ApmRecord::getProject, Function.identity()));
// 获取该天的所有预约统计
List<ApmRecordCountDTO> apmCountList = recordService.countAmpNum(createDept, apmDay);
Map<String, Integer> apmCountMap = new HashMap<>();
apmCountList.forEach(count -> {
int apmNum = apmCountMap.containsKey(count.getProject()) ? apmCountMap.get(count.getProject()) : 0;
apmNum += count.getApmNum();
apmCountMap.put(count.getProject(), apmNum);
});
List<ApmConfigListVO> resultList = new ArrayList<>();
for (Map.Entry<String, List<ApmConfig>> configMap : configProjectMap.entrySet()) {
String project = configMap.getKey();
List<ApmConfig> configList = configMap.getValue();
ApmConfigListVO vo = BeanUtil.copy(configList.get(0), ApmConfigListVO.class);
vo.setTotalNum(apmCountMap.containsKey(project) ? apmCountMap.get(project) : 0);
int totalApmNum = 0;
List<Map<String, Object>> detailList = new ArrayList<>();
for (ApmConfig config : configList) {
Map<String, Object> detail = new HashMap<>();
detail.put(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_PERIOD, config.getPeriod());
detail.put(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_TIME_FRAME, config.getTimeFrame());
detail.put(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_NUMBER_NUM, config.getNumberNum());
int apmNum = 0;
for (ApmRecordCountDTO dto : apmCountList) {
if (dto.getApmDay() == DateUtil.format(config.getApmDay(), DateUtil.PATTERN_DATE)
&& dto.getProject() == config.getProject()
&& dto.getPeriod() == config.getPeriod()
&& dto.getTimeFrame() == config.getTimeFrame()) {
apmNum = dto.getApmNum();
}
}
totalApmNum += apmNum;
detail.put(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_APM_NUM, apmNum);
detail.put(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_RESIDUE_NUM, config.getNumberNum() - apmNum);
detail.put(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_ENABLE_APM, !cupApmMap.containsKey(project) && config.getNumberNum() > apmNum ? BusinessConstant.BOOLEAN_INT_TRUE : BusinessConstant.BOOLEAN_INT_FALSE);
detailList.add(detail);
}
vo.setTotalApmNum(totalApmNum);
vo.setDetailList(detailList);
resultList.add(vo);
}
return resultList;
}
@Override
public String updateCheck(List<ApmConfig> configList) {
public String saveCheck(Long createDept, List<String> dayList, List<ApmConfigListVO> configListVOS) {
String msg = "";
List<ApmConfig> alreadyConfList = baseMapper.selectList(Wrappers.<ApmConfig>lambdaQuery()
.eq(ApmConfig::getCreateDept, createDept)
.in(ApmConfig::getApmDay, dayList));
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()
));
}
BladeUser user = AuthUtil.getUser();
int configSubDays = BusinessConstant.ROLE_NAME_HOSPITAL.equals(user.getRoleName()) ? BusinessConstant.HOSPITAL_APM_CONFIG_RANGE : 1;
List<ApmConfig> configList = new ArrayList<>();
for (String day : dayList) {
int subDays = CommonDateUtil.daysBetween(DateUtil.now(), DateUtil.parse(day, DateUtil.PATTERN_DATETIME));
if (subDays < configSubDays) {
return "保存失败, 只能保存" + configSubDays + "天之后的放号配置";
}
for (ApmConfigListVO vo : configListVOS) {
for (Map<String, Object> detail : vo.getDetailList()) {
String period = detail.containsKey(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_PERIOD) ? (String) detail.get(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_PERIOD) : "";
String timeFrame = detail.containsKey(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_TIME_FRAME) ? (String) detail.get(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_TIME_FRAME) : "";
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.setPeriod(period);
config.setTimeFrame(timeFrame);
config.setNumberNum(numberNum);
configList.add(config);
}
}
}
return msg;
}
@Override
public void saveApmConfig(List<ApmConfig> configList) {
public void saveApmConfig(Long createDept, List<String> dayList, List<ApmConfigListVO> configListVOS) {
String checkMsg = saveCheck(createDept, dayList, configListVOS);
if (Func.isNotBlank(checkMsg)) {
return;
}
List<ApmConfig> configList = new ArrayList<>();
for (String day : dayList) {
for (ApmConfigListVO vo : configListVOS) {
for (Map<String, Object> detail : vo.getDetailList()) {
String period = detail.containsKey(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_PERIOD) ? (String) detail.get(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_PERIOD) : "";
String timeFrame = detail.containsKey(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_TIME_FRAME) ? (String) detail.get(BusinessConstant.MAP_KEY_APM_CONFIG_LIST_TIME_FRAME) : "";
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.setPeriod(period);
config.setTimeFrame(timeFrame);
config.setNumberNum(numberNum);
configList.add(config);
}
}
}
}

@ -1,11 +1,31 @@
package org.springblade.modules.business.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springblade.common.constant.BusinessConstant;
import org.springblade.common.enums.ErrorMsgEnum;
import org.springblade.common.utils.CommonDateUtil;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.SpringUtil;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.modules.business.dto.ApmRecordCountDTO;
import org.springblade.modules.business.entity.ApmRecord;
import org.springblade.modules.business.entity.Blacklist;
import org.springblade.modules.business.mapper.ApmRecordMapper;
import org.springblade.modules.business.service.IApmRecordService;
import org.springblade.modules.business.service.IBlacklistService;
import org.springblade.modules.business.vo.ApmRecordVO;
import org.springblade.modules.business.wrapper.ApmRecordWrapper;
import org.springblade.modules.system.service.IDictService;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 服务实现类
@ -14,10 +34,54 @@ import org.springframework.stereotype.Service;
*/
@Service
public class ApmRecordServiceImpl extends BaseServiceImpl<ApmRecordMapper, ApmRecord> implements IApmRecordService {
private static final IBlacklistService blacklistService;
static {
blacklistService = SpringUtil.getBean(IBlacklistService.class);
}
@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);
return page.setRecords(ApmRecordWrapper.build().listVO(recordList));
}
@Override
public String checkApmRecordSave(List<ApmRecord> apmRecordList) {
String cupCardNo = apmRecordList.get(0).getCupCardNo();
Date apmDay = apmRecordList.get(0).getApmDay();
// 判断用户是否正在被拉黑
Blacklist blacklist = blacklistService.getLatelyRecord(cupCardNo);
String currentDayStr = DateUtil.format(DateUtil.now(), CommonDateUtil.PATTERN_DATETIME_MINI);
if ((Integer.parseInt(currentDayStr) - Integer.parseInt(blacklist.getBlacklistTime())) < BusinessConstant.BLACKLIST_RANGE) {
return ErrorMsgEnum.USER_IN_BLACKLIST.getValue();
}
// 获取用户在该天是否已有预约
List<ApmRecord> currentApmList = list(Wrappers.<ApmRecord>lambdaQuery()
.eq(ApmRecord::getCupCardNo, cupCardNo)
.eq(ApmRecord::getApmDay, apmDay));
// 若用户在该天有预约, 1. 判断预约医院是否相同, 2. 判断预约项目是否重复
for (ApmRecord record : currentApmList) {
for (ApmRecord apmRecord : apmRecordList) {
if (record.getCreateDept() != apmRecord.getCreateDept()) {
return "预约失败, 本日已有其他医院的预约";
}
if (record.getProject() == apmRecord.getProject()) {
return "预约事变, 本日已有此项目的预约";
}
}
}
return null;
}
@Override
public IPage<ApmRecord> selectPage(IPage<ApmRecord> page, ApmRecord apmRecord) {
return page.setRecords(baseMapper.selectPage(page, apmRecord));
public List<ApmRecordCountDTO> countAmpNum(Long createDept, String apmDay) {
return baseMapper.countAmpNum(createDept, apmDay);
}
}

@ -20,4 +20,9 @@ public class BlacklistServiceImpl extends BaseServiceImpl<BlacklistMapper, Black
return page.setRecords(baseMapper.selectPage(page, startTime, endTime, cardNo));
}
@Override
public Blacklist getLatelyRecord(String cupCardNo) {
return baseMapper.getLatelyRecord(cupCardNo);
}
}

@ -1,7 +1,5 @@
package org.springblade.modules.business.vo;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -44,12 +42,27 @@ public class ApmConfigListVO implements Serializable {
@ApiModelProperty(value = "放号天")
private Date apmDay;
/**
* 总号数
*/
@ApiModelProperty(value = "总号数")
private Integer totalNum;
/**
* 总预约数
*/
@ApiModelProperty(value = "总预约数")
private Integer totalApmNum;
/**
* 放号时段详细
* {
* period: 时段(上午,下午)
* timeFrame: 9:00-9:30,
* numberNum: 5
* residueNum: 0, // 剩余号数
* enableApm: 0 // 是否可预约
* }
*/
List<Map<String, Object>> detailList;

@ -0,0 +1,70 @@
package org.springblade.modules.business.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.tool.node.INode;
import org.springblade.modules.system.entity.Dept;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* 视图实体类
*
* @author Chill
*/
@Data
@ApiModel(value = "DeptCmpVO对象", description = "DeptCmpVO对象")
public class DeptCmpVO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
/**
* 机构全称
*/
@ApiModelProperty(value = "机构全称")
private String fullName;
/**
* 机构名
*/
@ApiModelProperty(value = "机构名")
private String deptName;
/**
* 排序
*/
@ApiModelProperty(value = "排序")
private Integer sort;
/**
* 备注
*/
@ApiModelProperty(value = "备注")
private String remark;
/**
* 机构图标URL
*/
@ApiModelProperty(value = "机构图标URL")
private String imgUrl;
/**
* 是否允许用户预约, 0:, 1:
*/
@ApiModelProperty(value = "是否允许用户预约, 0:是, 1:否")
private Integer enableCmp;
}

@ -2,6 +2,7 @@ package org.springblade.modules.business.wrapper;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.business.entity.ApmConfig;
import org.springblade.modules.business.vo.ApmConfigListVO;
import org.springblade.modules.business.vo.ApmConfigVO;
@ -20,8 +21,12 @@ public class ApmConfigListWrapper extends BaseEntityWrapper<ApmConfig, ApmConfig
}
@Override
public ApmConfigListVO entityVO(ApmConfig apmConfig) {
ApmConfigListVO vo = Objects.requireNonNull(BeanUtil.copy(apmConfig, ApmConfigListVO.class));
public ApmConfigListVO entityVO(ApmConfig entity) {
if (Func.isEmpty(entity)) {
return null;
}
ApmConfigListVO vo = Objects.requireNonNull(BeanUtil.copy(entity, ApmConfigListVO.class));
return vo;
}
}

@ -2,6 +2,7 @@ package org.springblade.modules.business.wrapper;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.business.entity.ApmConfig;
import org.springblade.modules.business.vo.ApmConfigVO;
@ -19,8 +20,12 @@ public class ApmConfigWrapper extends BaseEntityWrapper<ApmConfig, ApmConfigVO>
}
@Override
public ApmConfigVO entityVO(ApmConfig apmConfig) {
ApmConfigVO vo = Objects.requireNonNull(BeanUtil.copy(apmConfig, ApmConfigVO.class));
public ApmConfigVO entityVO(ApmConfig entity) {
if (Func.isEmpty(entity)) {
return null;
}
ApmConfigVO vo = Objects.requireNonNull(BeanUtil.copy(entity, ApmConfigVO.class));
return vo;
}
}

@ -0,0 +1,33 @@
package org.springblade.modules.business.wrapper;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.business.entity.ApmConfig;
import org.springblade.modules.business.entity.ApmRecord;
import org.springblade.modules.business.vo.ApmConfigVO;
import org.springblade.modules.business.vo.ApmRecordVO;
import java.util.Objects;
/**
* ApmConfig包装类,返回视图层所需的字段
*
* @author Chill
*/
public class ApmRecordWrapper extends BaseEntityWrapper<ApmRecord, ApmRecordVO> {
public static ApmRecordWrapper build() {
return new ApmRecordWrapper();
}
@Override
public ApmRecordVO entityVO(ApmRecord entity) {
if (Func.isEmpty(entity)) {
return null;
}
ApmRecordVO vo = Objects.requireNonNull(BeanUtil.copy(entity, ApmRecordVO.class));
return vo;
}
}

@ -2,6 +2,7 @@ package org.springblade.modules.business.wrapper;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.business.entity.Article;
import org.springblade.modules.business.vo.ArticleVO;
@ -19,8 +20,11 @@ public class ArticleWrapper extends BaseEntityWrapper<Article, ArticleVO> {
}
@Override
public ArticleVO entityVO(Article article) {
ArticleVO articleVO = Objects.requireNonNull(BeanUtil.copy(article, ArticleVO.class));
return articleVO;
public ArticleVO entityVO(Article entity) {
if (Func.isEmpty(entity)) {
return null;
}
ArticleVO vo = Objects.requireNonNull(BeanUtil.copy(entity, ArticleVO.class));
return vo;
}
}

@ -2,6 +2,7 @@ package org.springblade.modules.business.wrapper;
import org.springblade.core.mp.support.BaseEntityWrapper;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.business.entity.Blacklist;
import org.springblade.modules.business.vo.BlacklistVO;
@ -19,8 +20,12 @@ public class BlacklistWrapper extends BaseEntityWrapper<Blacklist, BlacklistVO>
}
@Override
public BlacklistVO entityVO(Blacklist blacklist) {
BlacklistVO blacklistVO = Objects.requireNonNull(BeanUtil.copy(blacklist, BlacklistVO.class));
public BlacklistVO entityVO(Blacklist entity) {
if (Func.isEmpty(entity)) {
return null;
}
BlacklistVO blacklistVO = Objects.requireNonNull(BeanUtil.copy(entity, BlacklistVO.class));
return blacklistVO;
}
}

Loading…
Cancel
Save