diff --git a/script/sql/zfjd-refactoring-v1/013-计划任务表设计.sql b/script/sql/zfjd-refactoring-v1/013-计划任务表设计.sql index 57bd28f6..eef8e9a5 100644 --- a/script/sql/zfjd-refactoring-v1/013-计划任务表设计.sql +++ b/script/sql/zfjd-refactoring-v1/013-计划任务表设计.sql @@ -17,6 +17,7 @@ CREATE TABLE `efcode_cp_plan` `enforce_user_names` varchar(512) NOT NULL COMMENT '执法人员姓名(多个逗号分隔)', `enforce_user_ids` varchar(512) NOT NULL COMMENT '执法人员姓名(多个逗号分隔)', + `enforce_user_tels` varchar(512) NULL COMMENT '执法人员电话号码(多个逗号分隔)', `enforce_user_codes` varchar(512) NOT NULL COMMENT '执法人员证件编号(多个逗号分隔)', `is_public` tinyint NOT NULL DEFAULT 1 COMMENT '是否公开:1=是,0=否', @@ -63,6 +64,7 @@ CREATE TABLE `efcode_cp_plan_users` `plan_id` varchar(50) NOT NULL COMMENT '计划ID', `user_id` varchar(50) NOT NULL COMMENT '用户ID', `user_name` varchar(100) NOT NULL COMMENT '用户名称', + `user_tel` varchar(50) NULL COMMENT '执法人员电话号码', `create_by` varchar(64) DEFAULT '' COMMENT '创建者', `create_dept` varchar(64) DEFAULT NULL COMMENT '创建人部门', `update_by` varchar(64) DEFAULT '' COMMENT '更新者', @@ -79,12 +81,12 @@ CREATE TABLE `efcode_cp_reserve` `op_status` tinyint NOT NULL COMMENT '操作状态' DEFAULT 3 COMMENT '操作状态:1=同意,2=拒绝,3=待确认,4=超期取消', `op_order` int NOT NULL COMMENT '联合时用户的操作顺序', - `op_time` datetime NOT NULL COMMENT '联合时用户的操作时间', + `op_time` datetime NULL COMMENT '联合时用户的操作时间', `op_message` varchar(500) NOT NULL COMMENT '联合时用户输入的操作消息', `op_set_date` datetime NOT NULL COMMENT '联合时用户选择的操作时间', `op_set_time` tinyint NOT NULL COMMENT '执行时段:1=上午,2=下午,3=其他', - `from` tinyint NOT NULL COMMENT '来自' COMMENT '来自:系统匹配=1,手动匹配=0', + `res_from` tinyint NOT NULL COMMENT '来自' COMMENT '来自:系统匹配=1,手动匹配=0', `create_by` varchar(64) DEFAULT '' COMMENT '创建者', `create_dept` varchar(64) DEFAULT NULL COMMENT '创建人部门', `update_by` varchar(64) DEFAULT '' COMMENT '更新者', @@ -115,7 +117,7 @@ CREATE TABLE `efcode_cp_notice` `enterprise_number` varchar(32) DEFAULT NULL COMMENT '企业统一社会信用代码', `contact_person` varchar(100) NOT NULL COMMENT '企业联系人', - `contact_phone` varchar(200) NOT NULL COMMENT '企业联系电话', + `contact_phone` varchar(200) NULL COMMENT '企业联系电话', `enforce_content` varchar(1000) NOT NULL COMMENT '执法事项', `enforce_requirement` varchar(1000) NOT NULL COMMENT '执法要求', @@ -137,9 +139,10 @@ CREATE TABLE `efcode_cp_notice` CREATE TABLE `efcode_cp_notice_users` ( `id` varchar(50) NOT NULL COMMENT '主键ID' primary key, - `notice_id` varchar(50) NOT NULL COMMENT '计划ID', + `notice_id` varchar(50) NOT NULL COMMENT '通知ID', `user_id` varchar(50) NOT NULL COMMENT '用户ID', `user_name` varchar(100) NOT NULL COMMENT '用户名称', + `user_tel` varchar(50) NULL COMMENT '执法人员电话号码', `create_by` varchar(64) DEFAULT '' COMMENT '创建者', `create_dept` varchar(64) DEFAULT NULL COMMENT '创建人部门', `update_by` varchar(64) DEFAULT '' COMMENT '更新者', @@ -153,7 +156,7 @@ CREATE TABLE `efcode_cp_notice_message` `notice_id` varchar(50) NOT NULL COMMENT '预告ID', `user_id` varchar(50) NOT NULL COMMENT '用户ID', `user_name` varchar(100) NOT NULL COMMENT '用户名称', - `from` tinyint NOT NULL COMMENT '来自' COMMENT '来自:企业=1,执法单位=0', + `msg_from` tinyint NOT NULL COMMENT '来自:企业=1,执法单位=0', `message` varchar(1000) NOT NULL COMMENT '消息内容', `create_by` varchar(64) DEFAULT '' COMMENT '创建者', `create_dept` varchar(64) DEFAULT NULL COMMENT '创建人部门', diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpPlanController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpPlanController.java index 7e8f2a5e..59783bae 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpPlanController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpPlanController.java @@ -4,6 +4,8 @@ import com.zdxt.enforcementcode.controller.web.supervision.EfcodeCpPlanControlle import com.zdxt.enforcementcode.domain.bo.EfcodeCpPlanBo; import com.zdxt.enforcementcode.domain.vo.EfcodeCpPlanVo; import com.zdxt.enforcementcode.service.IEfcodeCpPlanService; +import com.zdxt.enforcementcode.service.IEfcodeCpReserveService; +import org.dromara.common.core.domain.R; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; @@ -30,11 +32,27 @@ public class AppEnfCpPlanController extends EfcodeCpPlanController { @Autowired private IEfcodeCpPlanService cpPlanService; + @Autowired + private IEfcodeCpReserveService cpReserveService; + public AppEnfCpPlanController(IEfcodeCpPlanService efcodeCpPlanService) { super(efcodeCpPlanService); this.cpPlanService = efcodeCpPlanService; } + /** + * 查询我的计划列表(仅查询当前登录用户创建的计划) + */ + @Override + @GetMapping("/list") + public TableDataInfo list(EfcodeCpPlanBo bo, PageQuery pageQuery) { + bo.setCreateBy(LoginHelper.getUserId()); + if (bo.getIsDelete() == null) { + bo.setIsDelete(0L); + } + return cpPlanService.queryPageList(bo, pageQuery); + } + /** * 查询其他计划列表(本单位全部 + 其他单位公开,仅待预约状态) */ @@ -56,4 +74,22 @@ public class AppEnfCpPlanController extends EfcodeCpPlanController { SysDeptVo bureauDept = sysDeptService.iterationDeptParentToBureau(deptId); return bureauDept != null ? bureauDept.getDeptId() : null; } + + /** + * 预约前置检查 + */ + @GetMapping("/reserve/check/{targetPlanId}") + public R checkCanReserve(@PathVariable String targetPlanId) { + return cpReserveService.checkCanReserve(targetPlanId); + } + + /** + * 执行预约 + */ + @PostMapping("/reserve/do") + public R doReserve(@RequestBody java.util.Map params) { + String targetPlanId = params.get("targetPlanId"); + String opMessage = params.get("opMessage"); + return cpReserveService.doReserve(targetPlanId, opMessage); + } } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpNoticeMessage.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpNoticeMessage.java index ba2afdf6..649c486c 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpNoticeMessage.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpNoticeMessage.java @@ -45,7 +45,8 @@ public class EfcodeCpNoticeMessage extends BaseEntity { /** * 来自:企业=1,执法单位=0 */ - private Long from; + @TableField(value = "msg_from") + private Long msgFrom; /** * 消息内容 diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpNoticeUsers.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpNoticeUsers.java index 97631d1b..2c64f555 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpNoticeUsers.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpNoticeUsers.java @@ -42,5 +42,10 @@ public class EfcodeCpNoticeUsers extends BaseEntity { */ private String userName; + /** + * 执法人员电话号码 + */ + private String userTel; + } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpPlan.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpPlan.java index 218fc660..cbeab286 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpPlan.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpPlan.java @@ -89,6 +89,11 @@ public class EfcodeCpPlan extends BaseEntity { */ private String enforceUserCodes; + /** + * 执法人员电话号码(多个逗号分隔) + */ + private String enforceUserTels; + /** * 是否公开:1=是,0=否 */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpPlanUsers.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpPlanUsers.java index 78527d34..268356c9 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpPlanUsers.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpPlanUsers.java @@ -42,5 +42,10 @@ public class EfcodeCpPlanUsers extends BaseEntity { */ private String userName; + /** + * 执法人员电话号码 + */ + private String userTel; + } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpReserve.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpReserve.java index 524bed1d..9dc4a876 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpReserve.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpReserve.java @@ -77,7 +77,8 @@ public class EfcodeCpReserve extends BaseEntity { /** * 来自:系统匹配=1,手动匹配=0 */ - private Long from; + @TableField(value = "res_from") + private Long resFrom; } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpNoticeMessageBo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpNoticeMessageBo.java index e35261af..c52864eb 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpNoticeMessageBo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpNoticeMessageBo.java @@ -48,7 +48,7 @@ public class EfcodeCpNoticeMessageBo extends BaseEntity { * 来自:企业=1,执法单位=0 */ @NotNull(message = "来自:企业=1,执法单位=0不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long from; + private Long msgFrom; /** * 消息内容 diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpNoticeUsersBo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpNoticeUsersBo.java index acacd3b1..2bc3976f 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpNoticeUsersBo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpNoticeUsersBo.java @@ -44,5 +44,10 @@ public class EfcodeCpNoticeUsersBo extends BaseEntity { @NotBlank(message = "用户名称不能为空", groups = { AddGroup.class, EditGroup.class }) private String userName; + /** + * 执法人员电话号码 + */ + private String userTel; + } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpPlanBo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpPlanBo.java index 498f86d0..6b0774ac 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpPlanBo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpPlanBo.java @@ -100,6 +100,11 @@ public class EfcodeCpPlanBo extends BaseEntity { @NotBlank(message = "执法人员证件编号(多个逗号分隔)不能为空", groups = { AddGroup.class, EditGroup.class }) private String enforceUserCodes; + /** + * 执法人员电话号码(多个逗号分隔) + */ + private String enforceUserTels; + /** * 是否公开:1=是,0=否 */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpPlanUsersBo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpPlanUsersBo.java index c18dba1f..8e78597b 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpPlanUsersBo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpPlanUsersBo.java @@ -44,5 +44,10 @@ public class EfcodeCpPlanUsersBo extends BaseEntity { @NotBlank(message = "用户名称不能为空", groups = { AddGroup.class, EditGroup.class }) private String userName; + /** + * 执法人员电话号码 + */ + private String userTel; + } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpReserveBo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpReserveBo.java index 156add52..e33fa80a 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpReserveBo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpReserveBo.java @@ -86,7 +86,7 @@ public class EfcodeCpReserveBo extends BaseEntity { * 来自:系统匹配=1,手动匹配=0 */ @NotNull(message = "来自:系统匹配=1,手动匹配=0不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long from; + private Long resFrom; } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpNoticeMessageVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpNoticeMessageVo.java index e913b8a1..820fb261 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpNoticeMessageVo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpNoticeMessageVo.java @@ -56,7 +56,7 @@ public class EfcodeCpNoticeMessageVo implements Serializable { * 来自:企业=1,执法单位=0 */ @ExcelProperty(value = "来自:企业=1,执法单位=0") - private Long from; + private Long msgFrom; /** * 消息内容 diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpNoticeUsersVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpNoticeUsersVo.java index 10853eba..bec9121c 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpNoticeUsersVo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpNoticeUsersVo.java @@ -52,5 +52,11 @@ public class EfcodeCpNoticeUsersVo implements Serializable { @ExcelProperty(value = "用户名称") private String userName; + /** + * 执法人员电话号码 + */ + @ExcelProperty(value = "执法人员电话号码") + private String userTel; + } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanUsersVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanUsersVo.java index 9fd93a7b..c1fba15d 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanUsersVo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanUsersVo.java @@ -52,5 +52,11 @@ public class EfcodeCpPlanUsersVo implements Serializable { @ExcelProperty(value = "用户名称") private String userName; + /** + * 执法人员电话号码 + */ + @ExcelProperty(value = "执法人员电话号码") + private String userTel; + } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanVo.java index cc12a864..a3c916ca 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanVo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpPlanVo.java @@ -114,6 +114,12 @@ public class EfcodeCpPlanVo implements Serializable { @ExcelDictFormat(readConverterExp = "多=个逗号分隔") private String enforceUserCodes; + /** + * 执法人员电话号码(多个逗号分隔) + */ + @ExcelProperty(value = "执法人员电话号码") + private String enforceUserTels; + /** * 是否公开:1=是,0=否 */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpReserveVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpReserveVo.java index 64db5534..057ce7a5 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpReserveVo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpReserveVo.java @@ -94,7 +94,7 @@ public class EfcodeCpReserveVo implements Serializable { * 来自:系统匹配=1,手动匹配=0 */ @ExcelProperty(value = "来自:系统匹配=1,手动匹配=0") - private Long from; + private Long resFrom; } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeCpPlanMapper.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeCpPlanMapper.java index 4f837703..cba91dcb 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeCpPlanMapper.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/EfcodeCpPlanMapper.java @@ -1,7 +1,10 @@ package com.zdxt.enforcementcode.mapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zdxt.enforcementcode.domain.EfcodeCpPlan; +import com.zdxt.enforcementcode.domain.bo.EfcodeCpPlanBo; import com.zdxt.enforcementcode.domain.vo.EfcodeCpPlanVo; +import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; /** @@ -12,4 +15,14 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; */ public interface EfcodeCpPlanMapper extends BaseMapperPlus { + /** + * 分页查询其他计划列表(本单位全部 + 其他单位公开,仅待预约状态,排除当前用户) + */ + Page selectOtherPageList( + @Param("page") Page page, + @Param("bo") EfcodeCpPlanBo bo, + @Param("currentUserId") Long currentUserId, + @Param("bureauDeptId") String bureauDeptId + ); + } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpReserveService.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpReserveService.java index fe57d606..ddc982d7 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpReserveService.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpReserveService.java @@ -2,6 +2,7 @@ package com.zdxt.enforcementcode.service; import com.zdxt.enforcementcode.domain.vo.EfcodeCpReserveVo; import com.zdxt.enforcementcode.domain.bo.EfcodeCpReserveBo; +import org.dromara.common.core.domain.R; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; @@ -65,4 +66,22 @@ public interface IEfcodeCpReserveService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 预约前置检查:判断当前用户是否可以预约目标计划 + * 条件:当前用户需存在同一时间+同一时段+同一企业的计划 + * + * @param targetPlanId 目标计划ID + * @return 检查通过返回 R.ok(),不通过返回 R.fail(msg) + */ + R checkCanReserve(String targetPlanId); + + /** + * 执行预约操作 + * + * @param targetPlanId 目标计划ID + * @param opMessage 预约留言 + * @return 操作结果 + */ + R doReserve(String targetPlanId, String opMessage); } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpNoticeMessageServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpNoticeMessageServiceImpl.java index e2d9c290..d1d855e1 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpNoticeMessageServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpNoticeMessageServiceImpl.java @@ -77,7 +77,7 @@ public class EfcodeCpNoticeMessageServiceImpl implements IEfcodeCpNoticeMessageS lqw.eq(StringUtils.isNotBlank(bo.getNoticeId()), EfcodeCpNoticeMessage::getNoticeId, bo.getNoticeId()); lqw.eq(StringUtils.isNotBlank(bo.getUserId()), EfcodeCpNoticeMessage::getUserId, bo.getUserId()); lqw.like(StringUtils.isNotBlank(bo.getUserName()), EfcodeCpNoticeMessage::getUserName, bo.getUserName()); - lqw.eq(bo.getFrom() != null, EfcodeCpNoticeMessage::getFrom, bo.getFrom()); + lqw.eq(bo.getMsgFrom() != null, EfcodeCpNoticeMessage::getMsgFrom, bo.getMsgFrom()); lqw.eq(StringUtils.isNotBlank(bo.getMessage()), EfcodeCpNoticeMessage::getMessage, bo.getMessage()); lqw.eq(bo.getIsDelete() != null, EfcodeCpNoticeMessage::getIsDelete, bo.getIsDelete()); return lqw; diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpPlanServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpPlanServiceImpl.java index 96ee34e1..bd4be5c4 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpPlanServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpPlanServiceImpl.java @@ -92,35 +92,8 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { public TableDataInfo queryOtherPageList(EfcodeCpPlanBo bo, PageQuery pageQuery, String bureauDeptId) { Long currentUserId = LoginHelper.getUserId(); - LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.orderByDesc(EfcodeCpPlan::getPlanDate); - // 基础条件:待预约 + 未删除 - lqw.eq(EfcodeCpPlan::getReserveStatus, 1L); - lqw.eq(EfcodeCpPlan::getIsDelete, 0L); - // 排除当前用户自己的计划 - if (currentUserId != null) { - lqw.ne(EfcodeCpPlan::getCreateBy, currentUserId); - } - // 可见性:(本单位全部)OR(其他单位公开) - if (StringUtils.isNotBlank(bureauDeptId)) { - lqw.and(w -> w - .eq(EfcodeCpPlan::getBureauDeptId, bureauDeptId) - .or() - .nested(inner -> inner - .ne(EfcodeCpPlan::getBureauDeptId, bureauDeptId) - .eq(EfcodeCpPlan::getIsPublic, 1L) - ) - ); - } else { - // 无法确定单位时,只显示公开计划 - lqw.eq(EfcodeCpPlan::getIsPublic, 1L); - } - // 搜索条件 - lqw.eq(bo.getPlanDate() != null, EfcodeCpPlan::getPlanDate, bo.getPlanDate()); - lqw.like(StringUtils.isNotBlank(bo.getEnterpriseName()), EfcodeCpPlan::getEnterpriseName, bo.getEnterpriseName()); - lqw.like(StringUtils.isNotBlank(bo.getEnforceContent()), EfcodeCpPlan::getEnforceContent, bo.getEnforceContent()); - - Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + Page page = pageQuery.build(); + Page result = baseMapper.selectOtherPageList(page, bo, currentUserId, bureauDeptId); // 后置处理:控制记录是否可预约 afterQueryOtherList(result.getRecords(), bureauDeptId, currentUserId); return TableDataInfo.build(result); @@ -164,7 +137,8 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { private LambdaQueryWrapper buildQueryWrapper(EfcodeCpPlanBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.orderByAsc(EfcodeCpPlan::getId); + lqw.orderByDesc(EfcodeCpPlan::getCreateTime); + lqw.eq(bo.getCreateBy() != null, EfcodeCpPlan::getCreateBy, bo.getCreateBy()); lqw.eq(bo.getPlanType() != null, EfcodeCpPlan::getPlanType, bo.getPlanType()); lqw.eq(bo.getPlanDate() != null, EfcodeCpPlan::getPlanDate, bo.getPlanDate()); lqw.eq(bo.getPlanTime() != null, EfcodeCpPlan::getPlanTime, bo.getPlanTime()); @@ -211,7 +185,7 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { if (flag) { bo.setId(add.getId()); // 同步写入计划参与人员表 - syncPlanUsers(add.getId(), bo.getEnforceUserIds(), bo.getEnforceUserNames()); + syncPlanUsers(add.getId(), bo.getEnforceUserIds(), bo.getEnforceUserNames(), bo.getEnforceUserTels()); } // 新增后置处理 afterInsert(bo, add); @@ -234,7 +208,7 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { boolean flag = baseMapper.updateById(update) > 0; if (flag) { // 重建计划参与人员关联(先删后插,保证与表头字段一致) - syncPlanUsers(bo.getId(), bo.getEnforceUserIds(), bo.getEnforceUserNames()); + syncPlanUsers(bo.getId(), bo.getEnforceUserIds(), bo.getEnforceUserNames(), bo.getEnforceUserTels()); } // 修改后置处理 afterUpdate(bo, update); @@ -263,9 +237,9 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { /** * 同步计划参与人员表 efcode_cp_plan_users - *

策略:先根据 plan_id 清除原有关联,再按 enforceUserIds / enforceUserNames 的逗号分隔顺序逐条写入。

+ *

策略:先根据 plan_id 清除原有关联,再按 enforceUserIds / enforceUserNames / enforceUserTels 的逗号分隔顺序逐条写入。

*/ - private void syncPlanUsers(String planId, String userIdsCsv, String userNamesCsv) { + private void syncPlanUsers(String planId, String userIdsCsv, String userNamesCsv, String userTelsCsv) { if (StringUtils.isBlank(planId)) { return; } @@ -278,6 +252,7 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { } String[] ids = userIdsCsv.split(","); String[] names = StringUtils.isNotBlank(userNamesCsv) ? userNamesCsv.split(",") : new String[0]; + String[] tels = StringUtils.isNotBlank(userTelsCsv) ? userTelsCsv.split(",") : new String[0]; List list = new ArrayList<>(ids.length); for (int i = 0; i < ids.length; i++) { String uid = ids[i] == null ? "" : ids[i].trim(); @@ -288,6 +263,7 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { u.setPlanId(planId); u.setUserId(uid); u.setUserName(i < names.length && names[i] != null ? names[i].trim() : ""); + u.setUserTel(i < tels.length && tels[i] != null ? tels[i].trim() : ""); list.add(u); } for (EfcodeCpPlanUsers u : list) { diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpReserveServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpReserveServiceImpl.java index d479469a..6796eb3c 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpReserveServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpReserveServiceImpl.java @@ -1,24 +1,29 @@ package com.zdxt.enforcementcode.service.impl; +import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.satoken.utils.LoginHelper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.zdxt.enforcementcode.domain.bo.EfcodeCpReserveBo; import com.zdxt.enforcementcode.domain.vo.EfcodeCpReserveVo; import com.zdxt.enforcementcode.domain.EfcodeCpReserve; +import com.zdxt.enforcementcode.domain.EfcodeCpPlan; import com.zdxt.enforcementcode.mapper.EfcodeCpReserveMapper; +import com.zdxt.enforcementcode.mapper.EfcodeCpPlanMapper; import com.zdxt.enforcementcode.service.IEfcodeCpReserveService; +import com.zdxt.enforcementcode.service.IEfcodeCpSettingService; -import java.util.List; -import java.util.Map; -import java.util.Collection; +import java.util.*; +import java.util.stream.Collectors; /** * 行政执法检查计划-预约Service业务层处理 @@ -32,6 +37,8 @@ import java.util.Collection; public class EfcodeCpReserveServiceImpl implements IEfcodeCpReserveService { private final EfcodeCpReserveMapper baseMapper; + private final EfcodeCpPlanMapper cpPlanMapper; + private final IEfcodeCpSettingService cpSettingService; /** * 查询行政执法检查计划-预约 @@ -82,7 +89,7 @@ public class EfcodeCpReserveServiceImpl implements IEfcodeCpReserveService { lqw.eq(StringUtils.isNotBlank(bo.getOpMessage()), EfcodeCpReserve::getOpMessage, bo.getOpMessage()); lqw.eq(bo.getOpSetDate() != null, EfcodeCpReserve::getOpSetDate, bo.getOpSetDate()); lqw.eq(bo.getOpSetTime() != null, EfcodeCpReserve::getOpSetTime, bo.getOpSetTime()); - lqw.eq(bo.getFrom() != null, EfcodeCpReserve::getFrom, bo.getFrom()); + lqw.eq(bo.getResFrom() != null, EfcodeCpReserve::getResFrom, bo.getResFrom()); return lqw; } @@ -137,4 +144,151 @@ public class EfcodeCpReserveServiceImpl implements IEfcodeCpReserveService { } return baseMapper.deleteByIds(ids) > 0; } + + /** + * 预约前置检查 + */ + @Override + public R checkCanReserve(String targetPlanId) { + Long currentUserId = LoginHelper.getUserId(); + // 1. 查询目标计划 + EfcodeCpPlan targetPlan = cpPlanMapper.selectById(targetPlanId); + if (targetPlan == null) { + return R.fail("目标计划不存在"); + } + // 2. 判断当前用户是否有同一时间+同一时段+同一企业的计划 + EfcodeCpPlan myPlan = findMyMatchingPlan(targetPlan, currentUserId); + if (myPlan == null) { + return R.fail("请先添加我的计划再进行预约"); + } + // 3. 判断 plan_group_id 人数是否已达上限 + String planGroupId = findExistingPlanGroupId(targetPlanId); + if (planGroupId != null) { + int maxUnionUnit = cpSettingService.getMaxUnionUnit(); + long activeCount = countActiveReserves(planGroupId); + if (activeCount >= maxUnionUnit) { + return R.fail("该计划的预约已经到达最大数量(" + maxUnionUnit + "),无法参与预约"); + } + // 4. 判断当前用户是否已经预约过 + boolean alreadyReserved = checkAlreadyReserved(myPlan.getId(), planGroupId); + if (alreadyReserved) { + return R.fail("您已经预约过该计划"); + } + } + return R.ok(); + } + + /** + * 执行预约 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public R doReserve(String targetPlanId, String opMessage) { + Long currentUserId = LoginHelper.getUserId(); + // 1. 查询目标计划 + EfcodeCpPlan targetPlan = cpPlanMapper.selectById(targetPlanId); + if (targetPlan == null) { + return R.fail("目标计划不存在"); + } + // 2. 查找当前用户匹配的计划 + EfcodeCpPlan myPlan = findMyMatchingPlan(targetPlan, currentUserId); + if (myPlan == null) { + return R.fail("请先添加我的计划再进行预约"); + } + // 3. 判断目标计划在reserve表中是否已存在 + String planGroupId = findExistingPlanGroupId(targetPlanId); + int maxUnionUnit = cpSettingService.getMaxUnionUnit(); + + if (planGroupId == null) { + // 不存在:插入2条记录(目标计划 + 我的计划),plan_group_id = 目标计划ID + planGroupId = targetPlanId; + if (2 > maxUnionUnit) { + return R.fail("该计划的预约已经到达最大数量(" + maxUnionUnit + "),无法参与预约"); + } + // 目标计划记录 + insertReserveRecord(targetPlanId, planGroupId, "", targetPlan.getPlanDate(), targetPlan.getPlanTime(), 0L); + // 我的计划记录 + insertReserveRecord(myPlan.getId(), planGroupId, opMessage, targetPlan.getPlanDate(), targetPlan.getPlanTime(), 0L); + } else { + // 已存在:检查人数上限 + long activeCount = countActiveReserves(planGroupId); + if (activeCount >= maxUnionUnit) { + return R.fail("该计划的预约已经到达最大数量(" + maxUnionUnit + "),无法参与预约"); + } + // 检查是否已经预约过 + boolean alreadyReserved = checkAlreadyReserved(myPlan.getId(), planGroupId); + if (alreadyReserved) { + return R.fail("您已经预约过该计划"); + } + // 插入1条记录 + insertReserveRecord(myPlan.getId(), planGroupId, opMessage, targetPlan.getPlanDate(), targetPlan.getPlanTime(), 0L); + } + return R.ok(); + } + + /** + * 查找当前用户同一时间+同一时段+同一企业的计划 + */ + private EfcodeCpPlan findMyMatchingPlan(EfcodeCpPlan targetPlan, Long currentUserId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(EfcodeCpPlan::getPlanDate, targetPlan.getPlanDate()); + lqw.eq(EfcodeCpPlan::getPlanTime, targetPlan.getPlanTime()); + lqw.eq(EfcodeCpPlan::getEnterpriseId, targetPlan.getEnterpriseId()); + lqw.eq(EfcodeCpPlan::getCreateBy, currentUserId); + lqw.eq(EfcodeCpPlan::getIsDelete, 0L); + lqw.last("LIMIT 1"); + return cpPlanMapper.selectOne(lqw); + } + + /** + * 查找目标计划在reserve表中已存在的plan_group_id + */ + private String findExistingPlanGroupId(String targetPlanId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(EfcodeCpReserve::getPlanId, targetPlanId); + lqw.last("LIMIT 1"); + EfcodeCpReserve existing = baseMapper.selectOne(lqw); + return existing != null ? existing.getPlanGroupId() : null; + } + + /** + * 统计plan_group_id下状态为同意(1)或待确认(3)的记录数 + */ + private long countActiveReserves(String planGroupId) { + return baseMapper.selectCount( + Wrappers.lambdaQuery() + .eq(EfcodeCpReserve::getPlanGroupId, planGroupId) + .in(EfcodeCpReserve::getOpStatus, Arrays.asList(1L, 3L)) + ); + } + + /** + * 检查当前用户的计划是否已在该分组中预约过 + */ + private boolean checkAlreadyReserved(String myPlanId, String planGroupId) { + long count = baseMapper.selectCount( + Wrappers.lambdaQuery() + .eq(EfcodeCpReserve::getPlanId, myPlanId) + .eq(EfcodeCpReserve::getPlanGroupId, planGroupId) + .in(EfcodeCpReserve::getOpStatus, Arrays.asList(1L, 3L)) + ); + return count > 0; + } + + /** + * 插入一条预约记录 + */ + private void insertReserveRecord(String planId, String planGroupId, String opMessage, Date opSetDate, Long opSetTime, Long resFrom) { + EfcodeCpReserve record = new EfcodeCpReserve(); + record.setPlanId(planId); + record.setPlanGroupId(planGroupId); + record.setReserveTime(new Date()); + record.setOpStatus(3L); // 待确认 + record.setOpOrder(0L); + record.setOpMessage(opMessage); + record.setOpSetDate(opSetDate); + record.setOpSetTime(opSetTime); + record.setResFrom(resFrom); + baseMapper.insert(record); + } } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpPlanMapper.xml b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpPlanMapper.xml index 6651e373..b0efb917 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpPlanMapper.xml +++ b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/EfcodeCpPlanMapper.xml @@ -3,4 +3,51 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/plan.js b/zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/plan.js index 20ab6681..0d5c16df 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/plan.js +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/api/enforcement/plan.js @@ -22,6 +22,12 @@ export const editPlan = (params, success, error) => _put(planBaseUrl, params, su // 删除计划 export const deletePlan = (ids, success, error) => _delete(planBaseUrl + "/" + ids, {}, success, error); +// 预约前置检查 +export const checkCanReserve = (targetPlanId, success, error) => _get(planBaseUrl + "/reserve/check/" + targetPlanId, {}, success, error); + +// 执行预约 +export const doReservePlan = (params, success, error) => _post(planBaseUrl + "/reserve/do", params, success, error); + // endregion // region 计划-设置接口 diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/assets/style/index.less b/zdxt-web-client/zdxt-efcode-enforcement-app/src/assets/style/index.less index 1c2d8fa1..84a8cc6a 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/assets/style/index.less +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/assets/style/index.less @@ -49,4 +49,19 @@ html,body,#app{ .van-nav-bar .van-icon { color: #333; -} \ No newline at end of file +} + +/* ===== Toast 样式增强:更醒目、层级更高 ===== */ +.van-toast { + z-index: 99999 !important; + background: rgba(0, 0, 0, 0.82) !important; + padding: 14px 24px !important; + border-radius: 12px !important; + box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3) !important; +} +.van-toast__text { + color: #ffffff !important; + font-size: 15px !important; + font-weight: 500 !important; + line-height: 1.5 !important; +} diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/plan/cp_plan_edit.vue b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/plan/cp_plan_edit.vue index 72e17ad5..284a96de 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/plan/cp_plan_edit.vue +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/plan/cp_plan_edit.vue @@ -228,7 +228,7 @@ @@ -429,4 +524,32 @@ const onReservePlan = (item) => { color: #07c160; font-weight: 500; } + +/* 预约留言弹窗 */ +.reserve-popup { + padding: 16px; + + .reserve-popup-title { + font-size: 16px; + font-weight: 600; + text-align: center; + margin-bottom: 16px; + color: #333; + } + + :deep(.van-field) { + padding: 10px 0; + } + + .reserve-popup-actions { + display: flex; + gap: 12px; + margin-top: 20px; + padding: 0 10px; + + .van-button { + flex: 1; + } + } +} diff --git a/zdxt-web-server/zdxt-admin-web-server/src/test/java/com/zdxt/rest/test/cp/AppEnfCpPlanControllerTest.java b/zdxt-web-server/zdxt-admin-web-server/src/test/java/com/zdxt/rest/test/cp/AppEnfCpPlanControllerTest.java index ae679690..1ae87db8 100644 --- a/zdxt-web-server/zdxt-admin-web-server/src/test/java/com/zdxt/rest/test/cp/AppEnfCpPlanControllerTest.java +++ b/zdxt-web-server/zdxt-admin-web-server/src/test/java/com/zdxt/rest/test/cp/AppEnfCpPlanControllerTest.java @@ -120,6 +120,7 @@ public class AppEnfCpPlanControllerTest { info.put("organName", data.get("organName").asText()); info.put("bureauUnitId", data.get("bureauUnitId").asText()); info.put("bureauUnitName", data.get("bureauUnitName").asText()); + info.put("phonenumber", data.has("phonenumber") ? data.get("phonenumber").asText() : ""); System.out.println("[" + account + "] 登录成功: userId=" + info.get("userId")); return info; @@ -252,6 +253,7 @@ public class AppEnfCpPlanControllerTest { bo.put("enterpriseId", enterprise.getId()); bo.put("enforceUserNames", userName); bo.put("enforceUserIds", userId); + bo.put("enforceUserTels", loginInfo.get("phonenumber")); bo.put("enforceUserCodes", "-"); bo.put("isPublic", random.nextInt(2) == 0 ? 0L : 1L); // 随机公开/不公开 bo.put("isUnion", random.nextInt(2) == 0 ? 0L : 1L); // 随机联合/普通