diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/message/example/MessageSendExample.java b/src/main/java/com/budwk/app/zhgh/dayofficework/message/example/MessageSendExample.java new file mode 100644 index 00000000..c68db162 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/message/example/MessageSendExample.java @@ -0,0 +1,50 @@ +package com.budwk.app.zhgh.dayofficework.message.example; + +import com.budwk.app.zhgh.dayofficework.message.service.GlobalMessageSendService; +import lombok.extern.slf4j.Slf4j; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; + +import java.util.Arrays; +import java.util.List; + +/** + * 全局消息发送使用示例 + * 展示如何使用简化的API发送消息 + */ +@IocBean +@Slf4j +public class MessageSendExample { + + @Inject + private GlobalMessageSendService globalMessageSendService; + + /** + * 示例1:发送简单的系统通知(自动发送到所有启用的渠道) + */ + public void sendSimpleNotification() { + String title = "系统维护通知"; + String content = "系统将于今晚22:00-24:00进行维护,请提前保存工作内容。"; + List receiverIds = Arrays.asList("user1", "user2", "user3"); + + // 最简单的调用方式,自动发送到所有启用的渠道 + globalMessageSendService.sendMessage(title, content, receiverIds); + + log.info("简单系统通知发送完成"); + } + + /** + * 示例2:发送待办通知(自动发送到所有启用的渠道) + */ + public void sendTodoNotification() { + String title = "审批待办"; + String content = "您有一个新的审批任务需要处理,请及时登录系统查看。"; + List receiverIds = Arrays.asList("manager1", "manager2"); + + // 自动发送到所有启用的渠道 + globalMessageSendService.sendMessage(title, content, 2, receiverIds, null); + + log.info("待办通知发送完成"); + } + +} diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/contribution/h5Controller/H5ContributionListController.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/contribution/h5Controller/H5ContributionListController.java new file mode 100644 index 00000000..5b6f1613 --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/contribution/h5Controller/H5ContributionListController.java @@ -0,0 +1,115 @@ +package com.budwk.app.zhgh.staffbenefit.contribution.h5Controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.result.Result; +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.staffbenefit.contribution.model.ContributionApply; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Strings; +import org.nutz.lang.util.NutMap; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +import java.util.List; + +/** + * @ClassName H5ContributionListController + * @Author JyuHsin + * @Date 2025/9/18 11:12 + * @Version 1.0 + * @Description TODO + */ +@Slf4j +@IocBean +@Ok("json:full") +@Api(tags = "移动端-慈善捐助项目") +@At("/platform/contribution/list/h5") +public class H5ContributionListController { + + @Inject + private Dao dao; + @Inject + private BaseService baseService; + + @At("") + @SaCheckPermission("h5.contribution.list") + @Ok("beetl:/platform/zhghh5/staffbenefit/contribution/list/index.html") + public void index() { + } + + @At + @ApiOperation("分页查询") + @SaCheckPermission("h5.contribution.list") + public Result pageData(PageForm pageForm, + @Param(value = "year") Integer year, + @Param(value = "type") String type) { + Cnd cnd = Cnd.NEW(); + Sql sql = Sqls.create(""" + SELECT + con.*, + con.id as contributionId, + type.id as typeId, + type.typeName + FROM + `contribution_project` con + LEFT JOIN contribution_type type ON type.typeCode = con.contributionTypeCode + $condition + """); + cnd.andEX("con.contributionTypeCode", "=", type); + cnd.andEX("year(contributionCreationDate)", "=", year); + cnd.and("isContributionEnable", "=", true); + cnd.desc("contributionCreationDate"); + cnd.asc("contributionMode"); + sql.setCondition(cnd); + Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pagination); + } + @At + @ApiOperation("移动端-慈善捐助") + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("h5.contribution.list") + @SLog(tag = "慈善捐助-捐助", msg = "慈善捐助") + public Object submit(ContributionApply apply) { + if(StrUtil.isBlank(apply.getId())) { + apply.setContributionTime(DateUtil.now()); + } + dao.insertOrUpdate(apply); + return Result.success(); + } + + @At + @ApiOperation("查询单个慈善捐助专题") + @SaCheckPermission("contribution") + public Result fetchOne(String id) { + Sql sql = Sqls.create(""" + SELECT + con.*, + ( SELECT SUM( money ) FROM contribution_apply apply WHERE apply.contributionId = con.id ) totalMoney, + ( SELECT COUNT( 1 ) FROM contribution_apply apply WHERE apply.contributionId = con.id ) peopleCount + FROM + `contribution_project` con + WHERE con.id = @id + """); + sql.setParam("id", id); + sql.setCallback(Sqls.callback.map()); + dao.execute(sql); + NutMap nutMap = (NutMap) sql.getResult(); + return Result.success(nutMap); + } +} diff --git a/src/main/java/com/budwk/app/zhgh/staffbenefit/contribution/h5Controller/H5ContributionMineController.java b/src/main/java/com/budwk/app/zhgh/staffbenefit/contribution/h5Controller/H5ContributionMineController.java new file mode 100644 index 00000000..f9c8303b --- /dev/null +++ b/src/main/java/com/budwk/app/zhgh/staffbenefit/contribution/h5Controller/H5ContributionMineController.java @@ -0,0 +1,91 @@ +package com.budwk.app.zhgh.staffbenefit.contribution.h5Controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.budwk.app.base.annotation.SLog; +import com.budwk.app.base.page.Pagination; +import com.budwk.app.base.param.PageForm; +import com.budwk.app.base.result.Result; +import com.budwk.app.base.service.BaseService; +import com.budwk.app.zhgh.dayofficework.meeting.model.MeetingTimePeriod; +import com.budwk.app.zhgh.dayofficework.meeting.model.MeetingTimePeriodUser; +import com.budwk.app.zhgh.staffbenefit.contribution.model.ContributionApply; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.nutz.aop.interceptor.ioc.TransAop; +import org.nutz.dao.Cnd; +import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; +import org.nutz.ioc.aop.Aop; +import org.nutz.ioc.loader.annotation.Inject; +import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.mvc.annotation.At; +import org.nutz.mvc.annotation.Ok; +import org.nutz.mvc.annotation.Param; + +/** + * @ClassName H5ContributionMineController + * @Author JyuHsin + * @Date 2025/9/18 15:17 + * @Version 1.0 + * @Description TODO + */ +@Slf4j +@IocBean +@Ok("json:full") +@Api(tags = "移动端-我的慈善捐助") +@At("/platform/contribution/mine/h5") +public class H5ContributionMineController { + + @Inject + private Dao dao; + @Inject + private BaseService baseService; + + @At("") + @SaCheckPermission("h5.contribution.mine") + @Ok("beetl:/platform/zhghh5/staffbenefit/contribution/mine/index.html") + public void index() { + } + + @At + @ApiOperation("分页查询") + @SaCheckPermission("h5.contribution.mine") + public Result pageData(PageForm pageForm, + @Param(value = "year") Integer year, + @Param(value = "type") String type) { + Sql sql = Sqls.create(""" + SELECT + ca.*, + ca.id as applyId, + cp.contributionName AS projectName, + cp.contributionTypeCode, + cp.contributionStartTime, + cp.contributionEndTime, + ct.id as typeId + FROM + contribution_apply ca + LEFT JOIN contribution_project cp ON ca.contributionId = cp.id + LEFT JOIN contribution_type ct ON cp.contributionTypeCode = ct.typeCode + $condition + """); + Cnd cnd = Cnd.NEW(); + cnd.andEX("year(ca.contributionTime)", "=", year); + cnd.andEX("cp.contributionTypeCode", "=", type); + cnd.desc("ca.contributionTime"); + sql.setCondition(cnd); + Pagination pagination = baseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql); + return Result.success(pagination); + } + + @At + @ApiOperation("删除慈善捐助") + @Aop(TransAop.READ_COMMITTED) + @SaCheckPermission("h5.contribution.mine") + @SLog(tag = "慈善捐助-删除慈善捐助", msg = "删除慈善捐助") + public Object delete(String id) { + dao.delete(ContributionApply.class, id); + return Result.success(); + } +} diff --git a/src/main/resources/views/platform/zhghh5/staffbenefit/contribution/common/applyForm.js b/src/main/resources/views/platform/zhghh5/staffbenefit/contribution/common/applyForm.js new file mode 100644 index 00000000..42d11993 --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/staffbenefit/contribution/common/applyForm.js @@ -0,0 +1,115 @@ +const applyForm = { + template: /*language=HTML*/ ` +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ 提交 +
+
+
+
+ `, + store, + data() { + return { + visible:false, + row: {}, + formData: {}, + } + }, + methods: { + onOpen(row) { + this.row = row + if(row && row.applyId) { + this.formData = clone(row) + } else { + this.init() + } + this.visible = true + }, + init() { + this.$set(this.formData, 'contributionId', this.row.id) + this.$set(this.formData, 'contributionName', this.row.contributionName) + this.$set(this.formData, 'userId', this.$store.state.user.id) + this.$set(this.formData, 'sex', this.$store.state.user.sex) + this.$set(this.formData, 'userName', this.$store.state.user.username) + this.$set(this.formData, 'loginName', this.$store.state.user.loginname) + this.$set(this.formData, 'unitId', this.$store.state.user?.unit?.id) + this.$set(this.formData, 'unitName', this.$store.state.user?.unit?.name) + this.$set(this.formData, "unionId", this.$store.state.user?.union?.id) + this.$set(this.formData, "unionName", this.$store.state.user?.union?.name) + this.$set(this.formData, 'mobile', this.$store.state.user.mobile) + }, + onSubmit() { + this.$refs.formRef.validate().then(() => { + this.$dialog.confirm({ + title: "提示", + message: "您确定要提交吗?" + }).then(() => { + const formData = clone(this.formData) + formData.contributionFiles = JSON.stringify(formData.contributionFiles) + this.$axios.post("/platform/contribution/list/h5/submit", formData).then(res => { + if (res.code === 0) { + this.$toast(res.msg) + this.visible = false + this.$pjaxReplace("/platform/contribution/mine/h5") + } + }) + }) + }) + }, + }, + style: /*language=CSS*/ ` + /deep/ .van-radio__label { + display: flex; + align-items: center; + } + ` +} diff --git a/src/main/resources/views/platform/zhghh5/staffbenefit/contribution/common/projectInfo.js b/src/main/resources/views/platform/zhghh5/staffbenefit/contribution/common/projectInfo.js new file mode 100644 index 00000000..3977a002 --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/staffbenefit/contribution/common/projectInfo.js @@ -0,0 +1,58 @@ +const projectInfo = { + template: /*language=HTML*/ ` +
+ +
+ + +
+
已筹总额:{{ viewData.totalMoney || 0 }}元
+
捐助人次:{{ viewData.peopleCount || 0 }}人
+
+ +
{{viewData.contributionName}}
+
+
+
+
+ `, + data() { + return { + visible:false, + viewData: {}, + } + }, + methods: { + onOpen(row) { + this.$axios.post('/platform/contribution/list/h5/fetchOne', {id: row.contributionId}) + .then((res) => { + this.viewData = res.data + }) + this.visible = true + }, + }, + style: /*language=CSS*/ ` + /deep/ .info-middle { + background-color: #F5F7FA; + width: 80%; + margin: 0 auto; + padding: 20px; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + color: #666666; + font-size: 14px; + } + /deep/ .info-title { + font-weight: bold; + background-color: white; + padding: 13px; + box-shadow: 0 8px 12px #ebedf0; + text-align: center !important; + margin-top: 10px; + } + /deep/ .info-content { + padding: 10px; + background-color: white; + } + ` +} diff --git a/src/main/resources/views/platform/zhghh5/staffbenefit/contribution/common/typeInfo.js b/src/main/resources/views/platform/zhghh5/staffbenefit/contribution/common/typeInfo.js new file mode 100644 index 00000000..d2620ad2 --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/staffbenefit/contribution/common/typeInfo.js @@ -0,0 +1,59 @@ +const typeInfo = { + template: /*language=HTML*/ ` +
+ +
+ + +
+
子项目数:{{ viewData.projectCount || 0 }}个
+
已筹总额:{{ viewData.totalMoney || 0 }}元
+
捐助人次:{{ viewData.peopleCount || 0 }}人
+
+ +
{{viewData.typeName}}
+
{{viewData.contributionTypeIntroduce}}
+
+
+
+ `, + data() { + return { + visible:false, + viewData: {}, + } + }, + methods: { + onOpen(row) { + this.$axios.post('/platform/contribution/type/fetchOne', {id: row.typeId}) + .then((res) => { + this.viewData = res.data + }) + this.visible = true + }, + }, + style: /*language=CSS*/ ` + /deep/ .info-middle { + background-color: #F5F7FA; + width: 80%; + margin: 0 auto; + padding: 20px; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + color: #666666; + font-size: 14px; + } + /deep/ .info-title { + font-weight: bold; + background-color: white; + padding: 13px; + box-shadow: 0 8px 12px #ebedf0; + text-align: center !important; + margin-top: 10px; + } + /deep/ .info-content { + padding: 10px; + background-color: white; + } + ` +} diff --git a/src/main/resources/views/platform/zhghh5/staffbenefit/contribution/list/index.html b/src/main/resources/views/platform/zhghh5/staffbenefit/contribution/list/index.html new file mode 100644 index 00000000..01c300bc --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/staffbenefit/contribution/list/index.html @@ -0,0 +1,126 @@ + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/src/main/resources/views/platform/zhghh5/staffbenefit/contribution/mine/index.html b/src/main/resources/views/platform/zhghh5/staffbenefit/contribution/mine/index.html new file mode 100644 index 00000000..32c5303b --- /dev/null +++ b/src/main/resources/views/platform/zhghh5/staffbenefit/contribution/mine/index.html @@ -0,0 +1,143 @@ + + + + +
+ + + + + + + + + + + + + + + + + + +
+ + + +