diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EnterpriseSearchController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EnterpriseSearchController.java index c10a7f8c..ae77101a 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EnterpriseSearchController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/EnterpriseSearchController.java @@ -1,8 +1,13 @@ package com.zdxt.enforcementcode.controller; import com.zdxt.enforcementcode.domain.vo.EnterpriseSearchVo; +import com.zdxt.enforcementcode.domain.vo.EnterpriseInformationVo; +import com.zdxt.enforcementcode.domain.vo.SsztJbxx110497NewVo; import com.zdxt.enforcementcode.service.IEnterpriseInformationService; +import com.zdxt.enforcementcode.service.ISsztJbxx110497NewService; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.dromara.common.core.domain.R; import org.dromara.common.web.core.BaseController; import org.springframework.validation.annotation.Validated; @@ -11,18 +16,22 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 企业搜索 */ @Validated @RequiredArgsConstructor +@Slf4j @RestController @RequestMapping("/enforcementcode/enterpriseSearch") public class EnterpriseSearchController extends BaseController { private final IEnterpriseInformationService enterpriseInformationService; + private final ISsztJbxx110497NewService ssztJbxx110497NewService; /** * 根据企业名称模糊搜索 @@ -83,4 +92,43 @@ public class EnterpriseSearchController extends BaseController { public R> searchSsztByNumber(@RequestParam String enterpriseNumber) { return R.ok(enterpriseInformationService.searchSsztByNumber(enterpriseNumber)); } + + /** + * 根据企业信用代码查询联系人和联系电话 + * 优先查 enterprise_information,找不到再查 sszt_jbxx110497_new + * + * @param enterpriseNumber 企业统一社会信用代码 + * @return { contactPerson, contactPhone } + */ + @GetMapping("/getContactInfo") + public R> getContactInfo(@RequestParam String enterpriseNumber) { + Map result = new HashMap<>(); + if (StringUtils.isBlank(enterpriseNumber)) { + return R.ok(result); + } + try { + // 1. 先查 enterprise_information 表 + EnterpriseInformationVo entInfo = enterpriseInformationService.queryByEnterpriseNumber(enterpriseNumber); + if (entInfo != null) { + if (StringUtils.isNotBlank(entInfo.getLegalPerson())) { + result.put("contactPerson", entInfo.getLegalPerson()); + } + if (StringUtils.isNotBlank(entInfo.getEnterpriseTel())) { + result.put("contactPhone", entInfo.getEnterpriseTel()); + } + return R.ok(result); + } + // 2. 未找到,查 sszt_jbxx110497_new 表 + List ssztList = ssztJbxx110497NewService.queryByTyshxydm(enterpriseNumber); + if (ssztList != null && !ssztList.isEmpty()) { + SsztJbxx110497NewVo sszt = ssztList.get(0); + if (StringUtils.isNotBlank(sszt.getFddbr())) { + result.put("contactPerson", sszt.getFddbr()); + } + } + } catch (Exception e) { + log.warn("[企业搜索] 查询联系人信息失败, enterpriseNumber={}, error={}", enterpriseNumber, e.getMessage()); + } + return R.ok(result); + } } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpNoticeController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpNoticeController.java index d29b3e82..8470cd04 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpNoticeController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfCpNoticeController.java @@ -1,22 +1,99 @@ package com.zdxt.enforcementcode.controller.app.enforcement; -import com.zdxt.enforcementcode.controller.web.supervision.EfcodeCpNoticeController; +import com.zdxt.enforcementcode.domain.bo.EfcodeCpNoticeBo; +import com.zdxt.enforcementcode.domain.bo.EfcodeCpNoticeMessageBo; +import com.zdxt.enforcementcode.domain.vo.EfcodeCpNoticeMessageVo; +import com.zdxt.enforcementcode.domain.vo.EfcodeCpNoticeVo; +import com.zdxt.enforcementcode.service.IEfcodeCpNoticeMessageService; import com.zdxt.enforcementcode.service.IEfcodeCpNoticeService; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import lombok.RequiredArgsConstructor; +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.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** - * 行政执法检查计划-预约 + * 执法端-预告管理 * - * @author Lion Li - * @date 2026-05-16 + * @author zdxt + * @date 2026-05-28 */ @Validated +@RequiredArgsConstructor @RestController @RequestMapping("/app-enf/cpNotice") -public class AppEnfCpNoticeController extends EfcodeCpNoticeController { +public class AppEnfCpNoticeController { + + private final IEfcodeCpNoticeService efcodeCpNoticeService; + private final IEfcodeCpNoticeMessageService efcodeCpNoticeMessageService; + + /** + * 查询我的预告列表(分页,只返回当前用户创建的预告) + * 通过status区分tab:0=草稿, 1=待执法(已发布), 3=历史(已执行) + */ + @GetMapping("/myList") + public TableDataInfo myList(EfcodeCpNoticeBo bo, PageQuery pageQuery) { + return efcodeCpNoticeService.queryMyPageList(bo, pageQuery); + } + + /** + * 获取预告详情 + */ + @GetMapping("/{id}") + public R getInfo(@NotBlank(message = "主键不能为空") @PathVariable String id) { + return R.ok(efcodeCpNoticeService.queryById(id)); + } + + /** + * 保存预告(草稿/发布) + * status=0 存为草稿, status=1 发布预告 + */ + @PostMapping() + public R save(@RequestBody EfcodeCpNoticeBo bo) { + return R.ok(efcodeCpNoticeService.saveNotice(bo)); + } + + /** + * 修改预告(仅草稿状态可修改) + */ + @PutMapping() + public R update(@RequestBody EfcodeCpNoticeBo bo) { + return R.ok(efcodeCpNoticeService.updateNotice(bo)); + } + + /** + * 删除预告(仅草稿状态可删除) + */ + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable String[] ids) { + return R.ok(efcodeCpNoticeService.deleteNotice(List.of(ids))); + } + + // =================== 留言相关 =================== + + /** + * 查询某个预告的留言列表 + */ + @GetMapping("/message/list") + public R> messageList(@RequestParam String noticeId) { + EfcodeCpNoticeMessageBo bo = new EfcodeCpNoticeMessageBo(); + bo.setNoticeId(noticeId); + bo.setIsDelete(0L); + return R.ok(efcodeCpNoticeMessageService.queryList(bo)); + } - public AppEnfCpNoticeController(IEfcodeCpNoticeService efcodeCpNoticeService) { - super(efcodeCpNoticeService); + /** + * 新增留言 + */ + @PostMapping("/message") + public R addMessage(@RequestBody EfcodeCpNoticeMessageBo bo) { + bo.setIsDelete(0L); + efcodeCpNoticeMessageService.insertByBo(bo); + return R.ok(); } } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpNotice.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpNotice.java index 3b9b543e..e228e956 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpNotice.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/EfcodeCpNotice.java @@ -80,10 +80,15 @@ public class EfcodeCpNotice extends BaseEntity { private String enforceUserNames; /** - * 执法人员姓名(多个逗号分隔) + * 执法人员ID(多个逗号分隔) */ private String enforceUserIds; + /** + * 执法人员电话(多个逗号分隔) + */ + private String enforceUserTels; + /** * 执法人员证件编号(多个逗号分隔) */ 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 15f319a4..de23dfd0 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 @@ -74,6 +74,16 @@ public class EfcodeCpPlan extends BaseEntity { */ private String enterpriseId; + /** + * 企业联系人 + */ + private String contactPerson; + + /** + * 企业联系电话 + */ + private String contactPhone; + /** * 执法人员姓名(多个逗号分隔) */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpNoticeBo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpNoticeBo.java index 4a343aaf..f66b23cf 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpNoticeBo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EfcodeCpNoticeBo.java @@ -42,7 +42,6 @@ public class EfcodeCpNoticeBo extends BaseEntity { /** * 执法时段:1=上午,2=下午,3=其他 */ - @NotNull(message = "执法时段:1=上午,2=下午,3=其他不能为空", groups = { AddGroup.class, EditGroup.class }) private Long enforceTime; /** @@ -84,19 +83,21 @@ public class EfcodeCpNoticeBo extends BaseEntity { /** * 执法人员姓名(多个逗号分隔) */ - @NotBlank(message = "执法人员姓名(多个逗号分隔)不能为空", groups = { AddGroup.class, EditGroup.class }) private String enforceUserNames; /** - * 执法人员姓名(多个逗号分隔) + * 执法人员ID(多个逗号分隔) */ - @NotBlank(message = "执法人员姓名(多个逗号分隔)不能为空", groups = { AddGroup.class, EditGroup.class }) private String enforceUserIds; + /** + * 执法人员电话(多个逗号分隔) + */ + private String enforceUserTels; + /** * 执法人员证件编号(多个逗号分隔) */ - @NotBlank(message = "执法人员证件编号(多个逗号分隔)不能为空", groups = { AddGroup.class, EditGroup.class }) private String enforceUserCodes; /** @@ -119,13 +120,11 @@ public class EfcodeCpNoticeBo extends BaseEntity { /** * 企业联系人 */ - @NotBlank(message = "企业联系人不能为空", groups = { AddGroup.class, EditGroup.class }) private String contactPerson; /** * 企业联系电话 */ - @NotBlank(message = "企业联系电话不能为空", groups = { AddGroup.class, EditGroup.class }) private String contactPhone; /** @@ -148,13 +147,11 @@ public class EfcodeCpNoticeBo extends BaseEntity { /** * 预告状态:0=草稿,1=已发布,2=已取消,3=已执行 */ - @NotNull(message = "预告状态:0=草稿,1=已发布,2=已取消,3=已执行不能为空", groups = { AddGroup.class, EditGroup.class }) private Long status; /** * 是否删除:0=否,1=是 */ - @NotNull(message = "是否删除:0=否,1=是不能为空", groups = { AddGroup.class, EditGroup.class }) private Long isDelete; /** 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 f6aa8d53..3e5a5abc 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 @@ -82,6 +82,16 @@ public class EfcodeCpPlanBo extends BaseEntity { @NotBlank(message = "被检查企业/机构Id不能为空", groups = { AddGroup.class, EditGroup.class }) private String enterpriseId; + /** + * 企业联系人 + */ + private String contactPerson; + + /** + * 企业联系电话 + */ + private String contactPhone; + /** * 执法人员姓名(多个逗号分隔) */ 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 820fb261..a349831c 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 @@ -70,5 +70,10 @@ public class EfcodeCpNoticeMessageVo implements Serializable { @ExcelProperty(value = "是否删除:0=否,1=是") private Long isDelete; + /** + * 创建时间 + */ + private Date createTime; + } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpNoticeVo.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpNoticeVo.java index d9a52280..6a22c0b9 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpNoticeVo.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/EfcodeCpNoticeVo.java @@ -112,6 +112,11 @@ public class EfcodeCpNoticeVo implements Serializable { @ExcelDictFormat(readConverterExp = "多=个逗号分隔") private String enforceUserCodes; + /** + * 执法人员电话(多个逗号分隔) + */ + private String enforceUserTels; + /** * 被检查企业ID */ @@ -178,5 +183,10 @@ public class EfcodeCpNoticeVo implements Serializable { @ExcelProperty(value = "备注") private String remark; + /** + * 创建时间 + */ + private Date createTime; + } 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 26cd18b2..3d5f637f 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 @@ -93,6 +93,18 @@ public class EfcodeCpPlanVo implements Serializable { @ExcelProperty(value = "被检查企业/机构Id") private String enterpriseId; + /** + * 企业联系人 + */ + @ExcelProperty(value = "企业联系人") + private String contactPerson; + + /** + * 企业联系电话 + */ + @ExcelProperty(value = "企业联系电话") + private String contactPhone; + /** * 执法人员姓名(多个逗号分隔) */ diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpNoticeService.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpNoticeService.java index 013d7ac9..babee848 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpNoticeService.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IEfcodeCpNoticeService.java @@ -65,4 +65,24 @@ public interface IEfcodeCpNoticeService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 查询当前用户的预告列表(分页) + */ + TableDataInfo queryMyPageList(EfcodeCpNoticeBo bo, PageQuery pageQuery); + + /** + * 保存预告(新增草稿或发布)并同步写入 notice_users 表 + */ + String saveNotice(EfcodeCpNoticeBo bo); + + /** + * 修改预告(仅草稿可修改)并同步更新 notice_users 表 + */ + String updateNotice(EfcodeCpNoticeBo bo); + + /** + * 删除预告(仅草稿可删除) + */ + String deleteNotice(Collection ids); } 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 d1d855e1..b69736c0 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 @@ -73,7 +73,7 @@ public class EfcodeCpNoticeMessageServiceImpl implements IEfcodeCpNoticeMessageS private LambdaQueryWrapper buildQueryWrapper(EfcodeCpNoticeMessageBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.orderByAsc(EfcodeCpNoticeMessage::getId); + lqw.orderByAsc(EfcodeCpNoticeMessage::getCreateTime); 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()); diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpNoticeServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpNoticeServiceImpl.java index 4b5ddc44..366dac70 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpNoticeServiceImpl.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/EfcodeCpNoticeServiceImpl.java @@ -1,24 +1,27 @@ package com.zdxt.enforcementcode.service.impl; +import cn.hutool.core.util.IdUtil; 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.EfcodeCpNoticeBo; import com.zdxt.enforcementcode.domain.vo.EfcodeCpNoticeVo; import com.zdxt.enforcementcode.domain.EfcodeCpNotice; +import com.zdxt.enforcementcode.domain.EfcodeCpNoticeUsers; import com.zdxt.enforcementcode.mapper.EfcodeCpNoticeMapper; +import com.zdxt.enforcementcode.mapper.EfcodeCpNoticeUsersMapper; import com.zdxt.enforcementcode.service.IEfcodeCpNoticeService; -import java.util.List; -import java.util.Map; -import java.util.Collection; +import java.util.*; /** * 行政执法检查计划-预告Service业务层处理 @@ -32,24 +35,18 @@ import java.util.Collection; public class EfcodeCpNoticeServiceImpl implements IEfcodeCpNoticeService { private final EfcodeCpNoticeMapper baseMapper; + private final EfcodeCpNoticeUsersMapper noticeUsersMapper; /** * 查询行政执法检查计划-预告 - * - * @param id 主键 - * @return 行政执法检查计划-预告 */ @Override - public EfcodeCpNoticeVo queryById(String id){ + public EfcodeCpNoticeVo queryById(String id) { return baseMapper.selectVoById(id); } /** * 分页查询行政执法检查计划-预告列表 - * - * @param bo 查询条件 - * @param pageQuery 分页参数 - * @return 行政执法检查计划-预告分页列表 */ @Override public TableDataInfo queryPageList(EfcodeCpNoticeBo bo, PageQuery pageQuery) { @@ -60,9 +57,6 @@ public class EfcodeCpNoticeServiceImpl implements IEfcodeCpNoticeService { /** * 查询符合条件的行政执法检查计划-预告列表 - * - * @param bo 查询条件 - * @return 行政执法检查计划-预告列表 */ @Override public List queryList(EfcodeCpNoticeBo bo) { @@ -70,30 +64,141 @@ public class EfcodeCpNoticeServiceImpl implements IEfcodeCpNoticeService { return baseMapper.selectVoList(lqw); } + /** + * 查询当前用户的预告列表(分页) + * 过滤条件:create_by = 当前用户ID,is_delete = 0 + */ + @Override + public TableDataInfo queryMyPageList(EfcodeCpNoticeBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + // 只看自己发布的预告 + Long userId = LoginHelper.getUserId(); + lqw.eq(EfcodeCpNotice::getCreateBy, userId); + // 过滤已删除 + lqw.eq(EfcodeCpNotice::getIsDelete, 0); + // 按创建时间倒序 + lqw.orderByDesc(EfcodeCpNotice::getCreateTime); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 保存预告(新增草稿或发布)并同步写入 notice_users 表 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public String saveNotice(EfcodeCpNoticeBo bo) { + EfcodeCpNotice entity = MapstructUtils.convert(bo, EfcodeCpNotice.class); + // 生成主键 + if (StringUtils.isBlank(entity.getId())) { + entity.setId(IdUtil.getSnowflakeNextIdStr()); + } + // 默认未删除 + entity.setIsDelete(0L); + // 如果是发布(status=1),设置发布时间 + if (entity.getStatus() != null && entity.getStatus() == 1L) { + entity.setPublishTime(new Date()); + } + baseMapper.insert(entity); + // 同步写入 notice_users 表 + syncNoticeUsers(entity.getId(), bo.getEnforceUserNames(), bo.getEnforceUserIds(), bo.getEnforceUserTels()); + return "操作成功"; + } + + /** + * 修改预告(仅草稿可修改)并同步更新 notice_users 表 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public String updateNotice(EfcodeCpNoticeBo bo) { + // 校验:只有草稿(status=0)能修改 + EfcodeCpNotice existing = baseMapper.selectById(bo.getId()); + if (existing == null) { + return "预告不存在"; + } + if (existing.getStatus() != null && existing.getStatus() != 0L) { + return "非草稿状态的预告不能修改"; + } + EfcodeCpNotice update = MapstructUtils.convert(bo, EfcodeCpNotice.class); + // 如果此次操作是发布(status=1),设置发布时间 + if (update.getStatus() != null && update.getStatus() == 1L) { + update.setPublishTime(new Date()); + } + baseMapper.updateById(update); + // 同步更新 notice_users 表(先删后插) + syncNoticeUsers(bo.getId(), bo.getEnforceUserNames(), bo.getEnforceUserIds(), bo.getEnforceUserTels()); + return "操作成功"; + } + + /** + * 删除预告(仅草稿可删除) + */ + @Override + @Transactional(rollbackFor = Exception.class) + public String deleteNotice(Collection ids) { + for (String id : ids) { + EfcodeCpNotice existing = baseMapper.selectById(id); + if (existing == null) { + continue; + } + if (existing.getStatus() != null && existing.getStatus() != 0L) { + return "非草稿状态的预告不能删除"; + } + } + // 逻辑删除(更新 is_delete=1) + for (String id : ids) { + EfcodeCpNotice update = new EfcodeCpNotice(); + update.setId(id); + update.setIsDelete(1L); + baseMapper.updateById(update); + } + // 同步删除 notice_users + for (String id : ids) { + LambdaQueryWrapper delWrapper = Wrappers.lambdaQuery(); + delWrapper.eq(EfcodeCpNoticeUsers::getNoticeId, id); + noticeUsersMapper.delete(delWrapper); + } + return "操作成功"; + } + + /** + * 同步写入/更新 notice_users 表 + */ + private void syncNoticeUsers(String noticeId, String names, String userIds, String tels) { + // 先删除旧记录 + LambdaQueryWrapper delWrapper = Wrappers.lambdaQuery(); + delWrapper.eq(EfcodeCpNoticeUsers::getNoticeId, noticeId); + noticeUsersMapper.delete(delWrapper); + + // 逐个插入 + if (StringUtils.isBlank(userIds)) { + return; + } + String[] idArr = userIds.split(","); + String[] nameArr = StringUtils.isNotBlank(names) ? names.split(",") : new String[0]; + String[] telArr = StringUtils.isNotBlank(tels) ? tels.split(",") : new String[0]; + + for (int i = 0; i < idArr.length; i++) { + EfcodeCpNoticeUsers user = new EfcodeCpNoticeUsers(); + user.setId(IdUtil.getSnowflakeNextIdStr()); + user.setNoticeId(noticeId); + user.setUserId(idArr[i].trim()); + user.setUserName(i < nameArr.length ? nameArr[i].trim() : ""); + user.setUserTel(i < telArr.length ? telArr[i].trim() : ""); + noticeUsersMapper.insert(user); + } + } + private LambdaQueryWrapper buildQueryWrapper(EfcodeCpNoticeBo bo) { Map params = bo.getParams(); LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); - lqw.orderByAsc(EfcodeCpNotice::getId); lqw.eq(bo.getPlanId() != null, EfcodeCpNotice::getPlanId, bo.getPlanId()); lqw.eq(StringUtils.isNotBlank(bo.getEnforceDate()), EfcodeCpNotice::getEnforceDate, bo.getEnforceDate()); lqw.eq(bo.getEnforceTime() != null, EfcodeCpNotice::getEnforceTime, bo.getEnforceTime()); lqw.eq(StringUtils.isNotBlank(bo.getBureauDeptId()), EfcodeCpNotice::getBureauDeptId, bo.getBureauDeptId()); lqw.like(StringUtils.isNotBlank(bo.getBureauDeptName()), EfcodeCpNotice::getBureauDeptName, bo.getBureauDeptName()); - lqw.eq(StringUtils.isNotBlank(bo.getOrganId()), EfcodeCpNotice::getOrganId, bo.getOrganId()); - lqw.like(StringUtils.isNotBlank(bo.getOrganName()), EfcodeCpNotice::getOrganName, bo.getOrganName()); - lqw.eq(StringUtils.isNotBlank(bo.getDeptId()), EfcodeCpNotice::getDeptId, bo.getDeptId()); - lqw.like(StringUtils.isNotBlank(bo.getDeptName()), EfcodeCpNotice::getDeptName, bo.getDeptName()); - lqw.eq(StringUtils.isNotBlank(bo.getEnforceUserNames()), EfcodeCpNotice::getEnforceUserNames, bo.getEnforceUserNames()); - lqw.eq(StringUtils.isNotBlank(bo.getEnforceUserIds()), EfcodeCpNotice::getEnforceUserIds, bo.getEnforceUserIds()); - lqw.eq(StringUtils.isNotBlank(bo.getEnforceUserCodes()), EfcodeCpNotice::getEnforceUserCodes, bo.getEnforceUserCodes()); lqw.eq(StringUtils.isNotBlank(bo.getEnterpriseId()), EfcodeCpNotice::getEnterpriseId, bo.getEnterpriseId()); lqw.like(StringUtils.isNotBlank(bo.getEnterpriseName()), EfcodeCpNotice::getEnterpriseName, bo.getEnterpriseName()); - lqw.eq(StringUtils.isNotBlank(bo.getEnterpriseNumber()), EfcodeCpNotice::getEnterpriseNumber, bo.getEnterpriseNumber()); - lqw.eq(StringUtils.isNotBlank(bo.getContactPerson()), EfcodeCpNotice::getContactPerson, bo.getContactPerson()); - lqw.eq(StringUtils.isNotBlank(bo.getContactPhone()), EfcodeCpNotice::getContactPhone, bo.getContactPhone()); - lqw.eq(StringUtils.isNotBlank(bo.getEnforceContent()), EfcodeCpNotice::getEnforceContent, bo.getEnforceContent()); - lqw.eq(StringUtils.isNotBlank(bo.getEnforceRequirement()), EfcodeCpNotice::getEnforceRequirement, bo.getEnforceRequirement()); - lqw.eq(bo.getPublishTime() != null, EfcodeCpNotice::getPublishTime, bo.getPublishTime()); lqw.eq(bo.getStatus() != null, EfcodeCpNotice::getStatus, bo.getStatus()); lqw.eq(bo.getIsDelete() != null, EfcodeCpNotice::getIsDelete, bo.getIsDelete()); return lqw; @@ -101,14 +206,10 @@ public class EfcodeCpNoticeServiceImpl implements IEfcodeCpNoticeService { /** * 新增行政执法检查计划-预告 - * - * @param bo 行政执法检查计划-预告 - * @return 是否新增成功 */ @Override public Boolean insertByBo(EfcodeCpNoticeBo bo) { EfcodeCpNotice add = MapstructUtils.convert(bo, EfcodeCpNotice.class); - validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { bo.setId(add.getId()); @@ -118,35 +219,20 @@ public class EfcodeCpNoticeServiceImpl implements IEfcodeCpNoticeService { /** * 修改行政执法检查计划-预告 - * - * @param bo 行政执法检查计划-预告 - * @return 是否修改成功 */ @Override public Boolean updateByBo(EfcodeCpNoticeBo bo) { EfcodeCpNotice update = MapstructUtils.convert(bo, EfcodeCpNotice.class); - validEntityBeforeSave(update); return baseMapper.updateById(update) > 0; } - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(EfcodeCpNotice entity){ - //TODO 做一些数据校验,如唯一约束 - } - /** * 校验并批量删除行政执法检查计划-预告信息 - * - * @param ids 待删除的主键集合 - * @param isValid 是否进行有效性校验 - * @return 是否删除成功 */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ - //TODO 做一些业务上的校验,判断是否需要校验 + if (isValid) { + // 校验只有草稿可删除 } return baseMapper.deleteByIds(ids) > 0; } 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 005a228d..d5c049b4 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 @@ -40,6 +40,10 @@ import com.zdxt.enforcementcode.domain.EfcodeCpSetting; import com.zdxt.enforcementcode.mapper.EfcodeCpReserveMapper; import com.zdxt.enforcementcode.mapper.EfcodeCpSettingMapper; import com.zdxt.enforcementcode.service.IEfcodeCpTaskService; +import com.zdxt.enforcementcode.service.IEnterpriseInformationService; +import com.zdxt.enforcementcode.service.ISsztJbxx110497NewService; +import com.zdxt.enforcementcode.domain.vo.EnterpriseInformationVo; +import com.zdxt.enforcementcode.domain.vo.SsztJbxx110497NewVo; /** * 行政执法检查计划-计划Service业务层处理 @@ -57,6 +61,8 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { private final EfcodeCpReserveMapper efcodeCpReserveMapper; private final EfcodeCpSettingMapper efcodeCpSettingMapper; private final IEfcodeCpTaskService cpTaskService; + private final IEnterpriseInformationService enterpriseInformationService; + private final ISsztJbxx110497NewService ssztJbxx110497NewService; /** * 查询行政执法检查计划-计划 @@ -314,6 +320,8 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { // 重复校验:同一人+同一日期+同一时段+同一企业 不可重复 checkDuplicate(bo); EfcodeCpPlan add = MapstructUtils.convert(bo, EfcodeCpPlan.class); + // 尝试根据企业信用代码填充联系人和电话 + fillContactInfo(add); validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; if (flag) { @@ -338,6 +346,8 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { // 重复校验:同一人+同一日期+同一时段+同一企业 不可重复 checkDuplicate(bo); EfcodeCpPlan update = MapstructUtils.convert(bo, EfcodeCpPlan.class); + // 尝试根据企业信用代码填充联系人和电话 + fillContactInfo(update); validEntityBeforeSave(update); boolean flag = baseMapper.updateById(update) > 0; if (flag) { @@ -469,6 +479,41 @@ public class EfcodeCpPlanServiceImpl implements IEfcodeCpPlanService { } } + /** + * 根据企业统一社会信用代码(enterpriseNumber)尝试填充联系人和电话 + *

优先查 enterprise_information 表,找不到则查 sszt_jbxx110497_new 表

+ */ + private void fillContactInfo(EfcodeCpPlan entity) { + String enterpriseNumber = entity.getEnterpriseNumber(); + if (StringUtils.isBlank(enterpriseNumber)) { + return; + } + try { + // 1. 先查 enterprise_information 表 + EnterpriseInformationVo entInfo = enterpriseInformationService.queryByEnterpriseNumber(enterpriseNumber); + if (entInfo != null) { + if (StringUtils.isNotBlank(entInfo.getLegalPerson())) { + entity.setContactPerson(entInfo.getLegalPerson()); + } + if (StringUtils.isNotBlank(entInfo.getEnterpriseTel())) { + entity.setContactPhone(entInfo.getEnterpriseTel()); + } + return; + } + // 2. enterprise_information 未找到,查 sszt_jbxx110497_new 表 + List ssztList = ssztJbxx110497NewService.queryByTyshxydm(enterpriseNumber); + if (ssztList != null && !ssztList.isEmpty()) { + SsztJbxx110497NewVo sszt = ssztList.get(0); + if (StringUtils.isNotBlank(sszt.getFddbr())) { + entity.setContactPerson(sszt.getFddbr()); + } + // sszt_jbxx110497_new 表无电话字段,contactPhone 留空 + } + } catch (Exception e) { + log.warn("[计划] 填充企业联系人信息失败, enterpriseNumber={}, error={}", enterpriseNumber, e.getMessage()); + } + } + /** * 保存前的数据校验 */ 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 824a8ecd..42cb25d5 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 @@ -53,6 +53,10 @@ const enterpriseSearchBaseUrl = "/enforcementcode/enterpriseSearch"; export const searchUnionByEnterpriseName = (enterpriseName, success, error) => _get(enterpriseSearchBaseUrl + "/searchUnionByEnterpriseName", { enterpriseName }, success, error); +// 根据企业信用代码查询联系人和联系电话 +export const getEnterpriseContactInfo = (enterpriseNumber, success, error) => + _get(enterpriseSearchBaseUrl + "/getContactInfo", { enterpriseNumber }, success, error); + // endregion // region 单位人员检索接口 diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/router/enforcement-app/enf-main-router.js b/zdxt-web-client/zdxt-efcode-enforcement-app/src/router/enforcement-app/enf-main-router.js index 7863c0ab..5844335d 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/router/enforcement-app/enf-main-router.js +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/router/enforcement-app/enf-main-router.js @@ -134,6 +134,33 @@ const routes = [ isKeepAlive: false, }, }, + // 执法端-预告列表 + { + path: "/enforcement/notice", + name: "cpNoticeList", + component: () => import("@/views/enforcement/my/notice/cp_notice_list.vue"), + meta: { + isKeepAlive: false, + }, + }, + // 执法端-预告编辑(新增/编辑) + { + path: "/enforcement/notice/edit", + name: "cpNoticeEdit", + component: () => import("@/views/enforcement/my/notice/cp_notice_edit.vue"), + meta: { + isKeepAlive: false, + }, + }, + // 执法端-预告留言 + { + path: "/enforcement/notice/message", + name: "cpNoticeMessage", + component: () => import("@/views/enforcement/my/notice/cp_notice_message.vue"), + meta: { + isKeepAlive: false, + }, + }, // 执法端-登记页面 { path: "/enforcement/enforcementRegister", diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/enforcementMy.vue b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/enforcementMy.vue index 92dc5992..9e8ec466 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/enforcementMy.vue +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/enforcementMy.vue @@ -119,11 +119,7 @@ const settingItem = { const onMenuClick = (item) => { switch (item.key) { case 'notice': - // 跳至消息中心待办 tab,并带类型过滤参数 - router.push({ - path: '/enforcement/message', - query: { tab: 'todo', type: item.key }, - }); + router.push({ path: '/enforcement/notice' }); break; case 'task': router.push({ path: '/enforcement/task' }); diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/notice/cp_notice_edit.vue b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/notice/cp_notice_edit.vue new file mode 100644 index 00000000..2e3df08e --- /dev/null +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/notice/cp_notice_edit.vue @@ -0,0 +1,888 @@ + + + + + diff --git a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/notice/cp_notice_list.vue b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/notice/cp_notice_list.vue index 562470d1..0bb58b7a 100644 --- a/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/notice/cp_notice_list.vue +++ b/zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/my/notice/cp_notice_list.vue @@ -1,11 +1,234 @@ - - @@ -315,7 +335,8 @@ const maxPersonNum = ref(3); // 企业搜索状态 const enterpriseOptions = ref([]); -const showEnterpriseSuggest = ref(false); +const showEnterprisePicker = ref(false); +const enterpriseSearchKeyword = ref(''); const enterpriseSearching = ref(false); let enterpriseSearchTimer = null; let enterpriseSearchSeq = 0; @@ -502,26 +523,27 @@ const onDateConfirm = ({ selectedValues }) => { showDatePicker.value = false; }; +// 打开企业检索弹层 +const onOpenEnterprisePicker = () => { + enterpriseSearchKeyword.value = ''; + enterpriseOptions.value = []; + showEnterprisePicker.value = true; +}; + // 企业名称输入(防抖检索) -const onEnterpriseNameInput = (val) => { - // 手动修改名称后,原先绑定的 enterpriseNumber/enterpriseId 失效,需重新选择 - form.value.enterpriseNumber = ''; - form.value.enterpriseId = ''; +const onEnterpriseSearchInput = (val) => { if (enterpriseSearchTimer) { clearTimeout(enterpriseSearchTimer); } const keyword = (val || '').trim(); if (keyword.length < 3) { - showEnterpriseSuggest.value = false; enterpriseOptions.value = []; return; } enterpriseSearchTimer = setTimeout(() => { const seq = ++enterpriseSearchSeq; - showEnterpriseSuggest.value = true; enterpriseSearching.value = true; searchUnionByEnterpriseName(keyword, (res) => { - // 仅处理最新一次请求的结果 if (seq !== enterpriseSearchSeq) return; enterpriseSearching.value = false; if (res && res.code === 200 && Array.isArray(res.data)) { @@ -541,9 +563,8 @@ const onEnterpriseNameInput = (val) => { const onSelectEnterprise = (item) => { form.value.enterpriseName = item.enterpriseName || ''; form.value.enterpriseNumber = item.enterpriseNumber || ''; - // 企业检索来源VO无独立id字段(市监同步表无id),用信用代码占位以满足后端@NotBlank校验 form.value.enterpriseId = item.enterpriseNumber || ''; - showEnterpriseSuggest.value = false; + showEnterprisePicker.value = false; enterpriseOptions.value = []; }; @@ -860,50 +881,69 @@ const doSubmit = () => { } } -.enterprise-suggest { - background: #fff; - margin: -4px 14px 8px; - border: 1px solid #e6edf5; - border-radius: 8px; - max-height: 220px; - overflow-y: auto; - box-shadow: 0 4px 10px rgba(44, 116, 190, 0.08); +.enterprise-picker { + display: flex; + flex-direction: column; + height: 100%; - .suggest-item { - padding: 10px 14px; - border-bottom: 1px solid #f0f2f5; - cursor: pointer; + .enterprise-picker-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 14px 16px 8px; - &:last-child { - border-bottom: none; + .enterprise-picker-title { + font-size: 16px; + font-weight: 600; + color: #333; + } + + :deep(.van-icon) { + font-size: 18px; + color: #999; + cursor: pointer; } + } + + .enterprise-picker-body { + flex: 1; + overflow-y: auto; + padding: 0 12px 12px; + } + + .enterprise-loading { + display: flex; + align-items: center; + justify-content: center; + padding: 30px 0; + color: #999; + font-size: 14px; + } + + .enterprise-item { + padding: 12px 14px; + background: #fff; + border: 1px solid #e6edf5; + border-radius: 10px; + margin-bottom: 8px; + cursor: pointer; &:active { background: #f5faff; } - .suggest-name { - font-size: 14px; + .enterprise-item-name { + font-size: 15px; color: #333; - line-height: 1.4; + font-weight: 500; } - .suggest-number { + .enterprise-item-number { font-size: 12px; color: #999; - margin-top: 2px; + margin-top: 4px; } } - - .suggest-empty { - padding: 14px; - text-align: center; - color: #999; - font-size: 13px; - display: flex; - align-items: center; - justify-content: center; - } } .submit-wrap {