Commit 6a812631889fe00533ca29cd883d1172f380f817

Authored by 王彪总
1 parent 842c386b

fix(config): 更新配置文件和修复分页计算问题

- 在.gitignore中添加.mcp.json文件忽略
- 更新application-dev.yml中的Redis和数据库连接配置,并禁用Eureka客户端
- 修复CosUploadTemplate、FtpUploadTemplate和OssUploadTemplate中的空文件上传验证
- 更新java110.properties中的映射路径配置以支持通配符
- 修复社区服务中分页计算逻辑,添加默认行数和零值检查
- 移除系统用户查询中的管理员权限验证
- 在logback配置文件中添加请求响应日志和API异常日志输出
- 修复Maven打包阶段配置,将解包阶段从generate-resources改为package
- 添加hibernate-validator依赖并排除javafx.base冲突
- 扩展文件上传组件以支持multipart文件上传和IP地址获取功能
service-api/src/main/java/com/java110/api/smo/file/impl/AddFileSMOImpl.java
... ... @@ -3,6 +3,10 @@ package com.java110.api.smo.file.impl;
3 3 import com.alibaba.fastjson.JSONObject;
4 4 import com.java110.api.smo.DefaultAbstractComponentSMO;
5 5 import com.java110.api.smo.file.IAddFileSMO;
  6 +import com.java110.config.properties.code.Java110Properties;
  7 +import com.java110.core.client.CosUploadTemplate;
  8 +import com.java110.core.client.FtpUploadTemplate;
  9 +import com.java110.core.client.OssUploadTemplate;
6 10 import com.java110.core.context.IPageData;
7 11 import com.java110.core.factory.GenerateCodeFactory;
8 12 import com.java110.dto.file.FileDto;
... ... @@ -10,8 +14,10 @@ import com.java110.intf.common.IFileInnerServiceSMO;
10 14 import com.java110.utils.cache.MappingCache;
11 15 import com.java110.utils.constant.MappingConstant;
12 16 import com.java110.utils.util.Assert;
13   -import com.java110.utils.util.Base64Convert;
14 17 import com.java110.utils.util.BeanConvertUtil;
  18 +import com.java110.utils.util.COSUtil;
  19 +import com.java110.utils.util.DateUtil;
  20 +import com.java110.utils.util.OSSUtil;
15 21 import org.springframework.beans.factory.annotation.Autowired;
16 22 import org.springframework.http.HttpStatus;
17 23 import org.springframework.http.ResponseEntity;
... ... @@ -23,6 +29,7 @@ import com.java110.vo.ResultVo;
23 29  
24 30 import java.io.IOException;
25 31 import java.io.InputStream;
  32 +import java.util.UUID;
