This commit is contained in:
zhouhefeng
2026-05-28 18:31:36 +08:00
parent daac940f3f
commit 7ee1c4fbb5
112 changed files with 9837 additions and 273 deletions
@@ -5,9 +5,12 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.ObjectUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.sys.models.Sys_home_template;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissue;
import com.budwk.app.zhgh.activity.culture.models.ActivityTissuePerson;
import com.budwk.app.zhgh.activity.culture.service.ActivityCultureService;
@@ -86,11 +89,56 @@ public class ActivityCultureInfoManageController {
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("activity.culture.infoManage.school")
public Result setTemplate(@Valid String id) {
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
return Result.error("无权操作");
}
ActivityTissue tissue = activityCultureService.fetch(id);
if (tissue == null) {
return Result.error("活动不存在");
}
if (tissue.getActivity_type() == null || tissue.getActivity_type() != 40001) {
return Result.error("仅校工会文化活动可设为模板");
}
Sys_home_template oldHomeTemplate = activityCultureService.dao().fetch(Sys_home_template.class, id);
Sys_home_template sysHomeTemplate = tissue.covertToSysHomeTemplate();
if (oldHomeTemplate != null) {
sysHomeTemplate.setTop(oldHomeTemplate.getTop());
sysHomeTemplate.setPush(oldHomeTemplate.getPush());
sysHomeTemplate.setSortNo(oldHomeTemplate.getSortNo());
if (oldHomeTemplate.getTemplateName() != null) {
sysHomeTemplate.setTemplateName(oldHomeTemplate.getTemplateName());
}
if (oldHomeTemplate.getTemplateIcon() != null) {
sysHomeTemplate.setTemplateIcon(oldHomeTemplate.getTemplateIcon());
}
}
activityCultureService.dao().insertOrUpdate(sysHomeTemplate);
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("activity.culture.infoManage.school")
public Result cancelTemplate(@Valid String id) {
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
return Result.error("无权操作");
}
activityCultureService.dao().delete(Sys_home_template.class, id);
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "文化活动", msg = "删除了一条活动")
@SaCheckPermission(value = {"activity.culture.infoManage.school", "activity.culture.infoManage.union", "activity.culture.infoManage.club"}, mode = SaMode.OR)
public Result doDelete(@Valid String id) {
if (activityCultureService.dao().fetch(Sys_home_template.class, id) != null) {
return Result.error("该活动已设为模板,请先取消模板后再删除");
}
activityCultureService.delete(id);
activityCultureService.dao().clear(ActivityTissuePerson.class, Cnd.where(ActivityTissuePerson::getTissueId, "=", id));
activityCultureService.dao().delete(Sys_home_activity.class, id);
@@ -5,6 +5,7 @@ import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
import com.budwk.app.base.model.CustomFormField;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.sys.models.Sys_home_template;
import com.budwk.app.sys.services.SysHomeConvert;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -291,4 +292,29 @@ public class ActivityTissue extends BaseModel implements Serializable, SysHomeCo
sysHomeActivity.setClassPath(this.getClass().getPackageName() + this.getClass().getName());
return sysHomeActivity;
}
public Sys_home_template covertToSysHomeTemplate() {
Sys_home_template sysHomeTemplate = new Sys_home_template();
sysHomeTemplate.setId(this.getId());
sysHomeTemplate.setName(this.getName());
sysHomeTemplate.setTemplateName(this.getName());
sysHomeTemplate.setCover(this.getCover());
sysHomeTemplate.setContent(this.getActivityContent());
if (this.getActivity_type() == 40001) {
sysHomeTemplate.setUrl("/platform/activity/culture/applyActivity/school?mode=edit&id=" + this.getId());
} else if (this.getActivity_type() == 40002) {
sysHomeTemplate.setUrl("/platform/activity/culture/applyActivity/union?mode=edit&id=" + this.getId());
} else {
sysHomeTemplate.setUrl("/platform/activity/culture/applyActivity/club?mode=edit&id=" + this.getId());
}
sysHomeTemplate.setH5Url("");
if (Lang.isNotEmpty(this.getApplyStartTime())) {
sysHomeTemplate.setStartDate(DateUtil.parseDate(this.getApplyStartTime()));
sysHomeTemplate.setEndDate(DateUtil.parseDate(this.getApplyEndTime()));
}
sysHomeTemplate.setAllowUserGroupId(this.getGroupId());
sysHomeTemplate.setEnable(this.getIsUnseal());
sysHomeTemplate.setClassPath(this.getClass().getPackageName() + this.getClass().getName());
return sysHomeTemplate;
}
}
@@ -109,7 +109,8 @@ public class ActivityCultureServiceImpl extends BaseServiceImpl<ActivityTissue>
t.taskParentId,
t.variable taskVariable,
IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke,
(select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask') AS startTaskId
(select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask') AS startTaskId,
IF(sht.id IS NULL, 0, 1) AS isTemplate
FROM
activity_tissue tissue
LEFT JOIN sys_union uni ON uni.id = tissue.unionId
@@ -118,6 +119,7 @@ public class ActivityCultureServiceImpl extends BaseServiceImpl<ActivityTissue>
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = tissue.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN sys_home_template sht ON sht.id = tissue.id
$condition
""");
@@ -1,6 +1,7 @@
package com.budwk.app.zhgh.activity.sports.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
@@ -9,6 +10,7 @@ import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
import com.budwk.app.zhgh.activity.basic.models.ActivityEvent;
import com.budwk.app.zhgh.activity.sports.models.ActivitySchool;
import com.budwk.app.zhgh.activity.sports.models.ActivitySchoolEvent;
@@ -51,6 +53,9 @@ public class ActivitySportsInfoManageController {
@Inject
private Dao dao;
@Inject
private ActivityBasicScopeService activityBasicScopeService;
@At
@SaCheckPermission("activity.sports.info")
public Object pageData(PageForm page,
@@ -128,7 +133,7 @@ public class ActivitySportsInfoManageController {
@At
@SaCheckPermission("activity.sports.info")
@SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR)
public Object getEventApply(@Param(value = "activityId") String activityId,
@Param(value = "eventId") String[] eventId) {
Cnd cnd = Cnd.NEW();
@@ -149,7 +154,7 @@ public class ActivitySportsInfoManageController {
@At
@SLog(tag = "体育活动", msg = "修改活动")
@SaCheckPermission("activity.sports.info")
@SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR)
public Result doEdit(@Param(value = "data") ActivitySchool activitySchool,
@Param(value = "events") ActivitySchoolEvent[] events) {
activitySportsService.doEdit(activitySchool, events);
@@ -160,7 +165,7 @@ public class ActivitySportsInfoManageController {
@At
@SLog(tag = "体育活动", msg = "添加活动")
@SaCheckPermission("activity.sports.info")
@SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR)
public Result doAdd(@Param(value = "data") ActivitySchool activitySchool,
@Param(value = "events") ActivitySchoolEvent[] events) {
String id = activitySportsService.doAdd(activitySchool, events);
@@ -170,7 +175,7 @@ public class ActivitySportsInfoManageController {
}
@At
@SaCheckPermission("activity.sports.info")
@SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR)
public Result findOne(String id) {
NutMap nutMap = (NutMap) dao.execute(Sqls.create("SELECT * FROM `activity_school` WHERE id = @id").setParam("id", id)
.setCallback(Sqls.callback.map())).getResult();
@@ -199,7 +204,7 @@ public class ActivitySportsInfoManageController {
@At
@ApiOperation("根据比赛项目基础表统一赋年龄限制")
@SaCheckPermission("activity.sports.info")
@SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR)
public Object doAssignmentDate(ActivitySchoolEvent[] events) {
for (ActivitySchoolEvent event : events) {
ActivityEvent activityEvent = dao.fetch(ActivityEvent.class,event.getEventId());
@@ -212,6 +217,28 @@ public class ActivitySportsInfoManageController {
return Result.success(events);
}
@At
@ApiOperation("获取分工会人数限制")
@SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR)
public Result getUnionLimit(@Param(value = "activityScopeId") String activityScopeId) {
Sql sql = Sqls.create("""
SELECT
gh.id,
gh.name,
gh.unioncode,
(select count(1) from `vw_user` where unionid = gh.id $cnd) as teacherCount,
NULL as ratio,
NULL as limitCount
FROM
sys_union gh
order by gh.unioncode
""");
if (StrUtil.isNotBlank(activityScopeId)) {
sql.setVar("cnd", "AND id in (" + activityBasicScopeService.buildGroupUserIdSubSqlText(Integer.valueOf(activityScopeId)) + ")");
}
return Result.success(activitySportsService.listMap(sql));
}
@At
@Ok("void")
@@ -0,0 +1,21 @@
package com.budwk.app.zhgh.activity.sports.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import io.swagger.annotations.Api;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@IocBean
@At("/platform/activity/sports/new")
@Ok("json:full")
@Api(tags = "新建体育活动")
public class ActivitySportsNewController {
@At("")
@Ok("beetl:platform/zhgh/activity/sports/new/index.html")
@SaCheckPermission(value = {"activity.sports.info", "activity.sports.new"}, mode = SaMode.OR)
public void index() {
}
}
@@ -0,0 +1,20 @@
package com.budwk.app.zhgh.activity.trainSignUp.controller.manage;
import cn.dev33.satoken.annotation.SaCheckPermission;
import io.swagger.annotations.Api;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@IocBean
@At("/platform/trainSignUp/applyActivity")
@Ok("json:full")
@Api(tags = "品牌活动新建活动")
public class TrainSignUpApplyActivityController {
@At("")
@Ok("beetl:/platform/zhgh/activity/trainSignUp/applyActivity/index.html")
@SaCheckPermission("trainSignUp.applyActivity")
public void index() {
}
}
@@ -1,16 +1,21 @@
package com.budwk.app.zhgh.activity.trainSignUp.controller.manage;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
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.flow.entity.ProcessInstance;
import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.sys.models.Sys_home_template;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.sys.models.Sys_unit;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.zhgh.activity.basic.service.ActivityBasicScopeService;
import com.budwk.app.zhgh.activity.trainSignUp.models.*;
import com.budwk.app.zhgh.activity.trainSignUp.service.TrainSignUpActivityService;
@@ -72,7 +77,54 @@ public class TrainSignUpManageController {
cnd.andEX("year", "=", year);
cnd.and(Cnd.likeEX("activityName", activityName));
cnd.orderBy("createdAt", "desc");
return Result.success().addData(trainSignUpActivityManageService.pageData(pageForm, cnd));
Pagination<TrainSignUpActivity> pagination = trainSignUpActivityManageService.pageData(pageForm, cnd);
List<TrainSignUpActivity> list = pagination.getList(TrainSignUpActivity.class);
if (list != null && !list.isEmpty()) {
List<String> ids = list.stream().map(TrainSignUpActivity::getId).toList();
List<Sys_home_template> templateList = dao.query(Sys_home_template.class, Cnd.where("id", "in", ids));
List<String> templateIds = templateList.stream().map(Sys_home_template::getId).toList();
list.forEach(activity -> activity.setIsTemplate(templateIds.contains(activity.getId())));
}
return Result.success().addData(pagination);
}
@At
@ApiOperation("设为模板")
@SaCheckPermission("trainSignUp.manage")
public Result setTemplate(String id) {
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
return Result.error("无权操作");
}
TrainSignUpActivity activity = trainSignUpActivityManageService.fetch(id);
if (activity == null) {
return Result.error("活动不存在");
}
Sys_home_template oldHomeTemplate = dao.fetch(Sys_home_template.class, id);
Sys_home_template sysHomeTemplate = activity.covertToSysHomeTemplate();
if (oldHomeTemplate != null) {
sysHomeTemplate.setTop(oldHomeTemplate.getTop());
sysHomeTemplate.setPush(oldHomeTemplate.getPush());
sysHomeTemplate.setSortNo(oldHomeTemplate.getSortNo());
if (oldHomeTemplate.getTemplateName() != null) {
sysHomeTemplate.setTemplateName(oldHomeTemplate.getTemplateName());
}
if (oldHomeTemplate.getTemplateIcon() != null) {
sysHomeTemplate.setTemplateIcon(oldHomeTemplate.getTemplateIcon());
}
}
dao.insertOrUpdate(sysHomeTemplate);
return Result.success();
}
@At
@ApiOperation("取消模板")
@SaCheckPermission("trainSignUp.manage")
public Result cancelTemplate(String id) {
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
return Result.error("无权操作");
}
dao.delete(Sys_home_template.class, id);
return Result.success();
}
@At
@@ -80,6 +132,9 @@ public class TrainSignUpManageController {
@SaCheckPermission("trainSignUp.manage")
@SLog(tag = "品牌活动-活动管理", msg = "删除活动")
public Result onDelete(String id) {
if (dao.fetch(Sys_home_template.class, id) != null) {
return Result.error("该活动已设为模板,请先取消模板后再删除");
}
Trans.exec(() -> {
trainSignUpActivityManageService.delete(id);
dao.clear(TrainSignUpCourse.class, Cnd.where("activityId", "=", id));
@@ -106,7 +161,7 @@ public class TrainSignUpManageController {
@At
@ApiOperation("查询单个活动")
@SaCheckPermission("trainSignUp")
@SaCheckPermission(value = {"trainSignUp", "trainSignUp.manage", "trainSignUp.applyActivity", "h5.trainSignUp.apply"}, mode = SaMode.OR)
public Result findOne(@Param("id") @NotNull String id) {
NutMap dataMap = trainSignUpActivityManageService.findOne(id, null, "");
String activityStartTime = dataMap.getString("activityStartTime");
@@ -154,7 +209,7 @@ public class TrainSignUpManageController {
@At
@Ok("json:full")
@ApiOperation("品牌活动新增/修改")
@SaCheckPermission("trainSignUp.manage")
@SaCheckPermission(value = {"trainSignUp.manage", "trainSignUp.applyActivity"}, mode = SaMode.OR)
@SLog(tag = "品牌活动-活动管理", msg = "新增/修改活动")
public Result doHandle(TrainSignUpActivity activity) {
if (StrUtil.isBlank(activity.getId())) {
@@ -168,7 +223,7 @@ public class TrainSignUpManageController {
@At
@Ok("json:full")
@ApiOperation("获取分工会人数限制")
@SaCheckPermission("trainSignUp.manage")
@SaCheckPermission(value = {"trainSignUp.manage", "trainSignUp.applyActivity"}, mode = SaMode.OR)
public Result getUnionLimit(@Param(value = "activityScopeId") String activityScopeId) {
Sql sql = Sqls.create("""
SELECT
@@ -192,7 +247,7 @@ public class TrainSignUpManageController {
@At
@Ok("json:full")
@ApiOperation("获取报名人员数量")
@SaCheckPermission("trainSignUp.manage")
@SaCheckPermission(value = {"trainSignUp.manage", "trainSignUp.applyActivity"}, mode = SaMode.OR)
public Result getRegisterUserCount(@Param(value = "courseId") String courseId) {
return Result.success().addData(dao.count(TrainSignUpUser.class, Cnd.where("courseId", "=", courseId)));
}
@@ -200,7 +255,7 @@ public class TrainSignUpManageController {
@At
@Ok("json:full")
@ApiOperation("获取历史活动列表")
@SaCheckPermission("trainSignUp.manage")
@SaCheckPermission(value = {"trainSignUp.manage", "trainSignUp.applyActivity"}, mode = SaMode.OR)
public Result getHistoricalActList() {
List<TrainSignUpActivity> query = dao.query(TrainSignUpActivity.class, Cnd.NEW().desc("activityStartTime"));
return Result.success().addData(query);
@@ -209,7 +264,7 @@ public class TrainSignUpManageController {
@At
@Ok("json:full")
@ApiOperation("查询分工会和社团")
@SaCheckPermission("trainSignUp.manage")
@SaCheckPermission(value = {"trainSignUp.manage", "trainSignUp.applyActivity"}, mode = SaMode.OR)
public Result selectUnitAndClub() {
List<NutMap> result = new ArrayList<>();
List<Sys_unit> unitList = dao.query(Sys_unit.class, Cnd.NEW().asc(Sys_unit::getUnitcode));
@@ -2,6 +2,7 @@ package com.budwk.app.zhgh.activity.trainSignUp.models;
import com.budwk.app.base.model.BaseModel;
import com.budwk.app.sys.models.Sys_home_activity;
import com.budwk.app.sys.models.Sys_home_template;
import com.budwk.app.sys.services.SysHomeConvert;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -109,6 +110,8 @@ public class TrainSignUpActivity extends BaseModel implements Serializable, SysH
@Many(field = "activityId")
private List<TrainSignUpTypeLimit> typeLimits;
private Boolean isTemplate;
@Column
@Comment("活动类型")
@ColDefine(type = ColType.VARCHAR, width = 20)
@@ -141,4 +144,23 @@ public class TrainSignUpActivity extends BaseModel implements Serializable, SysH
sysHomeActivity.setClassPath(this.getClass().getPackageName() + this.getClass().getName());
return sysHomeActivity;
}
public Sys_home_template covertToSysHomeTemplate() {
Sys_home_template sysHomeTemplate = new Sys_home_template();
sysHomeTemplate.setId(this.getId());
sysHomeTemplate.setName(this.getActivityName());
sysHomeTemplate.setTemplateName(this.getActivityName());
sysHomeTemplate.setCover(this.getCover());
sysHomeTemplate.setContent(this.getIntroduce());
sysHomeTemplate.setUrl("/platform/trainSignUp/applyActivity?mode=edit&id=" + this.getId());
sysHomeTemplate.setH5Url("");
if (Lang.isNotEmpty(this.getActivitySignUpStartTime())) {
sysHomeTemplate.setStartDate(this.getActivitySignUpStartTime());
sysHomeTemplate.setEndDate(this.getActivitySignUpEndTime());
}
sysHomeTemplate.setAllowUserGroupId(this.getActivityGroupId());
sysHomeTemplate.setEnable(!this.isDisabled());
sysHomeTemplate.setClassPath(this.getClass().getPackageName() + this.getClass().getName());
return sysHomeTemplate;
}
}
@@ -105,12 +105,12 @@ public class AssetManageController {
@SLog(type = "assetManage", tag = "资产管理", msg = "编辑了一条资产信息")
@SaCheckPermission("asset.manage")
public Result doEdit(Asset asset) {
Asset fetch = assetService.fetch(asset.getId());
assetService.update(asset);
//增加折旧表记录
Asset fetch = assetService.fetch(asset.getId());
//如果资产类型不等于原来的或者预计报废时间不等于原来的
if (!fetch.getAssetCategoryId().equals(asset.getAssetCategoryId()) || !fetch.getAssetRetiredAssetsDate().equals(asset.getAssetRetiredAssetsDate())) {
if (!ObjectUtil.equal(fetch.getAssetCategoryId(), asset.getAssetCategoryId()) || !ObjectUtil.equal(fetch.getAssetRetiredAssetsDate(), asset.getAssetRetiredAssetsDate())) {
assetDepreciationRecordService.clear(Cnd.where("assetId", "=", asset.getId()));
AssetDepreciationRecord record = assetDepreciationRecordService.initAssetDepreciationRecord(asset.getAssetUnitPrice(), asset.getAssetQuantity(), asset.getAssetUsedDate(), asset.getAssetRetiredAssetsDate());
if (ObjectUtil.isNotEmpty(record)) {
@@ -70,7 +70,7 @@ public class Asset extends BaseModel implements Serializable {
@Column
@Comment("单价")
@ColDefine(customType = "decimal(10,2)")
@ColDefine(customType = "decimal(18,2)")
private BigDecimal assetUnitPrice;
@Column
@@ -43,22 +43,22 @@ public class AssetDepreciationRecord extends BaseModel implements Serializable {
@Column
@Comment("资产全部的价值")
@ColDefine(customType = "decimal(10,2)")
@ColDefine(customType = "decimal(18,2)")
private BigDecimal assetAllMoney;
@Column
@Comment("剩余价值")
@ColDefine(customType = "decimal(10,2)")
@ColDefine(customType = "decimal(18,2)")
private BigDecimal assetSurplusMoney;
@Column
@Comment("累计折旧多少钱")
@ColDefine(customType = "decimal(10,2)")
@ColDefine(customType = "decimal(18,2)")
private BigDecimal assetDepreciationMoney;
@Column
@Comment("平均一个月多少钱")
@ColDefine(customType = "decimal(10,2)")
@ColDefine(customType = "decimal(18,2)")
private BigDecimal assetAverageMonthMoney;
@Column
@@ -53,6 +53,16 @@ public class AssetDepreciationRecordServiceImpl extends BaseServiceImpl<AssetDep
//计算资产使用时间到现在使用了几个月
long usedMonth = ChronoUnit.MONTHS.between(assetUsedDateLocalDate, LocalDate.now());
AssetDepreciationRecord record = new AssetDepreciationRecord();
BigDecimal assetAllMoney = assetUnitPrice.multiply(new BigDecimal(assetQuantity));
if (wholeMonth <= 0) {
record.setAssetRetiredAssetsDate(assetRetiredAssetsDate);
record.setAssetRemainingMonths(0);
record.setAssetAllMoney(assetAllMoney);
record.setAssetAverageMonthMoney(assetAllMoney);
record.setAssetSurplusMoney(BigDecimal.ZERO);
record.setAssetDepreciationMoney(assetAllMoney);
return record;
}
//如果折旧到期时间小于现在时间直接设为0
if (assetRetiredAssetsDateLocalDate.isBefore(LocalDate.now())) {
//预计折旧到期时间
@@ -60,12 +70,12 @@ public class AssetDepreciationRecordServiceImpl extends BaseServiceImpl<AssetDep
//资产剩余的月
record.setAssetRemainingMonths(0);
//资产全部的金额
record.setAssetAllMoney(assetUnitPrice.multiply(new BigDecimal(assetQuantity)));
record.setAssetAllMoney(assetAllMoney);
//资产平均每月价值
record.setAssetAverageMonthMoney(record.getAssetAllMoney().divide(new BigDecimal(wholeMonth), 2, RoundingMode.DOWN));
//剩余价值
record.setAssetSurplusMoney(BigDecimal.ZERO);
record.setAssetDepreciationMoney(assetUnitPrice.multiply(new BigDecimal(assetQuantity)));
record.setAssetDepreciationMoney(assetAllMoney);
return record;
} else if (wholeMonth - usedMonth >= 0) {
//预计折旧到期时间
@@ -73,13 +83,13 @@ public class AssetDepreciationRecordServiceImpl extends BaseServiceImpl<AssetDep
//资产剩余的月
record.setAssetRemainingMonths((int) (wholeMonth - usedMonth < 0 ? 0 : wholeMonth - usedMonth));
//资产全部的金额
record.setAssetAllMoney(assetUnitPrice.multiply(new BigDecimal(assetQuantity)));
record.setAssetAllMoney(assetAllMoney);
//资产平均每月价值
record.setAssetAverageMonthMoney(record.getAssetAllMoney().divide(new BigDecimal(wholeMonth), 2, RoundingMode.DOWN));
//剩余价值
if (usedMonth == 0) {
//如果等于0代表一个月都没用到直接设为全部的金额
record.setAssetSurplusMoney(assetUnitPrice.multiply(new BigDecimal(assetQuantity)));
record.setAssetSurplusMoney(assetAllMoney);
} else {
record.setAssetSurplusMoney(record.getAssetAverageMonthMoney().multiply(BigDecimal.valueOf(record.getAssetRemainingMonths())));
}
@@ -1,18 +1,17 @@
package com.budwk.app.zhgh.dayofficework.buildHome.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.exception.BaseException;
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.base.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.SysOfficeTemplateUtil;
import com.budwk.app.sys.models.Sys_union;
import com.budwk.app.sys.views.View_user;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.buildHome.models.BuildHomeLittleHouse;
@@ -22,10 +21,12 @@ import com.deepoove.poi.config.Configure;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
@@ -34,7 +35,6 @@ import org.nutz.mvc.annotation.Ok;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
@@ -67,9 +67,14 @@ public class BuildHomeLittleHouseController {
public Result pageData(BuildHomeLittleHousePageForm pageForm) {
Sql sql = Sqls.create("select * from build_home_little_house $condition");
Cnd cnd = Cnd.NEW();
cnd.and("unionId", "=", SecurityUtil.getUnionId());
if (!isSysAdmin()) {
cnd.and("unionId", "=", SecurityUtil.getUnionId());
}
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
cnd.where().andLike("unitName", pageForm.getSearchKeyword());
SqlExpressionGroup searchGroup = new SqlExpressionGroup();
searchGroup.orLike("unitName", pageForm.getSearchKeyword());
searchGroup.orLike("unionName", pageForm.getSearchKeyword());
cnd.where().and(searchGroup);
}
cnd.asc("sortNum");
sql.setCondition(cnd);
@@ -77,12 +82,19 @@ public class BuildHomeLittleHouseController {
return Result.success(pagination);
}
@At
@SaCheckPermission("buildHome.littleHouse")
public Result currentUserOrg() {
return Result.success(getCurrentUserOrg());
}
@At
@SaCheckPermission("buildHome.littleHouse")
public Result save(BuildHomeLittleHouse house) {
if (house.getId() == null) {
house.setUnionId(SecurityUtil.getUnionId());
house.setUnionName(SecurityUtil.getUnionId());
fillCurrentUserOrg(house);
} else {
keepOriginalOrg(house);
}
dao.insertOrUpdate(house);
return Result.success();
@@ -102,22 +114,64 @@ public class BuildHomeLittleHouseController {
return Result.success(house);
}
@At
@SaCheckPermission("buildHome.littleHouse")
public Result saveCoordinate(Long id, Double mapX, Double mapY) {
if (!isSysAdmin()) {
return Result.error("仅系统管理员可以采集坐标");
}
if (id == null) {
return Result.error("小家记录ID不能为空");
}
if (!isValidCoordinate(mapX) || !isValidCoordinate(mapY)) {
return Result.error("坐标范围必须在0到100之间");
}
BuildHomeLittleHouse house = dao.fetch(BuildHomeLittleHouse.class, id);
if (house == null) {
return Result.error("未找到小家记录");
}
dao.update(BuildHomeLittleHouse.class, Chain.make("mapX", mapX).add("mapY", mapY), Cnd.where("id", "=", id));
return Result.success();
}
@At
@SaCheckPermission("buildHome.littleHouse")
public Result clearCoordinate(Long id) {
if (!isSysAdmin()) {
return Result.error("仅系统管理员可以清空坐标");
}
if (id == null) {
return Result.error("小家记录ID不能为空");
}
BuildHomeLittleHouse house = dao.fetch(BuildHomeLittleHouse.class, id);
if (house == null) {
return Result.error("未找到小家记录");
}
dao.update(BuildHomeLittleHouse.class, Chain.make("mapX", null).add("mapY", null), Cnd.where("id", "=", id));
return Result.success();
}
@At("/exportXlsx")
@SaCheckPermission("buildHome.littleHouse")
@Ok("void")
public void exportXlsx(HttpServletResponse response) {
try {
boolean sysAdmin = isSysAdmin();
String unionId = SecurityUtil.getUnionId();
Cnd cnd = Cnd.where("unionId", "=", unionId);
Cnd cnd = Cnd.NEW();
if (!sysAdmin) {
cnd.and("unionId", "=", unionId);
}
cnd.asc("sortNum");
Sys_union union = dao.fetch(Sys_union.class, unionId);
if (union == null) {
if (!sysAdmin && union == null) {
throw new BaseException("未找到ID为 " + unionId + " 的工会信息");
}
// 准备文档数据Map
Map<String, Object> docMap = new HashMap<>();
docMap.put("unionName", union.getName()); // 工会名称
docMap.put("unionName", sysAdmin ? "全部工会" : union.getName()); // 工会名称
docMap.put("date", DateUtil.today()); // 当前日期
// 查询小家建设数据并设置序号
@@ -151,4 +205,50 @@ public class BuildHomeLittleHouseController {
}
}
private void fillCurrentUserOrg(BuildHomeLittleHouse house) {
Map<String, String> currentUserOrg = getCurrentUserOrg();
house.setUnionId(currentUserOrg.get("unionId"));
house.setUnionName(currentUserOrg.get("unionName"));
house.setUnitId(currentUserOrg.get("unitId"));
house.setUnitName(currentUserOrg.get("unitName"));
}
private void keepOriginalOrg(BuildHomeLittleHouse house) {
BuildHomeLittleHouse oldHouse = dao.fetch(BuildHomeLittleHouse.class, house.getId());
if (oldHouse == null) {
fillCurrentUserOrg(house);
return;
}
house.setUnionId(oldHouse.getUnionId());
house.setUnionName(oldHouse.getUnionName());
house.setUnitId(oldHouse.getUnitId());
house.setUnitName(oldHouse.getUnitName());
}
private Map<String, String> getCurrentUserOrg() {
Map<String, String> currentUserOrg = new HashMap<>();
View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
String unionId = user != null && StrUtil.isNotBlank(user.getUnionId()) ? user.getUnionId() : SecurityUtil.getUnionId();
String unionName = user != null ? user.getUnionName() : null;
if (StrUtil.isBlank(unionName) && StrUtil.isNotBlank(unionId)) {
Sys_union union = dao.fetch(Sys_union.class, unionId);
unionName = union != null ? union.getName() : unionId;
}
currentUserOrg.put("unionId", unionId);
currentUserOrg.put("unionName", unionName);
currentUserOrg.put("unitId", user != null ? user.getUnitId() : SecurityUtil.getUnitId());
currentUserOrg.put("unitName", user != null ? user.getUnitName() : null);
return currentUserOrg;
}
private boolean isSysAdmin() {
return AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name());
}
private boolean isValidCoordinate(Double value) {
return value != null && value >= 0 && value <= 100;
}
}
@@ -1,10 +1,13 @@
package com.budwk.app.zhgh.dayofficework.buildHome.models;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = true)
@Table("build_home_little_house")
@@ -22,6 +25,11 @@ public class BuildHomeLittleHouse extends BaseModel {
@ColDefine(type = ColType.VARCHAR, width = 100)
private String unitName;
@Column
@Comment("单位ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String unitId;
@Column
@Comment("分工会ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@@ -52,6 +60,21 @@ public class BuildHomeLittleHouse extends BaseModel {
@ColDefine(type = ColType.VARCHAR, width = 100)
private String openTime;
@Column
@Comment("图片视频资料")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> mediaFiles;
@Column
@Comment("地图X坐标百分比")
@ColDefine(type = ColType.FLOAT, width = 8, precision = 4)
private Double mapX;
@Column
@Comment("地图Y坐标百分比")
@ColDefine(type = ColType.FLOAT, width = 8, precision = 4)
private Double mapY;
@Column
@Comment("排序")
@ColDefine(type = ColType.INT)
@@ -0,0 +1,570 @@
package com.budwk.app.zhgh.dayofficework.caredata;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.result.Result;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import io.swagger.annotations.Api;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.json.Json;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
@IocBean
@At("/platform/careData/leader")
@Api("Leader dashboard")
@Ok("json:full")
public class CareDataLeaderCon {
private static final int FINISHED_STATE = 20;
@Inject
private Dao dao;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/careData/leader/indexOverlay.html")
@SaCheckPermission("careData.union")
public void index() {
}
@At("proposal")
@Ok("beetl:/platform/zhgh/dayofficework/careData/leader/proposalOverlay.html")
@SaCheckPermission("careData.union")
public void proposal() {
}
@At("condolence")
@Ok("beetl:/platform/zhgh/dayofficework/careData/leader/condolenceOverlay.html")
@SaCheckPermission("careData.union")
public void condolence() {
}
@At("baseUnion")
@Ok("beetl:/platform/zhgh/dayofficework/careData/leader/baseUnionOverlay.html")
@SaCheckPermission("careData.union")
public void baseUnion() {
}
@At("club")
@Ok("beetl:/platform/zhgh/dayofficework/careData/leader/clubOverlay.html")
@SaCheckPermission("careData.union")
public void club() {
}
@At("dataMetric")
@Ok("beetl:/platform/zhgh/dayofficework/careData/leader/dataMetricOverlay.html")
@SaCheckPermission("careData.union")
public void dataMetric() {
}
@At("assetData")
@Ok("beetl:/platform/zhgh/dayofficework/careData/leader/assetDataOverlay.html")
@SaCheckPermission("careData.union")
public void assetData() {
}
@At("staffHome")
@Ok("beetl:/platform/zhgh/dayofficework/careData/leader/staffHomeOverlay.html")
@SaCheckPermission("careData.union")
public void staffHome() {
}
@At
@SaCheckPermission("careData.union")
public Result proposalData(String sessionId) {
String currentSessionId = StrUtil.blankToDefault(sessionId, latestSessionId());
if (StrUtil.isBlank(currentSessionId)) {
return Result.success(NutMap.NEW());
}
NutMap session = sessionInfo(currentSessionId);
List<NutMap> caseResults = caseResultData(currentSessionId);
NutMap overview = overviewData(currentSessionId, caseResults);
return Result.success(NutMap.NEW()
.addv("session", session)
.addv("overview", overview)
.addv("caseResults", caseResults));
}
@At
@SaCheckPermission("careData.union")
public Result condolenceData(Integer year) {
int targetYear = year == null ? LocalDate.now().getYear() : year;
List<NutMap> rows = condolenceTypeRows(targetYear);
long total = rows.stream().mapToLong(row -> row.getLong("count", 0L)).sum();
List<NutMap> sortedRows = new ArrayList<>(rows);
sortedRows.sort((left, right) -> Long.compare(right.getLong("count", 0L), left.getLong("count", 0L)));
List<NutMap> topRows = new ArrayList<>();
int index = 1;
for (NutMap row : sortedRows) {
if (index > 5) {
break;
}
long count = row.getLong("count", 0L);
topRows.add(NutMap.NEW()
.addv("index", index++)
.addv("typeId", row.getString("id", ""))
.addv("typeCode", row.getString("code", ""))
.addv("name", row.getString("name", ""))
.addv("count", count)
.addv("rate", percent(count, total))
.addv("rateValue", percentValue(count, total)));
}
return Result.success(NutMap.NEW()
.addv("year", targetYear)
.addv("total", total)
.addv("types", topRows));
}
@At
@SaCheckPermission("careData.union")
public Result baseUnionData() {
return Result.success(NutMap.NEW().addv("unions", baseUnionRows()));
}
@At
@SaCheckPermission("careData.union")
public Result clubData() {
return Result.success(NutMap.NEW().addv("clubs", clubRows()));
}
@At
@SaCheckPermission("careData.union")
public Result dataMetricData(Integer year) {
int targetYear = year == null ? LocalDate.now().getYear() : year;
return Result.success(NutMap.NEW()
.addv("year", targetYear)
.addv("budgetTotal", schoolBudgetTotal(targetYear))
.addv("tourCount", tourCount(targetYear))
.addv("honorCount", honorCount(targetYear))
.addv("difficultCount", difficultCount(targetYear))
.addv("reimburseTotal", reimburseTotal(targetYear)));
}
@At
@SaCheckPermission("careData.union")
public Result assetDataData() {
List<NutMap> states = assetUsageStateRows();
long total = states.stream().mapToLong(row -> row.getLong("value", 0L)).sum();
return Result.success(NutMap.NEW()
.addv("total", total)
.addv("states", states));
}
@At
@SaCheckPermission("careData.union")
public Result staffHomeData() {
return Result.success(NutMap.NEW().addv("houses", littleHouseRows()));
}
private List<NutMap> littleHouseRows() {
Sql sql = Sqls.create("""
SELECT
id,
unionName,
unitName,
address,
mediaFiles,
mapX,
mapY,
sortNum
FROM build_home_little_house
WHERE mapX IS NOT NULL
AND mapY IS NOT NULL
$unionFilter
ORDER BY sortNum ASC, id ASC
""");
if (canViewAllUnionData()) {
sql.setVar("unionFilter", "");
} else {
sql.setVar("unionFilter", "AND unionId = @unionId");
sql.setParam("unionId", SecurityUtil.getUnionId());
}
return listMap(sql);
}
private String latestSessionId() {
Sql sql = Sqls.create("""
SELECT id
FROM teacher_congress_session
ORDER BY startDate DESC
LIMIT 1
""");
return firstMap(sql).getString("id", "");
}
private List<NutMap> condolenceTypeRows(int year) {
Sql sql = Sqls.create("""
SELECT
t.id,
t.code,
t.name,
COUNT(info.id) AS count
FROM condolence_type t
LEFT JOIN condolence info ON info.type = t.id
AND YEAR(info.createTime) = @year
$unionFilter
WHERE t.enable = 1
GROUP BY t.id, t.code, t.name, t.sortNum
ORDER BY count DESC, t.sortNum ASC, t.code ASC
""");
sql.setParam("year", year);
if (canViewAllUnionData()) {
sql.setVar("unionFilter", "");
} else {
sql.setVar("unionFilter", "AND info.applyUnionId = @unionId");
sql.setParam("unionId", SecurityUtil.getUnionId());
}
return listMap(sql);
}
private List<NutMap> baseUnionRows() {
Sql sql = Sqls.create("""
SELECT
un.id,
un.name AS unionname,
un.unionCode,
(
SELECT COUNT(1)
FROM vw_user u
WHERE u.member = 1
AND u.unionId = un.id
) AS value
FROM sys_union un
WHERE un.delFlag = 0
$unionFilter
ORDER BY un.unionCode
""");
if (canViewAllUnionData()) {
sql.setVar("unionFilter", "");
} else {
sql.setVar("unionFilter", "AND un.id = @unionId");
sql.setParam("unionId", SecurityUtil.getUnionId());
}
return listMap(sql);
}
private List<NutMap> clubRows() {
Sql sql = Sqls.create("""
SELECT
c.id,
c.clubName,
c.clubCode,
(
SELECT COUNT(1)
FROM club_user cu
WHERE cu.clubId = c.id
AND cu.delFlag = 0
) AS value
FROM sys_club c
WHERE c.delFlag = 0
AND c.dismiss = 0
ORDER BY c.clubCode
""");
return listMap(sql);
}
private List<NutMap> assetUsageStateRows() {
Sql sql = Sqls.create("""
SELECT
IFNULL(NULLIF(TRIM(t1.assetUsageStateName), ''), @emptyName) AS name,
SUM(IFNULL(t1.assetQuantity, 0)) AS value
FROM `asset` t1
WHERE 1 = 1
$unionFilter
GROUP BY IFNULL(NULLIF(TRIM(t1.assetUsageStateName), ''), @emptyName)
ORDER BY value DESC, name ASC
""");
sql.setParam("emptyName", "\u672a\u586b\u5199");
if (canViewAllUnionData()) {
sql.setVar("unionFilter", "");
} else {
sql.setVar("unionFilter", "AND t1.assetUseUnionId = @unionId");
sql.setParam("unionId", SecurityUtil.getUnionId());
}
return listMap(sql);
}
private BigDecimal schoolBudgetTotal(int year) {
Sql sql = Sqls.create("""
SELECT IFNULL(SUM(totalQuota), 0) AS total
FROM outlay_manage_school
WHERE delFlag = 0
AND `year` = @year
""");
sql.setParam("year", year);
return firstMap(sql).getAs("total", BigDecimal.class);
}
private long tourCount(int year) {
Sql sql = Sqls.create("""
SELECT COUNT(DISTINCT t.id) AS count
FROM tour_ledger t
LEFT JOIN wf_process_instance ins ON ins.businessNo = t.id
WHERE t.delFlag = 0
AND t.`year` = @year
AND (ins.id IS NULL OR ins.state = @finished)
$unionFilter
""");
sql.setParam("year", year);
sql.setParam("finished", FINISHED_STATE);
if (canViewAllUnionData()) {
sql.setVar("unionFilter", "");
} else {
sql.setVar("unionFilter", "AND t.unionId = @unionId");
sql.setParam("unionId", SecurityUtil.getUnionId());
}
return firstMap(sql).getLong("count", 0L);
}
private long honorCount(int year) {
Sql sql = Sqls.create("""
SELECT COUNT(h.id) AS count
FROM honor h
WHERE h.delFlag = 0
AND YEAR(h.grantDate) = @year
$unionFilter
""");
sql.setParam("year", year);
if (canViewAllUnionData()) {
sql.setVar("unionFilter", "");
} else {
sql.setVar("unionFilter", "AND h.unionId = @unionId");
sql.setParam("unionId", SecurityUtil.getUnionId());
}
return firstMap(sql).getLong("count", 0L);
}
private long difficultCount(int year) {
Sql sql = Sqls.create("""
SELECT COUNT(DISTINCT info.id) AS count
FROM difficult_help_info info
INNER JOIN wf_process_instance ins ON ins.businessNo = info.id
WHERE info.delFlag = 0
AND ins.state = @finished
AND YEAR(info.applyTime) = @year
$unionFilter
""");
sql.setParam("year", year);
sql.setParam("finished", FINISHED_STATE);
if (canViewAllUnionData()) {
sql.setVar("unionFilter", "");
} else {
sql.setVar("unionFilter", "AND info.unionId = @unionId");
sql.setParam("unionId", SecurityUtil.getUnionId());
}
return firstMap(sql).getLong("count", 0L);
}
private BigDecimal reimburseTotal(int year) {
Sql sql = Sqls.create("""
SELECT
IFNULL(SUM(
CASE
WHEN info.realMoney IS NOT NULL THEN info.realMoney
WHEN info.money IS NOT NULL THEN info.money
WHEN info.condolenceMoney IS NOT NULL THEN info.condolenceMoney
ELSE 0
END
), 0) AS total
FROM union_reimburse info
WHERE info.delFlag = 0
AND info.stateId IN (2, 3)
AND YEAR(info.createTime) = @year
$unionFilter
""");
sql.setParam("year", year);
if (canViewAllUnionData()) {
sql.setVar("unionFilter", "");
} else {
sql.setVar("unionFilter", "AND info.unionId = @unionId");
sql.setParam("unionId", SecurityUtil.getUnionId());
}
return firstMap(sql).getAs("total", BigDecimal.class);
}
private boolean canViewAllUnionData() {
return AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name());
}
private NutMap sessionInfo(String sessionId) {
Sql sql = Sqls.create("""
SELECT id, fullName
FROM teacher_congress_session
WHERE id = @sessionId
""");
sql.setParam("sessionId", sessionId);
return firstMap(sql);
}
private NutMap overviewData(String sessionId, List<NutMap> caseResults) {
Sql sql = Sqls.create("""
SELECT
COUNT(info.id) AS total,
SUM(CASE WHEN ins.state = @finished THEN 1 ELSE 0 END) AS doneCount
FROM proposal_info info
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
WHERE info.sessionId = @sessionId
""");
sql.setParam("sessionId", sessionId);
sql.setParam("finished", FINISHED_STATE);
NutMap overview = firstMap(sql);
long filedCount = 0L;
long rejectedCount = 0L;
long suggestionCount = 0L;
for (NutMap item : caseResults) {
String name = item.getString("name", "");
long count = item.getLong("count", 0L);
if (containsAny(name, "\u4e0d\u4e88", "\u4e0d\u7acb\u6848")) {
rejectedCount += count;
} else if (containsAny(name, "\u610f\u89c1", "\u5efa\u8bae")) {
suggestionCount += count;
} else if (name.contains("\u7acb\u6848")) {
filedCount += count;
}
}
long total = overview.getLong("total", 0L);
long doneCount = overview.getLong("doneCount", 0L);
long satisfiedCount = satisfiedCount(sessionId);
return NutMap.NEW()
.addv("total", total)
.addv("filedCount", filedCount)
.addv("suggestionCount", suggestionCount)
.addv("rejectedCount", rejectedCount)
.addv("doneCount", doneCount)
.addv("satisfiedRate", percent(satisfiedCount, doneCount));
}
private List<NutMap> caseResultData(String sessionId) {
Sql sql = Sqls.create("""
SELECT
d.code,
d.name,
COUNT(info.id) AS count
FROM sys_dict parent
INNER JOIN sys_dict d ON d.parentId = parent.id AND d.disabled = 0
LEFT JOIN proposal_info info ON info.caseFilingResult = d.code AND info.sessionId = @sessionId
WHERE parent.code = 'PROPOSAL_CASE_FILING_RESULT'
GROUP BY d.id, d.code, d.name, d.location
ORDER BY d.location
""");
sql.setParam("sessionId", sessionId);
return listMap(sql);
}
private long satisfiedCount(String sessionId) {
List<NutMap> dicts = feedbackDicts();
List<NutMap> rows = feedbackRows(sessionId);
return dicts.stream()
.filter(dict -> {
String name = dict.getString("name", "");
return name.contains("\u6ee1\u610f") && !name.contains("\u4e0d\u6ee1\u610f");
})
.mapToLong(dict -> rows.stream()
.filter(row -> dict.getString("code", "").equals(row.getString("feedbackCode", "")))
.count())
.sum();
}
private List<NutMap> feedbackDicts() {
Sql sql = Sqls.create("""
SELECT d.code, d.name
FROM sys_dict parent
INNER JOIN sys_dict d ON d.parentId = parent.id AND d.disabled = 0
WHERE parent.code = 'PROPOSAL_FEEDBACK'
ORDER BY d.location
""");
return listMap(sql);
}
private List<NutMap> feedbackRows(String sessionId) {
Sql sql = Sqls.create("""
SELECT
t.variable
FROM proposal_info info
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id
AND t.taskState = 20
AND t.taskName = 'feedback'
WHERE ins.state = @finished
AND info.sessionId = @sessionId
GROUP BY info.id, t.variable
""");
sql.setParam("sessionId", sessionId);
sql.setParam("finished", FINISHED_STATE);
List<NutMap> rawRows = listMap(sql);
List<NutMap> rows = new ArrayList<>();
for (NutMap row : rawRows) {
String variableStr = row.getString("variable", "");
if (StrUtil.isBlank(variableStr)) {
continue;
}
NutMap variable = Json.fromJson(NutMap.class, variableStr);
rows.add(NutMap.NEW().addv("feedbackCode", variable.getString("tf_feedback", "")));
}
return rows;
}
private List<NutMap> listMap(Sql sql) {
sql.setCallback(Sqls.callback.maps());
dao.execute(sql);
return sql.getList(NutMap.class);
}
private NutMap firstMap(Sql sql) {
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
NutMap map = sql.getObject(NutMap.class);
return map == null ? NutMap.NEW() : map;
}
private boolean containsAny(String text, String... keywords) {
if (StrUtil.isBlank(text)) {
return false;
}
for (String keyword : keywords) {
if (text.contains(keyword)) {
return true;
}
}
return false;
}
private String percent(long count, long total) {
if (total <= 0) {
return "0%";
}
BigDecimal value = BigDecimal.valueOf(count)
.multiply(BigDecimal.valueOf(100))
.divide(BigDecimal.valueOf(total), 1, RoundingMode.HALF_UP);
return value.stripTrailingZeros().toPlainString() + "%";
}
private BigDecimal percentValue(long count, long total) {
if (total <= 0) {
return BigDecimal.ZERO;
}
return BigDecimal.valueOf(count)
.multiply(BigDecimal.valueOf(100))
.divide(BigDecimal.valueOf(total), 1, RoundingMode.HALF_UP)
.stripTrailingZeros();
}
}
@@ -55,6 +55,43 @@ public class HonorManageController {
}
@At("/h5")
@SaCheckLogin
@Ok("beetl:/platform/zhghh5/dayofficework/honor/manage/index.html")
public void h5() {
}
@At
@SaCheckLogin
public Result h5Data(HonorPageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
h.id,
h.userName,
h.applyUnionName,
h.unionName,
h.grantDate,
h.photoFiles,
prize.`name` AS prizeName,
type.`name` AS typeName,
type.queryTypeCode AS typeQueryTypeCode
FROM
`honor` h
LEFT JOIN honor_basic_settings prize ON prize.id = h.prize
LEFT JOIN honor_basic_settings type ON type.id = h.honorType
$condition
""");
Cnd cnd = Cnd.NEW();
Integer year = pageForm.getYear() == null ? Calendar.getInstance().get(Calendar.YEAR) : pageForm.getYear();
cnd.andEX("YEAR(h.grantDate)", "=", year);
cnd.andEX("h.honorType", "=", pageForm.getHonorType());
cnd.desc("h.grantDate");
sql.setCondition(cnd);
Pagination pagination = honorViService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@SaCheckPermission("honor.manage")
public Result pageData(HonorPageForm pageForm) {
@@ -222,5 +222,10 @@ public class Honor extends BaseModel {
@Comment("附件")
private List<JSONObject> files;
@Column
@ColDefine(type = ColType.MYSQL_JSON)
@Comment("荣誉照片")
private List<JSONObject> photoFiles;
private String loginname;
}
@@ -92,8 +92,22 @@ public class CondolenceMineController {
condolence info
LEFT JOIN condolence_type type ON info.type = type.id
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN (
SELECT
id,
processInstanceId,
taskName,
displayName,
taskType,
performType,
taskState,
finishTime,
taskParentId,
variable,
ROW_NUMBER() OVER (PARTITION BY processInstanceId ORDER BY createdAt DESC, id DESC) AS rn
FROM wf_process_task
WHERE taskState = 10
) t ON t.processInstanceId = ins.id AND t.rn = 1
$condition
""");
Cnd cnd = Cnd.NEW();