Compare commits

51 Commits

Author SHA1 Message Date
lg
dbc09a62ea 后端修改 2025-10-22 09:29:20 +08:00
zt
f3fa78475c bug 2025-10-21 20:05:55 +08:00
c565771283 10-21-修复 2025-10-21 20:04:59 +08:00
bac8488244 新中大综合服务合同修改,建管大屏接口优化、gps接口优化 2025-10-21 18:35:07 +08:00
lcj
a5f661b558 承包合同,安全质量大屏 2025-10-21 18:29:06 +08:00
zt
ceecec97c7 打印天气 2025-10-21 18:25:52 +08:00
c6ae8a4c00 10-21-收票与开票-收票登记 2025-10-21 17:31:00 +08:00
zt
37d0c776c0 设计计划 2025-10-21 15:53:56 +08:00
f8eea0f63f 修改查询语句 2025-10-21 10:36:52 +08:00
lg
59c749ab2a 表名修改 2025-10-21 10:09:59 +08:00
eeeba2bf4b 10-21-修复 2025-10-21 10:07:55 +08:00
lg
a9ce42101f 补充 2025-10-20 20:16:44 +08:00
lcj
13de88265f 识别逻辑 2025-10-20 20:09:51 +08:00
a464a1236d 综合服务进度、采购进度、竣工、竣工调整添加底部计量结算内容 2025-10-20 20:07:40 +08:00
fce5d0e7fc 10-20-修复字段 2025-10-20 19:57:27 +08:00
66ba43d030 Merge remote-tracking branch 'origin/dev' into dev 2025-10-20 19:26:18 +08:00
1aa77e5eda 10-20-决算清 2025-10-20 19:26:08 +08:00
zt
037016fc13 人脸对接 2025-10-20 19:24:36 +08:00
99f0026552 大屏接口添加计划容量 2025-10-20 17:12:06 +08:00
lg
535262d721 枚举 2025-10-20 16:32:32 +08:00
fbcb9ca3f2 10-20-决算清单(调整)初始化 2025-10-20 16:19:00 +08:00
2a7a20b966 Merge remote-tracking branch 'origin/dev' into dev 2025-10-20 16:10:14 +08:00
98fdab0dba 10-20-承包合同进度结算补齐 2025-10-20 16:10:03 +08:00
lg
bd71335ae6 分包合同枚举 2025-10-20 15:53:15 +08:00
zt
7f746fc250 考勤机 2025-10-20 15:41:43 +08:00
lg
901c8785fe 合同类型字段补充 2025-10-20 15:30:34 +08:00
e4e9718acb 10-20-初始化 2025-10-20 15:08:29 +08:00
738101f374 10-20-初始化 2025-10-20 15:05:58 +08:00
lg
a7befd7278 字段修改补充 2025-10-20 14:56:38 +08:00
lg
52e968c313 字段修改 2025-10-20 14:47:03 +08:00
lg
de9d7d34d6 部门修改和变更增加清单,合同内清单 2025-10-20 14:29:59 +08:00
zt
9f0105d88a 角色优化 2025-10-20 14:21:18 +08:00
lcj
80ec8ff86d 结算 2025-10-20 14:19:43 +08:00
f3473fe5d5 阶段成本分解校验修改 2025-10-18 21:05:20 +08:00
lcj
856f3f334b 修改日期 2025-10-18 20:35:50 +08:00
lcj
0b216a4101 修改配置 2025-10-18 20:19:35 +08:00
c7338b45ad 大屏项目 2025-10-18 20:09:38 +08:00
c93b1b752e Merge remote-tracking branch 'origin/dev' into dev 2025-10-18 20:08:43 +08:00
e38074bb25 大屏项目 2025-10-18 20:08:17 +08:00
zt
be0f425e14 Merge remote-tracking branch 'origin/dev' into dev 2025-10-18 20:03:14 +08:00
zt
f24e33b1c7 注销 2025-10-18 20:02:54 +08:00
48ea20581c 项目 2025-10-18 19:54:27 +08:00
lcj
e7fa22e573 承包分包合同进度结算 2025-10-18 19:44:37 +08:00
83b7b32035 解决冲突 2025-10-18 18:56:03 +08:00
6a0be071b8 合同管理-承包、分包、采购、综合服务的信息、变更添加合同变更清单 2025-10-18 18:47:21 +08:00
lg
7bdf8f53b9 采购合同修改 2025-10-18 18:45:25 +08:00
lg
03b249afe7 单据编号统一接口 2025-10-18 17:15:16 +08:00
lg
2e5e42fd84 成本单 2025-10-18 14:21:49 +08:00
f9d9785536 10-17-收票与开票-开票申请 2025-10-18 14:14:27 +08:00
a06511e0bf Merge remote-tracking branch 'origin/dev' into dev 2025-10-18 14:13:49 +08:00
9561ee9323 10-17-收票与开票-开票申请 2025-10-17 11:24:46 +08:00
360 changed files with 23185 additions and 775 deletions

View File

