Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
		| @ -324,9 +324,9 @@ dxf2GeoJson: | |||||||
|   file-name: main.exe |   file-name: main.exe | ||||||
| ys7: | ys7: | ||||||
|   app-key: 3acf9f1a43dc4209841e0893003db0a2 |   app-key: 3acf9f1a43dc4209841e0893003db0a2 | ||||||
|   app-secret: 4bbf3e9394f55d3af6e3af27b2d3db36 |   app-secret: 09e29c70ae1161fbc3ce2030fc09ba2e | ||||||
|   job: |   job: | ||||||
|     capture-enabled: false   # 控制是否启用萤石抓拍任务 |     capture-enabled: true   # 控制是否启用萤石抓拍任务 | ||||||
| # 斯巴达算法 | # 斯巴达算法 | ||||||
| sparta: | sparta: | ||||||
|   url: http://119.3.204.120:8040 |   url: http://119.3.204.120:8040 | ||||||
|  | |||||||
| @ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||||
| import jakarta.annotation.Resource; | import jakarta.annotation.Resource; | ||||||
| import jakarta.validation.constraints.NotNull; | import jakarta.validation.constraints.NotNull; | ||||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||||
|  | import org.dromara.bigscreen.domain.dto.ProjectUpdateDto; | ||||||
| import org.dromara.bigscreen.domain.dto.TanchuangInfoReq; | import org.dromara.bigscreen.domain.dto.TanchuangInfoReq; | ||||||
| import org.dromara.bigscreen.domain.dto.Ys7DeviceUpdateReq; | import org.dromara.bigscreen.domain.dto.Ys7DeviceUpdateReq; | ||||||
| import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo; | import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo; | ||||||
| @ -402,6 +403,15 @@ public class ProjectBigScreenController extends BaseController { | |||||||
|         return R.ok(projectService.getProjectMapList()); |         return R.ok(projectService.getProjectMapList()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询地图项目分类 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("project:big:screen") | ||||||
|  |     @PostMapping("/updatePosition") | ||||||
|  |     public R<Void> updatePosition(@RequestBody ProjectUpdateDto dto) { | ||||||
|  |        return toAjax(projectService.updatePosition(dto)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 查询项目地域分散图 |      * 查询项目地域分散图 | ||||||
|  | |||||||
| @ -0,0 +1,16 @@ | |||||||
|  | package org.dromara.bigscreen.domain.dto; | ||||||
|  |  | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.Serializable; | ||||||
|  | import java.time.LocalDateTime; | ||||||
|  |  | ||||||
|  | @Data | ||||||
|  | public class ProjectUpdateDto implements Serializable { | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     private Long projectId;       // 项目id | ||||||
|  |  | ||||||
|  |     private String position;      // 图片 | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -80,12 +80,12 @@ public class RedisMessageListener implements MessageListener { | |||||||
|     private String buildPushMessage(String key, String message, Long projectId) { |     private String buildPushMessage(String key, String message, Long projectId) { | ||||||
|         JSONObject messageObj = new JSONObject(); |         JSONObject messageObj = new JSONObject(); | ||||||
|         messageObj.put("type", "wrj_DATA_UPDATE"); |         messageObj.put("type", "wrj_DATA_UPDATE"); | ||||||
|         messageObj.put("projectId",projectId); |         messageObj.put("projectId",projectId.toString()); | ||||||
|         messageObj.put("clientId",key); |         messageObj.put("clientId",key); | ||||||
|         // 位置信息 |         // 位置信息 | ||||||
|         JSONObject locationObj = new JSONObject(); |         JSONObject locationObj = new JSONObject(); | ||||||
|         locationObj.put("latitude", JSONUtil.parseObj(message).getJSONObject("data").get("latitude")); // 纬度 |         locationObj.put("latitude", JSONUtil.parseObj(message).getJSONObject("data").get("latitude").toString()); // 纬度 | ||||||
|         locationObj.put("longitude", JSONUtil.parseObj(message).getJSONObject("data").get("longitude")); // 经度 |         locationObj.put("longitude", JSONUtil.parseObj(message).getJSONObject("data").get("longitude").toString()); // 经度 | ||||||
|         messageObj.put("location", locationObj); |         messageObj.put("location", locationObj); | ||||||
|         return messageObj.toString(); |         return messageObj.toString(); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -628,6 +628,7 @@ public class DesDesignChangeServiceImpl extends ServiceImpl<DesDesignChangeMappe | |||||||
|             } else if ("2".equals(bean.getDesignDisposal())) { |             } else if ("2".equals(bean.getDesignDisposal())) { | ||||||
|                 LambdaUpdateWrapper<DesVolumeFile> wrapper = new LambdaUpdateWrapper<>(); |                 LambdaUpdateWrapper<DesVolumeFile> wrapper = new LambdaUpdateWrapper<>(); | ||||||
|                 wrapper.set(DesVolumeFile::getType, DesVolumeFile.WASTE) |                 wrapper.set(DesVolumeFile::getType, DesVolumeFile.WASTE) | ||||||
|  |                     .eq(DesVolumeFile::getType, DesVolumeFile.BLUEPRINT) | ||||||
|                     .eq(DesVolumeFile::getVolumeCatalogId, volumeCatalog.getDesign()); |                     .eq(DesVolumeFile::getVolumeCatalogId, volumeCatalog.getDesign()); | ||||||
|                 String saveFile = designChange.getSaveFile(); |                 String saveFile = designChange.getSaveFile(); | ||||||
|                 if (StringUtils.isNotBlank(saveFile)) { |                 if (StringUtils.isNotBlank(saveFile)) { | ||||||
| @ -658,7 +659,7 @@ public class DesDesignChangeServiceImpl extends ServiceImpl<DesDesignChangeMappe | |||||||
|                     String lastVersion = list.getFirst().getVersion(); |                     String lastVersion = list.getFirst().getVersion(); | ||||||
|                     // 提取版本号数字部分(去除LT-前缀) |                     // 提取版本号数字部分(去除LT-前缀) | ||||||
|                     String versionNumber = lastVersion; |                     String versionNumber = lastVersion; | ||||||
|                     if (lastVersion.startsWith("LT-")) { |                     if (lastVersion.startsWith("LT-") || lastVersion.startsWith("GC-")) { | ||||||
|                         versionNumber = lastVersion.substring(3); // 去除"LT-"前缀 |                         versionNumber = lastVersion.substring(3); // 去除"LT-"前缀 | ||||||
|                     } |                     } | ||||||
|                     int majorVersion = (int) Math.floor(Double.parseDouble(versionNumber)) + 1; |                     int majorVersion = (int) Math.floor(Double.parseDouble(versionNumber)) + 1; | ||||||
|  | |||||||
| @ -421,17 +421,17 @@ public class DesVolumeFileServiceImpl extends ServiceImpl<DesVolumeFileMapper, D | |||||||
|  |  | ||||||
|             if (DesVolumeFile.BLUEPRINT.equals(type)) { |             if (DesVolumeFile.BLUEPRINT.equals(type)) { | ||||||
|                 // 蓝图文件:LT-1.0, LT-1.1, LT-1.2... |                 // 蓝图文件:LT-1.0, LT-1.1, LT-1.2... | ||||||
|                 double maxVersion = Double.parseDouble(maxBatchVersion); |                 if (CollectionUtil.isEmpty(existingFilesInDB)) { | ||||||
|                 int majorVersion = (int) Math.floor(maxVersion); |                     // 没有历史版本,从1.0开始,根据文件索引递增 | ||||||
|                 int minorVersion = (int) ((maxVersion - majorVersion) * 10) + fileIndex + 1; |                     int minorVersion = fileIndex; | ||||||
|  |                     versionStr = "LT-1." + minorVersion; | ||||||
|                 // 如果是第一个文件且没有历史版本,则从1.0开始 |  | ||||||
|                 if (fileIndex == 0 && CollectionUtil.isEmpty(existingFilesInDB)) { |  | ||||||
|                     versionStr = "1.0"; |  | ||||||
|                 } else { |                 } else { | ||||||
|                     versionStr = majorVersion + "." + minorVersion; |                     // 有历史版本,基于最高版本递增 | ||||||
|  |                     double maxVersion = Double.parseDouble(maxBatchVersion); | ||||||
|  |                     int majorVersion = (int) Math.floor(maxVersion); | ||||||
|  |                     int minorVersion = (int) Math.round((maxVersion - majorVersion) * 10) + fileIndex + 1; | ||||||
|  |                     versionStr = "LT-" + majorVersion + "." + minorVersion; | ||||||
|                 } |                 } | ||||||
|                 versionStr = "LT-" + versionStr; |  | ||||||
|             } else if (DesVolumeFile.PROCESS.equals(type)) { |             } else if (DesVolumeFile.PROCESS.equals(type)) { | ||||||
|                 // 过程图纸:基于蓝图版本号 |                 // 过程图纸:基于蓝图版本号 | ||||||
|                 List<DesVolumeFile> blueprintFiles = baseMapper.selectList(new LambdaQueryWrapper<DesVolumeFile>() |                 List<DesVolumeFile> blueprintFiles = baseMapper.selectList(new LambdaQueryWrapper<DesVolumeFile>() | ||||||
|  | |||||||
| @ -272,14 +272,14 @@ public class GpsEquipmentServiceImpl extends ServiceImpl<GpsEquipmentMapper, Gps | |||||||
|         JSONObject messageObj = new JSONObject(); |         JSONObject messageObj = new JSONObject(); | ||||||
|         messageObj.put("type", "GPS_DATA_UPDATE"); // 消息类型 |         messageObj.put("type", "GPS_DATA_UPDATE"); // 消息类型 | ||||||
|         messageObj.put("clientId", sonBo.getClientId()); // 设备唯一标识 |         messageObj.put("clientId", sonBo.getClientId()); // 设备唯一标识 | ||||||
|         messageObj.put("projectId", sonBo.getProjectId()); // 项目ID |         messageObj.put("projectId", sonBo.getProjectId().toString()); // 项目ID | ||||||
|         messageObj.put("userId", sonBo.getUserId()); // 关联用户ID |         messageObj.put("userId", sonBo.getUserId().toString()); // 关联用户ID | ||||||
|  |  | ||||||
|         // 位置信息 |         // 位置信息 | ||||||
|         JSONObject locationObj = new JSONObject(); |         JSONObject locationObj = new JSONObject(); | ||||||
|         locationObj.put("latitude", sonBo.getLocLatitude()); // 纬度 |         locationObj.put("latitude", sonBo.getLocLatitude().toString()); // 纬度 | ||||||
|         locationObj.put("longitude", sonBo.getLocLongitude()); // 经度 |         locationObj.put("longitude", sonBo.getLocLongitude().toString()); // 经度 | ||||||
|         locationObj.put("altitude", sonBo.getLocAltitude()); // 海拔 |         locationObj.put("altitude", sonBo.getLocAltitude().toString()); // 海拔 | ||||||
|         messageObj.put("location", locationObj); |         messageObj.put("location", locationObj); | ||||||
|  |  | ||||||
|         // 转换为String类型返回 |         // 转换为String类型返回 | ||||||
|  | |||||||
| @ -355,7 +355,7 @@ public class MatMaterialsInventoryServiceImpl extends ServiceImpl<MatMaterialsIn | |||||||
|         lqw.eq(ObjectUtils.isNotEmpty(number), MatMaterialsInventory::getNumber, number); |         lqw.eq(ObjectUtils.isNotEmpty(number), MatMaterialsInventory::getNumber, number); | ||||||
|         lqw.eq(ObjectUtils.isNotEmpty(outPut), MatMaterialsInventory::getOutPut, outPut); |         lqw.eq(ObjectUtils.isNotEmpty(outPut), MatMaterialsInventory::getOutPut, outPut); | ||||||
|         // 排序 |         // 排序 | ||||||
|         lqw.orderByDesc(MatMaterialsInventory::getCreateTime); |         lqw.orderByAsc(MatMaterialsInventory::getCreateTime); | ||||||
|         return lqw; |         return lqw; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | |||||||
| @ -330,6 +330,8 @@ public class MatMaterialsServiceImpl extends ServiceImpl<MatMaterialsMapper, Mat | |||||||
|         lqw.eq(ObjectUtils.isNotEmpty(status), MatMaterials::getStatus, status); |         lqw.eq(ObjectUtils.isNotEmpty(status), MatMaterials::getStatus, status); | ||||||
|         lqw.eq(ObjectUtils.isNotEmpty(projectId), MatMaterials::getProjectId, projectId); |         lqw.eq(ObjectUtils.isNotEmpty(projectId), MatMaterials::getProjectId, projectId); | ||||||
|         lqw.eq(ObjectUtils.isNotEmpty(companyId), MatMaterials::getCompanyId, companyId); |         lqw.eq(ObjectUtils.isNotEmpty(companyId), MatMaterials::getCompanyId, companyId); | ||||||
|  |  | ||||||
|  |         lqw.orderByDesc(MatMaterials::getCreateTime); | ||||||
|         return lqw; |         return lqw; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | |||||||
| @ -23,7 +23,7 @@ public class DeviceMessageSender { | |||||||
|      * @param face   人脸模板地址(HTTP链接) |      * @param face   人脸模板地址(HTTP链接) | ||||||
|      * @return 异常信息(无异常则返回null) |      * @return 异常信息(无异常则返回null) | ||||||
|      */ |      */ | ||||||
|     public static Exception sendPersonnelInformation(String sn, String userId, String name, String face) { |     public Boolean sendPersonnelInformation(String sn, String userId, String name, String face) { | ||||||
|         try { |         try { | ||||||
|             // 生成UUID |             // 生成UUID | ||||||
|             String sUuid = DeviceWebSocketServer.generateUUIDWithSixRandomDigits(); |             String sUuid = DeviceWebSocketServer.generateUUIDWithSixRandomDigits(); | ||||||
| @ -45,10 +45,10 @@ public class DeviceMessageSender { | |||||||
|  |  | ||||||
|             // 发送请求并等待响应(忽略响应结果,只关注是否成功) |             // 发送请求并等待响应(忽略响应结果,只关注是否成功) | ||||||
|             DeviceWebSocketServer.sendRequestAndWaitResponse(sn, sUuid, people); |             DeviceWebSocketServer.sendRequestAndWaitResponse(sn, sUuid, people); | ||||||
|             return null; |             return true; | ||||||
|         } catch (Exception e) { |         } catch (Exception e) { | ||||||
|             log.error("下发人员信息失败,SN: {}, UserID: {}", sn, userId, e); |             log.error("下发人员信息失败,SN: {}, UserID: {}", sn, userId, e); | ||||||
|             return e; |             return false; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -59,7 +59,7 @@ public class DeviceMessageSender { | |||||||
|      * @return 响应结果(包含人员信息) |      * @return 响应结果(包含人员信息) | ||||||
|      * @throws Exception 发送或接收过程中的异常 |      * @throws Exception 发送或接收过程中的异常 | ||||||
|      */ |      */ | ||||||
|     public static KqjEntity.CommonResponse getAllUsers(String sn) throws Exception { |     public KqjEntity.CommonResponse getAllUsers(String sn) throws Exception { | ||||||
|         // 生成UUID |         // 生成UUID | ||||||
|         String sUuid = DeviceWebSocketServer.generateUUIDWithSixRandomDigits(); |         String sUuid = DeviceWebSocketServer.generateUUIDWithSixRandomDigits(); | ||||||
|  |  | ||||||
| @ -87,7 +87,7 @@ public class DeviceMessageSender { | |||||||
|      * @return 响应结果 |      * @return 响应结果 | ||||||
|      * @throws Exception 发送或接收过程中的异常 |      * @throws Exception 发送或接收过程中的异常 | ||||||
|      */ |      */ | ||||||
|     public static KqjEntity.CommonResponse deleteUser(String sn, String userId) throws Exception { |     public KqjEntity.CommonResponse deleteUser(String sn, String userId) throws Exception { | ||||||
|         // 生成UUID |         // 生成UUID | ||||||
|         String sUuid = DeviceWebSocketServer.generateUUIDWithSixRandomDigits(); |         String sUuid = DeviceWebSocketServer.generateUUIDWithSixRandomDigits(); | ||||||
|  |  | ||||||
| @ -116,7 +116,7 @@ public class DeviceMessageSender { | |||||||
|      * @return 响应结果 |      * @return 响应结果 | ||||||
|      * @throws Exception 发送或接收过程中的异常 |      * @throws Exception 发送或接收过程中的异常 | ||||||
|      */ |      */ | ||||||
|     public static KqjEntity.CommonResponse batchDeleteUsers(String sn, String[] userIds) throws Exception { |     public KqjEntity.CommonResponse batchDeleteUsers(String sn, String[] userIds) throws Exception { | ||||||
|         // 生成UUID |         // 生成UUID | ||||||
|         String sUuid = DeviceWebSocketServer.generateUUIDWithSixRandomDigits(); |         String sUuid = DeviceWebSocketServer.generateUUIDWithSixRandomDigits(); | ||||||
|  |  | ||||||
| @ -144,7 +144,7 @@ public class DeviceMessageSender { | |||||||
|      * @return 响应结果 |      * @return 响应结果 | ||||||
|      * @throws Exception 发送或接收过程中的异常 |      * @throws Exception 发送或接收过程中的异常 | ||||||
|      */ |      */ | ||||||
|     public static KqjEntity.CommonResponse deleteAllUsers(String sn) throws Exception { |     public KqjEntity.CommonResponse deleteAllUsers(String sn) throws Exception { | ||||||
|         // 生成UUID |         // 生成UUID | ||||||
|         String sUuid = DeviceWebSocketServer.generateUUIDWithSixRandomDigits(); |         String sUuid = DeviceWebSocketServer.generateUUIDWithSixRandomDigits(); | ||||||
|  |  | ||||||
|  | |||||||
| @ -5,6 +5,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; | |||||||
| import jakarta.websocket.*; | import jakarta.websocket.*; | ||||||
| import jakarta.websocket.server.ServerEndpoint; | import jakarta.websocket.server.ServerEndpoint; | ||||||
| import lombok.extern.log4j.Log4j2; | import lombok.extern.log4j.Log4j2; | ||||||
|  | import org.dromara.common.core.utils.SpringUtils; | ||||||
|  | import org.dromara.project.service.IBusAttendanceMachineService; | ||||||
| import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||||
|  |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| @ -17,7 +19,6 @@ import java.util.concurrent.CompletableFuture; | |||||||
| import java.util.concurrent.ConcurrentHashMap; | import java.util.concurrent.ConcurrentHashMap; | ||||||
| import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||||||
| import java.util.concurrent.TimeoutException; | import java.util.concurrent.TimeoutException; | ||||||
| import java.util.concurrent.atomic.AtomicReference; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * WebSocket服务端(设备连接管理、消息处理) |  * WebSocket服务端(设备连接管理、消息处理) | ||||||
| @ -28,6 +29,8 @@ import java.util.concurrent.atomic.AtomicReference; | |||||||
| @Log4j2 | @Log4j2 | ||||||
| public class DeviceWebSocketServer { | public class DeviceWebSocketServer { | ||||||
|  |  | ||||||
|  |     private final static IBusAttendanceMachineService attendanceMachineService = SpringUtils.getBean(IBusAttendanceMachineService.class); | ||||||
|  |  | ||||||
|     // ------------------------------ 常量定义 ------------------------------ |     // ------------------------------ 常量定义 ------------------------------ | ||||||
|     public static final String DECLARE = "declare";     // 设备注册消息 |     public static final String DECLARE = "declare";     // 设备注册消息 | ||||||
|     public static final String PING = "ping";           // 心跳消息 |     public static final String PING = "ping";           // 心跳消息 | ||||||
| @ -36,7 +39,7 @@ public class DeviceWebSocketServer { | |||||||
|  |  | ||||||
|     // ------------------------------ 全局静态存储 ------------------------------ |     // ------------------------------ 全局静态存储 ------------------------------ | ||||||
|     // JSON序列化工具(单例) |     // JSON序列化工具(单例) | ||||||
|     private static final ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);; |     private static final ObjectMapper objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); | ||||||
|     // 设备连接池:key=设备SN,value=设备信息(含Session) |     // 设备连接池:key=设备SN,value=设备信息(含Session) | ||||||
|     private static final Map<String, KqjEntity.DeviceInfo> connectedDevices = new ConcurrentHashMap<>(); |     private static final Map<String, KqjEntity.DeviceInfo> connectedDevices = new ConcurrentHashMap<>(); | ||||||
|     // 响应通道:key=UUID,value=响应结果容器 |     // 响应通道:key=UUID,value=响应结果容器 | ||||||
| @ -212,7 +215,6 @@ public class DeviceWebSocketServer { | |||||||
| //        registerFuture.complete(true); // 标记注册成功 | //        registerFuture.complete(true); // 标记注册成功 | ||||||
| //        log.info("设备注册成功,SN: {},IP: {}:{},会话ID: {}", sn, ip, port, session.getId()); | //        log.info("设备注册成功,SN: {},IP: {}:{},会话ID: {}", sn, ip, port, session.getId()); | ||||||
| //    } | //    } | ||||||
|  |  | ||||||
|     private void handleRegisterStage(String message, String cmd) throws Exception { |     private void handleRegisterStage(String message, String cmd) throws Exception { | ||||||
|         // 非DECLARE消息直接拒绝 |         // 非DECLARE消息直接拒绝 | ||||||
|         if (!DECLARE.equals(cmd)) { |         if (!DECLARE.equals(cmd)) { | ||||||
| @ -382,6 +384,11 @@ public class DeviceWebSocketServer { | |||||||
|             // TODO: 替换为真实的业务服务调用(如Spring Bean注入后调用) |             // TODO: 替换为真实的业务服务调用(如Spring Bean注入后调用) | ||||||
|             log.info("【业务服务】设备注册,SN: {}", sn); |             log.info("【业务服务】设备注册,SN: {}", sn); | ||||||
|             // 示例:BusAttendanceMachineService.register(sn); |             // 示例:BusAttendanceMachineService.register(sn); | ||||||
|  |             if (attendanceMachineService != null) { | ||||||
|  |                 attendanceMachineService.insertBySn(sn); | ||||||
|  |             } else { | ||||||
|  |                 log.error("IBusAttendanceMachineService 为空,无法进行设备注册"); | ||||||
|  |             } | ||||||
|         } catch (Exception e) { |         } catch (Exception e) { | ||||||
|             log.error("【业务服务】设备注册失败,SN: {}", sn, e); |             log.error("【业务服务】设备注册失败,SN: {}", sn, e); | ||||||
|         } |         } | ||||||
| @ -395,6 +402,11 @@ public class DeviceWebSocketServer { | |||||||
|             // TODO: 替换为真实的业务服务调用 |             // TODO: 替换为真实的业务服务调用 | ||||||
|             log.info("【业务服务】更新设备状态,SN: {},状态: {}", sn, status); |             log.info("【业务服务】更新设备状态,SN: {},状态: {}", sn, status); | ||||||
|             // 示例:BusAttendanceMachineService.changeStatus(sn, status); |             // 示例:BusAttendanceMachineService.changeStatus(sn, status); | ||||||
|  |             if (attendanceMachineService != null) { | ||||||
|  |                 attendanceMachineService.changeStatus(sn, status); | ||||||
|  |             } else { | ||||||
|  |                 log.error("IBusAttendanceMachineService 为空,无法更新设备状态"); | ||||||
|  |             } | ||||||
|         } catch (Exception e) { |         } catch (Exception e) { | ||||||
|             log.error("【业务服务】更新设备状态失败,SN: {}", sn, e); |             log.error("【业务服务】更新设备状态失败,SN: {}", sn, e); | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -0,0 +1,94 @@ | |||||||
|  | package org.dromara.project.controller; | ||||||
|  |  | ||||||
|  | import cn.dev33.satoken.annotation.SaCheckPermission; | ||||||
|  | import jakarta.servlet.http.HttpServletResponse; | ||||||
|  | import jakarta.validation.constraints.NotEmpty; | ||||||
|  | import jakarta.validation.constraints.NotNull; | ||||||
|  | import lombok.RequiredArgsConstructor; | ||||||
|  | import org.dromara.common.core.domain.R; | ||||||
|  | import org.dromara.common.excel.utils.ExcelUtil; | ||||||
|  | import org.dromara.common.idempotent.annotation.RepeatSubmit; | ||||||
|  | import org.dromara.common.log.annotation.Log; | ||||||
|  | import org.dromara.common.log.enums.BusinessType; | ||||||
|  | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
|  | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  | import org.dromara.common.web.core.BaseController; | ||||||
|  | import org.dromara.project.domain.dto.attendancemachine.BusAttendanceMachineQueryReq; | ||||||
|  | import org.dromara.project.domain.dto.attendancemachine.BusAttendanceMachineUpdateReq; | ||||||
|  | import org.dromara.project.domain.vo.BusAttendanceMachineVo; | ||||||
|  | import org.dromara.project.service.IBusAttendanceMachineService; | ||||||
|  | import org.springframework.validation.annotation.Validated; | ||||||
|  | import org.springframework.web.bind.annotation.*; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 考勤机 | ||||||
|  |  * | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 | ||||||
|  |  */ | ||||||
|  | @Validated | ||||||
|  | @RequiredArgsConstructor | ||||||
|  | @RestController | ||||||
|  | @RequestMapping("/project/attendanceMachine") | ||||||
|  | public class BusAttendanceMachineController extends BaseController { | ||||||
|  |  | ||||||
|  |     private final IBusAttendanceMachineService busAttendanceMachineService; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询考勤机列表 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("project:attendanceMachine:list") | ||||||
|  |     @GetMapping("/list") | ||||||
|  |     public TableDataInfo<BusAttendanceMachineVo> list(BusAttendanceMachineQueryReq req, PageQuery pageQuery) { | ||||||
|  |         return busAttendanceMachineService.queryPageList(req, pageQuery); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 导出考勤机列表 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("project:attendanceMachine:export") | ||||||
|  |     @Log(title = "考勤机", businessType = BusinessType.EXPORT) | ||||||
|  |     @PostMapping("/export") | ||||||
|  |     public void export(BusAttendanceMachineQueryReq req, HttpServletResponse response) { | ||||||
|  |         List<BusAttendanceMachineVo> list = busAttendanceMachineService.queryList(req); | ||||||
|  |         ExcelUtil.exportExcel(list, "考勤机", BusAttendanceMachineVo.class, response); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获取考勤机详细信息 | ||||||
|  |      * | ||||||
|  |      * @param id 主键 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("project:attendanceMachine:query") | ||||||
|  |     @GetMapping("/{id}") | ||||||
|  |     public R<BusAttendanceMachineVo> getInfo(@NotNull(message = "主键不能为空") | ||||||
|  |                                              @PathVariable Long id) { | ||||||
|  |         return R.ok(busAttendanceMachineService.queryById(id)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改考勤机 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("project:attendanceMachine:edit") | ||||||
|  |     @Log(title = "考勤机", businessType = BusinessType.UPDATE) | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @PutMapping() | ||||||
|  |     public R<Void> edit(@Validated @RequestBody BusAttendanceMachineUpdateReq req) { | ||||||
|  |         return toAjax(busAttendanceMachineService.updateByBo(req)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 删除考勤机 | ||||||
|  |      * | ||||||
|  |      * @param ids 主键串 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("project:attendanceMachine:remove") | ||||||
|  |     @Log(title = "考勤机", businessType = BusinessType.DELETE) | ||||||
|  |     @DeleteMapping("/{ids}") | ||||||
|  |     public R<Void> remove(@NotEmpty(message = "主键不能为空") | ||||||
|  |                           @PathVariable Long[] ids) { | ||||||
|  |         return toAjax(busAttendanceMachineService.deleteWithValidByIds(List.of(ids), true)); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,65 @@ | |||||||
|  | package org.dromara.project.controller; | ||||||
|  |  | ||||||
|  | import cn.dev33.satoken.annotation.SaCheckPermission; | ||||||
|  | import lombok.RequiredArgsConstructor; | ||||||
|  | import org.dromara.common.core.domain.R; | ||||||
|  | import org.dromara.common.idempotent.annotation.RepeatSubmit; | ||||||
|  | import org.dromara.common.log.annotation.Log; | ||||||
|  | import org.dromara.common.log.enums.BusinessType; | ||||||
|  | import org.dromara.common.web.core.BaseController; | ||||||
|  | import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineSendInfoUserReq; | ||||||
|  | import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineUserQueryReq; | ||||||
|  | import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineUserRemoveReq; | ||||||
|  | import org.dromara.project.domain.vo.BusAttendanceMachineUserVo; | ||||||
|  | import org.dromara.project.service.IBusAttendanceMachineUserService; | ||||||
|  | import org.springframework.validation.annotation.Validated; | ||||||
|  | import org.springframework.web.bind.annotation.*; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 考勤机用户 | ||||||
|  |  * | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 | ||||||
|  |  */ | ||||||
|  | @Validated | ||||||
|  | @RequiredArgsConstructor | ||||||
|  | @RestController | ||||||
|  | @RequestMapping("/project/attendanceMachineUser") | ||||||
|  | public class BusAttendanceMachineUserController extends BaseController { | ||||||
|  |  | ||||||
|  |     private final IBusAttendanceMachineUserService busAttendanceMachineUserService; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询考勤机用户列表 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("project:attendanceMachineUser:list") | ||||||
|  |     @GetMapping("/list") | ||||||
|  |     public R<List<BusAttendanceMachineUserVo>> list(BusAttendanceMachineUserQueryReq req) { | ||||||
|  |         return R.ok(busAttendanceMachineUserService.queryList(req)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 下发用户到考勤机中 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("project:attendanceMachineUser:add") | ||||||
|  |     @Log(title = "考勤机用户", businessType = BusinessType.INSERT) | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @PostMapping("/send") | ||||||
|  |     public R<String> sendPersonInfo(@Validated @RequestBody BusAttendanceMachineSendInfoUserReq req) { | ||||||
|  |         return R.ok(busAttendanceMachineUserService.sendPersonInfo(req)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 删除考勤机用户 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("project:attendanceMachineUser:remove") | ||||||
|  |     @Log(title = "考勤机用户", businessType = BusinessType.DELETE) | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @DeleteMapping() | ||||||
|  |     public R<Void> remove(@Validated @RequestBody BusAttendanceMachineUserRemoveReq req) { | ||||||
|  |         return toAjax(busAttendanceMachineUserService.remove(req)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,51 @@ | |||||||
|  | package org.dromara.project.controller.app; | ||||||
|  |  | ||||||
|  | import cn.dev33.satoken.annotation.SaCheckPermission; | ||||||
|  | import jakarta.servlet.http.HttpServletResponse; | ||||||
|  | import jakarta.validation.constraints.NotEmpty; | ||||||
|  | import jakarta.validation.constraints.NotNull; | ||||||
|  | import lombok.RequiredArgsConstructor; | ||||||
|  | import org.dromara.common.core.domain.R; | ||||||
|  | import org.dromara.common.core.validate.AddGroup; | ||||||
|  | import org.dromara.common.core.validate.EditGroup; | ||||||
|  | import org.dromara.common.excel.utils.ExcelUtil; | ||||||
|  | import org.dromara.common.idempotent.annotation.RepeatSubmit; | ||||||
|  | import org.dromara.common.log.annotation.Log; | ||||||
|  | import org.dromara.common.log.enums.BusinessType; | ||||||
|  | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
|  | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  | import org.dromara.common.web.core.BaseController; | ||||||
|  | import org.dromara.project.domain.dto.workwage.BusWorkWageCreateReq; | ||||||
|  | import org.dromara.project.domain.dto.workwage.BusWorkWageQueryReq; | ||||||
|  | import org.dromara.project.domain.dto.workwage.BusWorkWageUpdateReq; | ||||||
|  | import org.dromara.project.domain.vo.workwage.BusWorkWageVo; | ||||||
|  | import org.dromara.project.service.IBusWorkWageService; | ||||||
|  | import org.springframework.validation.annotation.Validated; | ||||||
|  | import org.springframework.web.bind.annotation.*; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 工种薪水 | ||||||
|  |  * | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-03-26 | ||||||
|  |  */ | ||||||
|  | @Validated | ||||||
|  | @RequiredArgsConstructor | ||||||
|  | @RestController | ||||||
|  | @RequestMapping("/app/project/workWage") | ||||||
|  | public class BusWorkWageAppController extends BaseController { | ||||||
|  |  | ||||||
|  |     private final IBusWorkWageService busWorkWageService; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询工种薪水列表 | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     @GetMapping("/list") | ||||||
|  |     public R<List<BusWorkWageVo>> list(BusWorkWageQueryReq req) { | ||||||
|  |         return R.ok(busWorkWageService.queryList(req)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,65 @@ | |||||||
|  | package org.dromara.project.domain; | ||||||
|  |  | ||||||
|  | import com.baomidou.mybatisplus.annotation.TableId; | ||||||
|  | import com.baomidou.mybatisplus.annotation.TableName; | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  | import java.util.Date; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 考勤机对象 bus_attendance_machine | ||||||
|  |  * | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @TableName("bus_attendance_machine") | ||||||
|  | public class BusAttendanceMachine implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID | ||||||
|  |      */ | ||||||
|  |     @TableId(value = "id") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目ID | ||||||
|  |      */ | ||||||
|  |     private Long projectId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 设备sn | ||||||
|  |      */ | ||||||
|  |     private String sn; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 是否在线(0-no 1-yes) | ||||||
|  |      */ | ||||||
|  |     private String status; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 班组id,多个逗号分隔 | ||||||
|  |      */ | ||||||
|  |     private String teams; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建时间 | ||||||
|  |      */ | ||||||
|  |     private Date createTime; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 更新时间 | ||||||
|  |      */ | ||||||
|  |     private Date updateTime; | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,56 @@ | |||||||
|  | package org.dromara.project.domain; | ||||||
|  |  | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  | import java.util.Date; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 考勤机用户对象 bus_attendance_machine_user | ||||||
|  |  * | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | public class BusAttendanceMachineUser implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID | ||||||
|  |      */ | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 考勤机主键ID | ||||||
|  |      */ | ||||||
|  |     private Long machineId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 班组ID | ||||||
|  |      */ | ||||||
|  |     private Long teamId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 用户ID | ||||||
|  |      */ | ||||||
|  |     private Long userId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标识(是否下发) | ||||||
|  |      */ | ||||||
|  |     private Integer identifying; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建时间 | ||||||
|  |      */ | ||||||
|  |     private Date createTime; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 更新时间 | ||||||
|  |      */ | ||||||
|  |     private Date updateTime; | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -162,4 +162,10 @@ public class BusProject extends BaseEntity { | |||||||
|      */ |      */ | ||||||
|     private String province; |     private String province; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 位置信息 | ||||||
|  |      */ | ||||||
|  |     private String position; | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,37 @@ | |||||||
|  | package org.dromara.project.domain.dto.attendancemachine; | ||||||
|  |  | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 16:18 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | public class BusAttendanceMachineQueryReq implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 6296359812022907365L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目ID | ||||||
|  |      */ | ||||||
|  |     private Long projectId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 设备sn | ||||||
|  |      */ | ||||||
|  |     private String sn; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 是否在线(0-no 1-yes) | ||||||
|  |      */ | ||||||
|  |     private String status; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 班组id,多个逗号分隔 | ||||||
|  |      */ | ||||||
|  |     private String teams; | ||||||
|  | } | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | package org.dromara.project.domain.dto.attendancemachine; | ||||||
|  |  | ||||||
|  | import jakarta.validation.constraints.NotNull; | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 16:15 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | public class BusAttendanceMachineUpdateReq implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 4764015594443520162L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "主键ID不能为空") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目ID | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "项目ID不能为空") | ||||||
|  |     private Long projectId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 班组id,多个逗号分隔 | ||||||
|  |      */ | ||||||
|  |     private String teams; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remark; | ||||||
|  | } | ||||||
| @ -0,0 +1,32 @@ | |||||||
|  | package org.dromara.project.domain.dto.attendancemachineuser; | ||||||
|  |  | ||||||
|  | import jakarta.validation.constraints.NotNull; | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 17:43 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | public class BusAttendanceMachineSendInfoUserReq implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = -6517799483848691652L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 考勤机主键ID | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "考勤机不能为空") | ||||||
|  |     private Long machineId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 用户ID列表 | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "用户列表不能为空") | ||||||
|  |     private List<Long> userIds; | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | package org.dromara.project.domain.dto.attendancemachineuser; | ||||||
|  |  | ||||||
|  | import jakarta.validation.constraints.NotNull; | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 19:22 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | public class BusAttendanceMachineUserQueryReq implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = -1629819732452840391L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 考勤机主键ID | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "考勤机不能为空") | ||||||
|  |     private Long machineId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 班组ID | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "班组不能为空") | ||||||
|  |     private Long teamId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 用户名称 | ||||||
|  |      */ | ||||||
|  |     private String userName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标识(是否下发) | ||||||
|  |      */ | ||||||
|  |     private Integer identifying; | ||||||
|  | } | ||||||
| @ -0,0 +1,31 @@ | |||||||
|  | package org.dromara.project.domain.dto.attendancemachineuser; | ||||||
|  |  | ||||||
|  | import jakarta.validation.constraints.NotNull; | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 19:56 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | public class BusAttendanceMachineUserRemoveReq implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = -8880884070612972760L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 考勤机主键ID | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "考勤机不能为空") | ||||||
|  |     private Long machineId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 用户ID列表 | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "用户列表不能为空") | ||||||
|  |     private List<Long> userIds; | ||||||
|  | } | ||||||
| @ -129,4 +129,9 @@ public class BusProjectCreateReq implements Serializable { | |||||||
|      * 省份 |      * 省份 | ||||||
|      */ |      */ | ||||||
|     private String province; |     private String province; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 位置信息 | ||||||
|  |      */ | ||||||
|  |     private String position; | ||||||
| } | } | ||||||
|  | |||||||
| @ -147,4 +147,9 @@ public class BusProjectUpdateReq implements Serializable { | |||||||
|      */ |      */ | ||||||
|     private List<Punchrange> punchrangeList; |     private List<Punchrange> punchrangeList; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 位置信息 | ||||||
|  |      */ | ||||||
|  |     private String position; | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,6 +1,8 @@ | |||||||
| package org.dromara.project.domain.dto.workwage; | package org.dromara.project.domain.dto.workwage; | ||||||
|  |  | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
|  | import org.dromara.common.translation.annotation.Translation; | ||||||
|  | import org.dromara.common.translation.constant.TransConstant; | ||||||
|  |  | ||||||
| import java.io.Serial; | import java.io.Serial; | ||||||
| import java.io.Serializable; | import java.io.Serializable; | ||||||
| @ -31,6 +33,7 @@ public class BusWorkWageQueryReq implements Serializable { | |||||||
|      */ |      */ | ||||||
|     private String workType; |     private String workType; | ||||||
|  |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 是否是特种兵(1是 2否) |      * 是否是特种兵(1是 2否) | ||||||
|      */ |      */ | ||||||
|  | |||||||
| @ -0,0 +1,46 @@ | |||||||
|  | package org.dromara.project.domain.vo; | ||||||
|  |  | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 考勤机用户视图对象 bus_attendance_machine_user | ||||||
|  |  * | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | public class BusAttendanceMachineUserVo implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 考勤机主键ID | ||||||
|  |      */ | ||||||
|  |     private Long machineId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 班组ID | ||||||
|  |      */ | ||||||
|  |     private Long teamId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 用户ID | ||||||
|  |      */ | ||||||
|  |     private Long userId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 用户名称 | ||||||
|  |      */ | ||||||
|  |     private String userName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标识(是否下发) | ||||||
|  |      */ | ||||||
|  |     private Integer identifying; | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,87 @@ | |||||||
|  | package org.dromara.project.domain.vo; | ||||||
|  |  | ||||||
|  | import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||||||
|  | import com.alibaba.excel.annotation.ExcelProperty; | ||||||
|  | import io.github.linpeilie.annotations.AutoMapper; | ||||||
|  | import lombok.Data; | ||||||
|  | import org.dromara.common.excel.annotation.ExcelDictFormat; | ||||||
|  | import org.dromara.common.excel.convert.ExcelDictConvert; | ||||||
|  | import org.dromara.common.translation.annotation.Translation; | ||||||
|  | import org.dromara.common.translation.constant.TransConstant; | ||||||
|  | import org.dromara.project.domain.BusAttendanceMachine; | ||||||
|  | import org.dromara.project.domain.vo.projectteam.BusProjectTeamVo; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  | import java.util.Date; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 考勤机视图对象 bus_attendance_machine | ||||||
|  |  * | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @ExcelIgnoreUnannotated | ||||||
|  | @AutoMapper(target = BusAttendanceMachine.class) | ||||||
|  | public class BusAttendanceMachineVo implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "主键ID") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目ID | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "项目ID") | ||||||
|  |     private Long projectId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目名称 | ||||||
|  |      */ | ||||||
|  |     @Translation(type = TransConstant.PROJECT_ID_TO_NAME, mapper = "projectId") | ||||||
|  |     private String projectName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 设备sn | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "设备sn") | ||||||
|  |     private String sn; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 是否在线(0-no 1-yes) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "是否在线", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "0=-no,1=-yes") | ||||||
|  |     private String status; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 班组id,多个逗号分隔 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "班组id,多个逗号分隔") | ||||||
|  |     private String teams; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 班组列表 | ||||||
|  |      */ | ||||||
|  |     private List<BusProjectTeamVo> teamsList; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "备注") | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建时间 | ||||||
|  |      */ | ||||||
|  |     private Date createTime; | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -209,4 +209,7 @@ public class BusProjectVo implements Serializable { | |||||||
|      */ |      */ | ||||||
|     private String projectGeneralize; |     private String projectGeneralize; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     private String position; | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -6,6 +6,8 @@ import io.github.linpeilie.annotations.AutoMapper; | |||||||
| import lombok.Data; | import lombok.Data; | ||||||
| import org.dromara.common.excel.annotation.ExcelDictFormat; | import org.dromara.common.excel.annotation.ExcelDictFormat; | ||||||
| import org.dromara.common.excel.convert.ExcelDictConvert; | import org.dromara.common.excel.convert.ExcelDictConvert; | ||||||
|  | import org.dromara.common.translation.annotation.Translation; | ||||||
|  | import org.dromara.common.translation.constant.TransConstant; | ||||||
| import org.dromara.project.domain.BusWorkWage; | import org.dromara.project.domain.BusWorkWage; | ||||||
|  |  | ||||||
| import java.io.Serial; | import java.io.Serial; | ||||||
| @ -47,6 +49,12 @@ public class BusWorkWageVo implements Serializable { | |||||||
|     @ExcelDictFormat(dictType = "type_of_work") |     @ExcelDictFormat(dictType = "type_of_work") | ||||||
|     private String workType; |     private String workType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 工种 | ||||||
|  |      */ | ||||||
|  |     @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "workType",other = "type_of_work") | ||||||
|  |     private String workTypeName; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 是否是特种兵(1是 2否) |      * 是否是特种兵(1是 2否) | ||||||
|      */ |      */ | ||||||
|  | |||||||
| @ -0,0 +1,15 @@ | |||||||
|  | package org.dromara.project.mapper; | ||||||
|  |  | ||||||
|  | import org.dromara.project.domain.BusAttendanceMachine; | ||||||
|  | import org.dromara.project.domain.vo.BusAttendanceMachineVo; | ||||||
|  | import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 考勤机Mapper接口 | ||||||
|  |  * | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 | ||||||
|  |  */ | ||||||
|  | public interface BusAttendanceMachineMapper extends BaseMapperPlus<BusAttendanceMachine, BusAttendanceMachineVo> { | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,78 @@ | |||||||
|  | package org.dromara.project.service; | ||||||
|  |  | ||||||
|  | import com.baomidou.mybatisplus.extension.service.IService; | ||||||
|  | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
|  | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  | import org.dromara.project.domain.BusAttendanceMachine; | ||||||
|  | import org.dromara.project.domain.dto.attendancemachine.BusAttendanceMachineQueryReq; | ||||||
|  | import org.dromara.project.domain.dto.attendancemachine.BusAttendanceMachineUpdateReq; | ||||||
|  | import org.dromara.project.domain.vo.BusAttendanceMachineVo; | ||||||
|  |  | ||||||
|  | import java.util.Collection; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 考勤机Service接口 | ||||||
|  |  * | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 | ||||||
|  |  */ | ||||||
|  | public interface IBusAttendanceMachineService extends IService<BusAttendanceMachine> { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询考勤机 | ||||||
|  |      * | ||||||
|  |      * @param id 主键 | ||||||
|  |      * @return 考勤机 | ||||||
|  |      */ | ||||||
|  |     BusAttendanceMachineVo queryById(Long id); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 分页查询考勤机列表 | ||||||
|  |      * | ||||||
|  |      * @param req       查询条件 | ||||||
|  |      * @param pageQuery 分页参数 | ||||||
|  |      * @return 考勤机分页列表 | ||||||
|  |      */ | ||||||
|  |     TableDataInfo<BusAttendanceMachineVo> queryPageList(BusAttendanceMachineQueryReq req, PageQuery pageQuery); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询符合条件的考勤机列表 | ||||||
|  |      * | ||||||
|  |      * @param req 查询条件 | ||||||
|  |      * @return 考勤机列表 | ||||||
|  |      */ | ||||||
|  |     List<BusAttendanceMachineVo> queryList(BusAttendanceMachineQueryReq req); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 根据sn新增考勤机 | ||||||
|  |      * | ||||||
|  |      * @param sn 考勤机sn | ||||||
|  |      */ | ||||||
|  |     void insertBySn(String sn); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改考勤机 | ||||||
|  |      * | ||||||
|  |      * @param req 考勤机 | ||||||
|  |      * @return 是否修改成功 | ||||||
|  |      */ | ||||||
|  |     Boolean updateByBo(BusAttendanceMachineUpdateReq req); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改考勤机状态 | ||||||
|  |      * | ||||||
|  |      * @param sn     考勤机sn | ||||||
|  |      * @param status 考勤机状态 | ||||||
|  |      */ | ||||||
|  |     void changeStatus(String sn, String status); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 校验并批量删除考勤机信息 | ||||||
|  |      * | ||||||
|  |      * @param ids     待删除的主键集合 | ||||||
|  |      * @param isValid 是否进行有效性校验 | ||||||
|  |      * @return 是否删除成功 | ||||||
|  |      */ | ||||||
|  |     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); | ||||||
|  | } | ||||||
| @ -0,0 +1,41 @@ | |||||||
|  | package org.dromara.project.service; | ||||||
|  |  | ||||||
|  | import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineSendInfoUserReq; | ||||||
|  | import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineUserQueryReq; | ||||||
|  | import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineUserRemoveReq; | ||||||
|  | import org.dromara.project.domain.vo.BusAttendanceMachineUserVo; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 考勤机用户Service接口 | ||||||
|  |  * | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 | ||||||
|  |  */ | ||||||
|  | public interface IBusAttendanceMachineUserService { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询符合条件的考勤机用户列表 | ||||||
|  |      * | ||||||
|  |      * @param req 查询条件 | ||||||
|  |      * @return 考勤机用户列表 | ||||||
|  |      */ | ||||||
|  |     List<BusAttendanceMachineUserVo> queryList(BusAttendanceMachineUserQueryReq req); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 下发用户到考勤机中 | ||||||
|  |      * | ||||||
|  |      * @param req 下发用户参数 | ||||||
|  |      * @return 下发结果 | ||||||
|  |      */ | ||||||
|  |     String sendPersonInfo(BusAttendanceMachineSendInfoUserReq req); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 删除考勤机用户 | ||||||
|  |      * | ||||||
|  |      * @param req 删除参数 | ||||||
|  |      * @return 删除结果 | ||||||
|  |      */ | ||||||
|  |     Boolean remove(BusAttendanceMachineUserRemoveReq req); | ||||||
|  | } | ||||||
| @ -3,6 +3,7 @@ package org.dromara.project.service; | |||||||
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||||
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||||
| import com.baomidou.mybatisplus.extension.service.IService; | import com.baomidou.mybatisplus.extension.service.IService; | ||||||
|  | import org.dromara.bigscreen.domain.dto.ProjectUpdateDto; | ||||||
| import org.dromara.bigscreen.domain.dto.TanchuangInfoReq; | import org.dromara.bigscreen.domain.dto.TanchuangInfoReq; | ||||||
| import org.dromara.common.mybatis.core.page.PageQuery; | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
| @ -239,4 +240,6 @@ public interface IBusProjectService extends IService<BusProject> { | |||||||
|     Map<String, Map<String, String>> getProjectCapacity(); |     Map<String, Map<String, String>> getProjectCapacity(); | ||||||
|  |  | ||||||
|     Map<String, Map<String, Object>> getInfoData(TanchuangInfoReq req); |     Map<String, Map<String, Object>> getInfoData(TanchuangInfoReq req); | ||||||
|  |  | ||||||
|  |     Boolean updatePosition(ProjectUpdateDto dto); | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,266 @@ | |||||||
|  | package org.dromara.project.service.impl; | ||||||
|  |  | ||||||
|  | import cn.hutool.core.collection.CollUtil; | ||||||
|  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||||
|  | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||||
|  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||||
|  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||||||
|  | import jakarta.annotation.Resource; | ||||||
|  | import lombok.RequiredArgsConstructor; | ||||||
|  | import org.dromara.common.core.constant.HttpStatus; | ||||||
|  | import org.dromara.common.core.exception.ServiceException; | ||||||
|  | import org.dromara.common.core.utils.StringUtils; | ||||||
|  | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
|  | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  | import org.dromara.mobileAttendanceMachine.DeviceMessageSender; | ||||||
|  | import org.dromara.project.domain.BusAttendanceMachine; | ||||||
|  | import org.dromara.project.domain.BusProject; | ||||||
|  | import org.dromara.project.domain.BusProjectTeam; | ||||||
|  | import org.dromara.project.domain.BusProjectTeamMember; | ||||||
|  | import org.dromara.project.domain.dto.attendancemachine.BusAttendanceMachineQueryReq; | ||||||
|  | import org.dromara.project.domain.dto.attendancemachine.BusAttendanceMachineUpdateReq; | ||||||
|  | import org.dromara.project.domain.vo.BusAttendanceMachineVo; | ||||||
|  | import org.dromara.project.domain.vo.projectteam.BusProjectTeamVo; | ||||||
|  | import org.dromara.project.mapper.BusAttendanceMachineMapper; | ||||||
|  | import org.dromara.project.service.IBusAttendanceMachineService; | ||||||
|  | import org.dromara.project.service.IBusProjectService; | ||||||
|  | import org.dromara.project.service.IBusProjectTeamMemberService; | ||||||
|  | import org.dromara.project.service.IBusProjectTeamService; | ||||||
|  | import org.springframework.beans.BeanUtils; | ||||||
|  | import org.springframework.stereotype.Service; | ||||||
|  |  | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.Collection; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 考勤机Service业务层处理 | ||||||
|  |  * | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 | ||||||
|  |  */ | ||||||
|  | @RequiredArgsConstructor | ||||||
|  | @Service | ||||||
|  | public class BusAttendanceMachineServiceImpl extends ServiceImpl<BusAttendanceMachineMapper, BusAttendanceMachine> | ||||||
|  |     implements IBusAttendanceMachineService { | ||||||
|  |  | ||||||
|  |     @Resource | ||||||
|  |     private IBusProjectService projectService; | ||||||
|  |  | ||||||
|  |     @Resource | ||||||
|  |     private IBusProjectTeamService projectTeamService; | ||||||
|  |  | ||||||
|  |     @Resource | ||||||
|  |     private IBusProjectTeamMemberService projectTeamMemberService; | ||||||
|  |  | ||||||
|  |     @Resource | ||||||
|  |     private DeviceMessageSender deviceMessageSender; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询考勤机 | ||||||
|  |      * | ||||||
|  |      * @param id 主键 | ||||||
|  |      * @return 考勤机 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public BusAttendanceMachineVo queryById(Long id) { | ||||||
|  |         return baseMapper.selectVoById(id); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 分页查询考勤机列表 | ||||||
|  |      * | ||||||
|  |      * @param req       查询条件 | ||||||
|  |      * @param pageQuery 分页参数 | ||||||
|  |      * @return 考勤机分页列表 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public TableDataInfo<BusAttendanceMachineVo> queryPageList(BusAttendanceMachineQueryReq req, PageQuery pageQuery) { | ||||||
|  |         LambdaQueryWrapper<BusAttendanceMachine> lqw = buildQueryWrapper(req); | ||||||
|  |         Page<BusAttendanceMachineVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); | ||||||
|  |         List<BusAttendanceMachineVo> records = result.getRecords(); | ||||||
|  |         List<Long> teamIds = records.stream() | ||||||
|  |             .map(BusAttendanceMachineVo::getTeams) | ||||||
|  |             .filter(StringUtils::isNotBlank) | ||||||
|  |             .flatMap(team -> Arrays.stream(team.split(","))     // flatMap 展开内部 stream | ||||||
|  |                 .map(Long::parseLong)) | ||||||
|  |             .toList(); | ||||||
|  |         if (CollUtil.isEmpty(teamIds)) { | ||||||
|  |             return TableDataInfo.build(result); | ||||||
|  |         } | ||||||
|  |         List<BusProjectTeam> projectTeams = projectTeamService.listByIds(teamIds); | ||||||
|  |         Map<Long, String> teamMap = projectTeams.stream() | ||||||
|  |             .collect(Collectors.toMap(BusProjectTeam::getId, BusProjectTeam::getTeamName)); | ||||||
|  |         records.forEach(machine -> { | ||||||
|  |             String teams = machine.getTeams(); | ||||||
|  |             if (StringUtils.isNotBlank(teams)) { | ||||||
|  |                 List<Long> t = Arrays.stream(teams.split(",")).map(Long::parseLong).toList(); | ||||||
|  |                 List<BusProjectTeamVo> teamVoList = t.stream().map(teamId -> { | ||||||
|  |                     BusProjectTeamVo vo = new BusProjectTeamVo(); | ||||||
|  |                     vo.setId(teamId); | ||||||
|  |                     vo.setTeamName(teamMap.getOrDefault(teamId, "未命名")); | ||||||
|  |                     return vo; | ||||||
|  |                 }).toList(); | ||||||
|  |                 machine.setTeamsList(teamVoList); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |         result.setRecords(records); | ||||||
|  |         return TableDataInfo.build(result); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询符合条件的考勤机列表 | ||||||
|  |      * | ||||||
|  |      * @param req 查询条件 | ||||||
|  |      * @return 考勤机列表 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public List<BusAttendanceMachineVo> queryList(BusAttendanceMachineQueryReq req) { | ||||||
|  |         LambdaQueryWrapper<BusAttendanceMachine> lqw = buildQueryWrapper(req); | ||||||
|  |         return baseMapper.selectVoList(lqw); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private LambdaQueryWrapper<BusAttendanceMachine> buildQueryWrapper(BusAttendanceMachineQueryReq req) { | ||||||
|  |         LambdaQueryWrapper<BusAttendanceMachine> lqw = Wrappers.lambdaQuery(); | ||||||
|  |         lqw.orderByDesc(BusAttendanceMachine::getId); | ||||||
|  |         lqw.eq(req.getProjectId() != null, BusAttendanceMachine::getProjectId, req.getProjectId()); | ||||||
|  |         lqw.isNull(req.getProjectId() == null, BusAttendanceMachine::getProjectId); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(req.getSn()), BusAttendanceMachine::getSn, req.getSn()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(req.getStatus()), BusAttendanceMachine::getStatus, req.getStatus()); | ||||||
|  |         lqw.like(StringUtils.isNotBlank(req.getTeams()), BusAttendanceMachine::getTeams, req.getTeams()); | ||||||
|  |         return lqw; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 根据sn新增考勤机 | ||||||
|  |      * | ||||||
|  |      * @param sn 考勤机sn | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public void insertBySn(String sn) { | ||||||
|  |         BusAttendanceMachine machine = new BusAttendanceMachine(); | ||||||
|  |         // 判断考勤机是否存在 | ||||||
|  |         BusAttendanceMachine oldMachine = this.lambdaQuery() | ||||||
|  |             .eq(BusAttendanceMachine::getSn, sn) | ||||||
|  |             .one(); | ||||||
|  |         if (oldMachine != null) { | ||||||
|  |             machine.setId(oldMachine.getId()); | ||||||
|  |         } | ||||||
|  |         machine.setSn(sn); | ||||||
|  |         machine.setStatus("1"); | ||||||
|  |         this.saveOrUpdate(machine); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改考勤机 | ||||||
|  |      * | ||||||
|  |      * @param req 考勤机 | ||||||
|  |      * @return 是否修改成功 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public Boolean updateByBo(BusAttendanceMachineUpdateReq req) { | ||||||
|  |         Long id = req.getId(); | ||||||
|  |         BusAttendanceMachine oldMachine = this.getById(id); | ||||||
|  |         if (oldMachine == null) { | ||||||
|  |             throw new ServiceException("考勤机不存在", HttpStatus.NOT_FOUND); | ||||||
|  |         } | ||||||
|  |         BusAttendanceMachine machine = new BusAttendanceMachine(); | ||||||
|  |         BeanUtils.copyProperties(req, machine); | ||||||
|  |         // 判断班组是否属于所选项目 | ||||||
|  |         Long projectId = req.getProjectId(); | ||||||
|  |         BusProject project = projectService.getById(projectId); | ||||||
|  |         if (project == null) { | ||||||
|  |             throw new ServiceException("所选项目不存在", HttpStatus.NOT_FOUND); | ||||||
|  |         } | ||||||
|  |         String teams = req.getTeams(); | ||||||
|  |         if (StringUtils.isBlank(teams) && StringUtils.isBlank(oldMachine.getTeams())) { | ||||||
|  |             throw new ServiceException("请选择班组", HttpStatus.BAD_REQUEST); | ||||||
|  |         } | ||||||
|  |         if (StringUtils.isNotBlank(teams)) { | ||||||
|  |             List<Long> teamIds = Arrays.stream(teams.split(",")) | ||||||
|  |                 .map(Long::parseLong) | ||||||
|  |                 .distinct() | ||||||
|  |                 .toList(); | ||||||
|  |             List<BusProjectTeam> projectTeams = projectTeamService.listByIds(teamIds); | ||||||
|  |             if (projectTeams.size() != teamIds.size()) { | ||||||
|  |                 throw new ServiceException("所选班组不存在", HttpStatus.NOT_FOUND); | ||||||
|  |             } | ||||||
|  |             String oldTeams = oldMachine.getTeams(); | ||||||
|  |             if (StringUtils.isNotBlank(oldTeams)) { | ||||||
|  |                 List<Long> oldTeamIds = Arrays.stream(oldTeams.split(",")) | ||||||
|  |                     .map(Long::parseLong) | ||||||
|  |                     .distinct() | ||||||
|  |                     .toList(); | ||||||
|  |                 // 获取新增的班组ID | ||||||
|  |                 List<Long> added = teamIds.stream() | ||||||
|  |                     .filter(t -> !oldTeamIds.contains(t)) | ||||||
|  |                     .toList(); | ||||||
|  |                 // 获取删除的班组ID | ||||||
|  |                 List<Long> deleted = oldTeamIds.stream() | ||||||
|  |                     .filter(t -> !teamIds.contains(t)) | ||||||
|  |                     .toList(); | ||||||
|  |                 // 删除的班组不为空时,删除考勤机中对应的人数 | ||||||
|  |                 if (CollUtil.isNotEmpty(deleted)) { | ||||||
|  |                     // 获取待删除的班组的所有用户id | ||||||
|  |                     List<Long> userIds = projectTeamMemberService.lambdaQuery() | ||||||
|  |                         .select(BusProjectTeamMember::getMemberId) | ||||||
|  |                         .in(BusProjectTeamMember::getTeamId, deleted) | ||||||
|  |                         .list() | ||||||
|  |                         .stream().map(BusProjectTeamMember::getMemberId).toList(); | ||||||
|  |                     if (CollUtil.isNotEmpty(userIds)) { | ||||||
|  |                         String[] userIdArray = userIds.stream() | ||||||
|  |                             .map(String::valueOf)   // 将 Long 转成 String | ||||||
|  |                             .toArray(String[]::new); | ||||||
|  |                         try { | ||||||
|  |                             deviceMessageSender.batchDeleteUsers(machine.getSn(), userIdArray); | ||||||
|  |                         } catch (Exception e) { | ||||||
|  |                             throw new ServiceException("删除考勤机用户失败", HttpStatus.ERROR); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             projectTeams.forEach(team -> { | ||||||
|  |                 if (!team.getProjectId().equals(projectId)) { | ||||||
|  |                     throw new ServiceException(team.getTeamName() + "不属于所选项目", HttpStatus.BAD_REQUEST); | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |         return this.updateById(machine); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改考勤机状态 | ||||||
|  |      * | ||||||
|  |      * @param sn     考勤机sn | ||||||
|  |      * @param status 考勤机状态 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public void changeStatus(String sn, String status) { | ||||||
|  |         BusAttendanceMachine machine = this.lambdaQuery() | ||||||
|  |             .eq(BusAttendanceMachine::getSn, sn) | ||||||
|  |             .one(); | ||||||
|  |         if (machine == null) { | ||||||
|  |             machine = new BusAttendanceMachine(); | ||||||
|  |             machine.setSn(sn); | ||||||
|  |         } | ||||||
|  |         machine.setStatus(status); | ||||||
|  |         this.saveOrUpdate(machine); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 校验并批量删除考勤机信息 | ||||||
|  |      * | ||||||
|  |      * @param ids     待删除的主键集合 | ||||||
|  |      * @param isValid 是否进行有效性校验 | ||||||
|  |      * @return 是否删除成功 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { | ||||||
|  |         if (isValid) { | ||||||
|  |             //TODO 做一些业务上的校验,判断是否需要校验 | ||||||
|  |         } | ||||||
|  |         return baseMapper.deleteByIds(ids) > 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,163 @@ | |||||||
|  | package org.dromara.project.service.impl; | ||||||
|  |  | ||||||
|  | import cn.hutool.core.collection.CollUtil; | ||||||
|  | import lombok.RequiredArgsConstructor; | ||||||
|  | import org.dromara.common.core.constant.HttpStatus; | ||||||
|  | import org.dromara.common.core.exception.ServiceException; | ||||||
|  | import org.dromara.common.core.utils.StringUtils; | ||||||
|  | import org.dromara.contractor.domain.SubConstructionUser; | ||||||
|  | import org.dromara.contractor.service.ISubConstructionUserService; | ||||||
|  | import org.dromara.mobileAttendanceMachine.DeviceMessageSender; | ||||||
|  | import org.dromara.mobileAttendanceMachine.KqjEntity; | ||||||
|  | import org.dromara.project.domain.BusAttendanceMachine; | ||||||
|  | import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineSendInfoUserReq; | ||||||
|  | import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineUserQueryReq; | ||||||
|  | import org.dromara.project.domain.dto.attendancemachineuser.BusAttendanceMachineUserRemoveReq; | ||||||
|  | import org.dromara.project.domain.dto.projectteammember.BusProjectTeamMemberQueryReq; | ||||||
|  | import org.dromara.project.domain.vo.BusAttendanceMachineUserVo; | ||||||
|  | import org.dromara.project.domain.vo.projectteammember.BusProjectTeamMemberVo; | ||||||
|  | import org.dromara.project.service.IBusAttendanceMachineService; | ||||||
|  | import org.dromara.project.service.IBusAttendanceMachineUserService; | ||||||
|  | import org.dromara.project.service.IBusProjectTeamMemberService; | ||||||
|  | import org.springframework.stereotype.Service; | ||||||
|  |  | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.HashSet; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Set; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 考勤机用户Service业务层处理 | ||||||
|  |  * | ||||||
|  |  * @author lilemy | ||||||
|  |  * @date 2025-10-15 | ||||||
|  |  */ | ||||||
|  | @RequiredArgsConstructor | ||||||
|  | @Service | ||||||
|  | public class BusAttendanceMachineUserServiceImpl implements IBusAttendanceMachineUserService { | ||||||
|  |  | ||||||
|  |     private final IBusAttendanceMachineService attendanceMachineService; | ||||||
|  |  | ||||||
|  |     private final DeviceMessageSender deviceMessageSender; | ||||||
|  |  | ||||||
|  |     private final ISubConstructionUserService constructionUserService; | ||||||
|  |  | ||||||
|  |     private final IBusProjectTeamMemberService projectTeamMemberService; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询符合条件的考勤机用户列表 | ||||||
|  |      * | ||||||
|  |      * @param req 查询条件 | ||||||
|  |      * @return 考勤机用户列表 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public List<BusAttendanceMachineUserVo> queryList(BusAttendanceMachineUserQueryReq req) { | ||||||
|  |         BusProjectTeamMemberQueryReq query = new BusProjectTeamMemberQueryReq(); | ||||||
|  |         query.setTeamId(req.getTeamId()); | ||||||
|  |         query.setMemberName(req.getUserName()); | ||||||
|  |         List<BusProjectTeamMemberVo> teamMemberList = projectTeamMemberService.queryList(query); | ||||||
|  |         if (CollUtil.isEmpty(teamMemberList)) { | ||||||
|  |             return CollUtil.newArrayList(); | ||||||
|  |         } | ||||||
|  |         BusAttendanceMachine machine = attendanceMachineService.getById(req.getMachineId()); | ||||||
|  |         if (machine == null) { | ||||||
|  |             throw new ServiceException("考勤机不存在", HttpStatus.NOT_FOUND); | ||||||
|  |         } | ||||||
|  |         // 判断选择班组和考勤机是否一致 | ||||||
|  |         if (StringUtils.isBlank(machine.getTeams())) { | ||||||
|  |             throw new ServiceException("考勤机未绑定班组", HttpStatus.NOT_FOUND); | ||||||
|  |         } | ||||||
|  |         if (!Arrays.stream(machine.getTeams().split(",")) | ||||||
|  |             .map(Long::parseLong) | ||||||
|  |             .collect(Collectors.toSet()).contains(req.getTeamId())) { | ||||||
|  |             throw new ServiceException("所选班组与考勤机不匹配", HttpStatus.NOT_FOUND); | ||||||
|  |         } | ||||||
|  |         // 获取考勤机里的用户 | ||||||
|  |         Set<Long> userIdList = new HashSet<>(); | ||||||
|  |         try { | ||||||
|  |             KqjEntity.CommonResponse response = deviceMessageSender.getAllUsers(machine.getSn()); | ||||||
|  |             int code = response.getData().getCode(); | ||||||
|  |             if (code == 0 || code == 200) { | ||||||
|  |                 String[] userIds = response.getData().getUserIds(); | ||||||
|  |                 userIdList = Arrays.stream(userIds).map(Long::parseLong).collect(Collectors.toSet()); | ||||||
|  |             } | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             throw new ServiceException("获取考勤机用户失败", HttpStatus.ERROR); | ||||||
|  |         } | ||||||
|  |         Set<Long> finalUserIdList = userIdList; | ||||||
|  |         return teamMemberList.stream().map(member -> { | ||||||
|  |             BusAttendanceMachineUserVo vo = new BusAttendanceMachineUserVo(); | ||||||
|  |             vo.setMachineId(req.getMachineId()); | ||||||
|  |             vo.setTeamId(req.getTeamId()); | ||||||
|  |             vo.setUserId(member.getMemberId()); | ||||||
|  |             vo.setUserName(member.getMemberName()); | ||||||
|  |             if (CollUtil.isEmpty(finalUserIdList)) { | ||||||
|  |                 vo.setIdentifying(0); | ||||||
|  |             } else if (finalUserIdList.contains(member.getMemberId())) { | ||||||
|  |                 vo.setIdentifying(1); | ||||||
|  |             } else { | ||||||
|  |                 vo.setIdentifying(0); | ||||||
|  |             } | ||||||
|  |             return vo; | ||||||
|  |         }).toList(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 下发用户到考勤机中 | ||||||
|  |      * | ||||||
|  |      * @param req 下发用户参数 | ||||||
|  |      * @return 下发结果 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public String sendPersonInfo(BusAttendanceMachineSendInfoUserReq req) { | ||||||
|  |         Long machineId = req.getMachineId(); | ||||||
|  |         List<Long> userIds = req.getUserIds(); | ||||||
|  |         BusAttendanceMachine machine = attendanceMachineService.getById(machineId); | ||||||
|  |         if (machine == null) { | ||||||
|  |             throw new ServiceException("考勤机不存在", HttpStatus.NOT_FOUND); | ||||||
|  |         } | ||||||
|  |         List<SubConstructionUser> userList = constructionUserService.lambdaQuery() | ||||||
|  |             .in(SubConstructionUser::getSysUserId, userIds) | ||||||
|  |             .list(); | ||||||
|  |         // 返回数据 | ||||||
|  |         StringBuilder sb = new StringBuilder(); | ||||||
|  |         sb.append("用户:["); | ||||||
|  |         int count = 0; | ||||||
|  |         for (SubConstructionUser user : userList) { | ||||||
|  |             Boolean result = deviceMessageSender.sendPersonnelInformation(machine.getSn(), | ||||||
|  |                 user.getSysUserId().toString(), user.getUserName(), user.getFacePic()); | ||||||
|  |             if (!result) { | ||||||
|  |                 sb.append(user.getUserName()).append(" "); | ||||||
|  |                 count++; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         sb.append("] 下发失败"); | ||||||
|  |         return count == 0 ? "下发成功" : sb.toString(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 删除考勤机用户 | ||||||
|  |      * | ||||||
|  |      * @param req 删除参数 | ||||||
|  |      * @return 删除结果 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public Boolean remove(BusAttendanceMachineUserRemoveReq req) { | ||||||
|  |         Long machineId = req.getMachineId(); | ||||||
|  |         List<Long> userIds = req.getUserIds(); | ||||||
|  |         BusAttendanceMachine machine = attendanceMachineService.getById(machineId); | ||||||
|  |         if (machine == null) { | ||||||
|  |             throw new ServiceException("考勤机不存在", HttpStatus.NOT_FOUND); | ||||||
|  |         } | ||||||
|  |         String[] userIdArray = userIds.stream() | ||||||
|  |             .map(String::valueOf)   // 将 Long 转成 String | ||||||
|  |             .toArray(String[]::new); | ||||||
|  |         try { | ||||||
|  |             KqjEntity.CommonResponse response = deviceMessageSender.batchDeleteUsers(machine.getSn(), userIdArray); | ||||||
|  |             return response.getData().getCode() == 0 || response.getData().getCode() == 200; | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             throw new ServiceException("删除考勤机用户失败", HttpStatus.ERROR); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -505,6 +505,7 @@ public class BusLeaveServiceImpl extends ServiceImpl<BusLeaveMapper, BusLeave> | |||||||
|     @Override |     @Override | ||||||
|     public TableDataInfo<BusLeaveVo> listByLoginUser(BusLeaveQueryReq req, PageQuery pageQuery) { |     public TableDataInfo<BusLeaveVo> listByLoginUser(BusLeaveQueryReq req, PageQuery pageQuery) { | ||||||
|         LambdaQueryWrapper<BusLeave> lqw = new LambdaQueryWrapper<>(); |         LambdaQueryWrapper<BusLeave> lqw = new LambdaQueryWrapper<>(); | ||||||
|  |         lqw.orderByDesc(BusLeave::getCreateTime); | ||||||
|  |  | ||||||
|         lqw.eq(ObjectUtils.isNotEmpty(req.getUserId()), BusLeave::getUserId, req.getUserId()); |         lqw.eq(ObjectUtils.isNotEmpty(req.getUserId()), BusLeave::getUserId, req.getUserId()); | ||||||
|  |  | ||||||
|  | |||||||
| @ -7,6 +7,7 @@ import cn.hutool.core.util.PhoneUtil; | |||||||
| import cn.hutool.core.util.RandomUtil; | import cn.hutool.core.util.RandomUtil; | ||||||
| import cn.hutool.json.JSONUtil; | import cn.hutool.json.JSONUtil; | ||||||
| import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||||
|  | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | ||||||
| import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||||
| import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||||
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||||||
| @ -14,6 +15,7 @@ import com.github.benmanes.caffeine.cache.Cache; | |||||||
| import com.github.benmanes.caffeine.cache.Caffeine; | import com.github.benmanes.caffeine.cache.Caffeine; | ||||||
| import jakarta.annotation.Resource; | import jakarta.annotation.Resource; | ||||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||||
|  | import org.dromara.bigscreen.domain.dto.ProjectUpdateDto; | ||||||
| import org.dromara.bigscreen.domain.dto.TanchuangInfoReq; | import org.dromara.bigscreen.domain.dto.TanchuangInfoReq; | ||||||
| import org.dromara.common.core.constant.CacheNames; | import org.dromara.common.core.constant.CacheNames; | ||||||
| import org.dromara.common.core.constant.HttpStatus; | import org.dromara.common.core.constant.HttpStatus; | ||||||
| @ -1184,6 +1186,7 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj | |||||||
|                     Map<String, String> map2 = new HashMap<>(); |                     Map<String, String> map2 = new HashMap<>(); | ||||||
|                     map2.put("lng", project.getLng()); |                     map2.put("lng", project.getLng()); | ||||||
|                     map2.put("lat", project.getLat()); |                     map2.put("lat", project.getLat()); | ||||||
|  |                     map2.put("position",project.getPosition()); | ||||||
|                     map2.put("projectId", project.getId().toString()); |                     map2.put("projectId", project.getId().toString()); | ||||||
|                     map1.put(project.getProjectName(), map2); |                     map1.put(project.getProjectName(), map2); | ||||||
|                     //当满足条件时删除该元素 |                     //当满足条件时删除该元素 | ||||||
| @ -1240,6 +1243,14 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj | |||||||
|         return map; |         return map; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public Boolean updatePosition(ProjectUpdateDto dto) { | ||||||
|  |         if (dto.getProjectId() == null || dto.getPosition() == null) { | ||||||
|  |             throw new ServiceException("传递参数不能为空!"); | ||||||
|  |         } | ||||||
|  |         return baseMapper.update(new LambdaUpdateWrapper<BusProject>().set(BusProject::getPosition, dto.getPosition()).eq(BusProject::getId, dto.getProjectId())) >0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 构造分项工程树 |      * 构造分项工程树 | ||||||
|      */ |      */ | ||||||
|  | |||||||
| @ -214,9 +214,9 @@ public class BusReissueCardServiceImpl extends ServiceImpl<BusReissueCardMapper, | |||||||
|             byId.setClockStatus(BusAttendanceClockStatusEnum.REISSUE.getValue()); |             byId.setClockStatus(BusAttendanceClockStatusEnum.REISSUE.getValue()); | ||||||
|             attendanceService.updateById(byId); |             attendanceService.updateById(byId); | ||||||
|             //缺卡补充当天的工资表 |             //缺卡补充当天的工资表 | ||||||
|             if(BusAttendanceClockStatusEnum.UNCLOCK.getValue().equals(clockStatus)){ | //            if(BusAttendanceClockStatusEnum.UNCLOCK.getValue().equals(clockStatus)){ | ||||||
|                 userSalaryDetailService.insertByAttendance(byId.getUserId(),byId.getClockDate()); | //                userSalaryDetailService.insertByAttendance(byId.getUserId(),byId.getClockDate()); | ||||||
|             } | //            } | ||||||
|             CompletableFuture.runAsync(() -> { |             CompletableFuture.runAsync(() -> { | ||||||
|                 try { |                 try { | ||||||
|                     chatServerHandler.sendSystemMessageToUser(bean.getUserId(),"补卡申请已通过","1"); |                     chatServerHandler.sendSystemMessageToUser(bean.getUserId(),"补卡申请已通过","1"); | ||||||
| @ -511,9 +511,9 @@ public class BusReissueCardServiceImpl extends ServiceImpl<BusReissueCardMapper, | |||||||
|             byId.setClockStatus(BusAttendanceClockStatusEnum.REISSUE.getValue()); |             byId.setClockStatus(BusAttendanceClockStatusEnum.REISSUE.getValue()); | ||||||
|             attendanceService.updateById(byId); |             attendanceService.updateById(byId); | ||||||
|             //缺卡补充当天的工资表 |             //缺卡补充当天的工资表 | ||||||
|             if(BusAttendanceClockStatusEnum.UNCLOCK.getValue().equals(clockStatus)){ | //            if(BusAttendanceClockStatusEnum.UNCLOCK.getValue().equals(clockStatus)){ | ||||||
|                 userSalaryDetailService.insertByAttendance(byId.getUserId(),byId.getClockDate()); | //                userSalaryDetailService.insertByAttendance(byId.getUserId(),byId.getClockDate()); | ||||||
|             } | //            } | ||||||
|             CompletableFuture.runAsync(() -> { |             CompletableFuture.runAsync(() -> { | ||||||
|                 try { |                 try { | ||||||
|                     chatServerHandler.sendSystemMessageToUser(bean.getUserId(),"补卡申请已通过","1"); |                     chatServerHandler.sendSystemMessageToUser(bean.getUserId(),"补卡申请已通过","1"); | ||||||
|  | |||||||
| @ -13,6 +13,7 @@ import org.dromara.safety.domain.dto.fileFolder.FileFolderCreateDTO; | |||||||
| import org.dromara.safety.domain.dto.fileFolder.FileFolderMoveDTO; | import org.dromara.safety.domain.dto.fileFolder.FileFolderMoveDTO; | ||||||
| import org.dromara.safety.domain.dto.fileFolder.ListQueryDto; | import org.dromara.safety.domain.dto.fileFolder.ListQueryDto; | ||||||
| import org.dromara.safety.domain.vo.fileFolder.FileFolderTreeVO; | import org.dromara.safety.domain.vo.fileFolder.FileFolderTreeVO; | ||||||
|  | import org.springframework.http.ResponseEntity; | ||||||
| import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||||
| import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||||
| import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||||
| @ -29,6 +30,7 @@ import org.dromara.safety.domain.vo.HseFileFolderVo; | |||||||
| import org.dromara.safety.domain.bo.HseFileFolderBo; | import org.dromara.safety.domain.bo.HseFileFolderBo; | ||||||
| import org.dromara.safety.service.IHseFileFolderService; | import org.dromara.safety.service.IHseFileFolderService; | ||||||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  | import org.springframework.web.multipart.MultipartFile; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 会议纪要 |  * 会议纪要 | ||||||
| @ -61,6 +63,7 @@ public class HseFileFolderController extends BaseController { | |||||||
|  |  | ||||||
|         // 1. 查询所有子项(利用path前缀匹配,一次性加载所有层级) |         // 1. 查询所有子项(利用path前缀匹配,一次性加载所有层级) | ||||||
|         List<HseFileFolder> allItems = hseFileFolderService.list(new LambdaQueryWrapper<HseFileFolder>() |         List<HseFileFolder> allItems = hseFileFolderService.list(new LambdaQueryWrapper<HseFileFolder>() | ||||||
|  |             .eq(HseFileFolder::getProjectId, dto.getProjectId()) | ||||||
|             .like(HseFileFolder::getPath, "," + dto.getParentId() + ",")  // 包含父ID的所有子项 |             .like(HseFileFolder::getPath, "," + dto.getParentId() + ",")  // 包含父ID的所有子项 | ||||||
|             .eq(dto.getType()!=null,HseFileFolder::getType, dto.getType()) |             .eq(dto.getType()!=null,HseFileFolder::getType, dto.getType()) | ||||||
|             .orderByDesc(HseFileFolder::getId) |             .orderByDesc(HseFileFolder::getId) | ||||||
| @ -122,8 +125,25 @@ public class HseFileFolderController extends BaseController { | |||||||
|         return R.ok(hseFileFolderService.moveFileOrFolder(dto.getId(), dto.getTargetParentId())); |         return R.ok(hseFileFolderService.moveFileOrFolder(dto.getId(), dto.getTargetParentId())); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 上传ZIP文件并自动解压到指定目录(支持多层级) | ||||||
|  |      */ | ||||||
|  |     @PostMapping("/uploadAndUnzip") | ||||||
|  |     public R<String> uploadAndUnzip( | ||||||
|  |         @RequestParam("file") MultipartFile file, | ||||||
|  |         @RequestParam("parentId") Long parentId, | ||||||
|  |         @RequestParam("projectId") Long projectId) { | ||||||
|  |  | ||||||
|  |         try { | ||||||
|  |             // 实际应用中,userId和deptId通常从登录信息中获取 | ||||||
|  |             String result = hseFileFolderService.uploadAndUnzip(file, parentId, projectId); | ||||||
|  |             return R.ok(result); | ||||||
|  |         } catch (IllegalArgumentException e) { | ||||||
|  |             return R.fail(e.getMessage()); | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             return R.fail("文件处理失败:" + e.getMessage()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
| @ -16,6 +16,8 @@ public class FileFolderCreateDTO { | |||||||
|     @NotBlank(message = "名称不能为空") |     @NotBlank(message = "名称不能为空") | ||||||
|     private String name; |     private String name; | ||||||
|  |  | ||||||
|  |     private Long projectId; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 父级ID(0表示根目录) |      * 父级ID(0表示根目录) | ||||||
|      */ |      */ | ||||||
| @ -32,6 +34,12 @@ public class FileFolderCreateDTO { | |||||||
|      */ |      */ | ||||||
|     private Integer sort=0; |     private Integer sort=0; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件id | ||||||
|  |      */ | ||||||
|  |     private Long fileId; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 文件后缀 |      * 文件后缀 | ||||||
|      */ |      */ | ||||||
|  | |||||||
| @ -19,4 +19,8 @@ public class ListQueryDto { | |||||||
|     private Integer type; |     private Integer type; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     @NotNull(message = "项目不能为空") | ||||||
|  |     private Long projectId; | ||||||
|  |  | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -9,6 +9,8 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; | |||||||
| import org.dromara.common.mybatis.core.page.PageQuery; | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
|  |  | ||||||
| import com.baomidou.mybatisplus.extension.service.IService; | import com.baomidou.mybatisplus.extension.service.IService; | ||||||
|  | import org.springframework.web.multipart.MultipartFile; | ||||||
|  |  | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  |  | ||||||
| @ -87,4 +89,15 @@ public interface IHseFileFolderService extends IService<HseFileFolder>{ | |||||||
|      * 移动文件或文件夹到指定目录 |      * 移动文件或文件夹到指定目录 | ||||||
|      */ |      */ | ||||||
|     boolean moveFileOrFolder(Long id, Long targetParentId); |     boolean moveFileOrFolder(Long id, Long targetParentId); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 上传并解压ZIP文件 | ||||||
|  |      */ | ||||||
|  |     String uploadAndUnzip(MultipartFile file, Long parentId, Long projectId) throws Exception; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获取指定目录的树形结构(一次性加载所有层级) | ||||||
|  |      * @return 树形结构列表 | ||||||
|  |      */ | ||||||
|  |     String unzip(Long id, Long parentId); | ||||||
| } | } | ||||||
|  | |||||||
| @ -19,11 +19,14 @@ import org.dromara.safety.domain.HseFileFolder; | |||||||
| import org.dromara.safety.mapper.HseFileFolderMapper; | import org.dromara.safety.mapper.HseFileFolderMapper; | ||||||
| import org.dromara.safety.service.IHseFileFolderService; | import org.dromara.safety.service.IHseFileFolderService; | ||||||
| import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||||
|  | import org.springframework.web.multipart.MultipartFile; | ||||||
|  |  | ||||||
| import java.time.LocalDateTime; | import java.io.File; | ||||||
| import java.util.List; | import java.io.FileInputStream; | ||||||
| import java.util.Map; | import java.nio.charset.Charset; | ||||||
| import java.util.Collection; | import java.util.*; | ||||||
|  | import java.util.zip.ZipEntry; | ||||||
|  | import java.util.zip.ZipInputStream; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 会议纪要Service业务层处理 |  * 会议纪要Service业务层处理 | ||||||
| @ -44,7 +47,7 @@ public class HseFileFolderServiceImpl extends ServiceImpl<HseFileFolderMapper, H | |||||||
|      * @return 会议纪要 |      * @return 会议纪要 | ||||||
|      */ |      */ | ||||||
|     @Override |     @Override | ||||||
|     public HseFileFolderVo queryById(Long id){ |     public HseFileFolderVo queryById(Long id) { | ||||||
|         return baseMapper.selectVoById(id); |         return baseMapper.selectVoById(id); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -125,7 +128,7 @@ public class HseFileFolderServiceImpl extends ServiceImpl<HseFileFolderMapper, H | |||||||
|     /** |     /** | ||||||
|      * 保存前的数据校验 |      * 保存前的数据校验 | ||||||
|      */ |      */ | ||||||
|     private void validEntityBeforeSave(HseFileFolder entity){ |     private void validEntityBeforeSave(HseFileFolder entity) { | ||||||
|         //TODO 做一些数据校验,如唯一约束 |         //TODO 做一些数据校验,如唯一约束 | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -138,7 +141,7 @@ public class HseFileFolderServiceImpl extends ServiceImpl<HseFileFolderMapper, H | |||||||
|      */ |      */ | ||||||
|     @Override |     @Override | ||||||
|     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { |     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { | ||||||
|         if(isValid){ |         if (isValid) { | ||||||
|             //TODO 做一些业务上的校验,判断是否需要校验 |             //TODO 做一些业务上的校验,判断是否需要校验 | ||||||
|         } |         } | ||||||
|         return baseMapper.deleteByIds(ids) > 0; |         return baseMapper.deleteByIds(ids) > 0; | ||||||
| @ -151,8 +154,9 @@ public class HseFileFolderServiceImpl extends ServiceImpl<HseFileFolderMapper, H | |||||||
|         lqw.orderByDesc(HseFileFolder::getId); |         lqw.orderByDesc(HseFileFolder::getId); | ||||||
|         lqw.orderByAsc(HseFileFolder::getSort); |         lqw.orderByAsc(HseFileFolder::getSort); | ||||||
|  |  | ||||||
|  |         lqw.eq(HseFileFolder::getProjectId, dto.getProjectId()); | ||||||
|         lqw.eq(HseFileFolder::getParentId, dto.getParentId()); |         lqw.eq(HseFileFolder::getParentId, dto.getParentId()); | ||||||
|         lqw.eq(dto.getType()!=null,HseFileFolder::getType, dto.getType()); |         lqw.eq(dto.getType() != null, HseFileFolder::getType, dto.getType()); | ||||||
|  |  | ||||||
|         return baseMapper.selectVoList(lqw); |         return baseMapper.selectVoList(lqw); | ||||||
|     } |     } | ||||||
| @ -168,11 +172,13 @@ public class HseFileFolderServiceImpl extends ServiceImpl<HseFileFolderMapper, H | |||||||
|  |  | ||||||
|         // 2. 构建新文件/文件夹对象 |         // 2. 构建新文件/文件夹对象 | ||||||
|         HseFileFolder entity = new HseFileFolder(); |         HseFileFolder entity = new HseFileFolder(); | ||||||
|  |         entity.setProjectId(dto.getProjectId()); | ||||||
|         entity.setName(dto.getName()); |         entity.setName(dto.getName()); | ||||||
|         entity.setParentId(dto.getParentId()); |         entity.setParentId(dto.getParentId()); | ||||||
|         entity.setType(dto.getType()); |         entity.setType(dto.getType()); | ||||||
|         entity.setSort(dto.getSort() != null ? dto.getSort() : 0); |         entity.setSort(dto.getSort() != null ? dto.getSort() : 0); | ||||||
|         entity.setRemark(dto.getRemark()); |         entity.setRemark(dto.getRemark()); | ||||||
|  |         entity.setFileId(dto.getFileId()); | ||||||
|  |  | ||||||
|  |  | ||||||
|         // 3. 设置层级和路径 |         // 3. 设置层级和路径 | ||||||
| @ -236,7 +242,7 @@ public class HseFileFolderServiceImpl extends ServiceImpl<HseFileFolderMapper, H | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         // 2. 防止循环移动(不能移动到自身或子目录下) |         // 2. 防止循环移动(不能移动到自身或子目录下) | ||||||
|         if (source.getPath().contains("," + targetParentId + ",")) { |         if (targetParent.getPath().contains(source.getPath())) { | ||||||
|             throw new ServiceException("不能将文件夹移动到其子目录下"); |             throw new ServiceException("不能将文件夹移动到其子目录下"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @ -244,6 +250,7 @@ public class HseFileFolderServiceImpl extends ServiceImpl<HseFileFolderMapper, H | |||||||
|         String oldPath = source.getPath(); |         String oldPath = source.getPath(); | ||||||
|         String oldParentPath = source.getParentId() == 0 ? ",0," : getById(source.getParentId()).getPath(); |         String oldParentPath = source.getParentId() == 0 ? ",0," : getById(source.getParentId()).getPath(); | ||||||
|         String newParentPath = targetParent.getPath(); |         String newParentPath = targetParent.getPath(); | ||||||
|  |         int oldLevel = source.getLevel(); | ||||||
|  |  | ||||||
|         // 4. 计算新路径和新层级 |         // 4. 计算新路径和新层级 | ||||||
|         String newPath = newParentPath + id + ","; |         String newPath = newParentPath + id + ","; | ||||||
| @ -260,7 +267,7 @@ public class HseFileFolderServiceImpl extends ServiceImpl<HseFileFolderMapper, H | |||||||
|             // 计算路径替换的前后缀 |             // 计算路径替换的前后缀 | ||||||
|             String pathReplaceFrom = oldPath; |             String pathReplaceFrom = oldPath; | ||||||
|             String pathReplaceTo = newPath; |             String pathReplaceTo = newPath; | ||||||
|             int levelDiff = newLevel - source.getLevel(); // 层级变化量 |             int levelDiff = newLevel - oldLevel; // 层级变化量 | ||||||
|  |  | ||||||
|             // 批量更新子项 |             // 批量更新子项 | ||||||
|             baseMapper.batchUpdateChildPaths(pathReplaceFrom, pathReplaceTo, levelDiff, id); |             baseMapper.batchUpdateChildPaths(pathReplaceFrom, pathReplaceTo, levelDiff, id); | ||||||
| @ -268,4 +275,262 @@ public class HseFileFolderServiceImpl extends ServiceImpl<HseFileFolderMapper, H | |||||||
|  |  | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     @Transactional | ||||||
|  |     public String uploadAndUnzip(MultipartFile file, Long parentId, Long projectId) throws Exception { | ||||||
|  |         // 1. 参数验证 | ||||||
|  |         if (file == null || file.isEmpty()) { | ||||||
|  |             throw new ServiceException("上传文件不能为空"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 2. 验证文件类型是否为ZIP | ||||||
|  |         String originalFilename = file.getOriginalFilename(); | ||||||
|  |         if (originalFilename == null || !originalFilename.toLowerCase().endsWith(".zip")) { | ||||||
|  |             throw new ServiceException("只支持上传ZIP格式的文件"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 3. 验证父目录是否存在且为文件夹 | ||||||
|  |         HseFileFolder parentFolder = null; | ||||||
|  |         if (parentId != null && parentId != 0) { | ||||||
|  |             parentFolder = getById(parentId); | ||||||
|  |             if (parentFolder == null || parentFolder.getType() != 1) { | ||||||
|  |                 throw new ServiceException("指定的父目录不存在或不是文件夹"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 4. 创建临时文件用于解压 | ||||||
|  |         File tempZipFile = File.createTempFile("upload_", ".zip"); | ||||||
|  |         try { | ||||||
|  |             // 5. 保存上传的文件到临时位置 | ||||||
|  |             file.transferTo(tempZipFile); | ||||||
|  |  | ||||||
|  |             // 6. 解压ZIP文件 | ||||||
|  |             String unzipResult = doUnzipFile(tempZipFile, parentId, projectId, parentFolder); | ||||||
|  |  | ||||||
|  |             return unzipResult; | ||||||
|  |         } finally { | ||||||
|  |             // 7. 清理临时文件 | ||||||
|  |             if (tempZipFile.exists()) { | ||||||
|  |                 tempZipFile.delete(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 实际执行解压操作的方法 | ||||||
|  |      * | ||||||
|  |      * @param zipFile      ZIP文件 | ||||||
|  |      * @param parentId     父目录ID | ||||||
|  |      * @param projectId    项目ID | ||||||
|  |      * @param parentFolder 父目录对象 | ||||||
|  |      * @return 解压结果信息 | ||||||
|  |      * @throws Exception 解压过程中可能出现的异常 | ||||||
|  |      */ | ||||||
|  |     private String doUnzipFile(File zipFile, Long parentId, Long projectId, HseFileFolder parentFolder) throws Exception { | ||||||
|  |         // 用于记录解压的文件数量 | ||||||
|  |         int fileCount = 0; | ||||||
|  |         int folderCount = 0; | ||||||
|  |  | ||||||
|  |         // 获取父级路径信息 | ||||||
|  |         String parentPath = parentId == null || parentId == 0 ? "," : parentFolder.getPath(); | ||||||
|  |         int parentLevel = parentId == null || parentId == 0 ? 0 : parentFolder.getLevel(); | ||||||
|  |  | ||||||
|  |         try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile), Charset.forName("GBK"))) { | ||||||
|  |             ZipEntry entry; | ||||||
|  |             while ((entry = zis.getNextEntry()) != null) { | ||||||
|  |                 // 跳过目录项(目录会根据文件路径自动创建) | ||||||
|  |                 if (entry.isDirectory()) { | ||||||
|  |                     continue; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 String entryName = entry.getName(); | ||||||
|  |                 // 处理中文文件名乱码问题 | ||||||
|  |                 if (!Charset.forName("GBK").newEncoder().canEncode(entryName)) { | ||||||
|  |                     // 尝试用UTF-8编码解析 | ||||||
|  |                     entryName = new String(entryName.getBytes("ISO-8859-1"), "UTF-8"); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // 分离路径和文件名 | ||||||
|  |                 String[] pathParts = entryName.split("/"); | ||||||
|  |                 String fileName = pathParts[pathParts.length - 1]; | ||||||
|  |  | ||||||
|  |                 // 构造文件在系统中的虚拟路径 | ||||||
|  |                 Long currentParentId = parentId == null ? 0L : parentId; | ||||||
|  |                 String currentPath = parentPath; | ||||||
|  |  | ||||||
|  |                 // 如果ZIP中有目录结构,则需要逐级创建文件夹 | ||||||
|  |                 for (int i = 0; i < pathParts.length - 1; i++) { | ||||||
|  |                     String folderName = pathParts[i]; | ||||||
|  |                     if (folderName.isEmpty()) continue; | ||||||
|  |  | ||||||
|  |                     // 查找是否已存在同名文件夹 | ||||||
|  |                     LambdaQueryWrapper<HseFileFolder> folderQuery = Wrappers.lambdaQuery(); | ||||||
|  |                     folderQuery.eq(HseFileFolder::getProjectId, projectId) | ||||||
|  |                         .eq(HseFileFolder::getParentId, currentParentId) | ||||||
|  |                         .eq(HseFileFolder::getName, folderName) | ||||||
|  |                         .eq(HseFileFolder::getType, 1); // 文件夹类型 | ||||||
|  |  | ||||||
|  |                     HseFileFolder existingFolder = getOne(folderQuery); | ||||||
|  |  | ||||||
|  |                     if (existingFolder == null) { | ||||||
|  |                         // 创建新的文件夹 | ||||||
|  |                         HseFileFolder newFolder = new HseFileFolder(); | ||||||
|  |                         newFolder.setProjectId(projectId); | ||||||
|  |                         newFolder.setName(folderName); | ||||||
|  |                         newFolder.setParentId(currentParentId); | ||||||
|  |                         newFolder.setType(1); // 文件夹 | ||||||
|  |                         newFolder.setLevel(parentLevel + i + 1); | ||||||
|  |                         newFolder.setSort(0); | ||||||
|  |                         newFolder.setPath(currentPath); | ||||||
|  |  | ||||||
|  |                         // 先保存获取ID | ||||||
|  |                         save(newFolder); | ||||||
|  |  | ||||||
|  |                         // 更新路径,格式为 ,parentId,childId, | ||||||
|  |                         newFolder.setPath(currentPath + newFolder.getId() + ","); | ||||||
|  |                         updateById(newFolder); | ||||||
|  |  | ||||||
|  |                         currentParentId = newFolder.getId(); | ||||||
|  |                         currentPath = newFolder.getPath(); | ||||||
|  |                         folderCount++; | ||||||
|  |                     } else { | ||||||
|  |                         currentParentId = existingFolder.getId(); | ||||||
|  |                         currentPath = existingFolder.getPath(); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // 创建文件记录 | ||||||
|  |                 HseFileFolder fileRecord = new HseFileFolder(); | ||||||
|  |                 fileRecord.setProjectId(projectId); | ||||||
|  |                 fileRecord.setName(fileName); | ||||||
|  |                 fileRecord.setParentId(currentParentId); | ||||||
|  |                 fileRecord.setType(2); // 文件类型 | ||||||
|  |                 fileRecord.setLevel(parentLevel + pathParts.length); | ||||||
|  |                 // 文件路径格式为 ,parentId,fileId, | ||||||
|  |                 fileRecord.setPath(currentPath + fileRecord.getId() + ","); | ||||||
|  |  | ||||||
|  |                 // 设置文件扩展名 | ||||||
|  |                 int dotIndex = fileName.lastIndexOf("."); | ||||||
|  |                 if (dotIndex > 0 && dotIndex < fileName.length() - 1) { | ||||||
|  |                     fileRecord.setFileSuffix(fileName.substring(dotIndex + 1)); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // TODO: 这里应该与实际文件存储服务集成,设置真实的文件路径 | ||||||
|  |                 fileRecord.setFilePath(""); // 实际应用中应设置真实文件存储路径 | ||||||
|  |  | ||||||
|  |                 save(fileRecord); | ||||||
|  |  | ||||||
|  |                 // 更新文件的路径(因为ID是自增的,需要先保存再更新路径) | ||||||
|  |                 fileRecord.setPath(currentPath + fileRecord.getId() + ","); | ||||||
|  |                 updateById(fileRecord); | ||||||
|  |  | ||||||
|  |                 fileCount++; | ||||||
|  |  | ||||||
|  |                 zis.closeEntry(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return String.format("解压完成,共创建 %d 个文件夹,%d 个文件", folderCount, fileCount); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     @Transactional | ||||||
|  |     public String unzip(Long id, Long parentId) { | ||||||
|  |         // 1. 参数验证 | ||||||
|  |         if (id == null) { | ||||||
|  |             throw new ServiceException("文件ID不能为空"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 2. 获取要解压的ZIP文件 | ||||||
|  |         HseFileFolder zipFile = getById(id); | ||||||
|  |         if (zipFile == null) { | ||||||
|  |             throw new ServiceException("指定的文件不存在"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 3. 验证是否为ZIP文件 | ||||||
|  |         if (!"zip".equalsIgnoreCase(zipFile.getFileSuffix())) { | ||||||
|  |             throw new ServiceException("只能解压ZIP格式的文件"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 4. 验证文件路径是否存在 | ||||||
|  |         if (StringUtils.isBlank(zipFile.getFilePath())) { | ||||||
|  |             throw new ServiceException("文件存储路径不存在"); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 5. 验证目标目录是否存在且为文件夹 | ||||||
|  |         HseFileFolder parentFolder = null; | ||||||
|  |         if (parentId != null && parentId != 0) { | ||||||
|  |             parentFolder = getById(parentId); | ||||||
|  |             if (parentFolder == null || parentFolder.getType() != 1) { | ||||||
|  |                 throw new ServiceException("指定的目标目录不存在或不是文件夹"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // 6. 下载ZIP文件到临时位置 | ||||||
|  |         try { | ||||||
|  |             // 从URL下载文件 | ||||||
|  |             String fileUrl = zipFile.getFilePath(); | ||||||
|  |             File tempZipFile = downloadFileToTemp(fileUrl); | ||||||
|  |  | ||||||
|  |             if (tempZipFile == null || !tempZipFile.exists()) { | ||||||
|  |                 throw new ServiceException("下载文件失败"); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             try { | ||||||
|  |                 // 7. 解压ZIP文件 | ||||||
|  |                 String unzipResult = doUnzipFile(tempZipFile, parentId, zipFile.getProjectId(), parentFolder); | ||||||
|  |                 return unzipResult; | ||||||
|  |             } finally { | ||||||
|  |                 // 8. 清理临时文件 | ||||||
|  |                 if (tempZipFile.exists()) { | ||||||
|  |                     tempZipFile.delete(); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             throw new ServiceException("解压文件失败: " + e.getMessage()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 从URL下载文件到临时位置 | ||||||
|  |      * | ||||||
|  |      * @param fileUrl 文件URL | ||||||
|  |      * @return 临时文件 | ||||||
|  |      * @throws Exception 下载过程中的异常 | ||||||
|  |      */ | ||||||
|  |     private File downloadFileToTemp(String fileUrl) throws Exception { | ||||||
|  |         // 创建临时文件 | ||||||
|  |         File tempFile = File.createTempFile("download_", ".zip"); | ||||||
|  |  | ||||||
|  |         // 使用Apache HttpClient或其他HTTP客户端下载文件 | ||||||
|  |         // 这里简化处理,实际项目中应根据具体文件存储服务实现 | ||||||
|  |  | ||||||
|  |         // 示例实现(需要根据实际文件存储服务调整): | ||||||
|  |     /* | ||||||
|  |     try (CloseableHttpClient httpClient = HttpClients.createDefault()) { | ||||||
|  |         HttpGet httpGet = new HttpGet(fileUrl); | ||||||
|  |         try (CloseableHttpResponse response = httpClient.execute(httpGet)) { | ||||||
|  |             HttpEntity entity = response.getEntity(); | ||||||
|  |             if (entity != null) { | ||||||
|  |                 try (InputStream inputStream = entity.getContent(); | ||||||
|  |                      FileOutputStream outputStream = new FileOutputStream(tempFile)) { | ||||||
|  |                     byte[] buffer = new byte[8192]; | ||||||
|  |                     int bytesRead; | ||||||
|  |                     while ((bytesRead = inputStream.read(buffer)) != -1) { | ||||||
|  |                         outputStream.write(buffer, 0, bytesRead); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     */ | ||||||
|  |  | ||||||
|  |         // 如果使用MinIO或其他存储服务,需要相应调整实现 | ||||||
|  |  | ||||||
|  |         // 占位实现,实际需要根据文件存储服务来实现 | ||||||
|  |         throw new ServiceException("未实现文件下载功能,请根据实际文件存储服务完善此方法"); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -273,7 +273,7 @@ public class SysUserController extends BaseController { | |||||||
|     @Log(title = "用户管理", businessType = BusinessType.UPDATE) |     @Log(title = "用户管理", businessType = BusinessType.UPDATE) | ||||||
|     @PutMapping("/resetPwd") |     @PutMapping("/resetPwd") | ||||||
|     public R<Void> resetPwd(@RequestBody SysUserBo user) { |     public R<Void> resetPwd(@RequestBody SysUserBo user) { | ||||||
|         userService.checkUserAllowed(user.getUserId()); | //        userService.checkUserAllowed(user.getUserId()); | ||||||
|         userService.checkUserDataScope(user.getUserId()); |         userService.checkUserDataScope(user.getUserId()); | ||||||
|         user.setPassword(BCrypt.hashpw(user.getPassword())); |         user.setPassword(BCrypt.hashpw(user.getPassword())); | ||||||
|         return toAjax(userService.resetUserPwd(user.getUserId(), user.getPassword())); |         return toAjax(userService.resetUserPwd(user.getUserId(), user.getPassword())); | ||||||
|  | |||||||
| @ -280,4 +280,6 @@ public interface ISysUserService { | |||||||
|     List<SysUser> selectUserByRoleIdAndProjectId(Long roleId,Long projectId); |     List<SysUser> selectUserByRoleIdAndProjectId(Long roleId,Long projectId); | ||||||
|  |  | ||||||
|     List<SysUser> selectUserByRoleIdsAndProjectId(List<Long> roleIds,Long projectId); |     List<SysUser> selectUserByRoleIdsAndProjectId(List<Long> roleIds,Long projectId); | ||||||
|  |  | ||||||
|  |     String queryNameById(Long id); | ||||||
| } | } | ||||||
|  | |||||||
| @ -1272,6 +1272,12 @@ public class SysUserServiceImpl implements ISysUserService, UserService { | |||||||
|         return List.of(); |         return List.of(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public String queryNameById(Long id) { | ||||||
|  |         SysUserVo sysUserVo = baseMapper.selectVoById(id); | ||||||
|  |         return sysUserVo != null ? sysUserVo.getNickName() : null; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public UserDTO selectUser(Long userId) { |     public UserDTO selectUser(Long userId) { | ||||||
|  |  | ||||||
|  | |||||||
| @ -172,18 +172,21 @@ public class XzdCsContractChangeVo implements Serializable { | |||||||
|      */ |      */ | ||||||
|     @ExcelProperty(value = "变更后项目经理") |     @ExcelProperty(value = "变更后项目经理") | ||||||
|     private Long afterChangeProjectManager; |     private Long afterChangeProjectManager; | ||||||
|  |     private String afterChangeProjectManagerName; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 变更后项目责任人 |      * 变更后项目责任人 | ||||||
|      */ |      */ | ||||||
|     @ExcelProperty(value = "变更后项目责任人") |     @ExcelProperty(value = "变更后项目责任人") | ||||||
|     private Long afterChangeProjectLeader; |     private Long afterChangeProjectLeader; | ||||||
|  |     private String afterChangeProjectLeaderName; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 变更后现场经理 |      * 变更后现场经理 | ||||||
|      */ |      */ | ||||||
|     @ExcelProperty(value = "变更后现场经理") |     @ExcelProperty(value = "变更后现场经理") | ||||||
|     private Long afterChangeSiteManager; |     private Long afterChangeSiteManager; | ||||||
|  |     private String afterChangeSiteManagerName; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 变更后合同备注 |      * 变更后合同备注 | ||||||
|  | |||||||
| @ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||||||
| import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||||
| import org.dromara.system.domain.vo.SysDeptVo; | import org.dromara.system.domain.vo.SysDeptVo; | ||||||
|  | import org.dromara.system.service.ISysUserService; | ||||||
| import org.dromara.system.service.impl.SysDeptServiceImpl; | import org.dromara.system.service.impl.SysDeptServiceImpl; | ||||||
| import org.dromara.system.service.impl.SysOssServiceImpl; | import org.dromara.system.service.impl.SysOssServiceImpl; | ||||||
| import org.dromara.xzd.comprehensive.domain.XzdCsContractInformation; | import org.dromara.xzd.comprehensive.domain.XzdCsContractInformation; | ||||||
| @ -56,6 +57,8 @@ public class XzdCsContractChangeServiceImpl extends ServiceImpl<XzdCsContractCha | |||||||
|     private XzdSettlementRulesServiceImpl xzdSettlementRulesService; |     private XzdSettlementRulesServiceImpl xzdSettlementRulesService; | ||||||
|     @Autowired |     @Autowired | ||||||
|     private SysOssServiceImpl sysOssService; |     private SysOssServiceImpl sysOssService; | ||||||
|  |     @Autowired | ||||||
|  |     private ISysUserService sysUserService; | ||||||
|  |  | ||||||
|  |  | ||||||
|     @Autowired |     @Autowired | ||||||
| @ -343,6 +346,18 @@ public class XzdCsContractChangeServiceImpl extends ServiceImpl<XzdCsContractCha | |||||||
|         if (xzdSupplierInfoVo != null){ |         if (xzdSupplierInfoVo != null){ | ||||||
|             item.setPartyBName(xzdSupplierInfoVo); |             item.setPartyBName(xzdSupplierInfoVo); | ||||||
|         } |         } | ||||||
|  |         String name1 = sysUserService.queryNameById(item.getAfterChangeSiteManager()); | ||||||
|  |         if (name1 != null){ | ||||||
|  |             item.setAfterChangeSiteManagerName(name1); | ||||||
|  |         } | ||||||
|  |         String name2 = sysUserService.queryNameById(item.getAfterChangeProjectLeader()); | ||||||
|  |         if (name2 != null){ | ||||||
|  |             item.setAfterChangeProjectLeaderName(name2); | ||||||
|  |         } | ||||||
|  |         String name3 = sysUserService.queryNameById(item.getAfterChangeProjectManager()); | ||||||
|  |         if (name3 != null){ | ||||||
|  |             item.setAfterChangeProjectManagerName(name3); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|  | |||||||
| @ -56,7 +56,7 @@ public class XzdPurchaseContractSuspendBo extends BaseEntity { | |||||||
|     /** |     /** | ||||||
|      * 终止日期 |      * 终止日期 | ||||||
|      */ |      */ | ||||||
|     private Date terminationDate; |     private LocalDate terminationDate; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 项目名称 |      * 项目名称 | ||||||
|  | |||||||
| @ -1,8 +1,13 @@ | |||||||
| package org.dromara.xzd.contractManagement.caigoucontractTermination.domain.vo; | package org.dromara.xzd.contractManagement.caigoucontractTermination.domain.vo; | ||||||
|  |  | ||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
|  | import java.time.LocalDateTime; | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
|  |  | ||||||
|  | import com.baomidou.mybatisplus.annotation.FieldFill; | ||||||
|  | import com.baomidou.mybatisplus.annotation.TableField; | ||||||
|  | import org.dromara.common.translation.annotation.Translation; | ||||||
|  | import org.dromara.common.translation.constant.TransConstant; | ||||||
| import org.dromara.xzd.contractManagement.caigoucontractTermination.domain.XzdPurchaseContractSuspend; | import org.dromara.xzd.contractManagement.caigoucontractTermination.domain.XzdPurchaseContractSuspend; | ||||||
| import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||||||
| import com.alibaba.excel.annotation.ExcelProperty; | import com.alibaba.excel.annotation.ExcelProperty; | ||||||
| @ -35,12 +40,17 @@ public class XzdPurchaseContractSuspendVo implements Serializable { | |||||||
|     @ExcelProperty(value = "主键ID") |     @ExcelProperty(value = "主键ID") | ||||||
|     private Long id; |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 采购合同信息ID(合同编号) | ||||||
|  |      */ | ||||||
|  |     @ExcelDictFormat(readConverterExp = "合=同编号") | ||||||
|  |     private Long contractInformationId; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 采购合同信息ID(合同编码) |      * 采购合同信息ID(合同编码) | ||||||
|      */ |      */ | ||||||
|     @ExcelProperty(value = "采购合同信息ID", converter = ExcelDictConvert.class) |  | ||||||
|     @ExcelDictFormat(readConverterExp = "合=同编码") |     @ExcelDictFormat(readConverterExp = "合=同编码") | ||||||
|     private Long contractInformationId; |     private String contractInformationIdName; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 单据编码 |      * 单据编码 | ||||||
| @ -70,7 +80,7 @@ public class XzdPurchaseContractSuspendVo implements Serializable { | |||||||
|      * 终止日期 |      * 终止日期 | ||||||
|      */ |      */ | ||||||
|     @ExcelProperty(value = "终止日期") |     @ExcelProperty(value = "终止日期") | ||||||
|     private Date terminationDate; |     private LocalDate terminationDate; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 项目名称 |      * 项目名称 | ||||||
| @ -84,12 +94,25 @@ public class XzdPurchaseContractSuspendVo implements Serializable { | |||||||
|     @ExcelProperty(value = "乙方单位") |     @ExcelProperty(value = "乙方单位") | ||||||
|     private Long artyBUnit; |     private Long artyBUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 乙方单位名称 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "乙方单位名称") | ||||||
|  |     private String artyBUnitName; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 甲方单位 |      * 甲方单位 | ||||||
|      */ |      */ | ||||||
|     @ExcelProperty(value = "甲方单位") |     @ExcelProperty(value = "甲方单位") | ||||||
|     private Long partyAUnit; |     private Long partyAUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 甲方单位名称 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "甲方单位名称") | ||||||
|  |     private String partyAUnitName; | ||||||
|  |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 终止原因 |      * 终止原因 | ||||||
|      */ |      */ | ||||||
| @ -157,4 +180,24 @@ public class XzdPurchaseContractSuspendVo implements Serializable { | |||||||
|     private String auditStatus; |     private String auditStatus; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建者 | ||||||
|  |      */ | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private Long createBy; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建者 | ||||||
|  |      */ | ||||||
|  |     @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private Long createByName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建时间 | ||||||
|  |      */ | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private LocalDateTime createTime; | ||||||
|  |  | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| package org.dromara.xzd.contractManagement.caigoucontractTermination.service.impl; | package org.dromara.xzd.contractManagement.caigoucontractTermination.service.impl; | ||||||
|  |  | ||||||
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||||||
|  | import org.dromara.common.core.domain.R; | ||||||
| import org.dromara.common.core.utils.MapstructUtils; | import org.dromara.common.core.utils.MapstructUtils; | ||||||
| import org.dromara.common.core.utils.StringUtils; | import org.dromara.common.core.utils.StringUtils; | ||||||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
| @ -12,6 +13,14 @@ import lombok.RequiredArgsConstructor; | |||||||
| import org.dromara.system.service.impl.SysOssServiceImpl; | import org.dromara.system.service.impl.SysOssServiceImpl; | ||||||
| import org.dromara.xzd.biddingManagement.biaoqianlixiang.domain.vo.XzdBidPreProjectVo; | import org.dromara.xzd.biddingManagement.biaoqianlixiang.domain.vo.XzdBidPreProjectVo; | ||||||
| import org.dromara.xzd.contractManagement.purchaseManagement.domain.XzdPurchaseContractInformation; | import org.dromara.xzd.contractManagement.purchaseManagement.domain.XzdPurchaseContractInformation; | ||||||
|  | import org.dromara.xzd.contractManagement.purchaseManagement.domain.vo.XzdPurchaseContractInformationVo; | ||||||
|  | import org.dromara.xzd.contractManagement.purchaseManagement.service.IXzdPurchaseContractInformationService; | ||||||
|  | import org.dromara.xzd.domain.XzdSettlementRules; | ||||||
|  | import org.dromara.xzd.domain.dto.QuerCorrespondentDto; | ||||||
|  | import org.dromara.xzd.service.IXzdCorrespondentList; | ||||||
|  | import org.dromara.xzd.service.IXzdSettlementRulesService; | ||||||
|  | import org.dromara.xzd.service.impl.XzdSupplierInfoServiceImpl; | ||||||
|  | import org.dromara.xzd.settlement.fenbaohetongjungong.domain.vo.SettlementOfSubcontractingCompletionVo; | ||||||
| import org.dromara.xzd.utilS.AreaUtil; | import org.dromara.xzd.utilS.AreaUtil; | ||||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
| @ -40,6 +49,17 @@ public class XzdPurchaseContractSuspendServiceImpl extends ServiceImpl<XzdPurcha | |||||||
|  |  | ||||||
|     private final XzdPurchaseContractSuspendMapper baseMapper; |     private final XzdPurchaseContractSuspendMapper baseMapper; | ||||||
|  |  | ||||||
|  |     private final IXzdSettlementRulesService xzdSettlementRulesService; | ||||||
|  |  | ||||||
|  |     private final IXzdPurchaseContractInformationService xzdPurchaseContractInformationService; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     @Autowired | ||||||
|  |     private XzdSupplierInfoServiceImpl xzdSupplierInfoService; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     @Autowired | ||||||
|  |     private IXzdCorrespondentList iXzdCorrespondentList; | ||||||
|     @Autowired |     @Autowired | ||||||
|     private SysOssServiceImpl sysOssService; |     private SysOssServiceImpl sysOssService; | ||||||
|  |  | ||||||
| @ -53,7 +73,45 @@ public class XzdPurchaseContractSuspendServiceImpl extends ServiceImpl<XzdPurcha | |||||||
|      */ |      */ | ||||||
|     @Override |     @Override | ||||||
|     public XzdPurchaseContractSuspendVo queryById(Long id){ |     public XzdPurchaseContractSuspendVo queryById(Long id){ | ||||||
|         return baseMapper.selectVoById(id); |         XzdPurchaseContractSuspendVo vo = baseMapper.selectVoById(id); | ||||||
|  |         List<XzdPurchaseContractSuspendVo> res = List.of(vo); | ||||||
|  |         setValue(res); | ||||||
|  |         return res.getFirst(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void setValue(List<XzdPurchaseContractSuspendVo> res) { | ||||||
|  |  | ||||||
|  |         for (XzdPurchaseContractSuspendVo item : res) { | ||||||
|  | //            //项目名称 | ||||||
|  | //            if (item.getProject() != null){ | ||||||
|  | //                String projectName = xzdProjectService.queryNameById(item.getProject()); | ||||||
|  | //                if (projectName != null){ | ||||||
|  | //                    item.setProjectName(projectName); | ||||||
|  | //                } | ||||||
|  | //            } | ||||||
|  |             //甲方单位(客户信息列表) | ||||||
|  |             R<QuerCorrespondentDto> byid = iXzdCorrespondentList.getCustomerByid(item.getPartyAUnit()); | ||||||
|  |             if (byid!=null){ | ||||||
|  |                 if (byid.getData().getXzdCustomerinformation() != null){ | ||||||
|  |                     item.setPartyAUnitName(byid.getData().getXzdCustomerinformation().getUnitName()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             //乙方单位(供应商信息列表) | ||||||
|  |             if (item.getArtyBUnit() != null){ | ||||||
|  |                 String unitName = xzdSupplierInfoService.queryNameById(item.getArtyBUnit()); | ||||||
|  |                 if (unitName != null){ | ||||||
|  |                     item.setArtyBUnitName(unitName); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | //            采购合同信息编码 | ||||||
|  |             if (item.getContractInformationId() != null){ | ||||||
|  |                 XzdPurchaseContractInformationVo queryById = xzdPurchaseContractInformationService.queryById(item.getContractInformationId()); | ||||||
|  |                 if (queryById != null){ | ||||||
|  |                     item.setContractInformationIdName(queryById.getContractCode()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @ -67,6 +125,7 @@ public class XzdPurchaseContractSuspendServiceImpl extends ServiceImpl<XzdPurcha | |||||||
|     public TableDataInfo<XzdPurchaseContractSuspendVo> queryPageList(XzdPurchaseContractSuspendBo bo, PageQuery pageQuery) { |     public TableDataInfo<XzdPurchaseContractSuspendVo> queryPageList(XzdPurchaseContractSuspendBo bo, PageQuery pageQuery) { | ||||||
|         LambdaQueryWrapper<XzdPurchaseContractSuspend> lqw = buildQueryWrapper(bo); |         LambdaQueryWrapper<XzdPurchaseContractSuspend> lqw = buildQueryWrapper(bo); | ||||||
|         Page<XzdPurchaseContractSuspendVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); |         Page<XzdPurchaseContractSuspendVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); | ||||||
|  |         setValue(result.getRecords()); | ||||||
|         return TableDataInfo.build(result); |         return TableDataInfo.build(result); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -121,9 +180,9 @@ public class XzdPurchaseContractSuspendServiceImpl extends ServiceImpl<XzdPurcha | |||||||
|  |  | ||||||
|         Long l = baseMapper.selectCount(new LambdaQueryWrapper<XzdPurchaseContractSuspend>().gt(XzdPurchaseContractSuspend::getCreateTime, LocalDate.now())); |         Long l = baseMapper.selectCount(new LambdaQueryWrapper<XzdPurchaseContractSuspend>().gt(XzdPurchaseContractSuspend::getCreateTime, LocalDate.now())); | ||||||
|         String s = areaUtil.generateDateBasedNumber(); |         String s = areaUtil.generateDateBasedNumber(); | ||||||
|         boolean flag = baseMapper.insert(add) > 0; |  | ||||||
|  |  | ||||||
|         add.setReceiptsCode(s+"-"+(l+1)); |         add.setReceiptsCode(s+"-"+(l+1)); | ||||||
|  |  | ||||||
|  |         boolean flag = baseMapper.insert(add) > 0; | ||||||
|         if (flag) { |         if (flag) { | ||||||
|             bo.setId(add.getId()); |             bo.setId(add.getId()); | ||||||
|         } |         } | ||||||
| @ -162,7 +221,6 @@ public class XzdPurchaseContractSuspendServiceImpl extends ServiceImpl<XzdPurcha | |||||||
|         if(isValid){ |         if(isValid){ | ||||||
|  |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         for (Long id : ids) { |         for (Long id : ids) { | ||||||
|             XzdPurchaseContractSuspendVo vo = baseMapper.selectVoById(id); |             XzdPurchaseContractSuspendVo vo = baseMapper.selectVoById(id); | ||||||
|             //                删除附件 |             //                删除附件 | ||||||
|  | |||||||
| @ -147,7 +147,7 @@ public class XzdPurchaseContractAlteration extends BaseEntity { | |||||||
|     private Long changeSiteManager; |     private Long changeSiteManager; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 变更后现场经理 |      * 变更后合同备注 | ||||||
|      */ |      */ | ||||||
|     private Long changeContractRemarks; |     private Long changeContractRemarks; | ||||||
|  |  | ||||||
| @ -160,6 +160,15 @@ public class XzdPurchaseContractAlteration extends BaseEntity { | |||||||
|      * 项目类型 |      * 项目类型 | ||||||
|      */ |      */ | ||||||
|     private String projectType; |     private String projectType; | ||||||
|  |     /** | ||||||
|  |      * 变更价税合计 | ||||||
|  |      */ | ||||||
|  |     private String changeInTotalAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后价税合计 | ||||||
|  |      */ | ||||||
|  |     private String revisedTotalAmount; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 付款额不能超合同额:1-是,0-否 |      * 付款额不能超合同额:1-是,0-否 | ||||||
|  | |||||||
| @ -150,7 +150,7 @@ public class XzdPurchaseContractAlterationBo extends BaseEntity { | |||||||
|     private Long changeSiteManager; |     private Long changeSiteManager; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 变更后现场经理 |      * 变更后合同备注 | ||||||
|      */ |      */ | ||||||
|     private Long changeContractRemarks; |     private Long changeContractRemarks; | ||||||
|  |  | ||||||
| @ -164,6 +164,15 @@ public class XzdPurchaseContractAlterationBo extends BaseEntity { | |||||||
|      */ |      */ | ||||||
|     private String projectType; |     private String projectType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更价税合计 | ||||||
|  |      */ | ||||||
|  |     private String changeInTotalAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后价税合计 | ||||||
|  |      */ | ||||||
|  |     private String revisedTotalAmount; | ||||||
|     /** |     /** | ||||||
|      * 付款额不能超合同额:1-是,0-否 |      * 付款额不能超合同额:1-是,0-否 | ||||||
|      */ |      */ | ||||||
| @ -205,6 +214,11 @@ public class XzdPurchaseContractAlterationBo extends BaseEntity { | |||||||
|     private String auditStatus; |     private String auditStatus; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     private LocalDate startDate; | ||||||
|  |  | ||||||
|  |     private LocalDate endDate; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 预收款项 |      * 预收款项 | ||||||
|  | |||||||
| @ -2,8 +2,13 @@ package org.dromara.xzd.contractManagement.caigouhetongbiangeng.domain.vo; | |||||||
|  |  | ||||||
| import java.math.BigDecimal; | import java.math.BigDecimal; | ||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
|  | import java.time.LocalDateTime; | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
|  |  | ||||||
|  | import com.baomidou.mybatisplus.annotation.FieldFill; | ||||||
|  | import com.baomidou.mybatisplus.annotation.TableField; | ||||||
|  | import org.dromara.common.translation.annotation.Translation; | ||||||
|  | import org.dromara.common.translation.constant.TransConstant; | ||||||
| import org.dromara.xzd.contractManagement.caigouhetongbiangeng.domain.XzdPurchaseContractAlteration; | import org.dromara.xzd.contractManagement.caigouhetongbiangeng.domain.XzdPurchaseContractAlteration; | ||||||
| import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||||||
| import com.alibaba.excel.annotation.ExcelProperty; | import com.alibaba.excel.annotation.ExcelProperty; | ||||||
| @ -12,9 +17,11 @@ import org.dromara.common.excel.convert.ExcelDictConvert; | |||||||
| import io.github.linpeilie.annotations.AutoMapper; | import io.github.linpeilie.annotations.AutoMapper; | ||||||
| import lombok.Data; | import lombok.Data; | ||||||
| import org.dromara.xzd.contractManagement.purchaseManagement.domain.vo.XzdPurchaseContractInformationVo; | import org.dromara.xzd.contractManagement.purchaseManagement.domain.vo.XzdPurchaseContractInformationVo; | ||||||
|  | import org.dromara.xzd.domain.*; | ||||||
|  |  | ||||||
| import java.io.Serial; | import java.io.Serial; | ||||||
| import java.io.Serializable; | import java.io.Serializable; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @ -179,7 +186,7 @@ public class XzdPurchaseContractAlterationVo implements Serializable { | |||||||
|     /** |     /** | ||||||
|      * 变更后现场经理 |      * 变更后现场经理 | ||||||
|      */ |      */ | ||||||
|     @ExcelProperty(value = "变更后现场经理") |     @ExcelProperty(value = "变更后合同备注") | ||||||
|     private Long changeContractRemarks; |     private Long changeContractRemarks; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @ -230,6 +237,25 @@ public class XzdPurchaseContractAlterationVo implements Serializable { | |||||||
|     @ExcelProperty(value = "文件ID") |     @ExcelProperty(value = "文件ID") | ||||||
|     private String fileId; |     private String fileId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建者 | ||||||
|  |      */ | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private Long createBy; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建者 | ||||||
|  |      */ | ||||||
|  |     @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private Long createByName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建时间 | ||||||
|  |      */ | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private LocalDateTime createTime; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 备注 |      * 备注 | ||||||
|      */ |      */ | ||||||
| @ -242,11 +268,45 @@ public class XzdPurchaseContractAlterationVo implements Serializable { | |||||||
|     @ExcelProperty(value = "审核状态") |     @ExcelProperty(value = "审核状态") | ||||||
|     private String auditStatus; |     private String auditStatus; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更价税合计 | ||||||
|  |      */ | ||||||
|  |     private String changeInTotalAmount; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 采购合同信息 |      * 变更后价税合计 | ||||||
|      */ |      */ | ||||||
|     private XzdPurchaseContractInformationVo xzdPurchaseContractInformationVo; |     private String revisedTotalAmount; | ||||||
|  |     /** | ||||||
|  |      * 预收款项 | ||||||
|  |      */ | ||||||
|  |     private List<XzdContractAdvanceInfo> yskx; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 扣款与奖励项 | ||||||
|  |      */ | ||||||
|  |     private List<XzdDeductionItems> kkyjlx; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同条款 | ||||||
|  |      */ | ||||||
|  |     private List<XzdContractClause> httk; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 支付条款 | ||||||
|  |      */ | ||||||
|  |     private List<XzdSettlementRules> zftk; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同主要条款约定 | ||||||
|  |      */ | ||||||
|  |     private XzdContractDepositInfo htzytkyd; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //    /** | ||||||
|  | //     * 采购合同信息 | ||||||
|  | //     */ | ||||||
|  | //    private XzdPurchaseContractInformationVo xzdPurchaseContractInformationVo; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| package org.dromara.xzd.contractManagement.caigouhetongbiangeng.service.impl; | package org.dromara.xzd.contractManagement.caigouhetongbiangeng.service.impl; | ||||||
|  |  | ||||||
| import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||||||
|  | import org.dromara.common.core.domain.R; | ||||||
| import org.dromara.common.core.utils.MapstructUtils; | import org.dromara.common.core.utils.MapstructUtils; | ||||||
| import org.dromara.common.core.utils.StringUtils; | import org.dromara.common.core.utils.StringUtils; | ||||||
| import org.dromara.common.mybatis.core.page.TableDataInfo; | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
| @ -12,10 +13,8 @@ import lombok.RequiredArgsConstructor; | |||||||
| import org.dromara.system.service.impl.SysOssServiceImpl; | import org.dromara.system.service.impl.SysOssServiceImpl; | ||||||
| import org.dromara.xzd.contractManagement.purchaseManagement.domain.vo.XzdPurchaseContractInformationVo; | import org.dromara.xzd.contractManagement.purchaseManagement.domain.vo.XzdPurchaseContractInformationVo; | ||||||
| import org.dromara.xzd.contractManagement.purchaseManagement.service.IXzdPurchaseContractInformationService; | import org.dromara.xzd.contractManagement.purchaseManagement.service.IXzdPurchaseContractInformationService; | ||||||
| import org.dromara.xzd.domain.XzdContractAdvanceInfo; | import org.dromara.xzd.domain.*; | ||||||
| import org.dromara.xzd.domain.XzdContractClause; | import org.dromara.xzd.domain.dto.QuerCorrespondentDto; | ||||||
| import org.dromara.xzd.domain.XzdDeductionItems; |  | ||||||
| import org.dromara.xzd.domain.XzdSettlementRules; |  | ||||||
| import org.dromara.xzd.enums.XzdClassEnum; | import org.dromara.xzd.enums.XzdClassEnum; | ||||||
| import org.dromara.xzd.service.IXzdContractAdvanceInfoService; | import org.dromara.xzd.service.IXzdContractAdvanceInfoService; | ||||||
| import org.dromara.xzd.service.IXzdContractClauseService; | import org.dromara.xzd.service.IXzdContractClauseService; | ||||||
| @ -64,6 +63,13 @@ public class XzdPurchaseContractAlterationServiceImpl extends ServiceImpl<XzdPur | |||||||
|     @Autowired |     @Autowired | ||||||
|     private SysOssServiceImpl sysOssService; |     private SysOssServiceImpl sysOssService; | ||||||
|  |  | ||||||
|  |     @Autowired | ||||||
|  |     private XzdProjectServiceImpl xzdProjectService; | ||||||
|  |     @Autowired | ||||||
|  |     private IXzdCorrespondentList iXzdCorrespondentList; | ||||||
|  |     @Autowired | ||||||
|  |     private XzdSupplierInfoServiceImpl xzdSupplierInfoService; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 查询采购合同变更 |      * 查询采购合同变更 | ||||||
|      * |      * | ||||||
| @ -73,12 +79,50 @@ public class XzdPurchaseContractAlterationServiceImpl extends ServiceImpl<XzdPur | |||||||
|     @Override |     @Override | ||||||
|     public XzdPurchaseContractAlterationVo queryById(Long id){ |     public XzdPurchaseContractAlterationVo queryById(Long id){ | ||||||
|         XzdPurchaseContractAlterationVo xzdPurchaseContractAlterationVo = baseMapper.selectVoById(id); |         XzdPurchaseContractAlterationVo xzdPurchaseContractAlterationVo = baseMapper.selectVoById(id); | ||||||
|         XzdPurchaseContractInformationVo vo = iXzdPurchaseContractInformationService.queryById(xzdPurchaseContractAlterationVo.getContractInformationId()); |         List<XzdPurchaseContractAlterationVo> list = List.of(xzdPurchaseContractAlterationVo); | ||||||
|         xzdPurchaseContractAlterationVo.setXzdPurchaseContractInformationVo( vo); |         setValue(list); | ||||||
|  |  | ||||||
|         return xzdPurchaseContractAlterationVo; |         return xzdPurchaseContractAlterationVo; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public void setValue(List<XzdPurchaseContractAlterationVo> infos){ | ||||||
|  |  | ||||||
|  |         for (XzdPurchaseContractAlterationVo item : infos) { | ||||||
|  |  | ||||||
|  |             //合同文本-预收款项 | ||||||
|  |             LambdaQueryWrapper<XzdContractAdvanceInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>(); | ||||||
|  |             lambdaQueryWrapper.eq(XzdContractAdvanceInfo::getContractDetailsId, item.getId()); | ||||||
|  |             List<XzdContractAdvanceInfo> advanceInfos = xzdContractAdvanceInfoService.list(lambdaQueryWrapper); | ||||||
|  |             item.setYskx(advanceInfos); | ||||||
|  |  | ||||||
|  |             //合同条款-扣款与奖励项 | ||||||
|  |             LambdaQueryWrapper<XzdDeductionItems> lambdaQueryWrapper1 = new LambdaQueryWrapper<>(); | ||||||
|  |             lambdaQueryWrapper1.eq(XzdDeductionItems::getContractDetailsId, item.getId()); | ||||||
|  |             List<XzdDeductionItems> list = xzdDeductionItemsService.list(lambdaQueryWrapper1); | ||||||
|  |             item.setKkyjlx(list); | ||||||
|  |  | ||||||
|  |             //合同条款-合同条款 | ||||||
|  |             LambdaQueryWrapper<XzdContractClause> lambdaQueryWrapper2 = new LambdaQueryWrapper<>(); | ||||||
|  |             lambdaQueryWrapper2.eq(XzdContractClause::getContractDetailsId, item.getId()); | ||||||
|  |             List<XzdContractClause> list1 = xzdContractClauseService.list(lambdaQueryWrapper2); | ||||||
|  |             item.setHttk(list1); | ||||||
|  |  | ||||||
|  |             //支付条款 | ||||||
|  |             LambdaQueryWrapper<XzdSettlementRules> lambdaQueryWrapper3 = new LambdaQueryWrapper<>(); | ||||||
|  |             lambdaQueryWrapper3.eq(XzdSettlementRules::getContractDetailsId, item.getId()); | ||||||
|  |             List<XzdSettlementRules> list2 = xzdSettlementRulesService.list(lambdaQueryWrapper3); | ||||||
|  |             item.setZftk(list2); | ||||||
|  |  | ||||||
|  |             //合同文本-合同主要条款约定 | ||||||
|  |             LambdaQueryWrapper<XzdContractDepositInfo> lambdaQueryWrapper4 = new LambdaQueryWrapper<>(); | ||||||
|  |             lambdaQueryWrapper4.eq(XzdContractDepositInfo::getContractDetailsId, item.getId()); | ||||||
|  |             XzdContractDepositInfo list3 = xzdContractDepositInfoService.getOne(lambdaQueryWrapper4); | ||||||
|  |             item.setHtzytkyd(list3); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 分页查询采购合同变更列表 |      * 分页查询采购合同变更列表 | ||||||
|      * |      * | ||||||
| @ -113,6 +157,11 @@ public class XzdPurchaseContractAlterationServiceImpl extends ServiceImpl<XzdPur | |||||||
|         lqw.eq(StringUtils.isNotBlank(bo.getReceiptsCode()), XzdPurchaseContractAlteration::getReceiptsCode, bo.getReceiptsCode()); |         lqw.eq(StringUtils.isNotBlank(bo.getReceiptsCode()), XzdPurchaseContractAlteration::getReceiptsCode, bo.getReceiptsCode()); | ||||||
|         lqw.eq(StringUtils.isNotBlank(bo.getTitle()), XzdPurchaseContractAlteration::getTitle, bo.getTitle()); |         lqw.eq(StringUtils.isNotBlank(bo.getTitle()), XzdPurchaseContractAlteration::getTitle, bo.getTitle()); | ||||||
|         lqw.eq(bo.getDocumentDate() != null, XzdPurchaseContractAlteration::getDocumentDate, bo.getDocumentDate()); |         lqw.eq(bo.getDocumentDate() != null, XzdPurchaseContractAlteration::getDocumentDate, bo.getDocumentDate()); | ||||||
|  |         lqw.ge(bo.getStartDate() != null, XzdPurchaseContractAlteration::getDocumentDate, bo.getStartDate()); | ||||||
|  |         lqw.le(bo.getEndDate() != null, XzdPurchaseContractAlteration::getDocumentDate, bo.getEndDate()); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         lqw.like(StringUtils.isNotBlank(bo.getContractName()), XzdPurchaseContractAlteration::getContractName, bo.getContractName()); |         lqw.like(StringUtils.isNotBlank(bo.getContractName()), XzdPurchaseContractAlteration::getContractName, bo.getContractName()); | ||||||
|         lqw.eq(StringUtils.isNotBlank(bo.getContractType()), XzdPurchaseContractAlteration::getContractType, bo.getContractType()); |         lqw.eq(StringUtils.isNotBlank(bo.getContractType()), XzdPurchaseContractAlteration::getContractType, bo.getContractType()); | ||||||
|         lqw.eq(StringUtils.isNotBlank(bo.getAlterationType()), XzdPurchaseContractAlteration::getAlterationType, bo.getAlterationType()); |         lqw.eq(StringUtils.isNotBlank(bo.getAlterationType()), XzdPurchaseContractAlteration::getAlterationType, bo.getAlterationType()); | ||||||
| @ -158,11 +207,10 @@ public class XzdPurchaseContractAlterationServiceImpl extends ServiceImpl<XzdPur | |||||||
|         validEntityBeforeSave(add); |         validEntityBeforeSave(add); | ||||||
|         String tableName = XzdClassEnum.CAIGOUHETONG_INFORMATION.getClassName(); |         String tableName = XzdClassEnum.CAIGOUHETONG_INFORMATION.getClassName(); | ||||||
|  |  | ||||||
|  |         boolean flag = baseMapper.insert(add) > 0; | ||||||
|         /** |         /** | ||||||
|          * 预收款项 |          * 预收款项 | ||||||
|          */ |          */ | ||||||
|         HashMap<String, Object> hashMap = new HashMap<>(); |  | ||||||
|         hashMap.put("contract_detailsId", add.getId()); |  | ||||||
|         List<XzdContractAdvanceInfo> yskx = bo.getYskx(); |         List<XzdContractAdvanceInfo> yskx = bo.getYskx(); | ||||||
|         yskx.forEach(item -> { |         yskx.forEach(item -> { | ||||||
|             item.setTableName(tableName); |             item.setTableName(tableName); | ||||||
| @ -187,7 +235,6 @@ public class XzdPurchaseContractAlterationServiceImpl extends ServiceImpl<XzdPur | |||||||
|             item.setContractDetailsId(add.getId()); |             item.setContractDetailsId(add.getId()); | ||||||
|         }); |         }); | ||||||
|         iXzdContractClauseService.saveBatch(httk); |         iXzdContractClauseService.saveBatch(httk); | ||||||
|         boolean flag = baseMapper.insert(add) > 0; |  | ||||||
|         if (flag) { |         if (flag) { | ||||||
|             bo.setId(add.getId()); |             bo.setId(add.getId()); | ||||||
|         } |         } | ||||||
| @ -273,23 +320,23 @@ public class XzdPurchaseContractAlterationServiceImpl extends ServiceImpl<XzdPur | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             //合同文本-预收款项 |  | ||||||
|             LambdaQueryWrapper<XzdContractAdvanceInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>(); |  | ||||||
|             lambdaQueryWrapper.in(XzdContractAdvanceInfo::getContractDetailsId, ids); |  | ||||||
|             xzdContractAdvanceInfoService.remove(lambdaQueryWrapper); |  | ||||||
|             //合同条款-扣款与奖励项 |  | ||||||
|             LambdaQueryWrapper<XzdDeductionItems> lambdaQueryWrapper1 = new LambdaQueryWrapper<>(); |  | ||||||
|             lambdaQueryWrapper1.in(XzdDeductionItems::getContractDetailsId, ids); |  | ||||||
|             xzdDeductionItemsService.remove(lambdaQueryWrapper1); |  | ||||||
|             //合同条款-合同条款 |  | ||||||
|             LambdaQueryWrapper<XzdContractClause> lambdaQueryWrapper2 = new LambdaQueryWrapper<>(); |  | ||||||
|             lambdaQueryWrapper2.in(XzdContractClause::getContractDetailsId, ids); |  | ||||||
|             xzdContractClauseService.remove(lambdaQueryWrapper2); |  | ||||||
|             //支付条款 |  | ||||||
|             LambdaQueryWrapper<XzdSettlementRules> lambdaQueryWrapper3 = new LambdaQueryWrapper<>(); |  | ||||||
|             lambdaQueryWrapper3.in(XzdSettlementRules::getContractDetailsId, ids); |  | ||||||
|             xzdSettlementRulesService.remove(lambdaQueryWrapper3); |  | ||||||
|         } |         } | ||||||
|  |         //合同文本-预收款项 | ||||||
|  |         LambdaQueryWrapper<XzdContractAdvanceInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>(); | ||||||
|  |         lambdaQueryWrapper.in(XzdContractAdvanceInfo::getContractDetailsId, ids); | ||||||
|  |         xzdContractAdvanceInfoService.remove(lambdaQueryWrapper); | ||||||
|  |         //合同条款-扣款与奖励项 | ||||||
|  |         LambdaQueryWrapper<XzdDeductionItems> lambdaQueryWrapper1 = new LambdaQueryWrapper<>(); | ||||||
|  |         lambdaQueryWrapper1.in(XzdDeductionItems::getContractDetailsId, ids); | ||||||
|  |         xzdDeductionItemsService.remove(lambdaQueryWrapper1); | ||||||
|  |         //合同条款-合同条款 | ||||||
|  |         LambdaQueryWrapper<XzdContractClause> lambdaQueryWrapper2 = new LambdaQueryWrapper<>(); | ||||||
|  |         lambdaQueryWrapper2.in(XzdContractClause::getContractDetailsId, ids); | ||||||
|  |         xzdContractClauseService.remove(lambdaQueryWrapper2); | ||||||
|  |         //支付条款 | ||||||
|  |         LambdaQueryWrapper<XzdSettlementRules> lambdaQueryWrapper3 = new LambdaQueryWrapper<>(); | ||||||
|  |         lambdaQueryWrapper3.in(XzdSettlementRules::getContractDetailsId, ids); | ||||||
|  |         xzdSettlementRulesService.remove(lambdaQueryWrapper3); | ||||||
|         if(isValid){ |         if(isValid){ | ||||||
|             //TODO 做一些业务上的校验,判断是否需要校验 |             //TODO 做一些业务上的校验,判断是否需要校验 | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -0,0 +1,105 @@ | |||||||
|  | package org.dromara.xzd.contractManagement.fenbaohetongbiangg.controller; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | import lombok.RequiredArgsConstructor; | ||||||
|  | import jakarta.servlet.http.HttpServletResponse; | ||||||
|  | import jakarta.validation.constraints.*; | ||||||
|  | import cn.dev33.satoken.annotation.SaCheckPermission; | ||||||
|  | import org.springframework.web.bind.annotation.*; | ||||||
|  | import org.springframework.validation.annotation.Validated; | ||||||
|  | import org.dromara.common.idempotent.annotation.RepeatSubmit; | ||||||
|  | import org.dromara.common.log.annotation.Log; | ||||||
|  | import org.dromara.common.web.core.BaseController; | ||||||
|  | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
|  | import org.dromara.common.core.domain.R; | ||||||
|  | import org.dromara.common.core.validate.AddGroup; | ||||||
|  | import org.dromara.common.core.validate.EditGroup; | ||||||
|  | import org.dromara.common.log.enums.BusinessType; | ||||||
|  | import org.dromara.common.excel.utils.ExcelUtil; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongbiangg.domain.vo.XzdSubcontractChangeVo; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongbiangg.domain.bo.XzdSubcontractChangeBo; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongbiangg.service.IXzdSubcontractChangeService; | ||||||
|  | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 分包合同变更 | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-14 | ||||||
|  |  */ | ||||||
|  | @Validated | ||||||
|  | @RequiredArgsConstructor | ||||||
|  | @RestController | ||||||
|  | @RequestMapping("/fenbaohetongbiangg/subcontractChange") | ||||||
|  | public class XzdSubcontractChangeController extends BaseController { | ||||||
|  |  | ||||||
|  |     private final IXzdSubcontractChangeService xzdSubcontractChangeService; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询分包合同变更列表 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("fenbaohetongbiangg:subcontractChange:list") | ||||||
|  |     @GetMapping("/list") | ||||||
|  |     public TableDataInfo<XzdSubcontractChangeVo> list(XzdSubcontractChangeBo bo, PageQuery pageQuery) { | ||||||
|  |         return xzdSubcontractChangeService.queryPageList(bo, pageQuery); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 导出分包合同变更列表 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("fenbaohetongbiangg:subcontractChange:export") | ||||||
|  |     @Log(title = "分包合同变更", businessType = BusinessType.EXPORT) | ||||||
|  |     @PostMapping("/export") | ||||||
|  |     public void export(XzdSubcontractChangeBo bo, HttpServletResponse response) { | ||||||
|  |         List<XzdSubcontractChangeVo> list = xzdSubcontractChangeService.queryList(bo); | ||||||
|  |         ExcelUtil.exportExcel(list, "分包合同变更", XzdSubcontractChangeVo.class, response); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获取分包合同变更详细信息 | ||||||
|  |      * | ||||||
|  |      * @param id 主键 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("fenbaohetongbiangg:subcontractChange:query") | ||||||
|  |     @GetMapping("/{id}") | ||||||
|  |     public R<XzdSubcontractChangeVo> getInfo(@NotNull(message = "主键不能为空") | ||||||
|  |                                      @PathVariable Long id) { | ||||||
|  |         return R.ok(xzdSubcontractChangeService.queryById(id)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 新增分包合同变更 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("fenbaohetongbiangg:subcontractChange:add") | ||||||
|  |     @Log(title = "分包合同变更", businessType = BusinessType.INSERT) | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @PostMapping() | ||||||
|  |     public R<Void> add(@Validated(AddGroup.class) @RequestBody XzdSubcontractChangeBo bo) { | ||||||
|  |         return toAjax(xzdSubcontractChangeService.insertByBo(bo)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改分包合同变更 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("fenbaohetongbiangg:subcontractChange:edit") | ||||||
|  |     @Log(title = "分包合同变更", businessType = BusinessType.UPDATE) | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @PutMapping() | ||||||
|  |     public R<Void> edit(@Validated(EditGroup.class) @RequestBody XzdSubcontractChangeBo bo) { | ||||||
|  |         return toAjax(xzdSubcontractChangeService.updateByBo(bo)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 删除分包合同变更 | ||||||
|  |      * | ||||||
|  |      * @param ids 主键串 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("fenbaohetongbiangg:subcontractChange:remove") | ||||||
|  |     @Log(title = "分包合同变更", businessType = BusinessType.DELETE) | ||||||
|  |     @DeleteMapping("/{ids}") | ||||||
|  |     public R<Void> remove(@NotEmpty(message = "主键不能为空") | ||||||
|  |                           @PathVariable Long[] ids) { | ||||||
|  |         return toAjax(xzdSubcontractChangeService.deleteWithValidByIds(List.of(ids), true)); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,218 @@ | |||||||
|  | package org.dromara.xzd.contractManagement.fenbaohetongbiangg.domain; | ||||||
|  |  | ||||||
|  | import org.dromara.common.mybatis.core.domain.BaseEntity; | ||||||
|  | import com.baomidou.mybatisplus.annotation.*; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.EqualsAndHashCode; | ||||||
|  | import java.math.BigDecimal; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.time.LocalDate; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 分包合同变更对象 xzd_subcontract_change | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-14 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @EqualsAndHashCode(callSuper = true) | ||||||
|  | @TableName("xzd_subcontract_change") | ||||||
|  | public class XzdSubcontractChange extends BaseEntity { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * | ||||||
|  |      */ | ||||||
|  |     @TableId(value = "id") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据编码 | ||||||
|  |      */ | ||||||
|  |     private String documentCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标题 | ||||||
|  |      */ | ||||||
|  |     private String title; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据日期 | ||||||
|  |      */ | ||||||
|  |     private LocalDate documentDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同编码 | ||||||
|  |      */ | ||||||
|  |     private Long contractCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同名称 | ||||||
|  |      */ | ||||||
|  |     private String contractName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同类型(字典) | ||||||
|  |      */ | ||||||
|  |     private String contractType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更类型(字典) | ||||||
|  |      */ | ||||||
|  |     private String changeType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目 | ||||||
|  |      */ | ||||||
|  |     private String project; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 经营模式 | ||||||
|  |      */ | ||||||
|  |     private String businessModel; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 组织 | ||||||
|  |      */ | ||||||
|  |     private String organization; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 甲方单位 | ||||||
|  |      */ | ||||||
|  |     private String partyAUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 乙方单位 | ||||||
|  |      */ | ||||||
|  |     private String partyBUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 原合同造价 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal originalContractCost; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更价税合计 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal changeTaxInclusiveTotal; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后总造价 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal postChangeTotalCost; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计变更金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal cumulativeChangeAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 可用目标成本 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal availableTargetCost; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 目标成本 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal targetCost; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 目标成本项 | ||||||
|  |      */ | ||||||
|  |     private String targetCostItem; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 警示 | ||||||
|  |      */ | ||||||
|  |     private String warning; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 支付条款 | ||||||
|  |      */ | ||||||
|  |     private String paymentTerms; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remarks; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 是否用印 | ||||||
|  |      */ | ||||||
|  |     private Long isStamped; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后项目经理 | ||||||
|  |      */ | ||||||
|  |     private Long postChangeProjectManager; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后项目责任人 | ||||||
|  |      */ | ||||||
|  |     private Long postChangeProjectOwner; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后现场经理 | ||||||
|  |      */ | ||||||
|  |     private Long postChangeSiteManager; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后合同备注 | ||||||
|  |      */ | ||||||
|  |     private String postChangeContractRemarks; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目大类(字典) | ||||||
|  |      */ | ||||||
|  |     private String projectCategory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目类型(字典) | ||||||
|  |      */ | ||||||
|  |     private String projectType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款额不能超合同额 | ||||||
|  |      */ | ||||||
|  |     private Long isPaymentNotExceedContract; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款额不能超合同额支付比 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal paymentNotExceedRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预结算/结算额不能超合同额 | ||||||
|  |      */ | ||||||
|  |     private Long isPreSettlementNotExceedContract; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预结算/结算额不能超合同额比例 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal preSettlementNotExceedRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 实时刷新 | ||||||
|  |      */ | ||||||
|  |     private Long isRealTimeRefresh; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同累计变更金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal contractCumulativeChangeAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件id (多个文件逗号分隔) | ||||||
|  |      */ | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用ID | ||||||
|  |      */ | ||||||
|  |     private Long danjuId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,244 @@ | |||||||
|  | package org.dromara.xzd.contractManagement.fenbaohetongbiangg.domain.bo; | ||||||
|  |  | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongbiangg.domain.XzdSubcontractChange; | ||||||
|  | import org.dromara.common.mybatis.core.domain.BaseEntity; | ||||||
|  | import org.dromara.common.core.validate.AddGroup; | ||||||
|  | import org.dromara.common.core.validate.EditGroup; | ||||||
|  | import io.github.linpeilie.annotations.AutoMapper; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.EqualsAndHashCode; | ||||||
|  | import jakarta.validation.constraints.*; | ||||||
|  | import org.dromara.xzd.domain.XzdContractAdvanceInfo; | ||||||
|  | import org.dromara.xzd.domain.XzdContractClause; | ||||||
|  | import org.dromara.xzd.domain.XzdDeductionItems; | ||||||
|  |  | ||||||
|  | import java.math.BigDecimal; | ||||||
|  | import java.time.LocalDate; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 分包合同变更业务对象 xzd_subcontract_change | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-14 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @EqualsAndHashCode(callSuper = true) | ||||||
|  | @AutoMapper(target = XzdSubcontractChange.class, reverseConvertGenerate = false) | ||||||
|  | public class XzdSubcontractChangeBo extends BaseEntity { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "不能为空", groups = { EditGroup.class }) | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据编码 | ||||||
|  |      */ | ||||||
|  |     @NotBlank(message = "单据编码不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private String documentCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标题 | ||||||
|  |      */ | ||||||
|  |     private String title; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据日期 | ||||||
|  |      */ | ||||||
|  |     private LocalDate documentDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同编码 | ||||||
|  |      */ | ||||||
|  |     private Long contractCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同名称 | ||||||
|  |      */ | ||||||
|  |     private String contractName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同类型(字典) | ||||||
|  |      */ | ||||||
|  |     private String contractType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更类型(字典) | ||||||
|  |      */ | ||||||
|  |     private String changeType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目 | ||||||
|  |      */ | ||||||
|  |     private String project; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 经营模式 | ||||||
|  |      */ | ||||||
|  |     private String businessModel; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 组织 | ||||||
|  |      */ | ||||||
|  |     private String organization; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 甲方单位 | ||||||
|  |      */ | ||||||
|  |     private String partyAUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 乙方单位 | ||||||
|  |      */ | ||||||
|  |     private String partyBUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 原合同造价 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal originalContractCost; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更价税合计 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal changeTaxInclusiveTotal; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后总造价 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal postChangeTotalCost; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计变更金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal cumulativeChangeAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 可用目标成本 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal availableTargetCost; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 目标成本 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal targetCost; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 目标成本项 | ||||||
|  |      */ | ||||||
|  |     private String targetCostItem; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 警示 | ||||||
|  |      */ | ||||||
|  |     private String warning; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 支付条款 | ||||||
|  |      */ | ||||||
|  |     private String paymentTerms; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remarks; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 是否用印 | ||||||
|  |      */ | ||||||
|  |     private Long isStamped; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后项目经理 | ||||||
|  |      */ | ||||||
|  |     private Long postChangeProjectManager; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后项目责任人 | ||||||
|  |      */ | ||||||
|  |     private Long postChangeProjectOwner; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后现场经理 | ||||||
|  |      */ | ||||||
|  |     private Long postChangeSiteManager; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后合同备注 | ||||||
|  |      */ | ||||||
|  |     private String postChangeContractRemarks; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目大类(字典) | ||||||
|  |      */ | ||||||
|  |     private String projectCategory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目类型(字典) | ||||||
|  |      */ | ||||||
|  |     private String projectType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款额不能超合同额 | ||||||
|  |      */ | ||||||
|  |     private Long isPaymentNotExceedContract; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款额不能超合同额支付比 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal paymentNotExceedRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预结算/结算额不能超合同额 | ||||||
|  |      */ | ||||||
|  |     private Long isPreSettlementNotExceedContract; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预结算/结算额不能超合同额比例 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal preSettlementNotExceedRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 实时刷新 | ||||||
|  |      */ | ||||||
|  |     private Long isRealTimeRefresh; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同累计变更金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal contractCumulativeChangeAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件id (多个文件逗号分隔) | ||||||
|  |      */ | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用ID | ||||||
|  |      */ | ||||||
|  |     private Long danjuId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     private LocalDate startTime; | ||||||
|  |     private LocalDate endTime; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预收款项 | ||||||
|  |      */ | ||||||
|  |     private List<XzdContractAdvanceInfo> yskx; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 扣款与奖励项 | ||||||
|  |      */ | ||||||
|  |     private List<XzdDeductionItems> kkyjlx; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同条款 | ||||||
|  |      */ | ||||||
|  |     private List<XzdContractClause> httk; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,325 @@ | |||||||
|  | package org.dromara.xzd.contractManagement.fenbaohetongbiangg.domain.vo; | ||||||
|  |  | ||||||
|  | import java.math.BigDecimal; | ||||||
|  |  | ||||||
|  | import com.baomidou.mybatisplus.annotation.FieldFill; | ||||||
|  | import com.baomidou.mybatisplus.annotation.TableField; | ||||||
|  | import org.dromara.common.translation.annotation.Translation; | ||||||
|  | import org.dromara.common.translation.constant.TransConstant; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongbiangg.domain.XzdSubcontractChange; | ||||||
|  | import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||||||
|  | import com.alibaba.excel.annotation.ExcelProperty; | ||||||
|  | import org.dromara.common.excel.annotation.ExcelDictFormat; | ||||||
|  | import org.dromara.common.excel.convert.ExcelDictConvert; | ||||||
|  | import io.github.linpeilie.annotations.AutoMapper; | ||||||
|  | import lombok.Data; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongxinxi.domain.XzdSubcontract; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongxinxi.domain.vo.XzdSubcontractVo; | ||||||
|  | import org.dromara.xzd.domain.*; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  | import java.time.LocalDate; | ||||||
|  | import java.time.LocalDateTime; | ||||||
|  | import java.util.Date; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 分包合同变更视图对象 xzd_subcontract_change | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-14 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @ExcelIgnoreUnannotated | ||||||
|  | @AutoMapper(target = XzdSubcontractChange.class) | ||||||
|  | public class XzdSubcontractChangeVo implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据编码 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "单据编码") | ||||||
|  |     private String documentCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标题 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "标题") | ||||||
|  |     private String title; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据日期 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "单据日期") | ||||||
|  |     private LocalDate documentDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同编码 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "合同编码") | ||||||
|  |     private Long contractCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同名称 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "合同名称") | ||||||
|  |     private String contractName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同类型(字典) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "合同类型", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "字=典") | ||||||
|  |     private String contractType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更类型(字典) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "变更类型", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "字=典") | ||||||
|  |     private String changeType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "项目") | ||||||
|  |     private String project; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 经营模式 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "经营模式") | ||||||
|  |     private String businessModel; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 组织 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "组织") | ||||||
|  |     private String organization; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 甲方单位 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "甲方单位") | ||||||
|  |     private String partyAUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 乙方单位 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "乙方单位") | ||||||
|  |     private String partyBUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 原合同造价 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "原合同造价") | ||||||
|  |     private BigDecimal originalContractCost; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更价税合计 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "变更价税合计") | ||||||
|  |     private BigDecimal changeTaxInclusiveTotal; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后总造价 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "变更后总造价") | ||||||
|  |     private BigDecimal postChangeTotalCost; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计变更金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计变更金额") | ||||||
|  |     private BigDecimal cumulativeChangeAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 可用目标成本 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "可用目标成本") | ||||||
|  |     private BigDecimal availableTargetCost; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 目标成本 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "目标成本") | ||||||
|  |     private BigDecimal targetCost; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 目标成本项 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "目标成本项") | ||||||
|  |     private String targetCostItem; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 警示 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "警示") | ||||||
|  |     private String warning; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 支付条款 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "支付条款") | ||||||
|  |     private String paymentTerms; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "备注") | ||||||
|  |     private String remarks; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 是否用印 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "是否用印") | ||||||
|  |     private Long isStamped; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后项目经理 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "变更后项目经理") | ||||||
|  |     private Long postChangeProjectManager; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后项目责任人 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "变更后项目责任人") | ||||||
|  |     private Long postChangeProjectOwner; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后现场经理 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "变更后现场经理") | ||||||
|  |     private Long postChangeSiteManager; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 变更后合同备注 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "变更后合同备注") | ||||||
|  |     private String postChangeContractRemarks; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目大类(字典) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "项目大类", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "字=典") | ||||||
|  |     private String projectCategory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目类型(字典) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "项目类型", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "字=典") | ||||||
|  |     private String projectType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款额不能超合同额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "付款额不能超合同额") | ||||||
|  |     private Long isPaymentNotExceedContract; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款额不能超合同额支付比 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "付款额不能超合同额支付比") | ||||||
|  |     private BigDecimal paymentNotExceedRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预结算/结算额不能超合同额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "预结算/结算额不能超合同额") | ||||||
|  |     private Long isPreSettlementNotExceedContract; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预结算/结算额不能超合同额比例 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "预结算/结算额不能超合同额比例") | ||||||
|  |     private BigDecimal preSettlementNotExceedRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 实时刷新 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "实时刷新") | ||||||
|  |     private Long isRealTimeRefresh; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同累计变更金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "合同累计变更金额") | ||||||
|  |     private BigDecimal contractCumulativeChangeAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件id (多个文件逗号分隔) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "文件id ", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "多=个文件逗号分隔") | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用ID | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "单据引用ID") | ||||||
|  |     private Long danjuId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建者 | ||||||
|  |      */ | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private Long createBy; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建者 | ||||||
|  |      */ | ||||||
|  |     @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private Long createByName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建时间 | ||||||
|  |      */ | ||||||
|  |     private LocalDateTime createTime; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预收款项 | ||||||
|  |      */ | ||||||
|  |     private List<XzdContractAdvanceInfo> yskx; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 扣款与奖励项 | ||||||
|  |      */ | ||||||
|  |     private List<XzdDeductionItems> kkyjlx; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同条款 | ||||||
|  |      */ | ||||||
|  |     private List<XzdContractClause> httk; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 支付条款 | ||||||
|  |      */ | ||||||
|  |     private List<XzdSettlementRules> zftk; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同主要条款约定 | ||||||
|  |      */ | ||||||
|  |     private XzdContractDepositInfo htzytkyd; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | package org.dromara.xzd.contractManagement.fenbaohetongbiangg.mapper; | ||||||
|  |  | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongbiangg.domain.XzdSubcontractChange; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongbiangg.domain.vo.XzdSubcontractChangeVo; | ||||||
|  | import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 分包合同变更Mapper接口 | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-14 | ||||||
|  |  */ | ||||||
|  | public interface XzdSubcontractChangeMapper extends BaseMapperPlus<XzdSubcontractChange, XzdSubcontractChangeVo> { | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,70 @@ | |||||||
|  | package org.dromara.xzd.contractManagement.fenbaohetongbiangg.service; | ||||||
|  |  | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongbiangg.domain.vo.XzdSubcontractChangeVo; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongbiangg.domain.bo.XzdSubcontractChangeBo; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongbiangg.domain.XzdSubcontractChange; | ||||||
|  | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
|  |  | ||||||
|  | import com.baomidou.mybatisplus.extension.service.IService; | ||||||
|  | import java.util.Collection; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 分包合同变更Service接口 | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-14 | ||||||
|  |  */ | ||||||
|  | public interface IXzdSubcontractChangeService extends IService<XzdSubcontractChange>{ | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询分包合同变更 | ||||||
|  |      * | ||||||
|  |      * @param id 主键 | ||||||
|  |      * @return 分包合同变更 | ||||||
|  |      */ | ||||||
|  |     XzdSubcontractChangeVo queryById(Long id); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 分页查询分包合同变更列表 | ||||||
|  |      * | ||||||
|  |      * @param bo        查询条件 | ||||||
|  |      * @param pageQuery 分页参数 | ||||||
|  |      * @return 分包合同变更分页列表 | ||||||
|  |      */ | ||||||
|  |     TableDataInfo<XzdSubcontractChangeVo> queryPageList(XzdSubcontractChangeBo bo, PageQuery pageQuery); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询符合条件的分包合同变更列表 | ||||||
|  |      * | ||||||
|  |      * @param bo 查询条件 | ||||||
|  |      * @return 分包合同变更列表 | ||||||
|  |      */ | ||||||
|  |     List<XzdSubcontractChangeVo> queryList(XzdSubcontractChangeBo bo); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 新增分包合同变更 | ||||||
|  |      * | ||||||
|  |      * @param bo 分包合同变更 | ||||||
|  |      * @return 是否新增成功 | ||||||
|  |      */ | ||||||
|  |     Boolean insertByBo(XzdSubcontractChangeBo bo); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改分包合同变更 | ||||||
|  |      * | ||||||
|  |      * @param bo 分包合同变更 | ||||||
|  |      * @return 是否修改成功 | ||||||
|  |      */ | ||||||
|  |     Boolean updateByBo(XzdSubcontractChangeBo bo); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 校验并批量删除分包合同变更信息 | ||||||
|  |      * | ||||||
|  |      * @param ids     待删除的主键集合 | ||||||
|  |      * @param isValid 是否进行有效性校验 | ||||||
|  |      * @return 是否删除成功 | ||||||
|  |      */ | ||||||
|  |     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); | ||||||
|  | } | ||||||
| @ -0,0 +1,355 @@ | |||||||
|  | package org.dromara.xzd.contractManagement.fenbaohetongbiangg.service.impl; | ||||||
|  |  | ||||||
|  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||||||
|  | import org.dromara.common.core.exception.ServiceException; | ||||||
|  | import org.dromara.common.core.utils.MapstructUtils; | ||||||
|  | import org.dromara.common.core.utils.StringUtils; | ||||||
|  | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
|  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||||
|  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||||
|  | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||||
|  | import lombok.RequiredArgsConstructor; | ||||||
|  | import org.dromara.system.service.impl.SysOssServiceImpl; | ||||||
|  | import org.dromara.xzd.contractManagement.caigouhetongbiangeng.domain.vo.XzdPurchaseContractAlterationVo; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongxinxi.domain.vo.XzdSubcontractVo; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongxinxi.service.IXzdSubcontractService; | ||||||
|  | import org.dromara.xzd.contractManagement.purchaseManagement.service.IXzdPurchaseContractInformationService; | ||||||
|  | import org.dromara.xzd.domain.*; | ||||||
|  | import org.dromara.xzd.enums.XzdClassEnum; | ||||||
|  | import org.dromara.xzd.service.IXzdContractAdvanceInfoService; | ||||||
|  | import org.dromara.xzd.service.IXzdContractClauseService; | ||||||
|  | import org.dromara.xzd.service.IXzdDeductionItemsService; | ||||||
|  | import org.dromara.xzd.service.impl.XzdContractAdvanceInfoServiceImpl; | ||||||
|  | import org.dromara.xzd.service.impl.XzdContractClauseServiceImpl; | ||||||
|  | import org.dromara.xzd.service.impl.XzdDeductionItemsServiceImpl; | ||||||
|  | import org.dromara.xzd.service.impl.XzdSettlementRulesServiceImpl; | ||||||
|  | import org.springframework.beans.factory.annotation.Autowired; | ||||||
|  | import org.springframework.stereotype.Service; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongbiangg.domain.bo.XzdSubcontractChangeBo; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongbiangg.domain.vo.XzdSubcontractChangeVo; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongbiangg.domain.XzdSubcontractChange; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongbiangg.mapper.XzdSubcontractChangeMapper; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongbiangg.service.IXzdSubcontractChangeService; | ||||||
|  |  | ||||||
|  | import java.util.*; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 分包合同变更Service业务层处理 | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-14 | ||||||
|  |  */ | ||||||
|  | @RequiredArgsConstructor | ||||||
|  | @Service | ||||||
|  | public class XzdSubcontractChangeServiceImpl extends ServiceImpl<XzdSubcontractChangeMapper, XzdSubcontractChange> implements IXzdSubcontractChangeService { | ||||||
|  |  | ||||||
|  |     private final XzdSubcontractChangeMapper baseMapper; | ||||||
|  |  | ||||||
|  |     private final IXzdContractAdvanceInfoService iXzdContractAdvanceInfoService; | ||||||
|  |  | ||||||
|  |     private final IXzdDeductionItemsService iXzdDeductionItemsService; | ||||||
|  |  | ||||||
|  |     private final IXzdContractClauseService iXzdContractClauseService; | ||||||
|  |  | ||||||
|  |     private final IXzdSubcontractService iXzdSubcontractService; | ||||||
|  |  | ||||||
|  |     private final SysOssServiceImpl sysOssService; | ||||||
|  |  | ||||||
|  |     @Autowired | ||||||
|  |     private XzdContractAdvanceInfoServiceImpl xzdContractAdvanceInfoService; | ||||||
|  |     @Autowired | ||||||
|  |     private XzdDeductionItemsServiceImpl xzdDeductionItemsService; | ||||||
|  |     @Autowired | ||||||
|  |     private XzdContractClauseServiceImpl xzdContractClauseService; | ||||||
|  |     @Autowired | ||||||
|  |     private XzdSettlementRulesServiceImpl xzdSettlementRulesService; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询分包合同变更 | ||||||
|  |      * | ||||||
|  |      * @param id 主键 | ||||||
|  |      * @return 分包合同变更 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public XzdSubcontractChangeVo queryById(Long id) { | ||||||
|  |         XzdSubcontractChangeVo xzdSubcontractChangeVo = baseMapper.selectVoById(id); | ||||||
|  |         List<XzdSubcontractChangeVo> list = List.of(xzdSubcontractChangeVo); | ||||||
|  |         setValue(list); | ||||||
|  |  | ||||||
|  |         return xzdSubcontractChangeVo; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private void setValue(List<XzdSubcontractChangeVo> lists) { | ||||||
|  |         for (XzdSubcontractChangeVo item : lists) { | ||||||
|  |  | ||||||
|  |             //合同文本-预收款项 | ||||||
|  |             LambdaQueryWrapper<XzdContractAdvanceInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>(); | ||||||
|  |             lambdaQueryWrapper.eq(XzdContractAdvanceInfo::getContractDetailsId, item.getId()); | ||||||
|  |             List<XzdContractAdvanceInfo> advanceInfos = xzdContractAdvanceInfoService.list(lambdaQueryWrapper); | ||||||
|  |             item.setYskx(advanceInfos); | ||||||
|  |  | ||||||
|  |             //合同条款-扣款与奖励项 | ||||||
|  |             LambdaQueryWrapper<XzdDeductionItems> lambdaQueryWrapper1 = new LambdaQueryWrapper<>(); | ||||||
|  |             lambdaQueryWrapper1.eq(XzdDeductionItems::getContractDetailsId, item.getId()); | ||||||
|  |             List<XzdDeductionItems> list = xzdDeductionItemsService.list(lambdaQueryWrapper1); | ||||||
|  |             item.setKkyjlx(list); | ||||||
|  |  | ||||||
|  |             //合同条款-合同条款 | ||||||
|  |             LambdaQueryWrapper<XzdContractClause> lambdaQueryWrapper2 = new LambdaQueryWrapper<>(); | ||||||
|  |             lambdaQueryWrapper2.eq(XzdContractClause::getContractDetailsId, item.getId()); | ||||||
|  |             List<XzdContractClause> list1 = xzdContractClauseService.list(lambdaQueryWrapper2); | ||||||
|  |             item.setHttk(list1); | ||||||
|  |  | ||||||
|  |             //支付条款 | ||||||
|  |             LambdaQueryWrapper<XzdSettlementRules> lambdaQueryWrapper3 = new LambdaQueryWrapper<>(); | ||||||
|  |             lambdaQueryWrapper3.eq(XzdSettlementRules::getContractDetailsId, item.getId()); | ||||||
|  |             List<XzdSettlementRules> list2 = xzdSettlementRulesService.list(lambdaQueryWrapper3); | ||||||
|  |             item.setZftk(list2); | ||||||
|  |  | ||||||
|  | //            //合同文本-合同主要条款约定 | ||||||
|  | //            LambdaQueryWrapper<XzdContractDepositInfo> lambdaQueryWrapper4 = new LambdaQueryWrapper<>(); | ||||||
|  | //            lambdaQueryWrapper4.eq(XzdContractDepositInfo::getContractDetailsId, item.getId()); | ||||||
|  | //            XzdContractDepositInfo list3 = xzdContractDepositInfoService.getOne(lambdaQueryWrapper4); | ||||||
|  | //            item.setHtzytkyd(list3); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 分页查询分包合同变更列表 | ||||||
|  |      * | ||||||
|  |      * @param bo        查询条件 | ||||||
|  |      * @param pageQuery 分页参数 | ||||||
|  |      * @return 分包合同变更分页列表 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public TableDataInfo<XzdSubcontractChangeVo> queryPageList(XzdSubcontractChangeBo bo, PageQuery pageQuery) { | ||||||
|  |         LambdaQueryWrapper<XzdSubcontractChange> lqw = buildQueryWrapper(bo); | ||||||
|  |         Page<XzdSubcontractChangeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); | ||||||
|  |         return TableDataInfo.build(result); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询符合条件的分包合同变更列表 | ||||||
|  |      * | ||||||
|  |      * @param bo 查询条件 | ||||||
|  |      * @return 分包合同变更列表 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public List<XzdSubcontractChangeVo> queryList(XzdSubcontractChangeBo bo) { | ||||||
|  |         LambdaQueryWrapper<XzdSubcontractChange> lqw = buildQueryWrapper(bo); | ||||||
|  |         return baseMapper.selectVoList(lqw); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private LambdaQueryWrapper<XzdSubcontractChange> buildQueryWrapper(XzdSubcontractChangeBo bo) { | ||||||
|  |         Map<String, Object> params = bo.getParams(); | ||||||
|  |         LambdaQueryWrapper<XzdSubcontractChange> lqw = Wrappers.lambdaQuery(); | ||||||
|  |         lqw.orderByDesc(XzdSubcontractChange::getId); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getDocumentCode()), XzdSubcontractChange::getDocumentCode, bo.getDocumentCode()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getTitle()), XzdSubcontractChange::getTitle, bo.getTitle()); | ||||||
|  |         lqw.eq(bo.getDocumentDate() != null, XzdSubcontractChange::getDocumentDate, bo.getDocumentDate()); | ||||||
|  |         lqw.ge(bo.getStartTime() != null, XzdSubcontractChange::getDocumentDate, bo.getStartTime()); | ||||||
|  |         lqw.le(bo.getEndTime() != null, XzdSubcontractChange::getDocumentDate, bo.getEndTime()); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         lqw.eq(bo.getContractCode() != null, XzdSubcontractChange::getContractCode, bo.getContractCode()); | ||||||
|  |         lqw.like(StringUtils.isNotBlank(bo.getContractName()), XzdSubcontractChange::getContractName, bo.getContractName()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getContractType()), XzdSubcontractChange::getContractType, bo.getContractType()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getChangeType()), XzdSubcontractChange::getChangeType, bo.getChangeType()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getProject()), XzdSubcontractChange::getProject, bo.getProject()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getBusinessModel()), XzdSubcontractChange::getBusinessModel, bo.getBusinessModel()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getOrganization()), XzdSubcontractChange::getOrganization, bo.getOrganization()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getPartyAUnit()), XzdSubcontractChange::getPartyAUnit, bo.getPartyAUnit()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getPartyBUnit()), XzdSubcontractChange::getPartyBUnit, bo.getPartyBUnit()); | ||||||
|  |         lqw.eq(bo.getOriginalContractCost() != null, XzdSubcontractChange::getOriginalContractCost, bo.getOriginalContractCost()); | ||||||
|  |         lqw.eq(bo.getChangeTaxInclusiveTotal() != null, XzdSubcontractChange::getChangeTaxInclusiveTotal, bo.getChangeTaxInclusiveTotal()); | ||||||
|  |         lqw.eq(bo.getPostChangeTotalCost() != null, XzdSubcontractChange::getPostChangeTotalCost, bo.getPostChangeTotalCost()); | ||||||
|  |         lqw.eq(bo.getCumulativeChangeAmount() != null, XzdSubcontractChange::getCumulativeChangeAmount, bo.getCumulativeChangeAmount()); | ||||||
|  |         lqw.eq(bo.getAvailableTargetCost() != null, XzdSubcontractChange::getAvailableTargetCost, bo.getAvailableTargetCost()); | ||||||
|  |         lqw.eq(bo.getTargetCost() != null, XzdSubcontractChange::getTargetCost, bo.getTargetCost()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getTargetCostItem()), XzdSubcontractChange::getTargetCostItem, bo.getTargetCostItem()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getWarning()), XzdSubcontractChange::getWarning, bo.getWarning()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getPaymentTerms()), XzdSubcontractChange::getPaymentTerms, bo.getPaymentTerms()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getRemarks()), XzdSubcontractChange::getRemarks, bo.getRemarks()); | ||||||
|  |         lqw.eq(bo.getIsStamped() != null, XzdSubcontractChange::getIsStamped, bo.getIsStamped()); | ||||||
|  |         lqw.eq(bo.getPostChangeProjectManager() != null, XzdSubcontractChange::getPostChangeProjectManager, bo.getPostChangeProjectManager()); | ||||||
|  |         lqw.eq(bo.getPostChangeProjectOwner() != null, XzdSubcontractChange::getPostChangeProjectOwner, bo.getPostChangeProjectOwner()); | ||||||
|  |         lqw.eq(bo.getPostChangeSiteManager() != null, XzdSubcontractChange::getPostChangeSiteManager, bo.getPostChangeSiteManager()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getPostChangeContractRemarks()), XzdSubcontractChange::getPostChangeContractRemarks, bo.getPostChangeContractRemarks()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getProjectCategory()), XzdSubcontractChange::getProjectCategory, bo.getProjectCategory()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getProjectType()), XzdSubcontractChange::getProjectType, bo.getProjectType()); | ||||||
|  |         lqw.eq(bo.getIsPaymentNotExceedContract() != null, XzdSubcontractChange::getIsPaymentNotExceedContract, bo.getIsPaymentNotExceedContract()); | ||||||
|  |         lqw.eq(bo.getPaymentNotExceedRatio() != null, XzdSubcontractChange::getPaymentNotExceedRatio, bo.getPaymentNotExceedRatio()); | ||||||
|  |         lqw.eq(bo.getIsPreSettlementNotExceedContract() != null, XzdSubcontractChange::getIsPreSettlementNotExceedContract, bo.getIsPreSettlementNotExceedContract()); | ||||||
|  |         lqw.eq(bo.getPreSettlementNotExceedRatio() != null, XzdSubcontractChange::getPreSettlementNotExceedRatio, bo.getPreSettlementNotExceedRatio()); | ||||||
|  |         lqw.eq(bo.getIsRealTimeRefresh() != null, XzdSubcontractChange::getIsRealTimeRefresh, bo.getIsRealTimeRefresh()); | ||||||
|  |         lqw.eq(bo.getContractCumulativeChangeAmount() != null, XzdSubcontractChange::getContractCumulativeChangeAmount, bo.getContractCumulativeChangeAmount()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getFileId()), XzdSubcontractChange::getFileId, bo.getFileId()); | ||||||
|  |         lqw.eq(bo.getDanjuId() != null, XzdSubcontractChange::getDanjuId, bo.getDanjuId()); | ||||||
|  |         return lqw; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 新增分包合同变更 | ||||||
|  |      * | ||||||
|  |      * @param bo 分包合同变更 | ||||||
|  |      * @return 是否新增成功 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public Boolean insertByBo(XzdSubcontractChangeBo bo) { | ||||||
|  |         XzdSubcontractChange add = MapstructUtils.convert(bo, XzdSubcontractChange.class); | ||||||
|  |         validEntityBeforeSave(add); | ||||||
|  |         boolean flag = baseMapper.insert(add) > 0; | ||||||
|  |         String tableName = XzdClassEnum.CAIGOUHETONG_INFORMATION.getClassName(); | ||||||
|  |  | ||||||
|  |         /** | ||||||
|  |          * 预收款项 | ||||||
|  |          */ | ||||||
|  |         HashMap<String, Object> hashMap = new HashMap<>(); | ||||||
|  |         hashMap.put("contract_detailsId", add.getId()); | ||||||
|  |         List<XzdContractAdvanceInfo> yskx = bo.getYskx(); | ||||||
|  |         yskx.forEach(item -> { | ||||||
|  |             item.setTableName(tableName); | ||||||
|  |             item.setContractDetailsId(add.getId()); | ||||||
|  |         }); | ||||||
|  |         iXzdContractAdvanceInfoService.saveBatch(yskx); | ||||||
|  |         /** | ||||||
|  |          * 扣款与奖励项 | ||||||
|  |          */ | ||||||
|  |         List<XzdDeductionItems> kkyjlx = bo.getKkyjlx(); | ||||||
|  |         kkyjlx.forEach(item -> { | ||||||
|  |             item.setTableName(tableName); | ||||||
|  |             item.setContractDetailsId(add.getId()); | ||||||
|  |         }); | ||||||
|  |         iXzdDeductionItemsService.saveBatch(kkyjlx); | ||||||
|  |         /** | ||||||
|  |          * 合同条款 | ||||||
|  |          */ | ||||||
|  |         List<XzdContractClause> httk = bo.getHttk(); | ||||||
|  |         httk.forEach(item -> { | ||||||
|  |             item.setTableName(tableName); | ||||||
|  |             item.setContractDetailsId(add.getId()); | ||||||
|  |         }); | ||||||
|  |         iXzdContractClauseService.saveBatch(httk); | ||||||
|  |         if (flag) { | ||||||
|  |             bo.setId(add.getId()); | ||||||
|  |         } | ||||||
|  |         return flag; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改分包合同变更 | ||||||
|  |      * | ||||||
|  |      * @param bo 分包合同变更 | ||||||
|  |      * @return 是否修改成功 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public Boolean updateByBo(XzdSubcontractChangeBo bo) { | ||||||
|  |         XzdSubcontractChange add = MapstructUtils.convert(bo, XzdSubcontractChange.class); | ||||||
|  |         /** | ||||||
|  |          * 预收款项 优先删除数据在添加 | ||||||
|  |          */ | ||||||
|  |         String tableName = XzdClassEnum.PURCHASE_CONTRACT_INFORMATION.getClassName(); | ||||||
|  |         HashMap<String, Object> hashMap = new HashMap<>(); | ||||||
|  |         hashMap.put("contract_details_id", add.getId()); | ||||||
|  |         XzdSubcontractChangeVo xzdSubcontractChangeVo = baseMapper.selectVoById(add.getId()); | ||||||
|  |         if (xzdSubcontractChangeVo == null){ | ||||||
|  |             throw new ServiceException("数据不存在"); | ||||||
|  |         } | ||||||
|  |         List<XzdContractAdvanceInfo> yskx = bo.getYskx(); | ||||||
|  |         iXzdContractAdvanceInfoService.getBaseMapper().deleteByMap(hashMap); | ||||||
|  |         if (yskx != null){ | ||||||
|  |             yskx.forEach(item -> { | ||||||
|  |                 item.setTableName(tableName); | ||||||
|  |                 item.setContractDetailsId(add.getId()); | ||||||
|  |             }); | ||||||
|  |             iXzdContractAdvanceInfoService.saveBatch(yskx); | ||||||
|  |         } | ||||||
|  |         /** | ||||||
|  |          * 扣款与奖励项 | ||||||
|  |          */ | ||||||
|  |         List<XzdDeductionItems> kkyjlx = bo.getKkyjlx(); | ||||||
|  |         iXzdDeductionItemsService.getBaseMapper().deleteByMap(hashMap); | ||||||
|  |         if(kkyjlx != null){ | ||||||
|  |             kkyjlx.forEach(item -> { | ||||||
|  |                 item.setTableName(tableName); | ||||||
|  |                 item.setContractDetailsId(add.getId()); | ||||||
|  |             }); | ||||||
|  |             iXzdDeductionItemsService.saveBatch(kkyjlx); | ||||||
|  |         } | ||||||
|  |         /** | ||||||
|  |          * 合同条款 | ||||||
|  |          */ | ||||||
|  |         List<XzdContractClause> httk = bo.getHttk(); | ||||||
|  |         iXzdContractClauseService.getBaseMapper().deleteByMap(hashMap); | ||||||
|  |         if (httk != null){ | ||||||
|  |             httk.forEach(item -> { | ||||||
|  |                 item.setTableName(tableName); | ||||||
|  |                 item.setContractDetailsId(add.getId()); | ||||||
|  |             }); | ||||||
|  |             iXzdContractClauseService.saveBatch(httk); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         return baseMapper.updateById(add) > 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 保存前的数据校验 | ||||||
|  |      */ | ||||||
|  |     private void validEntityBeforeSave(XzdSubcontractChange entity){ | ||||||
|  |         //TODO 做一些数据校验,如唯一约束 | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 校验并批量删除分包合同变更信息 | ||||||
|  |      * | ||||||
|  |      * @param ids     待删除的主键集合 | ||||||
|  |      * @param isValid 是否进行有效性校验 | ||||||
|  |      * @return 是否删除成功 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { | ||||||
|  |         if(isValid){ | ||||||
|  |  | ||||||
|  |         } | ||||||
|  |         for (Long id : ids) { | ||||||
|  |             XzdSubcontractChangeVo vo = baseMapper.selectVoById(id); | ||||||
|  |             if (vo != null){ | ||||||
|  |                 //删除附件 | ||||||
|  |                 if (vo.getFileId()!= null && !vo.getFileId().isEmpty()){ | ||||||
|  |                     List<Long> deleteIds = Arrays.stream(vo.getFileId().split(",")).map(Long::valueOf).toList(); | ||||||
|  |                     if (!deleteIds.isEmpty()) { | ||||||
|  |                         sysOssService.deleteWithValidByIds(deleteIds, false); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         //合同文本-预收款项 | ||||||
|  |         LambdaQueryWrapper<XzdContractAdvanceInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>(); | ||||||
|  |         lambdaQueryWrapper.in(XzdContractAdvanceInfo::getContractDetailsId, ids); | ||||||
|  |         xzdContractAdvanceInfoService.remove(lambdaQueryWrapper); | ||||||
|  |         //合同条款-扣款与奖励项 | ||||||
|  |         LambdaQueryWrapper<XzdDeductionItems> lambdaQueryWrapper1 = new LambdaQueryWrapper<>(); | ||||||
|  |         lambdaQueryWrapper1.in(XzdDeductionItems::getContractDetailsId, ids); | ||||||
|  |         xzdDeductionItemsService.remove(lambdaQueryWrapper1); | ||||||
|  |         //合同条款-合同条款 | ||||||
|  |         LambdaQueryWrapper<XzdContractClause> lambdaQueryWrapper2 = new LambdaQueryWrapper<>(); | ||||||
|  |         lambdaQueryWrapper2.in(XzdContractClause::getContractDetailsId, ids); | ||||||
|  |         xzdContractClauseService.remove(lambdaQueryWrapper2); | ||||||
|  |         //支付条款 | ||||||
|  |         LambdaQueryWrapper<XzdSettlementRules> lambdaQueryWrapper3 = new LambdaQueryWrapper<>(); | ||||||
|  |         lambdaQueryWrapper3.in(XzdSettlementRules::getContractDetailsId, ids); | ||||||
|  |         xzdSettlementRulesService.remove(lambdaQueryWrapper3); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         return baseMapper.deleteByIds(ids) > 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -203,7 +203,7 @@ public class XzdSubcontract extends BaseEntity { | |||||||
|     /** |     /** | ||||||
|      * 备案时间 |      * 备案时间 | ||||||
|      */ |      */ | ||||||
|     private LocalDateTime filingTime; |     private LocalDate filingTime; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * WBS |      * WBS | ||||||
|  | |||||||
| @ -29,13 +29,11 @@ public class XzdSubcontractBo extends BaseEntity { | |||||||
|     /** |     /** | ||||||
|      * |      * | ||||||
|      */ |      */ | ||||||
|     @NotNull(message = "不能为空", groups = { EditGroup.class }) |  | ||||||
|     private Long id; |     private Long id; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 合同编码 |      * 合同编码 | ||||||
|      */ |      */ | ||||||
|     @NotBlank(message = "合同编码不能为空", groups = { AddGroup.class, EditGroup.class }) |  | ||||||
|     private String contractCode; |     private String contractCode; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @ -206,7 +204,7 @@ public class XzdSubcontractBo extends BaseEntity { | |||||||
|     /** |     /** | ||||||
|      * 备案时间 |      * 备案时间 | ||||||
|      */ |      */ | ||||||
|     private LocalDateTime filingTime; |     private LocalDate filingTime; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * WBS |      * WBS | ||||||
|  | |||||||
| @ -2,6 +2,8 @@ package org.dromara.xzd.contractManagement.fenbaohetongxinxi.domain.vo; | |||||||
|  |  | ||||||
| import java.math.BigDecimal; | import java.math.BigDecimal; | ||||||
|  |  | ||||||
|  | import com.baomidou.mybatisplus.annotation.FieldFill; | ||||||
|  | import com.baomidou.mybatisplus.annotation.TableField; | ||||||
| import org.dromara.common.translation.annotation.Translation; | import org.dromara.common.translation.annotation.Translation; | ||||||
| import org.dromara.common.translation.constant.TransConstant; | import org.dromara.common.translation.constant.TransConstant; | ||||||
| import org.dromara.xzd.contractManagement.fenbaohetongxinxi.domain.XzdSubcontract; | import org.dromara.xzd.contractManagement.fenbaohetongxinxi.domain.XzdSubcontract; | ||||||
| @ -321,7 +323,7 @@ public class XzdSubcontractVo implements Serializable { | |||||||
|      * 备案时间 |      * 备案时间 | ||||||
|      */ |      */ | ||||||
|     @ExcelProperty(value = "备案时间") |     @ExcelProperty(value = "备案时间") | ||||||
|     private LocalDateTime filingTime; |     private LocalDate filingTime; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * WBS |      * WBS | ||||||
| @ -389,6 +391,27 @@ public class XzdSubcontractVo implements Serializable { | |||||||
|     @ExcelProperty(value = "单据引用ID") |     @ExcelProperty(value = "单据引用ID") | ||||||
|     private Long danjuId; |     private Long danjuId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建者 | ||||||
|  |      */ | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private Long createBy; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建者 | ||||||
|  |      */ | ||||||
|  |     @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private Long createByName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建时间 | ||||||
|  |      */ | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private LocalDateTime createTime; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 预收款项 |      * 预收款项 | ||||||
|      */ |      */ | ||||||
|  | |||||||
| @ -89,7 +89,7 @@ public class XzdSubcontractServiceImpl extends ServiceImpl<XzdSubcontractMapper, | |||||||
|         //        装填数据 |         //        装填数据 | ||||||
|         setValue(informationVo); |         setValue(informationVo); | ||||||
|  |  | ||||||
|         return baseMapper.selectVoById(id); |         return xzdSubcontractVo; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @ -109,8 +109,6 @@ public class XzdSubcontractServiceImpl extends ServiceImpl<XzdSubcontractMapper, | |||||||
|  |  | ||||||
|     private void setValue(List<XzdSubcontractVo> infos) { |     private void setValue(List<XzdSubcontractVo> infos) { | ||||||
|         for (XzdSubcontractVo item : infos) { |         for (XzdSubcontractVo item : infos) { | ||||||
|  |  | ||||||
|  |  | ||||||
|             //项目名称 |             //项目名称 | ||||||
|             if (item.getProject() != null){ |             if (item.getProject() != null){ | ||||||
|                 String projectName = xzdProjectService.queryNameById(item.getProject()); |                 String projectName = xzdProjectService.queryNameById(item.getProject()); | ||||||
| @ -270,8 +268,9 @@ public class XzdSubcontractServiceImpl extends ServiceImpl<XzdSubcontractMapper, | |||||||
|         validEntityBeforeSave(add); |         validEntityBeforeSave(add); | ||||||
|         Long l = baseMapper.selectCount(new LambdaQueryWrapper<XzdSubcontract>().gt(XzdSubcontract::getCreateTime, LocalDate.now())); |         Long l = baseMapper.selectCount(new LambdaQueryWrapper<XzdSubcontract>().gt(XzdSubcontract::getCreateTime, LocalDate.now())); | ||||||
|         String s = areaUtil.generateDateBasedNumberByY(); |         String s = areaUtil.generateDateBasedNumberByY(); | ||||||
|         boolean flag = baseMapper.insert(add) > 0; |  | ||||||
|         add.setContractCode(ZxdEnum.FENBAOHETONG_PREFIX.getTypeValue()+"-"+s+"-"+(l+1)); |         add.setContractCode(ZxdEnum.FENBAOHETONG_PREFIX.getTypeValue()+"-"+s+"-"+(l+1)); | ||||||
|  |         boolean flag = baseMapper.insert(add) > 0; | ||||||
| //        表名 | //        表名 | ||||||
|         String tableName = XzdClassEnum.FENBAOHETONG_INFORMATION.getClassName(); |         String tableName = XzdClassEnum.FENBAOHETONG_INFORMATION.getClassName(); | ||||||
|  |  | ||||||
|  | |||||||
| @ -0,0 +1,105 @@ | |||||||
|  | package org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.controller; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | import lombok.RequiredArgsConstructor; | ||||||
|  | import jakarta.servlet.http.HttpServletResponse; | ||||||
|  | import jakarta.validation.constraints.*; | ||||||
|  | import cn.dev33.satoken.annotation.SaCheckPermission; | ||||||
|  | import org.springframework.web.bind.annotation.*; | ||||||
|  | import org.springframework.validation.annotation.Validated; | ||||||
|  | import org.dromara.common.idempotent.annotation.RepeatSubmit; | ||||||
|  | import org.dromara.common.log.annotation.Log; | ||||||
|  | import org.dromara.common.web.core.BaseController; | ||||||
|  | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
|  | import org.dromara.common.core.domain.R; | ||||||
|  | import org.dromara.common.core.validate.AddGroup; | ||||||
|  | import org.dromara.common.core.validate.EditGroup; | ||||||
|  | import org.dromara.common.log.enums.BusinessType; | ||||||
|  | import org.dromara.common.excel.utils.ExcelUtil; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain.vo.XzdSubcontractTerminationVo; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain.bo.XzdSubcontractTerminationBo; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.service.IXzdSubcontractTerminationService; | ||||||
|  | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 分包合同终止 | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-14 | ||||||
|  |  */ | ||||||
|  | @Validated | ||||||
|  | @RequiredArgsConstructor | ||||||
|  | @RestController | ||||||
|  | @RequestMapping("/fenbaohetongzhongzhi/subcontractTermination") | ||||||
|  | public class XzdSubcontractTerminationController extends BaseController { | ||||||
|  |  | ||||||
|  |     private final IXzdSubcontractTerminationService xzdSubcontractTerminationService; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询分包合同终止列表 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("fenbaohetongzhongzhi:subcontractTermination:list") | ||||||
|  |     @GetMapping("/list") | ||||||
|  |     public TableDataInfo<XzdSubcontractTerminationVo> list(XzdSubcontractTerminationBo bo, PageQuery pageQuery) { | ||||||
|  |         return xzdSubcontractTerminationService.queryPageList(bo, pageQuery); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 导出分包合同终止列表 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("fenbaohetongzhongzhi:subcontractTermination:export") | ||||||
|  |     @Log(title = "分包合同终止", businessType = BusinessType.EXPORT) | ||||||
|  |     @PostMapping("/export") | ||||||
|  |     public void export(XzdSubcontractTerminationBo bo, HttpServletResponse response) { | ||||||
|  |         List<XzdSubcontractTerminationVo> list = xzdSubcontractTerminationService.queryList(bo); | ||||||
|  |         ExcelUtil.exportExcel(list, "分包合同终止", XzdSubcontractTerminationVo.class, response); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获取分包合同终止详细信息 | ||||||
|  |      * | ||||||
|  |      * @param id 主键 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("fenbaohetongzhongzhi:subcontractTermination:query") | ||||||
|  |     @GetMapping("/{id}") | ||||||
|  |     public R<XzdSubcontractTerminationVo> getInfo(@NotNull(message = "主键不能为空") | ||||||
|  |                                      @PathVariable Long id) { | ||||||
|  |         return R.ok(xzdSubcontractTerminationService.queryById(id)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 新增分包合同终止 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("fenbaohetongzhongzhi:subcontractTermination:add") | ||||||
|  |     @Log(title = "分包合同终止", businessType = BusinessType.INSERT) | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @PostMapping() | ||||||
|  |     public R<Void> add(@Validated(AddGroup.class) @RequestBody XzdSubcontractTerminationBo bo) { | ||||||
|  |         return toAjax(xzdSubcontractTerminationService.insertByBo(bo)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改分包合同终止 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("fenbaohetongzhongzhi:subcontractTermination:edit") | ||||||
|  |     @Log(title = "分包合同终止", businessType = BusinessType.UPDATE) | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @PutMapping() | ||||||
|  |     public R<Void> edit(@Validated(EditGroup.class) @RequestBody XzdSubcontractTerminationBo bo) { | ||||||
|  |         return toAjax(xzdSubcontractTerminationService.updateByBo(bo)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 删除分包合同终止 | ||||||
|  |      * | ||||||
|  |      * @param ids 主键串 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("fenbaohetongzhongzhi:subcontractTermination:remove") | ||||||
|  |     @Log(title = "分包合同终止", businessType = BusinessType.DELETE) | ||||||
|  |     @DeleteMapping("/{ids}") | ||||||
|  |     public R<Void> remove(@NotEmpty(message = "主键不能为空") | ||||||
|  |                           @PathVariable Long[] ids) { | ||||||
|  |         return toAjax(xzdSubcontractTerminationService.deleteWithValidByIds(List.of(ids), true)); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,118 @@ | |||||||
|  | package org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain; | ||||||
|  |  | ||||||
|  | import org.dromara.common.mybatis.core.domain.BaseEntity; | ||||||
|  | import com.baomidou.mybatisplus.annotation.*; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.EqualsAndHashCode; | ||||||
|  | import java.math.BigDecimal; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.time.LocalDate; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 分包合同终止对象 xzd_subcontract_termination | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-14 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @EqualsAndHashCode(callSuper = true) | ||||||
|  | @TableName("xzd_subcontract_termination") | ||||||
|  | public class XzdSubcontractTermination extends BaseEntity { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * | ||||||
|  |      */ | ||||||
|  |     @TableId(value = "id") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据编码 | ||||||
|  |      */ | ||||||
|  |     private String documentCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标题 | ||||||
|  |      */ | ||||||
|  |     private String title; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据日期 | ||||||
|  |      */ | ||||||
|  |     private LocalDate documentDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同编号 | ||||||
|  |      */ | ||||||
|  |     private Long contractNumber; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同名称 | ||||||
|  |      */ | ||||||
|  |     private String contractName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 终止日期 | ||||||
|  |      */ | ||||||
|  |     private LocalDate terminationDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 工程项目 | ||||||
|  |      */ | ||||||
|  |     private String engineeringProject; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 甲方单位 | ||||||
|  |      */ | ||||||
|  |     private String partyAUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 乙方单位 | ||||||
|  |      */ | ||||||
|  |     private String partyBUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 终止原因 | ||||||
|  |      */ | ||||||
|  |     private String terminationReason; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remarks; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计结算金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal cumulativeSettlementAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计付款金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal cumulativePaymentAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目大类(字典) | ||||||
|  |      */ | ||||||
|  |     private String projectCategory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目类型(字典) | ||||||
|  |      */ | ||||||
|  |     private String projectType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件id (多个文件逗号分隔) | ||||||
|  |      */ | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用ID | ||||||
|  |      */ | ||||||
|  |     private Long danjuId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,116 @@ | |||||||
|  | package org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain.bo; | ||||||
|  |  | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain.XzdSubcontractTermination; | ||||||
|  | import org.dromara.common.mybatis.core.domain.BaseEntity; | ||||||
|  | import org.dromara.common.core.validate.AddGroup; | ||||||
|  | import org.dromara.common.core.validate.EditGroup; | ||||||
|  | import io.github.linpeilie.annotations.AutoMapper; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.EqualsAndHashCode; | ||||||
|  | import jakarta.validation.constraints.*; | ||||||
|  | import java.math.BigDecimal; | ||||||
|  | import java.time.LocalDate; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 分包合同终止业务对象 xzd_subcontract_termination | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-14 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @EqualsAndHashCode(callSuper = true) | ||||||
|  | @AutoMapper(target = XzdSubcontractTermination.class, reverseConvertGenerate = false) | ||||||
|  | public class XzdSubcontractTerminationBo extends BaseEntity { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * | ||||||
|  |      */ | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据编码 | ||||||
|  |      */ | ||||||
|  |     private String documentCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标题 | ||||||
|  |      */ | ||||||
|  |     private String title; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据日期 | ||||||
|  |      */ | ||||||
|  |     private LocalDate documentDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同编号 | ||||||
|  |      */ | ||||||
|  |     private Long contractNumber; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同名称 | ||||||
|  |      */ | ||||||
|  |     private String contractName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 终止日期 | ||||||
|  |      */ | ||||||
|  |     private LocalDate terminationDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 工程项目 | ||||||
|  |      */ | ||||||
|  |     private String engineeringProject; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 甲方单位 | ||||||
|  |      */ | ||||||
|  |     private String partyAUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 乙方单位 | ||||||
|  |      */ | ||||||
|  |     private String partyBUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 终止原因 | ||||||
|  |      */ | ||||||
|  |     private String terminationReason; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remarks; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计结算金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal cumulativeSettlementAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计付款金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal cumulativePaymentAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目大类(字典) | ||||||
|  |      */ | ||||||
|  |     private String projectCategory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目类型(字典) | ||||||
|  |      */ | ||||||
|  |     private String projectType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件id (多个文件逗号分隔) | ||||||
|  |      */ | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用ID | ||||||
|  |      */ | ||||||
|  |     private Long danjuId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,175 @@ | |||||||
|  | package org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain.vo; | ||||||
|  |  | ||||||
|  | import java.math.BigDecimal; | ||||||
|  |  | ||||||
|  | import com.baomidou.mybatisplus.annotation.FieldFill; | ||||||
|  | import com.baomidou.mybatisplus.annotation.TableField; | ||||||
|  | import org.dromara.common.translation.annotation.Translation; | ||||||
|  | import org.dromara.common.translation.constant.TransConstant; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain.XzdSubcontractTermination; | ||||||
|  | import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||||||
|  | import com.alibaba.excel.annotation.ExcelProperty; | ||||||
|  | import org.dromara.common.excel.annotation.ExcelDictFormat; | ||||||
|  | import org.dromara.common.excel.convert.ExcelDictConvert; | ||||||
|  | import io.github.linpeilie.annotations.AutoMapper; | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  | import java.time.LocalDate; | ||||||
|  | import java.time.LocalDateTime; | ||||||
|  | import java.util.Date; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 分包合同终止视图对象 xzd_subcontract_termination | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-14 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @ExcelIgnoreUnannotated | ||||||
|  | @AutoMapper(target = XzdSubcontractTermination.class) | ||||||
|  | public class XzdSubcontractTerminationVo implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据编码 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "单据编码") | ||||||
|  |     private String documentCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标题 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "标题") | ||||||
|  |     private String title; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据日期 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "单据日期") | ||||||
|  |     private LocalDate documentDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同编号 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "合同编号") | ||||||
|  |     private Long contractNumber; | ||||||
|  |     /** | ||||||
|  |      * 合同编码 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "合同编码") | ||||||
|  |     private String contractNumberName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同名称 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "合同名称") | ||||||
|  |     private String contractName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 终止日期 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "终止日期") | ||||||
|  |     private LocalDate terminationDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 工程项目 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "工程项目") | ||||||
|  |     private String engineeringProject; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 甲方单位 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "甲方单位") | ||||||
|  |     private String partyAUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 乙方单位 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "乙方单位") | ||||||
|  |     private String partyBUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 终止原因 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "终止原因") | ||||||
|  |     private String terminationReason; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "备注") | ||||||
|  |     private String remarks; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计结算金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计结算金额") | ||||||
|  |     private BigDecimal cumulativeSettlementAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计付款金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计付款金额") | ||||||
|  |     private BigDecimal cumulativePaymentAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目大类(字典) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "项目大类", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "字=典") | ||||||
|  |     private String projectCategory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目类型(字典) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "项目类型", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "字=典") | ||||||
|  |     private String projectType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件id (多个文件逗号分隔) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "文件id ", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "多=个文件逗号分隔") | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用ID | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "单据引用ID") | ||||||
|  |     private Long danjuId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建者 | ||||||
|  |      */ | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private Long createBy; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建者 | ||||||
|  |      */ | ||||||
|  |     @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private Long createByName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建时间 | ||||||
|  |      */ | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private LocalDateTime createTime; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | package org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.mapper; | ||||||
|  |  | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain.XzdSubcontractTermination; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain.vo.XzdSubcontractTerminationVo; | ||||||
|  | import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 分包合同终止Mapper接口 | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-14 | ||||||
|  |  */ | ||||||
|  | public interface XzdSubcontractTerminationMapper extends BaseMapperPlus<XzdSubcontractTermination, XzdSubcontractTerminationVo> { | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,70 @@ | |||||||
|  | package org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.service; | ||||||
|  |  | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain.vo.XzdSubcontractTerminationVo; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain.bo.XzdSubcontractTerminationBo; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain.XzdSubcontractTermination; | ||||||
|  | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
|  |  | ||||||
|  | import com.baomidou.mybatisplus.extension.service.IService; | ||||||
|  | import java.util.Collection; | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 分包合同终止Service接口 | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-14 | ||||||
|  |  */ | ||||||
|  | public interface IXzdSubcontractTerminationService extends IService<XzdSubcontractTermination>{ | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询分包合同终止 | ||||||
|  |      * | ||||||
|  |      * @param id 主键 | ||||||
|  |      * @return 分包合同终止 | ||||||
|  |      */ | ||||||
|  |     XzdSubcontractTerminationVo queryById(Long id); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 分页查询分包合同终止列表 | ||||||
|  |      * | ||||||
|  |      * @param bo        查询条件 | ||||||
|  |      * @param pageQuery 分页参数 | ||||||
|  |      * @return 分包合同终止分页列表 | ||||||
|  |      */ | ||||||
|  |     TableDataInfo<XzdSubcontractTerminationVo> queryPageList(XzdSubcontractTerminationBo bo, PageQuery pageQuery); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询符合条件的分包合同终止列表 | ||||||
|  |      * | ||||||
|  |      * @param bo 查询条件 | ||||||
|  |      * @return 分包合同终止列表 | ||||||
|  |      */ | ||||||
|  |     List<XzdSubcontractTerminationVo> queryList(XzdSubcontractTerminationBo bo); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 新增分包合同终止 | ||||||
|  |      * | ||||||
|  |      * @param bo 分包合同终止 | ||||||
|  |      * @return 是否新增成功 | ||||||
|  |      */ | ||||||
|  |     Boolean insertByBo(XzdSubcontractTerminationBo bo); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改分包合同终止 | ||||||
|  |      * | ||||||
|  |      * @param bo 分包合同终止 | ||||||
|  |      * @return 是否修改成功 | ||||||
|  |      */ | ||||||
|  |     Boolean updateByBo(XzdSubcontractTerminationBo bo); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 校验并批量删除分包合同终止信息 | ||||||
|  |      * | ||||||
|  |      * @param ids     待删除的主键集合 | ||||||
|  |      * @param isValid 是否进行有效性校验 | ||||||
|  |      * @return 是否删除成功 | ||||||
|  |      */ | ||||||
|  |     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); | ||||||
|  | } | ||||||
| @ -0,0 +1,177 @@ | |||||||
|  | package org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.service.impl; | ||||||
|  |  | ||||||
|  | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | ||||||
|  | import org.dromara.common.core.utils.MapstructUtils; | ||||||
|  | import org.dromara.common.core.utils.StringUtils; | ||||||
|  | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
|  | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||||
|  | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||||
|  | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||||
|  | import lombok.RequiredArgsConstructor; | ||||||
|  | import org.dromara.system.service.impl.SysOssServiceImpl; | ||||||
|  | import org.dromara.xzd.contractManagement.caigoucontractTermination.domain.XzdPurchaseContractSuspend; | ||||||
|  | import org.dromara.xzd.contractManagement.caigoucontractTermination.domain.vo.XzdPurchaseContractSuspendVo; | ||||||
|  | import org.dromara.xzd.utilS.AreaUtil; | ||||||
|  | import org.springframework.beans.factory.annotation.Autowired; | ||||||
|  | import org.springframework.stereotype.Service; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain.bo.XzdSubcontractTerminationBo; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain.vo.XzdSubcontractTerminationVo; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.domain.XzdSubcontractTermination; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.mapper.XzdSubcontractTerminationMapper; | ||||||
|  | import org.dromara.xzd.contractManagement.fenbaohetongzhongzhi.service.IXzdSubcontractTerminationService; | ||||||
|  |  | ||||||
|  | import java.time.LocalDate; | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.Collection; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 分包合同终止Service业务层处理 | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-14 | ||||||
|  |  */ | ||||||
|  | @RequiredArgsConstructor | ||||||
|  | @Service | ||||||
|  | public class XzdSubcontractTerminationServiceImpl extends ServiceImpl<XzdSubcontractTerminationMapper, XzdSubcontractTermination> implements IXzdSubcontractTerminationService { | ||||||
|  |  | ||||||
|  |     private final XzdSubcontractTerminationMapper baseMapper; | ||||||
|  |     private final AreaUtil areaUtil; | ||||||
|  |  | ||||||
|  |     @Autowired | ||||||
|  |     private SysOssServiceImpl sysOssService; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询分包合同终止 | ||||||
|  |      * | ||||||
|  |      * @param id 主键 | ||||||
|  |      * @return 分包合同终止 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public XzdSubcontractTerminationVo queryById(Long id){ | ||||||
|  |         XzdSubcontractTerminationVo vo = baseMapper.selectVoById(id); | ||||||
|  |         List.of(vo); | ||||||
|  |         return baseMapper.selectVoById(id); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 分页查询分包合同终止列表 | ||||||
|  |      * | ||||||
|  |      * @param bo        查询条件 | ||||||
|  |      * @param pageQuery 分页参数 | ||||||
|  |      * @return 分包合同终止分页列表 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public TableDataInfo<XzdSubcontractTerminationVo> queryPageList(XzdSubcontractTerminationBo bo, PageQuery pageQuery) { | ||||||
|  |         LambdaQueryWrapper<XzdSubcontractTermination> lqw = buildQueryWrapper(bo); | ||||||
|  |         Page<XzdSubcontractTerminationVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw); | ||||||
|  |         return TableDataInfo.build(result); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询符合条件的分包合同终止列表 | ||||||
|  |      * | ||||||
|  |      * @param bo 查询条件 | ||||||
|  |      * @return 分包合同终止列表 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public List<XzdSubcontractTerminationVo> queryList(XzdSubcontractTerminationBo bo) { | ||||||
|  |         LambdaQueryWrapper<XzdSubcontractTermination> lqw = buildQueryWrapper(bo); | ||||||
|  |         return baseMapper.selectVoList(lqw); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private LambdaQueryWrapper<XzdSubcontractTermination> buildQueryWrapper(XzdSubcontractTerminationBo bo) { | ||||||
|  |         Map<String, Object> params = bo.getParams(); | ||||||
|  |         LambdaQueryWrapper<XzdSubcontractTermination> lqw = Wrappers.lambdaQuery(); | ||||||
|  |         lqw.orderByDesc(XzdSubcontractTermination::getId); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getDocumentCode()), XzdSubcontractTermination::getDocumentCode, bo.getDocumentCode()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getTitle()), XzdSubcontractTermination::getTitle, bo.getTitle()); | ||||||
|  |         lqw.eq(bo.getDocumentDate() != null, XzdSubcontractTermination::getDocumentDate, bo.getDocumentDate()); | ||||||
|  |         lqw.eq(bo.getContractNumber() != null, XzdSubcontractTermination::getContractNumber, bo.getContractNumber()); | ||||||
|  |         lqw.like(StringUtils.isNotBlank(bo.getContractName()), XzdSubcontractTermination::getContractName, bo.getContractName()); | ||||||
|  |         lqw.eq(bo.getTerminationDate() != null, XzdSubcontractTermination::getTerminationDate, bo.getTerminationDate()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getEngineeringProject()), XzdSubcontractTermination::getEngineeringProject, bo.getEngineeringProject()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getPartyAUnit()), XzdSubcontractTermination::getPartyAUnit, bo.getPartyAUnit()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getPartyBUnit()), XzdSubcontractTermination::getPartyBUnit, bo.getPartyBUnit()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getTerminationReason()), XzdSubcontractTermination::getTerminationReason, bo.getTerminationReason()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getRemarks()), XzdSubcontractTermination::getRemarks, bo.getRemarks()); | ||||||
|  |         lqw.eq(bo.getCumulativeSettlementAmount() != null, XzdSubcontractTermination::getCumulativeSettlementAmount, bo.getCumulativeSettlementAmount()); | ||||||
|  |         lqw.eq(bo.getCumulativePaymentAmount() != null, XzdSubcontractTermination::getCumulativePaymentAmount, bo.getCumulativePaymentAmount()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getProjectCategory()), XzdSubcontractTermination::getProjectCategory, bo.getProjectCategory()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getProjectType()), XzdSubcontractTermination::getProjectType, bo.getProjectType()); | ||||||
|  |         lqw.eq(StringUtils.isNotBlank(bo.getFileId()), XzdSubcontractTermination::getFileId, bo.getFileId()); | ||||||
|  |         lqw.eq(bo.getDanjuId() != null, XzdSubcontractTermination::getDanjuId, bo.getDanjuId()); | ||||||
|  |         return lqw; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 新增分包合同终止 | ||||||
|  |      * | ||||||
|  |      * @param bo 分包合同终止 | ||||||
|  |      * @return 是否新增成功 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public Boolean insertByBo(XzdSubcontractTerminationBo bo) { | ||||||
|  |         XzdSubcontractTermination add = MapstructUtils.convert(bo, XzdSubcontractTermination.class); | ||||||
|  |         validEntityBeforeSave(add); | ||||||
|  |  | ||||||
|  |         Long l = baseMapper.selectCount(new LambdaQueryWrapper<XzdSubcontractTermination>().gt(XzdSubcontractTermination::getCreateTime, LocalDate.now())); | ||||||
|  |         String s = areaUtil.generateDateBasedNumber(); | ||||||
|  |         add.setDocumentCode(s+"-"+(l+1)); | ||||||
|  |  | ||||||
|  |         boolean flag = baseMapper.insert(add) > 0; | ||||||
|  |         if (flag) { | ||||||
|  |             bo.setId(add.getId()); | ||||||
|  |         } | ||||||
|  |         return flag; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改分包合同终止 | ||||||
|  |      * | ||||||
|  |      * @param bo 分包合同终止 | ||||||
|  |      * @return 是否修改成功 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public Boolean updateByBo(XzdSubcontractTerminationBo bo) { | ||||||
|  |         XzdSubcontractTermination update = MapstructUtils.convert(bo, XzdSubcontractTermination.class); | ||||||
|  |         validEntityBeforeSave(update); | ||||||
|  |         return baseMapper.updateById(update) > 0; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 保存前的数据校验 | ||||||
|  |      */ | ||||||
|  |     private void validEntityBeforeSave(XzdSubcontractTermination entity){ | ||||||
|  |         //TODO 做一些数据校验,如唯一约束 | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 校验并批量删除分包合同终止信息 | ||||||
|  |      * | ||||||
|  |      * @param ids     待删除的主键集合 | ||||||
|  |      * @param isValid 是否进行有效性校验 | ||||||
|  |      * @return 是否删除成功 | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) { | ||||||
|  |         if(isValid){ | ||||||
|  |             //TODO 做一些业务上的校验,判断是否需要校验 | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         for (Long id : ids) { | ||||||
|  |             XzdSubcontractTerminationVo vo = baseMapper.selectVoById(id); | ||||||
|  |             //                删除附件 | ||||||
|  |             if (!StringUtils.isEmpty(vo.getFileId())){ | ||||||
|  |                 List<Long> collect = Arrays.stream(vo.getFileId().split(",")).map(item -> { | ||||||
|  |                     return Long.parseLong(item); | ||||||
|  |                 }).collect(Collectors.toList()); | ||||||
|  |                 sysOssService.deleteWithValidByIds(collect, false); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return baseMapper.deleteByIds(ids) > 0; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -1,7 +1,11 @@ | |||||||
| package org.dromara.xzd.contractManagement.purchaseManagement.domain.vo; | package org.dromara.xzd.contractManagement.purchaseManagement.domain.vo; | ||||||
|  |  | ||||||
| import java.time.LocalDate; | import java.time.LocalDate; | ||||||
|  | import java.time.LocalDateTime; | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
|  |  | ||||||
|  | import com.baomidou.mybatisplus.annotation.FieldFill; | ||||||
|  | import com.baomidou.mybatisplus.annotation.TableField; | ||||||
| import com.fasterxml.jackson.annotation.JsonFormat; | import com.fasterxml.jackson.annotation.JsonFormat; | ||||||
| import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||||||
| import com.alibaba.excel.annotation.ExcelProperty; | import com.alibaba.excel.annotation.ExcelProperty; | ||||||
| @ -416,6 +420,25 @@ public class XzdPurchaseContractInformationVo implements Serializable { | |||||||
|     private String auditStatus; |     private String auditStatus; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建者 | ||||||
|  |      */ | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private Long createBy; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建者 | ||||||
|  |      */ | ||||||
|  |     @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy") | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private Long createByName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 创建时间 | ||||||
|  |      */ | ||||||
|  |     @TableField(fill = FieldFill.INSERT) | ||||||
|  |     private LocalDateTime createTime; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 预收款项 |      * 预收款项 | ||||||
|      */ |      */ | ||||||
|  | |||||||
| @ -69,4 +69,6 @@ public interface IXzdPurchaseContractInformationService extends IService<XzdPurc | |||||||
|      * @return 是否删除成功 |      * @return 是否删除成功 | ||||||
|      */ |      */ | ||||||
|     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); |     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid); | ||||||
|  |  | ||||||
|  |     String queryCodeById(Long id); | ||||||
| } | } | ||||||
|  | |||||||
| @ -94,11 +94,12 @@ public class XzdPurchaseContractInformationServiceImpl extends ServiceImpl<XzdPu | |||||||
|     @Override |     @Override | ||||||
|     public XzdPurchaseContractInformationVo queryById(Long id){ |     public XzdPurchaseContractInformationVo queryById(Long id){ | ||||||
|         XzdPurchaseContractInformationVo xzdPurchaseContractInformationVo = baseMapper.selectVoById(id); |         XzdPurchaseContractInformationVo xzdPurchaseContractInformationVo = baseMapper.selectVoById(id); | ||||||
|         List<XzdPurchaseContractInformationVo> informationVo = List.of(xzdPurchaseContractInformationVo); |         List<XzdPurchaseContractInformationVo> informationVo = new ArrayList<>(); | ||||||
|  |         if (xzdPurchaseContractInformationVo != null){ | ||||||
|  |             informationVo = List.of(xzdPurchaseContractInformationVo); | ||||||
| //        装填数据 | //        装填数据 | ||||||
|         setValue(informationVo); |             setValue(informationVo); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         return informationVo.getFirst(); |         return informationVo.getFirst(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -361,6 +362,11 @@ public class XzdPurchaseContractInformationServiceImpl extends ServiceImpl<XzdPu | |||||||
|         return baseMapper.deleteByIds(ids) > 0; |         return baseMapper.deleteByIds(ids) > 0; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public String queryCodeById(Long id) { | ||||||
|  |         return baseMapper.selectVoById(id).getContractCode(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public void setValue(List<XzdPurchaseContractInformationVo> infos){ |     public void setValue(List<XzdPurchaseContractInformationVo> infos){ | ||||||
|  |  | ||||||
|         for (XzdPurchaseContractInformationVo item : infos) { |         for (XzdPurchaseContractInformationVo item : infos) { | ||||||
|  | |||||||
| @ -18,6 +18,8 @@ import org.springframework.web.bind.annotation.*; | |||||||
|  |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //客户信息总controller | ||||||
| @Validated | @Validated | ||||||
| @RequiredArgsConstructor | @RequiredArgsConstructor | ||||||
| @RestController | @RestController | ||||||
| @ -28,8 +30,6 @@ public class XzdCorrespondentList { | |||||||
|     private final IXzdCorrespondentList iXzdCorrespondentList; |     private final IXzdCorrespondentList iXzdCorrespondentList; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     private final IXzdCustomertypeService iXzdCustomertypeService; |     private final IXzdCustomertypeService iXzdCustomertypeService; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|  | |||||||
| @ -40,6 +40,10 @@ public class XzdGuaranteeChangeInfo extends BaseEntity { | |||||||
|      * 单据编号 |      * 单据编号 | ||||||
|      */ |      */ | ||||||
|     private String documentNumber; |     private String documentNumber; | ||||||
|  |     /** | ||||||
|  |      * 合同类型 | ||||||
|  |      */ | ||||||
|  |     private String contractType; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 标题 |      * 标题 | ||||||
|  | |||||||
| @ -60,7 +60,12 @@ public class XzdGuaranteeChangeInfoBo extends BaseEntity { | |||||||
|     /** |     /** | ||||||
|      * 合同保函名称 |      * 合同保函名称 | ||||||
|      */ |      */ | ||||||
|     private Long contractGuaranteeName; |     private String contractGuaranteeName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同类型 | ||||||
|  |      */ | ||||||
|  |     private String contractType; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 工程项目 |      * 工程项目 | ||||||
| @ -76,7 +81,7 @@ public class XzdGuaranteeChangeInfoBo extends BaseEntity { | |||||||
|      * 经办人名称 |      * 经办人名称 | ||||||
|      */ |      */ | ||||||
|     @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "handlerId") |     @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "handlerId") | ||||||
|     private Long handlerName; |     private String handlerName; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 变更类型(字典) |      * 变更类型(字典) | ||||||
|  | |||||||
| @ -84,6 +84,11 @@ public class XzdGuaranteeChangeInfoVo implements Serializable { | |||||||
|     @ExcelProperty(value = "工程项目") |     @ExcelProperty(value = "工程项目") | ||||||
|     private String engineeringProject; |     private String engineeringProject; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同类型 | ||||||
|  |      */ | ||||||
|  |     private String contractType; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 经办人 |      * 经办人 | ||||||
|      */ |      */ | ||||||
|  | |||||||
| @ -60,7 +60,7 @@ public class XzdGuaranteeChangeInfoServiceImpl extends ServiceImpl<XzdGuaranteeC | |||||||
|         XzdGuaranteeInfoVo vo = iXzdGuaranteeInfoService.queryById(xzdGuaranteeChangeInfoVo.getContractGuaranteeId()); |         XzdGuaranteeInfoVo vo = iXzdGuaranteeInfoService.queryById(xzdGuaranteeChangeInfoVo.getContractGuaranteeId()); | ||||||
|  |  | ||||||
|         xzdGuaranteeChangeInfoVo.setContractGuaranteeName(vo.getContractName()); |         xzdGuaranteeChangeInfoVo.setContractGuaranteeName(vo.getContractName()); | ||||||
|         return baseMapper.selectVoById(id); |         return xzdGuaranteeChangeInfoVo; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @ -104,6 +104,9 @@ public class XzdGuaranteeChangeInfoServiceImpl extends ServiceImpl<XzdGuaranteeC | |||||||
|         lqw.eq(bo.getContractGuaranteeId() != null, XzdGuaranteeChangeInfo::getContractGuaranteeId, bo.getContractGuaranteeId()); |         lqw.eq(bo.getContractGuaranteeId() != null, XzdGuaranteeChangeInfo::getContractGuaranteeId, bo.getContractGuaranteeId()); | ||||||
|         lqw.eq(StringUtils.isNotBlank(bo.getEngineeringProject()), XzdGuaranteeChangeInfo::getEngineeringProject, bo.getEngineeringProject()); |         lqw.eq(StringUtils.isNotBlank(bo.getEngineeringProject()), XzdGuaranteeChangeInfo::getEngineeringProject, bo.getEngineeringProject()); | ||||||
|         lqw.eq(bo.getHandlerId() != null, XzdGuaranteeChangeInfo::getHandlerId, bo.getHandlerId()); |         lqw.eq(bo.getHandlerId() != null, XzdGuaranteeChangeInfo::getHandlerId, bo.getHandlerId()); | ||||||
|  |         lqw.eq(bo.getContractType() != null, XzdGuaranteeChangeInfo::getContractType, bo.getContractType()); | ||||||
|  |  | ||||||
|  |  | ||||||
|         lqw.eq(StringUtils.isNotBlank(bo.getChangeType()), XzdGuaranteeChangeInfo::getChangeType, bo.getChangeType()); |         lqw.eq(StringUtils.isNotBlank(bo.getChangeType()), XzdGuaranteeChangeInfo::getChangeType, bo.getChangeType()); | ||||||
|         lqw.eq(bo.getExtensionDate() != null, XzdGuaranteeChangeInfo::getExtensionDate, bo.getExtensionDate()); |         lqw.eq(bo.getExtensionDate() != null, XzdGuaranteeChangeInfo::getExtensionDate, bo.getExtensionDate()); | ||||||
|         lqw.eq(bo.getClosedDate() != null, XzdGuaranteeChangeInfo::getClosedDate, bo.getClosedDate()); |         lqw.eq(bo.getClosedDate() != null, XzdGuaranteeChangeInfo::getClosedDate, bo.getClosedDate()); | ||||||
|  | |||||||
| @ -14,6 +14,8 @@ public enum XzdClassEnum { | |||||||
|     JS_CG_JINDU("xzd_js_cg_jindu"), //采购合同进度结算 |     JS_CG_JINDU("xzd_js_cg_jindu"), //采购合同进度结算 | ||||||
| //    分包合同 | //    分包合同 | ||||||
|     FENBAOHETONG_INFORMATION("xzd_subcontract"), |     FENBAOHETONG_INFORMATION("xzd_subcontract"), | ||||||
|  | //    分包合同变更 | ||||||
|  |     FENBAOHETONGBINGGENG_INFORMATION("xzd_subcontract_change"), | ||||||
|     //    采购变更合同 |     //    采购变更合同 | ||||||
|     CAIGOUHETONG_INFORMATION("xzd_purchase_contract_alteration"), |     CAIGOUHETONG_INFORMATION("xzd_purchase_contract_alteration"), | ||||||
| //    采购合同 | //    采购合同 | ||||||
|  | |||||||
| @ -0,0 +1,105 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.controller; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | import lombok.RequiredArgsConstructor; | ||||||
|  | import jakarta.servlet.http.HttpServletResponse; | ||||||
|  | import jakarta.validation.constraints.*; | ||||||
|  | import cn.dev33.satoken.annotation.SaCheckPermission; | ||||||
|  | import org.springframework.web.bind.annotation.*; | ||||||
|  | import org.springframework.validation.annotation.Validated; | ||||||
|  | import org.dromara.common.idempotent.annotation.RepeatSubmit; | ||||||
|  | import org.dromara.common.log.annotation.Log; | ||||||
|  | import org.dromara.common.web.core.BaseController; | ||||||
|  | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
|  | import org.dromara.common.core.domain.R; | ||||||
|  | import org.dromara.common.core.validate.AddGroup; | ||||||
|  | import org.dromara.common.core.validate.EditGroup; | ||||||
|  | import org.dromara.common.log.enums.BusinessType; | ||||||
|  | import org.dromara.common.excel.utils.ExcelUtil; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.vo.XzdSfkCaigouFkVo; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.bo.XzdSfkCaigouFkBo; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.service.IXzdSfkCaigouFkService; | ||||||
|  | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 采购合同付款 | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Validated | ||||||
|  | @RequiredArgsConstructor | ||||||
|  | @RestController | ||||||
|  | @RequestMapping("/paymentsReceipts/sfkCaigouFk") | ||||||
|  | public class XzdSfkCaigouFkController extends BaseController { | ||||||
|  |  | ||||||
|  |     private final IXzdSfkCaigouFkService xzdSfkCaigouFkService; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询采购合同付款列表 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkCaigouFk:list") | ||||||
|  |     @GetMapping("/list") | ||||||
|  |     public TableDataInfo<XzdSfkCaigouFkVo> list(XzdSfkCaigouFkBo bo, PageQuery pageQuery) { | ||||||
|  |         return xzdSfkCaigouFkService.queryPageList(bo, pageQuery); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 导出采购合同付款列表 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkCaigouFk:export") | ||||||
|  |     @Log(title = "采购合同付款", businessType = BusinessType.EXPORT) | ||||||
|  |     @PostMapping("/export") | ||||||
|  |     public void export(XzdSfkCaigouFkBo bo, HttpServletResponse response) { | ||||||
|  |         List<XzdSfkCaigouFkVo> list = xzdSfkCaigouFkService.queryList(bo); | ||||||
|  |         ExcelUtil.exportExcel(list, "采购合同付款", XzdSfkCaigouFkVo.class, response); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获取采购合同付款详细信息 | ||||||
|  |      * | ||||||
|  |      * @param id 主键 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkCaigouFk:query") | ||||||
|  |     @GetMapping("/{id}") | ||||||
|  |     public R<XzdSfkCaigouFkVo> getInfo(@NotNull(message = "主键不能为空") | ||||||
|  |                                      @PathVariable Long id) { | ||||||
|  |         return R.ok(xzdSfkCaigouFkService.queryById(id)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 新增采购合同付款 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkCaigouFk:add") | ||||||
|  |     @Log(title = "采购合同付款", businessType = BusinessType.INSERT) | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @PostMapping() | ||||||
|  |     public R<Void> add(@Validated(AddGroup.class) @RequestBody XzdSfkCaigouFkBo bo) { | ||||||
|  |         return toAjax(xzdSfkCaigouFkService.insertByBo(bo)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改采购合同付款 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkCaigouFk:edit") | ||||||
|  |     @Log(title = "采购合同付款", businessType = BusinessType.UPDATE) | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @PutMapping() | ||||||
|  |     public R<Void> edit(@Validated(EditGroup.class) @RequestBody XzdSfkCaigouFkBo bo) { | ||||||
|  |         return toAjax(xzdSfkCaigouFkService.updateByBo(bo)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 删除采购合同付款 | ||||||
|  |      * | ||||||
|  |      * @param ids 主键串 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkCaigouFk:remove") | ||||||
|  |     @Log(title = "采购合同付款", businessType = BusinessType.DELETE) | ||||||
|  |     @DeleteMapping("/{ids}") | ||||||
|  |     public R<Void> remove(@NotEmpty(message = "主键不能为空") | ||||||
|  |                           @PathVariable Long[] ids) { | ||||||
|  |         return toAjax(xzdSfkCaigouFkService.deleteWithValidByIds(List.of(ids), true)); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,105 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.controller; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | import lombok.RequiredArgsConstructor; | ||||||
|  | import jakarta.servlet.http.HttpServletResponse; | ||||||
|  | import jakarta.validation.constraints.*; | ||||||
|  | import cn.dev33.satoken.annotation.SaCheckPermission; | ||||||
|  | import org.springframework.web.bind.annotation.*; | ||||||
|  | import org.springframework.validation.annotation.Validated; | ||||||
|  | import org.dromara.common.idempotent.annotation.RepeatSubmit; | ||||||
|  | import org.dromara.common.log.annotation.Log; | ||||||
|  | import org.dromara.common.web.core.BaseController; | ||||||
|  | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
|  | import org.dromara.common.core.domain.R; | ||||||
|  | import org.dromara.common.core.validate.AddGroup; | ||||||
|  | import org.dromara.common.core.validate.EditGroup; | ||||||
|  | import org.dromara.common.log.enums.BusinessType; | ||||||
|  | import org.dromara.common.excel.utils.ExcelUtil; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.vo.XzdSfkFapiaoVo; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.bo.XzdSfkFapiaoBo; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.service.IXzdSfkFapiaoService; | ||||||
|  | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 收款与付款-发票明细 | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Validated | ||||||
|  | @RequiredArgsConstructor | ||||||
|  | @RestController | ||||||
|  | @RequestMapping("/paymentsReceipts/sfkFapiao") | ||||||
|  | public class XzdSfkFapiaoController extends BaseController { | ||||||
|  |  | ||||||
|  |     private final IXzdSfkFapiaoService xzdSfkFapiaoService; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询收款与付款-发票明细列表 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkFapiao:list") | ||||||
|  |     @GetMapping("/list") | ||||||
|  |     public TableDataInfo<XzdSfkFapiaoVo> list(XzdSfkFapiaoBo bo, PageQuery pageQuery) { | ||||||
|  |         return xzdSfkFapiaoService.queryPageList(bo, pageQuery); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 导出收款与付款-发票明细列表 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkFapiao:export") | ||||||
|  |     @Log(title = "收款与付款-发票明细", businessType = BusinessType.EXPORT) | ||||||
|  |     @PostMapping("/export") | ||||||
|  |     public void export(XzdSfkFapiaoBo bo, HttpServletResponse response) { | ||||||
|  |         List<XzdSfkFapiaoVo> list = xzdSfkFapiaoService.queryList(bo); | ||||||
|  |         ExcelUtil.exportExcel(list, "收款与付款-发票明细", XzdSfkFapiaoVo.class, response); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获取收款与付款-发票明细详细信息 | ||||||
|  |      * | ||||||
|  |      * @param id 主键 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkFapiao:query") | ||||||
|  |     @GetMapping("/{id}") | ||||||
|  |     public R<XzdSfkFapiaoVo> getInfo(@NotNull(message = "主键不能为空") | ||||||
|  |                                      @PathVariable Long id) { | ||||||
|  |         return R.ok(xzdSfkFapiaoService.queryById(id)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 新增收款与付款-发票明细 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkFapiao:add") | ||||||
|  |     @Log(title = "收款与付款-发票明细", businessType = BusinessType.INSERT) | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @PostMapping() | ||||||
|  |     public R<Void> add(@Validated(AddGroup.class) @RequestBody XzdSfkFapiaoBo bo) { | ||||||
|  |         return toAjax(xzdSfkFapiaoService.insertByBo(bo)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改收款与付款-发票明细 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkFapiao:edit") | ||||||
|  |     @Log(title = "收款与付款-发票明细", businessType = BusinessType.UPDATE) | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @PutMapping() | ||||||
|  |     public R<Void> edit(@Validated(EditGroup.class) @RequestBody XzdSfkFapiaoBo bo) { | ||||||
|  |         return toAjax(xzdSfkFapiaoService.updateByBo(bo)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 删除收款与付款-发票明细 | ||||||
|  |      * | ||||||
|  |      * @param ids 主键串 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkFapiao:remove") | ||||||
|  |     @Log(title = "收款与付款-发票明细", businessType = BusinessType.DELETE) | ||||||
|  |     @DeleteMapping("/{ids}") | ||||||
|  |     public R<Void> remove(@NotEmpty(message = "主键不能为空") | ||||||
|  |                           @PathVariable Long[] ids) { | ||||||
|  |         return toAjax(xzdSfkFapiaoService.deleteWithValidByIds(List.of(ids), true)); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,105 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.controller; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | import lombok.RequiredArgsConstructor; | ||||||
|  | import jakarta.servlet.http.HttpServletResponse; | ||||||
|  | import jakarta.validation.constraints.*; | ||||||
|  | import cn.dev33.satoken.annotation.SaCheckPermission; | ||||||
|  | import org.springframework.web.bind.annotation.*; | ||||||
|  | import org.springframework.validation.annotation.Validated; | ||||||
|  | import org.dromara.common.idempotent.annotation.RepeatSubmit; | ||||||
|  | import org.dromara.common.log.annotation.Log; | ||||||
|  | import org.dromara.common.web.core.BaseController; | ||||||
|  | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
|  | import org.dromara.common.core.domain.R; | ||||||
|  | import org.dromara.common.core.validate.AddGroup; | ||||||
|  | import org.dromara.common.core.validate.EditGroup; | ||||||
|  | import org.dromara.common.log.enums.BusinessType; | ||||||
|  | import org.dromara.common.excel.utils.ExcelUtil; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.vo.XzdSfkFukuanVo; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.bo.XzdSfkFukuanBo; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.service.IXzdSfkFukuanService; | ||||||
|  | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 收款与付款-付款明细 | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Validated | ||||||
|  | @RequiredArgsConstructor | ||||||
|  | @RestController | ||||||
|  | @RequestMapping("/paymentsReceipts/sfkFukuan") | ||||||
|  | public class XzdSfkFukuanController extends BaseController { | ||||||
|  |  | ||||||
|  |     private final IXzdSfkFukuanService xzdSfkFukuanService; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询收款与付款-付款明细列表 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkFukuan:list") | ||||||
|  |     @GetMapping("/list") | ||||||
|  |     public TableDataInfo<XzdSfkFukuanVo> list(XzdSfkFukuanBo bo, PageQuery pageQuery) { | ||||||
|  |         return xzdSfkFukuanService.queryPageList(bo, pageQuery); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 导出收款与付款-付款明细列表 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkFukuan:export") | ||||||
|  |     @Log(title = "收款与付款-付款明细", businessType = BusinessType.EXPORT) | ||||||
|  |     @PostMapping("/export") | ||||||
|  |     public void export(XzdSfkFukuanBo bo, HttpServletResponse response) { | ||||||
|  |         List<XzdSfkFukuanVo> list = xzdSfkFukuanService.queryList(bo); | ||||||
|  |         ExcelUtil.exportExcel(list, "收款与付款-付款明细", XzdSfkFukuanVo.class, response); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获取收款与付款-付款明细详细信息 | ||||||
|  |      * | ||||||
|  |      * @param id 主键 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkFukuan:query") | ||||||
|  |     @GetMapping("/{id}") | ||||||
|  |     public R<XzdSfkFukuanVo> getInfo(@NotNull(message = "主键不能为空") | ||||||
|  |                                      @PathVariable Long id) { | ||||||
|  |         return R.ok(xzdSfkFukuanService.queryById(id)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 新增收款与付款-付款明细 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkFukuan:add") | ||||||
|  |     @Log(title = "收款与付款-付款明细", businessType = BusinessType.INSERT) | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @PostMapping() | ||||||
|  |     public R<Void> add(@Validated(AddGroup.class) @RequestBody XzdSfkFukuanBo bo) { | ||||||
|  |         return toAjax(xzdSfkFukuanService.insertByBo(bo)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改收款与付款-付款明细 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkFukuan:edit") | ||||||
|  |     @Log(title = "收款与付款-付款明细", businessType = BusinessType.UPDATE) | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @PutMapping() | ||||||
|  |     public R<Void> edit(@Validated(EditGroup.class) @RequestBody XzdSfkFukuanBo bo) { | ||||||
|  |         return toAjax(xzdSfkFukuanService.updateByBo(bo)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 删除收款与付款-付款明细 | ||||||
|  |      * | ||||||
|  |      * @param ids 主键串 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkFukuan:remove") | ||||||
|  |     @Log(title = "收款与付款-付款明细", businessType = BusinessType.DELETE) | ||||||
|  |     @DeleteMapping("/{ids}") | ||||||
|  |     public R<Void> remove(@NotEmpty(message = "主键不能为空") | ||||||
|  |                           @PathVariable Long[] ids) { | ||||||
|  |         return toAjax(xzdSfkFukuanService.deleteWithValidByIds(List.of(ids), true)); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,105 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.controller; | ||||||
|  |  | ||||||
|  | import java.util.List; | ||||||
|  |  | ||||||
|  | import lombok.RequiredArgsConstructor; | ||||||
|  | import jakarta.servlet.http.HttpServletResponse; | ||||||
|  | import jakarta.validation.constraints.*; | ||||||
|  | import cn.dev33.satoken.annotation.SaCheckPermission; | ||||||
|  | import org.springframework.web.bind.annotation.*; | ||||||
|  | import org.springframework.validation.annotation.Validated; | ||||||
|  | import org.dromara.common.idempotent.annotation.RepeatSubmit; | ||||||
|  | import org.dromara.common.log.annotation.Log; | ||||||
|  | import org.dromara.common.web.core.BaseController; | ||||||
|  | import org.dromara.common.mybatis.core.page.PageQuery; | ||||||
|  | import org.dromara.common.core.domain.R; | ||||||
|  | import org.dromara.common.core.validate.AddGroup; | ||||||
|  | import org.dromara.common.core.validate.EditGroup; | ||||||
|  | import org.dromara.common.log.enums.BusinessType; | ||||||
|  | import org.dromara.common.excel.utils.ExcelUtil; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.vo.XzdSfkZonhefuwuFkVo; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.bo.XzdSfkZonhefuwuFkBo; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.service.IXzdSfkZonhefuwuFkService; | ||||||
|  | import org.dromara.common.mybatis.core.page.TableDataInfo; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 综合服务合同付款 | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Validated | ||||||
|  | @RequiredArgsConstructor | ||||||
|  | @RestController | ||||||
|  | @RequestMapping("/paymentsReceipts/sfkZonhefuwuFk") | ||||||
|  | public class XzdSfkZonhefuwuFkController extends BaseController { | ||||||
|  |  | ||||||
|  |     private final IXzdSfkZonhefuwuFkService xzdSfkZonhefuwuFkService; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 查询综合服务合同付款列表 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkZonhefuwuFk:list") | ||||||
|  |     @GetMapping("/list") | ||||||
|  |     public TableDataInfo<XzdSfkZonhefuwuFkVo> list(XzdSfkZonhefuwuFkBo bo, PageQuery pageQuery) { | ||||||
|  |         return xzdSfkZonhefuwuFkService.queryPageList(bo, pageQuery); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 导出综合服务合同付款列表 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkZonhefuwuFk:export") | ||||||
|  |     @Log(title = "综合服务合同付款", businessType = BusinessType.EXPORT) | ||||||
|  |     @PostMapping("/export") | ||||||
|  |     public void export(XzdSfkZonhefuwuFkBo bo, HttpServletResponse response) { | ||||||
|  |         List<XzdSfkZonhefuwuFkVo> list = xzdSfkZonhefuwuFkService.queryList(bo); | ||||||
|  |         ExcelUtil.exportExcel(list, "综合服务合同付款", XzdSfkZonhefuwuFkVo.class, response); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 获取综合服务合同付款详细信息 | ||||||
|  |      * | ||||||
|  |      * @param id 主键 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkZonhefuwuFk:query") | ||||||
|  |     @GetMapping("/{id}") | ||||||
|  |     public R<XzdSfkZonhefuwuFkVo> getInfo(@NotNull(message = "主键不能为空") | ||||||
|  |                                      @PathVariable Long id) { | ||||||
|  |         return R.ok(xzdSfkZonhefuwuFkService.queryById(id)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 新增综合服务合同付款 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkZonhefuwuFk:add") | ||||||
|  |     @Log(title = "综合服务合同付款", businessType = BusinessType.INSERT) | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @PostMapping() | ||||||
|  |     public R<Void> add(@Validated(AddGroup.class) @RequestBody XzdSfkZonhefuwuFkBo bo) { | ||||||
|  |         return toAjax(xzdSfkZonhefuwuFkService.insertByBo(bo)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 修改综合服务合同付款 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkZonhefuwuFk:edit") | ||||||
|  |     @Log(title = "综合服务合同付款", businessType = BusinessType.UPDATE) | ||||||
|  |     @RepeatSubmit() | ||||||
|  |     @PutMapping() | ||||||
|  |     public R<Void> edit(@Validated(EditGroup.class) @RequestBody XzdSfkZonhefuwuFkBo bo) { | ||||||
|  |         return toAjax(xzdSfkZonhefuwuFkService.updateByBo(bo)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 删除综合服务合同付款 | ||||||
|  |      * | ||||||
|  |      * @param ids 主键串 | ||||||
|  |      */ | ||||||
|  |     @SaCheckPermission("paymentsReceipts:sfkZonhefuwuFk:remove") | ||||||
|  |     @Log(title = "综合服务合同付款", businessType = BusinessType.DELETE) | ||||||
|  |     @DeleteMapping("/{ids}") | ||||||
|  |     public R<Void> remove(@NotEmpty(message = "主键不能为空") | ||||||
|  |                           @PathVariable Long[] ids) { | ||||||
|  |         return toAjax(xzdSfkZonhefuwuFkService.deleteWithValidByIds(List.of(ids), true)); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,223 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.domain; | ||||||
|  |  | ||||||
|  | import org.dromara.common.mybatis.core.domain.BaseEntity; | ||||||
|  | import com.baomidou.mybatisplus.annotation.*; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.EqualsAndHashCode; | ||||||
|  | import java.math.BigDecimal; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.time.LocalDate; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 采购合同付款对象 xzd_sfk_caigou_fk | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @EqualsAndHashCode(callSuper = true) | ||||||
|  | @TableName("xzd_sfk_caigou_fk") | ||||||
|  | public class XzdSfkCaigouFk extends BaseEntity { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID,自增 | ||||||
|  |      */ | ||||||
|  |     @TableId(value = "id") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据编码(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private String docCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标题(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private String title; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据日期(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private LocalDate docDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同编码(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private Long contractCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同名称 | ||||||
|  |      */ | ||||||
|  |     private String contractName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款性质(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private Long paymentProperty; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 支出合同金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal expendContractAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期审批金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentApproveAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目 | ||||||
|  |      */ | ||||||
|  |     private Long project; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款单位 | ||||||
|  |      */ | ||||||
|  |     private Long paymentUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款单位(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private Long receiptUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款银行 | ||||||
|  |      */ | ||||||
|  |     private Long receiptBank; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款银行账号 | ||||||
|  |      */ | ||||||
|  |     private String receiptBankAccount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 统计周期(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private String statCycle; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 是否是研发类 | ||||||
|  |      */ | ||||||
|  |     private Long isYanfa; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 税率(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal taxRate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目大类 | ||||||
|  |      */ | ||||||
|  |     private String projectCategory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度支付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentProgressPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度支付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal advancePayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计支付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalPaymentAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度应付金额(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度应付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款扣回金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal advanceDeductionAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度结算占合同比例(%) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressSettlementRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度支付占本期进度应付(%) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentPaymentRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度支付占累计进度应付(%) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalPaymentRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款剩余未抵扣金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal advanceRemainingDeduction; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计支付占合同比例(%) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalPaymentContractRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 剩余进度应付未付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal remainingProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度结算金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressSettlementAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 实时刷新(0=未勾选,1=勾选) | ||||||
|  |      */ | ||||||
|  |     private Long realTimeRefresh; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同含税金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal contractTaxInclAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同累计实际付款金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal contractTotalActualPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计结算金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalSettlementAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用 | ||||||
|  |      */ | ||||||
|  |     private String documentReference; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件ID | ||||||
|  |      */ | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,93 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.domain; | ||||||
|  |  | ||||||
|  | import org.dromara.common.mybatis.core.domain.BaseEntity; | ||||||
|  | import com.baomidou.mybatisplus.annotation.*; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.EqualsAndHashCode; | ||||||
|  | import java.math.BigDecimal; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.time.LocalDate; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 收款与付款-发票明细对象 xzd_sfk_fapiao | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @EqualsAndHashCode(callSuper = true) | ||||||
|  | @TableName("xzd_sfk_fapiao") | ||||||
|  | public class XzdSfkFapiao extends BaseEntity { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID,自增 | ||||||
|  |      */ | ||||||
|  |     @TableId(value = "id") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 关联主单据的ID(外键,指向付款单/结算单等主表) | ||||||
|  |      */ | ||||||
|  |     private Long mainDocumentId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 发票类型 | ||||||
|  |      */ | ||||||
|  |     private String invoiceType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 发票号码 | ||||||
|  |      */ | ||||||
|  |     private String invoiceNumber; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 发票代码 | ||||||
|  |      */ | ||||||
|  |     private String invoiceCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 开票日期 | ||||||
|  |      */ | ||||||
|  |     private LocalDate invoiceDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 金额(不含税) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal amount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 税额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal taxAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 价税合计 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalAmountWithTax; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 引用金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal referenceAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用 | ||||||
|  |      */ | ||||||
|  |     private String documentReference; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件ID | ||||||
|  |      */ | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,88 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.domain; | ||||||
|  |  | ||||||
|  | import org.dromara.common.mybatis.core.domain.BaseEntity; | ||||||
|  | import com.baomidou.mybatisplus.annotation.*; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.EqualsAndHashCode; | ||||||
|  | import java.math.BigDecimal; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.time.LocalDate; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 收款与付款-付款明细对象 xzd_sfk_fukuan | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @EqualsAndHashCode(callSuper = true) | ||||||
|  | @TableName("xzd_sfk_fukuan") | ||||||
|  | public class XzdSfkFukuan extends BaseEntity { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID | ||||||
|  |      */ | ||||||
|  |     @TableId(value = "id") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 关联主单据的ID(外键,指向付款单等主表) | ||||||
|  |      */ | ||||||
|  |     private Long mainDocumentId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 类型(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private String type; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 方向 | ||||||
|  |      */ | ||||||
|  |     private String direction; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 款项类别 | ||||||
|  |      */ | ||||||
|  |     private String itemCategory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 款项属性(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private String itemProperty; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期申请金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentApplyAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期审批金额(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentApproveAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 归还日期 | ||||||
|  |      */ | ||||||
|  |     private LocalDate returnDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用 | ||||||
|  |      */ | ||||||
|  |     private String documentReference; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件ID | ||||||
|  |      */ | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,218 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.domain; | ||||||
|  |  | ||||||
|  | import org.dromara.common.mybatis.core.domain.BaseEntity; | ||||||
|  | import com.baomidou.mybatisplus.annotation.*; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.EqualsAndHashCode; | ||||||
|  | import java.math.BigDecimal; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.time.LocalDate; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 综合服务合同付款对象 xzd_sfk_zonhefuwu_fk | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @EqualsAndHashCode(callSuper = true) | ||||||
|  | @TableName("xzd_sfk_zonhefuwu_fk") | ||||||
|  | public class XzdSfkZonhefuwuFk extends BaseEntity { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID,自增 | ||||||
|  |      */ | ||||||
|  |     @TableId(value = "id") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据编码(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private String docCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标题(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private String title; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据日期(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private LocalDate docDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同编码(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private Long contractCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同名称 | ||||||
|  |      */ | ||||||
|  |     private String contractName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款性质(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private Long paymentProperty; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 支出合同金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal expendContractAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期审批金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentApproveAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目 | ||||||
|  |      */ | ||||||
|  |     private Long projectId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款单位 | ||||||
|  |      */ | ||||||
|  |     private Long paymentUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款单位(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private Long receiptUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款银行 | ||||||
|  |      */ | ||||||
|  |     private Long receiptBank; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款银行账号 | ||||||
|  |      */ | ||||||
|  |     private String receiptBankAccount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 统计周期(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private String statCycle; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 是否研发类(0=否,1=是) | ||||||
|  |      */ | ||||||
|  |     private Long isResearch; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 税率(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal taxRate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目大类 | ||||||
|  |      */ | ||||||
|  |     private String projectCategory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度支付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentProgressPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度支付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal advancePayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计支付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalPaymentAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度应付金额(带*,必填) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度应付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款扣回金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal advanceDeductionAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度结算占合同比例(%) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressSettlementRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度支付占本期进度应付(%) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentPaymentRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计支付占合同比例(%) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalPaymentContractRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款剩余未抵扣金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal advanceRemainingDeduction; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 剩余进度应付未付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal remainingProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度结算金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressSettlementAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 实时刷新(0=未勾选,1=勾选) | ||||||
|  |      */ | ||||||
|  |     private Long realTimeRefresh; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同累计实际付款金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal contractTotalActualPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同含税金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal contractTaxInclAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计结算金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalSettlementAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用 | ||||||
|  |      */ | ||||||
|  |     private String documentReference; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件ID | ||||||
|  |      */ | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,231 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.domain.bo; | ||||||
|  |  | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.XzdSfkCaigouFk; | ||||||
|  | import org.dromara.common.mybatis.core.domain.BaseEntity; | ||||||
|  | import org.dromara.common.core.validate.AddGroup; | ||||||
|  | import org.dromara.common.core.validate.EditGroup; | ||||||
|  | import io.github.linpeilie.annotations.AutoMapper; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.EqualsAndHashCode; | ||||||
|  | import jakarta.validation.constraints.*; | ||||||
|  | import java.math.BigDecimal; | ||||||
|  | import java.time.LocalDate; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 采购合同付款业务对象 xzd_sfk_caigou_fk | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @EqualsAndHashCode(callSuper = true) | ||||||
|  | @AutoMapper(target = XzdSfkCaigouFk.class, reverseConvertGenerate = false) | ||||||
|  | public class XzdSfkCaigouFkBo extends BaseEntity { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID,自增 | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "主键ID,自增不能为空", groups = { EditGroup.class }) | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据编码(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotBlank(message = "单据编码(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private String docCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标题(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotBlank(message = "标题(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private String title; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据日期(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "单据日期(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private LocalDate docDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同编码(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "合同编码(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private Long contractCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同名称 | ||||||
|  |      */ | ||||||
|  |     private String contractName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款性质(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "付款性质(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private Long paymentProperty; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 支出合同金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal expendContractAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期审批金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentApproveAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目 | ||||||
|  |      */ | ||||||
|  |     private Long project; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款单位 | ||||||
|  |      */ | ||||||
|  |     private Long paymentUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款单位(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "收款单位(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private Long receiptUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款银行 | ||||||
|  |      */ | ||||||
|  |     private Long receiptBank; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款银行账号 | ||||||
|  |      */ | ||||||
|  |     private String receiptBankAccount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 统计周期(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotBlank(message = "统计周期(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private String statCycle; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 是否是研发类 | ||||||
|  |      */ | ||||||
|  |     private Long isYanfa; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 税率(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "税率(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private BigDecimal taxRate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目大类 | ||||||
|  |      */ | ||||||
|  |     private String projectCategory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度支付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentProgressPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度支付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal advancePayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计支付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalPaymentAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度应付金额(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "本期进度应付金额(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private BigDecimal currentProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度应付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款扣回金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal advanceDeductionAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度结算占合同比例(%) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressSettlementRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度支付占本期进度应付(%) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentPaymentRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度支付占累计进度应付(%) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalPaymentRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款剩余未抵扣金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal advanceRemainingDeduction; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计支付占合同比例(%) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalPaymentContractRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 剩余进度应付未付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal remainingProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度结算金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressSettlementAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 实时刷新(0=未勾选,1=勾选) | ||||||
|  |      */ | ||||||
|  |     private Long realTimeRefresh; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同含税金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal contractTaxInclAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同累计实际付款金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal contractTotalActualPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计结算金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalSettlementAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用 | ||||||
|  |      */ | ||||||
|  |     private String documentReference; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件ID | ||||||
|  |      */ | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,92 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.domain.bo; | ||||||
|  |  | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.XzdSfkFapiao; | ||||||
|  | import org.dromara.common.mybatis.core.domain.BaseEntity; | ||||||
|  | import org.dromara.common.core.validate.AddGroup; | ||||||
|  | import org.dromara.common.core.validate.EditGroup; | ||||||
|  | import io.github.linpeilie.annotations.AutoMapper; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.EqualsAndHashCode; | ||||||
|  | import jakarta.validation.constraints.*; | ||||||
|  | import java.math.BigDecimal; | ||||||
|  | import java.time.LocalDate; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 收款与付款-发票明细业务对象 xzd_sfk_fapiao | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @EqualsAndHashCode(callSuper = true) | ||||||
|  | @AutoMapper(target = XzdSfkFapiao.class, reverseConvertGenerate = false) | ||||||
|  | public class XzdSfkFapiaoBo extends BaseEntity { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID,自增 | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "主键ID,自增不能为空", groups = { EditGroup.class }) | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 关联主单据的ID(外键,指向付款单/结算单等主表) | ||||||
|  |      */ | ||||||
|  |     private Long mainDocumentId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 发票类型 | ||||||
|  |      */ | ||||||
|  |     private String invoiceType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 发票号码 | ||||||
|  |      */ | ||||||
|  |     private String invoiceNumber; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 发票代码 | ||||||
|  |      */ | ||||||
|  |     private String invoiceCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 开票日期 | ||||||
|  |      */ | ||||||
|  |     private LocalDate invoiceDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 金额(不含税) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal amount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 税额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal taxAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 价税合计 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalAmountWithTax; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 引用金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal referenceAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用 | ||||||
|  |      */ | ||||||
|  |     private String documentReference; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件ID | ||||||
|  |      */ | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,90 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.domain.bo; | ||||||
|  |  | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.XzdSfkFukuan; | ||||||
|  | import org.dromara.common.mybatis.core.domain.BaseEntity; | ||||||
|  | import org.dromara.common.core.validate.AddGroup; | ||||||
|  | import org.dromara.common.core.validate.EditGroup; | ||||||
|  | import io.github.linpeilie.annotations.AutoMapper; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.EqualsAndHashCode; | ||||||
|  | import jakarta.validation.constraints.*; | ||||||
|  | import java.math.BigDecimal; | ||||||
|  | import java.time.LocalDate; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 收款与付款-付款明细业务对象 xzd_sfk_fukuan | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @EqualsAndHashCode(callSuper = true) | ||||||
|  | @AutoMapper(target = XzdSfkFukuan.class, reverseConvertGenerate = false) | ||||||
|  | public class XzdSfkFukuanBo extends BaseEntity { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "主键ID不能为空", groups = { EditGroup.class }) | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 关联主单据的ID(外键,指向付款单等主表) | ||||||
|  |      */ | ||||||
|  |     private Long mainDocumentId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 类型(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotBlank(message = "类型(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private String type; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 方向 | ||||||
|  |      */ | ||||||
|  |     private String direction; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 款项类别 | ||||||
|  |      */ | ||||||
|  |     private String itemCategory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 款项属性(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotBlank(message = "款项属性(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private String itemProperty; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期申请金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentApplyAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期审批金额(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "本期审批金额(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private BigDecimal currentApproveAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 归还日期 | ||||||
|  |      */ | ||||||
|  |     private LocalDate returnDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用 | ||||||
|  |      */ | ||||||
|  |     private String documentReference; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件ID | ||||||
|  |      */ | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,226 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.domain.bo; | ||||||
|  |  | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.XzdSfkZonhefuwuFk; | ||||||
|  | import org.dromara.common.mybatis.core.domain.BaseEntity; | ||||||
|  | import org.dromara.common.core.validate.AddGroup; | ||||||
|  | import org.dromara.common.core.validate.EditGroup; | ||||||
|  | import io.github.linpeilie.annotations.AutoMapper; | ||||||
|  | import lombok.Data; | ||||||
|  | import lombok.EqualsAndHashCode; | ||||||
|  | import jakarta.validation.constraints.*; | ||||||
|  | import java.math.BigDecimal; | ||||||
|  | import java.time.LocalDate; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 综合服务合同付款业务对象 xzd_sfk_zonhefuwu_fk | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @EqualsAndHashCode(callSuper = true) | ||||||
|  | @AutoMapper(target = XzdSfkZonhefuwuFk.class, reverseConvertGenerate = false) | ||||||
|  | public class XzdSfkZonhefuwuFkBo extends BaseEntity { | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID,自增 | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "主键ID,自增不能为空", groups = { EditGroup.class }) | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据编码(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotBlank(message = "单据编码(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private String docCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标题(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotBlank(message = "标题(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private String title; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据日期(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "单据日期(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private LocalDate docDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同编码(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "合同编码(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private Long contractCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同名称 | ||||||
|  |      */ | ||||||
|  |     private String contractName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款性质(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "付款性质(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private Long paymentProperty; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 支出合同金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal expendContractAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期审批金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentApproveAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目 | ||||||
|  |      */ | ||||||
|  |     private Long projectId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款单位 | ||||||
|  |      */ | ||||||
|  |     private Long paymentUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款单位(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "收款单位(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private Long receiptUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款银行 | ||||||
|  |      */ | ||||||
|  |     private Long receiptBank; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款银行账号 | ||||||
|  |      */ | ||||||
|  |     private String receiptBankAccount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 统计周期(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotBlank(message = "统计周期(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private String statCycle; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 是否研发类(0=否,1=是) | ||||||
|  |      */ | ||||||
|  |     private Long isResearch; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 税率(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "税率(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private BigDecimal taxRate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目大类 | ||||||
|  |      */ | ||||||
|  |     private String projectCategory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度支付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentProgressPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度支付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal advancePayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计支付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalPaymentAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度应付金额(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @NotNull(message = "本期进度应付金额(带*,必填)不能为空", groups = { AddGroup.class, EditGroup.class }) | ||||||
|  |     private BigDecimal currentProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度应付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款扣回金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal advanceDeductionAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度结算占合同比例(%) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressSettlementRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度支付占本期进度应付(%) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal currentPaymentRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计支付占合同比例(%) | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalPaymentContractRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款剩余未抵扣金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal advanceRemainingDeduction; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 剩余进度应付未付金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal remainingProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度结算金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalProgressSettlementAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 实时刷新(0=未勾选,1=勾选) | ||||||
|  |      */ | ||||||
|  |     private Long realTimeRefresh; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同累计实际付款金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal contractTotalActualPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同含税金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal contractTaxInclAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计结算金额 | ||||||
|  |      */ | ||||||
|  |     private BigDecimal totalSettlementAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用 | ||||||
|  |      */ | ||||||
|  |     private String documentReference; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件ID | ||||||
|  |      */ | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,282 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.domain.vo; | ||||||
|  |  | ||||||
|  | import java.math.BigDecimal; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.XzdSfkCaigouFk; | ||||||
|  | import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||||||
|  | import com.alibaba.excel.annotation.ExcelProperty; | ||||||
|  | import org.dromara.common.excel.annotation.ExcelDictFormat; | ||||||
|  | import org.dromara.common.excel.convert.ExcelDictConvert; | ||||||
|  | import io.github.linpeilie.annotations.AutoMapper; | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  | import java.time.LocalDate; | ||||||
|  | import java.util.Date; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 采购合同付款视图对象 xzd_sfk_caigou_fk | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @ExcelIgnoreUnannotated | ||||||
|  | @AutoMapper(target = XzdSfkCaigouFk.class) | ||||||
|  | public class XzdSfkCaigouFkVo implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID,自增 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "主键ID,自增") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据编码(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "单据编码", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private String docCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标题(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "标题", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private String title; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据日期(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "单据日期", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private LocalDate docDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同编码(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "合同编码", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private Long contractCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同名称 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "合同名称") | ||||||
|  |     private String contractName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款性质(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "付款性质", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private Long paymentProperty; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 支出合同金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "支出合同金额") | ||||||
|  |     private BigDecimal expendContractAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期审批金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "本期审批金额") | ||||||
|  |     private BigDecimal currentApproveAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "项目") | ||||||
|  |     private Long project; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款单位 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "付款单位") | ||||||
|  |     private Long paymentUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款单位(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "收款单位", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private Long receiptUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款银行 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "收款银行") | ||||||
|  |     private Long receiptBank; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款银行账号 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "收款银行账号") | ||||||
|  |     private String receiptBankAccount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 统计周期(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "统计周期", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private String statCycle; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 是否是研发类 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "是否是研发类") | ||||||
|  |     private Long isYanfa; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 税率(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "税率", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private BigDecimal taxRate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目大类 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "项目大类") | ||||||
|  |     private String projectCategory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "备注") | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度支付金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "本期进度支付金额") | ||||||
|  |     private BigDecimal currentProgressPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度支付金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计进度支付金额") | ||||||
|  |     private BigDecimal totalProgressPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "预付款金额") | ||||||
|  |     private BigDecimal advancePayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计支付金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计支付金额") | ||||||
|  |     private BigDecimal totalPaymentAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度应付金额(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "本期进度应付金额", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private BigDecimal currentProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度应付金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计进度应付金额") | ||||||
|  |     private BigDecimal totalProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款扣回金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "预付款扣回金额") | ||||||
|  |     private BigDecimal advanceDeductionAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度结算占合同比例(%) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计进度结算占合同比例", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "%=") | ||||||
|  |     private BigDecimal totalProgressSettlementRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度支付占本期进度应付(%) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "本期进度支付占本期进度应付", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "%=") | ||||||
|  |     private BigDecimal currentPaymentRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度支付占累计进度应付(%) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计进度支付占累计进度应付", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "%=") | ||||||
|  |     private BigDecimal totalPaymentRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款剩余未抵扣金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "预付款剩余未抵扣金额") | ||||||
|  |     private BigDecimal advanceRemainingDeduction; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计支付占合同比例(%) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计支付占合同比例", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "%=") | ||||||
|  |     private BigDecimal totalPaymentContractRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 剩余进度应付未付金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "剩余进度应付未付金额") | ||||||
|  |     private BigDecimal remainingProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度结算金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计进度结算金额") | ||||||
|  |     private BigDecimal totalProgressSettlementAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 实时刷新(0=未勾选,1=勾选) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "实时刷新", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "0==未勾选,1=勾选") | ||||||
|  |     private Long realTimeRefresh; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同含税金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "合同含税金额") | ||||||
|  |     private BigDecimal contractTaxInclAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同累计实际付款金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "合同累计实际付款金额") | ||||||
|  |     private BigDecimal contractTotalActualPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计结算金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计结算金额") | ||||||
|  |     private BigDecimal totalSettlementAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "单据引用") | ||||||
|  |     private String documentReference; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件ID | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "文件ID") | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,114 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.domain.vo; | ||||||
|  |  | ||||||
|  | import java.math.BigDecimal; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.XzdSfkFapiao; | ||||||
|  | import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||||||
|  | import com.alibaba.excel.annotation.ExcelProperty; | ||||||
|  | import org.dromara.common.excel.annotation.ExcelDictFormat; | ||||||
|  | import org.dromara.common.excel.convert.ExcelDictConvert; | ||||||
|  | import io.github.linpeilie.annotations.AutoMapper; | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  | import java.time.LocalDate; | ||||||
|  | import java.util.Date; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 收款与付款-发票明细视图对象 xzd_sfk_fapiao | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @ExcelIgnoreUnannotated | ||||||
|  | @AutoMapper(target = XzdSfkFapiao.class) | ||||||
|  | public class XzdSfkFapiaoVo implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID,自增 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "主键ID,自增") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 关联主单据的ID(外键,指向付款单/结算单等主表) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "关联主单据的ID", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "外=键,指向付款单/结算单等主表") | ||||||
|  |     private Long mainDocumentId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 发票类型 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "发票类型") | ||||||
|  |     private String invoiceType; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 发票号码 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "发票号码") | ||||||
|  |     private String invoiceNumber; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 发票代码 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "发票代码") | ||||||
|  |     private String invoiceCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 开票日期 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "开票日期") | ||||||
|  |     private LocalDate invoiceDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 金额(不含税) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "金额", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "不=含税") | ||||||
|  |     private BigDecimal amount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 税额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "税额") | ||||||
|  |     private BigDecimal taxAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 价税合计 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "价税合计") | ||||||
|  |     private BigDecimal totalAmountWithTax; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 引用金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "引用金额") | ||||||
|  |     private BigDecimal referenceAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "备注") | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "单据引用") | ||||||
|  |     private String documentReference; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件ID | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "文件ID") | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,110 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.domain.vo; | ||||||
|  |  | ||||||
|  | import java.math.BigDecimal; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.XzdSfkFukuan; | ||||||
|  | import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||||||
|  | import com.alibaba.excel.annotation.ExcelProperty; | ||||||
|  | import org.dromara.common.excel.annotation.ExcelDictFormat; | ||||||
|  | import org.dromara.common.excel.convert.ExcelDictConvert; | ||||||
|  | import io.github.linpeilie.annotations.AutoMapper; | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  | import java.time.LocalDate; | ||||||
|  | import java.util.Date; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 收款与付款-付款明细视图对象 xzd_sfk_fukuan | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @ExcelIgnoreUnannotated | ||||||
|  | @AutoMapper(target = XzdSfkFukuan.class) | ||||||
|  | public class XzdSfkFukuanVo implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "主键ID") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 关联主单据的ID(外键,指向付款单等主表) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "关联主单据的ID", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "外=键,指向付款单等主表") | ||||||
|  |     private Long mainDocumentId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 类型(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "类型", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private String type; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 方向 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "方向") | ||||||
|  |     private String direction; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 款项类别 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "款项类别") | ||||||
|  |     private String itemCategory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 款项属性(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "款项属性", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private String itemProperty; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期申请金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "本期申请金额") | ||||||
|  |     private BigDecimal currentApplyAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期审批金额(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "本期审批金额", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private BigDecimal currentApproveAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 归还日期 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "归还日期") | ||||||
|  |     private LocalDate returnDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "备注") | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "单据引用") | ||||||
|  |     private String documentReference; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件ID | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "文件ID") | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,276 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.domain.vo; | ||||||
|  |  | ||||||
|  | import java.math.BigDecimal; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.XzdSfkZonhefuwuFk; | ||||||
|  | import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; | ||||||
|  | import com.alibaba.excel.annotation.ExcelProperty; | ||||||
|  | import org.dromara.common.excel.annotation.ExcelDictFormat; | ||||||
|  | import org.dromara.common.excel.convert.ExcelDictConvert; | ||||||
|  | import io.github.linpeilie.annotations.AutoMapper; | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
|  | import java.io.Serial; | ||||||
|  | import java.io.Serializable; | ||||||
|  | import java.time.LocalDate; | ||||||
|  | import java.util.Date; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 综合服务合同付款视图对象 xzd_sfk_zonhefuwu_fk | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | @Data | ||||||
|  | @ExcelIgnoreUnannotated | ||||||
|  | @AutoMapper(target = XzdSfkZonhefuwuFk.class) | ||||||
|  | public class XzdSfkZonhefuwuFkVo implements Serializable { | ||||||
|  |  | ||||||
|  |     @Serial | ||||||
|  |     private static final long serialVersionUID = 1L; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 主键ID,自增 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "主键ID,自增") | ||||||
|  |     private Long id; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据编码(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "单据编码", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private String docCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 标题(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "标题", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private String title; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据日期(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "单据日期", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private LocalDate docDate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同编码(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "合同编码", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private Long contractCode; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同名称 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "合同名称") | ||||||
|  |     private String contractName; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款性质(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "付款性质", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private Long paymentProperty; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 支出合同金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "支出合同金额") | ||||||
|  |     private BigDecimal expendContractAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期审批金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "本期审批金额") | ||||||
|  |     private BigDecimal currentApproveAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "项目") | ||||||
|  |     private Long projectId; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 付款单位 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "付款单位") | ||||||
|  |     private Long paymentUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款单位(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "收款单位", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private Long receiptUnit; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款银行 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "收款银行") | ||||||
|  |     private Long receiptBank; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 收款银行账号 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "收款银行账号") | ||||||
|  |     private String receiptBankAccount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 统计周期(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "统计周期", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private String statCycle; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 是否研发类(0=否,1=是) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "是否研发类", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "0==否,1=是") | ||||||
|  |     private Long isResearch; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 税率(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "税率", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private BigDecimal taxRate; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 项目大类 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "项目大类") | ||||||
|  |     private String projectCategory; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 备注 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "备注") | ||||||
|  |     private String remark; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度支付金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "本期进度支付金额") | ||||||
|  |     private BigDecimal currentProgressPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度支付金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计进度支付金额") | ||||||
|  |     private BigDecimal totalProgressPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "预付款金额") | ||||||
|  |     private BigDecimal advancePayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计支付金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计支付金额") | ||||||
|  |     private BigDecimal totalPaymentAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度应付金额(带*,必填) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "本期进度应付金额", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "带=*,必填") | ||||||
|  |     private BigDecimal currentProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度应付金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计进度应付金额") | ||||||
|  |     private BigDecimal totalProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款扣回金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "预付款扣回金额") | ||||||
|  |     private BigDecimal advanceDeductionAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度结算占合同比例(%) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计进度结算占合同比例", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "%=") | ||||||
|  |     private BigDecimal totalProgressSettlementRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 本期进度支付占本期进度应付(%) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "本期进度支付占本期进度应付", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "%=") | ||||||
|  |     private BigDecimal currentPaymentRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计支付占合同比例(%) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计支付占合同比例", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "%=") | ||||||
|  |     private BigDecimal totalPaymentContractRatio; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 预付款剩余未抵扣金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "预付款剩余未抵扣金额") | ||||||
|  |     private BigDecimal advanceRemainingDeduction; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 剩余进度应付未付金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "剩余进度应付未付金额") | ||||||
|  |     private BigDecimal remainingProgressPayable; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计进度结算金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计进度结算金额") | ||||||
|  |     private BigDecimal totalProgressSettlementAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 实时刷新(0=未勾选,1=勾选) | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "实时刷新", converter = ExcelDictConvert.class) | ||||||
|  |     @ExcelDictFormat(readConverterExp = "0==未勾选,1=勾选") | ||||||
|  |     private Long realTimeRefresh; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同累计实际付款金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "合同累计实际付款金额") | ||||||
|  |     private BigDecimal contractTotalActualPayment; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 合同含税金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "合同含税金额") | ||||||
|  |     private BigDecimal contractTaxInclAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 累计结算金额 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "累计结算金额") | ||||||
|  |     private BigDecimal totalSettlementAmount; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 单据引用 | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "单据引用") | ||||||
|  |     private String documentReference; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 文件ID | ||||||
|  |      */ | ||||||
|  |     @ExcelProperty(value = "文件ID") | ||||||
|  |     private String fileId; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.mapper; | ||||||
|  |  | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.XzdSfkCaigouFk; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.vo.XzdSfkCaigouFkVo; | ||||||
|  | import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 采购合同付款Mapper接口 | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | public interface XzdSfkCaigouFkMapper extends BaseMapperPlus<XzdSfkCaigouFk, XzdSfkCaigouFkVo> { | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | package org.dromara.xzd.paymentsReceipts.mapper; | ||||||
|  |  | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.XzdSfkFapiao; | ||||||
|  | import org.dromara.xzd.paymentsReceipts.domain.vo.XzdSfkFapiaoVo; | ||||||
|  | import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * 收款与付款-发票明细Mapper接口 | ||||||
|  |  * | ||||||
|  |  * @author Lion Li | ||||||
|  |  * @date 2025-10-16 | ||||||
|  |  */ | ||||||
|  | public interface XzdSfkFapiaoMapper extends BaseMapperPlus<XzdSfkFapiao, XzdSfkFapiaoVo> { | ||||||
|  |  | ||||||
|  | } | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user