From 6a812631889fe00533ca29cd883d1172f380f817 Mon Sep 17 00:00:00 2001 From: 王彪总 Date: Thu, 28 May 2026 17:25:46 +0800 Subject: [PATCH] fix(config): 更新配置文件和修复分页计算问题 --- service-api/src/main/java/com/java110/api/smo/file/impl/AddFileSMOImpl.java | 54 ++++++++++++++++++++++++++++++++++++++++-------------- service-community/src/main/java/com/java110/community/cmd/ownerRepair/GrabbingRepairCmd.java | 1 + service-community/src/main/java/com/java110/community/cmd/ownerRepair/SaveOwnerRepairCmd.java | 25 +++++++++++++------------ service-user/src/main/java/com/java110/user/cmd/property/AttendancePunchCmd.java | 38 +++++++++++++++++++++++++++++--------- service-user/src/main/java/com/java110/user/dao/impl/AttendanceRecordV1ServiceDaoImpl.java | 16 ++++++++++++++++ service-user/src/main/java/com/java110/user/dao/property/IAttendanceRecordV1ServiceDao.java | 4 ++++ service-user/src/main/resources/mapper/property/AttendanceRecordMapper.xml | 13 +++++++++++++ springboot/src/main/resources/application-prod.yml | 3 --- 8 files changed, 116 insertions(+), 38 deletions(-) diff --git a/service-api/src/main/java/com/java110/api/smo/file/impl/AddFileSMOImpl.java b/service-api/src/main/java/com/java110/api/smo/file/impl/AddFileSMOImpl.java index f9d0857..27d06c4 100644 --- a/service-api/src/main/java/com/java110/api/smo/file/impl/AddFileSMOImpl.java +++ b/service-api/src/main/java/com/java110/api/smo/file/impl/AddFileSMOImpl.java @@ -3,6 +3,10 @@ package com.java110.api.smo.file.impl; import com.alibaba.fastjson.JSONObject; import com.java110.api.smo.DefaultAbstractComponentSMO; import com.java110.api.smo.file.IAddFileSMO; +import com.java110.config.properties.code.Java110Properties; +import com.java110.core.client.CosUploadTemplate; +import com.java110.core.client.FtpUploadTemplate; +import com.java110.core.client.OssUploadTemplate; import com.java110.core.context.IPageData; import com.java110.core.factory.GenerateCodeFactory; import com.java110.dto.file.FileDto; @@ -10,8 +14,10 @@ import com.java110.intf.common.IFileInnerServiceSMO; import com.java110.utils.cache.MappingCache; import com.java110.utils.constant.MappingConstant; import com.java110.utils.util.Assert; -import com.java110.utils.util.Base64Convert; import com.java110.utils.util.BeanConvertUtil; +import com.java110.utils.util.COSUtil; +import com.java110.utils.util.DateUtil; +import com.java110.utils.util.OSSUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -23,6 +29,7 @@ import com.java110.vo.ResultVo; import java.io.IOException; import java.io.InputStream; +import java.util.UUID; /** * 添加项目服务实现类 @@ -37,7 +44,20 @@ public class AddFileSMOImpl extends DefaultAbstractComponentSMO implements IAddF @Autowired private IFileInnerServiceSMO fileInnerServiceSMOImpl; + @Autowired + private Java110Properties java110Properties; + + @Autowired + private OssUploadTemplate ossUploadTemplate; + @Autowired + private CosUploadTemplate cosUploadTemplate; + + @Autowired + private FtpUploadTemplate ftpUploadTemplate; + + private static final String ROOT_PATH = "hc/"; + private static final String IMAGE_DEFAULT_PATH = "img/"; @Override public ResponseEntity saveFile(IPageData pd, MultipartFile uploadFile) throws IOException { @@ -48,24 +68,31 @@ public class AddFileSMOImpl extends DefaultAbstractComponentSMO implements IAddF throw new IllegalArgumentException("上传文件超过200兆"); } Assert.hasKeyAndValue(paramIn, "suffix", "必填,请填写文件类型"); - is = uploadFile.getInputStream(); - String fileContext = Base64Convert.ioToBase64(is); - paramIn.put("context", fileContext); - paramIn.put("fileName", uploadFile.getOriginalFilename()); - FileDto fileDto = BeanConvertUtil.covertBean(paramIn, FileDto.class); - fileDto.setCommunityId("-1"); - fileDto.setFileId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_file_id)); + String suffix = paramIn.getString("suffix"); + String datePath = DateUtil.getNowII(); + String urlPath = IMAGE_DEFAULT_PATH + datePath + "/" + UUID.randomUUID().toString() + "." + suffix; - String fileName = fileInnerServiceSMOImpl.saveFile(fileDto); + String ossSwitch = MappingCache.getValue(MappingConstant.FILE_DOMAIN, OSSUtil.OSS_SWITCH); + is = uploadFile.getInputStream(); + if (OSSUtil.OSS_SWITCH_OSS.equals(ossSwitch)) { + ossUploadTemplate.upload(is, ROOT_PATH + urlPath); + } else if (COSUtil.COS_SWITCH_COS.equals(ossSwitch)) { + cosUploadTemplate.upload(is, ROOT_PATH + urlPath); + } else { + String ftpServer = MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_SERVER); + int ftpPort = Integer.parseInt(MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_PORT)); + String ftpUserName = MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_USERNAME); + String ftpUserPassword = MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_USERPASSWORD); + ftpUploadTemplate.upload(is, ftpServer, ftpPort, ftpUserName, ftpUserPassword, ROOT_PATH + urlPath); + } JSONObject outParam = new JSONObject(); - outParam.put("fileId", fileName); + outParam.put("fileId", urlPath); String imgUrl = MappingCache.getValue(MappingConstant.FILE_DOMAIN, "IMG_PATH"); - outParam.put("url", imgUrl + fileName); + outParam.put("url", imgUrl + urlPath); - ResponseEntity responseEntity = new ResponseEntity(outParam.toJSONString(), HttpStatus.OK); - return responseEntity; + return new ResponseEntity<>(outParam.toJSONString(), HttpStatus.OK); } finally { if (is != null) { try { @@ -74,7 +101,6 @@ public class AddFileSMOImpl extends DefaultAbstractComponentSMO implements IAddF } } } - } @Override diff --git a/service-community/src/main/java/com/java110/community/cmd/ownerRepair/GrabbingRepairCmd.java b/service-community/src/main/java/com/java110/community/cmd/ownerRepair/GrabbingRepairCmd.java index 70fb7c8..0ae62d3 100644 --- a/service-community/src/main/java/com/java110/community/cmd/ownerRepair/GrabbingRepairCmd.java +++ b/service-community/src/main/java/com/java110/community/cmd/ownerRepair/GrabbingRepairCmd.java @@ -186,6 +186,7 @@ public class GrabbingRepairCmd extends Cmd { RepairTypeUserDto repairTypeUser = new RepairTypeUserDto(); repairTypeUser.setStaffId(staffId); repairTypeUser.setRepairType(repairType); + repairTypeUser.setCommunityId(reqJson.getString("communityId")); // 查询工单设置表 List repairTypeUserDtos = repairTypeUserInnerServiceSMO.queryRepairTypeUsers(repairTypeUser); diff --git a/service-community/src/main/java/com/java110/community/cmd/ownerRepair/SaveOwnerRepairCmd.java b/service-community/src/main/java/com/java110/community/cmd/ownerRepair/SaveOwnerRepairCmd.java index 1e86284..7c55488 100644 --- a/service-community/src/main/java/com/java110/community/cmd/ownerRepair/SaveOwnerRepairCmd.java +++ b/service-community/src/main/java/com/java110/community/cmd/ownerRepair/SaveOwnerRepairCmd.java @@ -170,7 +170,7 @@ public class SaveOwnerRepairCmd extends Cmd { if (ListUtil.isNull(feeConfigDtos)) { return; // 没有配置默认费用项,直接返回 } - + // 查询处理中的报修费用 FeeDto feeDto = new FeeDto(); feeDto.setConfigId(feeConfigDtos.get(0).getConfigId()); // 使用第一个默认配置 @@ -180,7 +180,7 @@ public class SaveOwnerRepairCmd extends Cmd { if (ListUtil.isNull(feeDtos)) { return; // 没有处理中的费用,允许报修 } - + // 检查未处理费用条数限制 String repairFeeNumber = MappingCache.getValue(MappingConstant.REPAIR_DOMAIN, REPAIR_FEE_NUMBER); if (!StringUtil.isInteger(repairFeeNumber)) { @@ -211,26 +211,27 @@ public class SaveOwnerRepairCmd extends Cmd { repairSettingDto.setRepairType(reqJson.getString("repairType")); List repairSettingDtos = repairSettingV1InnerServiceSMOImpl.queryRepairSettings(repairSettingDto); if (ListUtil.isNull(repairSettingDtos)) { - throw new CmdException("报销刘类型不存在"); + + throw new CmdException("报修类型不存在"); } // 创建报修池记录 RepairPoolPo repairPoolPo = BeanConvertUtil.covertBean(reqJson, RepairPoolPo.class); repairPoolPo.setRepairId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_repairId)); repairPoolPo.setState(RepairDto.STATE_WAIT); // 设置初始状态为等待处理 - + // 计算超时时间 String appointmentTime = repairPoolPo.getAppointmentTime(); Date sAppTime = DateUtil.getDateFromStringA(appointmentTime); String timeout = DateUtil.getAddHoursStringA(sAppTime, repairSettingDtos.get(0).getDoTime()); repairPoolPo.setTimeout(timeout); - + // 保存报修池记录 int flag = repairPoolV1InnerServiceSMOImpl.saveRepairPoolNew(repairPoolPo); if (flag < 1) { throw new CmdException("修改失败"); } - + // 创建报修用户记录 RepairUserPo repairUserPo = BeanConvertUtil.covertBean(reqJson, RepairUserPo.class); repairUserPo.setContext("订单提交"); @@ -245,13 +246,13 @@ public class SaveOwnerRepairCmd extends Cmd { repairUserPo.setState(RepairUserDto.STATE_SUBMIT); // 设置状态为已提交 repairUserPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); // 设置结束时间为当前时间 repairUserPo.setRuId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_ruId)); - + // 保存报修用户记录 flag = repairUserV1InnerServiceSMOImpl.saveRepairUserNew(repairUserPo); if (flag < 1) { throw new CmdException("修改用户失败"); } - + // 保存报修图片 saveRepairPhoto(reqJson, repairPoolPo.getRepairId()); @@ -279,7 +280,7 @@ public class SaveOwnerRepairCmd extends Cmd { if (ListUtil.isNull(photos)) { return; // 没有图片,直接返回 } - + // 遍历所有图片 for (int _photoIndex = 0; _photoIndex < photos.size(); _photoIndex++) { String _photo = photos.getString(_photoIndex); @@ -298,7 +299,7 @@ public class SaveOwnerRepairCmd extends Cmd { fileDto.setCommunityId(reqJson.getString("communityId")); _photo = fileInnerServiceSMOImpl.saveFile(fileDto); // 保存文件并返回文件路径 } - + // 创建文件关联记录 JSONObject businessUnit = new JSONObject(); businessUnit.put("fileRelId", GenerateCodeFactory.getGeneratorId("12")); @@ -307,7 +308,7 @@ public class SaveOwnerRepairCmd extends Cmd { businessUnit.put("objId", repairId); // 关联报修ID businessUnit.put("fileRealName", _photo.toString()); businessUnit.put("fileSaveName", _photo.toString()); - + FileRelPo fileRelPo = BeanConvertUtil.covertBean(businessUnit, FileRelPo.class); flag = fileRelInnerServiceSMOImpl.saveFileRel(fileRelPo); if (flag < 1) { @@ -315,4 +316,4 @@ public class SaveOwnerRepairCmd extends Cmd { } } } -} \ No newline at end of file +} diff --git a/service-user/src/main/java/com/java110/user/cmd/property/AttendancePunchCmd.java b/service-user/src/main/java/com/java110/user/cmd/property/AttendancePunchCmd.java index 98c2a66..9ad050a 100644 --- a/service-user/src/main/java/com/java110/user/cmd/property/AttendancePunchCmd.java +++ b/service-user/src/main/java/com/java110/user/cmd/property/AttendancePunchCmd.java @@ -31,6 +31,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -63,22 +64,41 @@ public class AttendancePunchCmd extends Cmd { @Override @Java110Transactional public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException { - // 校验当天是否已打同类型卡 - Map checkParams = new HashMap<>(); - checkParams.put("userId", reqJson.getString("userId")); - checkParams.put("punchType", reqJson.getString("punchType")); - Map existRecord = attendanceRecordV1ServiceDao.queryTodayAttendanceByType(checkParams); + String userId = reqJson.getString("userId"); + String punchType = reqJson.getString("punchType"); + String typeName = "ON".equals(punchType) ? "上班" : "下班"; + + // 1. 当天同类型打卡不超过3次 + Map countParams = new HashMap<>(); + countParams.put("userId", userId); + countParams.put("punchType", punchType); + int todayCount = attendanceRecordV1ServiceDao.countTodayByType(countParams); + if (todayCount >= 3) { + throw new CmdException("今日" + typeName + "打卡已达3次,无法继续打卡"); + } - if (existRecord != null) { - throw new CmdException("今日已" + ("ON".equals(reqJson.getString("punchType")) ? "上班" : "下班") + "打卡,请勿重复打卡"); + // 2. 检查最近一次打卡时间,同类型需间隔7小时 + Map lastPunchParams = new HashMap<>(); + lastPunchParams.put("userId", userId); + Map lastPunch = attendanceRecordV1ServiceDao.getLastPunch(lastPunchParams); + if (lastPunch != null) { + Date lastPunchTime = (Date) lastPunch.get("punch_time"); + Calendar cal = Calendar.getInstance(); + cal.setTime(lastPunchTime); + cal.add(Calendar.HOUR_OF_DAY, 7); + if (new Date().before(cal.getTime())) { + String lastType = "ON".equals(lastPunch.get("punch_type")) ? "上班" : "下班"; + throw new CmdException("上次" + lastType + "打卡时间不足7小时,请" + + new java.text.SimpleDateFormat("HH:mm").format(cal.getTime()) + "后再打卡"); + } } AttendanceRecordPo po = new AttendanceRecordPo(); po.setId(GenerateCodeFactory.getGeneratorId("10")); - po.setUserId(reqJson.getString("userId")); + po.setUserId(userId); po.setUserName(reqJson.containsKey("userName") ? reqJson.getString("userName") : ""); po.setWorkType(reqJson.containsKey("workType") ? reqJson.getString("workType") : ""); - po.setPunchType(reqJson.getString("punchType")); + po.setPunchType(punchType); po.setPunchTime(new Date()); po.setPunchAddress(reqJson.containsKey("punchAddress") ? reqJson.getString("punchAddress") : ""); po.setLongitude(reqJson.getBigDecimal("longitude")); diff --git a/service-user/src/main/java/com/java110/user/dao/impl/AttendanceRecordV1ServiceDaoImpl.java b/service-user/src/main/java/com/java110/user/dao/impl/AttendanceRecordV1ServiceDaoImpl.java index 6c2cdd4..fb3bc6a 100644 --- a/service-user/src/main/java/com/java110/user/dao/impl/AttendanceRecordV1ServiceDaoImpl.java +++ b/service-user/src/main/java/com/java110/user/dao/impl/AttendanceRecordV1ServiceDaoImpl.java @@ -32,4 +32,20 @@ public class AttendanceRecordV1ServiceDaoImpl extends BaseServiceDao implements List result = sqlSessionTemplate.selectList("AttendanceRecordV1ServiceDaoImpl.queryTodayAttendanceByType", params); return (result != null && !result.isEmpty()) ? result.get(0) : null; } + + @Override + public int countTodayByType(Map params) { + List result = sqlSessionTemplate.selectList("AttendanceRecordV1ServiceDaoImpl.countTodayByType", params); + if (result == null || result.isEmpty()) return 0; + Object count = result.get(0); + if (count instanceof Integer) return (Integer) count; + if (count instanceof Long) return ((Long) count).intValue(); + return Integer.parseInt(count.toString()); + } + + @Override + public Map getLastPunch(Map params) { + List result = sqlSessionTemplate.selectList("AttendanceRecordV1ServiceDaoImpl.getLastPunch", params); + return (result != null && !result.isEmpty()) ? result.get(0) : null; + } } diff --git a/service-user/src/main/java/com/java110/user/dao/property/IAttendanceRecordV1ServiceDao.java b/service-user/src/main/java/com/java110/user/dao/property/IAttendanceRecordV1ServiceDao.java index fa9eefb..1918bb6 100644 --- a/service-user/src/main/java/com/java110/user/dao/property/IAttendanceRecordV1ServiceDao.java +++ b/service-user/src/main/java/com/java110/user/dao/property/IAttendanceRecordV1ServiceDao.java @@ -10,4 +10,8 @@ public interface IAttendanceRecordV1ServiceDao { int queryAttendanceRecordsCount(Map params); /** 检查当天是否已打同类型卡 */ Map queryTodayAttendanceByType(Map params); + /** 统计当天同类型打卡次数 */ + int countTodayByType(Map params); + /** 获取用户最近一次打卡记录 */ + Map getLastPunch(Map params); } diff --git a/service-user/src/main/resources/mapper/property/AttendanceRecordMapper.xml b/service-user/src/main/resources/mapper/property/AttendanceRecordMapper.xml index 3112396..dbe799e 100644 --- a/service-user/src/main/resources/mapper/property/AttendanceRecordMapper.xml +++ b/service-user/src/main/resources/mapper/property/AttendanceRecordMapper.xml @@ -38,4 +38,17 @@ LIMIT 1 + + + + diff --git a/springboot/src/main/resources/application-prod.yml b/springboot/src/main/resources/application-prod.yml index 41c80e7..e8ccf8a 100644 --- a/springboot/src/main/resources/application-prod.yml +++ b/springboot/src/main/resources/application-prod.yml @@ -2,9 +2,6 @@ server: port: 8008 tomcat: uri-encoding: UTF-8 - - - spring: servlet: multipart: -- libgit2 0.21.4