26 33  
27 34 /**
28 35 * 添加项目服务实现类
... ... @@ -37,7 +44,20 @@ public class AddFileSMOImpl extends DefaultAbstractComponentSMO implements IAddF
37 44 @Autowired
38 45 private IFileInnerServiceSMO fileInnerServiceSMOImpl;
39 46  
  47 + @Autowired
  48 + private Java110Properties java110Properties;
  49 +
  50 + @Autowired
  51 + private OssUploadTemplate ossUploadTemplate;
40 52  
  53 + @Autowired
  54 + private CosUploadTemplate cosUploadTemplate;
  55 +
  56 + @Autowired
  57 + private FtpUploadTemplate ftpUploadTemplate;
  58 +
  59 + private static final String ROOT_PATH = "hc/";
  60 + private static final String IMAGE_DEFAULT_PATH = "img/";
41 61  
42 62 @Override
43 63 public ResponseEntity<String> saveFile(IPageData pd, MultipartFile uploadFile) throws IOException {
... ... @@ -48,24 +68,31 @@ public class AddFileSMOImpl extends DefaultAbstractComponentSMO implements IAddF
48 68 throw new IllegalArgumentException("上传文件超过200兆");
49 69 }
50 70 Assert.hasKeyAndValue(paramIn, "suffix", "必填,请填写文件类型");
51   - is = uploadFile.getInputStream();
52   - String fileContext = Base64Convert.ioToBase64(is);
53   - paramIn.put("context", fileContext);
54   - paramIn.put("fileName", uploadFile.getOriginalFilename());
55 71  
56   - FileDto fileDto = BeanConvertUtil.covertBean(paramIn, FileDto.class);
57   - fileDto.setCommunityId("-1");
58   - fileDto.setFileId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_file_id));
  72 + String suffix = paramIn.getString("suffix");
  73 + String datePath = DateUtil.getNowII();
  74 + String urlPath = IMAGE_DEFAULT_PATH + datePath + "/" + UUID.randomUUID().toString() + "." + suffix;
59 75  
60   - String fileName = fileInnerServiceSMOImpl.saveFile(fileDto);
  76 + String ossSwitch = MappingCache.getValue(MappingConstant.FILE_DOMAIN, OSSUtil.OSS_SWITCH);
  77 + is = uploadFile.getInputStream();
  78 + if (OSSUtil.OSS_SWITCH_OSS.equals(ossSwitch)) {
  79 + ossUploadTemplate.upload(is, ROOT_PATH + urlPath);
  80 + } else if (COSUtil.COS_SWITCH_COS.equals(ossSwitch)) {
  81 + cosUploadTemplate.upload(is, ROOT_PATH + urlPath);
  82 + } else {
  83 + String ftpServer = MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_SERVER);
  84 + int ftpPort = Integer.parseInt(MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_PORT));
  85 + String ftpUserName = MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_USERNAME);
  86 + String ftpUserPassword = MappingCache.getValue(FtpUploadTemplate.FTP_DOMAIN, FtpUploadTemplate.FTP_USERPASSWORD);
  87 + ftpUploadTemplate.upload(is, ftpServer, ftpPort, ftpUserName, ftpUserPassword, ROOT_PATH + urlPath);
  88 + }
61 89  
62 90 JSONObject outParam = new JSONObject();
63   - outParam.put("fileId", fileName);
  91 + outParam.put("fileId", urlPath);
64 92 String imgUrl = MappingCache.getValue(MappingConstant.FILE_DOMAIN, "IMG_PATH");
65   - outParam.put("url", imgUrl + fileName);
  93 + outParam.put("url", imgUrl + urlPath);
66 94  
67   - ResponseEntity<String> responseEntity = new ResponseEntity<String>(outParam.toJSONString(), HttpStatus.OK);
68   - return responseEntity;
  95 + return new ResponseEntity<>(outParam.toJSONString(), HttpStatus.OK);
69 96 } finally {
70 97 if (is != null) {
71 98 try {
... ... @@ -74,7 +101,6 @@ public class AddFileSMOImpl extends DefaultAbstractComponentSMO implements IAddF
74 101 }
75 102 }
76 103 }
77   -
78 104 }
79 105  
80 106 @Override
... ...
service-community/src/main/java/com/java110/community/cmd/ownerRepair/GrabbingRepairCmd.java
... ... @@ -186,6 +186,7 @@ public class GrabbingRepairCmd extends Cmd {
186 186 RepairTypeUserDto repairTypeUser = new RepairTypeUserDto();
187 187 repairTypeUser.setStaffId(staffId);
188 188 repairTypeUser.setRepairType(repairType);
  189 + repairTypeUser.setCommunityId(reqJson.getString("communityId"));
189 190 // 查询工单设置表
190 191 List<RepairTypeUserDto> repairTypeUserDtos = repairTypeUserInnerServiceSMO.queryRepairTypeUsers(repairTypeUser);
191 192  
... ...
service-community/src/main/java/com/java110/community/cmd/ownerRepair/SaveOwnerRepairCmd.java
... ... @@ -170,7 +170,7 @@ public class SaveOwnerRepairCmd extends Cmd {
170 170 if (ListUtil.isNull(feeConfigDtos)) {
171 171 return; // 没有配置默认费用项,直接返回
172 172 }
173   -
  173 +
174 174 // 查询处理中的报修费用
175 175 FeeDto feeDto = new FeeDto();
176 176 feeDto.setConfigId(feeConfigDtos.get(0).getConfigId()); // 使用第一个默认配置
... ... @@ -180,7 +180,7 @@ public class SaveOwnerRepairCmd extends Cmd {
180 180 if (ListUtil.isNull(feeDtos)) {
181 181 return; // 没有处理中的费用,允许报修
182 182 }
183   -
  183 +
184 184 // 检查未处理费用条数限制
185 185 String repairFeeNumber = MappingCache.getValue(MappingConstant.REPAIR_DOMAIN, REPAIR_FEE_NUMBER);
186 186 if (!StringUtil.isInteger(repairFeeNumber)) {
... ... @@ -211,26 +211,27 @@ public class SaveOwnerRepairCmd extends Cmd {
211 211 repairSettingDto.setRepairType(reqJson.getString("repairType"));
212 212 List<RepairSettingDto> repairSettingDtos = repairSettingV1InnerServiceSMOImpl.queryRepairSettings(repairSettingDto);
213 213 if (ListUtil.isNull(repairSettingDtos)) {
214   - throw new CmdException("报销刘类型不存在");
  214 +
  215 + throw new CmdException("报修类型不存在");
215 216 }
216 217  
217 218 // 创建报修池记录
218 219 RepairPoolPo repairPoolPo = BeanConvertUtil.covertBean(reqJson, RepairPoolPo.class);
219 220 repairPoolPo.setRepairId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_repairId));
220 221 repairPoolPo.setState(RepairDto.STATE_WAIT); // 设置初始状态为等待处理
221   -
  222 +
222 223 // 计算超时时间
223 224 String appointmentTime = repairPoolPo.getAppointmentTime();
224 225 Date sAppTime = DateUtil.getDateFromStringA(appointmentTime);
225 226 String timeout = DateUtil.getAddHoursStringA(sAppTime, repairSettingDtos.get(0).getDoTime());
226 227 repairPoolPo.setTimeout(timeout);
227   -
  228 +
228 229 // 保存报修池记录
229 230 int flag = repairPoolV1InnerServiceSMOImpl.saveRepairPoolNew(repairPoolPo);
230 231 if (flag < 1) {
231 232 throw new CmdException("修改失败");
232 233 }
233   -
  234 +
234 235 // 创建报修用户记录
235 236 RepairUserPo repairUserPo = BeanConvertUtil.covertBean(reqJson, RepairUserPo.class);
236 237 repairUserPo.setContext("订单提交");
... ... @@ -245,13 +246,13 @@ public class SaveOwnerRepairCmd extends Cmd {
245 246 repairUserPo.setState(RepairUserDto.STATE_SUBMIT); // 设置状态为已提交
246 247 repairUserPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A)); // 设置结束时间为当前时间
247 248 repairUserPo.setRuId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_ruId));
248   -
  249 +
249 250 // 保存报修用户记录
250 251 flag = repairUserV1InnerServiceSMOImpl.saveRepairUserNew(repairUserPo);
251 252 if (flag < 1) {
252 253 throw new CmdException("修改用户失败");
253 254 }
254   -
  255 +
255 256 // 保存报修图片
256 257 saveRepairPhoto(reqJson, repairPoolPo.getRepairId());
257 258  
... ... @@ -279,7 +280,7 @@ public class SaveOwnerRepairCmd extends Cmd {
279 280 if (ListUtil.isNull(photos)) {
280 281 return; // 没有图片,直接返回
281 282 }
282   -
  283 +
283 284 // 遍历所有图片
284 285 for (int _photoIndex = 0; _photoIndex < photos.size(); _photoIndex++) {
285 286 String _photo = photos.getString(_photoIndex);
... ... @@ -298,7 +299,7 @@ public class SaveOwnerRepairCmd extends Cmd {
298 299 fileDto.setCommunityId(reqJson.getString("communityId"));
299 300 _photo = fileInnerServiceSMOImpl.saveFile(fileDto); // 保存文件并返回文件路径
300 301 }
301   -
  302 +
302 303 // 创建文件关联记录
303 304 JSONObject businessUnit = new JSONObject();
304 305 businessUnit.put("fileRelId", GenerateCodeFactory.getGeneratorId("12"));
... ... @@ -307,7 +308,7 @@ public class SaveOwnerRepairCmd extends Cmd {
307 308 businessUnit.put("objId", repairId); // 关联报修ID
308 309 businessUnit.put("fileRealName", _photo.toString());
309 310 businessUnit.put("fileSaveName", _photo.toString());
310   -
  311 +
311 312 FileRelPo fileRelPo = BeanConvertUtil.covertBean(businessUnit, FileRelPo.class);
312 313 flag = fileRelInnerServiceSMOImpl.saveFileRel(fileRelPo);
313 314 if (flag < 1) {
... ... @@ -315,4 +316,4 @@ public class SaveOwnerRepairCmd extends Cmd {
315 316 }
316 317 }
317 318 }
318   -}
319 319 \ No newline at end of file
  320 +}
... ...
service-user/src/main/java/com/java110/user/cmd/property/AttendancePunchCmd.java
... ... @@ -31,6 +31,7 @@ import org.slf4j.Logger;
31 31 import org.slf4j.LoggerFactory;
32 32 import org.springframework.beans.factory.annotation.Autowired;
33 33  
  34 +import java.util.Calendar;
34 35 import java.util.Date;
35 36 import java.util.HashMap;
36 37 import java.util.Map;
... ... @@ -63,22 +64,41 @@ public class AttendancePunchCmd extends Cmd {
63 64 @Override
64 65 @Java110Transactional
65 66 public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException {
66   - // 校验当天是否已打同类型卡
67   - Map checkParams = new HashMap<>();
68   - checkParams.put("userId", reqJson.getString("userId"));
69   - checkParams.put("punchType", reqJson.getString("punchType"));
70   - Map existRecord = attendanceRecordV1ServiceDao.queryTodayAttendanceByType(checkParams);
  67 + String userId = reqJson.getString("userId");
  68 + String punchType = reqJson.getString("punchType");
  69 + String typeName = "ON".equals(punchType) ? "上班" : "下班";
  70 +
  71 + // 1. 当天同类型打卡不超过3次
  72 + Map countParams = new HashMap<>();
  73 + countParams.put("userId", userId);
  74 + countParams.put("punchType", punchType);
  75 + int todayCount = attendanceRecordV1ServiceDao.countTodayByType(countParams);
  76 + if (todayCount >= 3) {
  77 + throw new CmdException("今日" + typeName + "打卡已达3次,无法继续打卡");
  78 + }
71 79  
72   - if (existRecord != null) {
73   - throw new CmdException("今日已" + ("ON".equals(reqJson.getString("punchType")) ? "上班" : "下班") + "打卡,请勿重复打卡");
  80 + // 2. 检查最近一次打卡时间,同类型需间隔7小时
  81 + Map lastPunchParams = new HashMap<>();
  82 + lastPunchParams.put("userId", userId);
  83 + Map lastPunch = attendanceRecordV1ServiceDao.getLastPunch(lastPunchParams);
  84 + if (lastPunch != null) {
  85 + Date lastPunchTime = (Date) lastPunch.get("punch_time");
  86 + Calendar cal = Calendar.getInstance();
  87 + cal.setTime(lastPunchTime);
  88 + cal.add(Calendar.HOUR_OF_DAY, 7);
  89 + if (new Date().before(cal.getTime())) {
  90 + String lastType = "ON".equals(lastPunch.get("punch_type")) ? "上班" : "下班";
  91 + throw new CmdException("上次" + lastType + "打卡时间不足7小时,请" +
  92 + new java.text.SimpleDateFormat("HH:mm").format(cal.getTime()) + "后再打卡");
  93 + }
74 94 }
75 95  
76 96 AttendanceRecordPo po = new AttendanceRecordPo();
77 97 po.setId(GenerateCodeFactory.getGeneratorId("10"));
78   - po.setUserId(reqJson.getString("userId"));
  98 + po.setUserId(userId);
79 99 po.setUserName(reqJson.containsKey("userName") ? reqJson.getString("userName") : "");
80 100 po.setWorkType(reqJson.containsKey("workType") ? reqJson.getString("workType") : "");
81   - po.setPunchType(reqJson.getString("punchType"));
  101 + po.setPunchType(punchType);
82 102 po.setPunchTime(new Date());
83 103 po.setPunchAddress(reqJson.containsKey("punchAddress") ? reqJson.getString("punchAddress") : "");
84 104 po.setLongitude(reqJson.getBigDecimal("longitude"));
... ...
service-user/src/main/java/com/java110/user/dao/impl/AttendanceRecordV1ServiceDaoImpl.java
... ... @@ -32,4 +32,20 @@ public class AttendanceRecordV1ServiceDaoImpl extends BaseServiceDao implements
32 32 List<Map> result = sqlSessionTemplate.selectList("AttendanceRecordV1ServiceDaoImpl.queryTodayAttendanceByType", params);
33 33 return (result != null && !result.isEmpty()) ? result.get(0) : null;
34 34 }
  35 +
  36 + @Override
  37 + public int countTodayByType(Map params) {
  38 + List<Map> result = sqlSessionTemplate.selectList("AttendanceRecordV1ServiceDaoImpl.countTodayByType", params);
  39 + if (result == null || result.isEmpty()) return 0;
  40 + Object count = result.get(0);
  41 + if (count instanceof Integer) return (Integer) count;
  42 + if (count instanceof Long) return ((Long) count).intValue();
  43 + return Integer.parseInt(count.toString());
  44 + }
  45 +
  46 + @Override
  47 + public Map getLastPunch(Map params) {
  48 + List<Map> result = sqlSessionTemplate.selectList("AttendanceRecordV1ServiceDaoImpl.getLastPunch", params);
  49 + return (result != null && !result.isEmpty()) ? result.get(0) : null;
  50 + }
35 51 }
... ...
service-user/src/main/java/com/java110/user/dao/property/IAttendanceRecordV1ServiceDao.java
... ... @@ -10,4 +10,8 @@ public interface IAttendanceRecordV1ServiceDao {
10 10 int queryAttendanceRecordsCount(Map params);
11 11 /** 检查当天是否已打同类型卡 */
12 12 Map queryTodayAttendanceByType(Map params);
  13 + /** 统计当天同类型打卡次数 */
  14 + int countTodayByType(Map params);
  15 + /** 获取用户最近一次打卡记录 */
  16 + Map getLastPunch(Map params);
13 17 }
... ...
service-user/src/main/resources/mapper/property/AttendanceRecordMapper.xml
... ... @@ -38,4 +38,17 @@
38 38 LIMIT 1
39 39 </select>
40 40  
  41 + <select id="countTodayByType" parameterType="map" resultType="int">
  42 + SELECT COUNT(1) FROM attendance_record
  43 + WHERE user_id = #{userId} AND punch_type = #{punchType}
  44 + AND DATE(punch_time) = CURDATE()
  45 + </select>
  46 +
  47 + <select id="getLastPunch" parameterType="map" resultType="map">
  48 + SELECT * FROM attendance_record
  49 + WHERE user_id = #{userId}
  50 + ORDER BY punch_time DESC
  51 + LIMIT 1
  52 + </select>
  53 +
41 54 </mapper>
... ...
springboot/src/main/resources/application-prod.yml
... ... @@ -2,9 +2,6 @@ server:
2 2 port: 8008
3 3 tomcat:
4 4 uri-encoding: UTF-8
5   -
6   -
7   -
8 5 spring:
9 6 servlet:
10 7 multipart:
... ...