@ -92,7 +92,7 @@ public class SysRegisterService {
// if (!isValid) {
// throw new UserException("注册失败密码需满足818位包含大小写字母、数字、特殊字符中的至少三种组合");
// }
// 验证码开关
SysUserBo sysUser = new SysUserBo();
sysUser.setUserName(username);
sysUser.setNickName(username);
@ -101,16 +101,24 @@ public class SysRegisterService {
sysUser.setUserType(userType);
sysUser.setEmail(registerBody.getEmail());
boolean exist = TenantHelper.dynamic(tenantId, () -> {
return userMapper.exists(new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getPhonenumber, sysUser.getPhonenumber()));
});
if (exist) {
throw new UserException("user.register.save.error", username);
}
boolean regFlag = userService.registerUser(sysUser, tenantId);
if (!regFlag) {
throw new UserException("user.register.error");
SysUser sysUserByPhonenumber = userMapper.selectDefFlagUser(username);
if(sysUserByPhonenumber != null){
sysUser.setUserId(sysUserByPhonenumber.getUserId());
userMapper.updateDefFlag(sysUser);
userMapper.updateConstructionUser(sysUserByPhonenumber.getUserId());
}else {
boolean exist = TenantHelper.dynamic(tenantId, () -> {
return userMapper.exists(new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getPhonenumber, sysUser.getPhonenumber()));
});
if (exist) {
throw new UserException("user.register.save.error", username);
}
boolean regFlag = userService.registerUser(sysUser, tenantId);
if (!regFlag) {
throw new UserException("user.register.error");
}
}
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success"));

View File

@ -52,6 +52,9 @@ spring:
url: jdbc:mysql://192.168.110.2:13386/xinnengyuandev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: xinnengyuandev
password: StRWCZdZirysNSs2
# url: jdbc:mysql://192.168.110.2:13386/xinnengyuan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
# username: xinnengyuan
# password: mEZPC5Sdf3r2HENi
# 从库数据源
slave:
lazy: true
@ -71,9 +74,16 @@ spring:
lazy: true
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.110.2:13386/zmkgdev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: zmkgdev
password: JhYxREf25AXdy3h8
url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: zmkgc
password: nWKDKRNRT48tFBdh
# slave:
# lazy: true
# type: ${spring.datasource.type}
# driverClassName: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
# username: zmkgprod
# password: MaY8nehwWkJriWPm
# oracle:
# type: ${spring.datasource.type}
# driverClassName: oracle.jdbc.OracleDriver
@ -116,7 +126,7 @@ spring.data:
# 端口默认为6379
port: 9287
# 数据库索引
database: 10
database: 16
# redis 密码必须配置
password: syar23rdsaagdrsa
# 连接超时时间

View File

@ -55,21 +55,21 @@ spring:
url: jdbc:mysql://192.168.110.2:13386/xinnengyuan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: xinnengyuan
password: mEZPC5Sdf3r2HENi
# 从库数据源
slave:
lazy: true
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: zmkgc
password: nWKDKRNRT48tFBdh
slave1:
lazy: true
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: zmkgprod
password: MaY8nehwWkJriWPm
# # 从库数据源
# slave:
# lazy: true
# type: ${spring.datasource.type}
# driverClassName: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://192.168.110.2:13386/zmkgc?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
# username: zmkgc
# password: nWKDKRNRT48tFBdh
# slave1:
# lazy: true
# type: ${spring.datasource.type}
# driverClassName: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://192.168.110.2:13386/zmkgprod?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
# username: zmkgprod
# password: MaY8nehwWkJriWPm
# # 从库数据源
# slave:
# lazy: true

View File

@ -253,6 +253,8 @@ springdoc:
packages-to-scan: org.dromara.design
- group: 13.工作流模块
packages-to-scan: org.dromara.workflow
- group: 14.合同模块
packages-to-scan: org.dromara.ctr
- group: 15.无人机模块
packages-to-scan: org.dromara.drone
- group: 20.代码生成模块
@ -275,8 +277,10 @@ springdoc:
packages-to-scan: org.dromara.gps
- group: 24.招标模块
packages-to-scan: org.dromara.tender
- group: 25.app版本模块
packages-to-scan: org.dromara.app
# - group: 25.app版本模块
# packages-to-scan: org.dromara.app
- group: 25.数据迁移模块
packages-to-scan: org.dromara.transferData
- group: 26.netty消息模块
packages-to-scan: org.dromara.websocket
- group: 27.新中大模块

View File

@ -5,7 +5,6 @@ import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdcardUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -129,7 +128,7 @@ public class DemoTest {
log.info("执行定时任务:同步 {}至{} 计划详情到施工产值", lastMonday, lastSunday);
Boolean synced = progressPlanDetailService.syncPlanDetail2ConstructionValue(lastMonday, lastSunday, null);*/
LocalDate start = LocalDate.of(2024, 1, 1); // 起始时间2024-01-01
LocalDate end = LocalDate.of(2025, 10, 13); // 截止时间2025-09-15
LocalDate end = LocalDate.of(2025, 10, 20); // 截止时间2025-09-15
// 如果起始不是周一,调整到当周的周一
if (start.getDayOfWeek() != DayOfWeek.MONDAY) {
@ -149,7 +148,7 @@ public class DemoTest {
.ge(PgsProgressPlanDetail::getDate, monday)
.le(PgsProgressPlanDetail::getDate, sunday)
.ne(PgsProgressPlanDetail::getFinishedNumber, BigDecimal.ZERO)
.eq(PgsProgressPlanDetail::getStatus, "1")
// .eq(PgsProgressPlanDetail::getStatus, "1")
.list();
if (CollUtil.isEmpty(planDetailList)) {
// 下一周
@ -244,8 +243,8 @@ public class DemoTest {
value.setOutValue(constructionValue);
value.setOwnerValue(ownerValue);
// 统计总产值
allConstructionValue = allConstructionValue.add(constructionValue).setScale(4, RoundingMode.HALF_UP);
allOwnerValue = allOwnerValue.add(ownerValue).setScale(4, RoundingMode.HALF_UP);
allConstructionValue = allConstructionValue.add(constructionValue);
allOwnerValue = allOwnerValue.add(ownerValue);
// 添加需要修改状态的计划详情
PgsProgressPlanDetail update = new PgsProgressPlanDetail();
update.setId(planDetail.getId());
@ -253,8 +252,8 @@ public class DemoTest {
updateList.add(update);
saveList.add(value);
}
range.setOutValue(allConstructionValue);
range.setOwnerValue(allOwnerValue);
range.setOutValue(allConstructionValue.setScale(4, RoundingMode.HALF_UP));
range.setOwnerValue(allOwnerValue.setScale(4, RoundingMode.HALF_UP));
// 如果产值都为0则不保存
if (allConstructionValue.compareTo(BigDecimal.ZERO) == 0 && allOwnerValue.compareTo(BigDecimal.ZERO) == 0) {
return null;

View File

@ -77,7 +77,7 @@ public class RedisUtils {
public static <T> void publish(String channelKey, T msg, Consumer<T> consumer) {
RTopic topic = CLIENT.getTopic(channelKey);
topic.publish(msg);
System.out.println("发布通道消息---------"+msg.toString());
// System.out.println("发布通道消息---------"+msg.toString());
consumer.accept(msg);
}

View File

@ -69,8 +69,8 @@ public class WebSocketUtils {
broadcastMessage.setMessage(webSocketMessage.getMessage());
broadcastMessage.setSessionKeys(unsentSessionKeys);
RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> {
log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} message:{}",
WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.getMessage());
// log.info(" WebSocket发送主题订阅消息topic:{} session keys:{} message:{}",
// WEB_SOCKET_TOPIC, unsentSessionKeys, webSocketMessage.getMessage());
});
}
}
@ -84,7 +84,7 @@ public class WebSocketUtils {
WebSocketMessageDto broadcastMessage = new WebSocketMessageDto();
broadcastMessage.setMessage(message);
RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> {
log.info("WebSocket发送主题订阅消息topic:{} message:{}", WEB_SOCKET_TOPIC, message);
// log.info("WebSocket发送主题订阅消息topic:{} message:{}", WEB_SOCKET_TOPIC, message);
});
}

View File

@ -280,6 +280,13 @@
<artifactId>netty-all</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version> <!-- 最新版本可自行调整 -->
</dependency>
</dependencies>
</project>

View File

@ -1,6 +1,5 @@
package org.dromara.bigscreen.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
@ -62,7 +61,7 @@ public class MoneyBigScreenController {
/**
* 查询项目位置列表
*/
@SaCheckPermission("money:bigScreen:projectGis")
// @SaCheckPermission("money:bigScreen:projectGis")
@GetMapping("/project/gis")
public R<List<BusProjectGisVo>> getProjectGis() {
return R.ok(moneyBigScreenService.getProjectGis());
@ -545,7 +544,7 @@ public class MoneyBigScreenController {
/**
* 查询项目天气
*/
@SaCheckPermission("project:bigScreen:weather")
// @SaCheckPermission("project:bigScreen:weather")
@GetMapping("/weather/{projectId}")
public R<List<WeatherVo>> getProjectWeather(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
@ -555,7 +554,7 @@ public class MoneyBigScreenController {
/**
* 查询项目安全天数
*/
@SaCheckPermission("project:bigScreen:safetyDay")
// @SaCheckPermission("project:bigScreen:safetyDay")
@GetMapping("/safetyDay/{projectId}")
public R<BusProjectSafetyDayVo> getProjectSafetyDay(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {

View File

@ -1,6 +1,5 @@
package org.dromara.bigscreen.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -272,6 +271,10 @@ public class ProjectBigScreenController extends BaseController {
throw new ServiceException("更新云端萤石摄像头名称异常", HttpStatus.ERROR);
}
}
if (req.getLatitude() != null && req.getLongitude() != null) {
ys7Device.setLatitude(req.getLatitude());
ys7Device.setLongitude(req.getLongitude());
}
return toAjax(othYs7DeviceService.updateById(ys7Device));
}
@ -296,7 +299,7 @@ public class ProjectBigScreenController extends BaseController {
/**
* 查询GPS设备用户列表
*/
@SaCheckPermission("project:big:screen")
// @SaCheckPermission("project:big:screen")
@GetMapping("/getList")
public R<List<String>> getList(Long projectId) {
return R.ok(projectBigScreenService.getList(projectId));
@ -316,7 +319,7 @@ public class ProjectBigScreenController extends BaseController {
/**
* 查询地图项目分类
*/
@SaCheckPermission("project:big:screen")
// @SaCheckPermission("project:big:screen")
@GetMapping("/getProjectMapList")
public R<Map<String, Map<String, Map<String, String>>>> getProjectMapList() {
return R.ok(projectService.getProjectMapList());
@ -325,7 +328,7 @@ public class ProjectBigScreenController extends BaseController {
/**
* 查询地图项目分类
*/
@SaCheckPermission("project:big:screen")
// @SaCheckPermission("project:big:screen")
@PostMapping("/updatePosition")
public R<Void> updatePosition(@RequestBody ProjectUpdateDto dto) {
return toAjax(projectService.updatePosition(dto));

View File

@ -5,6 +5,7 @@ import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author lilemy
@ -37,4 +38,13 @@ public class Ys7DeviceUpdateReq implements Serializable {
*/
private String remark;
/**
* 纬度精确到6位小数
*/
private BigDecimal latitude;
/**
* 经度精确到6位小数
*/
private BigDecimal longitude;
}

View File

@ -505,7 +505,7 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
gps.put("id", item.getClientId());
gps.put("userId", item.getUserId());
gps.put("label", item.getClientId());
gps.put("name", item.getDeviceName());
gps.put("name", item.getUserId() != null ? item.getUserName() : item.getClientId());
gps.put("type", "gps");
gps.put("lat", item.getLocLatitude());
gps.put("lng", item.getLocLongitude());

View File

@ -211,6 +211,11 @@ public class BusPurchaseDocServiceImpl extends ServiceImpl<BusPurchaseDocMapper,
public void validNum(List<BusPlanDocAssociationBo> associationList, Long supplierId) {
for (BusPlanDocAssociationBo association : associationList) {
if(association.getDemandQuantity() == null){
throw new ServiceException("请填写需求数量");
}
//获取批次需求计划
BusMaterialbatchdemandplan byId = materialbatchdemandplanService.getById(association.getPlanId());
List<String> statuss = new ArrayList<>();

View File

@ -0,0 +1,65 @@
package org.dromara.common.enums;
import lombok.Data;
import lombok.Getter;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Getter
public enum AppUserTypeEnum {
SG("0", "施工人员", 2L),
BZZ("0", "施工人员(班组长)", 3L),
GL("1", "管理", 4L),
FB("2", "分包", 5L),
;
private final String type;
private final String value;
private final Long roleId;
AppUserTypeEnum(String type, String value,Long roleId) {
this.type = type;
this.value = value;
this.roleId = roleId;
}
public static final List<Long> ROLE_ID_LIST = Arrays.asList(SG.roleId, BZZ.roleId, FB.roleId, GL.roleId);
/**
* roleId获取枚举
*
* @param roleId 角色
* @return 枚举
*/
public static AppUserTypeEnum getByRoleId(Long roleId) {
for (AppUserTypeEnum value : AppUserTypeEnum.values()) {
if (value.getRoleId().equals(roleId)) {
return value;
}
}
return null;
}
/**
* type获取枚举
*
* @param type 类型
* @return 枚举
*/
public static AppUserTypeEnum getByType(String type) {
for (AppUserTypeEnum value : AppUserTypeEnum.values()) {
if (value.getType().equals(type)) {
return value;
}
}
return null;
}
}

View File

@ -0,0 +1,89 @@
package org.dromara.common.utils.attendance;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class FaceUtil {
private static final String FACE_URL = "http://192.168.110.5:1224";
/**
* 创建人脸记录 post
* @param name 姓名
* @param card 身份证
* @param path 人脸图片HTTP地址需可公开访问
*/
public static void createFaceRecord(String name, String card, String path) {
String url = FACE_URL+"/api/faces";
HashMap<String, Object> param = new HashMap<>() {{
put("name", name);
put("card", card);
put("path", path);
}};
HttpUtil.post(url, param);
}
/**
* 人脸检测
* @param path 图片HTTP地址需可公开访问
*/
public static Map<String, String> faceDetect(String path) {
String url = FACE_URL+"/api/faces/detect";
HashMap<String, Object> param = new HashMap<>() {{
put("path", path);
put("similarity_threshold", 0.8);
}};
//转成json
String post = HttpUtil.post(url, param);
Map<String, String> map = new HashMap<>();
// 遍历检测到的人脸数据
try {
// 解析返回的JSON数据
JSONObject response = JSON.parseObject(post);
JSONObject data = response.getJSONObject("data");
JSONArray detectedFaces = data.getJSONArray("detected_faces");
for (int i = 0; i < detectedFaces.size(); i++) {
JSONObject face = detectedFaces.getJSONObject(i);
JSONObject matchInfo = face.getJSONObject("match_info");
// 检查相似度是否大于等于阈值
double similarity = matchInfo.getDoubleValue("similarity");
double threshold = matchInfo.getDoubleValue("threshold");
if (similarity >= threshold) {
// 提取用户信息
JSONObject userInfo = face.getJSONObject("user_info");
String name = userInfo.getString("name");
String idCard = userInfo.getString("id_card");
map.put(idCard, name);
}
}
}catch (Exception e){
log.error("人脸检测失败",e);
}
return map;
}
public static void main(String[] args) {
// Map<String, String> map = faceDetect("http://xny.yj-3d.com:9000/xinnengyuan-dev/2025/10/12/9688ce2474ad47e7bf59c641848cdf8f.jpg");
// System.out.println(map);
// createFaceRecord("石志强","513022111145632652","http://xny.yj-3d.com:9000/xinnengyuan-dev/2025/10/12/9688ce2474ad47e7bf59c641848cdf8f.jpg");
}
}

View File

@ -1,6 +1,7 @@
package org.dromara.contractor.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -204,4 +205,10 @@ public class SubConstructionUser extends BaseEntity {
private Long goId;
private String goOpenid;
/**
* 删除标志0代表存在 1代表删除
*/
@TableLogic
private String delFlag;
}

View File

@ -19,6 +19,7 @@ import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.ObjectUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.enums.AppUserTypeEnum;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.oss.core.OssClient;
@ -276,7 +277,7 @@ public class SubConstructionUserServiceImpl extends ServiceImpl<SubConstructionU
userRoleMapper.delete(Wrappers.<SysUserRole>lambdaQuery()
.eq(SysUserRole::getUserId, constructionUser.getSysUserId())
.eq(SysUserRole::getProjectId, dto.getProjectId())
.in(SysUserRole::getRoleId, Arrays.asList(2L, 3L))
.in(SysUserRole::getRoleId, AppUserTypeEnum.ROLE_ID_LIST)
);
//再添加分配角色
Long roleId = "0".equals(dto.getPostId()) ? 2L : 3L;

View File

@ -0,0 +1,116 @@
package org.dromara.ctr.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.ctr.domain.bo.CtrContractProgressSettlementBo;
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementCreateReq;
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementUpdateReq;
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementTotalVo;
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementVo;
import org.dromara.ctr.service.ICtrContractProgressSettlementService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 承包合同进度结算
*
* @author lilemy
* @date 2025-10-18
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/ctr/contractProgressSettlement")
public class CtrContractProgressSettlementController extends BaseController {
private final ICtrContractProgressSettlementService ctrContractProgressSettlementService;
/**
* 查询承包合同进度结算列表
*/
@SaCheckPermission("ctr:contractProgressSettlement:list")
@GetMapping("/list")
public TableDataInfo<CtrContractProgressSettlementVo> list(CtrContractProgressSettlementBo bo, PageQuery pageQuery) {
return ctrContractProgressSettlementService.queryPageList(bo, pageQuery);
}
/**
* 导出承包合同进度结算列表
*/
@SaCheckPermission("ctr:contractProgressSettlement:export")
@Log(title = "承包合同进度结算", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CtrContractProgressSettlementBo bo, HttpServletResponse response) {
List<CtrContractProgressSettlementVo> list = ctrContractProgressSettlementService.queryList(bo);
ExcelUtil.exportExcel(list, "承包合同进度结算", CtrContractProgressSettlementVo.class, response);
}
/**
* 获取承包合同进度结算详细信息
*
* @param id 主键
*/
@SaCheckPermission("ctr:contractProgressSettlement:query")
@GetMapping("/{id}")
public R<CtrContractProgressSettlementVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(ctrContractProgressSettlementService.queryById(id));
}
/**
* 新增承包合同进度结算
*/
@SaCheckPermission("ctr:contractProgressSettlement:add")
@Log(title = "承包合同进度结算", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated @RequestBody CtrContractProgressSettlementCreateReq req) {
return toAjax(ctrContractProgressSettlementService.insertByBo(req));
}
/**
* 修改承包合同进度结算
*/
@SaCheckPermission("ctr:contractProgressSettlement:edit")
@Log(title = "承包合同进度结算", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated @RequestBody CtrContractProgressSettlementUpdateReq req) {
return toAjax(ctrContractProgressSettlementService.updateByBo(req));
}
/**
* 查询金额合计
*/
@SaCheckPermission("ctr:contractProgressSettlement:query")
@GetMapping("/queryMoneyTotal")
public R<CtrContractProgressSettlementTotalVo> queryMoneyTotal(CtrContractProgressSettlementBo bo) {
return R.ok(ctrContractProgressSettlementService.queryMoneyTotal(bo));
}
/**
* 删除承包合同进度结算
*
* @param ids 主键串
*/
@SaCheckPermission("ctr:contractProgressSettlement:remove")
@Log(title = "承包合同进度结算", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(ctrContractProgressSettlementService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,105 @@
package org.dromara.ctr.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.ctr.domain.vo.CtrContractProgressSettlementItemVo;
import org.dromara.ctr.domain.bo.CtrContractProgressSettlementItemBo;
import org.dromara.ctr.service.ICtrContractProgressSettlementItemService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 承包合同进度结算清单
*
* @author lilemy
* @date 2025-10-18
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/ctr/contractProgressSettlementItem")
public class CtrContractProgressSettlementItemController extends BaseController {
private final ICtrContractProgressSettlementItemService ctrContractProgressSettlementItemService;
/**
* 查询承包合同进度结算清单列表
*/
@SaCheckPermission("ctr:contractProgressSettlementItem:list")
@GetMapping("/list")
public TableDataInfo<CtrContractProgressSettlementItemVo> list(CtrContractProgressSettlementItemBo bo, PageQuery pageQuery) {
return ctrContractProgressSettlementItemService.queryPageList(bo, pageQuery);
}
/**
* 导出承包合同进度结算清单列表
*/
@SaCheckPermission("ctr:contractProgressSettlementItem:export")
@Log(title = "承包合同进度结算清单", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CtrContractProgressSettlementItemBo bo, HttpServletResponse response) {
List<CtrContractProgressSettlementItemVo> list = ctrContractProgressSettlementItemService.queryList(bo);
ExcelUtil.exportExcel(list, "承包合同进度结算清单", CtrContractProgressSettlementItemVo.class, response);
}
/**
* 获取承包合同进度结算清单详细信息
*
* @param id 主键
*/
@SaCheckPermission("ctr:contractProgressSettlementItem:query")
@GetMapping("/{id}")
public R<CtrContractProgressSettlementItemVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(ctrContractProgressSettlementItemService.queryById(id));
}
/**
* 新增承包合同进度结算清单
*/
@SaCheckPermission("ctr:contractProgressSettlementItem:add")
@Log(title = "承包合同进度结算清单", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CtrContractProgressSettlementItemBo bo) {
return toAjax(ctrContractProgressSettlementItemService.insertByBo(bo));
}
/**
* 修改承包合同进度结算清单
*/
@SaCheckPermission("ctr:contractProgressSettlementItem:edit")
@Log(title = "承包合同进度结算清单", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CtrContractProgressSettlementItemBo bo) {
return toAjax(ctrContractProgressSettlementItemService.updateByBo(bo));
}
/**
* 删除承包合同进度结算清单
*
* @param ids 主键串
*/
@SaCheckPermission("ctr:contractProgressSettlementItem:remove")
@Log(title = "承包合同进度结算清单", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(ctrContractProgressSettlementItemService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,106 @@
package org.dromara.ctr.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.ctr.domain.bo.CtrSubcontractProgressSettlementBo;
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementCreateReq;
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementUpdateReq;
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementVo;
import org.dromara.ctr.service.ICtrSubcontractProgressSettlementService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 分包合同进度结算
*
* @author lilemy
* @date 2025-10-18
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/ctr/subcontractProgressSettlement")
public class CtrSubcontractProgressSettlementController extends BaseController {
private final ICtrSubcontractProgressSettlementService ctrSubcontractProgressSettlementService;
/**
* 查询分包合同进度结算列表
*/
@SaCheckPermission("ctr:subcontractProgressSettlement:list")
@GetMapping("/list")
public TableDataInfo<CtrSubcontractProgressSettlementVo> list(CtrSubcontractProgressSettlementBo bo, PageQuery pageQuery) {
return ctrSubcontractProgressSettlementService.queryPageList(bo, pageQuery);
}
/**
* 导出分包合同进度结算列表
*/
@SaCheckPermission("ctr:subcontractProgressSettlement:export")
@Log(title = "分包合同进度结算", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CtrSubcontractProgressSettlementBo bo, HttpServletResponse response) {
List<CtrSubcontractProgressSettlementVo> list = ctrSubcontractProgressSettlementService.queryList(bo);
ExcelUtil.exportExcel(list, "分包合同进度结算", CtrSubcontractProgressSettlementVo.class, response);
}
/**
* 获取分包合同进度结算详细信息
*
* @param id 主键
*/
@SaCheckPermission("ctr:subcontractProgressSettlement:query")
@GetMapping("/{id}")
public R<CtrSubcontractProgressSettlementVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(ctrSubcontractProgressSettlementService.queryById(id));
}
/**
* 新增分包合同进度结算
*/
@SaCheckPermission("ctr:subcontractProgressSettlement:add")
@Log(title = "分包合同进度结算", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated @RequestBody CtrSubcontractProgressSettlementCreateReq req) {
return toAjax(ctrSubcontractProgressSettlementService.insertByBo(req));
}
/**
* 修改分包合同进度结算
*/
@SaCheckPermission("ctr:subcontractProgressSettlement:edit")
@Log(title = "分包合同进度结算", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated @RequestBody CtrSubcontractProgressSettlementUpdateReq req) {
return toAjax(ctrSubcontractProgressSettlementService.updateByBo(req));
}
/**
* 删除分包合同进度结算
*
* @param ids 主键串
*/
@SaCheckPermission("ctr:subcontractProgressSettlement:remove")
@Log(title = "分包合同进度结算", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(ctrSubcontractProgressSettlementService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,105 @@
package org.dromara.ctr.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.ctr.domain.vo.CtrSubcontractProgressSettlementItemVo;
import org.dromara.ctr.domain.bo.CtrSubcontractProgressSettlementItemBo;
import org.dromara.ctr.service.ICtrSubcontractProgressSettlementItemService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 分包合同进度结算清单
*
* @author lilemy
* @date 2025-10-18
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/ctr/subcontractProgressSettlementItem")
public class CtrSubcontractProgressSettlementItemController extends BaseController {
private final ICtrSubcontractProgressSettlementItemService ctrSubcontractProgressSettlementItemService;
/**
* 查询分包合同进度结算清单列表
*/
@SaCheckPermission("ctr:subcontractProgressSettlementItem:list")
@GetMapping("/list")
public TableDataInfo<CtrSubcontractProgressSettlementItemVo> list(CtrSubcontractProgressSettlementItemBo bo, PageQuery pageQuery) {
return ctrSubcontractProgressSettlementItemService.queryPageList(bo, pageQuery);
}
/**
* 导出分包合同进度结算清单列表
*/
@SaCheckPermission("ctr:subcontractProgressSettlementItem:export")
@Log(title = "分包合同进度结算清单", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CtrSubcontractProgressSettlementItemBo bo, HttpServletResponse response) {
List<CtrSubcontractProgressSettlementItemVo> list = ctrSubcontractProgressSettlementItemService.queryList(bo);
ExcelUtil.exportExcel(list, "分包合同进度结算清单", CtrSubcontractProgressSettlementItemVo.class, response);
}
/**
* 获取分包合同进度结算清单详细信息
*
* @param id 主键
*/
@SaCheckPermission("ctr:subcontractProgressSettlementItem:query")
@GetMapping("/{id}")
public R<CtrSubcontractProgressSettlementItemVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(ctrSubcontractProgressSettlementItemService.queryById(id));
}
/**
* 新增分包合同进度结算清单
*/
@SaCheckPermission("ctr:subcontractProgressSettlementItem:add")
@Log(title = "分包合同进度结算清单", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CtrSubcontractProgressSettlementItemBo bo) {
return toAjax(ctrSubcontractProgressSettlementItemService.insertByBo(bo));
}
/**
* 修改分包合同进度结算清单
*/
@SaCheckPermission("ctr:subcontractProgressSettlementItem:edit")
@Log(title = "分包合同进度结算清单", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CtrSubcontractProgressSettlementItemBo bo) {
return toAjax(ctrSubcontractProgressSettlementItemService.updateByBo(bo));
}
/**
* 删除分包合同进度结算清单
*
* @param ids 主键串
*/
@SaCheckPermission("ctr:subcontractProgressSettlementItem:remove")
@Log(title = "分包合同进度结算清单", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(ctrSubcontractProgressSettlementItemService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -0,0 +1,139 @@
package org.dromara.ctr.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 承包合同进度结算对象 ctr_contract_progress_settlement
*
* @author lilemy
* @date 2025-10-18
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("ctr_contract_progress_settlement")
public class CtrContractProgressSettlement extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 所属部门
*/
private Long deptId;
/**
* 单据编码
*/
private String documentCode;
/**
* 标题
*/
private String title;
/**
* 结算日期
*/
private LocalDate settlementDate;
/**
* 合同编码
*/
private String contractCode;
/**
* 合同名称
*/
private String contractName;
/**
* 统计周期
*/
private String contractProgress;
/**
* 项目ID
*/
private Long projectId;
/**
* 项目名称
*/
private String projectName;
/**
* 审批金额
*/
private BigDecimal approvalAmount;
/**
* 计量开始日期
*/
private LocalDate measureDateBegin;
/**
* 计量结束日期
*/
private LocalDate measureDateEnd;
/**
* 结算单位(客户)
*/
private Long settlementUnit;
/**
* 本期结算金额
*/
private BigDecimal settlementMoney;
/**
* 本期扣款金额
*/
private BigDecimal deductionMoney;
/**
* 本期奖励金额
*/
private BigDecimal bonus;
/**
* 合同金额
*/
private BigDecimal contractAmount;
/**
* 本次结算比例
*/
private BigDecimal thisSettlementRatio;
/**
* 支付条款
*/
private Long paymentTerms;
/**
* 多文件逗号分隔
*/
private String fileId;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,107 @@
package org.dromara.ctr.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;
/**
* 承包合同进度结算清单对象 ctr_contract_progress_settlement_item
*
* @author lilemy
* @date 2025-10-18
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("ctr_contract_progress_settlement_item")
public class CtrContractProgressSettlementItem extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 结算单ID
*/
private Long settlementId;
/**
* 类型(1合同内清单 2变更增加清单 3合同外清单)
*/
private String type;
/**
* 编码
*/
private String code;
/**
* 合同清单名称
*/
private String name;
/**
* 计量单位
*/
private String unit;
/**
* 单价
*/
private BigDecimal unitPrice;
/**
* 含税单价
*/
private BigDecimal taxUnitPrice;
/**
* 本期结算数量
*/
private BigDecimal currentQty;
/**
* 本期结算百分比
*/
private BigDecimal currentRate;
/**
* 本期结算金额
*/
private BigDecimal currentAmount;
/**
* 本期结算不含税金额
*/
private BigDecimal currentNoAmount;
/**
* 本期审批数量
*/
private BigDecimal currentApprovedQty;
/**
* 本期审批金额
*/
private BigDecimal currentApprovedAmount;
/**
* 税率(%
*/
private String taxRate;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,123 @@
package org.dromara.ctr.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;
/**
* 分包合同进度结算对象 ctr_subcontract_progress_settlement
*
* @author lilemy
* @date 2025-10-18
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("ctr_subcontract_progress_settlement")
public class CtrSubcontractProgressSettlement extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 所属部门
*/
private Long deptId;
/**
* 单据编码
*/
private String documentCode;
/**
* 标题
*/
private String title;
/**
* 单据日期
*/
private LocalDate documentDate;
/**
* 合同编码
*/
private String contractCode;
/**
* 合同名称
*/
private String contractName;
/**
* 统计周期
*/
private String contractProgress;
/**
* 计量开始日期
*/
private LocalDate measureDateBegin;
/**
* 计量结束日期
*/
private LocalDate measureDateEnd;
/**
* 项目ID
*/
private Long projectId;
/**
* 项目名称
*/
private String projectName;
/**
* 审批金额
*/
private BigDecimal approvalAmount;
/**
* 结算单位
*/
private Long settlementUnit;
/**
* 合同金额
*/
private BigDecimal contractAmount;
/**
* 本次结算比例
*/
private BigDecimal currentSettlementRate;
/**
* 文件ID
*/
private String fileId;
/**
* 审核状态
*/
private String auditStatus;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,130 @@
package org.dromara.ctr.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.math.BigDecimal;
/**
* 分包合同进度结算清单对象 ctr_subcontract_progress_settlement_item
*
* @author lilemy
* @date 2025-10-18
*/
@Data
@TableName("ctr_subcontract_progress_settlement_item")
public class CtrSubcontractProgressSettlementItem implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 结算单ID
*/
private Long settlementId;
/**
* 类型(1合同内清单 2变更增加清单 3合同外清单)
*/
private String type;
/**
* 编码
*/
private String code;
/**
* 合同清单名称
*/
private String name;
/**
* 计量单位
*/
private String unit;
/**
* 单价
*/
private BigDecimal unitPrice;
/**
* 含税单价
*/
private BigDecimal taxUnitPrice;
/**
* 本期结算数量
*/
private BigDecimal currentQty;
/**
* 本期结算百分比
*/
private BigDecimal currentRate;
/**
* 本期结算金额
*/
private BigDecimal currentAmount;
/**
* 本期结算不含税金额
*/
private BigDecimal currentNoAmount;
/**
* 本期审批数量
*/
private BigDecimal currentApprovedQty;
/**
* 本期审批金额
*/
private BigDecimal currentApprovedAmount;
/**
* 税率(%
*/
private String taxRate;
/**
* 税额
*/
private String tax;
/**
* WBS工作分解结构
*/
private String wbs;
/**
* CBS成本分解结构
*/
private String cbs;
/**
* CBS预算总额
*/
private BigDecimal cbsBudgetTotal;
/**
* CBS余额
*/
private BigDecimal cbsBalance;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,150 @@
package org.dromara.ctr.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.ctr.domain.CtrContractProgressSettlement;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 承包合同进度结算业务对象 ctr_contract_progress_settlement
*
* @author lilemy
* @date 2025-10-18
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = CtrContractProgressSettlement.class, reverseConvertGenerate = false)
public class CtrContractProgressSettlementBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = {EditGroup.class})
private Long id;
/**
* 所属部门
*/
@NotNull(message = "所属部门不能为空", groups = {AddGroup.class, EditGroup.class})
private Long deptId;
/**
* 单据编码
*/
@NotBlank(message = "单据编码不能为空", groups = {AddGroup.class, EditGroup.class})
private String documentCode;
/**
* 标题
*/
@NotBlank(message = "标题不能为空", groups = {AddGroup.class, EditGroup.class})
private String title;
/**
* 结算日期
*/
@NotNull(message = "结算日期不能为空", groups = {AddGroup.class, EditGroup.class})
private LocalDate settlementDate;
/**
* 合同编码
*/
@NotBlank(message = "合同编码不能为空", groups = {AddGroup.class, EditGroup.class})
private String contractCode;
/**
* 类型1付款 2收款
*/
private String type;
/**
* 合同名称
*/
private String contractName;
/**
* 统计周期
*/
private String contractProgress;
/**
* 项目ID
*/
private Long projectId;
/**
* 项目名称
*/
private String projectName;
/**
* 审批金额
*/
@NotNull(message = "审批金额不能为空", groups = {AddGroup.class, EditGroup.class})
private BigDecimal approvalAmount;
/**
* 计量开始日期
*/
private LocalDate measureDateBegin;
/**
* 计量结束日期
*/
private LocalDate measureDateEnd;
/**
* 结算单位(客户)
*/
private Long settlementUnit;
/**
* 本期结算金额
*/
private BigDecimal settlementMoney;
/**
* 本期扣款金额
*/
private BigDecimal deductionMoney;
/**
* 本期奖励金额
*/
private BigDecimal bonus;
/**
* 合同金额
*/
private BigDecimal contractAmount;
/**
* 本次结算比例
*/
private BigDecimal thisSettlementRatio;
/**
* 支付条款
*/
private Long paymentTerms;
/**
* 多文件逗号分隔
*/
private String fileId;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,110 @@
package org.dromara.ctr.domain.bo;
import org.dromara.ctr.domain.CtrContractProgressSettlementItem;
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;
/**
* 承包合同进度结算清单业务对象 ctr_contract_progress_settlement_item
*
* @author lilemy
* @date 2025-10-18
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = CtrContractProgressSettlementItem.class, reverseConvertGenerate = false)
public class CtrContractProgressSettlementItemBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 结算单ID
*/
@NotNull(message = "结算单ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long settlementId;
/**
* 类型(1合同内清单 2变更增加清单 3合同外清单)
*/
@NotBlank(message = "类型(1合同内清单 2变更增加清单 3合同外清单)不能为空", groups = { AddGroup.class, EditGroup.class })
private String type;
/**
* 编码
*/
@NotBlank(message = "编码不能为空", groups = { AddGroup.class, EditGroup.class })
private String code;
/**
* 合同清单名称
*/
@NotBlank(message = "合同清单名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String name;
/**
* 计量单位
*/
@NotBlank(message = "计量单位不能为空", groups = { AddGroup.class, EditGroup.class })
private String unit;
/**
* 单价
*/
private BigDecimal unitPrice;
/**
* 含税单价
*/
private BigDecimal taxUnitPrice;
/**
* 本期结算数量
*/
private BigDecimal currentQty;
/**
* 本期结算百分比
*/
private BigDecimal currentRate;
/**
* 本期结算金额
*/
private BigDecimal currentAmount;
/**
* 本期结算不含税金额
*/
private BigDecimal currentNoAmount;
/**
* 本期审批数量
*/
private BigDecimal currentApprovedQty;
/**
* 本期审批金额
*/
private BigDecimal currentApprovedAmount;
/**
* 税率(%
*/
private String taxRate;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,122 @@
package org.dromara.ctr.domain.bo;
import org.dromara.ctr.domain.CtrSubcontractProgressSettlement;
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;
/**
* 分包合同进度结算业务对象 ctr_subcontract_progress_settlement
*
* @author lilemy
* @date 2025-10-18
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = CtrSubcontractProgressSettlement.class, reverseConvertGenerate = false)
public class CtrSubcontractProgressSettlementBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 单据编码
*/
@NotBlank(message = "单据编码不能为空", groups = { AddGroup.class, EditGroup.class })
private String documentCode;
/**
* 标题
*/
@NotBlank(message = "标题不能为空", groups = { AddGroup.class, EditGroup.class })
private String title;
/**
* 单据日期
*/
@NotNull(message = "单据日期不能为空", groups = { AddGroup.class, EditGroup.class })
private LocalDate documentDate;
/**
* 合同编码
*/
@NotBlank(message = "合同编码不能为空", groups = { AddGroup.class, EditGroup.class })
private String contractCode;
/**
* 合同名称
*/
private String contractName;
/**
* 统计周期
*/
private String contractProgress;
/**
* 计量开始日期
*/
private LocalDate measureDateBegin;
/**
* 计量结束日期
*/
private LocalDate measureDateEnd;
/**
* 项目ID
*/
private Long projectId;
/**
* 项目名称
*/
private String projectName;
/**
* 审批金额
*/
@NotNull(message = "审批金额不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal approvalAmount;
/**
* 结算单位
*/
private Long settlementUnit;
/**
* 合同金额
*/
private BigDecimal contractAmount;
/**
* 本次结算比例
*/
private BigDecimal currentSettlementRate;
/**
* 文件ID
*/
private String fileId;
/**
* 审核状态
*/
private String auditStatus;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,136 @@
package org.dromara.ctr.domain.bo;
import org.dromara.ctr.domain.CtrSubcontractProgressSettlementItem;
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;
/**
* 分包合同进度结算清单业务对象 ctr_subcontract_progress_settlement_item
*
* @author lilemy
* @date 2025-10-18
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = CtrSubcontractProgressSettlementItem.class, reverseConvertGenerate = false)
public class CtrSubcontractProgressSettlementItemBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
private Long id;
/**
* 结算单ID
*/
@NotNull(message = "结算单ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long settlementId;
/**
* 类型(1合同内清单 2变更增加清单 3合同外清单)
*/
@NotBlank(message = "类型(1合同内清单 2变更增加清单 3合同外清单)不能为空", groups = { AddGroup.class, EditGroup.class })
private String type;
/**
* 编码
*/
@NotBlank(message = "编码不能为空", groups = { AddGroup.class, EditGroup.class })
private String code;
/**
* 合同清单名称
*/
@NotBlank(message = "合同清单名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String name;
/**
* 计量单位
*/
@NotBlank(message = "计量单位不能为空", groups = { AddGroup.class, EditGroup.class })
private String unit;
/**
* 单价
*/
private BigDecimal unitPrice;
/**
* 含税单价
*/
private BigDecimal taxUnitPrice;
/**
* 本期结算数量
*/
private BigDecimal currentQty;
/**
* 本期结算百分比
*/
private BigDecimal currentRate;
/**
* 本期结算金额
*/
private BigDecimal currentAmount;
/**
* 本期结算不含税金额
*/
private BigDecimal currentNoAmount;
/**
* 本期审批数量
*/
private BigDecimal currentApprovedQty;
/**
* 本期审批金额
*/
private BigDecimal currentApprovedAmount;
/**
* 税率(%
*/
private String taxRate;
/**
* 税额
*/
private String tax;
/**
* WBS工作分解结构
*/
private String wbs;
/**
* CBS成本分解结构
*/
private String cbs;
/**
* CBS预算总额
*/
private BigDecimal cbsBudgetTotal;
/**
* CBS余额
*/
private BigDecimal cbsBalance;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,148 @@
package org.dromara.ctr.domain.dto;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.dromara.ctr.domain.CtrContractProgressSettlement;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
* 承包合同进度结算业务对象 ctr_contract_progress_settlement
*
* @author lilemy
* @date 2025-10-18
*/
@Data
@AutoMapper(target = CtrContractProgressSettlement.class, reverseConvertGenerate = false)
public class CtrContractProgressSettlementCreateReq implements Serializable {
@Serial
private static final long serialVersionUID = -7707258738219359278L;
/**
* 所属部门
*/
@NotNull(message = "所属部门不能为空")
private Long deptId;
/**
* 标题
*/
@NotBlank(message = "标题不能为空")
private String title;
/**
* 结算日期
*/
@NotNull(message = "结算日期不能为空")
private LocalDate settlementDate;
/**
* 合同编码
*/
@NotBlank(message = "合同编码不能为空")
private String contractCode;
/**
* 合同名称
*/
private String contractName;
/**
* 统计周期
*/
private String contractProgress;
/**
* 项目ID
*/
private Long projectId;
/**
* 项目名称
*/
private String projectName;
/**
* 审批金额
*/
@NotNull(message = "审批金额不能为空")
private BigDecimal approvalAmount;
/**
* 计量开始日期
*/
private LocalDate measureDateBegin;
/**
* 计量结束日期
*/
private LocalDate measureDateEnd;
/**
* 结算单位(客户)
*/
private Long settlementUnit;
/**
* 本期结算金额
*/
private BigDecimal settlementMoney;
/**
* 本期扣款金额
*/
private BigDecimal deductionMoney;
/**
* 本期奖励金额
*/
private BigDecimal bonus;
/**
* 合同金额
*/
private BigDecimal contractAmount;
/**
* 本次结算比例
*/
private BigDecimal thisSettlementRatio;
/**
* 支付条款
*/
private Long paymentTerms;
/**
* 多文件逗号分隔
*/
private String fileId;
/**
* 备注
*/
private String remark;
/**
* 合同内清单
*/
private List<CtrContractProgressSettlementItemCreateReq> inInventory;
/**
* 变更增加清单
*/
private List<CtrContractProgressSettlementItemCreateReq> changeInventory;
/**
* 合同外清单
*/
private List<CtrContractProgressSettlementItemCreateReq> outInventory;
}

View File

@ -0,0 +1,86 @@
package org.dromara.ctr.domain.dto;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* @author lilemy
* @date 2025-10-18 17:05
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CtrContractProgressSettlementItemCreateReq {
/**
* 编码
*/
@NotBlank(message = "编码不能为空")
private String code;
/**
* 合同清单名称
*/
@NotBlank(message = "合同清单名称不能为空")
private String name;
/**
* 计量单位
*/
@NotBlank(message = "计量单位不能为空")
private String unit;
/**
* 单价
*/
private BigDecimal unitPrice;
/**
* 含税单价
*/
private BigDecimal taxUnitPrice;
/**
* 本期结算数量
*/
private BigDecimal currentQty;
/**
* 本期结算百分比
*/
private BigDecimal currentRate;
/**
* 本期结算金额
*/
private BigDecimal currentAmount;
/**
* 本期结算不含税金额
*/
private BigDecimal currentNoAmount;
/**
* 本期审批数量
*/
private BigDecimal currentApprovedQty;
/**
* 本期审批金额
*/
private BigDecimal currentApprovedAmount;
/**
* 税率(%
*/
private String taxRate;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,91 @@
package org.dromara.ctr.domain.dto;
import jakarta.validation.constraints.NotBlank;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* @author lilemy
* @date 2025-10-18 17:39
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CtrContractProgressSettlementItemUpdateReq {
/**
* 主键ID
*/
private Long id;
/**
* 编码
*/
@NotBlank(message = "编码不能为空")
private String code;
/**
* 合同清单名称
*/
@NotBlank(message = "合同清单名称不能为空")
private String name;
/**
* 计量单位
*/
@NotBlank(message = "计量单位不能为空")
private String unit;
/**
* 单价
*/
private BigDecimal unitPrice;
/**
* 含税单价
*/
private BigDecimal taxUnitPrice;
/**
* 本期结算数量
*/
private BigDecimal currentQty;
/**
* 本期结算百分比
*/
private BigDecimal currentRate;
/**
* 本期结算金额
*/
private BigDecimal currentAmount;
/**
* 本期结算不含税金额
*/
private BigDecimal currentNoAmount;
/**
* 本期审批数量
*/
private BigDecimal currentApprovedQty;
/**
* 本期审批金额
*/
private BigDecimal currentApprovedAmount;
/**
* 税率(%
*/
private String taxRate;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,157 @@
package org.dromara.ctr.domain.dto;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.dromara.ctr.domain.CtrContractProgressSettlement;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
* @author lilemy
* @date 2025-10-18 17:30
*/
@Data
@AutoMapper(target = CtrContractProgressSettlement.class, reverseConvertGenerate = false)
public class CtrContractProgressSettlementUpdateReq implements Serializable {
@Serial
private static final long serialVersionUID = -105855005415297131L;
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空")
private Long id;
/**
* 所属部门
*/
@NotNull(message = "所属部门不能为空")
private Long deptId;
/**
* 单据编码
*/
@NotBlank(message = "单据编码不能为空")
private String documentCode;
/**
* 标题
*/
@NotBlank(message = "标题不能为空")
private String title;
/**
* 结算日期
*/
@NotNull(message = "结算日期不能为空")
private LocalDate settlementDate;
/**
* 合同编码
*/
@NotBlank(message = "合同编码不能为空")
private String contractCode;
/**
* 合同名称
*/
private String contractName;
/**
* 统计周期
*/
private String contractProgress;
/**
* 项目ID
*/
private Long projectId;
/**
* 项目名称
*/
private String projectName;
/**
* 审批金额
*/
@NotNull(message = "审批金额不能为空")
private BigDecimal approvalAmount;
/**
* 计量开始日期
*/
private LocalDate measureDateBegin;
/**
* 计量结束日期
*/
private LocalDate measureDateEnd;
/**
* 结算单位(客户)
*/
private Long settlementUnit;
/**
* 本期结算金额
*/
private BigDecimal settlementMoney;
/**
* 本期扣款金额
*/
private BigDecimal deductionMoney;
/**
* 本期奖励金额
*/
private BigDecimal bonus;
/**
* 合同金额
*/
private BigDecimal contractAmount;
/**
* 本次结算比例
*/
private BigDecimal thisSettlementRatio;
/**
* 支付条款
*/
private Long paymentTerms;
/**
* 多文件逗号分隔
*/
private String fileId;
/**
* 备注
*/
private String remark;
/**
* 合同内清单
*/
private List<CtrContractProgressSettlementItemUpdateReq> inInventory;
/**
* 变更增加清单
*/
private List<CtrContractProgressSettlementItemUpdateReq> changeInventory;
/**
* 合同外清单
*/
private List<CtrContractProgressSettlementItemUpdateReq> outInventory;
}

View File

@ -0,0 +1,129 @@
package org.dromara.ctr.domain.dto;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.dromara.ctr.domain.CtrSubcontractProgressSettlement;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
* @author lilemy
* @date 2025-10-18 19:14
*/
@Data
@AutoMapper(target = CtrSubcontractProgressSettlement.class, reverseConvertGenerate = false)
public class CtrSubcontractProgressSettlementCreateReq implements Serializable {
@Serial
private static final long serialVersionUID = 770553999547826460L;
/**
* 所属部门
*/
private Long deptId;
/**
* 标题
*/
@NotBlank(message = "标题不能为空")
private String title;
/**
* 单据日期
*/
@NotNull(message = "单据日期不能为空")
private LocalDate documentDate;
/**
* 合同编码
*/
@NotBlank(message = "合同编码不能为空")
private String contractCode;
/**
* 合同名称
*/
private String contractName;
/**
* 统计周期
*/
private String contractProgress;
/**
* 计量开始日期
*/
private LocalDate measureDateBegin;
/**
* 计量结束日期
*/
private LocalDate measureDateEnd;
/**
* 项目ID
*/
private Long projectId;
/**
* 项目名称
*/
private String projectName;
/**
* 审批金额
*/
@NotNull(message = "审批金额不能为空")
private BigDecimal approvalAmount;
/**
* 结算单位
*/
private Long settlementUnit;
/**
* 合同金额
*/
private BigDecimal contractAmount;
/**
* 本次结算比例
*/
private BigDecimal currentSettlementRate;
/**
* 文件ID
*/
private String fileId;
/**
* 审核状态
*/
private String auditStatus;
/**
* 备注
*/
private String remark;
/**
* 合同内清单
*/
private List<CtrSubcontractProgressSettlementItemCreateReq> inInventory;
/**
* 变更增加清单
*/
private List<CtrSubcontractProgressSettlementItemCreateReq> changeInventory;
/**
* 合同外清单
*/
private List<CtrSubcontractProgressSettlementItemCreateReq> outInventory;
}

View File

@ -0,0 +1,115 @@
package org.dromara.ctr.domain.dto;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import org.dromara.ctr.domain.CtrSubcontractProgressSettlementItem;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author lilemy
* @date 2025-10-18 19:17
*/
@Data
@AutoMapper(target = CtrSubcontractProgressSettlementItem.class, reverseConvertGenerate = false)
public class CtrSubcontractProgressSettlementItemCreateReq implements Serializable {
@Serial
private static final long serialVersionUID = -7720839036718185218L;
/**
* 编码
*/
@NotBlank(message = "编码不能为空")
private String code;
/**
* 合同清单名称
*/
@NotBlank(message = "合同清单名称不能为空")
private String name;
/**
* 计量单位
*/
@NotBlank(message = "计量单位不能为空")
private String unit;
/**
* 单价
*/
private BigDecimal unitPrice;
/**
* 含税单价
*/
private BigDecimal taxUnitPrice;
/**
* 本期结算数量
*/
private BigDecimal currentQty;
/**
* 本期结算百分比
*/
private BigDecimal currentRate;
/**
* 本期结算金额
*/
private BigDecimal currentAmount;
/**
* 本期结算不含税金额
*/
private BigDecimal currentNoAmount;
/**
* 本期审批数量
*/
private BigDecimal currentApprovedQty;
/**
* 本期审批金额
*/
private BigDecimal currentApprovedAmount;
/**
* 税率(%
*/
private String taxRate;
/**
* 税额
*/
private String tax;
/**
* WBS工作分解结构
*/
private String wbs;
/**
* CBS成本分解结构
*/
private String cbs;
/**
* CBS预算总额
*/
private BigDecimal cbsBudgetTotal;
/**
* CBS余额
*/
private BigDecimal cbsBalance;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,123 @@
package org.dromara.ctr.domain.dto;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.dromara.ctr.domain.CtrSubcontractProgressSettlementItem;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author lilemy
* @date 2025-10-18 19:21
*/
@Data
@AutoMapper(target = CtrSubcontractProgressSettlementItem.class, reverseConvertGenerate = false)
public class CtrSubcontractProgressSettlementItemUpdateReq implements Serializable {
@Serial
private static final long serialVersionUID = 4319471696029509036L;
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空")
private Long id;
/**
* 编码
*/
@NotBlank(message = "编码不能为空")
private String code;
/**
* 合同清单名称
*/
@NotBlank(message = "合同清单名称不能为空")
private String name;
/**
* 计量单位
*/
@NotBlank(message = "计量单位不能为空")
private String unit;
/**
* 单价
*/
private BigDecimal unitPrice;
/**
* 含税单价
*/
private BigDecimal taxUnitPrice;
/**
* 本期结算数量
*/
private BigDecimal currentQty;
/**
* 本期结算百分比
*/
private BigDecimal currentRate;
/**
* 本期结算金额
*/
private BigDecimal currentAmount;
/**
* 本期结算不含税金额
*/
private BigDecimal currentNoAmount;
/**
* 本期审批数量
*/
private BigDecimal currentApprovedQty;
/**
* 本期审批金额
*/
private BigDecimal currentApprovedAmount;
/**
* 税率(%
*/
private String taxRate;
/**
* 税额
*/
private String tax;
/**
* WBS工作分解结构
*/
private String wbs;
/**
* CBS成本分解结构
*/
private String cbs;
/**
* CBS预算总额
*/
private BigDecimal cbsBudgetTotal;
/**
* CBS余额
*/
private BigDecimal cbsBalance;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,136 @@
package org.dromara.ctr.domain.dto;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.dromara.ctr.domain.CtrSubcontractProgressSettlement;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
* @author lilemy
* @date 2025-10-18 19:20
*/
@Data
@AutoMapper(target = CtrSubcontractProgressSettlement.class, reverseConvertGenerate = false)
public class CtrSubcontractProgressSettlementUpdateReq implements Serializable {
@Serial
private static final long serialVersionUID = -7099475527833822253L;
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空")
private Long id;
/**
* 单据编码
*/
@NotBlank(message = "单据编码不能为空")
private String documentCode;
/**
* 标题
*/
@NotBlank(message = "标题不能为空")
private String title;
/**
* 单据日期
*/
@NotNull(message = "单据日期不能为空")
private LocalDate documentDate;
/**
* 合同编码
*/
@NotBlank(message = "合同编码不能为空")
private String contractCode;
/**
* 合同名称
*/
private String contractName;
/**
* 统计周期
*/
private String contractProgress;
/**
* 计量开始日期
*/
private LocalDate measureDateBegin;
/**
* 计量结束日期
*/
private LocalDate measureDateEnd;
/**
* 项目ID
*/
private Long projectId;
/**
* 项目名称
*/
private String projectName;
/**
* 审批金额
*/
@NotNull(message = "审批金额不能为空")
private BigDecimal approvalAmount;
/**
* 结算单位
*/
private Long settlementUnit;
/**
* 合同金额
*/
private BigDecimal contractAmount;
/**
* 本次结算比例
*/
private BigDecimal currentSettlementRate;
/**
* 文件ID
*/
private String fileId;
/**
* 审核状态
*/
private String auditStatus;
/**
* 备注
*/
private String remark;
/**
* 合同内清单
*/
private List<CtrSubcontractProgressSettlementItemUpdateReq> inInventory;
/**
* 变更增加清单
*/
private List<CtrSubcontractProgressSettlementItemUpdateReq> changeInventory;
/**
* 合同外清单
*/
private List<CtrSubcontractProgressSettlementItemUpdateReq> outInventory;
}

View File

@ -0,0 +1,130 @@
package org.dromara.ctr.domain.vo;
import java.math.BigDecimal;
import org.dromara.ctr.domain.CtrContractProgressSettlementItem;
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.util.Date;
/**
* 承包合同进度结算清单视图对象 ctr_contract_progress_settlement_item
*
* @author lilemy
* @date 2025-10-18
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = CtrContractProgressSettlementItem.class)
public class CtrContractProgressSettlementItemVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 结算单ID
*/
@ExcelProperty(value = "结算单ID")
private Long settlementId;
/**
* 类型(1合同内清单 2变更增加清单 3合同外清单)
*/
@ExcelProperty(value = "类型(1合同内清单 2变更增加清单 3合同外清单)")
private String type;
/**
* 编码
*/
@ExcelProperty(value = "编码")
private String code;
/**
* 合同清单名称
*/
@ExcelProperty(value = "合同清单名称")
private String name;
/**
* 计量单位
*/
@ExcelProperty(value = "计量单位")
private String unit;
/**
* 单价
*/
@ExcelProperty(value = "单价")
private BigDecimal unitPrice;
/**
* 含税单价
*/
@ExcelProperty(value = "含税单价")
private BigDecimal taxUnitPrice;
/**
* 本期结算数量
*/
@ExcelProperty(value = "本期结算数量")
private BigDecimal currentQty;
/**
* 本期结算百分比
*/
@ExcelProperty(value = "本期结算百分比")
private BigDecimal currentRate;
/**
* 本期结算金额
*/
@ExcelProperty(value = "本期结算金额")
private BigDecimal currentAmount;
/**
* 本期结算不含税金额
*/
@ExcelProperty(value = "本期结算不含税金额")
private BigDecimal currentNoAmount;
/**
* 本期审批数量
*/
@ExcelProperty(value = "本期审批数量")
private BigDecimal currentApprovedQty;
/**
* 本期审批金额
*/
@ExcelProperty(value = "本期审批金额")
private BigDecimal currentApprovedAmount;
/**
* 税率(%
*/
@ExcelProperty(value = "税率", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "xzd_tax_rate")
private String taxRate;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@ -0,0 +1,23 @@
package org.dromara.ctr.domain.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author lilemy
* @date 2025-10-21 11:01
*/
@Data
public class CtrContractProgressSettlementTotalVo implements Serializable {
@Serial
private static final long serialVersionUID = 1537548228169684228L;
/**
* 总金额
*/
private BigDecimal moneyTotal;
}

View File

@ -0,0 +1,192 @@
package org.dromara.ctr.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.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.ctr.domain.CtrContractProgressSettlement;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
* 承包合同进度结算视图对象 ctr_contract_progress_settlement
*
* @author lilemy
* @date 2025-10-18
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = CtrContractProgressSettlement.class)
public class CtrContractProgressSettlementVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 所属部门
*/
@ExcelProperty(value = "所属部门")
private Long deptId;
/**
* 部门名称
*/
@Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "deptId")
private String deptName;
/**
* 单据编码
*/
@ExcelProperty(value = "单据编码")
private String documentCode;
/**
* 标题
*/
@ExcelProperty(value = "标题")
private String title;
/**
* 结算日期
*/
@ExcelProperty(value = "结算日期")
private LocalDate settlementDate;
/**
* 合同编码
*/
@ExcelProperty(value = "合同编码")
private String contractCode;
/**
* 合同名称
*/
@ExcelProperty(value = "合同名称")
private String contractName;
/**
* 统计周期
*/
@ExcelProperty(value = "统计周期")
private String contractProgress;
/**
* 项目ID
*/
@ExcelProperty(value = "项目ID")
private Long projectId;
/**
* 项目名称
*/
@ExcelProperty(value = "项目名称")
@Translation(type = TransConstant.PROJECT_ID_TO_NAME, mapper = "projectId")
private String projectName;
/**
* 审批金额
*/
@ExcelProperty(value = "审批金额")
private BigDecimal approvalAmount;
/**
* 计量开始日期
*/
@ExcelProperty(value = "计量开始日期")
private LocalDate measureDateBegin;
/**
* 计量结束日期
*/
@ExcelProperty(value = "计量结束日期")
private LocalDate measureDateEnd;
/**
* 结算单位(客户)
*/
@ExcelProperty(value = "结算单位(客户)")
private Long settlementUnit;
/**
* 结算单位名称
*/
@Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "settlementUnit")
private String settlementUnitName;
/**
* 本期结算金额
*/
@ExcelProperty(value = "本期结算金额")
private BigDecimal settlementMoney;
/**
* 本期扣款金额
*/
@ExcelProperty(value = "本期扣款金额")
private BigDecimal deductionMoney;
/**
* 本期奖励金额
*/
@ExcelProperty(value = "本期奖励金额")
private BigDecimal bonus;
/**
* 合同金额
*/
@ExcelProperty(value = "合同金额")
private BigDecimal contractAmount;
/**
* 本次结算比例
*/
@ExcelProperty(value = "本次结算比例")
private BigDecimal thisSettlementRatio;
/**
* 支付条款
*/
@ExcelProperty(value = "支付条款")
private Long paymentTerms;
/**
* 多文件逗号分隔
*/
@ExcelProperty(value = "多文件逗号分隔")
private String fileId;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 合同内清单
*/
private List<CtrContractProgressSettlementItemVo> inInventory;
/**
* 变更增加清单
*/
private List<CtrContractProgressSettlementItemVo> changeInventory;
/**
* 合同外清单
*/
private List<CtrContractProgressSettlementItemVo> outInventory;
}

View File

@ -0,0 +1,160 @@
package org.dromara.ctr.domain.vo;
import java.math.BigDecimal;
import org.dromara.ctr.domain.CtrSubcontractProgressSettlementItem;
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.util.Date;
/**
* 分包合同进度结算清单视图对象 ctr_subcontract_progress_settlement_item
*
* @author lilemy
* @date 2025-10-18
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = CtrSubcontractProgressSettlementItem.class)
public class CtrSubcontractProgressSettlementItemVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 结算单ID
*/
@ExcelProperty(value = "结算单ID")
private Long settlementId;
/**
* 类型(1合同内清单 2变更增加清单 3合同外清单)
*/
@ExcelProperty(value = "类型(1合同内清单 2变更增加清单 3合同外清单)")
private String type;
/**
* 编码
*/
@ExcelProperty(value = "编码")
private String code;
/**
* 合同清单名称
*/
@ExcelProperty(value = "合同清单名称")
private String name;
/**
* 计量单位
*/
@ExcelProperty(value = "计量单位")
private String unit;
/**
* 单价
*/
@ExcelProperty(value = "单价")
private BigDecimal unitPrice;
/**
* 含税单价
*/
@ExcelProperty(value = "含税单价")
private BigDecimal taxUnitPrice;
/**
* 本期结算数量
*/
@ExcelProperty(value = "本期结算数量")
private BigDecimal currentQty;
/**
* 本期结算百分比
*/
@ExcelProperty(value = "本期结算百分比")
private BigDecimal currentRate;
/**
* 本期结算金额
*/
@ExcelProperty(value = "本期结算金额")
private BigDecimal currentAmount;
/**
* 本期结算不含税金额
*/
@ExcelProperty(value = "本期结算不含税金额")
private BigDecimal currentNoAmount;
/**
* 本期审批数量
*/
@ExcelProperty(value = "本期审批数量")
private BigDecimal currentApprovedQty;
/**
* 本期审批金额
*/
@ExcelProperty(value = "本期审批金额")
private BigDecimal currentApprovedAmount;
/**
* 税率(%
*/
@ExcelProperty(value = "税率", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "xzd_tax_rate")
private String taxRate;
/**
* 税额
*/
@ExcelProperty(value = "税额")
private String tax;
/**
* WBS工作分解结构
*/
@ExcelProperty(value = "WBS工作分解结构")
private String wbs;
/**
* CBS成本分解结构
*/
@ExcelProperty(value = "CBS成本分解结构")
private String cbs;
/**
* CBS预算总额
*/
@ExcelProperty(value = "CBS预算总额")
private BigDecimal cbsBudgetTotal;
/**
* CBS余额
*/
@ExcelProperty(value = "CBS余额")
private BigDecimal cbsBalance;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@ -0,0 +1,173 @@
package org.dromara.ctr.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.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import org.dromara.ctr.domain.CtrSubcontractProgressSettlement;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
* 分包合同进度结算视图对象 ctr_subcontract_progress_settlement
*
* @author lilemy
* @date 2025-10-18
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = CtrSubcontractProgressSettlement.class)
public class CtrSubcontractProgressSettlementVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 单据编码
*/
@ExcelProperty(value = "单据编码")
private String documentCode;
/**
* 标题
*/
@ExcelProperty(value = "标题")
private String title;
/**
* 所属部门
*/
@ExcelProperty(value = "所属部门")
private Long deptId;
/**
* 部门名称
*/
@Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "deptId")
private String deptName;
/**
* 单据日期
*/
@ExcelProperty(value = "单据日期")
private LocalDate documentDate;
/**
* 合同编码
*/
@ExcelProperty(value = "合同编码")
private String contractCode;
/**
* 合同名称
*/
@ExcelProperty(value = "合同名称")
private String contractName;
/**
* 统计周期
*/
@ExcelProperty(value = "统计周期")
private String contractProgress;
/**
* 计量开始日期
*/
@ExcelProperty(value = "计量开始日期")
private LocalDate measureDateBegin;
/**
* 计量结束日期
*/
@ExcelProperty(value = "计量结束日期")
private LocalDate measureDateEnd;
/**
* 项目ID
*/
@ExcelProperty(value = "项目ID")
private Long projectId;
/**
* 项目名称
*/
@ExcelProperty(value = "项目名称")
private String projectName;
/**
* 审批金额
*/
@ExcelProperty(value = "审批金额")
private BigDecimal approvalAmount;
/**
* 结算单位
*/
@ExcelProperty(value = "结算单位")
private Long settlementUnit;
/**
* 结算单位名称
*/
@Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "settlementUnit")
private String settlementUnitName;
/**
* 合同金额
*/
@ExcelProperty(value = "合同金额")
private BigDecimal contractAmount;
/**
* 本次结算比例
*/
@ExcelProperty(value = "本次结算比例")
private BigDecimal currentSettlementRate;
/**
* 文件ID
*/
@ExcelProperty(value = "文件ID")
private String fileId;
/**
* 审核状态
*/
@ExcelProperty(value = "审核状态")
private String auditStatus;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 合同内清单
*/
private List<CtrSubcontractProgressSettlementItemVo> inInventory;
/**
* 变更增加清单
*/
private List<CtrSubcontractProgressSettlementItemVo> changeInventory;
/**
* 合同外清单
*/
private List<CtrSubcontractProgressSettlementItemVo> outInventory;
}

View File

@ -0,0 +1,15 @@
package org.dromara.ctr.mapper;
import org.dromara.ctr.domain.CtrContractProgressSettlementItem;
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementItemVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 承包合同进度结算清单Mapper接口
*
* @author lilemy
* @date 2025-10-18
*/
public interface CtrContractProgressSettlementItemMapper extends BaseMapperPlus<CtrContractProgressSettlementItem, CtrContractProgressSettlementItemVo> {
}

View File

@ -0,0 +1,15 @@
package org.dromara.ctr.mapper;
import org.dromara.ctr.domain.CtrContractProgressSettlement;
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 承包合同进度结算Mapper接口
*
* @author lilemy
* @date 2025-10-18
*/
public interface CtrContractProgressSettlementMapper extends BaseMapperPlus<CtrContractProgressSettlement, CtrContractProgressSettlementVo> {
}

View File

@ -0,0 +1,15 @@
package org.dromara.ctr.mapper;
import org.dromara.ctr.domain.CtrSubcontractProgressSettlementItem;
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementItemVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 分包合同进度结算清单Mapper接口
*
* @author lilemy
* @date 2025-10-18
*/
public interface CtrSubcontractProgressSettlementItemMapper extends BaseMapperPlus<CtrSubcontractProgressSettlementItem, CtrSubcontractProgressSettlementItemVo> {
}

View File

@ -0,0 +1,15 @@
package org.dromara.ctr.mapper;
import org.dromara.ctr.domain.CtrSubcontractProgressSettlement;
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 分包合同进度结算Mapper接口
*
* @author lilemy
* @date 2025-10-18
*/
public interface CtrSubcontractProgressSettlementMapper extends BaseMapperPlus<CtrSubcontractProgressSettlement, CtrSubcontractProgressSettlementVo> {
}

View File

@ -0,0 +1,70 @@
package org.dromara.ctr.service;
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementItemVo;
import org.dromara.ctr.domain.bo.CtrContractProgressSettlementItemBo;
import org.dromara.ctr.domain.CtrContractProgressSettlementItem;
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 lilemy
* @date 2025-10-18
*/
public interface ICtrContractProgressSettlementItemService extends IService<CtrContractProgressSettlementItem>{
/**
* 查询承包合同进度结算清单
*
* @param id 主键
* @return 承包合同进度结算清单
*/
CtrContractProgressSettlementItemVo queryById(Long id);
/**
* 分页查询承包合同进度结算清单列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 承包合同进度结算清单分页列表
*/
TableDataInfo<CtrContractProgressSettlementItemVo> queryPageList(CtrContractProgressSettlementItemBo bo, PageQuery pageQuery);
/**
* 查询符合条件的承包合同进度结算清单列表
*
* @param bo 查询条件
* @return 承包合同进度结算清单列表
*/
List<CtrContractProgressSettlementItemVo> queryList(CtrContractProgressSettlementItemBo bo);
/**
* 新增承包合同进度结算清单
*
* @param bo 承包合同进度结算清单
* @return 是否新增成功
*/
Boolean insertByBo(CtrContractProgressSettlementItemBo bo);
/**
* 修改承包合同进度结算清单
*
* @param bo 承包合同进度结算清单
* @return 是否修改成功
*/
Boolean updateByBo(CtrContractProgressSettlementItemBo bo);
/**
* 校验并批量删除承包合同进度结算清单信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,81 @@
package org.dromara.ctr.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.ctr.domain.CtrContractProgressSettlement;
import org.dromara.ctr.domain.bo.CtrContractProgressSettlementBo;
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementCreateReq;
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementUpdateReq;
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementTotalVo;
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementVo;
import java.util.Collection;
import java.util.List;
/**
* 承包合同进度结算Service接口
*
* @author lilemy
* @date 2025-10-18
*/
public interface ICtrContractProgressSettlementService extends IService<CtrContractProgressSettlement> {
/**
* 查询承包合同进度结算
*
* @param id 主键
* @return 承包合同进度结算
*/
CtrContractProgressSettlementVo queryById(Long id);
/**
* 分页查询承包合同进度结算列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 承包合同进度结算分页列表
*/
TableDataInfo<CtrContractProgressSettlementVo> queryPageList(CtrContractProgressSettlementBo bo, PageQuery pageQuery);
/**
* 查询符合条件的承包合同进度结算列表
*
* @param bo 查询条件
* @return 承包合同进度结算列表
*/
List<CtrContractProgressSettlementVo> queryList(CtrContractProgressSettlementBo bo);
/**
* 查询金额统计
*
* @param bo 查询条件
* @return 金额统计
*/
CtrContractProgressSettlementTotalVo queryMoneyTotal(CtrContractProgressSettlementBo bo);
/**
* 新增承包合同进度结算
*
* @param req 承包合同进度结算
* @return 是否新增成功
*/
Boolean insertByBo(CtrContractProgressSettlementCreateReq req);
/**
* 修改承包合同进度结算
*
* @param req 承包合同进度结算
* @return 是否修改成功
*/
Boolean updateByBo(CtrContractProgressSettlementUpdateReq req);
/**
* 校验并批量删除承包合同进度结算信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,70 @@
package org.dromara.ctr.service;
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementItemVo;
import org.dromara.ctr.domain.bo.CtrSubcontractProgressSettlementItemBo;
import org.dromara.ctr.domain.CtrSubcontractProgressSettlementItem;
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 lilemy
* @date 2025-10-18
*/
public interface ICtrSubcontractProgressSettlementItemService extends IService<CtrSubcontractProgressSettlementItem>{
/**
* 查询分包合同进度结算清单
*
* @param id 主键
* @return 分包合同进度结算清单
*/
CtrSubcontractProgressSettlementItemVo queryById(Long id);
/**
* 分页查询分包合同进度结算清单列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 分包合同进度结算清单分页列表
*/
TableDataInfo<CtrSubcontractProgressSettlementItemVo> queryPageList(CtrSubcontractProgressSettlementItemBo bo, PageQuery pageQuery);
/**
* 查询符合条件的分包合同进度结算清单列表
*
* @param bo 查询条件
* @return 分包合同进度结算清单列表
*/
List<CtrSubcontractProgressSettlementItemVo> queryList(CtrSubcontractProgressSettlementItemBo bo);
/**
* 新增分包合同进度结算清单
*
* @param bo 分包合同进度结算清单
* @return 是否新增成功
*/
Boolean insertByBo(CtrSubcontractProgressSettlementItemBo bo);
/**
* 修改分包合同进度结算清单
*
* @param bo 分包合同进度结算清单
* @return 是否修改成功
*/
Boolean updateByBo(CtrSubcontractProgressSettlementItemBo bo);
/**
* 校验并批量删除分包合同进度结算清单信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,72 @@
package org.dromara.ctr.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.ctr.domain.CtrSubcontractProgressSettlement;
import org.dromara.ctr.domain.bo.CtrSubcontractProgressSettlementBo;
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementCreateReq;
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementUpdateReq;
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementVo;
import java.util.Collection;
import java.util.List;
/**
* 分包合同进度结算Service接口
*
* @author lilemy
* @date 2025-10-18
*/
public interface ICtrSubcontractProgressSettlementService extends IService<CtrSubcontractProgressSettlement> {
/**
* 查询分包合同进度结算
*
* @param id 主键
* @return 分包合同进度结算
*/
CtrSubcontractProgressSettlementVo queryById(Long id);
/**
* 分页查询分包合同进度结算列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 分包合同进度结算分页列表
*/
TableDataInfo<CtrSubcontractProgressSettlementVo> queryPageList(CtrSubcontractProgressSettlementBo bo, PageQuery pageQuery);
/**
* 查询符合条件的分包合同进度结算列表
*
* @param bo 查询条件
* @return 分包合同进度结算列表
*/
List<CtrSubcontractProgressSettlementVo> queryList(CtrSubcontractProgressSettlementBo bo);
/**
* 新增分包合同进度结算
*
* @param req 分包合同进度结算
* @return 是否新增成功
*/
Boolean insertByBo(CtrSubcontractProgressSettlementCreateReq req);
/**
* 修改分包合同进度结算
*
* @param req 分包合同进度结算
* @return 是否修改成功
*/
Boolean updateByBo(CtrSubcontractProgressSettlementUpdateReq req);
/**
* 校验并批量删除分包合同进度结算信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,142 @@
package org.dromara.ctr.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.springframework.stereotype.Service;
import org.dromara.ctr.domain.bo.CtrContractProgressSettlementItemBo;
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementItemVo;
import org.dromara.ctr.domain.CtrContractProgressSettlementItem;
import org.dromara.ctr.mapper.CtrContractProgressSettlementItemMapper;
import org.dromara.ctr.service.ICtrContractProgressSettlementItemService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 承包合同进度结算清单Service业务层处理
*
* @author lilemy
* @date 2025-10-18
*/
@RequiredArgsConstructor
@Service
public class CtrContractProgressSettlementItemServiceImpl extends ServiceImpl<CtrContractProgressSettlementItemMapper, CtrContractProgressSettlementItem> implements ICtrContractProgressSettlementItemService {
/**
* 查询承包合同进度结算清单
*
* @param id 主键
* @return 承包合同进度结算清单
*/
@Override
public CtrContractProgressSettlementItemVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询承包合同进度结算清单列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 承包合同进度结算清单分页列表
*/
@Override
public TableDataInfo<CtrContractProgressSettlementItemVo> queryPageList(CtrContractProgressSettlementItemBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<CtrContractProgressSettlementItem> lqw = buildQueryWrapper(bo);
Page<CtrContractProgressSettlementItemVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的承包合同进度结算清单列表
*
* @param bo 查询条件
* @return 承包合同进度结算清单列表
*/
@Override
public List<CtrContractProgressSettlementItemVo> queryList(CtrContractProgressSettlementItemBo bo) {
LambdaQueryWrapper<CtrContractProgressSettlementItem> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<CtrContractProgressSettlementItem> buildQueryWrapper(CtrContractProgressSettlementItemBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<CtrContractProgressSettlementItem> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(CtrContractProgressSettlementItem::getId);
lqw.eq(bo.getSettlementId() != null, CtrContractProgressSettlementItem::getSettlementId, bo.getSettlementId());
lqw.eq(StringUtils.isNotBlank(bo.getType()), CtrContractProgressSettlementItem::getType, bo.getType());
lqw.eq(StringUtils.isNotBlank(bo.getCode()), CtrContractProgressSettlementItem::getCode, bo.getCode());
lqw.like(StringUtils.isNotBlank(bo.getName()), CtrContractProgressSettlementItem::getName, bo.getName());
lqw.eq(StringUtils.isNotBlank(bo.getUnit()), CtrContractProgressSettlementItem::getUnit, bo.getUnit());
lqw.eq(bo.getUnitPrice() != null, CtrContractProgressSettlementItem::getUnitPrice, bo.getUnitPrice());
lqw.eq(bo.getTaxUnitPrice() != null, CtrContractProgressSettlementItem::getTaxUnitPrice, bo.getTaxUnitPrice());
lqw.eq(bo.getCurrentQty() != null, CtrContractProgressSettlementItem::getCurrentQty, bo.getCurrentQty());
lqw.eq(bo.getCurrentRate() != null, CtrContractProgressSettlementItem::getCurrentRate, bo.getCurrentRate());
lqw.eq(bo.getCurrentAmount() != null, CtrContractProgressSettlementItem::getCurrentAmount, bo.getCurrentAmount());
lqw.eq(bo.getCurrentNoAmount() != null, CtrContractProgressSettlementItem::getCurrentNoAmount, bo.getCurrentNoAmount());
lqw.eq(bo.getCurrentApprovedQty() != null, CtrContractProgressSettlementItem::getCurrentApprovedQty, bo.getCurrentApprovedQty());
lqw.eq(bo.getCurrentApprovedAmount() != null, CtrContractProgressSettlementItem::getCurrentApprovedAmount, bo.getCurrentApprovedAmount());
lqw.eq(StringUtils.isNotBlank(bo.getTaxRate()), CtrContractProgressSettlementItem::getTaxRate, bo.getTaxRate());
return lqw;
}
/**
* 新增承包合同进度结算清单
*
* @param bo 承包合同进度结算清单
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(CtrContractProgressSettlementItemBo bo) {
CtrContractProgressSettlementItem add = MapstructUtils.convert(bo, CtrContractProgressSettlementItem.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改承包合同进度结算清单
*
* @param bo 承包合同进度结算清单
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(CtrContractProgressSettlementItemBo bo) {
CtrContractProgressSettlementItem update = MapstructUtils.convert(bo, CtrContractProgressSettlementItem.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(CtrContractProgressSettlementItem entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除承包合同进度结算清单信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,353 @@
package org.dromara.ctr.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
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 lombok.RequiredArgsConstructor;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.ObjectUtils;
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.common.satoken.utils.LoginHelper;
import org.dromara.ctr.domain.CtrContractProgressSettlement;
import org.dromara.ctr.domain.CtrContractProgressSettlementItem;
import org.dromara.ctr.domain.bo.CtrContractProgressSettlementBo;
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementCreateReq;
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementItemCreateReq;
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementItemUpdateReq;
import org.dromara.ctr.domain.dto.CtrContractProgressSettlementUpdateReq;
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementItemVo;
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementTotalVo;
import org.dromara.ctr.domain.vo.CtrContractProgressSettlementVo;
import org.dromara.ctr.mapper.CtrContractProgressSettlementMapper;
import org.dromara.ctr.service.ICtrContractProgressSettlementItemService;
import org.dromara.ctr.service.ICtrContractProgressSettlementService;
import org.dromara.system.domain.vo.SysDeptVo;
import org.dromara.system.service.ISysDeptService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
* 承包合同进度结算Service业务层处理
*
* @author lilemy
* @date 2025-10-18
*/
@RequiredArgsConstructor
@Service
public class CtrContractProgressSettlementServiceImpl extends ServiceImpl<CtrContractProgressSettlementMapper, CtrContractProgressSettlement>
implements ICtrContractProgressSettlementService {
private final ICtrContractProgressSettlementItemService contractProgressSettlementItemService;
private final ISysDeptService deptService;
/**
* 查询承包合同进度结算
*
* @param id 主键
* @return 承包合同进度结算
*/
@Override
public CtrContractProgressSettlementVo queryById(Long id) {
CtrContractProgressSettlementVo vo = baseMapper.selectVoById(id);
List<CtrContractProgressSettlementItem> list = contractProgressSettlementItemService.lambdaQuery()
.eq(CtrContractProgressSettlementItem::getSettlementId, id)
.list();
if (CollUtil.isNotEmpty(list)) {
List<CtrContractProgressSettlementItemVo> listVo = list.stream().map(item ->
MapstructUtils.convert(item, CtrContractProgressSettlementItemVo.class))
.toList();
Map<String, List<CtrContractProgressSettlementItemVo>> map = listVo.stream()
.collect(Collectors.groupingBy(CtrContractProgressSettlementItemVo::getType));
vo.setInInventory(map.getOrDefault("1", new ArrayList<>()));
vo.setChangeInventory(map.getOrDefault("2", new ArrayList<>()));
vo.setOutInventory(map.getOrDefault("3", new ArrayList<>()));
}
return vo;
}
/**
* 分页查询承包合同进度结算列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 承包合同进度结算分页列表
*/
@Override
public TableDataInfo<CtrContractProgressSettlementVo> queryPageList(CtrContractProgressSettlementBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<CtrContractProgressSettlement> lqw = buildQueryWrapper(bo);
Page<CtrContractProgressSettlementVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的承包合同进度结算列表
*
* @param bo 查询条件
* @return 承包合同进度结算列表
*/
@Override
public List<CtrContractProgressSettlementVo> queryList(CtrContractProgressSettlementBo bo) {
LambdaQueryWrapper<CtrContractProgressSettlement> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
/**
* 查询金额统计
*
* @param bo 查询条件
* @return 金额统计
*/
@Override
public CtrContractProgressSettlementTotalVo queryMoneyTotal(CtrContractProgressSettlementBo bo) {
LambdaQueryWrapper<CtrContractProgressSettlement> lqw = Wrappers.lambdaQuery();
Long deptId = bo.getDeptId();
String type = bo.getType();
if (ObjectUtils.isNotEmpty(deptId) && StringUtils.isNotBlank(type) && !LoginHelper.isSuperAdmin()) {
SysDeptVo sysDeptVo = deptService.selectDeptById(deptId);
List<Long> list = StringUtils.splitTo(sysDeptVo.getAncestors(), Convert::toLong);
if (list.size() == 2 && Objects.equals(type, "1")) {
lqw.eq(CtrContractProgressSettlement::getDeptId, deptId);
} else if (list.size() == 2 && Objects.equals(type, "2")) {
lqw.eq(CtrContractProgressSettlement::getSettlementUnit, deptId);
} else if (list.size() > 2 && Objects.equals(type, "1")) {
lqw.eq(CtrContractProgressSettlement::getDeptId, list.get(2));
} else if (list.size() > 2 && Objects.equals(type, "2")) {
lqw.eq(CtrContractProgressSettlement::getSettlementUnit, list.get(2));
}
}
List<CtrContractProgressSettlement> settlementList = this.list(lqw);
CtrContractProgressSettlementTotalVo vo = new CtrContractProgressSettlementTotalVo();
if (CollUtil.isEmpty(settlementList)) {
return vo;
}
if (Objects.equals(type, "1")) {
vo.setMoneyTotal(settlementList.stream().map(CtrContractProgressSettlement::getSettlementMoney)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add));
} else if (Objects.equals(type, "2")) {
vo.setMoneyTotal(settlementList.stream().map(CtrContractProgressSettlement::getDeductionMoney)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add));
}
return vo;
}
private LambdaQueryWrapper<CtrContractProgressSettlement> buildQueryWrapper(CtrContractProgressSettlementBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<CtrContractProgressSettlement> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(CtrContractProgressSettlement::getId);
Long deptId = bo.getDeptId();
String type = bo.getType();
if (ObjectUtils.isNotEmpty(deptId) && StringUtils.isNotBlank(type) && !LoginHelper.isSuperAdmin()) {
SysDeptVo sysDeptVo = deptService.selectDeptById(deptId);
List<Long> list = StringUtils.splitTo(sysDeptVo.getAncestors(), Convert::toLong);
if (list.size() == 2 && Objects.equals(type, "1")) {
lqw.eq(CtrContractProgressSettlement::getDeptId, deptId);
} else if (list.size() == 2 && Objects.equals(type, "2")) {
lqw.eq(CtrContractProgressSettlement::getSettlementUnit, deptId);
} else if (list.size() > 2 && Objects.equals(type, "1")) {
lqw.eq(CtrContractProgressSettlement::getDeptId, list.get(2));
} else if (list.size() > 2 && Objects.equals(type, "2")) {
lqw.eq(CtrContractProgressSettlement::getSettlementUnit, list.get(2));
}
}
lqw.like(StringUtils.isNotBlank(bo.getDocumentCode()), CtrContractProgressSettlement::getDocumentCode, bo.getDocumentCode());
lqw.eq(StringUtils.isNotBlank(bo.getTitle()), CtrContractProgressSettlement::getTitle, bo.getTitle());
lqw.eq(bo.getSettlementDate() != null, CtrContractProgressSettlement::getSettlementDate, bo.getSettlementDate());
lqw.eq(StringUtils.isNotBlank(bo.getContractCode()), CtrContractProgressSettlement::getContractCode, bo.getContractCode());
lqw.like(StringUtils.isNotBlank(bo.getContractName()), CtrContractProgressSettlement::getContractName, bo.getContractName());
lqw.eq(StringUtils.isNotBlank(bo.getContractProgress()), CtrContractProgressSettlement::getContractProgress, bo.getContractProgress());
lqw.eq(bo.getProjectId() != null, CtrContractProgressSettlement::getProjectId, bo.getProjectId());
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), CtrContractProgressSettlement::getProjectName, bo.getProjectName());
lqw.eq(bo.getApprovalAmount() != null, CtrContractProgressSettlement::getApprovalAmount, bo.getApprovalAmount());
lqw.eq(bo.getMeasureDateBegin() != null, CtrContractProgressSettlement::getMeasureDateBegin, bo.getMeasureDateBegin());
lqw.eq(bo.getMeasureDateEnd() != null, CtrContractProgressSettlement::getMeasureDateEnd, bo.getMeasureDateEnd());
lqw.eq(bo.getSettlementUnit() != null, CtrContractProgressSettlement::getSettlementUnit, bo.getSettlementUnit());
lqw.eq(bo.getSettlementMoney() != null, CtrContractProgressSettlement::getSettlementMoney, bo.getSettlementMoney());
lqw.eq(bo.getDeductionMoney() != null, CtrContractProgressSettlement::getDeductionMoney, bo.getDeductionMoney());
lqw.eq(bo.getBonus() != null, CtrContractProgressSettlement::getBonus, bo.getBonus());
lqw.eq(bo.getContractAmount() != null, CtrContractProgressSettlement::getContractAmount, bo.getContractAmount());
lqw.eq(bo.getThisSettlementRatio() != null, CtrContractProgressSettlement::getThisSettlementRatio, bo.getThisSettlementRatio());
lqw.eq(bo.getPaymentTerms() != null, CtrContractProgressSettlement::getPaymentTerms, bo.getPaymentTerms());
lqw.eq(StringUtils.isNotBlank(bo.getFileId()), CtrContractProgressSettlement::getFileId, bo.getFileId());
return lqw;
}
/**
* 新增承包合同进度结算
*
* @param req 承包合同进度结算
* @return 是否新增成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(CtrContractProgressSettlementCreateReq req) {
CtrContractProgressSettlement add = MapstructUtils.convert(req, CtrContractProgressSettlement.class);
if (Objects.equals(req.getDeptId(), req.getSettlementUnit())) {
throw new ServiceException("结算单位不能与收款单位相同");
}
// 生成唯一编号
LocalDate today = LocalDate.now();
Long userId = LoginHelper.getUserId();
boolean flag;
synchronized (userId.toString().intern()) {
LocalDateTime startOfDay = today.atStartOfDay();
LocalDateTime endOfDay = today.plusDays(1).atStartOfDay().minusNanos(1);
// 获取当天的最大编号
Long count = this.lambdaQuery()
.between(CtrContractProgressSettlement::getCreateTime, startOfDay, endOfDay)
.count();
String result = String.format("%03d", count + 1); // 3表示长度0表示补0
add.setDocumentCode(today.format(DateTimeFormatter.BASIC_ISO_DATE) + "-" + result);
validEntityBeforeSave(add);
flag = baseMapper.insert(add) > 0;
}
if (flag) {
Long id = add.getId();
List<CtrContractProgressSettlementItemCreateReq> inInventory = req.getInInventory();
List<CtrContractProgressSettlementItemCreateReq> changeInventory = req.getChangeInventory();
List<CtrContractProgressSettlementItemCreateReq> outInventory = req.getOutInventory();
List<CtrContractProgressSettlementItem> itemList = new ArrayList<>();
itemList.addAll(inInventory.stream().map(r -> {
CtrContractProgressSettlementItem item = new CtrContractProgressSettlementItem();
item.setSettlementId(id);
item.setType("1");
BeanUtils.copyProperties(r, item);
return item;
}).toList());
itemList.addAll(changeInventory.stream().map(r -> {
CtrContractProgressSettlementItem item = new CtrContractProgressSettlementItem();
item.setSettlementId(id);
item.setType("2");
BeanUtils.copyProperties(r, item);
return item;
}).toList());
itemList.addAll(outInventory.stream().map(r -> {
CtrContractProgressSettlementItem item = new CtrContractProgressSettlementItem();
item.setSettlementId(id);
item.setType("3");
BeanUtils.copyProperties(r, item);
return item;
}).toList());
if (CollUtil.isNotEmpty(itemList)) {
boolean saveBatch = contractProgressSettlementItemService.saveBatch(itemList);
if (!saveBatch) {
throw new ServiceException("保存承包合同进度结算明细失败");
}
}
}
return flag;
}
/**
* 修改承包合同进度结算
*
* @param req 承包合同进度结算
* @return 是否修改成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateByBo(CtrContractProgressSettlementUpdateReq req) {
CtrContractProgressSettlement update = MapstructUtils.convert(req, CtrContractProgressSettlement.class);
validEntityBeforeSave(update);
if (Objects.equals(req.getDeptId(), req.getSettlementUnit())) {
throw new ServiceException("结算单位不能与收款单位相同");
}
Long id = req.getId();
// 删除旧数据
List<CtrContractProgressSettlementItem> oldList = contractProgressSettlementItemService.lambdaQuery()
.eq(CtrContractProgressSettlementItem::getSettlementId, id)
.list();
if (CollUtil.isNotEmpty(oldList)) {
boolean deleteBatch = contractProgressSettlementItemService.removeByIds(oldList);
if (!deleteBatch) {
throw new ServiceException("删除承包合同进度结算明细失败");
}
}
// 新增子数据
List<CtrContractProgressSettlementItemUpdateReq> inInventory = req.getInInventory();
List<CtrContractProgressSettlementItemUpdateReq> changeInventory = req.getChangeInventory();
List<CtrContractProgressSettlementItemUpdateReq> outInventory = req.getOutInventory();
List<CtrContractProgressSettlementItem> itemList = new ArrayList<>();
itemList.addAll(inInventory.stream().map(r -> {
CtrContractProgressSettlementItem item = new CtrContractProgressSettlementItem();
item.setSettlementId(id);
item.setType("1");
BeanUtils.copyProperties(r, item);
return item;
}).toList());
itemList.addAll(changeInventory.stream().map(r -> {
CtrContractProgressSettlementItem item = new CtrContractProgressSettlementItem();
item.setSettlementId(id);
item.setType("2");
BeanUtils.copyProperties(r, item);
return item;
}).toList());
itemList.addAll(outInventory.stream().map(r -> {
CtrContractProgressSettlementItem item = new CtrContractProgressSettlementItem();
item.setSettlementId(id);
item.setType("3");
BeanUtils.copyProperties(r, item);
return item;
}).toList());
if (CollUtil.isNotEmpty(itemList)) {
boolean saveBatch = contractProgressSettlementItemService.saveBatch(itemList);
if (!saveBatch) {
throw new ServiceException("保存承包合同进度结算明细失败");
}
}
// 保存主数据
boolean b = baseMapper.updateById(update) > 0;
if (!b) {
throw new ServiceException("修改承包合同进度结算失败");
}
return true;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(CtrContractProgressSettlement entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除承包合同进度结算信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
// 删除关联数据
List<CtrContractProgressSettlementItem> list = contractProgressSettlementItemService.lambdaQuery()
.in(CtrContractProgressSettlementItem::getSettlementId, ids)
.list();
if (CollUtil.isNotEmpty(list)) {
boolean deleteBatch = contractProgressSettlementItemService.removeByIds(list);
if (!deleteBatch) {
throw new ServiceException("删除承包合同进度结算明细失败");
}
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,150 @@
package org.dromara.ctr.service.impl;
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 lombok.RequiredArgsConstructor;
import org.dromara.common.core.utils.MapstructUtils;
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.ctr.domain.CtrSubcontractProgressSettlementItem;
import org.dromara.ctr.domain.bo.CtrSubcontractProgressSettlementItemBo;
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementItemVo;
import org.dromara.ctr.mapper.CtrSubcontractProgressSettlementItemMapper;
import org.dromara.ctr.service.ICtrSubcontractProgressSettlementItemService;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 分包合同进度结算清单Service业务层处理
*
* @author lilemy
* @date 2025-10-18
*/
@RequiredArgsConstructor
@Service
public class CtrSubcontractProgressSettlementItemServiceImpl extends ServiceImpl<CtrSubcontractProgressSettlementItemMapper, CtrSubcontractProgressSettlementItem>
implements ICtrSubcontractProgressSettlementItemService {
private final CtrSubcontractProgressSettlementItemMapper baseMapper;
/**
* 查询分包合同进度结算清单
*
* @param id 主键
* @return 分包合同进度结算清单
*/
@Override
public CtrSubcontractProgressSettlementItemVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
/**
* 分页查询分包合同进度结算清单列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 分包合同进度结算清单分页列表
*/
@Override
public TableDataInfo<CtrSubcontractProgressSettlementItemVo> queryPageList(CtrSubcontractProgressSettlementItemBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<CtrSubcontractProgressSettlementItem> lqw = buildQueryWrapper(bo);
Page<CtrSubcontractProgressSettlementItemVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的分包合同进度结算清单列表
*
* @param bo 查询条件
* @return 分包合同进度结算清单列表
*/
@Override
public List<CtrSubcontractProgressSettlementItemVo> queryList(CtrSubcontractProgressSettlementItemBo bo) {
LambdaQueryWrapper<CtrSubcontractProgressSettlementItem> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<CtrSubcontractProgressSettlementItem> buildQueryWrapper(CtrSubcontractProgressSettlementItemBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<CtrSubcontractProgressSettlementItem> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(CtrSubcontractProgressSettlementItem::getId);
lqw.eq(bo.getSettlementId() != null, CtrSubcontractProgressSettlementItem::getSettlementId, bo.getSettlementId());
lqw.eq(StringUtils.isNotBlank(bo.getType()), CtrSubcontractProgressSettlementItem::getType, bo.getType());
lqw.eq(StringUtils.isNotBlank(bo.getCode()), CtrSubcontractProgressSettlementItem::getCode, bo.getCode());
lqw.like(StringUtils.isNotBlank(bo.getName()), CtrSubcontractProgressSettlementItem::getName, bo.getName());
lqw.eq(StringUtils.isNotBlank(bo.getUnit()), CtrSubcontractProgressSettlementItem::getUnit, bo.getUnit());
lqw.eq(bo.getUnitPrice() != null, CtrSubcontractProgressSettlementItem::getUnitPrice, bo.getUnitPrice());
lqw.eq(bo.getTaxUnitPrice() != null, CtrSubcontractProgressSettlementItem::getTaxUnitPrice, bo.getTaxUnitPrice());
lqw.eq(bo.getCurrentQty() != null, CtrSubcontractProgressSettlementItem::getCurrentQty, bo.getCurrentQty());
lqw.eq(bo.getCurrentRate() != null, CtrSubcontractProgressSettlementItem::getCurrentRate, bo.getCurrentRate());
lqw.eq(bo.getCurrentAmount() != null, CtrSubcontractProgressSettlementItem::getCurrentAmount, bo.getCurrentAmount());
lqw.eq(bo.getCurrentNoAmount() != null, CtrSubcontractProgressSettlementItem::getCurrentNoAmount, bo.getCurrentNoAmount());
lqw.eq(bo.getCurrentApprovedQty() != null, CtrSubcontractProgressSettlementItem::getCurrentApprovedQty, bo.getCurrentApprovedQty());
lqw.eq(bo.getCurrentApprovedAmount() != null, CtrSubcontractProgressSettlementItem::getCurrentApprovedAmount, bo.getCurrentApprovedAmount());
lqw.eq(StringUtils.isNotBlank(bo.getTaxRate()), CtrSubcontractProgressSettlementItem::getTaxRate, bo.getTaxRate());
lqw.eq(StringUtils.isNotBlank(bo.getTax()), CtrSubcontractProgressSettlementItem::getTax, bo.getTax());
lqw.eq(StringUtils.isNotBlank(bo.getWbs()), CtrSubcontractProgressSettlementItem::getWbs, bo.getWbs());
lqw.eq(StringUtils.isNotBlank(bo.getCbs()), CtrSubcontractProgressSettlementItem::getCbs, bo.getCbs());
lqw.eq(bo.getCbsBudgetTotal() != null, CtrSubcontractProgressSettlementItem::getCbsBudgetTotal, bo.getCbsBudgetTotal());
lqw.eq(bo.getCbsBalance() != null, CtrSubcontractProgressSettlementItem::getCbsBalance, bo.getCbsBalance());
return lqw;
}
/**
* 新增分包合同进度结算清单
*
* @param bo 分包合同进度结算清单
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(CtrSubcontractProgressSettlementItemBo bo) {
CtrSubcontractProgressSettlementItem add = MapstructUtils.convert(bo, CtrSubcontractProgressSettlementItem.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改分包合同进度结算清单
*
* @param bo 分包合同进度结算清单
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(CtrSubcontractProgressSettlementItemBo bo) {
CtrSubcontractProgressSettlementItem update = MapstructUtils.convert(bo, CtrSubcontractProgressSettlementItem.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(CtrSubcontractProgressSettlementItem entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除分包合同进度结算清单信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,280 @@
package org.dromara.ctr.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 lombok.RequiredArgsConstructor;
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.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.ctr.domain.CtrSubcontractProgressSettlement;
import org.dromara.ctr.domain.CtrSubcontractProgressSettlementItem;
import org.dromara.ctr.domain.bo.CtrSubcontractProgressSettlementBo;
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementCreateReq;
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementItemCreateReq;
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementItemUpdateReq;
import org.dromara.ctr.domain.dto.CtrSubcontractProgressSettlementUpdateReq;
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementItemVo;
import org.dromara.ctr.domain.vo.CtrSubcontractProgressSettlementVo;
import org.dromara.ctr.mapper.CtrSubcontractProgressSettlementMapper;
import org.dromara.ctr.service.ICtrSubcontractProgressSettlementItemService;
import org.dromara.ctr.service.ICtrSubcontractProgressSettlementService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 分包合同进度结算Service业务层处理
*
* @author lilemy
* @date 2025-10-18
*/
@RequiredArgsConstructor
@Service
public class CtrSubcontractProgressSettlementServiceImpl extends ServiceImpl<CtrSubcontractProgressSettlementMapper, CtrSubcontractProgressSettlement>
implements ICtrSubcontractProgressSettlementService {
private final ICtrSubcontractProgressSettlementItemService subcontractProgressSettlementItemService;
/**
* 查询分包合同进度结算
*
* @param id 主键
* @return 分包合同进度结算
*/
@Override
public CtrSubcontractProgressSettlementVo queryById(Long id) {
CtrSubcontractProgressSettlementVo vo = baseMapper.selectVoById(id);
List<CtrSubcontractProgressSettlementItem> list = subcontractProgressSettlementItemService.lambdaQuery()
.eq(CtrSubcontractProgressSettlementItem::getSettlementId, id)
.list();
if (CollUtil.isNotEmpty(list)) {
List<CtrSubcontractProgressSettlementItemVo> listVo = list.stream().map(item ->
MapstructUtils.convert(item, CtrSubcontractProgressSettlementItemVo.class))
.toList();
Map<String, List<CtrSubcontractProgressSettlementItemVo>> map = listVo.stream()
.collect(Collectors.groupingBy(CtrSubcontractProgressSettlementItemVo::getType));
vo.setInInventory(map.getOrDefault("1", new ArrayList<>()));
vo.setChangeInventory(map.getOrDefault("2", new ArrayList<>()));
vo.setOutInventory(map.getOrDefault("3", new ArrayList<>()));
}
return vo;
}
/**
* 分页查询分包合同进度结算列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 分包合同进度结算分页列表
*/
@Override
public TableDataInfo<CtrSubcontractProgressSettlementVo> queryPageList(CtrSubcontractProgressSettlementBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<CtrSubcontractProgressSettlement> lqw = buildQueryWrapper(bo);
Page<CtrSubcontractProgressSettlementVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的分包合同进度结算列表
*
* @param bo 查询条件
* @return 分包合同进度结算列表
*/
@Override
public List<CtrSubcontractProgressSettlementVo> queryList(CtrSubcontractProgressSettlementBo bo) {
LambdaQueryWrapper<CtrSubcontractProgressSettlement> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<CtrSubcontractProgressSettlement> buildQueryWrapper(CtrSubcontractProgressSettlementBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<CtrSubcontractProgressSettlement> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(CtrSubcontractProgressSettlement::getId);
lqw.like(StringUtils.isNotBlank(bo.getDocumentCode()), CtrSubcontractProgressSettlement::getDocumentCode, bo.getDocumentCode());
lqw.eq(StringUtils.isNotBlank(bo.getTitle()), CtrSubcontractProgressSettlement::getTitle, bo.getTitle());
lqw.eq(bo.getDocumentDate() != null, CtrSubcontractProgressSettlement::getDocumentDate, bo.getDocumentDate());
lqw.eq(StringUtils.isNotBlank(bo.getContractCode()), CtrSubcontractProgressSettlement::getContractCode, bo.getContractCode());
lqw.like(StringUtils.isNotBlank(bo.getContractName()), CtrSubcontractProgressSettlement::getContractName, bo.getContractName());
lqw.eq(StringUtils.isNotBlank(bo.getContractProgress()), CtrSubcontractProgressSettlement::getContractProgress, bo.getContractProgress());
lqw.eq(bo.getMeasureDateBegin() != null, CtrSubcontractProgressSettlement::getMeasureDateBegin, bo.getMeasureDateBegin());
lqw.eq(bo.getMeasureDateEnd() != null, CtrSubcontractProgressSettlement::getMeasureDateEnd, bo.getMeasureDateEnd());
lqw.eq(bo.getProjectId() != null, CtrSubcontractProgressSettlement::getProjectId, bo.getProjectId());
lqw.like(StringUtils.isNotBlank(bo.getProjectName()), CtrSubcontractProgressSettlement::getProjectName, bo.getProjectName());
lqw.eq(bo.getApprovalAmount() != null, CtrSubcontractProgressSettlement::getApprovalAmount, bo.getApprovalAmount());
lqw.eq(bo.getSettlementUnit() != null, CtrSubcontractProgressSettlement::getSettlementUnit, bo.getSettlementUnit());
lqw.eq(bo.getContractAmount() != null, CtrSubcontractProgressSettlement::getContractAmount, bo.getContractAmount());
lqw.eq(bo.getCurrentSettlementRate() != null, CtrSubcontractProgressSettlement::getCurrentSettlementRate, bo.getCurrentSettlementRate());
lqw.eq(StringUtils.isNotBlank(bo.getFileId()), CtrSubcontractProgressSettlement::getFileId, bo.getFileId());
lqw.eq(StringUtils.isNotBlank(bo.getAuditStatus()), CtrSubcontractProgressSettlement::getAuditStatus, bo.getAuditStatus());
return lqw;
}
/**
* 新增分包合同进度结算
*
* @param req 分包合同进度结算
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(CtrSubcontractProgressSettlementCreateReq req) {
CtrSubcontractProgressSettlement add = MapstructUtils.convert(req, CtrSubcontractProgressSettlement.class);
// 生成唯一编号
LocalDate today = LocalDate.now();
Long userId = LoginHelper.getUserId();
boolean flag;
synchronized (userId.toString().intern()) {
LocalDateTime startOfDay = today.atStartOfDay();
LocalDateTime endOfDay = today.plusDays(1).atStartOfDay().minusNanos(1);
// 获取当天的最大编号
Long count = this.lambdaQuery()
.between(CtrSubcontractProgressSettlement::getCreateTime, startOfDay, endOfDay)
.count();
String result = String.format("%03d", count + 1); // 3表示长度0表示补0
add.setDocumentCode(today.format(DateTimeFormatter.BASIC_ISO_DATE) + "-" + result);
validEntityBeforeSave(add);
flag = baseMapper.insert(add) > 0;
}
if (flag) {
Long id = add.getId();
List<CtrSubcontractProgressSettlementItemCreateReq> inInventory = req.getInInventory();
List<CtrSubcontractProgressSettlementItemCreateReq> changeInventory = req.getChangeInventory();
List<CtrSubcontractProgressSettlementItemCreateReq> outInventory = req.getOutInventory();
List<CtrSubcontractProgressSettlementItem> itemList = new ArrayList<>();
itemList.addAll(inInventory.stream().map(r -> {
CtrSubcontractProgressSettlementItem item = new CtrSubcontractProgressSettlementItem();
item.setSettlementId(id);
item.setType("1");
BeanUtils.copyProperties(r, item);
return item;
}).toList());
itemList.addAll(changeInventory.stream().map(r -> {
CtrSubcontractProgressSettlementItem item = new CtrSubcontractProgressSettlementItem();
item.setSettlementId(id);
item.setType("2");
BeanUtils.copyProperties(r, item);
return item;
}).toList());
itemList.addAll(outInventory.stream().map(r -> {
CtrSubcontractProgressSettlementItem item = new CtrSubcontractProgressSettlementItem();
item.setSettlementId(id);
item.setType("3");
BeanUtils.copyProperties(r, item);
return item;
}).toList());
if (CollUtil.isNotEmpty(itemList)) {
boolean saveBatch = subcontractProgressSettlementItemService.saveBatch(itemList);
if (!saveBatch) {
throw new ServiceException("保存分包合同进度结算明细失败");
}
}
}
return flag;
}
/**
* 修改分包合同进度结算
*
* @param req 分包合同进度结算
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(CtrSubcontractProgressSettlementUpdateReq req) {
CtrSubcontractProgressSettlement update = MapstructUtils.convert(req, CtrSubcontractProgressSettlement.class);
validEntityBeforeSave(update);
Long id = req.getId();
// 删除旧数据
List<CtrSubcontractProgressSettlementItem> oldList = subcontractProgressSettlementItemService.lambdaQuery()
.eq(CtrSubcontractProgressSettlementItem::getSettlementId, id)
.list();
if (CollUtil.isNotEmpty(oldList)) {
boolean deleteBatch = subcontractProgressSettlementItemService.removeByIds(oldList);
if (!deleteBatch) {
throw new ServiceException("删除分包合同进度结算明细失败");
}
}
// 新增子数据
List<CtrSubcontractProgressSettlementItemUpdateReq> inInventory = req.getInInventory();
List<CtrSubcontractProgressSettlementItemUpdateReq> changeInventory = req.getChangeInventory();
List<CtrSubcontractProgressSettlementItemUpdateReq> outInventory = req.getOutInventory();
List<CtrSubcontractProgressSettlementItem> itemList = new ArrayList<>();
itemList.addAll(inInventory.stream().map(r -> {
CtrSubcontractProgressSettlementItem item = new CtrSubcontractProgressSettlementItem();
item.setSettlementId(id);
item.setType("1");
BeanUtils.copyProperties(r, item);
return item;
}).toList());
itemList.addAll(changeInventory.stream().map(r -> {
CtrSubcontractProgressSettlementItem item = new CtrSubcontractProgressSettlementItem();
item.setSettlementId(id);
item.setType("2");
BeanUtils.copyProperties(r, item);
return item;
}).toList());
itemList.addAll(outInventory.stream().map(r -> {
CtrSubcontractProgressSettlementItem item = new CtrSubcontractProgressSettlementItem();
item.setSettlementId(id);
item.setType("3");
BeanUtils.copyProperties(r, item);
return item;
}).toList());
if (CollUtil.isNotEmpty(itemList)) {
boolean saveBatch = subcontractProgressSettlementItemService.saveBatch(itemList);
if (!saveBatch) {
throw new ServiceException("保存承包合同进度结算明细失败");
}
}
// 保存主数据
boolean b = baseMapper.updateById(update) > 0;
if (!b) {
throw new ServiceException("修改分包合同进度结算失败");
}
return true;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(CtrSubcontractProgressSettlement entity) {
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除分包合同进度结算信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
// 删除关联数据
List<CtrSubcontractProgressSettlementItem> list = subcontractProgressSettlementItemService.lambdaQuery()
.in(CtrSubcontractProgressSettlementItem::getSettlementId, ids)
.list();
if (CollUtil.isNotEmpty(list)) {
boolean deleteBatch = subcontractProgressSettlementItemService.removeByIds(list);
if (!deleteBatch) {
throw new ServiceException("删除分包合同进度结算明细失败");
}
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,146 @@
package org.dromara.design.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.collection.CollUtil;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
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.web.core.BaseController;
import org.dromara.design.domain.DesConstructionSchedulePlan;
import org.dromara.design.domain.dto.constructionscheduleplan.*;
import org.dromara.design.domain.vo.DesConstructionSchedulePlanVo;
import org.dromara.design.service.IDesConstructionSchedulePlanService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
* 设计计划
*
* @author lilemy
* @date 2025-08-01
*/
@Validated
@RestController
@RequestMapping("/design/constructionSchedulePlan")
public class DesConstructionSchedulePlanController extends BaseController {
@Resource
private IDesConstructionSchedulePlanService desConstructionSchedulePlanService;
/**
* 查询设计计划列表
*/
@SaCheckPermission("design:constructionSchedulePlan:list")
@GetMapping("/list")
public R<List<DesConstructionSchedulePlanVo>> list(DesConstructionSchedulePlanQueryReq req) {
List<DesConstructionSchedulePlanVo> list = desConstructionSchedulePlanService.queryList(req);
return R.ok(list);
}
/**
* 导出设计计划列表
*/
@SaCheckPermission("design:constructionSchedulePlan:export")
@Log(title = "施工进度计划", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(DesConstructionSchedulePlanQueryReq req, HttpServletResponse response) {
List<DesConstructionSchedulePlanVo> list = desConstructionSchedulePlanService.queryList(req);
ExcelUtil.exportExcel(list, "施工进度计划", DesConstructionSchedulePlanVo.class, response);
}
/**
* 根据项目id导出设计计划模版
*/
@SaCheckPermission("design:constructionSchedulePlan:exportTemplate")
@Log(title = "施工进度计划", businessType = BusinessType.EXPORT)
@PostMapping("/exportTemplate/{projectId}")
public void exportExcelByProjectId(@NotNull(message = "项目id不能为空")
@PathVariable Long projectId, HttpServletResponse response) {
desConstructionSchedulePlanService.exportExcelByProjectId(projectId, response);
}
/**
* 读取设计计划模版
*/
@SaCheckPermission("design:constructionSchedulePlan:readTemplate")
@Log(title = "施工进度计划", businessType = BusinessType.IMPORT)
@PostMapping("/readTemplate")
public R<Void> readExcel(@RequestParam("file") MultipartFile file, Long projectId) {
List<DesConstructionSchedulePlanExcelDto> list = desConstructionSchedulePlanService.readExcel(file, projectId);
if (CollUtil.isNotEmpty(list)) {
List<DesConstructionSchedulePlan> planList = desConstructionSchedulePlanService.convertToEntities(list);
return toAjax(desConstructionSchedulePlanService.saveBatch(planList));
}
return toAjax(true);
}
/**
* 获取设计计划详细信息
*
* @param id 主键
*/
@SaCheckPermission("design:constructionSchedulePlan:query")
@GetMapping("/{id}")
public R<DesConstructionSchedulePlanVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(desConstructionSchedulePlanService.queryById(id));
}
/**
* 新增设计计划
*/
@SaCheckPermission("design:constructionSchedulePlan:add")
@Log(title = "施工进度计划", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<DesConstructionSchedulePlanVo> add(@Validated @RequestBody DesConstructionSchedulePlanCreateReq req) {
return R.ok(desConstructionSchedulePlanService.insertByBo(req));
}
/**
* 修改设计计划
*/
@SaCheckPermission("design:constructionSchedulePlan:edit")
@Log(title = "施工进度计划", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated @RequestBody DesConstructionSchedulePlanUpdateReq req) {
return toAjax(desConstructionSchedulePlanService.updateByBo(req));
}
/**
* 修改设计计划为完成状态
*
*/
@SaCheckPermission("design:constructionSchedulePlan:editFinish")
@Log(title = "施工进度计划", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping("/finish")
public R<Void> editFinish(@Validated @RequestBody DesConstructionSchedulePlanFinishReq req) {
return toAjax(desConstructionSchedulePlanService.updateFinish(req));
}
/**
* 删除设计计划
*
* @param ids 主键串
*/
@SaCheckPermission("design:constructionSchedulePlan:remove")
@Log(title = "施工进度计划", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(desConstructionSchedulePlanService.deleteByIds(List.of(ids)));
}
}

View File

@ -0,0 +1,87 @@
package org.dromara.design.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
import java.time.LocalDate;
/**
* 施工进度计划对象 pgs_construction_schedule_plan
*
* @author lilemy
* @date 2025-08-01
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("des_construction_schedule_plan")
public class DesConstructionSchedulePlan extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id")
private Long id;
/**
* 项目ID
*/
private Long projectId;
/**
* 父ID
*/
private Long parentId;
/**
* 节点名称
*/
private String nodeName;
/**
* 对应项目结构
*/
private Long projectStructure;
/**
* 对应项目结构名称
*/
private String projectStructureName;
/**
* 预计开始时间
*/
private LocalDate planStartDate;
/**
* 预计结束时间
*/
private LocalDate planEndDate;
/**
* 实际开始时间
*/
private LocalDate practicalStartDate;
/**
* 实际结束时间
*/
private LocalDate practicalEndDate;
/**
* 状态
*/
private String status;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,77 @@
package org.dromara.design.domain.dto.constructionscheduleplan;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
/**
* @author lilemy
* @date 2025-08-01 14:05
*/
@Data
public class DesConstructionSchedulePlanCreateReq implements Serializable {
@Serial
private static final long serialVersionUID = 4060838737379600701L;
/**
* 项目ID
*/
@NotNull(message = "项目ID不能为空")
private Long projectId;
/**
* 父ID
*/
private Long parentId;
/**
* 节点名称
*/
@NotBlank(message = "节点名称不能为空")
private String nodeName;
/**
* 对应项目结构
*/
private Long projectStructure;
/**
* 对应项目结构名称
*/
private String projectStructureName;
/**
* 预计开始时间
*/
private LocalDate planStartDate;
/**
* 预计结束时间
*/
private LocalDate planEndDate;
/**
* 实际开始时间
*/
private LocalDate practicalStartDate;
/**
* 实际结束时间
*/
private LocalDate practicalEndDate;
/**
* 状态
*/
private String status;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,71 @@
package org.dromara.design.domain.dto.constructionscheduleplan;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.time.LocalDate;
/**
* @author lilemy
* @date 2025-09-06 17:12
*/
@Data
@AllArgsConstructor
public class DesConstructionSchedulePlanExcelDto {
/**
* 编号1, 1.1, 1.1.1
*/
private String number;
/**
* 项目ID
*/
private Long projectId;
/**
* 节点名称
*/
private String nodeName;
/**
* 对应项目结构
*/
private Long projectStructure;
/**
* 对应项目结构名称
*/
private String projectStructureName;
/**
* 预计开始时间
*/
private LocalDate planStartDate;
/**
* 预计结束时间
*/
private LocalDate planEndDate;
/**
* 实际开始时间
*/
private LocalDate practicalStartDate;
/**
* 实际结束时间
*/
private LocalDate practicalEndDate;
/**
* 状态
*/
private String status;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,31 @@
package org.dromara.design.domain.dto.constructionscheduleplan;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
/**
* @author lilemy
* @date 2025-09-17 10:15
*/
@Data
public class DesConstructionSchedulePlanFinishReq implements Serializable {
@Serial
private static final long serialVersionUID = 8139653508791280689L;
/**
* 主键
*/
@NotNull(message = "主键不能为空")
private Long id;
/**
* 完成时间
*/
@NotNull(message = "完成时间不能为空")
private LocalDate finishDate;
}

View File

@ -0,0 +1,37 @@
package org.dromara.design.domain.dto.constructionscheduleplan;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025-08-01 14:05
*/
@Data
public class DesConstructionSchedulePlanQueryReq implements Serializable {
@Serial
private static final long serialVersionUID = 9021370369055688811L;
/**
* 项目ID
*/
private Long projectId;
/**
* 节点名称
*/
private String nodeName;
/**
* 对应项目结构名称
*/
private String projectStructureName;
/**
* 状态
*/
private String status;
}

View File

@ -0,0 +1,74 @@
package org.dromara.design.domain.dto.constructionscheduleplan;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
/**
* @author lilemy
* @date 2025-08-01 14:06
*/
@Data
public class DesConstructionSchedulePlanUpdateReq implements Serializable {
@Serial
private static final long serialVersionUID = 6955873817030428268L;
/**
* 主键ID
*/
private Long id;
/**
* 节点名称
*/
private String nodeName;
/**
* 父ID
*/
private Long parentId;
/**
* 对应项目结构
*/
private Long projectStructure;
/**
* 对应项目结构名称
*/
private String projectStructureName;
/**
* 预计开始时间
*/
private LocalDate planStartDate;
/**
* 预计结束时间
*/
private LocalDate planEndDate;
/**
* 实际开始时间
*/
private LocalDate practicalStartDate;
/**
* 实际结束时间
*/
private LocalDate practicalEndDate;
/**
* 状态
*/
private String status;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,104 @@
package org.dromara.design.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.progress.domain.PgsConstructionSchedulePlan;
import java.io.Serial;
import java.io.Serializable;
import java.time.LocalDate;
/**
* 施工进度计划视图对象 pgs_construction_schedule_plan
*
* @author lilemy
* @date 2025-08-01
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = PgsConstructionSchedulePlan.class)
public class DesConstructionSchedulePlanVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@ExcelProperty(value = "主键ID")
private Long id;
/**
* 项目ID
*/
@ExcelProperty(value = "项目ID")
private Long projectId;
/**
* 父ID
*/
@ExcelProperty(value = "父ID")
private Long parentId;
/**
* 节点名称
*/
@ExcelProperty(value = "节点名称")
private String nodeName;
/**
* 对应项目结构
*/
@ExcelProperty(value = "对应项目结构")
private Long projectStructure;
/**
* 对应项目结构名称
*/
@ExcelProperty(value = "对应项目结构名称")
private String projectStructureName;
/**
* 预计开始时间
*/
@ExcelProperty(value = "预计开始时间")
private LocalDate planStartDate;
/**
* 预计结束时间
*/
@ExcelProperty(value = "预计结束时间")
private LocalDate planEndDate;
/**
* 实际开始时间
*/
@ExcelProperty(value = "实际开始时间")
private LocalDate practicalStartDate;
/**
* 实际结束时间
*/
@ExcelProperty(value = "实际结束时间")
private LocalDate practicalEndDate;
/**
* 状态
*/
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "project_construction_status")
private String status;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@ -0,0 +1,17 @@
package org.dromara.design.mapper;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.design.domain.DesConstructionSchedulePlan;
import org.dromara.design.domain.vo.DesConstructionSchedulePlanVo;
import org.dromara.progress.domain.PgsConstructionSchedulePlan;
import org.dromara.progress.domain.vo.constructionscheduleplan.PgsConstructionSchedulePlanVo;
/**
* 施工进度计划Mapper接口
*
* @author lilemy
* @date 2025-08-01
*/
public interface DesConstructionSchedulePlanMapper extends BaseMapperPlus<DesConstructionSchedulePlan, DesConstructionSchedulePlanVo> {
}

View File

@ -0,0 +1,117 @@
package org.dromara.design.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.servlet.http.HttpServletResponse;
import org.dromara.design.domain.DesConstructionSchedulePlan;
import org.dromara.design.domain.dto.constructionscheduleplan.*;
import org.dromara.design.domain.vo.DesConstructionSchedulePlanVo;
import org.springframework.web.multipart.MultipartFile;
import java.util.Collection;
import java.util.List;
/**
* 施工进度计划Service接口
*
* @author lilemy
* @date 2025-08-01
*/
public interface IDesConstructionSchedulePlanService extends IService<DesConstructionSchedulePlan> {
/**
* 查询施工进度计划
*
* @param id 主键
* @return 施工进度计划
*/
DesConstructionSchedulePlanVo queryById(Long id);
/**
* 查询符合条件的施工进度计划列表
*
* @param req 查询条件
* @return 施工进度计划列表
*/
List<DesConstructionSchedulePlanVo> queryList(DesConstructionSchedulePlanQueryReq req);
/**
* 新增施工进度计划
*
* @param req 施工进度计划
* @return 新增施工进度计划封装
*/
DesConstructionSchedulePlanVo insertByBo(DesConstructionSchedulePlanCreateReq req);
/**
* 修改施工进度计划
*
* @param req 施工进度计划
* @return 是否修改成功
*/
Boolean updateByBo(DesConstructionSchedulePlanUpdateReq req);
/**
* 修改施工进度计划为完成状态
*
* @param req 施工进度计划
* @return 是否修改成功
*/
Boolean updateFinish(DesConstructionSchedulePlanFinishReq req);
/**
* 批量删除施工进度计划信息
*
* @param ids 待删除的主键集合
* @return 是否删除成功
*/
Boolean deleteByIds(Collection<Long> ids);
/**
* 获取施工进度计划视图对象
*
* @param constructionSchedulePlan 施工进度计划对象
* @return 施工进度计划视图对象
*/
DesConstructionSchedulePlanVo getVo(DesConstructionSchedulePlan constructionSchedulePlan);
/**
* 获取施工进度计划查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
LambdaQueryWrapper<DesConstructionSchedulePlan> buildQueryWrapper(DesConstructionSchedulePlanQueryReq req);
/**
* 获取施工进度计划分页对象视图
*
* @param constructionSchedulePlanList 施工进度计划分页对象
* @return 施工进度计划分页对象视图
*/
List<DesConstructionSchedulePlanVo> getVoList(List<DesConstructionSchedulePlan> constructionSchedulePlanList);
/**
* 导出Excel
*
* @param projectId 项目id
*/
void exportExcelByProjectId(Long projectId, HttpServletResponse response);
/**
* 读取Excel文件
*
* @param file Excel文件
* @param projectId 项目ID
* @return 读取的数据列表
*/
List<DesConstructionSchedulePlanExcelDto> readExcel(MultipartFile file, Long projectId);
/**
* 将Excel数据转换为实体列表
*
* @param excelList Excel数据列表
* @return 实体列表
*/
List<DesConstructionSchedulePlan> convertToEntities(List<DesConstructionSchedulePlanExcelDto> excelList);
}

View File

@ -0,0 +1,627 @@
package org.dromara.design.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.ObjectUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.design.domain.DesConstructionSchedulePlan;
import org.dromara.design.domain.bo.DesUserBo;
import org.dromara.design.domain.dto.constructionscheduleplan.*;
import org.dromara.design.domain.vo.DesConstructionSchedulePlanVo;
import org.dromara.design.mapper.DesConstructionSchedulePlanMapper;
import org.dromara.design.service.IDesConstructionSchedulePlanService;
import org.dromara.project.service.IBusProjectService;
import org.dromara.system.domain.vo.SysDictDataVo;
import org.dromara.system.service.ISysDictDataService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.*;
/**
* 施工进度计划Service业务层处理
*
* @author lilemy
* @date 2025-08-01
*/
@Slf4j
@Service
public class DesConstructionSchedulePlanServiceImpl extends ServiceImpl<DesConstructionSchedulePlanMapper, DesConstructionSchedulePlan>
implements IDesConstructionSchedulePlanService {
@Resource
private IBusProjectService projectService;
@Resource
private ISysDictDataService dictDataService;
/**
* 查询施工进度计划
*
* @param id 主键
* @return 施工进度计划
*/
@Override
public DesConstructionSchedulePlanVo queryById(Long id) {
DesConstructionSchedulePlan constructionSchedulePlan = this.getById(id);
if (constructionSchedulePlan == null) {
throw new ServiceException("施工进度计划信息不存在", HttpStatus.NOT_FOUND);
}
return this.getVo(constructionSchedulePlan);
}
/**
* 查询符合条件的施工进度计划列表
*
* @param req 查询条件
* @return 施工进度计划列表
*/
@Override
public List<DesConstructionSchedulePlanVo> queryList(DesConstructionSchedulePlanQueryReq req) {
List<DesConstructionSchedulePlan> result = this.list(this.buildQueryWrapper(req));
return this.getVoList(result);
}
/**
* 新增施工进度计划
*
* @param req 施工进度计划
* @return 新增施工进度计划封装
*/
@Override
public DesConstructionSchedulePlanVo insertByBo(DesConstructionSchedulePlanCreateReq req) {
DesConstructionSchedulePlan constructionSchedulePlan = new DesConstructionSchedulePlan();
BeanUtils.copyProperties(req, constructionSchedulePlan);
boolean save = this.save(constructionSchedulePlan);
if (!save) {
throw new ServiceException("新增施工进度计划信息异常", HttpStatus.ERROR);
}
DesConstructionSchedulePlan newConstructionSchedulePlan = this.getById(constructionSchedulePlan.getId());
return this.getVo(newConstructionSchedulePlan);
}
/**
* 修改施工进度计划
*
* @param req 施工进度计划
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(DesConstructionSchedulePlanUpdateReq req) {
DesConstructionSchedulePlan constructionSchedulePlan = new DesConstructionSchedulePlan();
BeanUtils.copyProperties(req, constructionSchedulePlan);
return this.updateById(constructionSchedulePlan);
}
/**
* 修改施工进度计划为完成状态
*
* @param req 施工进度计划
* @return 是否修改成功
*/
@Override
public Boolean updateFinish(DesConstructionSchedulePlanFinishReq req) {
DesConstructionSchedulePlan plan = this.getById(req.getId());
if (plan == null) {
throw new ServiceException("施工进度计划信息不存在", HttpStatus.NOT_FOUND);
}
if (plan.getStatus().equals("4")) {
throw new ServiceException("施工进度计划已完成", HttpStatus.NOT_FOUND);
}
LocalDate practicalStartDate = plan.getPracticalStartDate();
LocalDate finishDate = req.getFinishDate();
if (practicalStartDate == null) {
throw new ServiceException("请先填写实际开始时间", HttpStatus.NOT_FOUND);
}
if (finishDate.isBefore(practicalStartDate)) {
throw new ServiceException("实际结束时间不能早于实际开始时间", HttpStatus.NOT_FOUND);
}
plan.setStatus("4");
plan.setPracticalEndDate(finishDate);
return this.updateById(plan);
}
/**
* 批量删除施工进度计划信息
*
* @param ids 待删除的主键集合
* @return 是否删除成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteByIds(Collection<Long> ids) {
return this.removeBatchByIds(ids);
}
/**
* 获取施工进度计划视图对象
*
* @param constructionSchedulePlan 施工进度计划对象
* @return 施工进度计划视图对象
*/
@Override
public DesConstructionSchedulePlanVo getVo(DesConstructionSchedulePlan constructionSchedulePlan) {
DesConstructionSchedulePlanVo vo = new DesConstructionSchedulePlanVo();
if (constructionSchedulePlan == null) {
return vo;
}
BeanUtils.copyProperties(constructionSchedulePlan, vo);
return vo;
}
/**
* 获取施工进度计划查询条件封装
*
* @param req 查询条件
* @return 查询条件封装
*/
@Override
public LambdaQueryWrapper<DesConstructionSchedulePlan> buildQueryWrapper(DesConstructionSchedulePlanQueryReq req) {
LambdaQueryWrapper<DesConstructionSchedulePlan> lqw = new LambdaQueryWrapper<>();
if (req == null) {
return lqw;
}
Long projectId = req.getProjectId();
String nodeName = req.getNodeName();
String status = req.getStatus();
lqw.eq(ObjectUtils.isNotEmpty(projectId), DesConstructionSchedulePlan::getProjectId, projectId);
lqw.like(StringUtils.isNotBlank(nodeName), DesConstructionSchedulePlan::getNodeName, nodeName);
lqw.eq(StringUtils.isNotBlank(status), DesConstructionSchedulePlan::getStatus, status);
return lqw;
}
/**
* 获取施工进度计划分页对象视图
*
* @param constructionSchedulePlanList 施工进度计划分页对象
* @return 施工进度计划分页对象视图
*/
@Override
public List<DesConstructionSchedulePlanVo> getVoList(List<DesConstructionSchedulePlan> constructionSchedulePlanList) {
return constructionSchedulePlanList.stream().map(this::getVo).toList();
}
// region 导出 excel
/**
* 导出Excel
*
* @param projectId 项目id
*/
@Override
public void exportExcelByProjectId(Long projectId, HttpServletResponse response) {
DesUserBo desUserBo = new DesUserBo();
desUserBo.setProjectId(projectId);
Map<Long, String> projectStructureMap = projectService.getStructureAsList(projectId);
if (projectStructureMap.isEmpty()) {
throw new ServiceException("获取项目列表失败,项目为空!!!");
}
List<SysDictDataVo> dictDataVos = dictDataService.selectByDictType("project_construction_status");
if (dictDataVos == null || dictDataVos.isEmpty()) {
throw new ServiceException("项目施工状态为空!!");
}
Map<String, String> statusMap = new HashMap<>();
for (SysDictDataVo vo : dictDataVos) {
statusMap.put(vo.getDictValue(), vo.getDictLabel());
}
Workbook workbook = new XSSFWorkbook();
// 创建主 Sheet 和隐藏 Sheet
Sheet mainSheet = workbook.createSheet("设计里程碑计划模版");
Sheet dataSheet = workbook.createSheet("DropdownData");
workbook.setSheetHidden(workbook.getSheetIndex(dataSheet), true);
// 3. 创建单元格样式
CellStyle editableStyle = createEditableCellStyle(workbook); // 可编辑单元格样式
CellStyle protectedStyle = createProtectedCellStyle(workbook); // 受保护单元格样式ID列用
//填充隐藏数据Sheet
int rowIndex = 0;
// 填充项目关联结构A列和B列
for (Map.Entry<Long, String> entry : projectStructureMap.entrySet()) {
Row row = dataSheet.createRow(rowIndex++);
row.createCell(0).setCellValue(entry.getValue());
row.createCell(1).setCellValue(entry.getKey().toString());
}
// 重置行索引填充人员和人员IDC列和D列
rowIndex = 0;
for (Map.Entry<String, String> entry : statusMap.entrySet()) {
Row row = dataSheet.getRow(rowIndex);
if (row == null) {
row = dataSheet.createRow(rowIndex);
}
row.createCell(4).setCellValue(entry.getValue());
row.createCell(5).setCellValue(entry.getKey());
rowIndex++;
}
// 主 Sheet 设置表头
Row sheetRow = mainSheet.createRow(0);
String[] headers = {"编号格式11.11.1.1。用于进行父子结构关联)", "节点名称",
"预计开始时间输入格式2025-09-06", "预计结束时间", "实际开始时间", "实际结束时间", "状态", "状态编码", "备注"};
for (int i = 0; i < headers.length; i++) {
Cell cell = sheetRow.createCell(i);
cell.setCellValue(headers[i]);
if (i == 0) {
CellStyle css = workbook.createCellStyle();
DataFormat format = workbook.createDataFormat();
css.setDataFormat(format.getFormat("@"));
cell.setCellStyle(css);
}
}
// 6. 设置专业下拉列表(第二列)
// setMajorDropdown(mainSheet, projectStructureMap.size());
setStatusDropdown(mainSheet, statusMap.size());
// String formulaTemplate = "IFERROR(INDEX(DropdownData!$B$1:$B$" + projectStructureMap.size() + ", MATCH(C{rowNum}, DropdownData!$A$1:$A$" + projectStructureMap.size() + ", 0)),\"\")";
String formulaTemplate1 = "IFERROR(INDEX(DropdownData!$F$1:$F$" + statusMap.size() + ", MATCH(G{rowNum}, DropdownData!$E$1:$E$" + statusMap.size() + ", 0)),\"\")";
for (int i = 1; i <= 1000; i++) { // 从第2行到101行
Row row = mainSheet.createRow(i);
int currentRowNum = i + 1; // Excel行号从1开始
// String formula = formulaTemplate.replace("{rowNum}", String.valueOf(currentRowNum));
//
// Cell cell = row.createCell(2);
// cell.setCellStyle(editableStyle); //专业不锁定
//
// Cell idCell = row.createCell(3);
// idCell.setCellFormula(formula);
// idCell.setCellStyle(protectedStyle); // 应用隐藏公式样式
String formula1 = formulaTemplate1.replace("{rowNum}", String.valueOf(currentRowNum));
Cell cell1 = row.createCell(6);
cell1.setCellStyle(editableStyle); //专业不锁定
Cell idCell1 = row.createCell(7);
idCell1.setCellFormula(formula1);
idCell1.setCellStyle(protectedStyle); // 应用隐藏公式样式
}
for (int i = 1; i <= 100; i++) {
Row row = mainSheet.getRow(i);
if (row == null) {
row = mainSheet.createRow(i);
}
Cell cell = row.createCell(0);
CellStyle textStyle = workbook.createCellStyle();
textStyle.setLocked(false);
DataFormat format = workbook.createDataFormat();
textStyle.setDataFormat(format.getFormat("@")); // "@" 表示文本格式
cell.setCellStyle(textStyle);
Cell cell1 = row.createCell(1);
cell1.setCellStyle(editableStyle);
Cell cell4 = row.createCell(2);
cell4.setCellStyle(editableStyle);
Cell cell5 = row.createCell(3);
cell5.setCellStyle(editableStyle);
Cell cell6 = row.createCell(4);
cell6.setCellStyle(editableStyle);
Cell cell7 = row.createCell(5);
cell7.setCellStyle(editableStyle);
Cell cell10 = row.createCell(8);
cell10.setCellStyle(editableStyle);
}
// 保护工作表,仅允许编辑未锁定的单元格
mainSheet.protectSheet("123456"); // 空密码
// 核心锁定表头第1行和前1列包含ID列
mainSheet.createFreezePane(0, 1, 0, 1);
// 调整列宽(更新列索引)
mainSheet.setColumnWidth(0, 20 * 320); // 编号
mainSheet.setColumnWidth(1, 20 * 280); // 节点名称
mainSheet.setColumnWidth(2, 20 * 320); // 预计开始时间
mainSheet.setColumnWidth(3, 20 * 200); // 预计结束时间
mainSheet.setColumnWidth(4, 20 * 200); // 实际开始时间
mainSheet.setColumnWidth(5, 20 * 200); // 实际结束时间
mainSheet.setColumnWidth(6, 20 * 100); // 状态
mainSheet.setColumnWidth(7, 20 * 200); // 状态编码
mainSheet.setColumnWidth(8, 20 * 200); // 备注
// 2. 设置响应头
// 设置响应头指定Excel格式和下载文件名
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("设计里程碑计划模版.xlsx", StandardCharsets.UTF_8));
// 直接写入响应输出流
try {
workbook.write(response.getOutputStream());
workbook.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 创建可编辑单元格样式
*/
private CellStyle createEditableCellStyle(Workbook workbook) {
CellStyle style = workbook.createCellStyle();
style.setLocked(false); // 关键:允许编辑
return style;
}
/**
* 创建受保护单元格样式用于ID列
*/
private CellStyle createProtectedCellStyle(Workbook workbook) {
CellStyle style = workbook.createCellStyle();
DataFormat dataFormat = workbook.createDataFormat();
short formatIndex = dataFormat.getFormat("0"); // 匹配“自定义→0”格式
style.setDataFormat(formatIndex);
style.setHidden(true); // 隐藏公式
style.setLocked(true);
return style;
}
/**
* 设置专业下拉列表第二列索引1
*/
private void setMajorDropdown(Sheet mainSheet, int majorCount) {
DataValidationHelper helper = mainSheet.getDataValidationHelper();
// 专业数据范围数据Sheet的A列从第1行到专业数量行
String majorRange = "DropdownData!$A$1:$A$" + majorCount;
DataValidationConstraint constraint = helper.createFormulaListConstraint(majorRange);
// 作用范围第2行到100行第二列
CellRangeAddressList addressList = new CellRangeAddressList(1, 1000, 2, 2);
DataValidation validation = helper.createValidation(constraint, addressList);
validation.setShowErrorBox(true);
mainSheet.addValidationData(validation);
}
/**
* 设置专业下拉列表第二列索引1
*/
private void setStatusDropdown(Sheet mainSheet, int majorCount) {
DataValidationHelper helper = mainSheet.getDataValidationHelper();
// 专业数据范围数据Sheet的A列从第1行到专业数量行
String majorRange = "DropdownData!$E$1:$E$" + majorCount;
DataValidationConstraint constraint = helper.createFormulaListConstraint(majorRange);
// 作用范围第2行到100行第二列
CellRangeAddressList addressList = new CellRangeAddressList(1, 1000, 6, 6);
DataValidation validation = helper.createValidation(constraint, addressList);
validation.setShowErrorBox(true);
mainSheet.addValidationData(validation);
}
// endregion
/**
* 读取Excel文件
*
* @param file Excel文件
* @param projectId 项目ID
* @return 读取的数据列表
*/
@Override
public List<DesConstructionSchedulePlanExcelDto> readExcel(MultipartFile file, Long projectId) {
List<DesConstructionSchedulePlanExcelDto> dataList = new ArrayList<>();
try (InputStream inputStream = file.getInputStream();
XSSFWorkbook workbook = new XSSFWorkbook(inputStream)) {
XSSFSheet sheet = workbook.getSheetAt(0);
// 从第二行(index=1)开始读取数据,跳过表头
for (int rowIndex = 1; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
Row row = sheet.getRow(rowIndex);
if (hasValidData(row)) {
String number = getCellValue(row.getCell(0));
String nodeName = getCellValue(row.getCell(1));
String projectStructureName = null;
Long projectStructure = null;
LocalDate planStartDate = getLocalDateValue(row.getCell(2));
LocalDate planEndDate = getLocalDateValue(row.getCell(3));
LocalDate practicalStartDate = getLocalDateValue(row.getCell(4));
LocalDate practicalEndDate = getLocalDateValue(row.getCell(5));
String status = getCellValue(row.getCell(7));
String remark = getCellValue(row.getCell(8));
DesConstructionSchedulePlanExcelDto excelData = new DesConstructionSchedulePlanExcelDto(
number, projectId, nodeName, projectStructure, projectStructureName,
planStartDate, planEndDate, practicalStartDate, practicalEndDate, status, remark
);
dataList.add(excelData);
}
}
} catch (Exception e) {
log.error("读取表格数据失败", e);
throw new ServiceException("读取表格数据失败");
}
return dataList;
}
/**
* 将Excel数据转换为实体列表
*
* @param excelList Excel数据列表
* @return 实体列表
*/
@Override
public List<DesConstructionSchedulePlan> convertToEntities(List<DesConstructionSchedulePlanExcelDto> excelList) {
List<DesConstructionSchedulePlan> result = new ArrayList<>();
Map<String, Long> numberIdMap = new HashMap<>();
for (DesConstructionSchedulePlanExcelDto dto : excelList) {
DesConstructionSchedulePlan entity = new DesConstructionSchedulePlan();
LocalDate planStartDate = dto.getPlanStartDate();
LocalDate planEndDate = dto.getPlanEndDate();
if (planStartDate == null || planEndDate == null || planStartDate.isAfter(planEndDate)) {
throw new ServiceException("计划开始时间和计划结束时间不能为空,且计划开始时间不能大于计划结束时间", HttpStatus.BAD_REQUEST);
}
// 生成主键
Long id = IdWorker.getId();
entity.setId(id);
entity.setProjectId(dto.getProjectId());
entity.setNodeName(dto.getNodeName());
entity.setProjectStructure(dto.getProjectStructure());
entity.setProjectStructureName(dto.getProjectStructureName());
entity.setPlanStartDate(planStartDate);
entity.setPlanEndDate(planEndDate);
entity.setPracticalStartDate(dto.getPracticalStartDate());
entity.setPracticalEndDate(dto.getPracticalEndDate());
entity.setStatus(dto.getStatus());
entity.setRemark(dto.getRemark());
// 确定父ID
String number = dto.getNumber();
if (number != null && number.contains(".")) {
String parentNumber = number.substring(0, number.lastIndexOf("."));
Long parentId = numberIdMap.get(parentNumber);
if (parentId == null) {
throw new ServiceException("未找到父编号:" + parentNumber, HttpStatus.BAD_REQUEST);
}
entity.setParentId(parentId);
} else {
entity.setParentId(0L); // 顶级节点
}
// 保存当前编号对应的id
numberIdMap.put(number, id);
result.add(entity);
}
return result;
}
private static boolean hasValidData(Row row) {
// 遍历行中的所有单元格
for (int cellIndex = 0; cellIndex < row.getLastCellNum(); cellIndex++) {
Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
String cellValue = getCellValue(cell).trim();
// 只要有一个单元格有非空值,就认为是有效行
if (!cellValue.isEmpty()) {
return true;
}
}
return false;
}
private static String getCellValue(Cell cell) {
if (cell == null) {
return "";
}
// 使用CellType枚举判断单元格类型POI 4.0+版本推荐方式)
CellType cellType = cell.getCellType();
// 对于公式单元格,获取其计算结果的类型
if (cellType == CellType.FORMULA) {
cellType = cell.getCachedFormulaResultType();
}
switch (cellType) {
case STRING:
return cell.getStringCellValue().trim();
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
return date.toString();
} else {
// 处理数字类型,避免科学计数法
// 处理数字,移除不必要的.0后缀
String numericValue = String.valueOf(cell.getNumericCellValue());
if (numericValue.endsWith(".0")) {
return numericValue.substring(0, numericValue.length() - 2);
}
return numericValue;
}
case BOOLEAN:
return String.valueOf(cell.getBooleanCellValue());
default:
return "";
}
}
private static LocalDate getLocalDateValue(Cell cell) {
if (cell == null) {
return null;
}
CellType cellType = cell.getCellType();
if (cellType == CellType.FORMULA) {
cellType = cell.getCachedFormulaResultType();
}
try {
if (cellType == CellType.NUMERIC) {
if (DateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
} else {
// 如果是数字但不是日期,就尝试转为 LocalDate (例如 20250730)
double numericValue = cell.getNumericCellValue();
String text = String.valueOf((long) numericValue);
return LocalDate.parse(text);
}
} else if (cellType == CellType.STRING) {
String text = cell.getStringCellValue().trim();
if (text.isEmpty()) {
return null;
}
// 尝试解析不同格式
try {
return LocalDate.parse(text); // 默认 ISO 格式 yyyy-MM-dd
} catch (Exception e) {
// 如果 Excel 是 yyyy/MM/dd 或 yyyy.MM.dd可以额外处理
try {
return LocalDate.parse(text, java.time.format.DateTimeFormatter.ofPattern("yyyy/MM/dd"));
} catch (Exception ignored) {
}
try {
return LocalDate.parse(text, java.time.format.DateTimeFormatter.ofPattern("yyyy.MM.dd"));
} catch (Exception ignored) {
}
return null; // 不识别的格式就返回 null
}
}
} catch (Exception e) {
return null;
}
return null;
}
}

View File

@ -8,6 +8,7 @@ import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.gps.domain.vo.GpsStatusVo;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
@ -56,6 +57,16 @@ public class GpsEquipmentSonController extends BaseController {
return R.ok(gpsEquipmentSonService.queryList(bo));
}
/**
* 查询GPS设备定位日期信息列表
*/
@SaCheckPermission("gps:equipmentSon:getRlList")
@GetMapping("/getRlList")
public R<List<GpsStatusVo>> getRlList(GpsEquipmentSonBo bo) {
return R.ok(gpsEquipmentSonService.getRlList(bo));
}
/**
* 查询GPS设备定位信息列表(大屏获取人员最后一次位置)
*/

View File

@ -0,0 +1,12 @@
package org.dromara.gps.domain.vo;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDate;
@Data
public class GpsStatusVo implements Serializable {
private LocalDate riqi;
private Long count;
}

View File

@ -3,8 +3,10 @@ package org.dromara.gps.mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.dromara.gps.domain.GpsEquipmentSon;
import org.dromara.gps.domain.bo.GpsEquipmentSonBo;
import org.dromara.gps.domain.vo.GpsEquipmentSonVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.gps.domain.vo.GpsStatusVo;
import java.time.LocalDateTime;
import java.util.List;
@ -28,9 +30,10 @@ public interface GpsEquipmentSonMapper extends BaseMapperPlus<GpsEquipmentSon, G
"AND create_time BETWEEN #{startTime} AND #{endTime}\n" +
")\n" +
"SELECT\n" +
" *\n" +
" r.*,su.nick_name as userName\n" +
"FROM\n" +
" RankedData\n" +
" RankedData r\n" +
"LEFT JOIN sys_user su ON r.user_id=su.user_id\n" +
"WHERE\n" +
" rn = 1;")
List<GpsEquipmentSonVo> getClientList(@Param("projectId") Long projectId, @Param("startTime") LocalDateTime startOfDay, @Param("endTime") LocalDateTime now);
@ -77,4 +80,32 @@ public interface GpsEquipmentSonMapper extends BaseMapperPlus<GpsEquipmentSon, G
"WHERE\n" +
" rn = 1;")
List<GpsEquipmentSonVo> getUserListByProjectId(@Param("projectId") Long projectId, @Param("startTime") LocalDateTime startOfDay, @Param("endTime") LocalDateTime now);
@Select("WITH RECURSIVE date_range AS (\n" +
" -- 1. 初始化开始日期取startTime的“年月日”部分忽略时分秒\n" +
" SELECT DATE(#{bo.startTime}) AS stat_date\n" +
" UNION ALL\n" +
" -- 2. 递归生成后续日期直到不超过endTime的“年月日”\n" +
" SELECT DATE_ADD(stat_date, INTERVAL 1 DAY)\n" +
" FROM date_range\n" +
" WHERE stat_date < DATE(#{bo.endTime})\n" +
")\n" +
"\n" +
"SELECT \n" +
" dr.stat_date AS riqi, -- 统计日期格式YYYY-MM-DD\n" +
" COUNT(ges.id) AS count -- 当天符合条件的记录数\n" +
"FROM date_range dr\n" +
"LEFT JOIN (\n" +
" SELECT \n" +
" DATE(create_time) AS data_date, -- 提取创建时间的“年月日”\n" +
" id -- 仅需主键用于计数(减少数据传输)\n" +
" FROM gps_equipment_son\n" +
" WHERE \n" +
" project_id = #{bo.projectId} -- 匹配项目ID\n" +
" AND client_id =#{bo.clientId} -- 客户端ID为空\n" +
" AND create_time BETWEEN #{bo.startTime} AND #{bo.endTime} -- 时间范围\n" +
") ges ON dr.stat_date = ges.data_date -- 按日期关联\n" +
"GROUP BY dr.stat_date -- 按统计日期分组\n" +
"ORDER BY dr.stat_date; -- 按日期升序排列")
List<GpsStatusVo> getRlList(@Param("bo") GpsEquipmentSonBo bo);
}

View File

@ -7,6 +7,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.service.IService;
import org.dromara.gps.domain.vo.GpsStatusVo;
import java.time.LocalDateTime;
import java.util.Collection;
@ -78,4 +79,6 @@ public interface IGpsEquipmentSonService extends IService<GpsEquipmentSon>{
List<GpsEquipmentSonVo> getLargerScreenList(GpsEquipmentSonBo bo);
List<GpsEquipmentSonVo> getUserListByProjectId(Long projectId, LocalDateTime startOfDay, LocalDateTime now);
List<GpsStatusVo> getRlList(GpsEquipmentSonBo bo);
}

View File

@ -1,6 +1,7 @@
package org.dromara.gps.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;
@ -11,6 +12,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.contractor.domain.SubConstructionUser;
import org.dromara.contractor.service.ISubConstructionUserService;
import org.dromara.gps.domain.vo.GpsStatusVo;
import org.dromara.system.domain.vo.SysOssVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysDictDataService;
@ -100,6 +102,7 @@ public class GpsEquipmentSonServiceImpl extends ServiceImpl<GpsEquipmentSonMappe
lqw.eq(bo.getProjectId() != null, GpsEquipmentSon::getProjectId, bo.getProjectId());
lqw.eq(bo.getUserId() != null, GpsEquipmentSon::getUserId, bo.getUserId());
lqw.eq(StringUtils.isNotBlank(bo.getClientId()), GpsEquipmentSon::getClientId, bo.getClientId());
lqw.between(bo.getStartTime() != null && bo.getEndTime() != null, GpsEquipmentSon::getCreateTime, bo.getStartTime(), bo.getEndTime());
return lqw;
}
@ -194,4 +197,18 @@ public class GpsEquipmentSonServiceImpl extends ServiceImpl<GpsEquipmentSonMappe
public List<GpsEquipmentSonVo> getUserListByProjectId(Long projectId, LocalDateTime startOfDay, LocalDateTime now) {
return baseMapper.getUserListByProjectId(projectId,startOfDay,now);
}
@Override
public List<GpsStatusVo> getRlList(GpsEquipmentSonBo bo) {
if (bo.getProjectId() == null) {
throw new ServiceException("项目id不能为空");
}
if (bo.getClientId() == null) {
throw new ServiceException("设备id不能为空");
}
if (bo.getStartTime() == null || bo.getEndTime() == null) {
throw new ServiceException("开始时间和结算时间不能为空!!!");
}
return baseMapper.getRlList(bo);
}
}

View File

@ -370,6 +370,9 @@ public class MatMaterialsServiceImpl extends ServiceImpl<MatMaterialsMapper, Mat
@Override
public void create(Long projectId, List<MatMaterialReceiveItemDto> itemList, String formCode, String supplierUnit, String nickname) {
for (MatMaterialReceiveItemDto item : itemList) {
if(item.getAcceptedQuantity().compareTo(BigDecimal.ZERO) <= 0){
continue;
}
MatMaterials matMaterials = new MatMaterials();
matMaterials.setMaterialsName(item.getName());
matMaterials.setProjectId(projectId);

View File

@ -452,7 +452,9 @@ public class OutTableController extends BaseController {
BigDecimal monthCompletionValue = BigDecimal.ZERO;
for (BusProcurement busProcurement : busProcurements1) {
monthCompletionValue = monthCompletionValue.add(busProcurement.getAcceptedQuantity().multiply(busProcurement.getUnitPrice()).setScale(4, RoundingMode.HALF_UP));
if(busProcurement.getAcceptedQuantity()!=null){
monthCompletionValue = monthCompletionValue.add(busProcurement.getAcceptedQuantity().multiply(busProcurement.getUnitPrice()).setScale(4, RoundingMode.HALF_UP));
}
}
vo.setMonthCompletionValue(monthCompletionValue);

View File

@ -254,7 +254,7 @@ public class PgsConstructionSchedulePlanServiceImpl extends ServiceImpl<PgsConst
}
// 主 Sheet 设置表头
Row sheetRow = mainSheet.createRow(0);
String[] headers = {"编号格式11-11-1-1。用于进行父子结构关联", "节点名称", "对应项目结构", "对应项目结构编码",
String[] headers = {"编号格式11.11.1.1。用于进行父子结构关联", "节点名称", "对应项目结构", "对应项目结构编码",
"预计开始时间输入格式2025-09-06", "预计结束时间", "实际开始时间", "实际结束时间", "状态", "状态编码", "备注"};
for (int i = 0; i < headers.length; i++) {
Cell cell = sheetRow.createCell(i);
@ -302,7 +302,11 @@ public class PgsConstructionSchedulePlanServiceImpl extends ServiceImpl<PgsConst
row = mainSheet.createRow(i);
}
Cell cell = row.createCell(0);
cell.setCellStyle(editableStyle);
CellStyle textStyle = workbook.createCellStyle();
textStyle.setLocked(false);
DataFormat format = workbook.createDataFormat();
textStyle.setDataFormat(format.getFormat("@")); // "@" 表示文本格式
cell.setCellStyle(textStyle);
Cell cell1 = row.createCell(1);
cell1.setCellStyle(editableStyle);

View File

@ -3,10 +3,12 @@ package org.dromara.project.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.dromara.common.core.domain.R;
import org.dromara.common.web.core.BaseController;
import org.dromara.project.domain.BusAttendanceMachine;
import org.dromara.project.domain.dto.attendance.*;
import org.dromara.project.domain.vo.attendance.DeviceResult;
import org.dromara.project.service.IBusAttendanceMachineService;
import org.dromara.project.service.IBusAttendanceService;
import org.springframework.mock.web.MockMultipartFile;
@ -17,7 +19,7 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Base64;
/**
* 考勤
@ -34,15 +36,15 @@ public class BusAttendanceDeviceController extends BaseController {
private final IBusAttendanceService busAttendanceService;
private final IBusAttendanceMachineService busAttendanceMachineService;
private final IBusAttendanceMachineService busAttendanceMachineService;
@PostMapping("/api/v1/record/face")
@SaIgnore
public R<Boolean> punchCardByFace(@RequestBody DeviceDto dto) {
public DeviceResult punchCardByFace(@RequestBody DeviceDto dto) {
//打印接收数据
log.info("接收数据:{}", dto);
if (dto.getLogs().isEmpty()) {
return R.fail("没有数据");
return new DeviceResult(500, "没有数据");
}
Log first = dto.getLogs().getFirst();
@ -53,7 +55,7 @@ public class BusAttendanceDeviceController extends BaseController {
.last("limit 1")
.one();
if (one == null || one.getProjectId() == null) {
return R.fail("考勤机不存在或未关联项目");
return new DeviceResult(500, "考勤机不存在或未关联项目");
}
String recogTime = first.getRecog_time();
@ -67,6 +69,7 @@ public class BusAttendanceDeviceController extends BaseController {
req.setProjectId(one.getProjectId());
req.setUserId(userId);
req.setPunchTime(localDateTime);
req.setSource("1");
//打印req
log.info("请求参数:{}", req);
//base64转MultipartFile
@ -74,14 +77,14 @@ public class BusAttendanceDeviceController extends BaseController {
// 假设first.getImage()返回base64字符串且你有一个文件名
MultipartFile file = convert(first.getPhoto(), "face.jpg");
log.info("开始打卡");
return R.ok(busAttendanceService.punchCardByFace(file, req));
busAttendanceService.punchCardByFace(file, req);
return new DeviceResult(0, "打卡成功");
} catch (IOException e) {
return R.fail("文件转换失败");
return new DeviceResult(500, "文件转换失败");
}
}
public static MultipartFile convert(String base64String, String fileName) throws IOException {
// 先进行URL解码如果是URL编码过的数据
try {
@ -96,23 +99,11 @@ public class BusAttendanceDeviceController extends BaseController {
}
// 解码base64字符串
byte[] decodedBytes = Base64.getDecoder().decode(base64String);
byte[] decodedBytes = Base64.decodeBase64(base64String);
// 创建MultipartFile对象
return new MockMultipartFile(fileName, fileName, "image/jpeg", decodedBytes);
}
}

View File

@ -113,4 +113,9 @@ public class BusAttendance extends BaseEntity {
* 代打卡人员Id
*/
private Long replaceId;
/**
* 来源
*/
private String source;
}

View File

@ -47,4 +47,10 @@ public class BusAttendancePunchCardByFaceReq implements Serializable {
*/
private LocalDateTime punchTime;
/**
* 来源 0-app,1-考勤机
*/
private String source;
}

View File

@ -152,4 +152,9 @@ public class BusProjectUpdateReq implements Serializable {
*/
private String position;
/**
* 所属部门列表
*/
private List<Long> deptIds;
}

View File

@ -0,0 +1,16 @@
package org.dromara.project.domain.vo.attendance;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DeviceResult {
private Integer Result;
private String Msg;
}

View File

@ -8,7 +8,6 @@ import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import org.dromara.project.domain.BusProject;
import org.dromara.project.domain.bo.Punchrange;
import org.dromara.system.domain.vo.SysDeptVo;
import java.io.Serial;
import java.io.Serializable;
@ -214,8 +213,8 @@ public class BusProjectVo implements Serializable {
private String position;
/**
* 所属部门
* 所属部门列表
*/
private List<SysDeptVo> deptList;
private List<Long> deptIds;
}

View File

@ -12,6 +12,8 @@ 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.contractor.domain.SubConstructionUser;
import org.dromara.contractor.service.ISubConstructionUserService;
import org.dromara.mobileAttendanceMachine.DeviceMessageSender;
import org.dromara.project.domain.BusAttendanceMachine;
import org.dromara.project.domain.BusProject;
@ -58,6 +60,9 @@ public class BusAttendanceMachineServiceImpl extends ServiceImpl<BusAttendanceMa
@Resource
private DeviceMessageSender deviceMessageSender;
@Resource
private ISubConstructionUserService constructionUserService;
/**
* 查询考勤机
*
@ -220,6 +225,38 @@ public class BusAttendanceMachineServiceImpl extends ServiceImpl<BusAttendanceMa
}
}
}
// 新增的班组不为空时,添加考勤机中对应人
if (CollUtil.isNotEmpty(added)) {
// 获取待添加到考勤机的班组的所有用户id
List<Long> userIds = projectTeamMemberService.lambdaQuery()
.select(BusProjectTeamMember::getMemberId)
.in(BusProjectTeamMember::getTeamId, added)
.list()
.stream().map(BusProjectTeamMember::getMemberId)
.toList();
// 获取待添加到考勤机的用户信息
List<SubConstructionUser> users = constructionUserService.lambdaQuery()
.in(SubConstructionUser::getSysUserId, userIds)
.list();
for (SubConstructionUser user : users) {
// 添加考勤机中用户
}
}
} else {
// 添加考勤机中对应人
List<Long> userIds = projectTeamMemberService.lambdaQuery()
.select(BusProjectTeamMember::getMemberId)
.in(BusProjectTeamMember::getTeamId, teamIds)
.list()
.stream().map(BusProjectTeamMember::getMemberId)
.toList();
// 获取待添加到考勤机的用户信息
List<SubConstructionUser> users = constructionUserService.lambdaQuery()
.in(SubConstructionUser::getSysUserId, userIds)
.list();
for (SubConstructionUser user : users) {
// 添加考勤机中用户
}
}
projectTeams.forEach(team -> {
if (!team.getProjectId().equals(projectId)) {

View File

@ -391,63 +391,105 @@ public class BusAttendanceServiceImpl extends ServiceImpl<BusAttendanceMapper, B
List<BusAttendance> outAttendances = attendances.stream().filter(attendance ->
BusAttendanceCommuterEnum.CLOCKOUT.getValue().equals(attendance.getClockType())).toList();
if (clockTypeByTime == 1 && CollectionUtils.isEmpty(inAttendances)) {
BusAttendance attendance = new BusAttendance();
// 上班打卡
attendance.setClockType(BusAttendanceCommuterEnum.CLOCKIN.getValue());
//打卡时间
attendance.setRuleTime(busAttendanceRuleVo.getClockInTime());
// 判断是否为迟到
if (isLate(now, busAttendanceRuleVo)) {
attendance.setClockStatus(BusAttendanceClockStatusEnum.LATE.getValue());
attendance.setMinuteCount(getMinutesDifference(now, busAttendanceRuleVo.getClockInTime()));
} else {
attendance.setClockStatus(BusAttendanceClockStatusEnum.NORMAL.getValue());
}
//只要请假,直接归为请假
LocalDateTime localDateTime = localDate.atTime(busAttendanceRuleVo.getClockInTime());
if (leaveService.isLeave(localDateTime, userId)) {
attendance.setClockStatus(BusAttendanceClockStatusEnum.LEAVE.getValue());
}
// 填充信息
attendance.setUserId(userId);
attendance.setProjectId(req.getProjectId());
attendance.setClockDate(localDate);
attendance.setClockTime(now);
attendance.setUserName(constructionUser.getUserName());
attendance.setReplaceId(replaceId);
// 记录打卡坐标
attendance.setLat(req.getLat());
attendance.setLng(req.getLng());
try {
attendance.setClockLocation(JSTUtil.getLocationName(req.getLat(), req.getLng()));
} catch (Exception e) {
log.error("获取打卡位置失败", e);
}
// 上传人脸照
SysOssVo upload = ossService.upload(file);
attendance.setFacePic(upload.getOssId().toString());
Long finalUserId = userId;
CompletableFuture.runAsync(() -> {
try {
chatServerHandler.sendSystemMessageToUser(finalUserId, "打卡成功", "1");
} catch (Exception e) {
log.error("异步发送系统消息失败用户ID: {}, 消息: {}", finalUserId, "打卡成功", e);
if (clockTypeByTime == 1) {
if(CollectionUtils.isEmpty(inAttendances)){
BusAttendance attendance = new BusAttendance();
// 上班打卡
attendance.setClockType(BusAttendanceCommuterEnum.CLOCKIN.getValue());
//打卡时间
attendance.setRuleTime(busAttendanceRuleVo.getClockInTime());
// 判断是否为迟到
if (isLate(now, busAttendanceRuleVo)) {
attendance.setClockStatus(BusAttendanceClockStatusEnum.LATE.getValue());
attendance.setMinuteCount(getMinutesDifference(now, busAttendanceRuleVo.getClockInTime()));
} else {
attendance.setClockStatus(BusAttendanceClockStatusEnum.NORMAL.getValue());
}
});
//计算工资
attendance.setSalary(computeSalary(constructionUser, inAttendances));
return this.save(attendance);
//只要请假,直接归为请假
LocalDateTime localDateTime = localDate.atTime(busAttendanceRuleVo.getClockInTime());
if (leaveService.isLeave(localDateTime, userId)) {
attendance.setClockStatus(BusAttendanceClockStatusEnum.LEAVE.getValue());
}
// 填充信息
attendance.setUserId(userId);
attendance.setProjectId(req.getProjectId());
attendance.setClockDate(localDate);
attendance.setClockTime(now);
attendance.setUserName(constructionUser.getUserName());
attendance.setReplaceId(replaceId);
if(req.getSource() != null){
attendance.setSource(req.getSource());
}
// 记录打卡坐标
attendance.setLat(req.getLat());
attendance.setLng(req.getLng());
try {
attendance.setClockLocation(JSTUtil.getLocationName(req.getLat(), req.getLng()));
} catch (Exception e) {
log.error("获取打卡位置失败", e);
}
// 上传人脸照
SysOssVo upload = ossService.upload(file);
attendance.setFacePic(upload.getOssId().toString());
Long finalUserId = userId;
CompletableFuture.runAsync(() -> {
try {
chatServerHandler.sendSystemMessageToUser(finalUserId, "打卡成功", "1");
} catch (Exception e) {
log.error("异步发送系统消息失败用户ID: {}, 消息: {}", finalUserId, "打卡成功", e);
}
});
//计算工资
attendance.setSalary(computeSalary(constructionUser, inAttendances));
return this.save(attendance);
}
//考勤机打卡会有历史记录,需要更新状态
if(CollectionUtil.isNotEmpty(outAttendances) && "1".equals(req.getSource())){
BusAttendance busAttendance = outAttendances.getFirst();
String oldStatus = busAttendance.getClockStatus();
//更新打卡时间
busAttendance.setClockTime(now);
// 判断是否为迟到
if (isLate(now, busAttendanceRuleVo)) {
busAttendance.setClockStatus(BusAttendanceClockStatusEnum.LATE.getValue());
busAttendance.setMinuteCount(getMinutesDifference(now, busAttendanceRuleVo.getClockInTime()));
} else {
busAttendance.setClockStatus(BusAttendanceClockStatusEnum.NORMAL.getValue());
}
//只要请假,直接归为请假
LocalDateTime localDateTime = localDate.atTime(busAttendanceRuleVo.getClockInTime());
if (leaveService.isLeave(localDateTime, userId)) {
busAttendance.setClockStatus(BusAttendanceClockStatusEnum.LEAVE.getValue());
}
busAttendance.setSource(req.getSource());
//如果是缺卡需要上传人脸
if(oldStatus.equals(BusAttendanceClockStatusEnum.UNCLOCK.getValue())){
SysOssVo upload = ossService.upload(file);
busAttendance.setFacePic(upload.getOssId().toString());
}
updateById(busAttendance);
}
} else if (clockTypeByTime == 2 || CollectionUtils.isNotEmpty(inAttendances)) {
if (CollectionUtil.isNotEmpty(outAttendances)) {
BusAttendance busAttendance = outAttendances.getFirst();
if (busAttendance.getClockStatus().equals(BusAttendanceClockStatusEnum.UNCLOCK.getValue())) {
throw new ServiceException("下班缺卡记录已生成,不能更新");
if("1".equals(req.getSource())){
busAttendance.setSource(req.getSource());
if(busAttendance.getClockStatus().equals(BusAttendanceClockStatusEnum.UNCLOCK.getValue())){
SysOssVo upload = ossService.upload(file);
busAttendance.setFacePic(upload.getOssId().toString());
}
}else {
if (busAttendance.getClockStatus().equals(BusAttendanceClockStatusEnum.UNCLOCK.getValue())) {
throw new ServiceException("下班缺卡记录已生成,不能更新");
}
}
//更新打卡时间
busAttendance.setClockTime(now);
// 判断是否为早退
@ -488,6 +530,9 @@ public class BusAttendanceServiceImpl extends ServiceImpl<BusAttendanceMapper, B
attendance.setClockTime(now);
attendance.setUserName(constructionUser.getUserName());
attendance.setReplaceId(replaceId);
if(req.getSource() != null){
attendance.setSource(req.getSource());
}
// 记录打卡坐标
attendance.setLat(req.getLat());
attendance.setLng(req.getLng());
@ -1109,7 +1154,9 @@ public class BusAttendanceServiceImpl extends ServiceImpl<BusAttendanceMapper, B
// 过滤有效考勤记录并按日期分组
Map<LocalDate, List<BusAttendanceVo>> dateAttendanceMap = attendanceList.stream()
.filter(a -> validStatusList.contains(a.getClockStatus()))
.collect(Collectors.groupingBy(BusAttendanceVo::getClockDate));
.collect(Collectors.groupingBy(BusAttendanceVo::getClockDate,
LinkedHashMap::new,
Collectors.toList()));
List<AttendanceUserDataDetailVo> workList = new ArrayList<>();
for (Map.Entry<LocalDate, List<BusAttendanceVo>> entry : dateAttendanceMap.entrySet()) {
LocalDate key = entry.getKey();

View File

@ -562,6 +562,43 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
throw new ServiceException("打卡范围增加失败", HttpStatus.ERROR);
}
}
List<Long> deptIds = req.getDeptIds();
// 根据项目查询部门
List<Long> oldDeptIds = projectDeptService.lambdaQuery()
.eq(BusProjectDept::getProjectId, project.getId())
.list()
.stream().map(BusProjectDept::getDeptId)
.toList();
if (CollUtil.isEmpty(deptIds) && CollUtil.isEmpty(oldDeptIds)) {
return true;
} else if (CollUtil.isEmpty(deptIds) && CollUtil.isNotEmpty(oldDeptIds)) {
//删除所有旧部门
boolean remove = projectDeptService.remove(Wrappers.lambdaQuery(BusProjectDept.class)
.eq(BusProjectDept::getProjectId, project.getId()));
if (!remove) {
throw new ServiceException("删除项目部门失败", HttpStatus.ERROR);
}
} else if (CollUtil.isNotEmpty(deptIds)) {
if (CollUtil.isNotEmpty(oldDeptIds)) {
//删除所有旧部门
boolean remove = projectDeptService.remove(Wrappers.lambdaQuery(BusProjectDept.class)
.eq(BusProjectDept::getProjectId, project.getId()));
if (!remove) {
throw new ServiceException("删除项目部门失败", HttpStatus.ERROR);
}
}
//新增部门
List<BusProjectDept> busProjectDepts = deptIds.stream().map(deptId -> {
BusProjectDept projectDept = new BusProjectDept();
projectDept.setDeptId(deptId);
projectDept.setProjectId(project.getId());
return projectDept;
}).toList();
boolean save = projectDeptService.saveBatch(busProjectDepts);
if (!save) {
throw new ServiceException("部门增加失败", HttpStatus.ERROR);
}
}
return true;
}
return false;
@ -691,6 +728,11 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
}).toList();
projectVo.setChildren(subProjectVoList);
}
// 关联所属部门
List<BusProjectDept> deptList = projectDeptService.lambdaQuery()
.eq(BusProjectDept::getProjectId, project.getId())
.list();
projectVo.setDeptIds(deptList.stream().map(BusProjectDept::getDeptId).toList());
return projectVo;
}
@ -738,7 +780,7 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
final Long PID = 0L;
lqw.eq(BusProject::getPId, PID);
}
if (ObjectUtils.isNotEmpty(deptId)) {
if (ObjectUtils.isNotEmpty(deptId) && deptId != 100) {
SysDeptVo sysDeptVo = deptService.selectDeptById(deptId);
List<Long> list = StringUtils.splitTo(sysDeptVo.getAncestors(), Convert::toLong);
List<Long> projectDepts = new ArrayList<>();
@ -1174,43 +1216,195 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
if (projectVos == null || projectVos.isEmpty()) {
return Collections.emptyMap();
}
projectVos.add(create("北京市", "北京", 39.9042, 116.4074, 1));
projectVos.add(create("天津市", "天津", 39.3434, 117.36162, 2));
projectVos.add(create("河北省", "石家庄", 38.0428, 114.5149, 3));
projectVos.add(create("山西省", "太原", 37.8706, 112.5493, 1));
projectVos.add(create("内蒙古自治区", "呼和浩特", 40.8426, 111.7492, 2));
projectVos.add(create("辽宁省", "沈阳", 41.8057, 123.4315, 2));
projectVos.add(create("吉林省", "长春", 43.8171, 125.3235, 3));
projectVos.add(create("黑龙江省", "哈尔滨", 45.8038, 126.5349, 1));
projectVos.add(create("上海市", "上海", 31.2304, 121.4737, 3));
projectVos.add(create("江苏省", "南京", 32.0603, 118.7969, 1));
projectVos.add(create("浙江省", "杭州", 30.2741, 120.1551, 1));
projectVos.add(create("安徽省", "合肥", 31.8206, 117.2272, 2));
projectVos.add(create("福建省", "福州", 26.0745, 119.2965, 2));
projectVos.add(create("江西省", "南昌", 28.6820, 115.8579, 2));
projectVos.add(create("山东省", "济南", 36.6512, 117.1201, 1));
projectVos.add(create("河南省", "郑州", 34.7473, 113.6249, 1));
projectVos.add(create("湖北省", "武汉", 30.5928, 114.3055, 1));
projectVos.add(create("湖南省", "长沙", 28.2278, 112.9389, 2));
projectVos.add(create("广东省", "广州", 23.1291, 113.2644, 3));
projectVos.add(create("广西壮族自治区", "南宁", 22.8170, 108.3669, 1));
projectVos.add(create("海南省", "海口", 20.0440, 110.1999, 1));
projectVos.add(create("四川省", "成都", 30.6595, 104.0657, 2));
projectVos.add(create("贵州省", "贵阳", 26.6470, 106.6302, 1));
projectVos.add(create("云南省", "昆明", 25.0406, 102.7123, 3));
projectVos.add(create("西藏自治区", "拉萨", 29.6469, 91.1172, 1));
projectVos.add(create("陕西省", "西安", 34.3416, 108.9398, 3));
projectVos.add(create("甘肃省", "兰州", 36.0614, 103.8343, 1));
projectVos.add(create("青海省", "西宁", 36.6232, 101.7782, 2));
projectVos.add(create("宁夏回族自治区", "银川", 38.4872, 106.2309, 2));
projectVos.add(create("新疆维吾尔自治区", "乌鲁木齐", 43.8266, 87.6168, 3));
projectVos.add(create("香港特别行政区", "香港", 22.3193, 114.1694, 1));
projectVos.add(create("澳门特别行政区", "澳门", 22.1987, 113.5439, 1));
projectVos.add(create("台湾省", "台北", 25.0330, 121.5654, 1));
// projectVos.add(create("北京市", "北京", 39.9042, 116.4074, 1));
// projectVos.add(create("天津市", "天津", 39.3434, 117.36162, 2));
// projectVos.add(create("河北省", "石家庄", 38.0428, 114.5149, 3));
// projectVos.add(create("山西省", "太原", 37.8706, 112.5493, 1));
// projectVos.add(create("内蒙古自治区", "呼和浩特", 40.8426, 111.7492, 2));
// projectVos.add(create("辽宁省", "沈阳", 41.8057, 123.4315, 2));
// projectVos.add(create("吉林省", "长春", 43.8171, 125.3235, 3));
// projectVos.add(create("黑龙江省", "哈尔滨", 45.8038, 126.5349, 1));
// projectVos.add(create("上海市", "上海", 31.2304, 121.4737, 3));
// projectVos.add(create("江苏省", "南京", 32.0603, 118.7969, 1));
// projectVos.add(create("浙江省", "杭州", 30.2741, 120.1551, 1));
// projectVos.add(create("安徽省", "合肥", 31.8206, 117.2272, 2));
// projectVos.add(create("福建省", "福州", 26.0745, 119.2965, 2));
// projectVos.add(create("江西省", "南昌", 28.6820, 115.8579, 2));
// projectVos.add(create("山东省", "济南", 36.6512, 117.1201, 1));
// projectVos.add(create("河南省", "郑州", 34.7473, 113.6249, 1));
// projectVos.add(create("湖北省", "武汉", 30.5928, 114.3055, 1));
// projectVos.add(create("湖南省", "长沙", 28.2278, 112.9389, 2));
// projectVos.add(create("广东省", "广州", 23.1291, 113.2644, 3));
// projectVos.add(create("广西壮族自治区", "南宁", 22.8170, 108.3669, 1));
// projectVos.add(create("海南省", "海口", 20.0440, 110.1999, 1));
// projectVos.add(create("四川省", "成都", 30.6595, 104.0657, 2));
// projectVos.add(create("贵州省", "贵阳", 26.6470, 106.6302, 1));
// projectVos.add(create("云南省", "昆明", 25.0406, 102.7123, 3));
// projectVos.add(create("西藏自治区", "拉萨", 29.6469, 91.1172, 1));
// projectVos.add(create("陕西省", "西安", 34.3416, 108.9398, 3));
// projectVos.add(create("甘肃省", "兰州", 36.0614, 103.8343, 1));
// projectVos.add(create("青海省", "西宁", 36.6232, 101.7782, 2));
// projectVos.add(create("宁夏回族自治区", "银川", 38.4872, 106.2309, 2));
// projectVos.add(create("新疆维吾尔自治区", "乌鲁木齐", 43.8266, 87.6168, 3));
// projectVos.add(create("香港特别行政区", "香港", 22.3193, 114.1694, 1));
// projectVos.add(create("澳门特别行政区", "澳门", 22.1987, 113.5439, 1));
// projectVos.add(create("台湾省", "台北", 25.0330, 121.5654, 1));
// 1号项目
projectVos.add(create("贵州省", "都匀市沙包堡匀东农业光伏电站项目", 26.2556, 107.5139, 1));
// 2号项目
projectVos.add(create("贵州省", "长顺县朝核农业光伏电站", 26.1833, 106.4522, 1));
// 3号项目
projectVos.add(create("重庆市", "重庆无水港绿色低碳能源项目", 29.533155, 106.504962, 1));
// 4号项目
projectVos.add(create("贵州省", "兴义市捧乍猪场坪农业光伏电站项目", 25.1467, 104.8925, 1));
// 5号项目
projectVos.add(create("贵州省", "华能盘州市羊场高光村、松林农业光伏发电项目", 25.7833, 104.6583, 1));
// 6号项目
projectVos.add(create("贵州省", "大唐(六盘水)新能源有限公司水城区化乐农业光伏电站项目", 26.5167, 104.8289, 1));
// 7号项目
projectVos.add(create("广西壮族自治区", "河池市宜州区北牙瑶族乡100MWp农光互补光伏发电项目", 24.6833, 108.6958, 1));
// 8号项目
projectVos.add(create("四川省", "凉山木里茶布朗光伏发电项目220kV升压站设计施工总承包项目", 27.9167, 100.3250, 1));
// 9号项目
projectVos.add(create("内蒙古自治区", "土默特右旗英能光伏电力开发有限公司100兆瓦光伏基地项目", 40.5333, 110.5489, 1));
// 10号项目
projectVos.add(create("云南省", "云南沾益农业光伏项目", 25.5000, 103.8194, 1));
// 11号项目
projectVos.add(create("贵州省", "威宁县盐仓老鸦营30MW农业光伏电站项目", 26.8833, 104.2250, 1));
// 12号项目
projectVos.add(create("云南省", "大黑土光伏电站总承包工程项目", 25.0406, 102.7142, 1));
// 13号项目
projectVos.add(create("贵州省", "晴隆县碧痕新坪村风光火储一体化农业光伏电站", 25.5333, 105.1250, 1));
// 15号项目
projectVos.add(create("河北省", "怀安县风光储一体化项目", 40.6667, 114.5417, 1));
// 16号项目
projectVos.add(create("云南省", "保山市隆阳区黑岩洼光伏发电项目", 25.1250, 99.1667, 1));
// 17号项目
projectVos.add(create("云南省", "白玉光伏发电项目", 25.1250, 99.1667, 1));
// 20号项目
projectVos.add(create("云南省", "云南省沾益区菱角农业光伏发电项目", 25.6000, 103.6833, 1));
// 21号项目
projectVos.add(create("云南省", "云南省文山州砚山县平远光伏发电项目", 23.7500, 104.3333, 1));
// 22号项目
projectVos.add(create("贵州省", "兴仁市大山能投农业光伏电站项目", 25.4000, 105.1833, 1));
// 23号项目
projectVos.add(create("贵州省", "兴仁市潘家庄能投农业光伏电站项目", 25.5333, 104.9833, 1));
// 47号项目
projectVos.add(create("重庆市", "丰都许明寺镇100MW农牧光互补复合项目", 29.9333, 107.7500, 1));
// 48号项目
projectVos.add(create("云南省", "文山市茂克光伏电站项目", 23.3667, 104.2000, 1));
// 50号项目
projectVos.add(create("云南省", "文山市清水井光伏电站项目", 23.4500, 104.3333, 1));
// 52号项目原序号1
projectVos.add(create("广西壮族自治区", "新铝电力新山站屋顶分布式光伏发电项目EPC总承包", 22.8241, 108.3178, 1));
// 53号项目原序号2
projectVos.add(create("江西省", "江西省高速公路服务区分布式光伏项目EPC", 28.6764, 115.8922, 1));
// 54号项目原序号3
projectVos.add(create("河南省", "龙佰集团股份有限公司7MWp分布式光伏发电项目EPC总承包", 34.7573, 113.6145, 1));
// 55号项目原序号4
projectVos.add(create("吉林省", "吉林热电检修安装工程有限公司吉林省南湖宾馆光储充一体化项目EPC总承包", 43.8868, 125.3245, 1));
// 56号项目原序号5
projectVos.add(create("吉林省", "集安市瀚能风电场相关装备有限公司益盛汉参集团分布式光伏发电项目EPC", 41.1333, 126.1650, 1));
// 57号项目原序号6
projectVos.add(create("重庆市", "重庆潼南综合智慧零碳电厂耀辉环保单元项目", 30.1550, 106.2289, 1));
// 58号项目原序号7
projectVos.add(create("重庆市", "汇智能源公司重庆永川综合智慧零碳电厂", 29.4167, 105.7833, 1));
// 59号项目原序号8
projectVos.add(create("广西壮族自治区", "德保县乡村振兴光伏发电项目第二批EPC 总承包", 23.7167, 106.6833, 1));
// 60号项目原序号9
projectVos.add(create("重庆市", "汇智能源公司重庆永川综合智慧零碳电厂升科精锻单元项目工程EPC总承包工程一期", 29.4167, 105.7833, 1));
// 62号项目原序号11
projectVos.add(create("贵州省", "新铝电力莲塘、马隘变电站屋顶分布式光伏发电项目EPC工程总承包项目", 23.7833, 106.9500, 1));
// 63号项目原序号12
projectVos.add(create("广西壮族自治区", "广西德保县乡村振兴光伏发电项目第三批EPC总承包", 23.7167, 106.6833, 1));
// 64号项目原序号13
projectVos.add(create("内蒙古自治区", "内蒙古自治区蒙西户用分布式200MW光伏发电项目EPC总承包四期", 40.6667, 109.8333, 1));
// 65号项目原序号14
projectVos.add(create("广东省", "惠来县50MWp居民屋顶分布式光伏项目", 23.0333, 116.2833, 1));
// 66号项目原序号15
projectVos.add(create("广西壮族自治区", "田东县乡村振兴分布式光伏发电项目二期EPC总承包", 23.6167, 106.9167, 1));
// 67号项目原序号16
projectVos.add(create("广西壮族自治区", "田东县乡村振兴分布式光伏发电项目一期EPC总承包", 23.6167, 106.9167, 1));
// 68号项目原序号17
projectVos.add(create("重庆市", "华能重庆华通电脑有限公司屋顶分布式光伏EPC项目合同", 29.533155, 106.504962, 1));
// 69号项目原序号18
projectVos.add(create("广东省", "大埔峡能白罗20MW、长兴20MW、洋门10MW、群丰10MW农光互补光伏发电项目", 24.3667, 116.7000, 1));
// 70号项目原序号19
projectVos.add(create("广东省", "化州区域分布式光伏项目", 21.7000, 110.6333, 1));
// 71号项目原序号20
projectVos.add(create("河北省", "兴隆县10MW分布式光伏项目", 40.4167, 117.4833, 1));
// 75号项目原序号24
projectVos.add(create("重庆市", "石柱发电公司厂区分布式光伏施工项目", 29.9333, 108.1333, 1));
// 76号项目原序号25
projectVos.add(create("陕西省", "靖边燃气发电厂3.0MW光伏发电工程", 37.6167, 108.7833, 1));
// 77号项目原序号26
projectVos.add(create("河北省", "河北兴隆 10MW分布式光伏项目", 40.4167, 117.4833, 1));
// 79号项目原序号28
projectVos.add(create("广东省", "茂名分公司化工区物资仓库屋顶光伏发电合同能源管理项目", 21.6833, 110.8667, 1));
// 88号项目原序号37
projectVos.add(create("河北省", "怀安县风光储一体化项目", 40.6667, 114.5417, 1));
// 91号项目原序号2
projectVos.add(create("辽宁省", "鑫泰新能源大石桥市200MW风电场新建工程项目", 40.6333, 122.5333, 2));
// 92号项目原序号3
projectVos.add(create("辽宁省", "大石桥市冠程新能源550MW风电场工程项目", 40.6333, 122.5333, 2));
// 96号项目原序号7
projectVos.add(create("四川省", "阿坝公司运检大楼“风光油储型”微电网试点项目", 31.9500, 102.2167, 2));
// 老挝 - 万象
projectVos.add(create("老挝", "万象", 17.9757, 102.6331, 1));
projectVos.add(create("老挝", "巴塞", 15.110507, 105.817291, 1));
// 老挝 - 琅勃拉邦
projectVos.add(create("老挝", "琅勃拉邦", 19.8856, 102.1350, 2));
projectVos.add(create("老挝", "波利坎塞", 18.39639, 103.65583, 1));
Map<String, Map<String, Map<String, String>>> map = new HashMap<>();
for (SysDictDataVo projectType : projectTypes) {
Map<String, Map<String, String>> map1 = new HashMap<>();
@ -1224,6 +1418,7 @@ public class BusProjectServiceImpl extends ServiceImpl<BusProjectMapper, BusProj
map2.put("lng", project.getLng());
map2.put("lat", project.getLat());
map2.put("position", project.getPosition());
map2.put("plan", project.getPlan());
map2.put("projectId", project.getId().toString());
map1.put(project.getProjectName(), map2);
//当满足条件时删除该元素

View File

@ -13,6 +13,7 @@ import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.ObjectUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.enums.AppUserTypeEnum;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
@ -198,14 +199,14 @@ public class BusProjectTeamMemberServiceImpl extends ServiceImpl<BusProjectTeamM
relevancy.setProjectId(req.getProjectId());
userProjectRelevancyService.save(relevancy);
}
//设置基础角色 清空已有角色
//设置基础角色 清空所有App权限角色
userRoleMapper.delete(Wrappers.<SysUserRole>lambdaQuery()
.eq(SysUserRole::getUserId, constructionUser.getSysUserId())
.eq(SysUserRole::getProjectId, req.getProjectId())
.in(SysUserRole::getRoleId, Arrays.asList(2L, 3L))
.in(SysUserRole::getRoleId, AppUserTypeEnum.ROLE_ID_LIST)
);
//再添加分配角色
Long roleId = "0".equals(req.getPostId()) ? 2L : 3L;
Long roleId = "0".equals(req.getPostId()) ? AppUserTypeEnum.SG.getRoleId() : AppUserTypeEnum.BZZ.getRoleId();
SysUserRole sysUserRole = new SysUserRole();
sysUserRole.setUserId(constructionUser.getSysUserId());
sysUserRole.setRoleId(roleId);

View File

@ -145,7 +145,7 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
}
// 获取巡检情况
List<QltQualityInspectionGis> list = qualityInspectionList.stream()
.filter(q -> "2".equals(q.getIsReply()))
// .filter(q -> "2".equals(q.getIsReply()))
.toList().stream().map(q -> {
QltQualityInspectionGis gis = new QltQualityInspectionGis();
BeanUtils.copyProperties(q, gis);
@ -153,7 +153,7 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
}).toList();
gisVo.setList(list.stream()
.sorted(Comparator.comparing(QltQualityInspectionGis::getCreateTime).reversed())
.limit(Optional.ofNullable(req.getPageSize()).orElse(20))
// .limit(Optional.ofNullable(req.getPageSize()).orElse(20))
.toList());
gisVo.setCount((long) list.size());
// 获取整改情况
@ -168,7 +168,7 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
gisVo.setCorrectSituation((long) correctList.size());
gisVo.setCorrectList(correctList.stream()
.sorted(Comparator.comparing(QltQualityInspectionGis::getCreateTime).reversed())
.limit(Optional.ofNullable(req.getPageSize()).orElse(20))
// .limit(Optional.ofNullable(req.getPageSize()).orElse(20))
.toList());
// gisVo.setCorrectSituation(String.format("%.2f", passCount * 100.0 / qualityInspectionList.size()));
return gisVo;

View File

@ -1,9 +1,12 @@
package org.dromara.safety.domain.vo.safetyinspection;
import lombok.Data;
import org.dromara.common.translation.annotation.Translation;
import org.dromara.common.translation.constant.TransConstant;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* @author lilemy
@ -26,9 +29,10 @@ public class HseSafetyInspectionGis implements Serializable {
private String checkType;
/**
* 违章类型
* 巡检类型名称
*/
private String violationType;
@Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "checkType", other = "safety_inspection_check_type")
private String inspectionTypeLabel;
/**
* 巡检结果
@ -40,4 +44,9 @@ public class HseSafetyInspectionGis implements Serializable {
*/
private String status;
/**
* 创建时间
*/
private Date createTime;
}

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StringUtils;
@ -39,6 +40,7 @@ import java.util.Objects;
* @author lilemy
* @date 2025-06-24
*/
@Slf4j
@Service
public class HseRecognizeRecordServiceImpl extends ServiceImpl<HseRecognizeRecordMapper, HseRecognizeRecord>
implements IHseRecognizeRecordService {
@ -109,7 +111,8 @@ public class HseRecognizeRecordServiceImpl extends ServiceImpl<HseRecognizeRecor
entity.setCreateTime(record.getCreateTime());
Long projectId = record.getProjectId();
if (projectId == null) {
entity.setRemark("摄像头暂未分配到项目中");
log.warn("摄像头[{}]暂未分配到项目中", record.getDeviceSerial());
continue;
}
List<RecognizeTargetVo> targets = record.getTargets();
List<String> codeList = targets.stream()

View File

@ -217,50 +217,33 @@ public class HseSafetyInspectionServiceImpl extends ServiceImpl<HseSafetyInspect
} else {
gisVo.setTeamMeetingList(new ArrayList<>());
}
gisVo.setTeamMeetingCount((long) teamMeetings.size());
// 获取整改情况
List<HseSafetyInspection> safetyInspectionList = this.lambdaQuery()
.select(HseSafetyInspection::getId, HseSafetyInspection::getStatus, HseSafetyInspection::getIsReply)
.eq(HseSafetyInspection::getProjectId, projectId)
.list();
long passCount = 0L;
for (HseSafetyInspection safetyInspection : safetyInspectionList) {
if ("1".equals(safetyInspection.getIsReply())) {
if (!safetyInspection.getStatus().equals(HseSafetyInspectionStatusEnum.INFORM.getValue())) {
passCount++;
}
}
}
List<HseSafetyInspection> passList = safetyInspectionList.stream()
.filter(q -> "1".equals(q.getIsReply()))
.filter(q -> !q.getStatus().equals(HseSafetyInspectionStatusEnum.INFORM.getValue()))
.toList();
List<HseSafetyInspectionGis> pass = passList.stream().map(p -> {
HseSafetyInspectionGis gis = new HseSafetyInspectionGis();
gis.setId(p.getId());
gis.setCheckType(p.getCheckType());
gis.setViolationType(p.getViolationType());
gis.setInspectionResult(p.getInspectionResult());
gis.setStatus(p.getStatus());
BeanUtils.copyProperties(p, gis);
return gis;
}).toList();
gisVo.setTeamMeetingCount((long) teamMeetings.size());
List<HseSafetyInspectionGis> inspections = safetyInspectionList.stream()
.filter(q -> "2".equals(q.getIsReply()))
// .filter(q -> "2".equals(q.getIsReply()))
.toList()
.stream().map(p -> {
HseSafetyInspectionGis gis = new HseSafetyInspectionGis();
gis.setId(p.getId());
gis.setCheckType(p.getCheckType());
gis.setViolationType(p.getViolationType());
gis.setInspectionResult(p.getInspectionResult());
gis.setStatus(p.getStatus());
BeanUtils.copyProperties(p, gis);
return gis;
}).toList();
gisVo.setSafetyInspectionCount((long) inspections.size());
gisVo.setSafetyInspectionList(inspections);
gisVo.setCorrectSituationCount(passCount);
gisVo.setCorrectSituationCount((long) pass.size());
gisVo.setCorrectSituationList(pass);
gisVo.setCorrectSituation(String.format("%.2f", passCount * 100.0 / safetyInspectionList.size()));
// gisVo.setCorrectSituation(String.format("%.2f", (long) pass.size() * 100.0 / safetyInspectionList.size()));
return gisVo;
}

View File

@ -6,6 +6,7 @@ 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.extern.slf4j.Slf4j;
import org.dromara.bigscreen.domain.dto.WeatherQueryReq;
import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.exception.ServiceException;
@ -41,6 +42,7 @@ import java.util.List;
* @date 2025-03-20
*/
@Service
@Slf4j
public class HseSafetyLogServiceImpl extends ServiceImpl<HseSafetyLogMapper, HseSafetyLog>
implements IHseSafetyLogService {
@ -248,6 +250,8 @@ public class HseSafetyLogServiceImpl extends ServiceImpl<HseSafetyLogMapper, Hse
@Override
public WeatherVo getWeatherNowDaysList(WeatherQueryReq req) {
//打印参数
log.info("获取天气信息参数:{}", req);
List<WeatherVo> weatherListVo = weatherManager.getWeatherListVo(req.getLng(), req.getLat(), WeatherConstant.THREE_DAYS_WEATHER_PATH);
return weatherListVo.getFirst();
}

View File

@ -17,6 +17,7 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.encrypt.annotation.ApiEncrypt;
import org.dromara.common.excel.core.ExcelResult;
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;
@ -83,5 +84,21 @@ public class SysUserAppController extends BaseController {
return R.ok(deptService.selectDeptTreeList(dept));
}
/**
* 注销用户信息
*/
@RepeatSubmit()
@PutMapping("/deletion")
public R<Boolean> deletion() {
return R.ok(userService.deletion());
}
/**
* 密码比对
*/
@GetMapping("/passwordCompare")
public R<Boolean> passwordCompare(String password) {
return R.ok(userService.passwordCompare(password));
}
}

View File

@ -9,6 +9,7 @@ import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.web.core.BaseController;
import org.dromara.system.domain.bo.SysDeptBo;
import org.dromara.system.domain.vo.SysDeptVo;
@ -148,4 +149,32 @@ public class SysDeptController extends BaseController {
return R.ok(deptService.selectDeptByIds(deptIds == null ? null : List.of(deptIds)));
}
/**
* 查询部门
*/
@GetMapping("/listTopDept")
public R<List<SysDeptVo>> list() {
List<SysDeptVo> list = deptService.querListDept();
return R.ok(list);
}
/**
* 获取当前登录用户顶级部门
*/
@GetMapping("/getTopDept")
public R<SysDeptVo> getTopDept() {
// 获取当前用户部门
Long deptId = LoginHelper.getDeptId();
SysDeptVo deptVo = deptService.selectDeptById(deptId);
if (LoginHelper.isSuperAdmin()) {
return R.ok(deptVo);
}
String ancestors = deptVo.getAncestors();
List<Long> ids = StringUtils.splitTo(ancestors, Convert::toLong);
if (ids.size() == 2) {
return R.ok(deptVo);
}
return R.ok(deptService.selectDeptById(ids.get(2)));
}
}

View File

@ -16,6 +16,7 @@ import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.encrypt.annotation.ApiEncrypt;
import org.dromara.common.enums.AppUserTypeEnum;
import org.dromara.common.excel.core.ExcelResult;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.log.annotation.Log;
@ -45,6 +46,8 @@ import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 用户信息
@ -224,6 +227,29 @@ public class SysUserController extends BaseController {
.flatMap(dto -> dto.getRoleIds().stream())
.distinct()
.toList();
//校验roleId (2,3,4,5)的数量只能选择1个
// 过滤出roleList中包含的目标元素
List<Long> matchedRoles = roleList.stream()
.filter(AppUserTypeEnum.ROLE_ID_LIST::contains)
.toList();
// 统计数量
long count = matchedRoles.size();
// 数量校验
if (count > 1) {
return R.fail("app用户类型角色只能选择一个");
}
// 获取具体包含的元素(或提示不包含)
if (count == 1) {
Long matchedRole = matchedRoles.get(0);
AppUserTypeEnum byRoleId = AppUserTypeEnum.getByRoleId(matchedRole);
if (byRoleId != null) {
user.setAppUserType(byRoleId.getType());
}
}
deptService.checkDeptMatchRole(user.getUserId(), roleList);
if (!userService.checkUserNameUnique(user)) {
return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在");

View File

@ -8,6 +8,7 @@ import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.vo.SysUserExportVo;
import org.dromara.system.domain.vo.SysUserVo;
@ -137,4 +138,13 @@ public interface SysUserMapper extends BaseMapperPlus<SysUser, SysUserVo> {
List<SysUserVo> selectUserListByAppUserType(@Param("appUserType") String appUserType, @Param("projectId")Long projectId, @Param("contractorId")Long contractorId);
SysUser selectDefFlagUser(@Param("phonenumber") String phonenumber);
void updateDefFlag(@Param("sysUserBo") SysUserBo sysUserBo);
void updateConstructionUser(@Param("userId") Long userId);
}

View File

@ -165,4 +165,6 @@ public interface ISysDeptService {
int deleteDeptById(Long deptId);
List<SysDeptVo> querListDept();
String selectDeptNameById(Long id);
}

View File

@ -283,5 +283,7 @@ public interface ISysUserService {
String queryNameById(Long id);
Boolean deletion();
Boolean passwordCompare(String password);
}

View File

@ -538,6 +538,12 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
return sysDeptVos;
}
@Override
public String selectDeptNameById(Long id) {
SysDept sysDept = baseMapper.selectById(id);
return sysDept != null ?sysDept.getDeptName():"";
}
/**
* 获取当前部门的祖先ID、自己ID、以及所有祖先的“同级部门ID”
*

View File

@ -1,5 +1,6 @@
package org.dromara.system.service.impl;
import cn.dev33.satoken.secure.BCrypt;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
@ -15,6 +16,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.apache.bcel.generic.RET;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.dto.UserDTO;
@ -22,6 +24,7 @@ import org.dromara.common.core.enums.UserType;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.service.UserService;
import org.dromara.common.core.utils.*;
import org.dromara.common.enums.AppUserTypeEnum;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
@ -57,6 +60,7 @@ import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@ -493,6 +497,14 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
if (flag < 1) {
throw new ServiceException("修改用户" + user.getUserName() + "信息失败");
}
//修改construction_user表
if(user.getAppUserType() != null){
constructionUserService.lambdaUpdate()
.set(SubConstructionUser::getUserRole, user.getAppUserType())
.eq(SubConstructionUser::getSysUserId, user.getUserId())
.update();
}
// 没有修改部门则不需要修改用户与项目的关联
// if (oldUser.getDeptId().equals(user.getDeptId())) {
// return flag;
@ -895,6 +907,9 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
if (sysUser == null) {
throw new ServiceException("用户不存在!");
}
if(appUserType.equals(sysUser.getAppUserType())){
throw new ServiceException("当前已是选中用户类型 !");
}
Long contractorId = null;
SubConstructionUser constructionUser = constructionUserService.lambdaQuery()
.eq(SubConstructionUser::getSysUserId, userId)
@ -910,7 +925,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
contractorId = constructionUser.getContractorId();
}
String oldType = sysUser.getAppUserType();
if ("0".equals(oldType)) { //施工人员->管理人员/分包人员
if (AppUserTypeEnum.SG.getType().equals(oldType)) { //施工人员->管理人员/分包人员
//清除app所有角色
userRoleMapper.deleteAppRoleByUserId(userId);
}else { //管理人员 <-> 施工人员
@ -929,7 +944,10 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
projects = projectIds;
}
Long roleId = "1".equals(appUserType)?4L:5L;
Long roleId = 2L;
if(!AppUserTypeEnum.SG.getType().equals(appUserType)){
roleId = AppUserTypeEnum.getByType(appUserType).getRoleId();
}
ArrayList<SysUserRole> sysUserRoles = new ArrayList<>();
for (Long project : projects) {
SysUserRole sysUserRole = new SysUserRole();
@ -1281,6 +1299,49 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
return sysUserVo != null ? sysUserVo.getNickName() : null;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deletion() {
Long userId = LoginHelper.getUserId();
SubConstructionUser constructionUser = constructionUserService.getByUserId(userId);
if(constructionUser!=null && constructionUser.getTeamId()!=null){
throw new ServiceException("请先退出班组");
}
//清空关联项目
userProjectRelevancyService.deleteByUserId(userId);
//逻辑删除
constructionUserService.lambdaUpdate()
.set(SubConstructionUser::getProjectId, null)
.set(SubConstructionUser::getContractorId, null)
.set(SubConstructionUser::getTeamId, null)
.set(SubConstructionUser::getUserRole, "9")
.set(SubConstructionUser::getTypeOfWork, null)
.set(SubConstructionUser::getWageMeasureUnit, null)
.set(SubConstructionUser::getEntryDate, null)
.set(SubConstructionUser::getLeaveDate, null)
.set(SubConstructionUser::getSalary, BigDecimal.ZERO)
.set(SubConstructionUser::getFirstDate, null)
.set(SubConstructionUser::getExitStatus, "0")
.set(SubConstructionUser::getDelFlag, "1")
.eq(SubConstructionUser::getSysUserId, userId)
.update();
//删除用户角色关联
userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId));
return baseMapper.deleteById(userId)>0;
}
@Override
public Boolean passwordCompare(String password) {
Long userId = LoginHelper.getUserId();
SysUser sysUser = baseMapper.selectById(userId);
return BCrypt.checkpw(password, sysUser.getPassword());
}
@Override
public UserDTO selectUser(Long userId) {

View File

@ -1,6 +1,7 @@
package org.dromara.tender.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.exception.ServiceException;
@ -384,6 +385,9 @@ public class BusBiddingPlanServiceImpl extends ServiceImpl<BusBiddingPlanMapper,
bplanIdds.add(busBiddingPlanVo.getId());
}
Map<Long, BigDecimal> map = new HashMap<>();
if(CollectionUtil.isEmpty(bplanIdds)){
return map;
}
//获取该供应商的所有材料
List<BusTenderPlanningLimitList> busTenderPlanningLimitLists = busTenderPlanningLimitListMapper.selectList(new LambdaQueryWrapper<BusTenderPlanningLimitList>().in(BusTenderPlanningLimitList::getBiddingPlanId, bplanIdds));
for (BusTenderPlanningLimitList v : busTenderPlanningLimitLists) {

View File

@ -7,6 +7,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.common.utils.BatchNumberGenerator;
import org.dromara.system.service.impl.SysOssServiceImpl;
import org.dromara.xzd.biddingManagement.biaoqianlixiang.domain.XzdBqlxProjectInfo;
import org.dromara.xzd.biddingManagement.biaoqianlixiang.domain.bo.XzdBqlxProjectInfoBo;
@ -146,15 +147,13 @@ public class XzdBidPreProjectServiceImpl extends ServiceImpl<XzdBidPreProjectMap
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(BiddingManagementDto bo) {
Long l = baseMapper.selectCount(new LambdaQueryWrapper<XzdBidPreProject>().gt(XzdBidPreProject::getCreateTime, LocalDate.now()));
String s = areaUtil.generateDateBasedNumber();
String banBen = BatchNumberGenerator.generateBatchNumber("BQLX-");
// 标前立项
XzdBidPreProjectBo xzdBidPreProjectBo = bo.getXzdBidPreProjectBo();
XzdBidPreProject xzdBidPreProject = new XzdBidPreProject();
if (xzdBidPreProjectBo != null) {
BeanUtil.copyProperties(xzdBidPreProjectBo, xzdBidPreProject);
xzdBidPreProject.setProjectNumber(s+"-"+(l+1));
xzdBidPreProject.setProjectNumber(banBen);
baseMapper.insert(xzdBidPreProject);
}

View File

@ -9,6 +9,7 @@ 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.common.utils.BatchNumberGenerator;
import org.dromara.system.service.impl.SysOssServiceImpl;
import org.dromara.xzd.biddingManagement.biaoqianlixiang.domain.XzdProjectRiskAssessment;
import org.dromara.xzd.biddingManagement.biaoqianlixiang.domain.bo.XzdProjectRiskAssessmentBo;
@ -140,9 +141,8 @@ public class XzdProjectRiskAssessmentServiceImpl extends ServiceImpl<XzdProjectR
XzdProjectRiskAssessment add = MapstructUtils.convert(bo, XzdProjectRiskAssessment.class);
validEntityBeforeSave(add);
if(add != null){
String s = areaUtil.generateDateBasedNumber();
Long l = baseMapper.selectCount(new LambdaQueryWrapper<XzdProjectRiskAssessment>().gt(XzdProjectRiskAssessment::getCreateTime, LocalDate.now()));
add.setDocumentNumber(s+"-"+(l+1));
String banBen = BatchNumberGenerator.generateBatchNumber("XMFXPGYJB-");
add.setDocumentNumber(banBen);
}
boolean flag = baseMapper.insert(add) > 0;
if (flag) {

View File

@ -9,6 +9,7 @@ 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.common.utils.BatchNumberGenerator;
import org.dromara.system.service.impl.SysOssServiceImpl;
import org.dromara.xzd.biddingManagement.biaoqianlixiang.domain.vo.XzdBidPreProjectVo;
import org.dromara.xzd.utilS.AreaUtil;
@ -119,11 +120,9 @@ public class XzdBiddingFileEstimateServiceImpl extends ServiceImpl<XzdBiddingFil
XzdBiddingFileEstimate add = MapstructUtils.convert(bo, XzdBiddingFileEstimate.class);
validEntityBeforeSave(add);
Long l = baseMapper.selectCount(new LambdaQueryWrapper<XzdBiddingFileEstimate>().gt(XzdBiddingFileEstimate::getCreateTime, LocalDate.now()));
String banBen = BatchNumberGenerator.generateBatchNumber("ZBWJPG-");
String s = areaUtil.generateDateBasedNumber();
add.setDocumentCode(s+"-"+(l+1));
add.setDocumentCode(banBen);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {

Some files were not shown because too many files have changed in this diff Show More