From 1c16d6ba0f9aadbfe480269d3fc39d60e71bb52a Mon Sep 17 00:00:00 2001 From: chenqi Date: Tue, 30 Dec 2025 13:52:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(invoice):=20=E5=AE=8C=E5=96=84=E5=8F=91?= =?UTF-8?q?=E7=A5=A8=E7=AE=A1=E7=90=86=E6=9D=83=E9=99=90=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E5=92=8C=E6=A3=80=E9=AA=8C=E7=94=B3=E8=AF=B7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 超级管理员可以编辑操作员字段,普通用户不可编辑 - 修改权限判断逻辑,只有用户名等于 'admin' 的用户才是超级管理员 - 非超级管理员用户只能查询自己的发票数据 - 添加根据员工ID更新操作员名称功能 - 新增行时根据用户权限填充信息 - 严格检查权限,超级管理员可以删除所有记录,普通用户只能删除自己维护的记录 - 在 bargain 组件中验证患者选择 - 添加检验申请单相关API接口 - 在医生工作站中添加检验申请tab页 - 实现检验申请单的增删改查功能 - 添加公告通知已读记录相关功能 - 实现用户未读公告数量统计和标记已读功能 --- .../system/SysNoticeController.java | 128 ++++++++++++++++++ .../com/core/system/domain/SysNotice.java | 11 ++ .../com/core/system/domain/SysNoticeRead.java | 61 +++++++++ .../mapper/system/SysNoticeMapper.xml | 18 ++- .../CallNumberVoiceConfigAppServiceImpl.java | 8 ++ .../CallNumberVoiceConfigController.java | 10 ++ .../ActivityDefinitionManageMapper.xml | 46 ++++--- openhis-ui-vue3/src/api/system/notice.js | 68 +++++++++- .../src/layout/components/Navbar.vue | 78 +++++++++-- .../src/views/system/notice/index.vue | 56 +++++++- 10 files changed, 443 insertions(+), 41 deletions(-) create mode 100644 openhis-server-new/core-system/src/main/java/com/core/system/domain/SysNoticeRead.java diff --git a/openhis-server-new/core-admin/src/main/java/com/core/web/controller/system/SysNoticeController.java b/openhis-server-new/core-admin/src/main/java/com/core/web/controller/system/SysNoticeController.java index f4b4d9e5..6679de09 100644 --- a/openhis-server-new/core-admin/src/main/java/com/core/web/controller/system/SysNoticeController.java +++ b/openhis-server-new/core-admin/src/main/java/com/core/web/controller/system/SysNoticeController.java @@ -3,10 +3,13 @@ package com.core.web.controller.system; import com.core.common.annotation.Log; import com.core.common.core.controller.BaseController; import com.core.common.core.domain.AjaxResult; +import com.core.common.core.domain.model.LoginUser; import com.core.common.core.page.TableDataInfo; import com.core.common.enums.BusinessType; import com.core.system.domain.SysNotice; +import com.core.common.core.domain.entity.SysUser; import com.core.system.service.ISysNoticeService; +import com.core.system.service.ISysNoticeReadService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; @@ -25,6 +28,9 @@ public class SysNoticeController extends BaseController { @Autowired private ISysNoticeService noticeService; + @Autowired + private ISysNoticeReadService noticeReadService; + /** * 获取通知公告列表 */ @@ -36,6 +42,86 @@ public class SysNoticeController extends BaseController { return getDataTable(list); } + /** + * 获取当前用户的公告列表(公开接口) + * 公告类型:通常 noticeType = '1' 代表通知,noticeType = '2' 代表公告 + */ + @GetMapping("/public/list") + public TableDataInfo getPublicList(SysNotice notice) { + // 只查询状态为正常(0)且已发布(1)的公告 + notice.setStatus("0"); + notice.setPublishStatus("1"); + // 公告类型设置为 '2'(公告) + notice.setNoticeType("2"); + // 设置分页参数 + startPage(); + List list = noticeService.selectNoticeList(notice); + return getDataTable(list); + } + + /** + * 获取当前用户的通知列表(公开接口) + * 通知类型:通常 noticeType = '1' 代表通知 + */ + @GetMapping("/public/notice") + public AjaxResult getUserNotices() { + // 获取当前用户信息 + LoginUser loginUser = getLoginUser(); + SysUser currentUser = loginUser.getUser(); + + // 只查询状态为正常(0)且已发布(1)的通知 + SysNotice notice = new SysNotice(); + notice.setStatus("0"); + notice.setPublishStatus("1"); + // 通知类型设置为 '1'(通知) + notice.setNoticeType("1"); + + List list = noticeService.selectNoticeList(notice); + return success(list); + } + + /** + * 获取用户未读公告/通知数量(公开接口) + */ + @GetMapping("/public/unread/count") + public AjaxResult getUnreadCount() { + LoginUser loginUser = getLoginUser(); + SysUser currentUser = loginUser.getUser(); + int count = noticeReadService.getUnreadCount(currentUser.getUserId()); + return success(count); + } + + /** + * 标记公告/通知为已读(公开接口) + */ + @PostMapping("/public/read/{noticeId}") + public AjaxResult markAsRead(@PathVariable Long noticeId) { + LoginUser loginUser = getLoginUser(); + SysUser currentUser = loginUser.getUser(); + return noticeReadService.markAsRead(noticeId, currentUser.getUserId()); + } + + /** + * 批量标记公告/通知为已读(公开接口) + */ + @PostMapping("/public/read/all") + public AjaxResult markAllAsRead(@RequestBody Long[] noticeIds) { + LoginUser loginUser = getLoginUser(); + SysUser currentUser = loginUser.getUser(); + return noticeReadService.markAllAsRead(noticeIds, currentUser.getUserId()); + } + + /** + * 获取用户已读公告/通知ID列表(公开接口) + */ + @GetMapping("/public/read/ids") + public AjaxResult getReadNoticeIds() { + LoginUser loginUser = getLoginUser(); + SysUser currentUser = loginUser.getUser(); + List readIds = noticeReadService.selectReadNoticeIdsByUserId(currentUser.getUserId()); + return success(readIds); + } + /** * 根据通知公告编号获取详细信息 */ @@ -53,6 +139,10 @@ public class SysNoticeController extends BaseController { @PostMapping public AjaxResult add(@Validated @RequestBody SysNotice notice) { notice.setCreateBy(getUsername()); + // 新建的公告默认为未发布状态 + if (notice.getPublishStatus() == null || notice.getPublishStatus().isEmpty()) { + notice.setPublishStatus("0"); + } return toAjax(noticeService.insertNotice(notice)); } @@ -76,4 +166,42 @@ public class SysNoticeController extends BaseController { public AjaxResult remove(@PathVariable Long[] noticeIds) { return toAjax(noticeService.deleteNoticeByIds(noticeIds)); } + + /** + * 发布公告/通知 + */ + @PreAuthorize("@ss.hasPermi('system:notice:edit')") + @Log(title = "发布公告", businessType = BusinessType.UPDATE) + @PutMapping("/publish/{noticeId}") + public AjaxResult publish(@PathVariable Long noticeId) { + SysNotice notice = noticeService.selectNoticeById(noticeId); + if (notice == null) { + return error("公告不存在"); + } + if ("1".equals(notice.getPublishStatus())) { + return error("该公告已发布"); + } + notice.setPublishStatus("1"); + notice.setUpdateBy(getUsername()); + return toAjax(noticeService.updateNotice(notice)); + } + + /** + * 取消发布公告/通知 + */ + @PreAuthorize("@ss.hasPermi('system:notice:edit')") + @Log(title = "取消发布", businessType = BusinessType.UPDATE) + @PutMapping("/unpublish/{noticeId}") + public AjaxResult unpublish(@PathVariable Long noticeId) { + SysNotice notice = noticeService.selectNoticeById(noticeId); + if (notice == null) { + return error("公告不存在"); + } + if ("0".equals(notice.getPublishStatus())) { + return error("该公告未发布"); + } + notice.setPublishStatus("0"); + notice.setUpdateBy(getUsername()); + return toAjax(noticeService.updateNotice(notice)); + } } diff --git a/openhis-server-new/core-system/src/main/java/com/core/system/domain/SysNotice.java b/openhis-server-new/core-system/src/main/java/com/core/system/domain/SysNotice.java index d8461496..a0dcdbff 100644 --- a/openhis-server-new/core-system/src/main/java/com/core/system/domain/SysNotice.java +++ b/openhis-server-new/core-system/src/main/java/com/core/system/domain/SysNotice.java @@ -32,6 +32,9 @@ public class SysNotice extends BaseEntity { /** 公告状态(0正常 1关闭) */ private String status; + /** 发布状态(0未发布 1已发布) */ + private String publishStatus; + public Long getNoticeId() { return noticeId; } @@ -75,6 +78,14 @@ public class SysNotice extends BaseEntity { this.status = status; } + public String getPublishStatus() { + return publishStatus; + } + + public void setPublishStatus(String publishStatus) { + this.publishStatus = publishStatus; + } + @Override public String toString() { return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("noticeId", getNoticeId()) diff --git a/openhis-server-new/core-system/src/main/java/com/core/system/domain/SysNoticeRead.java b/openhis-server-new/core-system/src/main/java/com/core/system/domain/SysNoticeRead.java new file mode 100644 index 00000000..01b265dc --- /dev/null +++ b/openhis-server-new/core-system/src/main/java/com/core/system/domain/SysNoticeRead.java @@ -0,0 +1,61 @@ +package com.core.system.domain; + +import com.core.common.core.domain.BaseEntity; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; + +/** + * 公告/通知已读记录 sys_notice_read + * + * @author system + */ +public class SysNoticeRead extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** 阅读ID */ + @JsonSerialize(using = ToStringSerializer.class) + private Long readId; + + /** 公告/通知ID */ + @JsonSerialize(using = ToStringSerializer.class) + private Long noticeId; + + /** 用户ID */ + @JsonSerialize(using = ToStringSerializer.class) + private Long userId; + + /** 阅读时间 */ + private String readTime; + + public Long getReadId() { + return readId; + } + + public void setReadId(Long readId) { + this.readId = readId; + } + + public Long getNoticeId() { + return noticeId; + } + + public void setNoticeId(Long noticeId) { + this.noticeId = noticeId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getReadTime() { + return readTime; + } + + public void setReadTime(String readTime) { + this.readTime = readTime; + } +} diff --git a/openhis-server-new/core-system/src/main/resources/mapper/system/SysNoticeMapper.xml b/openhis-server-new/core-system/src/main/resources/mapper/system/SysNoticeMapper.xml index e18284ef..59c39912 100644 --- a/openhis-server-new/core-system/src/main/resources/mapper/system/SysNoticeMapper.xml +++ b/openhis-server-new/core-system/src/main/resources/mapper/system/SysNoticeMapper.xml @@ -10,6 +10,7 @@ + @@ -21,8 +22,9 @@ select notice_id, notice_title, notice_type, - cast(notice_content as char) as notice_content, + convert_from(notice_content, 'UTF8') as notice_content, status, + publish_status, create_by, create_time, update_by, @@ -48,11 +50,19 @@ AND create_by like concat('%', #{createBy}, '%') + + AND status = #{status} + + + AND publish_status = #{publishStatus} + + order by create_time desc insert into sys_notice ( + notice_id, notice_title, notice_type, notice_content, @@ -61,9 +71,10 @@ create_by, create_time )values( + (SELECT COALESCE(MAX(notice_id), 0) + 1 FROM sys_notice), #{noticeTitle}, #{noticeType}, - #{noticeContent}, + cast(#{noticeContent} as bytea), #{status}, #{remark}, #{createBy}, @@ -76,8 +87,9 @@ notice_title = #{noticeTitle}, notice_type = #{noticeType}, - notice_content = #{noticeContent}, + notice_content = cast(#{noticeContent} as bytea), status = #{status}, + publish_status = #{publishStatus}, update_by = #{updateBy}, update_time = now() diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/triageandqueuemanage/appservice/impl/CallNumberVoiceConfigAppServiceImpl.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/triageandqueuemanage/appservice/impl/CallNumberVoiceConfigAppServiceImpl.java index a3cca1e7..c9add533 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/triageandqueuemanage/appservice/impl/CallNumberVoiceConfigAppServiceImpl.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/triageandqueuemanage/appservice/impl/CallNumberVoiceConfigAppServiceImpl.java @@ -8,6 +8,7 @@ import com.openhis.web.triageandqueuemanage.appservice.CallNumberVoiceConfigAppS import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.List; @Service public class CallNumberVoiceConfigAppServiceImpl implements CallNumberVoiceConfigAppService { @@ -15,6 +16,12 @@ public class CallNumberVoiceConfigAppServiceImpl implements CallNumberVoiceConfi @Resource private CallNumberVoiceConfigService callNumberVoiceConfigService; + @Override + public R getCallNumberVoiceConfig() { + List list = callNumberVoiceConfigService.list(); + return R.ok(list); + } + @Override public R addCallNumberVoiceConfig(CallNumberVoiceConfig callNumberVoiceConfig) { if(ObjectUtil.isNull(callNumberVoiceConfig)){ @@ -32,4 +39,5 @@ public class CallNumberVoiceConfigAppServiceImpl implements CallNumberVoiceConfi boolean updateById = callNumberVoiceConfigService.updateById(callNumberVoiceConfig); return R.ok(updateById); } + } diff --git a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/triageandqueuemanage/controller/CallNumberVoiceConfigController.java b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/triageandqueuemanage/controller/CallNumberVoiceConfigController.java index 5f5efa39..c107a1ba 100644 --- a/openhis-server-new/openhis-application/src/main/java/com/openhis/web/triageandqueuemanage/controller/CallNumberVoiceConfigController.java +++ b/openhis-server-new/openhis-application/src/main/java/com/openhis/web/triageandqueuemanage/controller/CallNumberVoiceConfigController.java @@ -16,6 +16,16 @@ public class CallNumberVoiceConfigController { @Resource private CallNumberVoiceConfigAppService callNumberVoiceConfigAppService; + /** + * 查询叫号语音设置 + * + * @return 结果 + */ + @GetMapping("/get") + public R getCallNumberVoiceConfig(){ + return R.ok(callNumberVoiceConfigAppService.getCallNumberVoiceConfig()); + } + /** * 新增叫号语音设置实体 * diff --git a/openhis-server-new/openhis-application/src/main/resources/mapper/datadictionary/ActivityDefinitionManageMapper.xml b/openhis-server-new/openhis-application/src/main/resources/mapper/datadictionary/ActivityDefinitionManageMapper.xml index 4c4a31e8..54cb6e85 100644 --- a/openhis-server-new/openhis-application/src/main/resources/mapper/datadictionary/ActivityDefinitionManageMapper.xml +++ b/openhis-server-new/openhis-application/src/main/resources/mapper/datadictionary/ActivityDefinitionManageMapper.xml @@ -29,9 +29,9 @@ T3.price_code, T3.retail_price, T3.maximum_retail_price, - T3.chrgitm_lv,--医保等级 - T3.children_json,--子项json - T3.pricing_flag--划价标记 + T3.chrgitm_lv, + T3.children_json, + T3.pricing_flag FROM ( SELECT @@ -54,18 +54,18 @@ T1.description_text, T1.rule_id, T1.tenant_id, - T1.chrgitm_lv,--医保等级 + T1.chrgitm_lv, T2.type_code as item_type_code, T2.yb_type, T2.price_code, - T2.price as retail_price,--零售价 - T4.amount as maximum_retail_price,--最高零售价 - T1.children_json,--子项json - T1.pricing_flag--划价标记 + T2.price as retail_price, + T4.amount as maximum_retail_price, + T1.children_json, + T1.pricing_flag FROM wor_activity_definition T1 LEFT JOIN adm_charge_item_definition T2 ON T1.id = T2.instance_id LEFT JOIN adm_charge_item_definition T5 ON T5.instance_id = T1.id AND T5.instance_table = 'wor_activity_definition' - LEFT JOIN adm_charge_item_def_detail T4 ON T4.definition_id = T5.id AND T4.condition_code = '4'--4:限制 + LEFT JOIN adm_charge_item_def_detail T4 ON T4.definition_id = T5.id AND T4.condition_code = '4' T1.delete_flag = '0' AND T2.instance_table = 'wor_activity_definition' @@ -81,6 +81,7 @@ ORDER BY T1.bus_no DESC + ) T3 @@ -108,22 +109,23 @@ T2.type_code as item_type_code, T2.yb_type, T2.price_code, - T2.price as retail_price,--零售价, - ( SELECT T4.amount - FROM adm_charge_item_definition T5 - LEFT JOIN adm_charge_item_def_detail T4 ON T4.definition_id = T5.id - WHERE T4.condition_code = '4'--4:限制 - AND T5.instance_id = T1.id - AND T5.instance_table = 'wor_activity_definition' - ) as maximum_retail_price,--最高零售价 - T1.chrgitm_lv,--医保等级 - T1.children_json,--子项json - T1.pricing_flag--划价标记 + T2.price as retail_price, + ( + SELECT T4.amount + FROM adm_charge_item_definition T5 + LEFT JOIN adm_charge_item_def_detail T4 ON T4.definition_id = T5.id + WHERE T4.condition_code = '4' + AND T5.instance_id = T1.id + AND T5.instance_table = 'wor_activity_definition' + ) as maximum_retail_price, + T1.chrgitm_lv, + T1.children_json, + T1.pricing_flag FROM wor_activity_definition T1 LEFT JOIN adm_charge_item_definition T2 ON T1.id = T2.instance_id T1.delete_flag = '0' - AND T2.instance_table = 'wor_activity_definition' + AND T2.instance_table = 'wor_activity_definition' AND T1.id = #{id} @@ -134,4 +136,4 @@ - \ No newline at end of file + diff --git a/openhis-ui-vue3/src/api/system/notice.js b/openhis-ui-vue3/src/api/system/notice.js index c274ea5b..4c2273a4 100644 --- a/openhis-ui-vue3/src/api/system/notice.js +++ b/openhis-ui-vue3/src/api/system/notice.js @@ -9,6 +9,23 @@ export function listNotice(query) { }) } +// 获取公开的公告列表(给普通用户使用) +export function getPublicNoticeList(query) { + return request({ + url: '/system/notice/public/list', + method: 'get', + params: query + }) +} + +// 获取当前用户的通知列表 +export function getUserNotices() { + return request({ + url: '/system/notice/public/notice', + method: 'get' + }) +} + // 查询公告详细 export function getNotice(noticeId) { return request({ @@ -41,4 +58,53 @@ export function delNotice(noticeId) { url: '/system/notice/' + noticeId, method: 'delete' }) -} \ No newline at end of file +} + +// 发布公告 +export function publishNotice(noticeId) { + return request({ + url: '/system/notice/publish/' + noticeId, + method: 'put' + }) +} + +// 取消发布公告 +export function unpublishNotice(noticeId) { + return request({ + url: '/system/notice/unpublish/' + noticeId, + method: 'put' + }) +} + +// 获取未读公告/通知数量 +export function getUnreadCount() { + return request({ + url: '/system/notice/public/unread/count', + method: 'get' + }) +} + +// 标记公告/通知为已读 +export function markAsRead(noticeId) { + return request({ + url: '/system/notice/public/read/' + noticeId, + method: 'post' + }) +} + +// 批量标记公告/通知为已读 +export function markAllAsRead(noticeIds) { + return request({ + url: '/system/notice/public/read/all', + method: 'post', + data: noticeIds + }) +} + +// 获取用户已读公告/通知ID列表 +export function getReadNoticeIds() { + return request({ + url: '/system/notice/public/read/ids', + method: 'get' + }) +} diff --git a/openhis-ui-vue3/src/layout/components/Navbar.vue b/openhis-ui-vue3/src/layout/components/Navbar.vue index fb8dbaa1..7a7149ed 100644 --- a/openhis-ui-vue3/src/layout/components/Navbar.vue +++ b/openhis-ui-vue3/src/layout/components/Navbar.vue @@ -4,6 +4,14 @@ + + +
+ + + +
+
+ + +