工会报销

This commit is contained in:
=
2026-01-24 09:30:37 +08:00
parent 45d020e5ed
commit e0e6c462b6
26 changed files with 2871 additions and 505 deletions
@@ -16,6 +16,7 @@ import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.entity.ProcessTask;
import com.budwk.app.flow.enums.ProcessSubmitTypeEnum;
import com.budwk.app.flow.service.FlowCommonService;
import com.budwk.app.sys.models.Sys_unit;
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;
@@ -84,7 +85,17 @@ public class UnionReimburseApplyController {
@SaCheckPermission(value = {"unionReimburse.apply", "h5.unionReimburse.apply"}, mode = SaMode.OR)
@SLog(type = "unionReimburse", tag = "工会报销-报销申请", msg = "保存报销申请")
public Result save(@Param("data") UnionReimburse unionReimburse) {
if (StrUtil.isBlank(unionReimburse.getId())) unionReimburse.setCreateTime(new Date());
if (StrUtil.isBlank(unionReimburse.getId())) {
unionReimburse.setCreateTime(new Date());
String documentNo = generateDocumentNo();
unionReimburse.setDocumentNo(documentNo);
}
unionReimburse.setStateId(1);//待提交
if (("UNION_REIMBURSE_PROJECT_1").equals(unionReimburse.getReimburseProject())){
unionReimburse.setRealMoney(unionReimburse.getCondolenceMoney());
}else {
unionReimburse.setRealMoney(unionReimburse.getMoney());
}
dao.insertOrUpdate(unionReimburse);
return Result.success();
}
@@ -94,52 +105,56 @@ public class UnionReimburseApplyController {
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"unionReimburse.apply", "h5.unionReimburse.apply"}, mode = SaMode.OR)
public Result submit(@Param("data") UnionReimburse unionReimburse) {
if (StrUtil.isBlank(unionReimburse.getId())) unionReimburse.setCreateTime(new Date());
dao.insertOrUpdate(unionReimburse);
// 开启流程实例
Dict args = Dict.create();
args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
args.set(FlowConst.FORM_DATA, unionReimburse);
args.set("userId", unionReimburse.getCertifierUserId());
ProcessInstance instance = flowEngine.startProcessInstanceByKey("GHBX", unionReimburse.getId(), SecurityUtil.getUserId(), args);
// 自动完成第一个申请任务
List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
for (ProcessTask task : doingTaskList) {
flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
if (StrUtil.isBlank(unionReimburse.getId())) {
unionReimburse.setCreateTime(new Date());
String documentNo = generateDocumentNo();
unionReimburse.setDocumentNo(documentNo);
}
unionReimburse.setStateId(2);//待审核
if (("UNION_REIMBURSE_PROJECT_1").equals(unionReimburse.getReimburseProject())){
unionReimburse.setRealMoney(unionReimburse.getCondolenceMoney());
}else {
unionReimburse.setRealMoney(unionReimburse.getMoney());
}
return Result.success();
}
@At
@ApiOperation("重新提交申请")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"unionReimburse.apply", "h5.unionReimburse.apply"}, mode = SaMode.OR)
public Result submitAgain(@Param("data") UnionReimburse unionReimburse, @Param("taskId") Long taskId) {
if (StrUtil.isBlank(unionReimburse.getId())) unionReimburse.setCreateTime(new Date());
dao.insertOrUpdate(unionReimburse);
Dict dict = Dict.create();
dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
dict.set("userId", unionReimburse.getCertifierUserId());
flowCommonService.executeTask(dict);
// // 开启流程实例
// Dict args = Dict.create();
// args.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.APPLY.getCode());
// args.set(FlowConst.FORM_DATA, unionReimburse);
// args.set("userId", unionReimburse.getCondolenceUserId());
// ProcessInstance instance = flowEngine.startProcessInstanceByKey("GHBX", unionReimburse.getId(), SecurityUtil.getUserId(), args);
//
// // 自动完成第一个申请任务
// List<ProcessTask> doingTaskList = flowEngine.processTaskService().getDoingTaskList(instance.getId(), null);
// for (ProcessTask task : doingTaskList) {
// flowEngine.executeProcessTask(task.getId(), SecurityUtil.getUserId(), args);
// }
return Result.success();
}
// @At
// @ApiOperation("重新提交申请")
// @Aop(TransAop.READ_COMMITTED)
// @SaCheckPermission(value = {"unionReimburse.apply", "h5.unionReimburse.apply"}, mode = SaMode.OR)
// public Result submitAgain(@Param("data") UnionReimburse unionReimburse, @Param("taskId") Long taskId) {
// if (StrUtil.isBlank(unionReimburse.getId())) unionReimburse.setCreateTime(new Date());
//
// dao.insertOrUpdate(unionReimburse);
//
// Dict dict = Dict.create();
// dict.set(FlowConst.PROCESS_TASK_ID_KEY, taskId);
// dict.set(FlowConst.SUBMIT_TYPE, ProcessSubmitTypeEnum.RE_APPLY.getCode());
// dict.set("userId", unionReimburse.getCondolenceUserId());
// flowCommonService.executeTask(dict);
// return Result.success();
// }
@At
@SaCheckLogin
@ApiOperation("获取当前登录人的申请信息")
public Result info(@Param("id") String id) {
UnionReimburse unionReimburse = dao.fetch(UnionReimburse.class, id);
CondolenceType type = unionReimburseService.dao().fetch(CondolenceType.class,
Cnd.where(CondolenceType::getId, "=", unionReimburse.getCondolenceType()));
NutMap nutMap = Lang.obj2nutmap(unionReimburse);
// 使用三元运算符处理 null 情况
nutMap.put("typeName", type != null ? type.getName() : "");
return Result.success(nutMap);
return Result.success(unionReimburse);
}
@@ -159,7 +174,10 @@ public class UnionReimburseApplyController {
IFNULL(unitname, '暂无') as unitName,
unitid as unitId,
unionid as unionId,
unionname as unionName
unionname as unionName,
DATE(birthday) AS birthday,
idCard,
unionCode
from
vw_user
$condition
@@ -189,10 +207,29 @@ public class UnionReimburseApplyController {
@ApiOperation("查询职工慰问类型")
@SaCheckPermission(value = {"unionReimburse.apply", "h5.unionReimburse.apply"}, mode = SaMode.OR)
public Result queryCondolenceType() {
List<CondolenceType> list = typeService.query(Cnd.NEW().desc(CondolenceType::getCode));
List<CondolenceType> list = typeService.query(Cnd.NEW().asc(CondolenceType::getCode));
return Result.success(list);
}
@At
@ApiOperation("查询厉害账号信息")
@SaCheckPermission(value = {"unionReimburse.apply", "h5.unionReimburse.apply"}, mode = SaMode.OR)
public Result findUserBankHistory(String payer) {
Sql sql = Sqls.create("""
SELECT DISTINCT
bankCardNumber,
bankOfDeposit
FROM union_reimburse
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("payer", "=", payer);
sql.setCondition(cnd);
List<NutMap> result = unionReimburseService.listMap(sql);
return Result.success(result);
}
@At
@ApiOperation("查询校工会经费余额")
@SaCheckPermission(value = {"unionReimburse.apply", "h5.unionReimburse.apply"}, mode = SaMode.OR)
@@ -244,6 +281,39 @@ public class UnionReimburseApplyController {
// 如果没有找到该社团的经费记录,返回0
return Result.success(0.0);
}
@At
@ApiOperation("生成文件编号")
private String generateDocumentNo() {
int currentYear = DateUtil.thisYear();
String yearPrefix = String.valueOf(currentYear);
org.nutz.dao.Cnd cnd = org.nutz.dao.Cnd.where("documentNo", "LIKE", yearPrefix + "%");
cnd.desc("documentNo");
cnd.limit(1);
List<UnionReimburse> list = dao.query(UnionReimburse.class, cnd);
int nextSeq = 1; // 默认从01开始
if (!list.isEmpty()) {
String maxNo = list.get(0).getDocumentNo();
if (maxNo != null && maxNo.startsWith(yearPrefix)) {
// 提取序号部分(去掉年份前缀)
String seqPart = maxNo.substring(yearPrefix.length());
try {
int currentMaxSeq = Integer.parseInt(seqPart);
nextSeq = currentMaxSeq + 1;
} catch (NumberFormatException e) {
// 如果解析失败,使用默认值1
nextSeq = 1;
}
}
}
// 格式化序号为两位数
String seqStr = String.format("%02d", nextSeq);
return yearPrefix + seqStr;
}
}
@@ -3,10 +3,12 @@ package com.budwk.app.zhgh.dayofficework.unionReimburse.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.StrUtil;
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;
@@ -14,12 +16,16 @@ import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.sys.models.Sys_dict;
import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.unionReimburse.model.UnionReimburse;
import com.budwk.app.zhgh.dayofficework.unionReimburse.service.UnionReimburseService;
import com.budwk.app.zhgh.dayofficework.unionReimburse.vo.UnionReimburseCollectExcelVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
@@ -33,6 +39,7 @@ import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
@IocBean
@@ -74,28 +81,9 @@ public class UnionReimburseCollectController {
@Param(value = "reimburseProject") String reimburseProject) {
Sql sql = Sqls.create("""
SELECT
info.*,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
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' AND taskState in (10,20)) AS startTaskId
info.*
FROM
union_reimburse 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 = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
@@ -116,8 +104,7 @@ public class UnionReimburseCollectController {
cnd.and(seg);
}
// 只查询流程实例状态为20的数据(已完成状态)
cnd.and("ins.state", "=", 20);
cnd.and("info.stateId", "in", List.of(3, 2));
cnd.desc("info.createTime");
sql.setCondition(cnd);
@@ -125,6 +112,68 @@ public class UnionReimburseCollectController {
return Result.success(pagination);
}
@At
@SaCheckPermission(value = {"unionReimburse.collect", "h5.unionReimburse.collect"}, mode = SaMode.OR)
public Result updateActuallyAmount(String id,Double realMoney) {
UnionReimburse unionReimburse = unionReimburseService.fetch(id);
unionReimburse.setRealMoney(realMoney);
unionReimburseService.updateIgnoreNull(unionReimburse);
return Result.success();
}
@At
@Ok("void")
@SaCheckPermission(value = {"unionReimburse.collect", "h5.unionReimburse.collect"}, mode = SaMode.OR)
public void exportSkr(Integer year, String unionId, String unitId, String reimburseProject,HttpServletResponse response) {
Sql sql = Sqls.create("""
SELECT
CONCAT(u.username,'(',u.loginname,')') as skrxx,
rei.bankCardNumber,
rei.bankOfDeposit,
CASE
WHEN rei.reimburseProject = 'UNION_REIMBURSE_PROJECT_1' THEN '慰问'
WHEN rei.reimburseProject = 'UNION_REIMBURSE_PROJECT_2' THEN '文体活动'
WHEN rei.reimburseProject = 'UNION_REIMBURSE_PROJECT_3' THEN '日常活动'
WHEN rei.reimburseProject = 'UNION_REIMBURSE_PROJECT_4' THEN '专项活动'
ELSE rei.reimburseProject
END as reimbursementItemName,
u.mobile
FROM
`union_reimburse` rei
LEFT JOIN `vw_user` u ON u.id = rei.payer
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.andEX("rei.paymentWay","=","UNION_REIMBURSE_PAYMENT_WAY_2");
cnd.andEX("rei.reimburseProject", "=", reimburseProject);
cnd.andEX("YEAR(rei.createTime)", "=", year);
cnd.andEX("u.unitid", "=", unitId);
cnd.andEX("u.unionid", "=", unionId);
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_ADMIN.name())) {
cnd.andEX("u.unionid", "=", SecurityUtil.getUnionId());
}
cnd.desc("rei.createTime");
sql.setCondition(cnd);
List<NutMap> list = unionReimburseService.listMap(sql);
List<ExcelExportEntity> excelExportEntities = new ArrayList<>();
excelExportEntities.add(new ExcelExportEntity("收款人信息","skrxx",20));
excelExportEntities.add(new ExcelExportEntity("收款人账号","bankCardNumber",20));
excelExportEntities.add(new ExcelExportEntity("地区","area",20));
excelExportEntities.add(new ExcelExportEntity("开户行信息","bankOfDeposit",20));
excelExportEntities.add(new ExcelExportEntity("手机号码","mobile",20));
excelExportEntities.add(new ExcelExportEntity("报销项目","reimbursementItemName",20));
try{
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + new String(("收款人名册.xls").getBytes("utf-8"), "ISO8859-1"));
Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), excelExportEntities, list);
workbook.write(response.getOutputStream());
}catch (Exception e){
e.printStackTrace();
}
}
@At
@Ok("void")
@SaCheckPermission(value = {"unionReimburse.collect", "h5.unionReimburse.collect"}, mode = SaMode.OR)
@@ -0,0 +1,93 @@
package com.budwk.app.zhgh.dayofficework.unionReimburse.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
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.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.zhgh.dayofficework.unionReimburse.model.UnionReimburse;
import com.budwk.app.zhgh.dayofficework.unionReimburse.model.UnionReimburseDesc;
import com.budwk.app.zhgh.dayofficework.unionReimburse.service.UnionReimburseDescService;
import com.budwk.app.zhgh.staffbenefit.condolence.model.CondolenceType;
import com.budwk.app.zhgh.staffbenefit.condolence.service.CondolenceTypeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
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;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @author : hongqiwei
* @description :
* @createDate : 2026/1/20 11:32
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "职工慰问类型")
@At("/platform/unionReimburse/desc")
public class UnionReimburseDescController {
@Inject
private Dao dao;
@Inject
private UnionReimburseDescService unionReimburseDesc;
@At("")
@SaCheckPermission("unionReimburse.desc")
@Ok("beetl:/platform/zhgh/dayofficework/unionReimburse/desc/index.html")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("unionReimburse.desc")
public Result pageData(PageForm pageForm) {
Cnd cnd = Cnd.NEW();
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or(UnionReimburseDesc::getName, "like", "%" + pageForm.getSearchKeyword() + "%");
seg.or(UnionReimburseDesc::getCode, "like", "%" + pageForm.getSearchKeyword() + "%");
cnd.and(seg);
}
cnd.asc("code");
Pagination pagination = unionReimburseDesc.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), cnd);
return Result.success(pagination);
}
@At
@ApiOperation("新增/修改职工慰问类型")
@SaCheckPermission("unionReimburse.desc")
@SLog(tag = "职工慰问系统-慰问类型", msg = "新增/修改职工慰问类型")
public Object onSubmit(UnionReimburseDesc desc) {
unionReimburseDesc.insertOrUpdate(desc);
return Result.success();
}
@At
@ApiOperation("删除职工慰问类型")
@SaCheckPermission("unionReimburse.desc")
@SLog(tag = "职工慰问系统-慰问类型", msg = "删除职工慰问类型")
public Object onDelete(String id) {
unionReimburseDesc.delete(id);
return Result.success();
}
@At
@ApiOperation("查询附件说明")
@SaCheckPermission(value = {"unionReimburse.desc", "h5.unionReimburse.desc"}, mode = SaMode.OR)
public Result queryFileDesc() {
List<UnionReimburseDesc> list = unionReimburseDesc.query(Cnd.NEW().desc(UnionReimburseDesc::getCode));
return Result.success(list);
}
}
@@ -3,30 +3,58 @@ package com.budwk.app.zhgh.dayofficework.unionReimburse.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.model.Audit;
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.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.MoneyUtil;
import com.budwk.app.base.utils.OfficePlusUtil;
import com.budwk.app.base.utils.SysOfficeTemplateUtil;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.unionReimburse.model.UnionReimburse;
import com.budwk.app.zhgh.dayofficework.unionReimburse.service.UnionReimburseService;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.PictureRenderData;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
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.entity.Record;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
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.random.R;
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 javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.StandardOpenOption;
import java.util.HashMap;
/**
* @ClassName UnionReimburseMineController
* @Author hongqiwei
@@ -41,10 +69,15 @@ import org.nutz.mvc.annotation.Param;
@Slf4j
public class UnionReimburseMineController {
@Inject
private SysOfficeTemplateUtil sysOfficeTemplateUtil;
@Inject
private UnionReimburseService unionReimburseService;
@Inject
private FlowEngine flowEngine;
@Inject
private Dao dao;
@At("/index")
@@ -124,7 +157,274 @@ public class UnionReimburseMineController {
@SLog( tag = "删除工会报销", msg = "删除工会报销")
public Result delete(@Param("id") String id) {
unionReimburseService.delete(id);
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
return Result.success();
}
@At
@ApiOperation("撤回")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"unionReimburse.mine", "h5.unionReimburse.mine"}, mode = SaMode.OR)
@SLog( tag = "撤回工会报销", msg = "撤回工会报销")
public Result revokeTask(@Param("id") String id) {
UnionReimburse unionReimburse = unionReimburseService.fetch(id);
unionReimburse.setStateId(1);//待审核
dao.insertOrUpdate(unionReimburse);
return Result.success();
}
@At
@Ok("void")
public void ActExport(String id, HttpServletResponse response, boolean Print) throws Exception {
UnionReimburse unionReimburse = unionReimburseService.fetch(id);
if (unionReimburse == null) {
throw new RuntimeException("报销记录不存在");
}
HashMap<String, Object> docData = new HashMap<>();
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(unionReimburse.getDocumentNo(), BarcodeFormat.QR_CODE, 80, 80);
BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
File tempFile = File.createTempFile("qrcode_", ".png");
javax.imageio.ImageIO.write(bufferedImage, "PNG", tempFile);
PictureRenderData pictureRenderData = com.deepoove.poi.data.Pictures.of(tempFile.getAbsolutePath())
.size(80, 80)
.create();
docData.put("qrcode", pictureRenderData);
tempFile.deleteOnExit();
docData.put("createTime", DateUtil.format(unionReimburse.getCreateTime(), "yyyy-MM-dd"));
docData.put("unitName", unionReimburse.getUnitName());
docData.put("userName", unionReimburse.getUserName());
docData.put("loginName", unionReimburse.getLoginName());
docData.put("mobile", unionReimburse.getMobile());
docData.put("paymentNotes", unionReimburse.getPaymentNotes());
docData.put("invoiceNumber", unionReimburse.getInvoiceNumber());
docData.put("notes", unionReimburse.getNotes());
docData.put("realMoney", unionReimburse.getRealMoney());
docData.put("reimburseProject", unionReimburse.getReimburseProject());
docData.put("paymentWay", unionReimburse.getPaymentWay());
//对私支付,付款人信息
docData.put("payerLoginname", unionReimburse.getPayerLoginname());
docData.put("payerName", unionReimburse.getPayerName());
docData.put("bankOfDeposit", unionReimburse.getBankOfDeposit());
docData.put("bankCardNumber", unionReimburse.getBankCardNumber());
// 金额转大写
if (unionReimburse.getRealMoney() != null) {
docData.put("money_big", MoneyUtil.toRMBUpper(String.valueOf(unionReimburse.getRealMoney())));
} else {
docData.put("money_big", "");
}
// 设置报销项目类型标记
String wtAct = "□文体活动 □慰问 □日常活动 □专项活动";
if ("UNION_REIMBURSE_PROJECT_2".equals(unionReimburse.getReimburseProject())) {
wtAct = wtAct.replace("□文体活动", "√文体活动");
} else if ("UNION_REIMBURSE_PROJECT_3".equals(unionReimburse.getReimburseProject())) {
wtAct = wtAct.replace("□日常活动", "√日常活动");
} else if ("UNION_REIMBURSE_PROJECT_4".equals(unionReimburse.getReimburseProject())) {
wtAct = wtAct.replace("□专项活动", "√专项活动");
} else if ("UNION_REIMBURSE_PROJECT_1".equals(unionReimburse.getReimburseProject())) {
wtAct = wtAct.replace("□慰问", "√慰问");
}
docData.put("bxxm", wtAct);
String templateName;
Double realMoney = unionReimburse.getRealMoney() != null ? unionReimburse.getRealMoney() : 0.0;
String paymentWay = unionReimburse.getPaymentWay();
if (("UNION_REIMBURSE_PAYMENT_WAY_2").equals(paymentWay)) { // 对私支付
docData.put("paymentWay", "对私支付");
if (realMoney < 5000) {
templateName = "unionReimburse_act_private_small";
} else {
templateName = "unionReimburse_act_private_big";
}
} else { // 对公支付
docData.put("paymentWay", "对公支付");
if (realMoney < 5000) {
templateName = "unionReimburse_act_public_small";
} else {
templateName = "unionReimburse_act_public_big";
}
}
if (Print) {
exportAsPDF(templateName, docData, unionReimburse, response);
} else {
exportAsWord(templateName, docData, unionReimburse, response);
}
}
@At
@Ok("void")
public void ConExport(String id, HttpServletResponse response, boolean Print) throws Exception {
UnionReimburse unionReimburse = unionReimburseService.fetch(id);
if (unionReimburse == null) {
throw new RuntimeException("报销记录不存在");
}
HashMap<String, Object> docData = new HashMap<>();
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(unionReimburse.getDocumentNo(), BarcodeFormat.QR_CODE, 80, 80);
BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
File tempFile = File.createTempFile("qrcode_", ".png");
javax.imageio.ImageIO.write(bufferedImage, "PNG", tempFile);
PictureRenderData pictureRenderData = com.deepoove.poi.data.Pictures.of(tempFile.getAbsolutePath())
.size(80, 80)
.create();
docData.put("qrcode", pictureRenderData);
docData.put("createTime", DateUtil.format(unionReimburse.getCreateTime(), "yyyy-MM-dd"));
docData.put("unitName", unionReimburse.getUnitName());
docData.put("userName", unionReimburse.getUserName());
docData.put("loginName", unionReimburse.getLoginName());
docData.put("mobile", unionReimburse.getMobile());
docData.put("paymentNotes", unionReimburse.getPaymentNotes());
docData.put("invoiceNumber", unionReimburse.getInvoiceNumber());
docData.put("notes", unionReimburse.getNotes());
docData.put("realMoney", unionReimburse.getRealMoney());
docData.put("reimburseProject", unionReimburse.getReimburseProject());
docData.put("paymentWay", unionReimburse.getPaymentWay());
//对私支付,付款人信息
docData.put("payerLoginname", unionReimburse.getPayerLoginname());
docData.put("payerName", unionReimburse.getPayerName());
docData.put("bankOfDeposit", unionReimburse.getBankOfDeposit());
docData.put("bankCardNumber", unionReimburse.getBankCardNumber());
//慰问
docData.put("condolenceUserName", unionReimburse.getCondolenceUserName());
docData.put("condolenceLoginName", unionReimburse.getCondolenceLoginName());
docData.put("typeName", unionReimburse.getTypeName());
docData.put("way", unionReimburse.getWay());
docData.put("condolenceTime", DateUtil.format(unionReimburse.getCondolenceTime(), "yyyy-MM-dd"));
docData.put("participants", unionReimburse.getParticipants());
//结婚
docData.put("marryTime", DateUtil.format(unionReimburse.getMarryTime(), "yyyy-MM-dd"));
//生育
docData.put("fertilityTime", DateUtil.format(unionReimburse.getFertilityTime(), "yyyy-MM-dd"));
//生病住院
docData.put("hospitalCausation", unionReimburse.getHospitalCausation());
docData.put("hospital", unionReimburse.getHospital());
docData.put("hospitalCount", unionReimburse.getHospitalCount());
String hospitalTime = DateUtil.format(unionReimburse.getHospitalizationStartTime(), "yyyy-MM-dd") +
"" +
DateUtil.format(unionReimburse.getHospitalizationEndTime(), "yyyy-MM-dd");
docData.put("hospitalTime", hospitalTime);
//去世
docData.put("deathTime", DateUtil.format(unionReimburse.getDeathTime(), "yyyy-MM-dd"));
docData.put("condolenceRelationship", unionReimburse.getCondolenceRelationship());
// 金额转大写
if (unionReimburse.getRealMoney() != null) {
docData.put("money_big", MoneyUtil.toRMBUpper(String.valueOf(unionReimburse.getRealMoney())));
} else {
docData.put("money_big", "");
}
// 设置报销项目类型标记
String wtAct = "□文体活动 □慰问 □日常活动 □专项活动";
if ("UNION_REIMBURSE_PROJECT_2".equals(unionReimburse.getReimburseProject())) {
wtAct = wtAct.replace("□文体活动", "√文体活动");
} else if ("UNION_REIMBURSE_PROJECT_3".equals(unionReimburse.getReimburseProject())) {
wtAct = wtAct.replace("□日常活动", "√日常活动");
} else if ("UNION_REIMBURSE_PROJECT_4".equals(unionReimburse.getReimburseProject())) {
wtAct = wtAct.replace("□专项活动", "√专项活动");
} else if ("UNION_REIMBURSE_PROJECT_1".equals(unionReimburse.getReimburseProject())) {
wtAct = wtAct.replace("□慰问", "√慰问");
}
docData.put("bxxm", wtAct);
String templateName;
Double realMoney = unionReimburse.getRealMoney() != null ? unionReimburse.getRealMoney() : 0.0;
String paymentWay = unionReimburse.getPaymentWay();
if (("UNION_REIMBURSE_PAYMENT_WAY_2").equals(paymentWay)) { // 对私支付
docData.put("paymentWay", "对私支付");
if (("生病住院").equals(unionReimburse.getTypeName())) {
templateName = "unionReimburse_con_private_hospital";
} else if (("结婚").equals(unionReimburse.getTypeName())) {
templateName = "unionReimburse_con_private_mary";
} else if (("生育").equals(unionReimburse.getTypeName())) {
templateName = "unionReimburse_con_private_birth";
} else if (("会员去世").equals(unionReimburse.getTypeName()) || ("直系亲属去世").equals(unionReimburse.getTypeName())) {
if (realMoney < 5000) {
templateName = "unionReimburse_con_private_dead_small";
} else {
templateName = "unionReimburse_con_private_dead_big";
}
} else {//其他
templateName = "unionReimburse_con_private_other";
}
} else { // 对公支付
docData.put("paymentWay", "对公支付");
if (("生病住院").equals(unionReimburse.getTypeName())) {
templateName = "unionReimburse_con_public_hospital";
} else if (("结婚").equals(unionReimburse.getTypeName())) {
templateName = "unionReimburse_con_public_mary";
} else if (("生育").equals(unionReimburse.getTypeName())) {
templateName = "unionReimburse_con_public_birth";
} else if (("会员去世").equals(unionReimburse.getTypeName()) || ("直系亲属去世").equals(unionReimburse.getTypeName())) {
if (realMoney < 5000) {
templateName = "unionReimburse_con_public_dead_small";
} else {
templateName = "unionReimburse_con_public_dead_big";
}
} else {//其他
templateName = "unionReimburse_con_public_other";
}
}
if (Print) {
exportAsPDF(templateName, docData, unionReimburse, response);
} else {
exportAsWord(templateName, docData, unionReimburse, response);
}
}
// 导出PDF
@At
private void exportAsPDF(String templateName, HashMap<String, Object> docData,
UnionReimburse unionReimburse, HttpServletResponse response) throws Exception {
String fileName = "中国地质大学(武汉)工会经费日常报销_" + unionReimburse.getUserName() + "_" +
DateUtil.format(unionReimburse.getCreateTime(), "yyyyMMdd") + ".pdf";
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate(templateName))
.render(docData)
.writeAndClose(byteArrayOutputStream);
byte[] bytes = byteArrayOutputStream.toByteArray();
File sourceFile = File.createTempFile("file_convert_origin", ".docx");
Files.write(sourceFile.toPath(), bytes, StandardOpenOption.WRITE);
File pdfFile = File.createTempFile("file_convert", ".pdf");
OfficePlusUtil.convert(sourceFile.getPath(), pdfFile.getPath());
CommonDownloadUtil.download(fileName, IoUtil.readBytes(FileUtil.getInputStream(pdfFile)), response);
// 删除临时文件
FileUtil.del(sourceFile);
FileUtil.del(pdfFile.toPath());
} catch (IOException e) {
log.error("工会报销单据导出PDF失败,id:{},错误信息:{}", unionReimburse.getId(), e.getMessage());
}
}
// 导出Word
@At
private void exportAsWord(String templateName, HashMap<String, Object> docData,
UnionReimburse unionReimburse, HttpServletResponse response) throws Exception {
String fileName = "中国地质大学(武汉)工会经费日常报销_" + unionReimburse.getUserName() + "_" +
DateUtil.format(unionReimburse.getCreateTime(), "yyyyMMdd") + ".docx";
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate(templateName))
.render(docData)
.writeAndClose(byteArrayOutputStream);
CommonDownloadUtil.download(fileName, byteArrayOutputStream.toByteArray(), response);
} catch (IOException e) {
log.error("工会报销单据导出Word失败,id:{},错误信息:{}", unionReimburse.getId(), e.getMessage());
}
}
}
@@ -5,28 +5,38 @@ import cn.dev33.satoken.annotation.SaCheckLogin;
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.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import com.budwk.app.zhgh.dayofficework.unionReimburse.model.UnionReimburse;
import com.budwk.app.zhgh.dayofficework.unionReimburse.service.UnionReimburseService;
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.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.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
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.Date;
import java.util.List;
import static org.openjdk.nashorn.internal.runtime.regexp.joni.Config.log;
@IocBean
@At("/platform/unionReimburse/review")
@Ok("json:full")
@@ -34,6 +44,8 @@ import java.util.List;
@Slf4j
public class UnionReimburseReviewController {
@Inject
private Dao dao;
@Inject
private UnionReimburseService unionReimburseService;
@@ -59,41 +71,20 @@ public class UnionReimburseReviewController {
String unitId,
String reimburseProject) {
Sql sql = Sqls.create("""
SELECT
info.*,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IFNULL(GROUP_CONCAT(DISTINCT nt.displayName),'结束') curTaskName,
IF(rt.id IS NOT NULL, 1, 0) AS canRevoke
FROM
wf_process_task t
LEFT JOIN wf_process_instance ins ON ins.id = t.processInstanceId
LEFT JOIN union_reimburse info ON info.id = ins.businessNo
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
LEFT JOIN wf_process_task nt ON nt.processInstanceId = ins.id AND nt.taskState = 10
LEFT JOIN wf_process_task rt ON rt.processInstanceId = ins.id AND rt.taskParentId = t.id AND rt.taskState = 10
$condition
SELECT
info.*
FROM
union_reimburse info
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("t.taskName", "=", "019925d2-6f33-449a-9fb0-34c470222e99");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (approval) {
cnd.and("t.taskState", "in", List.of(ProcessTaskStateEnum.FINISHED.getCode(), ProcessTaskStateEnum.WITHDRAW.getCode(), ProcessTaskStateEnum.INTERRUPT.getCode()));
// 已审核:查询 stateId 为 3(报销成功)、4(拒绝)、5(退回)的记录
cnd.and("info.stateId", "in", List.of(3, 4, 5));
} else {
cnd.and("t.taskState", "=", ProcessTaskStateEnum.DOING.getCode());
// 未审核:只查询 stateId 为 2(待审核确认)的记录
cnd.and("info.stateId", "=", 2);
}
// 年度查询条件
cnd.andEX("year(info.createTime)", "=", year);
@@ -118,10 +109,55 @@ public class UnionReimburseReviewController {
} else {
cnd.orderBy(pageForm.getPageOrderName(), PageUtil.getOrder(pageForm.getPageOrderBy()));
}
cnd.groupBy("t.id");
cnd.desc("t.createdAt");
cnd.desc("info.createdAt");
sql.setCondition(cnd);
Pagination<NutMap> pagination = unionReimburseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@ApiOperation("审核")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"unionReimburse.review", "h5.unionReimburse.review"}, mode = SaMode.OR)
@SLog( tag = "审核工会报销", msg = "审核工会报销")
public Result reviewTask(@Param("data") UnionReimburse unionReimburse,String submitType) {
if (submitType == null || !List.of("3", "4", "5").contains(submitType)) {
return Result.error("无效的审核操作类型");
}
UnionReimburse dbRecord = dao.fetch(UnionReimburse.class, unionReimburse.getId());
if (dbRecord == null) {
return Result.error("记录不存在");
}
dbRecord.setReviewTime(new Date());
dbRecord.setStateId(Integer.parseInt(submitType));
dbRecord.setReviewOpinion(unionReimburse.getReviewOpinion());
dao.update(dbRecord);
return Result.success();
}
@At
@ApiOperation("一键审核")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission(value = {"unionReimburse.review", "h5.unionReimburse.review"}, mode = SaMode.OR)
@SLog( tag = "一键审核", msg = "一键审核")
public Result allReview() {
try {
List<UnionReimburse> reimbursements = unionReimburseService.query(Cnd.where("stateId", "=", 2));
for (UnionReimburse reimbursement : reimbursements) {
reimbursement.setStateId(3);
reimbursement.setReviewTime(new Date());
reimbursement.setReviewOpinion("通过");
dao.update(reimbursement);
}
return Result.success("一键审核完成,共处理 " + reimbursements.size() + " 条记录");
} catch (Exception e) {
log.error("一键审核失败");
return Result.error("一键审核失败: " + e.getMessage());
}
}
}
@@ -0,0 +1,153 @@
package com.budwk.app.zhgh.dayofficework.unionReimburse.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.sys.services.SysDictService;
import com.budwk.app.zhgh.dayofficework.unionReimburse.param.UnionReimbursePageForm;
import com.budwk.app.zhgh.dayofficework.unionReimburse.service.UnionReimburseService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
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.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 javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
@IocBean
@At("/platform/unionReimburse/statistics")
@Ok("json:full")
@Api("慰问统计")
@Slf4j
public class UnionReimburseStatisticsController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private SysDictService sysDictService;
@Inject
private UnionReimburseService unionReimburseService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/unionReimburse/statistics/index.html")
@SaCheckPermission("unionReimburse.statistics")
public void index() {
}
@At("/h5")
@Ok("beetl:/platform/zhghh5/dayofficework/unionReimburse/statistics/index.html")
@SaCheckPermission("h5.unionReimburse.statistics")
public void h5Index() {
}
@At
@ApiOperation("慰问类型统计图表数据")
@SaCheckPermission(value = {"unionReimburse.statistics", "h5.unionReimburse.statistics"}, mode = SaMode.OR)
public Result condolencesType(String year, String unionId, String condolenceTypeId, String way) {
Sql sql = Sqls.create("""
SELECT
type.`name`,
type.`code`,
(
SELECT
COUNT(*)
FROM
union_reimburse con
LEFT JOIN `vw_user` us ON us.id = con.condolenceUserId
WHERE
type.name = con.typeName
$yearCnd
$unionIdCnd
$typeCnd
$wayCnd
$stateId
AND con.stateId IN (2, 3)
) `value`
FROM
condolence_type type $condition
""");
if (Strings.isNotBlank(year)) {
sql.setVar("yearCnd", String.format("AND YEAR ( con.createTime )= %s ", year));
}
if (Strings.isNotBlank(unionId)) {
sql.setVar("unionIdCnd", String.format("AND us.unionId = '%s' ", unionId));
}
if (Strings.isNotBlank(condolenceTypeId)) {
sql.setVar("typeCnd", String.format("AND con.condolenceTypeId = '%s' ", condolenceTypeId));
}
if (Strings.isNotBlank(way)) {
sql.setVar("wayCnd", String.format("AND con.way = '%s' ", way));
}
Cnd cnd = Cnd.NEW();
cnd.asc("type.location");
sql.setCondition(cnd);
List<NutMap> result = unionReimburseService.listMap(sql);
return Result.success(result);
}
@At
@ApiOperation("分页查询")
@SaCheckPermission(value = {"unionReimburse.statistics", "h5.unionReimburse.statistics"}, mode = SaMode.OR)
public Result pageData(UnionReimbursePageForm pageForm) {
Sql sql = unionReimburseService.getSql(pageForm);
Pagination pagination = unionReimburseService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@Ok("void")
@ApiOperation("导出慰问信息列表")
@SaCheckPermission(value = {"unionReimburse.statistics", "h5.unionReimburse.statistics"}, mode = SaMode.OR)
public void doExport(UnionReimbursePageForm pageForm,
HttpServletResponse response){
Sql sql = unionReimburseService.getSql(pageForm);
List<NutMap> list = unionReimburseService.listMap(sql);
List<ExcelExportEntity> excelExportEntities = new ArrayList<>();
excelExportEntities.add(new ExcelExportEntity("工号","condolenceLoginName",20));
excelExportEntities.add(new ExcelExportEntity("姓名","condolenceUserName",20));
excelExportEntities.add(new ExcelExportEntity("分工会代码","condolenceUnionCode",20));
excelExportEntities.add(new ExcelExportEntity("分工会名称","condolenceUnionName",20));
excelExportEntities.add(new ExcelExportEntity("慰问类型","typeName",20));
excelExportEntities.add(new ExcelExportEntity("慰问方式","way",20));
excelExportEntities.add(new ExcelExportEntity("慰问金额","realMoney",20));
excelExportEntities.add(new ExcelExportEntity("慰问时间","newCreateTime",20));
excelExportEntities.add(new ExcelExportEntity("录入时间","newCondolenceTime",20));
try {
ExportParams exportParams = new ExportParams();
exportParams.setType(ExcelType.XSSF);
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, excelExportEntities, list);
CommonDownloadUtil.download("慰问信息列表.xlsx", workbook, response);
} catch (Exception e) {
log.error("导出慰问信息列表失败", e);
}
}
}
@@ -0,0 +1,91 @@
package com.budwk.app.zhgh.dayofficework.unionReimburse.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
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.zhgh.staffbenefit.condolence.model.CondolenceType;
import com.budwk.app.zhgh.staffbenefit.condolence.service.CondolenceTypeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
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;
import org.nutz.mvc.annotation.Ok;
import java.util.List;
/**
* @ClassName UnionReimburseTypeController
* @Author =
* @Date 2025/7/29 10:00
* @Version 1.0
* @Description TODO
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api(tags = "职工慰问类型")
@At("/platform/unionReimburse/type")
public class UnionReimburseTypeController {
@Inject
private Dao dao;
@Inject
private CondolenceTypeService typeService;
@At("")
@SaCheckPermission("unionReimburse.type")
@Ok("beetl:/platform/zhgh/staffbenefit/condolence/type/index.html")
public void index() {
}
@At
@ApiOperation("分页查询")
@SaCheckPermission("unionReimburse.type")
public Result pageData(PageForm pageForm) {
Cnd cnd = Cnd.NEW();
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or(CondolenceType::getName, "like", "%" + pageForm.getSearchKeyword() + "%");
seg.or(CondolenceType::getCode, "like", "%" + pageForm.getSearchKeyword() + "%");
cnd.and(seg);
}
cnd.asc("code");
Pagination pagination = typeService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), cnd);
return Result.success(pagination);
}
@At
@ApiOperation("新增/修改职工慰问类型")
@SaCheckPermission("unionReimburse.type")
@SLog(tag = "职工慰问系统-慰问类型", msg = "新增/修改职工慰问类型")
public Object onSubmit(CondolenceType type) {
typeService.insertOrUpdate(type);
return Result.success();
}
@At
@ApiOperation("删除职工慰问类型")
@SaCheckPermission("unionReimburse.type")
@SLog(tag = "职工慰问系统-慰问类型", msg = "删除职工慰问类型")
public Object onDelete(String id) {
typeService.delete(id);
return Result.success();
}
@At
@ApiOperation("查询职工慰问类型")
@SaCheckLogin
public Result queryCondolenceType() {
List<CondolenceType> list = typeService.query(Cnd.where(CondolenceType::getEnable, "=", true).asc(CondolenceType::getCode));
return Result.success(list);
}
}
@@ -1,5 +1,6 @@
package com.budwk.app.zhgh.dayofficework.unionReimburse.model;
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.hutool.db.DaoTemplate;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.model.BaseModel;
@@ -70,41 +71,6 @@ public class UnionReimburse extends BaseModel {
@ColDefine(type = ColType.VARCHAR, width = 100)
private String unionName;
@Column
@Comment("证明人ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String certifierUserId;
@Column
@Comment("证明人姓名")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String certifierUserName;
@Column
@Comment("证明人工号")
@ColDefine(type = ColType.VARCHAR, width = 120)
private String certifierLoginName;
@Column
@Comment("证明人分工会ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String certifierUnionId;
@Column
@Comment("证明人分工会")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String certifierUnionName;
@Column
@Comment("证明人单位ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String certifierUnitId;
@Column
@Comment("证明人单位")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String certifierUnitName;
@Column
@Comment("报销类别")
@@ -117,6 +83,11 @@ public class UnionReimburse extends BaseModel {
@ColDefine(type = ColType.VARCHAR, width = 30)
private String reimburseProject;
@Column
@Comment("文件编号")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String documentNo;
@Column
@Comment("支付方式")
@@ -139,6 +110,56 @@ public class UnionReimburse extends BaseModel {
@ColDefine(type = ColType.VARCHAR, width = 100)
private Double fundBalance;
@Column
@Comment("发票张数")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String invoiceNumber;
@Column
@Comment("发票号码")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String invoice;
@Column
@Comment("报销事由")
@ColDefine(type = ColType.VARCHAR)
private String paymentNotes;
@Column
@Comment("备注")
@ColDefine(type = ColType.VARCHAR)
private String notes;
@Column
@Comment("附件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> files;
@Comment("签字")
@ColDefine(type = ColType.VARCHAR, width = 255)
@Column(hump = true)
private String userSign;
/**
* 对私支付
*/
@Column
@Comment("付款人")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String payer;
@Column
@Comment("付款人工号")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String payerLoginname;
@Column
@Comment("付款人姓名")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String payerName;
@Column
@Comment("户名")
@ColDefine(type = ColType.VARCHAR, width = 100)
@@ -154,32 +175,6 @@ public class UnionReimburse extends BaseModel {
@ColDefine(type = ColType.VARCHAR, width = 100)
private String bankOfDeposit;
@Column
@Comment("发票张数")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String invoiceNumber;
@Column
@Comment("发票号码")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String invoice;
@Column
@Comment("支付内容")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String paymentNotes;
@Column
@Comment("附件")
@ColDefine(type = ColType.MYSQL_JSON)
private List<JSONObject> files;
@Comment("签字")
@ColDefine(type = ColType.VARCHAR, width = 255)
@Column(hump = true)
private String userSign;
/**
* 慰问
*/
@@ -189,6 +184,66 @@ public class UnionReimburse extends BaseModel {
@ColDefine(type = ColType.VARCHAR, width = 32)
private String condolenceId;
@Column
@Comment("慰问人ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String condolenceUserId;
@Column
@Comment("慰问人姓名")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String condolenceUserName;
@Column
@Comment("慰问人工号")
@ColDefine(type = ColType.VARCHAR, width = 120)
private String condolenceLoginName;
@Column
@Comment("慰问人性别")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String condolenceSex;
@Column
@Comment("慰问人生日")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String condolenceBirthday;
@Column
@Comment("慰问人身份证")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String condolenceIdCard;
@Column
@Comment("证明人分工会ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String certifierUnionId;
@Column
@Comment("慰问人分工会ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String condolenceUnionId;
@Column
@Comment("慰问人分工会code")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String condolenceUnionCode;
@Column
@Comment("慰问人分工会")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String condolenceUnionName;
@Column
@Comment("慰问人单位ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String condolenceUnitId;
@Column
@Comment("慰问人单位")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String condolenceUnitName;
@Column
@Comment("慰问对象名称")
@ColDefine(type = ColType.VARCHAR, width = 32)
@@ -205,9 +260,34 @@ public class UnionReimburse extends BaseModel {
private String condolenceType;
@Column
@Comment("慰问金额/报销金额")
@Comment("慰问类型名称")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String typeName;
@Column
@Comment("慰问上传附件说明")
@ColDefine(type = ColType.VARCHAR, width = 200)
private String condolenceFilesNotes;
@Column
@Comment("慰问类型id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String condolenceTypeId;
@Column
@Comment("慰问类型方式")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String way;
@Column
@Comment("慰问金额")
@ColDefine(type = ColType.FLOAT, width = 10, precision = 2)
private Double money;
private Double condolenceMoney;
@Column
@Comment("实际金额")
@ColDefine(type = ColType.FLOAT, width = 10, precision = 2)
private Double realMoney;
@Column
@@ -215,9 +295,59 @@ public class UnionReimburse extends BaseModel {
@ColDefine(type = ColType.DATETIME)
private Date condolenceTime;
@Column
@Comment("结婚时间")
@ColDefine(type = ColType.DATETIME)
private Date marryTime;
@Column
@Comment("生育时间")
@ColDefine(type = ColType.DATETIME)
private Date fertilityTime;
@Column
@Comment("住院开始时间")
@ColDefine(type = ColType.VARCHAR, width = 50)
private Date hospitalizationStartTime;
@Column
@Comment("住院结束时间")
@ColDefine(type = ColType.VARCHAR, width = 50)
private Date hospitalizationEndTime;
@Column
@Comment("入住医院")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String hospital;
@Column
@Comment("住院病由")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String hospitalCausation;
@Column
@Comment("当年次数")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String hospitalCount;
@Column
@Comment("去逝时间")
@ColDefine(type = ColType.DATETIME)
private Date deathTime;
@Column
@Comment("与被慰问人关系")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String condolenceRelationship;
@Column
@Comment("参与随行人员")
@ColDefine(type = ColType.VARCHAR)
private String participants;
/**
* 活动/建家/日常
* 活动
*/
@Column
@@ -246,6 +376,11 @@ public class UnionReimburse extends BaseModel {
@ColDefine(type = ColType.VARCHAR, width = 50)
private String activityPlace;
@Column
@Comment("报销金额")
@ColDefine(type = ColType.FLOAT, width = 10, precision = 2)
private Double money;
/*
* 所属社团
*/
@@ -265,4 +400,19 @@ public class UnionReimburse extends BaseModel {
@ColDefine(type = ColType.DATETIME)
private Date createTime;
@Column
@Comment("状态(1.待提交,2.待审核确认,3.报销成功,4.拒绝,5.退回)")
@ColDefine(type = ColType.VARCHAR, width = 32)
private int stateId;
@Column
@Comment("审核意见")
@ColDefine(type = ColType.VARCHAR)
private String reviewOpinion;
@Column
@Comment("审核时间")
@ColDefine(type = ColType.DATETIME)
private Date reviewTime;
}
@@ -0,0 +1,61 @@
package com.budwk.app.zhgh.dayofficework.unionReimburse.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.DB;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* @author : hongqiwei
* @description :
* @createDate : 2026/1/20 11:22
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Table("union_reimburse_desc")
@TableMeta("{'mysql-charset':'utf8mb4'}")
@Comment("工会报销-附件说明")
public class UnionReimburseDesc extends BaseModel {
@Column
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("编码")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String code;
@Column
@Comment("报销项目Id(1.慰问,2.文体活动,3.日常活动,4.专项活动)")
@ColDefine(type = ColType.INT, width = 2)
private String reimburseProject;
@Column
@Comment("报销项目名称")
@ColDefine(type = ColType.VARCHAR, width = 10)
private String name;
@Column
@Comment("附件说明")
@ColDefine(type = ColType.VARCHAR, width = 200)
private String fileDesc;
@Column
@Comment("排序字段")
@Prev({
@SQL(db = DB.MYSQL, value = "SELECT IFNULL(MAX(location),0)+1 FROM Condolence_Type"),
@SQL(db = DB.ORACLE, value = "SELECT COALESCE(MAX(location),0)+1 FROM Condolence_Type")
})
private Integer location;
@Column
@Comment("排序")
@ColDefine(type = ColType.INT)
private int sortNum;
}
@@ -0,0 +1,24 @@
package com.budwk.app.zhgh.dayofficework.unionReimburse.param;
import com.budwk.app.base.param.PageForm;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.util.List;
/**
* @author : hongqiwei
* @description :
* @createDate : 2026/1/22 15:15
*/
@Data
public class UnionReimbursePageForm extends PageForm {
private Integer year;
private String unionId;
private String condolenceTypeId;
private String way;
private String reimburseProject;
private String unitId;
}
@@ -0,0 +1,7 @@
package com.budwk.app.zhgh.dayofficework.unionReimburse.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.unionReimburse.model.UnionReimburseDesc;
public interface UnionReimburseDescService extends BaseService<UnionReimburseDesc> {
}
@@ -2,6 +2,10 @@ package com.budwk.app.zhgh.dayofficework.unionReimburse.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.dayofficework.unionReimburse.model.UnionReimburse;
import com.budwk.app.zhgh.dayofficework.unionReimburse.param.UnionReimbursePageForm;
import org.nutz.dao.sql.Sql;
public interface UnionReimburseService extends BaseService<UnionReimburse> {
Sql getSql(UnionReimbursePageForm pageForm);
}
@@ -0,0 +1,17 @@
package com.budwk.app.zhgh.dayofficework.unionReimburse.service.impl;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.dayofficework.unionReimburse.model.UnionReimburseDesc;
import com.budwk.app.zhgh.dayofficework.unionReimburse.service.UnionReimburseDescService;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
@Slf4j
@IocBean(args = {"refer:dao"})
public class UnionReimburseDescServiceImpl extends BaseServiceImpl<UnionReimburseDesc> implements UnionReimburseDescService {
public UnionReimburseDescServiceImpl(Dao dao) {
super(dao);
}
}
@@ -1,17 +1,64 @@
package com.budwk.app.zhgh.dayofficework.unionReimburse.service.impl;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.dayofficework.unionReimburse.model.UnionReimburse;
import com.budwk.app.zhgh.dayofficework.unionReimburse.param.UnionReimbursePageForm;
import com.budwk.app.zhgh.dayofficework.unionReimburse.service.UnionReimburseService;
import lombok.extern.slf4j.Slf4j;
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.IocBean;
import java.util.List;
@Slf4j
@IocBean(args = {"refer:dao"})
public class UnionReimburseServiceImpl extends BaseServiceImpl<UnionReimburse> implements UnionReimburseService {
public UnionReimburseServiceImpl(Dao dao) {
super(dao);
}
@Override
public Sql getSql(UnionReimbursePageForm pageForm) {
Sql sql = Sqls.create("""
SELECT
info.*,
LEFT(info.createTime,10) newCreateTime,
LEFT(info.condolenceTime,10) newCondolenceTime
FROM
union_reimburse info
$condition
""");
Cnd cnd = Cnd.NEW();
// 年度查询条件
cnd.andEX("year(info.createTime)", "=", pageForm.getYear());
// 工会、单位名称查询条件
cnd.andEX("info.condolenceUnionId", "=", pageForm.getUnionId());
cnd.andEX("info.unitId", "=", pageForm.getUnitId());
cnd.andEX("info.condolenceTypeId", "=", pageForm.getCondolenceTypeId());
cnd.andEX("info.way", "=", pageForm.getWay());
// 报销项目查询条件
cnd.andEX("info.reimburseProject", "=", pageForm.getReimburseProject());
// 姓名和工号查询条件
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.orLike("info.condolenceUserName",pageForm.getSearchKeyword());
seg.orLike("info.condolenceLoginName",pageForm.getSearchKeyword());
cnd.and(seg);
}
cnd.and("info.stateId", "in", List.of(3, 2));
cnd.desc("info.createTime");
sql.setCondition(cnd);
return sql;
}
}