From a9d516b1106c854c180e75dc1d796b338aa88bdc Mon Sep 17 00:00:00 2001 From: wxc <191104855@qq.com> Date: Fri, 19 Apr 2024 18:06:02 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E6=98=93=E7=A8=8B=E5=BA=8F=20?= =?UTF-8?q?=E8=81=94=E7=B3=BB=E7=BE=A4=E4=BC=97=E5=90=8E=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E9=80=80=E5=9B=9E=E4=BF=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/biutag/exception/GlobalException.java | 3 +- mailbox-lan/pom.xml | 6 + .../biutag/lan/config/AdminInterceptor.java | 63 ++----- .../controller/system/CrontabController.java | 69 -------- .../main/java/com/biutag/lan/domain/Mail.java | 3 + .../java/com/biutag/lan/flow/FlowConfig.java | 2 +- .../biutag/lan/flow/node/ThreeVerifyFlow.java | 3 + .../com/biutag/lan/service/MailService.java | 5 +- .../com/biutag/lan/service/WorkService.java | 2 +- .../test/java/com/biutag/lan/JsonTest.java | 10 +- .../biutag/lan/SpringBootMailImportTest.java | 162 ++++++++++++++++++ mailbox-outer-admin/pom.xml | 41 +++++ .../src/main/resources/application.yml | 2 +- .../src/main/resources/license/license.dat | 1 + 14 files changed, 247 insertions(+), 125 deletions(-) delete mode 100644 mailbox-lan/src/main/java/com/biutag/lan/controller/system/CrontabController.java create mode 100644 mailbox-lan/src/test/java/com/biutag/lan/SpringBootMailImportTest.java create mode 100644 mailbox-outer-admin/src/main/resources/license/license.dat diff --git a/mailbox-common/src/main/java/com/biutag/exception/GlobalException.java b/mailbox-common/src/main/java/com/biutag/exception/GlobalException.java index 2485afc..64fa8d2 100644 --- a/mailbox-common/src/main/java/com/biutag/exception/GlobalException.java +++ b/mailbox-common/src/main/java/com/biutag/exception/GlobalException.java @@ -36,10 +36,11 @@ public class GlobalException { @ExceptionHandler(Exception.class) @ResponseBody public AjaxResult handleException(Exception e, HttpServletResponse response) { + log.error("系统异常 {}", e.getMessage(), e); if ("application/javascript;charset=UTF-8".equals(response.getHeader("Content-Type"))) { return null; } - log.error("系统异常 {}", e.getMessage(), e); + return AjaxResult.failed(ErrorEnum.SYSTEM_ERROR.getCode(), e.getMessage()); } diff --git a/mailbox-lan/pom.xml b/mailbox-lan/pom.xml index be13722..93b8143 100644 --- a/mailbox-lan/pom.xml +++ b/mailbox-lan/pom.xml @@ -140,6 +140,12 @@ compile + + + + + + diff --git a/mailbox-lan/src/main/java/com/biutag/lan/config/AdminInterceptor.java b/mailbox-lan/src/main/java/com/biutag/lan/config/AdminInterceptor.java index d0c0191..ac8c7ee 100644 --- a/mailbox-lan/src/main/java/com/biutag/lan/config/AdminInterceptor.java +++ b/mailbox-lan/src/main/java/com/biutag/lan/config/AdminInterceptor.java @@ -6,12 +6,10 @@ import com.alibaba.fastjson2.JSON; import com.biutag.aop.NotLogin; import com.biutag.aop.NotPower; import com.biutag.core.AjaxResult; -import com.biutag.enums.ErrorEnum; import com.biutag.exception.LoginException; import com.biutag.lan.util.LoginUserHelper; import com.biutag.lan.vo.system.LoginUser; import com.biutag.util.StringUtils; -import com.biutag.util.YmlUtils; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.jetbrains.annotations.NotNull; @@ -20,8 +18,6 @@ import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.List; /** * 拦截器 @@ -32,9 +28,9 @@ public class AdminInterceptor implements HandlerInterceptor { /** * 前置处理器 * - * @param request 请求 + * @param request 请求 * @param response 响应 - * @param handler 处理 + * @param handler 处理 * @return boolean * @throws Exception 异常 */ @@ -57,33 +53,16 @@ public class AdminInterceptor implements HandlerInterceptor { response.getWriter().print(JSON.toJSONString(result)); return false; } - - // 演示环境拦截 - String env = YmlUtils.get("like.production"); - if (StringUtils.isNotNull(env) && env.equals("true")) { - String prefix = "/api/"; - String route = request.getRequestURI().replaceFirst(prefix, ""); - String auths = route.replace("/", ":"); - List ignoreUrl = Arrays.asList("system:login", "system:logout"); - if (request.getMethod().equals("POST") && !ignoreUrl.contains(auths)) { - String message = "演示环境不支持修改数据,请下载源码本地部署体验"; - AjaxResult result = AjaxResult.failed(ErrorEnum.NO_PERMISSION.getCode(), message); - response.getWriter().print(JSON.toJSONString(result)); - return false; - } - } - - // 验证通过继续 return HandlerInterceptor.super.preHandle(request, response, handler); } /** * 后置处理器 * - * @param request 请求 + * @param request 请求 * @param response 响应 - * @param handler 处理 - * @param ex 异常 + * @param handler 处理 + * @param ex 异常 * @throws Exception 异常 */ @Override @@ -101,37 +80,26 @@ public class AdminInterceptor implements HandlerInterceptor { * @return Method * @throws Exception 异常 */ - private Method obtainAop(@NotNull Object handler) throws Exception { - String[] objArr = handler.toString().split("#"); - String methodStr = objArr[1].split("\\(")[0]; - String classStr = objArr[0]; - Class clazz = Class.forName(classStr); - - Method[] methods = clazz.getDeclaredMethods(); - for (Method method : methods) { - if (method.getName().equals(methodStr)) { - return method; - } - } - - return null; + private Method obtainAop(@NotNull Object handler) { + HandlerMethod handlerMethod = (HandlerMethod) handler; + return handlerMethod.getMethod(); } /** * 登录验证 * * @param method 方法类 - * @author + * @author */ private void checkLogin(Method method, String reqUri) { - for (int i=0; i<=0; i++) { + for (int i = 0; i <= 0; i++) { // 免登校验 if (StringUtils.isNotNull(method) && method.isAnnotationPresent(NotLogin.class)) { break; } - // 用户校验 + // 用户校验 LoginUser adminUser = LoginUserHelper.getCurrentUser(); - // 写入线程 + // 写入线程 AdminThreadLocal.put("adminId", adminUser.getId()); AdminThreadLocal.put("empNo", adminUser.getEmpNo()); AdminThreadLocal.put("name", adminUser.getName()); @@ -150,11 +118,11 @@ public class AdminInterceptor implements HandlerInterceptor { * 权限验证 * * @param method 方法类 - * @param uri 请求路由 - * @author + * @param uri 请求路由 + * @author */ private void checkAuth(Method method, String uri) { - for (int i=0; i<=0; i++) { + for (int i = 0; i <= 0; i++) { // 免权限校验 if (StringUtils.isNotNull(method) && method.isAnnotationPresent(NotPower.class)) { break; @@ -176,4 +144,5 @@ public class AdminInterceptor implements HandlerInterceptor { StpUtil.checkPermission(auths); } } + } diff --git a/mailbox-lan/src/main/java/com/biutag/lan/controller/system/CrontabController.java b/mailbox-lan/src/main/java/com/biutag/lan/controller/system/CrontabController.java deleted file mode 100644 index bf4627b..0000000 --- a/mailbox-lan/src/main/java/com/biutag/lan/controller/system/CrontabController.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.biutag.lan.controller.system; - -import com.biutag.lan.aop.Log; -import com.biutag.lan.service.ICrontabService; -import com.biutag.lan.validate.commons.IdValidate; -import com.biutag.lan.validate.commons.PageValidate; -import com.biutag.lan.validate.crontab.CrontabCreateValidate; -import com.biutag.lan.validate.crontab.CrontabUpdateValidate; -import com.biutag.lan.vo.system.CrontabDetailVo; -import com.biutag.lan.vo.system.CrontabListedVo; -import com.biutag.core.AjaxResult; -import com.biutag.core.PageResult; -import com.biutag.validator.annotation.IDMust; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import jakarta.annotation.Resource; -import org.quartz.SchedulerException; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - - - -@RestController -@RequestMapping("api/crontab") -@Api(tags = "计划任务管理") -public class CrontabController { - - @Resource - ICrontabService iCrontabService; - - @GetMapping("/list") - @ApiOperation(value="计划任务列表") - public AjaxResult< PageResult> list(@Validated PageValidate pageValidate) { - PageResult list = iCrontabService.list(pageValidate); - return AjaxResult.success(list); - } - - @GetMapping("/detail") - @ApiOperation(value="计划任务详情") - public AjaxResult detail(@Validated @IDMust() @RequestParam("id") Integer id) { - CrontabDetailVo vo = iCrontabService.detail(id); - return AjaxResult.success(vo); - } - - @Log(title = "计划任务新增") - @PostMapping("/add") - @ApiOperation(value="计划任务新增") - public AjaxResult add(@Validated @RequestBody CrontabCreateValidate createValidate) throws SchedulerException { - iCrontabService.add(createValidate); - return AjaxResult.success(); - } - - @Log(title = "计划任务编辑") - @PostMapping("/edit") - @ApiOperation(value="计划任务编辑") - public AjaxResult edit(@Validated @RequestBody CrontabUpdateValidate updateValidate) throws SchedulerException { - iCrontabService.edit(updateValidate); - return AjaxResult.success(); - } - - @Log(title = "计划任务删除") - @PostMapping("/del") - @ApiOperation(value="计划任务删除") - public AjaxResult del(@Validated @RequestBody IdValidate idValidate) throws SchedulerException { - iCrontabService.del(idValidate.getId()); - return AjaxResult.success(); - } - -} diff --git a/mailbox-lan/src/main/java/com/biutag/lan/domain/Mail.java b/mailbox-lan/src/main/java/com/biutag/lan/domain/Mail.java index d630177..9709c8b 100644 --- a/mailbox-lan/src/main/java/com/biutag/lan/domain/Mail.java +++ b/mailbox-lan/src/main/java/com/biutag/lan/domain/Mail.java @@ -1,6 +1,7 @@ package com.biutag.lan.domain; import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; @@ -54,7 +55,9 @@ public class Mail { /** * 来信时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime mailTime; + /** * 来源 */ diff --git a/mailbox-lan/src/main/java/com/biutag/lan/flow/FlowConfig.java b/mailbox-lan/src/main/java/com/biutag/lan/flow/FlowConfig.java index fa9c58a..78af335 100644 --- a/mailbox-lan/src/main/java/com/biutag/lan/flow/FlowConfig.java +++ b/mailbox-lan/src/main/java/com/biutag/lan/flow/FlowConfig.java @@ -126,7 +126,7 @@ public class FlowConfig { // 三级机构核查办理 threeVerifyFlow .setFlowNode(getFlowNode(flowNodes, FlowNodeEnum.VERIFY)) - .setActions(Arrays.asList(applyExtensionAction, secondSaveAction, applicationCompletedAction)) + .setActions(Arrays.asList(returnAction, applyExtensionAction, secondSaveAction, applicationCompletedAction)) // 线上申请办结 .next("online", threeLeaderApprovalFlow) // 线下申请办结 diff --git a/mailbox-lan/src/main/java/com/biutag/lan/flow/node/ThreeVerifyFlow.java b/mailbox-lan/src/main/java/com/biutag/lan/flow/node/ThreeVerifyFlow.java index e2b48e1..9404a22 100644 --- a/mailbox-lan/src/main/java/com/biutag/lan/flow/node/ThreeVerifyFlow.java +++ b/mailbox-lan/src/main/java/com/biutag/lan/flow/node/ThreeVerifyFlow.java @@ -43,6 +43,9 @@ public class ThreeVerifyFlow extends Flow { @Override public Flow next(String nextActionKey, String mailId, JSONObject data) { + if (ActionEnum.mailReturn.getValue().equals(nextActionKey)) { + return threeSignFlow.mailReturn(mailId, data); + } // 线下 if (ActionEnum.offline.name().equals(nextActionKey)) { return offline(nextActionKey, mailId, data); diff --git a/mailbox-lan/src/main/java/com/biutag/lan/service/MailService.java b/mailbox-lan/src/main/java/com/biutag/lan/service/MailService.java index b50b48e..5e81f55 100644 --- a/mailbox-lan/src/main/java/com/biutag/lan/service/MailService.java +++ b/mailbox-lan/src/main/java/com/biutag/lan/service/MailService.java @@ -92,7 +92,10 @@ public class MailService extends ServiceImpl { if (!mailSource.getSignFlag()) { flow = SpringUtil.getBean(FirstSignFlow.class); mail = mailSource.toMail(); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().eq(Mail::getContactPhone, mail.getContactPhone()).eq(Mail::getContactName, mail.getContactName()); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(Mail::getContactPhone, mail.getContactPhone()) + .eq(Mail::getContactName, mail.getContactName()) + .orderByDesc(Mail::getCreateTime); flowDetail.setHistorys(list(queryWrapper)); } else { mail = getById(mailId); diff --git a/mailbox-lan/src/main/java/com/biutag/lan/service/WorkService.java b/mailbox-lan/src/main/java/com/biutag/lan/service/WorkService.java index 021d2d5..1867ddf 100644 --- a/mailbox-lan/src/main/java/com/biutag/lan/service/WorkService.java +++ b/mailbox-lan/src/main/java/com/biutag/lan/service/WorkService.java @@ -484,7 +484,7 @@ public class WorkService extends ServiceImpl { } // 申诉状态 if (AppealState.UN_APPEAL.getValue().equals(mailQuery.getAppealState())) { - queryWrapper.eq("mm.satisfied", AppConstants.FALSE).isNull("ma.appeal_state"); + queryWrapper.eq("mm.satisfied", AppConstants.FALSE).eq("mm.completed", AppConstants.TRUE).isNull("ma.appeal_state"); } else { queryWrapper.eq(StrUtil.isNotBlank(mailQuery.getAppealState()), "ma.appeal_state", mailQuery.getAppealState()); } diff --git a/mailbox-lan/src/test/java/com/biutag/lan/JsonTest.java b/mailbox-lan/src/test/java/com/biutag/lan/JsonTest.java index 45d48e2..b76d0f9 100644 --- a/mailbox-lan/src/test/java/com/biutag/lan/JsonTest.java +++ b/mailbox-lan/src/test/java/com/biutag/lan/JsonTest.java @@ -5,6 +5,9 @@ import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import org.junit.jupiter.api.Test; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.Map; @@ -12,10 +15,9 @@ public class JsonTest { @Test public void testJson() { - Map map = new HashMap<>(); - JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(map)); - JSONArray jsonArray = jsonObject.getJSONArray("a"); - System.out.println(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd"); + LocalDate parse = LocalDate.parse("20230915", formatter); + System.out.println(parse.atStartOfDay()); } } diff --git a/mailbox-lan/src/test/java/com/biutag/lan/SpringBootMailImportTest.java b/mailbox-lan/src/test/java/com/biutag/lan/SpringBootMailImportTest.java new file mode 100644 index 0000000..a297446 --- /dev/null +++ b/mailbox-lan/src/test/java/com/biutag/lan/SpringBootMailImportTest.java @@ -0,0 +1,162 @@ +package com.biutag.lan; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.alibaba.excel.read.listener.ReadListener; +import com.alibaba.excel.util.ListUtils; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.biutag.constants.AppConstants; +import com.biutag.entity.setting.DictData; +import com.biutag.entity.system.Dept; +import com.biutag.lan.domain.Mail; +import com.biutag.lan.domain.MailMark; +import com.biutag.lan.domain.MailSource; +import com.biutag.lan.mapper.MailMapper; +import com.biutag.lan.mapper.MailMarkMapper; +import com.biutag.lan.mapper.MailSourceMapper; +import com.biutag.lan.service.IDictDataService; +import com.biutag.lan.service.MailService; +import com.biutag.mapper.setting.DictDataMapper; +import com.biutag.mapper.system.DeptMapper; +import jakarta.annotation.Resource; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; + +@SpringBootTest +public class SpringBootMailImportTest { + + @Resource + private MailService mailService; + + @Resource + private MailMapper mailMapper; + + @Resource + private MailSourceMapper mailSourceMapper; + + @Resource + private MailMarkMapper mailMarkMapper; + @Resource + private DictDataMapper dictDataMapper; + + @Resource + private DeptMapper deptMapper; + @Test + public void test() { + ExcelListener excelListener = new ExcelListener(); + EasyExcel.read("D:\\deploy\\线下台账(0116).xlsx", excelListener).sheet().doRead(); + List> dataList = excelListener.getDataList(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd"); + System.out.println(dataList); + LocalDateTime now = LocalDateTime.now(); + // mail mail_souce mail_mark + for (int i = 1; i < 2; i++) { + LinkedHashMap map = dataList.get(i); + MailSource mailSource = new MailSource(); + DictData dictData = dictDataMapper.selectOne(new LambdaQueryWrapper().eq(DictData::getName, map.get(1)).eq(DictData::getTypeId, 7)); + System.out.println(dictData.getValue()); + Integer seqVal = mailMapper.getMailIdSeqVal(); + int length = 6 - seqVal.toString().length(); + StringBuilder zeroString = new StringBuilder(); + for (int j = 0; j < length; j++) { + zeroString.append('0'); + } + String id = map.get(2) + "0000" + dictData.getRemark() + zeroString + seqVal; + LocalDateTime mailTime = LocalDate.parse(map.get(2), formatter).atStartOfDay(); + mailSource.setId(id).setContactName(map.get(3)).setContactPhone(map.get(4)).setContent(map.get(7)) + .setMailTime(mailTime).setCreateTime(now).setSignFlag(true).setAttachments("[]"); + + Dept dept = deptMapper.selectOne(new QueryWrapper().eq("name", map.get(6))); + Dept pDept = deptMapper.selectById(dept.getPid()); + Mail mail = mailSource.toMail() + .setMailLevel("一般信件") + .setMailCategory(map.get(11)) + .setMailFirstCategory(map.get(9)) + .setMailSecondCategory(map.get(10)) + .setMailThreeCategory(map.get(11)) + .setSecondDeptId(dept.getPid()) + .setSecondDeptName(pDept.getName()) + .setThreeDeptId(dept.getId()) + .setThreeDeptName(dept.getName()) + .setCreateTime(now) + .setUpdateTime(now) + .setFlowKey("completion") + .setFlowName("已办结") + .setMailState("completion") + .setSimpleFlowFlag(false) + .setExtensionFlag(false) + .setSource(dictData.getValue()) + .setQualifiedProcessingStatus("合格") + .setProblemSolvingStatus(true) + .setSatisfactionStatus(map.get(12).equals("满意") || "申诉通过".equals(map.get(13)) ? "非常满意" : "不满意"); + + MailMark mailMark = new MailMark(); + + mailMark.setMailId(id).setCompleted(AppConstants.TRUE) + .setResolved(AppConstants.TRUE) + .setSatisfied(map.get(12).equals("满意") || "申诉通过".equals(map.get(13)) ?AppConstants.TRUE : AppConstants.FALSE) + .setThreeDeptName(dept.getName()) + .setThreeDeptId(dept.getId()) + .setSecondDeptId(dept.getPid()) + .setSecondDeptName(pDept.getName()) + .setCompletionTime(mailTime.plusDays(4)) + .setSignTimeout(false) + .setContactWriterTimeout(false) + .setProcessTimeout(false); + mailSourceMapper.insert(mailSource); + mailService.save(mail); + mailMarkMapper.insert(mailMark); + } + + } + + @Setter + @Getter + public static class DemoData { + + @ExcelProperty(index= 0) + private String orderNo; + + @ExcelProperty(index= 1) + private String source; + + @ExcelProperty(index= 2) + private String date; + + @ExcelProperty(index= 3) + private String contactName; + + @ExcelProperty(index= 4) + private String contactPhone; + + } + + static class ExcelListener extends AnalysisEventListener> { + + @Getter + private List> dataList = new ArrayList<>(); + + @Override + public void invoke(LinkedHashMap data, AnalysisContext context) { + dataList.add(data); // 将每行数据存入列表 + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + System.out.println("All data has been read."); + // 在此处可以对 dataList 中的数据进行处理 + } + } +} diff --git a/mailbox-outer-admin/pom.xml b/mailbox-outer-admin/pom.xml index d70f4df..07930a9 100644 --- a/mailbox-outer-admin/pom.xml +++ b/mailbox-outer-admin/pom.xml @@ -84,4 +84,45 @@ + + + + src/main/resources + false + + + src/main/resources + + application.yml + + true + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + repackage + + + + + + + + mailbox-outer-admin + + diff --git a/mailbox-outer-admin/src/main/resources/application.yml b/mailbox-outer-admin/src/main/resources/application.yml index 3857d98..d0e0610 100644 --- a/mailbox-outer-admin/src/main/resources/application.yml +++ b/mailbox-outer-admin/src/main/resources/application.yml @@ -2,7 +2,7 @@ server: port: 8083 tongweb: license: - path: license/license.dat + path: classpath:license/license.dat spring: datasource: diff --git a/mailbox-outer-admin/src/main/resources/license/license.dat b/mailbox-outer-admin/src/main/resources/license/license.dat new file mode 100644 index 0000000..1db6bc2 --- /dev/null +++ b/mailbox-outer-admin/src/main/resources/license/license.dat @@ -0,0 +1 @@ +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NrN \ No newline at end of file