Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
2025-10-12 16:08:01 +08:00
51 changed files with 1141 additions and 289 deletions

View File

@ -23,7 +23,7 @@ public class RecognizerTest {
@Test
void test() {
RecognizeVo recognize = recognizerManager.recognize("http://xny.yj-3d.com:7363/file/tif/20250625160218orthophoto.png", List.of(RecognizerTypeEnum.PHO));
RecognizeVo recognize = recognizerManager.recognize("http://xny.yj-3d.com:7363/file/tif/20250625160218orthophoto.png", List.of(RecognizerTypeEnum.SOLAR));
log.info("recognize: {}", recognize);
}
}

View File

@ -26,7 +26,7 @@ public class WebSocketTopicListener implements ApplicationRunner, Ordered {
public void run(ApplicationArguments args) throws Exception {
// 订阅WebSocket消息
WebSocketUtils.subscribeMessage((message) -> {
log.info("WebSocket主题订阅收到消息session keys={} message={}", message.getSessionKeys(), message.getMessage());
// log.info("WebSocket主题订阅收到消息session keys={} message={}", message.getSessionKeys(), message.getMessage());
// 如果key不为空就按照key发消息 如果为空就群发
if (CollUtil.isNotEmpty(message.getSessionKeys())) {
message.getSessionKeys().forEach(key -> {

View File

@ -2,14 +2,11 @@ package org.dromara.bigscreen.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.bigscreen.domain.dto.WurenjiQueryReq;
import org.dromara.bigscreen.domain.dto.Ys7DeviceUpdateReq;
import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo;
import org.dromara.bigscreen.domain.vo.ProjectLandVo;
@ -22,12 +19,8 @@ import org.dromara.common.core.exception.ServiceException;
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.redis.utils.RedisUtils;
import org.dromara.common.web.core.BaseController;
import org.dromara.drone.service.IDroProjectDroneService;
import org.dromara.gps.domain.bo.GpsEquipmentBo;
import org.dromara.gps.domain.vo.GpsEquipmentSonVo;
import org.dromara.gps.service.IGpsEquipmentService;
import org.dromara.land.domain.BusLandBlock;
import org.dromara.land.domain.BusLandTransferLedger;
import org.dromara.land.domain.BusLandTransferLedgerSon;
@ -54,10 +47,8 @@ import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.stream.Collectors;
/**
@ -103,10 +94,10 @@ public class ProjectBigScreenController extends BaseController {
List<BusLandTransferLedger> levelList = busLandTransferLedgerService.list(Wrappers.lambdaQuery(BusLandTransferLedger.class)
.eq(BusLandTransferLedger::getProjectId, projectId));
if(CollectionUtil.isNotEmpty(levelList)){
if (CollectionUtil.isNotEmpty(levelList)) {
List<Long> list1 = levelList.stream().map(BusLandTransferLedger::getId).toList();
LambdaQueryWrapper<BusLandTransferLedgerSon> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(BusLandTransferLedgerSon::getParentId,list1);
lambdaQueryWrapper.in(BusLandTransferLedgerSon::getParentId, list1);
List<BusLandTransferLedgerSon> sonList = busLandTransferLedgerSonService.list(lambdaQueryWrapper);
Map<Long, BigDecimal> collect = sonList.stream().filter(vo -> "1".equals(vo.getTransferStatus()))
.collect(Collectors.toMap(BusLandTransferLedgerSon::getParentId, BusLandTransferLedgerSon::getAreaValue));
@ -283,8 +274,8 @@ public class ProjectBigScreenController extends BaseController {
*/
@SaCheckPermission("project:bigScreen:imageProgress")
@GetMapping("/imageProgress/{projectId}")
public R<ProjectImageProgressVo> getProjectImageProgress(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
public R<List<ProjectImageProgressVo>> getProjectImageProgress(@NotNull(message = "主键不能为空")
@PathVariable Long projectId) {
return R.ok(projectBigScreenService.getProjectImageProgress(projectId));
}

View File

@ -16,39 +16,49 @@ public class ProjectImageProgressVo implements Serializable {
@Serial
private static final long serialVersionUID = 7963637133004484891L;
/**
* 类别名称
*/
private String progressName;
/**
* 进度百分比
*/
private BigDecimal progressTotal;
/**
* 场区百分比
*/
private BigDecimal areaPercentage;
// private BigDecimal areaPercentage;
/**
* 道路百分比
*/
private BigDecimal roadPercentage;
// private BigDecimal roadPercentage;
/**
* 集电线路百分比
*/
private BigDecimal collectorLinePercentage;
// private BigDecimal collectorLinePercentage;
/**
* 送出线路百分比
*/
private BigDecimal exportLinePercentage;
// private BigDecimal exportLinePercentage;
/**
* 升压站百分比
*/
private BigDecimal substationPercentage;
// private BigDecimal substationPercentage;
/**
* 箱变百分比
*/
private BigDecimal boxTransformerPercentage;
// private BigDecimal boxTransformerPercentage;
/**
* 总百分比
*/
private BigDecimal totalPercentage;
// private BigDecimal totalPercentage;
}

View File

@ -1,11 +1,10 @@
package org.dromara.bigscreen.service;
import jakarta.validation.constraints.NotNull;
import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo;
import org.dromara.bigscreen.domain.vo.ProjectPeopleVo;
import org.dromara.bigscreen.domain.vo.ProjectSafetyInspectionVo;
import org.dromara.manager.weathermanager.vo.WeatherVo;
import org.dromara.gps.domain.bo.GpsEquipmentBo;
import org.dromara.manager.weathermanager.vo.WeatherVo;
import org.dromara.project.domain.vo.project.BusProjectSafetyDayVo;
import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo;
@ -64,7 +63,7 @@ public interface ProjectBigScreenService {
* @param projectId 项目id
* @return 项目形象进度
*/
ProjectImageProgressVo getProjectImageProgress(Long projectId);
List<ProjectImageProgressVo> getProjectImageProgress(Long projectId);
/**
* 获取项目概括

View File

@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource;
import org.dromara.bigscreen.domain.vo.ProjectImageProgressVo;
import org.dromara.bigscreen.domain.vo.ProjectPeopleVo;
@ -15,8 +14,6 @@ import org.dromara.common.core.constant.HttpStatus;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.utils.BigDecimalUtil;
import org.dromara.common.websocket.dto.WebSocketMessageDto;
import org.dromara.common.websocket.utils.WebSocketUtils;
import org.dromara.contractor.domain.SubConstructionUser;
import org.dromara.contractor.service.ISubConstructionUserService;
import org.dromara.drone.service.IDroProjectDroneService;
@ -26,8 +23,8 @@ import org.dromara.gps.service.IGpsEquipmentService;
import org.dromara.manager.weathermanager.vo.WeatherVo;
import org.dromara.other.domain.OthYs7Device;
import org.dromara.other.service.IOthYs7DeviceService;
import org.dromara.progress.constant.PgsProgressCategoryConstant;
import org.dromara.progress.domain.PgsProgressCategory;
import org.dromara.progress.domain.enums.PgsProgressUnitTypeEnum;
import org.dromara.progress.service.IPgsProgressCategoryService;
import org.dromara.project.domain.BusProject;
import org.dromara.project.domain.BusProjectTeam;
@ -37,16 +34,12 @@ import org.dromara.project.domain.vo.projectnews.BusProjectNewsVo;
import org.dromara.project.service.*;
import org.dromara.safety.domain.HseRecognizeRecord;
import org.dromara.safety.service.IHseRecognizeRecordService;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.redisson.api.listener.MessageListener;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
@ -241,9 +234,59 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
* @return 项目形象进度
*/
@Override
public ProjectImageProgressVo getProjectImageProgress(Long projectId) {
public List<ProjectImageProgressVo> getProjectImageProgress(Long projectId) {
checkProject(projectId);
ProjectImageProgressVo vo = new ProjectImageProgressVo();
// 获取当前项目的所有子项目
List<Long> projectIds = new ArrayList<>(projectService.lambdaQuery()
.select(BusProject::getId)
.eq(BusProject::getPId, projectId)
.list()
.stream()
.map(BusProject::getId)
.toList());
projectIds.add(projectId);
// 查询该子项目下的顶级进度类别父ID为0
List<PgsProgressCategory> list = progressCategoryService.lambdaQuery()
.in(PgsProgressCategory::getProjectId, projectIds)
.eq(PgsProgressCategory::getParentId, PgsProgressCategoryConstant.TOP_PARENT_ID)
.list();
// 如果没有查询到顶级进度类别,直接返回空集合
if (CollUtil.isEmpty(list)) {
return List.of();
}
List<ProjectImageProgressVo> topList = new ArrayList<>();
// 获取这些顶级类别的所有子节点
List<Long> ids = list.stream().map(PgsProgressCategory::getId).distinct().toList();
List<PgsProgressCategory> childrenNodes = progressCategoryService.getChildrenNodeByTopIds(ids);
if (CollUtil.isNotEmpty(list)) {
// 按名称分组(同名的放在一起)
Map<String, List<PgsProgressCategory>> subMap = list.stream()
.collect(Collectors.groupingBy(PgsProgressCategory::getName));
for (Map.Entry<String, List<PgsProgressCategory>> entry : subMap.entrySet()) {
ProjectImageProgressVo topVo = new ProjectImageProgressVo();
topVo.setProgressName(entry.getKey());
List<PgsProgressCategory> value = entry.getValue();
// 获取这些类别下的所有叶子节点
List<Long> topIds = value.stream().map(PgsProgressCategory::getId).distinct().toList();
List<PgsProgressCategory> leafNodesByTopIds = childrenNodes.stream()
.filter(node -> {
Set<Long> ancestorSet = Arrays.stream(node.getAncestors().split(","))
.map(Long::parseLong)
.collect(Collectors.toSet());
return topIds.stream().anyMatch(ancestorSet::contains);
}).toList();
// 如果有叶子节点,统计进度和状态;否则初始化为未完成
if (CollUtil.isNotEmpty(leafNodesByTopIds)) {
topVo.setProgressTotal(progressCategoryService.getCompletedPercentage(leafNodesByTopIds));
} else {
topVo.setProgressTotal(BigDecimal.ZERO);
}
// 加入结果集
topList.add(topVo);
}
}
return topList;
/* ProjectImageProgressVo vo = new ProjectImageProgressVo();
// 获取所有子项目列表
List<BusProject> subProjectList = projectService.lambdaQuery()
.eq(BusProject::getPId, projectId)
@ -368,7 +411,7 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
.add(vo.getBoxTransformerPercentage())
.divide(BigDecimal.valueOf(6), 2, RoundingMode.HALF_UP) // 保留两位小数
);
return vo;
return vo;*/
}
/**
@ -400,7 +443,7 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
@Override
public List<String> getList(Long projectId) {
if (projectId == null){
if (projectId == null) {
throw new ServiceException("项目id不能为空");
}
Object object = RedisUtils.getCacheObject("xmjdp:" + projectId);
@ -414,10 +457,10 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
@Override
public void setList(GpsEquipmentBo bo) {
if (bo.getProjectId() == null){
if (bo.getProjectId() == null) {
throw new ServiceException("项目id不能为空");
}
RedisUtils.setCacheObject("xmjdp:"+bo.getProjectId(), bo.getIdList());
RedisUtils.setCacheObject("xmjdp:" + bo.getProjectId(), bo.getIdList());
}
@Override
@ -427,8 +470,8 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
// 获取当前时间
LocalDateTime now = LocalDateTime.now();
List<GpsEquipmentSonVo> voList = gpsEquipmentService.getClientList(projectId,startOfDay,now);
List<GpsEquipmentSonVo> appList = gpsEquipmentService.getUserListByProjectId(projectId,startOfDay,now);
List<GpsEquipmentSonVo> voList = gpsEquipmentService.getClientList(projectId, startOfDay, now);
List<GpsEquipmentSonVo> appList = gpsEquipmentService.getUserListByProjectId(projectId, startOfDay, now);
List<OthYs7Device> othYs7DeviceList = othYs7DeviceService.lambdaQuery()
.eq(OthYs7Device::getProjectId, projectId)
.between(OthYs7Device::getUpdateTime, startOfDay, now)
@ -533,10 +576,10 @@ public class ProjectBigScreenServiceImpl implements ProjectBigScreenService {
sxtMap1.put("children", sxtChildrenMap1);
wrjMap.put("id", 3);
wrjMap.put("label", "无人机");
wrjMap.put("children",wrjChildrenMap);
wrjMap.put("children", wrjChildrenMap);
wrjMap1.put("id", 8);
wrjMap1.put("label", "无人机");
wrjMap1.put("children",wrjChildrenMap1);
wrjMap1.put("children", wrjChildrenMap1);
maps.add(gpsMap);

View File

@ -13,6 +13,7 @@ import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.cailiaoshebei.domain.bo.RemainingReq;
import org.dromara.cailiaoshebei.domain.dto.BusMrpDto;
import org.dromara.cailiaoshebei.domain.dto.BusMrpExportDto;
import org.dromara.cailiaoshebei.domain.vo.BusMrpVo;
@ -24,6 +25,10 @@ import org.dromara.design.domain.bo.CoryObtainTheListReq;
import org.dromara.design.domain.vo.ObtainTheListRes;
import org.dromara.design.service.IBusBillofquantitiesService;
import org.dromara.design.service.IBusBillofquantitiesVersionsService;
import org.dromara.tender.domain.bo.BusBiddingPlanBo;
import org.dromara.tender.domain.vo.BusBiddingPlanVo;
import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo;
import org.dromara.tender.service.IBusBiddingPlanService;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
@ -59,6 +64,7 @@ public class BusMrpBaseController extends BaseController {
private final IBusBillofquantitiesVersionsService busBillofquantitiesVersionsService;
private final IBusBillofquantitiesService busBillofquantitiesService;
private final IBusBiddingPlanService busBiddingPlanService;
/**
* 查询物资-批次需求计划基础信息列表
@ -141,8 +147,14 @@ public class BusMrpBaseController extends BaseController {
* 获取剩余量
*/
@GetMapping("/remaining")
public R<Map<String,Object>> remaining(Long projectId, String suppliespriceName,String specification,Long mrpBaseId) {
return R.ok(busMrpBaseService.remaining(projectId,suppliespriceName,specification,mrpBaseId));
public R<List<Map<String,Object>>> remaining( RemainingReq req) {
String[] split = req.getLimitListId().split(",");
List<Map<String, Object>> maps = new ArrayList<>();
for (String id : split) {
Map<String, Object> remaining = busMrpBaseService.remaining(req.getProjectId(), Long.valueOf(id), req.getMrpBaseId());
maps.add(remaining);
}
return R.ok(maps);
}
@ -175,6 +187,35 @@ public class BusMrpBaseController extends BaseController {
return R.ok(list);
}
/**
* 获取工程量清单列表
*/
@SaCheckPermission("cailiaoshebei:mrpBase:getZhaoBiaoList")
@GetMapping("/getZhaoBiaoList")
public R<List<BusBiddingPlanVo>> getZhaoBiaoList(CoryObtainTheListReq req) {
BusBiddingPlanBo bo = new BusBiddingPlanBo();
bo.setProjectId(req.getProjectId());
bo.setType("3");
bo.setBidStatus(1);
List<BusBiddingPlanVo> busBiddingPlanVos = busBiddingPlanService.queryList(bo);
return R.ok(busBiddingPlanVos);
}
/**
* 招标计划数据详情
* @param bo
* @return
*/
@SaCheckPermission("cailiaoshebei:mrpBase:getMore")
@GetMapping("/getMore")
public R<List<BusBillofquantitiesLimitListVo>> getMore(BusBiddingPlanBo bo) {
if (bo.getId() == null) {
throw new ServiceException("id不能为空");
}
return R.ok(busBiddingPlanService.getMore(bo));
}
/**
* 获取工程量清单列表
*/

View File

@ -106,8 +106,8 @@ public class BusMrpBaseAppController extends BaseController {
* 获取剩余量
*/
@GetMapping("/remaining")
public R<Map<String,Object>> remaining(Long projectId, String suppliespriceName,String specification,Long mrpBaseId) {
return R.ok(busMrpBaseService.remaining(projectId,suppliespriceName,specification,mrpBaseId));
public R<Map<String,Object>> remaining(Long projectId,Long limitListId,Long mrpBaseId) {
return R.ok(busMrpBaseService.remaining(projectId,limitListId,mrpBaseId));
}

View File

@ -42,6 +42,10 @@ public class BusPlanDocAssociationBo extends BaseEntity {
* 采购联系单id
*/
private Long docId;
/**
*
*/
private Long suppliespriceId;
/**
* 需求数量

View File

@ -0,0 +1,16 @@
package org.dromara.cailiaoshebei.domain.bo;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class RemainingReq implements Serializable {
private Long projectId;
private String limitListId;
private Long mrpBaseId;
}

View File

@ -140,4 +140,12 @@ public class BusMaterialbatchdemandplanVo implements Serializable {
*/
private BigDecimal remaining;
/**
* 供应商提供数量
*/
private BigDecimal tenderQuantity;
}

View File

@ -86,5 +86,5 @@ public interface IBusMrpBaseService extends IService<BusMrpBase>{
/**
* 获取物资已有数量
*/
Map<String, Object> remaining(Long projectId, String suppliespriceName, String specification, Long mrpBaseId);
Map<String, Object> remaining(Long projectId,Long limitListId,Long mrpBaseId);
}

View File

@ -24,10 +24,13 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.design.domain.BusBillofquantities;
import org.dromara.design.service.IBusBillofquantitiesService;
import org.dromara.tender.domain.BusBillofquantitiesLimitList;
import org.dromara.tender.domain.bo.BusBiddingPlanBo;
import org.dromara.tender.domain.vo.BusBiddingPlanVo;
import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo;
import org.dromara.tender.domain.vo.BusTenderPlanningLimitListVo;
import org.dromara.tender.service.IBusBiddingPlanService;
import org.dromara.tender.service.IBusBillofquantitiesLimitListService;
import org.dromara.tender.service.ITenderSupplierInputService;
import org.springframework.context.annotation.Lazy;
import org.springframework.beans.factory.annotation.Autowired;
@ -41,6 +44,7 @@ import org.dromara.cailiaoshebei.mapper.BusMaterialbatchdemandplanMapper;
import org.dromara.cailiaoshebei.service.IBusMaterialbatchdemandplanService;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
/**
@ -72,6 +76,9 @@ public class BusMaterialbatchdemandplanServiceImpl extends ServiceImpl<BusMateri
@Lazy
@Autowired
private IBusBillofquantitiesService busBillofquantitiesService;
@Lazy
@Autowired
private IBusBillofquantitiesLimitListService busBillofquantitiesLimitListService;
/**
* 查询物资-批次需求计划
@ -101,22 +108,26 @@ public class BusMaterialbatchdemandplanServiceImpl extends ServiceImpl<BusMateri
bo1.setType("3");
bo1.setWinningBidderId(bo.getSupplierId());
List<BusBillofquantitiesLimitListVo> busBiddingPlanVos = busBiddingPlanService.getBillofquantitiesLimitListVo(bo1);
Map<Long, BigDecimal> map = busBiddingPlanService.getCailiaoCount(bo1);
if (busBiddingPlanVos == null || busBiddingPlanVos.isEmpty()) {
throw new ServiceException("该供应商暂无材料");
}
Set<String> hashSet = new HashSet<>();
busBiddingPlanVos.stream().forEach(vo -> {
hashSet.add(vo.getName()+"+"+vo.getSpecification());
Set<Long> hashSet = new HashSet<>();
busBiddingPlanVos.forEach(vo -> {
hashSet.add(vo.getId());
});
List<BusMaterialbatchdemandplanVo> list = result.getRecords().stream().filter(vo -> {
String key = vo.getName() + "+" + vo.getSpecification(); // 拼接字符串(需与 Set 中格式一致)
return hashSet.contains(key); // 仅保留 Set 中存在的数据
}).toList();
result.setRecords(list);
result.getRecords().stream().filter(vo -> {
return hashSet.contains(vo.getSuppliespriceId()); // 仅保留 Set 中存在的数据
}).forEach(item->{
if (map.containsKey(item.getId())) {
item.setTenderQuantity(map.get(item.getId()));
}
});
}
result.getRecords().stream().forEach(vo -> {
result.getRecords().forEach(vo -> {
if (vo.getSuppliespricePid() != null){
BusBillofquantities billofquantities = busBillofquantitiesService.getById(vo.getSuppliespricePid());
BusBillofquantitiesLimitList billofquantities = busBillofquantitiesLimitListService.getById(vo.getSuppliespricePid());
vo.setSuppliespricePname(billofquantities.getName());
}
});

View File

@ -29,6 +29,10 @@ import lombok.RequiredArgsConstructor;
import org.dromara.common.utils.excel.ExcelDynamicReader;
import org.dromara.design.domain.BusBillofquantities;
import org.dromara.design.service.IBusBillofquantitiesService;
import org.dromara.tender.domain.BusBillofquantitiesLimitList;
import org.dromara.tender.domain.BusTenderPlanningLimitList;
import org.dromara.tender.service.IBusBillofquantitiesLimitListService;
import org.dromara.tender.service.IBusTenderPlanningLimitListService;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
import org.dromara.cailiaoshebei.domain.bo.BusMrpBaseBo;
@ -57,7 +61,10 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
private final IBusMaterialbatchdemandplanService planservice;
private final IBusBillofquantitiesService busBillofquantitiesService;
private final IBusBillofquantitiesLimitListService busBillofquantitiesService;
private final IBusTenderPlanningLimitListService tenderPlanningLimitListService;
/**
@ -75,7 +82,7 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
planBo.setMrpBaseId(id);
List<BusMaterialbatchdemandplanVo> voList = planservice.queryList(planBo);
for (BusMaterialbatchdemandplanVo vo : voList) {
Map<String, Object> map = remaining(vo.getProjectId(),vo.getName(), vo.getSpecification(), id);
Map<String, Object> map = remaining(vo.getProjectId(), vo.getSuppliespriceId(), id);
vo.setRemaining(Convert.toBigDecimal(map.get("remainingQuantity")));
}
busMrpVo.setMrpBaseBo(busMrpBaseVo);
@ -190,14 +197,13 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
if (CollectionUtil.isNotEmpty(dto.getPlanList())) {
// 按 suppliespriceId 分组统计本次提交的数量
Map<String, BigDecimal> batchSumMap = dto.getPlanList().stream()
// String name = item.getName() != null ? item.getName() : "";
// String spec = item.getSpecification() != null ? item.getSpecification() : "";
// return name + "&&&" + spec;
Map<Long, BigDecimal> batchSumMap = dto.getPlanList().stream()
.collect(Collectors.groupingBy(
// 关键修改:使用 name + specification 拼接作为分组键
item -> {
String name = item.getName() != null ? item.getName() : "";
String spec = item.getSpecification() != null ? item.getSpecification() : "";
return name + "&&&" + spec;
},
BusMaterialbatchdemandplanBo::getSuppliespriceId,
Collectors.reducing(
BigDecimal.ZERO,
item -> {
@ -209,45 +215,36 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
));
// 检查每种物料是否超出数量限制
for (Map.Entry<String, BigDecimal> entry : batchSumMap.entrySet()) {
String biaoshi = entry.getKey();
for (Map.Entry<Long, BigDecimal> entry : batchSumMap.entrySet()) {
Long biaoshi = entry.getKey();
BigDecimal batchSum = entry.getValue();
String[] split = biaoshi.split("&&&");
// 获取数据库中已有的数量
List<BusMaterialbatchdemandplan> existingList = planservice.list(
Wrappers.lambdaQuery(BusMaterialbatchdemandplan.class)
.eq(BusMaterialbatchdemandplan::getName, split[0])
.eq(BusMaterialbatchdemandplan::getSpecification,split[1])
.eq(BusMaterialbatchdemandplan::getSuppliespriceId, biaoshi)
.ne(BusMaterialbatchdemandplan::getMrpBaseId, convert.getId()) // 排除当前批次
);
//计算数据库保存数量
BigDecimal existingSum = existingList.stream()
.map(BusMaterialbatchdemandplan::getDemandQuantity)
.reduce(BigDecimal.ZERO, BigDecimal::add);
// 检查总数量是否超出限制
List<BusBillofquantities> busBillofquantities = busBillofquantitiesService.getBaseMapper().selectList(new LambdaQueryWrapper<BusBillofquantities>()
.eq(BusBillofquantities::getProjectId, dto.getMrpBaseBo().getProjectId())
.eq(BusBillofquantities::getName, split[0])
.eq(BusBillofquantities::getSpecification, split[1]));
BigDecimal quantity = busBillofquantities.stream()
.map(BusBillofquantities::getQuantity)
List<BusTenderPlanningLimitList> busTenderPlanningLimitLists = tenderPlanningLimitListService.getBaseMapper()
.selectList(new LambdaQueryWrapper<BusTenderPlanningLimitList>()
.eq(BusTenderPlanningLimitList::getLimitListId, biaoshi));
BigDecimal quantity = busTenderPlanningLimitLists.stream()
.map(BusTenderPlanningLimitList::getNum)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
if (existingSum.add(batchSum).compareTo(quantity) > 0) {
// 找到超出限制的物料名称用于提示
String itemName = dto.getPlanList().stream()
.filter(item -> {
String name = item.getName() != null ? item.getName() : "";
String spec = item.getSpecification() != null ? item.getSpecification() : "";
return (name + "&&&" + spec).equals(biaoshi);
})
.filter(item -> Objects.equals(biaoshi, item.getSuppliespriceId()))
.findFirst()
.map(item -> {
String name = item.getName() != null ? item.getName() : "";
String spec = item.getSpecification() != null ? item.getSpecification() : "";
return "名称:“"+name + "”,规格:“" + spec+"";
return "名称:“"+name + "";
})
.orElse("未知物料");
throw new ServiceException(itemName + "超出数量");
@ -257,11 +254,11 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
// 转换并保存数据
List<BusMaterialbatchdemandplan> plans = MapstructUtils.convert(dto.getPlanList(), BusMaterialbatchdemandplan.class);
plans.forEach(item -> {
// BusBillofquantities byId = busBillofquantitiesService.getById(item.getSuppliespriceId());
// if (!"0".equals(byId.getPid())) {
// BusBillofquantities one = busBillofquantitiesService.getOne(new LambdaQueryWrapper<BusBillofquantities>().eq(BusBillofquantities::getSid, byId.getPid()));
// item.setSuppliespricePid(one.getId());
// }
BusBillofquantitiesLimitList byId = busBillofquantitiesService.getById(item.getSuppliespriceId());
if (!"0".equals(byId.getPid())) {
BusBillofquantitiesLimitList one = busBillofquantitiesService.getOne(new LambdaQueryWrapper<BusBillofquantitiesLimitList>().eq(BusBillofquantitiesLimitList::getSid, byId.getPid()));
item.setSuppliespricePid(one.getId());
}
item.setMrpBaseId(convert.getId());
item.setProjectId(convert.getProjectId());
});
@ -297,23 +294,21 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
@Override
public Map<String, Object> remaining(Long projectId, String suppliespriceName, String specification, Long mrpBaseId) {
public Map<String, Object> remaining(Long projectId, Long limitListId,Long mrpBaseId) {
Map<String, Object> map = new HashMap<>();
List<BusBillofquantities> busBillofquantities = busBillofquantitiesService.getBaseMapper()
.selectList(new LambdaQueryWrapper<BusBillofquantities>()
.eq(BusBillofquantities::getProjectId, projectId)
.eq(BusBillofquantities::getName, suppliespriceName)
.eq(BusBillofquantities::getSpecification,specification));
BigDecimal quantity = busBillofquantities.stream()
.map(BusBillofquantities::getQuantity)
List<BusTenderPlanningLimitList> busTenderPlanningLimitLists = tenderPlanningLimitListService.getBaseMapper()
.selectList(new LambdaQueryWrapper<BusTenderPlanningLimitList>()
.eq(BusTenderPlanningLimitList::getLimitListId, limitListId));
BigDecimal quantity = busTenderPlanningLimitLists.stream()
.map(BusTenderPlanningLimitList::getNum)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
// BusBillofquantities byId = busBillofquantitiesService.getById(suppliespriceId);
BusBillofquantitiesLimitList busBillofquantities = busBillofquantitiesService.getById(limitListId);
// 获取数据库中已有的数量
List<BusMaterialbatchdemandplan> existingList = planservice.list(
Wrappers.lambdaQuery(BusMaterialbatchdemandplan.class)
.eq(BusMaterialbatchdemandplan::getName, suppliespriceName)
.eq(BusMaterialbatchdemandplan::getSpecification ,specification)
.eq(BusMaterialbatchdemandplan::getSuppliespriceId ,limitListId)
.ne(mrpBaseId!=null,BusMaterialbatchdemandplan::getMrpBaseId, mrpBaseId)// 排除当前批次
);
BigDecimal reduce = BigDecimal.ZERO;
@ -323,10 +318,11 @@ public class BusMrpBaseServiceImpl extends ServiceImpl<BusMrpBaseMapper, BusMrpB
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
map.put("remainingQuantity",quantity.subtract(reduce));
map.put("specification",busBillofquantities.getFirst().getSpecification());
map.put("unit",busBillofquantities.getFirst().getUnit());
map.put("remark",busBillofquantities.getFirst().getRemark());
map.put("name",busBillofquantities.getFirst().getName());
map.put("specification",busBillofquantities.getSpecification());
map.put("suppliespriceId",limitListId);
map.put("unit",busBillofquantities.getUnit());
map.put("remark",busBillofquantities.getRemark());
map.put("name",busBillofquantities.getName());
return map;
}

View File

@ -51,6 +51,8 @@ import org.dromara.project.domain.BusProject;
import org.dromara.project.service.IBusProjectService;
import org.dromara.system.domain.vo.SysOssVo;
import org.dromara.system.service.ISysOssService;
import org.dromara.tender.domain.BusTenderPlanningLimitList;
import org.dromara.tender.service.IBusTenderPlanningLimitListService;
import org.springframework.beans.BeanUtils;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
@ -98,6 +100,8 @@ public class BusPurchaseDocServiceImpl extends ServiceImpl<BusPurchaseDocMapper,
private final ISysOssService ossService;
private final IBusTenderPlanningLimitListService tenderPlanningLimitListService;
/**
* 查询物资-采购联系单
*
@ -187,7 +191,7 @@ public class BusPurchaseDocServiceImpl extends ServiceImpl<BusPurchaseDocMapper,
BusPurchaseDoc add = MapstructUtils.convert(bo, BusPurchaseDoc.class);
validEntityBeforeSave(add);
validNum(bo.getAssociationList());
validNum(bo.getAssociationList(),add.getSupplierId());
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
@ -204,20 +208,60 @@ public class BusPurchaseDocServiceImpl extends ServiceImpl<BusPurchaseDocMapper,
}
public void validNum(List<BusPlanDocAssociationBo> associationList) {
public void validNum(List<BusPlanDocAssociationBo> associationList, Long supplierId) {
for (BusPlanDocAssociationBo association : associationList) {
//获取批次需求计划
BusMaterialbatchdemandplan byId = materialbatchdemandplanService.getById(association.getPlanId());
List<String> statuss = new ArrayList<>();
statuss.add(BusinessStatusEnum.DRAFT.getStatus());
statuss.add(BusinessStatusEnum.FINISH.getStatus());
statuss.add(BusinessStatusEnum.WAITING.getStatus());
//查询处于草稿、待审核、已审核状态的联系单
List<Long> ids = new ArrayList<>();
//该供应商的联系单
List<Long> ids1 = new ArrayList<>();
for (BusPurchaseDoc busPurchaseDoc : baseMapper.selectList(new LambdaQueryWrapper<BusPurchaseDoc>().in(BusPurchaseDoc::getStatus, statuss))) {
ids.add(busPurchaseDoc.getId());
if (busPurchaseDoc.getSupplierId().equals(supplierId)) {
ids1.add(busPurchaseDoc.getId());
}
}
List<BusTenderPlanningLimitList> busTenderPlanningLimitLists = tenderPlanningLimitListService.getBaseMapper()
.selectList(new LambdaQueryWrapper<BusTenderPlanningLimitList>()
.eq(BusTenderPlanningLimitList::getLimitListId, association.getSuppliespriceId()));
BigDecimal quantity = busTenderPlanningLimitLists.stream()
.map(BusTenderPlanningLimitList::getNum)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
//查询处于这些采购联系单
List<BusPlanDocAssociation> list = planDocAssociationService.list(Wrappers.lambdaQuery(BusPlanDocAssociation.class)
.eq(BusPlanDocAssociation::getPlanId, association.getPlanId()));
.eq(BusPlanDocAssociation::getPlanId, association.getPlanId())
.in(BusPlanDocAssociation::getDocId, ids));
List<BusMaterialbatchdemandplan> busMaterialbatchdemandplans = materialbatchdemandplanService.getBaseMapper().selectList(new LambdaQueryWrapper<BusMaterialbatchdemandplan>()
.eq(BusMaterialbatchdemandplan::getSuppliespriceId, association.getSuppliespriceId()));
Set<Long> planids = new HashSet<>();
busMaterialbatchdemandplans.forEach(busMaterialbatchdemandplan -> {
planids.add(busMaterialbatchdemandplan.getId());
});
if (!ids1.isEmpty()){
List<BusPlanDocAssociation> list1 = planDocAssociationService.list(Wrappers.lambdaQuery(BusPlanDocAssociation.class)
.in(BusPlanDocAssociation::getDocId, ids1));
//计算材料已存在的数量
BigDecimal cltotal = list1.stream()
.filter(Objects::nonNull)
.filter(item->planids.contains(item.getPlanId()))
.map(BusPlanDocAssociation::getDemandQuantity)
.reduce(BigDecimal.ZERO, BigDecimal::add);
if (cltotal.add(association.getDemandQuantity()).compareTo(quantity) > 0) {
throw new ServiceException("材料:" + byId.getName() + "已超出供应商提供数量");
}
}
//计算采购已存在的数量
BigDecimal total = list.stream()
.map(BusPlanDocAssociation::getDemandQuantity)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
if (total.add(association.getDemandQuantity()).compareTo(byId.getDemandQuantity()) > 0) {
throw new ServiceException("材料:" + byId.getName() + "已超出计划单的物料批次需求计划数量");
}

View File

@ -1,9 +1,10 @@
package org.dromara.drone.domain;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
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;
@ -27,11 +28,6 @@ public class DroDroneConfig extends BaseEntity {
@TableId(value = "id")
private Long id;
/**
* 项目id
*/
private Long projectId;
/**
* 无人机服务地址
*/

View File

@ -32,12 +32,6 @@ public class DroDroneConfigBo extends BaseEntity {
@NotNull(message = "主键id不能为空", groups = {EditGroup.class})
private Long id;
/**
* 项目id
*/
@NotNull(message = "项目id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long projectId;
/**
* 无人机服务地址
*/

View File

@ -71,7 +71,6 @@ public class DroDroneConfigServiceImpl implements IDroDroneConfigService {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<DroDroneConfig> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(DroDroneConfig::getId);
lqw.eq(bo.getProjectId() != null, DroDroneConfig::getProjectId, bo.getProjectId());
return lqw;
}

View File

@ -6,8 +6,6 @@ import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
@ -79,7 +77,7 @@ public class FacPhotovoltaicPanelController extends BaseController {
@Log(title = "设施-光伏板", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Long> add(@Validated(AddGroup.class) @RequestBody FacPhotovoltaicPanelCreateReq req) {
public R<Long> add(@Validated @RequestBody FacPhotovoltaicPanelCreateReq req) {
return R.ok(facPhotovoltaicPanelService.insertByBo(req));
}
@ -101,7 +99,7 @@ public class FacPhotovoltaicPanelController extends BaseController {
@Log(title = "设施-光伏板", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody FacPhotovoltaicPanelUpdateReq req) {
public R<Void> edit(@Validated @RequestBody FacPhotovoltaicPanelUpdateReq req) {
return toAjax(facPhotovoltaicPanelService.updateByBo(req));
}

View File

@ -1,5 +1,7 @@
package org.dromara.facility.domain.dto.photovoltaicpanel;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
@ -26,9 +28,16 @@ public class FacPhotovoltaicPanelCreateReq implements Serializable {
*/
private Long matrixId;
/**
* 进度类别id
*/
@NotNull(message = "进度类别id不能为空")
private Long progressCategoryId;
/**
* 光伏板名称
*/
@NotBlank(message = "光伏板名称不能为空")
private String name;
/**
@ -36,19 +45,4 @@ public class FacPhotovoltaicPanelCreateReq implements Serializable {
*/
private List<List<String>> positionList;
/**
* 完成状态0未开始 1进行中 2完成
*/
private String status;
/**
* 完成类型1手动填报 2AI填报
*/
private String finishType;
/**
* 备注
*/
private String remark;
}

View File

@ -849,7 +849,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
photovoltaicPanelPointService.updateFinishNumberByCoordinate(projectIds, matchPoints);
} else if (type.equals(RecognizerTypeEnum.PILE.getValue())) {
photovoltaicPanelColumnService.updateFinishNumberByCoordinate(projectIds, matchPoints);
} else if (type.equals(RecognizerTypeEnum.SHELVES.getValue())) {
} else if (type.equals(RecognizerTypeEnum.BRACKET.getValue())) {
photovoltaicPanelSupportService.updateFinishNumberByCoordinate(projectIds, matchPoints);
}
}
@ -880,7 +880,7 @@ public class FacPhotovoltaicPanelPartsServiceImpl implements IFacPhotovoltaicPan
return list.stream().map(column ->
new IdCoordinatePoint(column.getId(), column.getPositions())).toList();
}
} else if (type.equals(RecognizerTypeEnum.SHELVES.getValue())) {
} else if (type.equals(RecognizerTypeEnum.BRACKET.getValue())) {
List<FacPhotovoltaicPanelSupport> list = photovoltaicPanelSupportService.lambdaQuery()
.in(FacPhotovoltaicPanelSupport::getProjectId, projectIds)
.ne(FacPhotovoltaicPanelSupport::getStatus, FacFinishStatusEnum.FINISH.getValue())

View File

@ -23,10 +23,7 @@ import org.dromara.facility.constant.FacRedisKeyConstant;
import org.dromara.facility.domain.FacMatrix;
import org.dromara.facility.domain.FacPhotovoltaicPanel;
import org.dromara.facility.domain.dto.geojson.*;
import org.dromara.facility.domain.dto.photovoltaicpanel.FacPhotovoltaicPanelCreateByGeoJsonReq;
import org.dromara.facility.domain.dto.photovoltaicpanel.FacPhotovoltaicPanelCreateReq;
import org.dromara.facility.domain.dto.photovoltaicpanel.FacPhotovoltaicPanelQueryReq;
import org.dromara.facility.domain.dto.photovoltaicpanel.FacPhotovoltaicPanelUpdateReq;
import org.dromara.facility.domain.dto.photovoltaicpanel.*;
import org.dromara.facility.domain.enums.FacFinishStatusEnum;
import org.dromara.facility.domain.enums.FacFinishTypeEnum;
import org.dromara.facility.domain.vo.photovoltaicpanel.FacPhotovoltaicPanelVo;
@ -152,6 +149,7 @@ public class FacPhotovoltaicPanelServiceImpl extends ServiceImpl<FacPhotovoltaic
* @return 新增光伏板id
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Long insertByBo(FacPhotovoltaicPanelCreateReq req) {
// 将实体类和 DTO 进行转换
FacPhotovoltaicPanel photovoltaicPanel = new FacPhotovoltaicPanel();
@ -162,8 +160,19 @@ public class FacPhotovoltaicPanelServiceImpl extends ServiceImpl<FacPhotovoltaic
String positionStr = JSONUtil.toJsonStr(positionList);
photovoltaicPanel.setPositions(positionStr);
}
Long progressCategoryId = req.getProgressCategoryId();
PgsProgressCategory category = progressCategoryService.getById(progressCategoryId);
if (category == null) {
throw new ServiceException("对应进度类别不存在", HttpStatus.NOT_FOUND);
}
// 填入默认值
photovoltaicPanel.setProjectId(category.getProjectId());
photovoltaicPanel.setMatrixId(category.getMatrixId());
photovoltaicPanel.setProgressCategoryId(progressCategoryId);
photovoltaicPanel.setProgressCategoryName(category.getName());
photovoltaicPanel.setRemark("手动添加");
// 数据校验
validEntityBeforeSave(photovoltaicPanel, true);
validEntityBeforeSave(photovoltaicPanel);
// 判断是否存在同名光伏板
Long count = this.lambdaQuery()
.eq(FacPhotovoltaicPanel::getProjectId, photovoltaicPanel.getProjectId())
@ -177,6 +186,14 @@ public class FacPhotovoltaicPanelServiceImpl extends ServiceImpl<FacPhotovoltaic
if (!save) {
throw new ServiceException("新增光伏板失败,数据库异常", HttpStatus.ERROR);
}
// 修改进度类别数量
PgsProgressCategory updateCategory = new PgsProgressCategory();
updateCategory.setId(progressCategoryId);
updateCategory.setTotal(category.getTotal().add(BigDecimal.ONE));
boolean update = progressCategoryService.updateById(updateCategory);
if (!update) {
throw new ServiceException("修改进度类别数量失败,数据库异常", HttpStatus.ERROR);
}
return photovoltaicPanel.getId();
}
@ -599,7 +616,7 @@ public class FacPhotovoltaicPanelServiceImpl extends ServiceImpl<FacPhotovoltaic
photovoltaicPanel.setPositions(positionStr);
}
// 数据校验
validEntityBeforeSave(photovoltaicPanel, false);
validEntityBeforeSave(photovoltaicPanel);
// 判断是否存在
FacPhotovoltaicPanel oldPhotovoltaicPanel = this.getById(photovoltaicPanel.getId());
if (oldPhotovoltaicPanel == null) {
@ -626,24 +643,8 @@ public class FacPhotovoltaicPanelServiceImpl extends ServiceImpl<FacPhotovoltaic
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(FacPhotovoltaicPanel entity, Boolean create) {
private void validEntityBeforeSave(FacPhotovoltaicPanel entity) {
// TODO 做一些数据校验,如唯一约束
Long projectId = entity.getProjectId();
Long matrixId = entity.getMatrixId();
if (create) {
if (projectId == null) {
throw new ServiceException("项目id不能为空", HttpStatus.BAD_REQUEST);
}
if (matrixId == null) {
throw new ServiceException("方阵id不能为空", HttpStatus.BAD_REQUEST);
}
}
if (projectId != null && projectService.getById(projectId) == null) {
throw new ServiceException("对应项目不存在", HttpStatus.NOT_FOUND);
}
if (matrixId != null && matrixService.getById(matrixId) == null) {
throw new ServiceException("对应方阵不存在", HttpStatus.NOT_FOUND);
}
}
/**

View File

@ -16,8 +16,9 @@ public enum RecognizerTypeEnum {
VEST("反光背心识别", "novest", ""),
SMOKING("吸烟识别", "smoking", "3"),
FIRE("火焰识别", "fire", "16"),
PHO("光伏板识别", "pho", ""),
SHELVES("光伏板支架识别", "shelves", ""),
SMOKE("烟雾识别","smoke",""),
SOLAR("光伏板识别", "solar", ""),
BRACKET("光伏板支架识别", "bracket", ""),
PILE("光伏板立柱识别", "pile", ""),
HOLE("", "hole", "");

View File

@ -1,26 +1,28 @@
package org.dromara.out.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 jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.out.domain.vo.OutConstructionValueVo;
import org.dromara.out.domain.bo.OutConstructionValueBo;
import org.dromara.out.service.IOutConstructionValueService;
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.out.domain.bo.OutConstructionValueBo;
import org.dromara.out.domain.vo.OutConstructionAllValueVo;
import org.dromara.out.domain.vo.OutConstructionValueVo;
import org.dromara.out.service.IOutConstructionValueService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 施工产值
@ -64,10 +66,19 @@ public class OutConstructionValueController extends BaseController {
@SaCheckPermission("out:constructionValue:query")
@GetMapping("/{id}")
public R<OutConstructionValueVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
@PathVariable Long id) {
return R.ok(outConstructionValueService.queryById(id));
}
/**
* 获取所有施工产值
*/
@SaCheckPermission("out:constructionValue:query")
@GetMapping("/allValue")
public R<OutConstructionAllValueVo> getAllValue(OutConstructionValueBo bo) {
return R.ok(outConstructionValueService.getAllValue(bo));
}
/**
* 新增施工产值
*/

View File

@ -16,6 +16,7 @@ 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.out.domain.bo.OutConstructionValueRangeBo;
import org.dromara.out.domain.vo.OutConstructionAllValueRangeVo;
import org.dromara.out.domain.vo.OutConstructionValueRangeVo;
import org.dromara.out.service.IOutConstructionValueRangeService;
import org.springframework.validation.annotation.Validated;
@ -81,6 +82,15 @@ public class OutConstructionValueRangeController extends BaseController {
return R.ok(outConstructionValueRangeService.queryById(id, true));
}
/**
* 获取所有施工产值范围
*/
@SaCheckPermission("out:constructionValueRange:query")
@GetMapping("/allValue")
public R<OutConstructionAllValueRangeVo> getAllValue(OutConstructionValueRangeBo bo) {
return R.ok(outConstructionValueRangeService.getAllValue(bo));
}
/**
* 新增施工产值范围

View File

@ -1,13 +1,13 @@
package org.dromara.out.domain.bo;
import org.dromara.out.domain.OutConstructionValue;
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 jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
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.out.domain.OutConstructionValue;
import java.math.BigDecimal;
import java.time.LocalDate;
@ -26,7 +26,7 @@ public class OutConstructionValueBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
@NotNull(message = "主键ID不能为空", groups = {EditGroup.class})
private Long id;
/**
@ -37,7 +37,7 @@ public class OutConstructionValueBo extends BaseEntity {
/**
* 项目ID
*/
@NotNull(message = "项目ID不能为空", groups = { AddGroup.class, EditGroup.class })
@NotNull(message = "项目ID不能为空", groups = {AddGroup.class, EditGroup.class})
private Long projectId;
/**
@ -53,13 +53,13 @@ public class OutConstructionValueBo extends BaseEntity {
/**
* 人工填报数量
*/
@NotNull(message = "人工填报数量不能为空", groups = { AddGroup.class, EditGroup.class })
@NotNull(message = "人工填报数量不能为空", groups = {AddGroup.class, EditGroup.class})
private Integer artificialNum;
/**
* 无人机识别数量
*/
@NotNull(message = "无人机识别数量不能为空", groups = { AddGroup.class, EditGroup.class })
@NotNull(message = "无人机识别数量不能为空", groups = {AddGroup.class, EditGroup.class})
private Integer uavNum;
/**
@ -70,7 +70,7 @@ public class OutConstructionValueBo extends BaseEntity {
/**
* 确认数量
*/
@NotNull(message = "确认数量不能为空", groups = { AddGroup.class, EditGroup.class })
@NotNull(message = "确认数量不能为空", groups = {AddGroup.class, EditGroup.class})
private Integer confirmNum;
/**
@ -86,7 +86,7 @@ public class OutConstructionValueBo extends BaseEntity {
/**
* 上报日期
*/
@NotNull(message = "上报日期不能为空", groups = { AddGroup.class, EditGroup.class })
@NotNull(message = "上报日期不能为空", groups = {AddGroup.class, EditGroup.class})
private LocalDate reportDate;
/**
@ -94,5 +94,20 @@ public class OutConstructionValueBo extends BaseEntity {
*/
private String auditStatus;
/**
* 计量方式0无 1数量 2百分比
*/
private String unitType;
/**
* 开始日期
*/
private LocalDate startDate;
/**
* 结束日期
*/
private LocalDate endDate;
}

View File

@ -0,0 +1,28 @@
package org.dromara.out.domain.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author lilemy
* @date 2025-10-11 15:10
*/
@Data
public class OutConstructionAllValueRangeVo implements Serializable {
@Serial
private static final long serialVersionUID = 1258889254649279094L;
/**
* 対乙产值
*/
private BigDecimal outValue;
/**
* 对甲产值
*/
private BigDecimal ownerValue;
}

View File

@ -0,0 +1,28 @@
package org.dromara.out.domain.vo;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* @author lilemy
* @date 2025-10-11 15:20
*/
@Data
public class OutConstructionAllValueVo implements Serializable {
@Serial
private static final long serialVersionUID = 250916682355050142L;
/**
* 対乙产值
*/
private BigDecimal outValue;
/**
* 对甲产值
*/
private BigDecimal ownerValue;
}

View File

@ -5,6 +5,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.out.domain.OutConstructionValueRange;
import org.dromara.out.domain.bo.OutConstructionValueRangeBo;
import org.dromara.out.domain.vo.OutConstructionAllValueRangeVo;
import org.dromara.out.domain.vo.OutConstructionValueRangeVo;
import java.util.Collection;
@ -68,4 +69,12 @@ public interface IOutConstructionValueRangeService extends IService<OutConstruct
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 获取所有施工范围产值
*
* @param bo 查询条件
* @return 所有施工范围产值
*/
OutConstructionAllValueRangeVo getAllValue(OutConstructionValueRangeBo bo);
}

View File

@ -1,12 +1,12 @@
package org.dromara.out.service;
import org.dromara.out.domain.vo.OutConstructionValueVo;
import org.dromara.out.domain.bo.OutConstructionValueBo;
import org.dromara.out.domain.OutConstructionValue;
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.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.out.domain.OutConstructionValue;
import org.dromara.out.domain.bo.OutConstructionValueBo;
import org.dromara.out.domain.vo.OutConstructionAllValueVo;
import org.dromara.out.domain.vo.OutConstructionValueVo;
import java.math.BigDecimal;
import java.util.Collection;
@ -18,7 +18,7 @@ import java.util.List;
* @author Lion Li
* @date 2025-07-30
*/
public interface IOutConstructionValueService extends IService<OutConstructionValue>{
public interface IOutConstructionValueService extends IService<OutConstructionValue> {
/**
* 查询施工产值
@ -77,5 +77,13 @@ public interface IOutConstructionValueService extends IService<OutConstructionVa
* @param projectId 项目id
* @return 项目施工完成值
*/
BigDecimal getCompleteValue(Long projectId,String month,String type);
BigDecimal getCompleteValue(Long projectId, String month, String type);
/**
* 获取施工所有产值
*
* @param bo 查询条件
* @return 施工所有产值
*/
OutConstructionAllValueVo getAllValue(OutConstructionValueBo bo);
}

View File

@ -21,6 +21,7 @@ import org.dromara.out.domain.OutConstructionValue;
import org.dromara.out.domain.OutConstructionValueRange;
import org.dromara.out.domain.bo.OutConstructionValueBo;
import org.dromara.out.domain.bo.OutConstructionValueRangeBo;
import org.dromara.out.domain.vo.OutConstructionAllValueRangeVo;
import org.dromara.out.domain.vo.OutConstructionValueRangeVo;
import org.dromara.out.mapper.OutConstructionValueRangeMapper;
import org.dromara.out.service.IOutConstructionValueRangeService;
@ -31,6 +32,11 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@ -102,9 +108,15 @@ public class OutConstructionValueRangeServiceImpl extends ServiceImpl<OutConstru
lqw.orderByDesc(OutConstructionValueRange::getId);
lqw.eq(bo.getProjectId() != null, OutConstructionValueRange::getProjectId, bo.getProjectId());
// 日期范围过滤
if (bo.getDate() != null) {
lqw.le(OutConstructionValueRange::getStartDate, bo.getDate()) // 开始时间 <= date
.ge(OutConstructionValueRange::getEndDate, bo.getDate()); // 结束时间 >= date
if (bo.getStartDate() != null) {
// 获取本周的星期一
LocalDate monday = bo.getStartDate().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
lqw.ge(OutConstructionValueRange::getStartDate, monday); // 开始时间 <= date
}
if (bo.getEndDate() != null) {
// 获取本周的星期日
LocalDate sunday = bo.getEndDate().with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
lqw.le(OutConstructionValueRange::getEndDate, sunday); // 结束时间 >= date
}
lqw.eq(StringUtils.isNotBlank(bo.getAuditStatus()), OutConstructionValueRange::getAuditStatus, bo.getAuditStatus());
return lqw;
@ -162,6 +174,31 @@ public class OutConstructionValueRangeServiceImpl extends ServiceImpl<OutConstru
return baseMapper.deleteByIds(ids) > 0;
}
/**
* 获取所有施工范围产值
*
* @param bo 查询条件
* @return 所有施工范围产值
*/
@Override
public OutConstructionAllValueRangeVo getAllValue(OutConstructionValueRangeBo bo) {
// 根据查询条件获取对应施工产值
LambdaQueryWrapper<OutConstructionValueRange> lqw = buildQueryWrapper(bo);
List<OutConstructionValueRangeVo> list = baseMapper.selectVoList(lqw);
OutConstructionAllValueRangeVo vo = new OutConstructionAllValueRangeVo();
// 统计对乙产值
BigDecimal outValue = list.stream().map(OutConstructionValueRangeVo::getOutValue)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.setScale(4, RoundingMode.HALF_UP);
vo.setOutValue(outValue);
// 统计对甲产值
BigDecimal ownerValue = list.stream().map(OutConstructionValueRangeVo::getOwnerValue)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.setScale(4, RoundingMode.HALF_UP);
vo.setOwnerValue(ownerValue);
return vo;
}
/**
* 总体流程监听(例如: 草稿,撤销,退回,作废,终止,已完成,单任务完成等)
* 正常使用只需#processEvent.flowCode=='leave1'

View File

@ -10,6 +10,7 @@ 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.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.facility.domain.FacMatrix;
@ -17,13 +18,16 @@ import org.dromara.facility.service.IFacMatrixService;
import org.dromara.out.domain.OutConstructionValue;
import org.dromara.out.domain.OutConstructionValueRange;
import org.dromara.out.domain.bo.OutConstructionValueBo;
import org.dromara.out.domain.vo.OutConstructionAllValueVo;
import org.dromara.out.domain.vo.OutConstructionValueVo;
import org.dromara.out.mapper.OutConstructionValueMapper;
import org.dromara.out.service.IOutConstructionValueRangeService;
import org.dromara.out.service.IOutConstructionValueService;
import org.dromara.progress.domain.PgsProgressCategory;
import org.dromara.progress.domain.dto.progressplandetail.PgsProgressPlanDetailCreateReq;
import org.dromara.progress.domain.vo.progresscategory.PgsProgressCategoryVo;
import org.dromara.progress.service.IPgsProgressCategoryService;
import org.dromara.progress.service.IPgsProgressPlanDetailService;
import org.dromara.project.domain.BusProject;
import org.dromara.project.domain.vo.project.BusProjectVo;
import org.dromara.project.service.IBusProjectService;
@ -31,10 +35,7 @@ import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* 施工产值Service业务层处理
@ -54,6 +55,8 @@ public class OutConstructionValueServiceImpl extends ServiceImpl<OutConstruction
private final IPgsProgressCategoryService pgsProgressCategoryService;
private final IPgsProgressPlanDetailService pgsProgressPlanDetailService;
private final IBusProjectService projectService;
private final IOutConstructionValueRangeService constructionValueRangeService;
@ -105,18 +108,17 @@ public class OutConstructionValueServiceImpl extends ServiceImpl<OutConstruction
LambdaQueryWrapper<OutConstructionValue> lqw = Wrappers.lambdaQuery();
lqw.orderByDesc(OutConstructionValue::getId);
Long projectId = bo.getProjectId();
List<Long> ids = new ArrayList<>();
if (projectId != null) {
// 获取子项目列表
List<BusProject> subProjectIds = projectService.lambdaQuery()
.eq(BusProject::getPId, projectId)
.list();
if (CollUtil.isNotEmpty(subProjectIds)) {
List<Long> ids = new ArrayList<>(subProjectIds.stream().map(BusProject::getId).toList());
ids.add(projectId);
lqw.in(OutConstructionValue::getProjectId, ids);
} else {
lqw.eq(OutConstructionValue::getProjectId, projectId);
}
ids = new ArrayList<>(subProjectIds.stream().map(BusProject::getId).toList());
ids.add(projectId);
}
if (CollUtil.isNotEmpty(ids)) {
lqw.in(OutConstructionValue::getProjectId, ids);
}
lqw.eq(bo.getMatrixId() != null, OutConstructionValue::getMatrixId, bo.getMatrixId());
lqw.eq(bo.getRangeId() != null, OutConstructionValue::getRangeId, bo.getRangeId());
@ -126,7 +128,24 @@ public class OutConstructionValueServiceImpl extends ServiceImpl<OutConstruction
lqw.eq(bo.getConfirmNum() != null, OutConstructionValue::getConfirmNum, bo.getConfirmNum());
lqw.eq(bo.getOutValue() != null, OutConstructionValue::getOutValue, bo.getOutValue());
lqw.eq(bo.getReportDate() != null, OutConstructionValue::getReportDate, bo.getReportDate());
lqw.ge(bo.getStartDate() != null, OutConstructionValue::getReportDate, bo.getStartDate());
lqw.le(bo.getEndDate() != null, OutConstructionValue::getReportDate, bo.getEndDate());
lqw.eq(bo.getCreateBy() != null, OutConstructionValue::getCreateBy, bo.getCreateBy());
// 新增根据 unit_type 查询的条件
if (StringUtils.isNotBlank(bo.getUnitType())) {
LambdaQueryWrapper<PgsProgressCategory> categoryLqw = new LambdaQueryWrapper<>();
categoryLqw.select(PgsProgressCategory::getId);
categoryLqw.eq(PgsProgressCategory::getUnitType, bo.getUnitType());
categoryLqw.eq(bo.getMatrixId() != null, PgsProgressCategory::getMatrixId, bo.getMatrixId());
if (CollUtil.isNotEmpty(ids)) {
categoryLqw.in(PgsProgressCategory::getProjectId, ids);
}
List<PgsProgressCategory> progressCategories = pgsProgressCategoryService.list(categoryLqw);
if (CollUtil.isNotEmpty(progressCategories)) {
List<Long> categoryIds = progressCategories.stream().map(PgsProgressCategory::getId).toList();
lqw.in(OutConstructionValue::getProgressCategoryId, categoryIds);
}
}
return lqw;
}
@ -169,20 +188,27 @@ public class OutConstructionValueServiceImpl extends ServiceImpl<OutConstruction
}
OutConstructionValue update = MapstructUtils.convert(bo, OutConstructionValue.class);
validEntityBeforeSave(update);
//计算产值
PgsProgressCategory progressCategory = pgsProgressCategoryService.getById(bo.getProgressCategoryId());
if (progressCategory != null) {
BigDecimal outValue = progressCategory.getConstructionPrice().multiply(BigDecimal.valueOf(bo.getConfirmNum())).setScale(4, RoundingMode.HALF_UP);
update.setOutValue(outValue);
BigDecimal ownerValue = progressCategory.getOwnerPrice().multiply(BigDecimal.valueOf(bo.getConfirmNum())).setScale(4, RoundingMode.HALF_UP);
update.setOwnerValue(ownerValue);
OutConstructionValueRange range = constructionValueRangeService.getById(old.getRangeId());
BigDecimal allOutValue = range.getOutValue();
BigDecimal allOwnerValue = range.getOwnerValue();
range.setOutValue(allOutValue.subtract(old.getOutValue()).add(outValue).setScale(4, RoundingMode.HALF_UP));
range.setOwnerValue(allOwnerValue.subtract(old.getOwnerValue()).add(ownerValue).setScale(4, RoundingMode.HALF_UP));
// 同步确认数量
BigDecimal confirmNum = BigDecimal.valueOf(bo.getConfirmNum());
if (StringUtils.isBlank(progressCategory.getWorkType())) {
if (confirmNum.compareTo(BigDecimal.valueOf(old.getArtificialNum())) != 0) {
PgsProgressPlanDetailCreateReq req = new PgsProgressPlanDetailCreateReq();
req.setId(old.getDetailId());
req.setFinishedNumber(confirmNum);
pgsProgressPlanDetailService.insertPercentageNumberDetail(req, false);
}
}
//计算产值
BigDecimal outValue = progressCategory.getConstructionPrice().multiply(confirmNum).setScale(4, RoundingMode.HALF_UP);
update.setOutValue(outValue);
BigDecimal ownerValue = progressCategory.getOwnerPrice().multiply(confirmNum).setScale(4, RoundingMode.HALF_UP);
update.setOwnerValue(ownerValue);
OutConstructionValueRange range = constructionValueRangeService.getById(old.getRangeId());
BigDecimal allOutValue = range.getOutValue();
BigDecimal allOwnerValue = range.getOwnerValue();
range.setOutValue(allOutValue.subtract(old.getOutValue()).add(outValue).setScale(4, RoundingMode.HALF_UP));
range.setOwnerValue(allOwnerValue.subtract(old.getOwnerValue()).add(ownerValue).setScale(4, RoundingMode.HALF_UP));
return baseMapper.updateById(update) > 0;
}
@ -223,6 +249,31 @@ public class OutConstructionValueServiceImpl extends ServiceImpl<OutConstruction
return completeValue;
}
/**
* 获取施工所有产值
*
* @param bo 查询条件
* @return 施工所有产值
*/
@Override
public OutConstructionAllValueVo getAllValue(OutConstructionValueBo bo) {
// 根据查询条件获取对应施工产值
LambdaQueryWrapper<OutConstructionValue> lqw = buildQueryWrapper(bo);
List<OutConstructionValueVo> list = baseMapper.selectVoList(lqw);
OutConstructionAllValueVo vo = new OutConstructionAllValueVo();
// 统计对乙产值
BigDecimal outValue = list.stream().map(OutConstructionValueVo::getOutValue)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.setScale(4, RoundingMode.HALF_UP);
vo.setOutValue(outValue);
// 统计对甲产值
BigDecimal ownerValue = list.stream().map(OutConstructionValueVo::getOwnerValue)
.reduce(BigDecimal.ZERO, BigDecimal::add)
.setScale(4, RoundingMode.HALF_UP);
vo.setOwnerValue(ownerValue);
return vo;
}
/**
* 补充数据
*/
@ -230,7 +281,7 @@ public class OutConstructionValueServiceImpl extends ServiceImpl<OutConstruction
for (OutConstructionValueVo vo : list) {
getName(vo);
}
list.sort(Comparator.comparing(OutConstructionValueVo::getProgressCategoryName, Comparator.nullsLast(String::compareTo)));
}
public void getName(OutConstructionValueVo vo) {

View File

@ -367,6 +367,28 @@ public class PgsProgressCategoryController extends BaseController {
return toAjax(pgsProgressCategoryService.insertByReq(req));
}
/**
* 新增设施进度类别
*/
@SaCheckPermission("progress:progressCategory:add")
@Log(title = "进度类别", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/facility")
public R<Void> insertFacility(@Validated @RequestBody PgsProgressCategoryCreateFacilityReq req) {
return toAjax(pgsProgressCategoryService.insertFacility(req));
}
/**
* 批量新增设施进度类别
*/
@SaCheckPermission("progress:progressCategory:add")
@Log(title = "进度类别", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/batch/facility")
public R<Void> insertFacility(@Validated @RequestBody PgsProgressCategoryCreateBatchFacilityReq req) {
return toAjax(pgsProgressCategoryService.insertBatchFacility(req));
}
/**
* 修改进度类别
*/

View File

@ -56,7 +56,7 @@ public class PgsProgressPlanDetailController extends BaseController {
@RepeatSubmit()
@PostMapping("/insert/percentage")
public R<Void> insertPercentageDetail(@Validated @RequestBody PgsProgressPlanDetailCreateReq req) {
return toAjax(pgsProgressPlanDetailService.insertPercentageNumberDetail(req));
return toAjax(pgsProgressPlanDetailService.insertPercentageNumberDetail(req, true));
}
/**

View File

@ -57,7 +57,7 @@ public class PgsProgressPlanDetailAppController extends BaseController {
@RepeatSubmit()
@PostMapping("/insert")
public R<Void> insertDetail(@Validated @RequestBody PgsProgressPlanDetailCreateReq req) {
return toAjax(progressPlanDetailService.insertPercentageNumberDetail(req));
return toAjax(progressPlanDetailService.insertPercentageNumberDetail(req, true));
}
/**

View File

@ -0,0 +1,32 @@
package org.dromara.progress.domain.dto.progresscategory;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025-10-11 14:25
*/
@Data
public class PgsProgressCategoryCreateBatchFacilityReq implements Serializable {
@Serial
private static final long serialVersionUID = -1134967798239895738L;
/**
* 进度类别id
*/
@NotNull(message = "进度类别id不能为空")
private Long progressCategoryId;
/**
* 设施数量
*/
@NotNull(message = "设施数量不能为空")
@Min(value = 1, message = "设施数量不能小于1")
private Integer number;
}

View File

@ -0,0 +1,31 @@
package org.dromara.progress.domain.dto.progresscategory;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* @author lilemy
* @date 2025-10-11 11:32
*/
@Data
public class PgsProgressCategoryCreateFacilityReq implements Serializable {
@Serial
private static final long serialVersionUID = -89082568070992741L;
/**
* 进度类别id
*/
@NotNull(message = "进度类别id不能为空")
private Long progressCategoryId;
/**
* 设施名称
*/
@NotBlank(message = "设施名称不能为空")
private String name;
}

View File

@ -196,4 +196,20 @@ public interface IPgsProgressCategoryService extends IService<PgsProgressCategor
* @return 未完成数量
*/
BigDecimal getUnFinishNumber(Long id);
/**
* 新增设施
*
* @param req 设施信息
* @return 是否新增成功
*/
Boolean insertFacility(PgsProgressCategoryCreateFacilityReq req);
/**
* 批量新增设施批量
*
* @param req 设施信息
* @return 是否新增成功
*/
Boolean insertBatchFacility(PgsProgressCategoryCreateBatchFacilityReq req);
}

View File

@ -46,7 +46,7 @@ public interface IPgsProgressPlanDetailService extends IService<PgsProgressPlanD
* @param req 插入进度计划详情设施参数
* @return 是否插入成功
*/
Boolean insertPercentageNumberDetail(PgsProgressPlanDetailCreateReq req);
Boolean insertPercentageNumberDetail(PgsProgressPlanDetailCreateReq req, Boolean isCheckout);
/**
* 分页查询进度计划详情已完成设施列表

View File

@ -46,6 +46,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
@ -1497,4 +1498,329 @@ public class PgsProgressCategoryServiceImpl extends ServiceImpl<PgsProgressCateg
return total.subtract(completed);
}
/**
* 新增设施
*
* @param req 设施信息
* @return 是否新增成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertFacility(PgsProgressCategoryCreateFacilityReq req) {
Long progressCategoryId = req.getProgressCategoryId();
PgsProgressCategory category = this.getById(progressCategoryId);
if (category == null) {
throw new ServiceException("对应进度类别不存在", HttpStatus.NOT_FOUND);
}
// 根据类别,新增对应的设施
String workType = category.getWorkType();
String type = workType.split("_")[0];
// 获取当前日期
LocalDate today = LocalDate.now();
// 定义格式化器yyyyMMdd
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
// 格式化日期
String formattedDate = today.format(formatter);
Long projectId = category.getProjectId();
Long matrixId = category.getMatrixId();
String name = category.getName();
boolean isSave;
switch (type) {
case PgsProgressCategoryConstant.PHOTOVOLTAIC_PANEL_WORK_TYPE -> {
// 获取当天已创建的设施数量
Long count = photovoltaicPanelService.lambdaQuery()
.eq(FacPhotovoltaicPanel::getProjectId, projectId)
.eq(FacPhotovoltaicPanel::getMatrixId, matrixId)
.eq(FacPhotovoltaicPanel::getProgressCategoryId, progressCategoryId)
.likeRight(FacPhotovoltaicPanel::getName, formattedDate)
.count();
// 封装数据
FacPhotovoltaicPanel panel = new FacPhotovoltaicPanel();
panel.setProjectId(projectId);
panel.setMatrixId(matrixId);
panel.setName(formattedDate + "." + (count + 1));
panel.setProgressCategoryId(progressCategoryId);
panel.setProgressCategoryName(name);
panel.setRemark("手动添加");
isSave = photovoltaicPanelService.save(panel);
}
case PgsProgressCategoryConstant.INVERTER_WORK_TYPE -> {
// 获取当天已创建的设施数量
Long count = inverterService.lambdaQuery()
.eq(FacInverter::getProjectId, projectId)
.eq(FacInverter::getMatrixId, matrixId)
.eq(FacInverter::getProgressCategoryId, progressCategoryId)
.likeRight(FacInverter::getName, formattedDate)
.count();
// 封装数据
FacInverter inverter = new FacInverter();
inverter.setProjectId(projectId);
inverter.setMatrixId(matrixId);
inverter.setName(formattedDate + "." + (count + 1));
inverter.setProgressCategoryId(progressCategoryId);
inverter.setProgressCategoryName(name);
inverter.setRemark("手动添加");
isSave = inverterService.save(inverter);
}
case PgsProgressCategoryConstant.BOX_TRANSFORMER_WORK_TYPE -> {
// 获取当天已创建的设施数量
Long count = boxTransformerService.lambdaQuery()
.eq(FacBoxTransformer::getProjectId, projectId)
.eq(FacBoxTransformer::getMatrixId, matrixId)
.eq(FacBoxTransformer::getProgressCategoryId, progressCategoryId)
.likeRight(FacBoxTransformer::getName, formattedDate)
.count();
// 封装数据
FacBoxTransformer boxTransformer = new FacBoxTransformer();
boxTransformer.setProjectId(projectId);
boxTransformer.setMatrixId(matrixId);
boxTransformer.setName(formattedDate + "." + (count + 1));
boxTransformer.setProgressCategoryId(progressCategoryId);
boxTransformer.setProgressCategoryName(name);
boxTransformer.setRemark("手动添加");
isSave = boxTransformerService.save(boxTransformer);
}
case PgsProgressCategoryConstant.PHOTOVOLTAIC_PANEL_POINT_WORK_TYPE -> {
// 获取当天已创建的设施数量
Long count = photovoltaicPanelPointService.lambdaQuery()
.eq(FacPhotovoltaicPanelPoint::getProjectId, projectId)
.eq(FacPhotovoltaicPanelPoint::getMatrixId, matrixId)
.eq(FacPhotovoltaicPanelPoint::getProgressCategoryId, progressCategoryId)
.likeRight(FacPhotovoltaicPanelPoint::getName, formattedDate)
.count();
// 封装数据
FacPhotovoltaicPanelPoint point = new FacPhotovoltaicPanelPoint();
point.setProjectId(projectId);
point.setMatrixId(matrixId);
point.setName(formattedDate + "." + (count + 1));
point.setProgressCategoryId(progressCategoryId);
point.setProgressCategoryName(name);
point.setRemark("手动添加");
isSave = photovoltaicPanelPointService.save(point);
}
case PgsProgressCategoryConstant.PHOTOVOLTAIC_PANEL_COLUMN_WORK_TYPE -> {
// 获取当天已创建的设施数量
Long count = photovoltaicPanelColumnService.lambdaQuery()
.eq(FacPhotovoltaicPanelColumn::getProjectId, projectId)
.eq(FacPhotovoltaicPanelColumn::getMatrixId, matrixId)
.eq(FacPhotovoltaicPanelColumn::getProgressCategoryId, progressCategoryId)
.likeRight(FacPhotovoltaicPanelColumn::getName, formattedDate)
.count();
// 封装数据
FacPhotovoltaicPanelColumn column = new FacPhotovoltaicPanelColumn();
column.setProjectId(projectId);
column.setMatrixId(matrixId);
column.setName(formattedDate + "." + (count + 1));
column.setProgressCategoryId(progressCategoryId);
column.setProgressCategoryName(name);
column.setRemark("手动添加");
isSave = photovoltaicPanelColumnService.save(column);
}
case PgsProgressCategoryConstant.PHOTOVOLTAIC_PANEL_SUPPORT_WORK_TYPE -> {
// 获取当天已创建的设施数量
Long count = photovoltaicPanelSupportService.lambdaQuery()
.eq(FacPhotovoltaicPanelSupport::getProjectId, projectId)
.eq(FacPhotovoltaicPanelSupport::getMatrixId, matrixId)
.eq(FacPhotovoltaicPanelSupport::getProgressCategoryId, progressCategoryId)
.likeRight(FacPhotovoltaicPanelSupport::getName, formattedDate)
.count();
// 封装数据
FacPhotovoltaicPanelSupport support = new FacPhotovoltaicPanelSupport();
support.setProjectId(projectId);
support.setMatrixId(matrixId);
support.setName(formattedDate + "." + (count + 1));
support.setProgressCategoryId(progressCategoryId);
support.setProgressCategoryName(name);
support.setRemark("手动添加");
isSave = photovoltaicPanelSupportService.save(support);
}
case null, default -> throw new ServiceException("不支持的设施类型", HttpStatus.BAD_REQUEST);
}
if (!isSave) {
throw new ServiceException("添加设施失败,数据库异常", HttpStatus.ERROR);
}
// 更新进度类别数量
PgsProgressCategory updateCategory = new PgsProgressCategory();
updateCategory.setId(progressCategoryId);
updateCategory.setTotal(category.getTotal().add(BigDecimal.ONE));
boolean update = this.updateById(updateCategory);
if (!update) {
throw new ServiceException("修改进度类别数量失败,数据库异常", HttpStatus.ERROR);
}
return true;
}
/**
* 批量新增设施批量
*
* @param req 设施信息
* @return 是否新增成功
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertBatchFacility(PgsProgressCategoryCreateBatchFacilityReq req) {
Long progressCategoryId = req.getProgressCategoryId();
Integer number = req.getNumber();
PgsProgressCategory category = this.getById(progressCategoryId);
if (category == null) {
throw new ServiceException("对应进度类别不存在", HttpStatus.NOT_FOUND);
}
// 根据类别,新增对应的设施
String workType = category.getWorkType();
String type = workType.split("_")[0];
// 获取当前日期
LocalDate today = LocalDate.now();
// 定义格式化器yyyyMMdd
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
// 格式化日期
String formattedDate = today.format(formatter);
Long projectId = category.getProjectId();
Long matrixId = category.getMatrixId();
String name = category.getName();
switch (type) {
case PgsProgressCategoryConstant.PHOTOVOLTAIC_PANEL_WORK_TYPE -> {
// 获取当天已创建的设施数量
Long count = photovoltaicPanelService.lambdaQuery()
.eq(FacPhotovoltaicPanel::getProjectId, projectId)
.eq(FacPhotovoltaicPanel::getMatrixId, matrixId)
.eq(FacPhotovoltaicPanel::getProgressCategoryId, progressCategoryId)
.likeRight(FacPhotovoltaicPanel::getName, formattedDate)
.count();
// 封装数据
List<FacPhotovoltaicPanel> newList = new ArrayList<>();
for (int i = 1; i <= number; i++) {
FacPhotovoltaicPanel panel = new FacPhotovoltaicPanel();
panel.setProjectId(projectId);
panel.setMatrixId(matrixId);
panel.setName(formattedDate + "." + (count + i));
panel.setProgressCategoryId(progressCategoryId);
panel.setProgressCategoryName(name);
panel.setRemark("手动添加");
newList.add(panel);
}
photovoltaicPanelService.saveBatch(newList);
}
case PgsProgressCategoryConstant.INVERTER_WORK_TYPE -> {
// 获取当天已创建的设施数量
Long count = inverterService.lambdaQuery()
.eq(FacInverter::getProjectId, projectId)
.eq(FacInverter::getMatrixId, matrixId)
.eq(FacInverter::getProgressCategoryId, progressCategoryId)
.likeRight(FacInverter::getName, formattedDate)
.count();
// 封装数据
List<FacInverter> newList = new ArrayList<>();
for (int i = 1; i <= number; i++) {
FacInverter inverter = new FacInverter();
inverter.setProjectId(projectId);
inverter.setMatrixId(matrixId);
inverter.setName(formattedDate + "." + (count + i));
inverter.setProgressCategoryId(progressCategoryId);
inverter.setProgressCategoryName(name);
inverter.setRemark("手动添加");
newList.add(inverter);
}
inverterService.saveBatch(newList);
}
case PgsProgressCategoryConstant.BOX_TRANSFORMER_WORK_TYPE -> {
// 获取当天已创建的设施数量
Long count = boxTransformerService.lambdaQuery()
.eq(FacBoxTransformer::getProjectId, projectId)
.eq(FacBoxTransformer::getMatrixId, matrixId)
.eq(FacBoxTransformer::getProgressCategoryId, progressCategoryId)
.likeRight(FacBoxTransformer::getName, formattedDate)
.count();
// 封装数据
List<FacBoxTransformer> newList = new ArrayList<>();
for (int i = 1; i <= number; i++) {
FacBoxTransformer boxTransformer = new FacBoxTransformer();
boxTransformer.setProjectId(projectId);
boxTransformer.setMatrixId(matrixId);
boxTransformer.setName(formattedDate + "." + (count + i));
boxTransformer.setProgressCategoryId(progressCategoryId);
boxTransformer.setProgressCategoryName(name);
boxTransformer.setRemark("手动添加");
newList.add(boxTransformer);
}
boxTransformerService.saveBatch(newList);
}
case PgsProgressCategoryConstant.PHOTOVOLTAIC_PANEL_POINT_WORK_TYPE -> {
// 获取当天已创建的设施数量
Long count = photovoltaicPanelPointService.lambdaQuery()
.eq(FacPhotovoltaicPanelPoint::getProjectId, projectId)
.eq(FacPhotovoltaicPanelPoint::getMatrixId, matrixId)
.eq(FacPhotovoltaicPanelPoint::getProgressCategoryId, progressCategoryId)
.likeRight(FacPhotovoltaicPanelPoint::getName, formattedDate)
.count();
// 封装数据
List<FacPhotovoltaicPanelPoint> newList = new ArrayList<>();
for (int i = 1; i <= number; i++) {
FacPhotovoltaicPanelPoint point = new FacPhotovoltaicPanelPoint();
point.setProjectId(projectId);
point.setMatrixId(matrixId);
point.setName(formattedDate + "." + (count + i));
point.setProgressCategoryId(progressCategoryId);
point.setProgressCategoryName(name);
point.setRemark("手动添加");
newList.add(point);
}
photovoltaicPanelPointService.saveBatch(newList);
}
case PgsProgressCategoryConstant.PHOTOVOLTAIC_PANEL_COLUMN_WORK_TYPE -> {
// 获取当天已创建的设施数量
Long count = photovoltaicPanelColumnService.lambdaQuery()
.eq(FacPhotovoltaicPanelColumn::getProjectId, projectId)
.eq(FacPhotovoltaicPanelColumn::getMatrixId, matrixId)
.eq(FacPhotovoltaicPanelColumn::getProgressCategoryId, progressCategoryId)
.likeRight(FacPhotovoltaicPanelColumn::getName, formattedDate)
.count();
// 封装数据
List<FacPhotovoltaicPanelColumn> newList = new ArrayList<>();
for (int i = 1; i <= number; i++) {
FacPhotovoltaicPanelColumn column = new FacPhotovoltaicPanelColumn();
column.setProjectId(projectId);
column.setMatrixId(matrixId);
column.setName(formattedDate + "." + (count + i));
column.setProgressCategoryId(progressCategoryId);
column.setProgressCategoryName(name);
column.setRemark("手动添加");
newList.add(column);
}
photovoltaicPanelColumnService.saveBatch(newList);
}
case PgsProgressCategoryConstant.PHOTOVOLTAIC_PANEL_SUPPORT_WORK_TYPE -> {
// 获取当天已创建的设施数量
Long count = photovoltaicPanelSupportService.lambdaQuery()
.eq(FacPhotovoltaicPanelSupport::getProjectId, projectId)
.eq(FacPhotovoltaicPanelSupport::getMatrixId, matrixId)
.eq(FacPhotovoltaicPanelSupport::getProgressCategoryId, progressCategoryId)
.likeRight(FacPhotovoltaicPanelSupport::getName, formattedDate)
.count();
// 封装数据
List<FacPhotovoltaicPanelSupport> newList = new ArrayList<>();
for (int i = 1; i <= number; i++) {
FacPhotovoltaicPanelSupport support = new FacPhotovoltaicPanelSupport();
support.setProjectId(projectId);
support.setMatrixId(matrixId);
support.setName(formattedDate + "." + (count + i));
support.setProgressCategoryId(progressCategoryId);
support.setProgressCategoryName(name);
support.setRemark("手动添加");
newList.add(support);
}
photovoltaicPanelSupportService.saveBatch(newList);
}
case null, default -> throw new ServiceException("不支持的设施类型", HttpStatus.BAD_REQUEST);
}
// 更新进度类别数量
PgsProgressCategory updateCategory = new PgsProgressCategory();
updateCategory.setId(progressCategoryId);
updateCategory.setTotal(category.getTotal().add(BigDecimal.valueOf(number)));
boolean update = this.updateById(updateCategory);
if (!update) {
throw new ServiceException("修改进度类别数量失败,数据库异常", HttpStatus.ERROR);
}
return true;
}
}

View File

@ -116,6 +116,7 @@ public class PgsProgressPlanDetailServiceImpl extends ServiceImpl<PgsProgressPla
@Resource
private IFacPhotovoltaicPanelPartsService photovoltaicPanelPartsService;
@Lazy
@Resource
private IOutConstructionValueService constructionValueService;
@ -352,7 +353,7 @@ public class PgsProgressPlanDetailServiceImpl extends ServiceImpl<PgsProgressPla
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertPercentageNumberDetail(PgsProgressPlanDetailCreateReq req) {
public Boolean insertPercentageNumberDetail(PgsProgressPlanDetailCreateReq req, Boolean isCheckout) {
// 校验
BigDecimal finishedNumber = req.getFinishedNumber();
if (finishedNumber == null) {
@ -373,7 +374,7 @@ public class PgsProgressPlanDetailServiceImpl extends ServiceImpl<PgsProgressPla
throw new ServiceException("完成时间不能大于当前时间", HttpStatus.BAD_REQUEST);
}*/
// 判断当前详情是否已提交
if (!progressPlanDetail.getStatus().equals("1")) {
if (isCheckout && !progressPlanDetail.getStatus().equals("1")) {
throw new ServiceException("当前详情已提交至施工产值,无法进行修改", HttpStatus.BAD_REQUEST);
}
Long progressPlanId = progressPlanDetail.getProgressPlanId();
@ -894,7 +895,8 @@ public class PgsProgressPlanDetailServiceImpl extends ServiceImpl<PgsProgressPla
);
// 为每一个项目创建一个施工产值范围
Set<Long> projectIds = planDetailList.stream()
.map(PgsProgressPlanDetail::getProjectId).collect(Collectors.toSet());
.map(PgsProgressPlanDetail::getProjectId)
.collect(Collectors.toSet());
// 获取所有父级项目
List<BusProject> projectList = projectService.listByIds(projectIds);
List<Long> allProjectIds = projectList
@ -934,8 +936,8 @@ public class PgsProgressPlanDetailServiceImpl extends ServiceImpl<PgsProgressPla
long rangeId = IdWorker.getId(range);
range.setId(rangeId);
range.setProjectId(id);
range.setStartDate(startDate);
range.setEndDate(endDate);
range.setStartDate(monday);
range.setEndDate(sunday);
// 获取所有子项目
List<Long> subProject = new ArrayList<>(projectList.stream()
.filter(project -> Objects.equals(project.getPId(), id))
@ -1139,8 +1141,8 @@ public class PgsProgressPlanDetailServiceImpl extends ServiceImpl<PgsProgressPla
}
List<Long> projectIds = projects.stream().map(BusProject::getId).distinct().toList();
// 识别类型:洞、桩、架、架子
List<RecognizerTypeEnum> enumList = List.of(RecognizerTypeEnum.HOLE, RecognizerTypeEnum.PHO,
RecognizerTypeEnum.PILE, RecognizerTypeEnum.SHELVES);
List<RecognizerTypeEnum> enumList = List.of(RecognizerTypeEnum.HOLE, RecognizerTypeEnum.SOLAR,
RecognizerTypeEnum.PILE, RecognizerTypeEnum.BRACKET);
// 调用识别算法
RecognizeVo recognizeVo = null;
try {
@ -1177,11 +1179,11 @@ public class PgsProgressPlanDetailServiceImpl extends ServiceImpl<PgsProgressPla
}
log.info("类型:{},识别到的设施:{},转换坐标:{}", type, value, coordinateList);
// 处理对应设施
if (type.equals(RecognizerTypeEnum.PHO.getValue())) {
if (type.equals(RecognizerTypeEnum.SOLAR.getValue())) {
photovoltaicPanelService.updateFinishNumberByCoordinate(projectIds, coordinateList);
} else if (type.equals(RecognizerTypeEnum.HOLE.getValue())
|| type.equals(RecognizerTypeEnum.PILE.getValue())
|| type.equals(RecognizerTypeEnum.SHELVES.getValue())) {
|| type.equals(RecognizerTypeEnum.BRACKET.getValue())) {
photovoltaicPanelPartsService.updateFinishNumberByCoordinate(projectIds, coordinateList, type);
} else {
log.error("未知设施类型:{}", type);

View File

@ -209,10 +209,13 @@ public class PgsProgressPlanServiceImpl extends ServiceImpl<PgsProgressPlanMappe
throw new ServiceException("删除进度计划失败,数据库异常", HttpStatus.ERROR);
}
// 关联删除分类中记录的计划值
boolean update = progressCategoryService.lambdaUpdate()
.eq(PgsProgressCategory::getId, progressPlan.getProgressCategoryId())
.setSql("plan_total = plan_total - " + progressPlan.getPlanNumber())
.update();
PgsProgressCategory category = progressCategoryService.getById(progressPlan.getProgressCategoryId());
BigDecimal left = category.getPlanTotal().subtract(progressPlan.getPlanNumber());
if (left.compareTo(BigDecimal.ZERO) < 0) {
left = BigDecimal.ZERO;
}
category.setPlanTotal(left);
boolean update = progressCategoryService.updateById(category);
if (!update) {
throw new ServiceException("更新进度分类计划总数量失败,数据库操作失败", HttpStatus.ERROR);
}

View File

@ -3,7 +3,6 @@ package org.dromara.quality.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -23,7 +22,6 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.oss.core.OssClient;
import org.dromara.common.oss.exception.OssException;
import org.dromara.common.oss.factory.OssFactory;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.utils.DocumentUtil;
import org.dromara.project.service.IBusProjectService;
import org.dromara.quality.constant.QltQualityConstant;
@ -172,9 +170,13 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
// 获取整改情况
long passCount = 0L;
for (QltQualityInspection qualityInspection : qualityInspectionList) {
if (QltQualityInspectionStatusEnum.VERIFICATION.getValue().equals(qualityInspection.getInspectionStatus())
if ("1".equals(qualityInspection.getIsReply())
&& QltQualityInspectionStatusEnum.VERIFICATION.getValue().equals(qualityInspection.getInspectionStatus())
&& QltQualityInspectionVerificationTypeEnum.PASS.getValue().equals(qualityInspection.getVerificationType())) {
passCount++;
} else if ("2".equals(qualityInspection.getIsReply())
&& QltQualityInspectionStatusEnum.RECTIFICATION.getValue().equals(qualityInspection.getInspectionStatus())) {
passCount++;
}
}
gisVo.setList(gisList);
@ -252,7 +254,7 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
});
}
if("2".equals(req.getVerificationType())){
if ("2".equals(req.getVerificationType())) {
handleFail(oldQualityInspection);
}
// 操作数据库
@ -267,7 +269,7 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
qualityInspection.setRectificationTime(null);
qualityInspection.setRectificationFile(null);
qualityInspection.setRectificationImgFile(null);
qualityInspection.setVersion(qualityInspection.getVersion()+1);
qualityInspection.setVersion(qualityInspection.getVersion() + 1);
save(qualityInspection);
}
@ -359,9 +361,9 @@ public class QltQualityInspectionServiceImpl extends ServiceImpl<QltQualityInspe
Long projectId = req.getProjectId();
String inspectionType = req.getInspectionType();
String inspectionStatus = req.getInspectionStatus();
if(StrUtil.isNotBlank(inspectionStatus) ){
if (StrUtil.isNotBlank(inspectionStatus)) {
String[] split = inspectionStatus.split(",");
lqw.in( QltQualityInspection::getInspectionStatus, Arrays.asList(split));
lqw.in(QltQualityInspection::getInspectionStatus, Arrays.asList(split));
}
String rectificationUnit = req.getRectificationUnit();
Long rectificationId = req.getRectificationId();

View File

@ -11,7 +11,6 @@ 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.manager.recognizermanager.enums.RecognizerTypeEnum;
import org.dromara.manager.recognizermanager.vo.RecognizeTargetVo;
import org.dromara.project.service.IBusProjectService;
@ -194,15 +193,7 @@ public class HseRecognizeRecordServiceImpl extends ServiceImpl<HseRecognizeRecor
Date createTime = req.getCreateTime();
lqw.eq(ObjectUtils.isNotEmpty(projectId), HseRecognizeRecord::getProjectId, projectId);
lqw.eq(StringUtils.isNotBlank(recordCategory), HseRecognizeRecord::getRecordCategory, recordCategory);
if (StringUtils.isNotBlank(violationType)) {
lqw.likeRight(HseRecognizeRecord::getViolationType, violationType + ",")
.or()
.likeLeft(HseRecognizeRecord::getViolationType, "," + violationType)
.or()
.like(HseRecognizeRecord::getViolationType, "," + violationType + ",")
.or()
.eq(HseRecognizeRecord::getViolationType, violationType);
}
lqw.eq(StringUtils.isNotBlank(violationType), HseRecognizeRecord::getViolationType, violationType);
lqw.like(StringUtils.isNotBlank(description), HseRecognizeRecord::getDescription, description);
if (createTime != null) {
// 构造当天的起始和结束时间
@ -216,6 +207,7 @@ public class HseRecognizeRecordServiceImpl extends ServiceImpl<HseRecognizeRecor
lqw.ge(HseRecognizeRecord::getCreateTime, start)
.lt(HseRecognizeRecord::getCreateTime, end);
}
lqw.orderByDesc(HseRecognizeRecord::getCreateTime);
return lqw;
}

View File

@ -30,6 +30,7 @@ import org.dromara.project.domain.BusProjectTeam;
import org.dromara.project.service.IBusProjectService;
import org.dromara.project.service.IBusProjectTeamMemberService;
import org.dromara.project.service.IBusProjectTeamService;
import org.dromara.quality.domain.enums.QltQualityInspectionStatusEnum;
import org.dromara.safety.constant.HseSafetyConstant;
import org.dromara.safety.domain.HseSafetyInspection;
import org.dromara.safety.domain.HseTeamMeeting;
@ -222,23 +223,20 @@ public class HseSafetyInspectionServiceImpl extends ServiceImpl<HseSafetyInspect
.list();
long passCount = 0L;
for (HseSafetyInspection safetyInspection : safetyInspectionList) {
if (HseSafetyInspectionStatusEnum.REVIEW.getValue().equals(safetyInspection.getStatus())
if ("1".equals(safetyInspection.getIsReply())
&& HseSafetyInspectionStatusEnum.REVIEW.getValue().equals(safetyInspection.getStatus())
&& HseSafetyInspectionReviewTypeEnum.PASS.getValue().equals(safetyInspection.getReviewType())) {
passCount++;
} else if ("2".equals(safetyInspection.getIsReply())
&& QltQualityInspectionStatusEnum.RECTIFICATION.getValue().equals(safetyInspection.getStatus())
) {
passCount++;
}
}
int safetyInspectionCount = safetyInspectionList.stream()
.filter(inspection -> inspection.getIsReply().equals("2"))
.toList()
.size();
int correctSituationCount = safetyInspectionList.stream()
.filter(inspection -> inspection.getIsReply().equals("1") && !inspection.getStatus().equals("1"))
.toList()
.size();
gisVo.setTeamMeetingCount((long) teamMeetings.size());
gisVo.setSafetyInspectionCount((long) safetyInspectionCount);
gisVo.setCorrectSituationCount((long) correctSituationCount);
gisVo.setCorrectSituation(String.format("%.2f", correctSituationCount * 100.0 / safetyInspectionCount));
gisVo.setSafetyInspectionCount((long) safetyInspectionList.size());
gisVo.setCorrectSituationCount(passCount);
gisVo.setCorrectSituation(String.format("%.2f", passCount * 100.0 / safetyInspectionList.size()));
return gisVo;
}

View File

@ -6,6 +6,7 @@ import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
@ -84,6 +85,15 @@ public class BusTenderPlanLimitListController extends BaseController {
return R.ok(busBillofquantitiesLimitListService.sheetList(bo));
}
/**
* 获取指定版本的全部大类
*/
@SaCheckPermission("tender:tenderPlanLimitList:pList")
@GetMapping("/pList")
public R<List<BusBillofquantitiesLimitListVo>> pList(BusBillofquantitiesLimitListBo bo) {
return R.ok(busBillofquantitiesLimitListService.pList(bo));
}
/**
* 导出限价一览列表
*/

View File

@ -1,20 +1,19 @@
package org.dromara.tender.service;
import jakarta.validation.constraints.NotNull;
import org.dromara.tender.domain.vo.BusBiddingPlanAnnexVo;
import org.dromara.tender.domain.vo.BusBiddingPlanDetailVo;
import org.dromara.tender.domain.vo.BusBiddingPlanVo;
import org.dromara.tender.domain.vo.*;
import org.dromara.tender.domain.bo.BusBiddingPlanBo;
import org.dromara.tender.domain.BusBiddingPlan;
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.tender.domain.vo.BusBillofquantitiesLimitListVo;
import org.springframework.web.multipart.MultipartFile;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 招标计划Service接口
@ -106,4 +105,6 @@ public interface IBusBiddingPlanService extends IService<BusBiddingPlan>{
* @return
*/
List<BusBillofquantitiesLimitListVo> getBillofquantitiesLimitListVo(BusBiddingPlanBo bo1);
Map<Long, BigDecimal> getCailiaoCount(BusBiddingPlanBo bo1);
}

View File

@ -112,4 +112,6 @@ public interface IBusBillofquantitiesLimitListService extends IService<BusBillof
List<BusBillofquantitiesLimitListVo> queryVoByIds(List<Long> ids);
List<BusBillofquantitiesLimitListWuZiVo> queryVoList(BusBillofquantitiesLimitListBo bo);
List<BusBillofquantitiesLimitListVo> pList(BusBillofquantitiesLimitListBo bo);
}

View File

@ -17,9 +17,7 @@ import org.dromara.system.service.ISysOssService;
import org.dromara.tender.domain.*;
import org.dromara.tender.domain.bo.BusBiddingPlanAnnexBo;
import org.dromara.tender.domain.bo.BusTenderPlanningLimitListBo;
import org.dromara.tender.domain.vo.BusBiddingPlanAnnexVo;
import org.dromara.tender.domain.vo.BusBiddingPlanDetailVo;
import org.dromara.tender.domain.vo.BusBillofquantitiesLimitListVo;
import org.dromara.tender.domain.vo.*;
import org.dromara.tender.mapper.BusTenderPlanningLimitListMapper;
import org.dromara.tender.service.IBusBiddingPlanAnnexService;
import org.dromara.tender.service.IBusBillofquantitiesLimitListService;
@ -27,7 +25,6 @@ import org.dromara.tender.service.ITenderSupplierInputService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.dromara.tender.domain.bo.BusBiddingPlanBo;
import org.dromara.tender.domain.vo.BusBiddingPlanVo;
import org.dromara.tender.mapper.BusBiddingPlanMapper;
import org.dromara.tender.service.IBusBiddingPlanService;
import org.springframework.transaction.annotation.Transactional;
@ -375,6 +372,30 @@ public class BusBiddingPlanServiceImpl extends ServiceImpl<BusBiddingPlanMapper,
return null;
}
@Override
public Map<Long, BigDecimal> getCailiaoCount(BusBiddingPlanBo bo1) {
//查询属于该供应商的招标计划
List<BusBiddingPlanVo> busBiddingPlanVos = baseMapper.selectVoList(new LambdaQueryWrapper<BusBiddingPlan>()
.eq(BusBiddingPlan::getProjectId, bo1.getProjectId())
.eq(BusBiddingPlan::getWinningBidderId, bo1.getWinningBidderId())
.eq(BusBiddingPlan::getBidStatus,"1"));
List<Long> bplanIdds = new ArrayList<>();
for (BusBiddingPlanVo busBiddingPlanVo : busBiddingPlanVos) {
bplanIdds.add(busBiddingPlanVo.getId());
}
Map<Long, BigDecimal> map = new HashMap<>();
//获取该供应商的所有材料
List<BusTenderPlanningLimitList> busTenderPlanningLimitLists = busTenderPlanningLimitListMapper.selectList(new LambdaQueryWrapper<BusTenderPlanningLimitList>().in(BusTenderPlanningLimitList::getBiddingPlanId, bplanIdds));
for (BusTenderPlanningLimitList v : busTenderPlanningLimitLists) {
if (!map.containsKey(v.getId())) {
map.put(v.getId(), v.getNum());
}else {
map.put(v.getId(), map.get(v.getId()).add(v.getNum()));
}
}
return map;
}
/**
* 递归构建树形结构
* @param parentId 父节点ID顶级节点为0

View File

@ -14,6 +14,7 @@ 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.utils.BatchNumberGenerator;
import org.dromara.common.utils.excel.ExcelDynamicReader;
import org.dromara.tender.domain.BusBLimitListVersions;
import org.dromara.tender.domain.BusBillofquantitiesLimitList;
@ -124,6 +125,9 @@ public class BusBillofquantitiesLimitListServiceImpl extends ServiceImpl<BusBill
@Override
public Boolean insertByBo(BusBillofquantitiesLimitListBo bo) {
BusBillofquantitiesLimitList add = MapstructUtils.convert(bo, BusBillofquantitiesLimitList.class);
String banBen = BatchNumberGenerator.generateBatchNumber("GCLBB-");
add.setSid(banBen);
add.setType("3");
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
@ -152,7 +156,14 @@ public class BusBillofquantitiesLimitListServiceImpl extends ServiceImpl<BusBill
if (bo.getVersions() == null) {
throw new ServiceException("版本号不能为空");
}
// BusBillofquantitiesLimitList limitList = baseMapper.selectById(bo.getId());
// BusBLimitListVersionsVo vo = busBLimitListVersionsService.queryByVersion(limitList.getVersions());
// if (limitList == null) {
// throw new ServiceException("修改数据不存在");
// }
// if (!BusinessStatusEnum.DRAFT.getStatus().equals(vo.getStatus()) && !(bo.getQuantity().compareTo(limitList.getQuantity()) > 0)) {
// throw new ServiceException("数量只能增加不能减少");
// }
BusBillofquantitiesLimitList update = MapstructUtils.convert(bo, BusBillofquantitiesLimitList.class);
if (bo.getUnitPrice() == null){
update.setUnitPrice(null);
@ -171,6 +182,19 @@ public class BusBillofquantitiesLimitListServiceImpl extends ServiceImpl<BusBill
*/
private void validEntityBeforeSave(BusBillofquantitiesLimitList entity) {
//TODO 做一些数据校验,如唯一约束
// Long count = baseMapper.selectCount(new LambdaQueryWrapper<BusBillofquantitiesLimitList>()
// .eq(BusBillofquantitiesLimitList::getVersions,entity.getVersions())
// .eq(BusBillofquantitiesLimitList::getName, entity.getName())
// .eq(BusBillofquantitiesLimitList::getSpecification, entity.getSpecification())
// .eq(BusBillofquantitiesLimitList::getUnit, entity.getUnit())
// .eq(BusBillofquantitiesLimitList::getSupplier, entity.getSupplier())
// .eq(BusBillofquantitiesLimitList::getContractNumber, entity.getContractNumber())
// .eq(BusBillofquantitiesLimitList::getProjectId, entity.getProjectId())
// .ne(entity.getId() != null, BusBillofquantitiesLimitList::getId, entity.getId()));
// if (count > 0) {
// throw new ServiceException("该名称-规格-单位-供应商-合同编号的数据以存在!!!");
// }
}
/**
@ -184,6 +208,17 @@ public class BusBillofquantitiesLimitListServiceImpl extends ServiceImpl<BusBill
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
// List<BusBillofquantitiesLimitListVo> listVoList = baseMapper.selectVoByIds(ids);
// Set<String> vlist = new HashSet<>();
// for (BusBillofquantitiesLimitListVo vo : listVoList) {
// vlist.add(vo.getVersions());
// }
// for (String v : vlist) {
// BusBLimitListVersionsVo vo = busBLimitListVersionsService.queryByVersion(v);
// if (vo != null && !BusinessStatusEnum.DRAFT.getStatus().equals(vo.getStatus())) {
// throw new ServiceException("该版本已经进入审核不允许再删除");
// }
// }
}
return baseMapper.deleteByIds(ids) > 0;
}
@ -323,6 +358,16 @@ public class BusBillofquantitiesLimitListServiceImpl extends ServiceImpl<BusBill
return wuZiVoArrayList;
}
@Override
public List<BusBillofquantitiesLimitListVo> pList(BusBillofquantitiesLimitListBo bo) {
List<BusBillofquantitiesLimitListVo> listVoList = baseMapper.selectVoList(new LambdaQueryWrapper<BusBillofquantitiesLimitList>()
.eq(BusBillofquantitiesLimitList::getPid, "0")
.eq(BusBillofquantitiesLimitList::getProjectId, bo.getProjectId())
.eq(BusBillofquantitiesLimitList::getType, bo.getType())
.eq(BusBillofquantitiesLimitList::getVersions, bo.getVersions()));
return listVoList;
}
/**
* 递归构建树形结构
*

View File

@ -34,6 +34,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
WHEN #{item.id} THEN #{item.taxRate}
</foreach>
ELSE tax_rate
END,
quantity = CASE id
<foreach collection="list" item="item">
WHEN #{item.id} THEN #{item.quantity}
</foreach>
ELSE quantity
END
WHERE id IN
<foreach collection="list" item="item" open="(" separator="," close=")">