From 62ebd4b11ea85faf83965012375cfbdf0e3404d2 Mon Sep 17 00:00:00 2001 From: cwchen <1048842385@qq.com> Date: Wed, 20 Mar 2024 10:22:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E7=A8=8B=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/constant/Constant.java | 2 + .../system/base/vo/GxPlanProgressVo.java | 4 +- .../entity/system/base/vo/GxPlanVo.java | 19 ++++ .../system/base/mapper/IProMapper.java | 14 +++ .../service/impl/ProScheduleServiceImpl.java | 22 ++-- .../base/service/impl/ProServiceImpl.java | 104 ++++++++++++++---- .../main/resources/mapper/base/ProMapper.xml | 7 ++ .../mapper/base/ProScheduleMapper.xml | 2 + 8 files changed, 146 insertions(+), 28 deletions(-) diff --git a/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/constant/Constant.java b/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/constant/Constant.java index a17722a..6381abb 100644 --- a/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/constant/Constant.java +++ b/securitycontrol-commons/securitycontrol-commons-core/src/main/java/com/securitycontrol/common/core/constant/Constant.java @@ -31,6 +31,8 @@ public class Constant { public final static String GX_PLAN_PROGRESS = "100"; + public final static double MAX_VALUE = 100.0; + public final static String XL = "线路"; public final static String[] BUILD_ARR = {"12A0,合肥","12B0,马鞍山","12C0,芜湖","12D0,安庆","12F0,淮南", diff --git a/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/base/vo/GxPlanProgressVo.java b/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/base/vo/GxPlanProgressVo.java index a7af350..dd2684e 100644 --- a/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/base/vo/GxPlanProgressVo.java +++ b/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/base/vo/GxPlanProgressVo.java @@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; /** * @author:cwchen @@ -35,7 +36,8 @@ public class GxPlanProgressVo { private String bidCode; @ApiModelProperty(value = "工序计划进度") - @NotBlank(message = "工序计划进度不能为空", groups = {Query.class}) + @NotBlank(message = "进度填报不能为空", groups = {Query.class}) + @Pattern(regexp = "(?:0|[1-9][0-9]?|100)(\\.[0-9]{0,2})?",message = "进度填报值为0-100",groups = {Query.class}) private String gxProgress; @ApiModelProperty(value = "填报时间") diff --git a/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/base/vo/GxPlanVo.java b/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/base/vo/GxPlanVo.java index 0df2c61..d3f63c6 100644 --- a/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/base/vo/GxPlanVo.java +++ b/securitycontrol-commons/securitycontrol-commons-entity/src/main/java/com/securitycontrol/entity/system/base/vo/GxPlanVo.java @@ -3,6 +3,10 @@ package com.securitycontrol.entity.system.base.vo; import com.fasterxml.jackson.annotation.JsonInclude; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; /** * @author:cwchen @@ -17,21 +21,30 @@ public class GxPlanVo { private String planId; @ApiModelProperty(value = "标段工程编码") + @NotBlank(message = "标段工程编码不能为空", groups = {Query.class}) + @Length(max = 50, message = "标段工程编码字符长度不能超过50", groups = {Query.class}) private String bidCode; @ApiModelProperty(value = "工序id/杆塔ID") + @NotBlank(message = "工序ID或杆塔ID不能为空", groups = {Query.class}) + @Length(max = 100, message = "工序ID或杆塔ID字符长度不能超过50", groups = {Query.class}) private String gxId; @ApiModelProperty(value = "工序名称/杆塔名称") private String gxName; @ApiModelProperty(value = "工序作业权重") + @NotBlank(message = "工序作业权重不能为空", groups = {Query.class}) + @Length(max = 100, message = "工序作业权重字符长度不能超过30", groups = {Query.class}) + @Pattern(regexp = "(?:0|[1-9][0-9]?|100)(\\.[0-9]{0,2})?",message = "工序作业权重为0-100",groups = {Query.class}) private String gxWeight; @ApiModelProperty(value = "计划开始时间") + @NotBlank(message = "计划开始时间不能为空", groups = {Query.class}) private String planStartTime; @ApiModelProperty(value = "计划结束时间") + @NotBlank(message = "计划结束时间不能为空", groups = {Query.class}) private String planEndTime; @ApiModelProperty(value = "实际开始时间") @@ -50,4 +63,10 @@ public class GxPlanVo { @ApiModelProperty(value = "1. 新增 2.修改") @JsonInclude(JsonInclude.Include.NON_EMPTY) private Integer type; + + /** + * 查询条件限制 + */ + public interface Query { + } } diff --git a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/mapper/IProMapper.java b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/mapper/IProMapper.java index 6e4d57b..a7ffda1 100644 --- a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/mapper/IProMapper.java +++ b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/mapper/IProMapper.java @@ -6,9 +6,11 @@ import com.securitycontrol.entity.system.base.dto.ProGxPlanDto; import com.securitycontrol.entity.system.base.vo.GxPlanVo; import com.securitycontrol.entity.system.base.vo.ProVo; import com.securitycontrol.entity.system.vo.ResourceFileVo; +import org.apache.ibatis.annotations.MapKey; import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Map; /** * @author:cwchen @@ -188,6 +190,7 @@ public interface IProMapper { /** * 工程是否存在 + * * @param vo * @return int * @description @@ -195,4 +198,15 @@ public interface IProMapper { * @date 2024/3/16 18:20 */ int proIsExist(ProVo vo); + + /** + * 获取工序计划作业权重占比 + * @param bidCode + * @return List> + * @description + * @author cwchen + * @date 2024/3/20 9:40 + */ + @MapKey("planId") + List> getGxWeight(String bidCode); } diff --git a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/impl/ProScheduleServiceImpl.java b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/impl/ProScheduleServiceImpl.java index 5ff9ead..da11d31 100644 --- a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/impl/ProScheduleServiceImpl.java +++ b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/impl/ProScheduleServiceImpl.java @@ -18,7 +18,10 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import javax.annotation.Resource; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.UUID; /** * @author:cwchen @@ -73,23 +76,26 @@ public class ProScheduleServiceImpl implements IProScheduleService { return AjaxResult.error(validResult); } int result = mapper.isFirstFillingGxProgress(vo); - if(result == 0){ + if (result == 0) { // 更新 工序计划开始时间 vo.setStartTime(DateTimeHelper.getNowDate()); vo.setType(1); - mapper.updateGxPlanData(vo); + mapper.updateGxPlanData(vo); } Long timestamp = DateTimeHelper.convertDateStringToTimestamp(vo.getPlanEndTime(), "yyyy-MM-dd"); - if(timestamp == null){ + if (timestamp == null) { return AjaxResult.error("计划结束时间格式不正确"); } Long timestamp2 = DateTimeHelper.convertDateStringToTimestamp(DateTimeHelper.getNowDate(), "yyyy-MM-dd"); - if(timestamp2 < timestamp && StringUtils.isEmpty(vo.getDelaReason())){ + if (timestamp2 > timestamp && StringUtils.isEmpty(vo.getDelaReason())) { return AjaxResult.error("计划延期原因不能为空"); } // 计划填报进度为100 更新工序计划 - if(vo.getGxProgress().contains(Constant.GX_PLAN_PROGRESS)){ + if (vo.getGxProgress().contains(Constant.GX_PLAN_PROGRESS)) { vo.setEndTime(DateTimeHelper.getNowDate()); + } + // 计划有延期更新到工序计划 + if (StringUtils.isNotEmpty(vo.getDelaReason()) || vo.getGxProgress().contains(Constant.GX_PLAN_PROGRESS)) { vo.setType(2); mapper.updateGxPlanData(vo); } @@ -99,11 +105,11 @@ public class ProScheduleServiceImpl implements IProScheduleService { vo.setProgressId(progressId); mapper.addGxPlanProgress(vo); // 工程为线路时 更新杆塔当前工序 - if(Objects.equals(Constant.XL,vo.getProType())){ + if (Objects.equals(Constant.XL, vo.getProType())) { mapper.updateGtData(vo); } } catch (Exception e) { - log.error("填报工序计划进度列表",e); + log.error("填报工序计划进度列表", e); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return AjaxResult.error(); } diff --git a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/impl/ProServiceImpl.java b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/impl/ProServiceImpl.java index b6bdb17..546d4ff 100644 --- a/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/impl/ProServiceImpl.java +++ b/securitycontrol-model/securitycontrol-system/src/main/java/com/securitycontrol/system/base/service/impl/ProServiceImpl.java @@ -32,6 +32,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; import java.util.*; /** @@ -285,78 +286,78 @@ public class ProServiceImpl implements IProService { public List getLstError(List lstObj) { List lstError = new ArrayList<>(); for (JSONObject obj : lstObj) { - JSONObject errorObj0 = validateData(obj, "proName", "工程名称", 50,0); + JSONObject errorObj0 = validateData(obj, "proName", "工程名称", 50, 0); if (errorObj0 != null) { lstError.add(errorObj0); continue; } - JSONObject errorObj = validateData(obj, "org", "建管单位", 0,0); + JSONObject errorObj = validateData(obj, "org", "建管单位", 0, 0); if (errorObj != null) { lstError.add(errorObj); continue; } - JSONObject errorObj2 = validateData(obj, "bidCode", "标段编码", 50,1); + JSONObject errorObj2 = validateData(obj, "bidCode", "标段编码", 50, 1); if (errorObj2 != null) { lstError.add(errorObj2); continue; } - JSONObject errorObj3 = validateData(obj, "signCode", "单项编码", 50,0); + JSONObject errorObj3 = validateData(obj, "signCode", "单项编码", 50, 0); if (errorObj3 != null) { lstError.add(errorObj3); continue; } - JSONObject errorObj4 = validateData(obj, "proCode", "工程编码", 50,0); + JSONObject errorObj4 = validateData(obj, "proCode", "工程编码", 50, 0); if (errorObj4 != null) { lstError.add(errorObj4); continue; } - JSONObject errorObj5 = validateData(obj, "proCost", "工程成本", 50,0); + JSONObject errorObj5 = validateData(obj, "proCost", "工程成本", 50, 0); if (errorObj5 != null) { lstError.add(errorObj5); continue; } - JSONObject errorObj6 = validateData(obj, "sgUnit", "施工单位", 30,0); + JSONObject errorObj6 = validateData(obj, "sgUnit", "施工单位", 30, 0); if (errorObj6 != null) { lstError.add(errorObj6); continue; } - JSONObject errorObj7 = validateData(obj, "jlUnit", "监理单位", 30,0); + JSONObject errorObj7 = validateData(obj, "jlUnit", "监理单位", 30, 0); if (errorObj7 != null) { lstError.add(errorObj7); continue; } - JSONObject errorObj8 = validateData(obj, "proType", "工程类型", 10,0); + JSONObject errorObj8 = validateData(obj, "proType", "工程类型", 10, 0); if (errorObj8 != null) { lstError.add(errorObj8); continue; } - JSONObject errorObj9 = validateData(obj, "proScale", "工程规模", 300,0); + JSONObject errorObj9 = validateData(obj, "proScale", "工程规模", 300, 0); if (errorObj9 != null) { lstError.add(errorObj9); continue; } - JSONObject errorObj10 = validateData(obj, "manager", "项目经理", 10,0); + JSONObject errorObj10 = validateData(obj, "manager", "项目经理", 10, 0); if (errorObj10 != null) { lstError.add(errorObj10); continue; } - JSONObject errorObj11 = validateData(obj, "proBrief", "工程简介", 0,0); + JSONObject errorObj11 = validateData(obj, "proBrief", "工程简介", 0, 0); if (errorObj11 != null) { lstError.add(errorObj11); continue; } - JSONObject errorObj12 = validateData(obj, "status", "工程状态", 10,0); + JSONObject errorObj12 = validateData(obj, "status", "工程状态", 10, 0); if (errorObj12 != null) { lstError.add(errorObj12); continue; } - JSONObject errorObj13 = validateData(obj, "status", "计划开始时间", 0,0); + JSONObject errorObj13 = validateData(obj, "status", "计划开始时间", 0, 0); if (errorObj13 != null) { lstError.add(errorObj13); continue; } - JSONObject errorObj14 = validateData(obj, "planEndTime", "计划结束时间", 0,0); + JSONObject errorObj14 = validateData(obj, "planEndTime", "计划结束时间", 0, 0); if (errorObj14 != null) { lstError.add(errorObj14); continue; @@ -365,7 +366,7 @@ public class ProServiceImpl implements IProService { return lstError; } - public JSONObject validateData(JSONObject obj, String dataValue, String dataName, int length,int type) { + public JSONObject validateData(JSONObject obj, String dataValue, String dataName, int length, int type) { if (StringUtils.isBlank(obj.getString(dataValue))) { JSONObject error = new JSONObject(); error.put("errorRow", obj.getString("rowNo")); @@ -374,7 +375,7 @@ public class ProServiceImpl implements IProService { error.put("errorMsg", dataName + "不能为空"); return error; } - if (StringUtils.isNotEmpty(obj.getString(dataValue)) && obj.getString(dataValue).length() > length && length > 0 ) { + if (StringUtils.isNotEmpty(obj.getString(dataValue)) && obj.getString(dataValue).length() > length && length > 0) { JSONObject error = new JSONObject(); error.put("errorRow", obj.getString("rowNo")); error.put("errorLine", dataName); @@ -382,11 +383,11 @@ public class ProServiceImpl implements IProService { error.put("errorMsg", dataName + "字符长度不能超过" + length); return error; } - if(StringUtils.isNotEmpty(obj.getString(dataValue)) && type > 0){ + if (StringUtils.isNotEmpty(obj.getString(dataValue)) && type > 0) { ProVo proVo = new ProVo(); proVo.setBidCode(obj.getString(dataValue)); int result = mapper.proIsExist(proVo); - if(result > 0){ + if (result > 0) { JSONObject error = new JSONObject(); error.put("errorRow", obj.getString("rowNo")); error.put("errorLine", dataName); @@ -494,6 +495,17 @@ public class ProServiceImpl implements IProService { @Transactional(rollbackFor = Exception.class) public AjaxResult addOrUpdateGxPlan(GxPlanVo vo) { try { + String validResult = validatorsUtils.valid(vo, GxPlanVo.Query.class); + if (StringUtils.isNotBlank(validResult)) { + return AjaxResult.error(validResult); + } + List> weightList = mapper.getGxWeight(vo.getBidCode()); + if(CollectionUtils.isNotEmpty(weightList)){ + Boolean isFlag = isExceedData(weightList, vo.getPlanId(), vo.getGxWeight()); + if (isFlag) { + return AjaxResult.error("计划作业权重超过100%"); + } + } if (StringUtils.isEmpty(vo.getPlanId())) { String gxPlanId = UUID.randomUUID().toString().replace("-", ""); vo.setPlanId(gxPlanId); @@ -510,6 +522,60 @@ public class ProServiceImpl implements IProService { return AjaxResult.success(); } + /** + * 计算计划权重占比 + * + * @param weightList + * @param planId + * @param gxWeightData + * @return Boolean + * @description + * @author cwchen + * @date 2024/3/20 9:52 + */ + public static Boolean isExceedData(List> weightList, String planId, String gxWeightData) { + BigDecimal data = BigDecimal.valueOf(0); + for (Map map : weightList) { + String gxWeight = map.get("gxWeight"); + String id = map.get("planId"); + if (isNumeric(gxWeight)) { + if (StringUtils.isEmpty(planId)) { + BigDecimal value = BigDecimal.valueOf(Double.parseDouble(gxWeight)); + data = data.add(value); + } else if(StringUtils.isNotEmpty(planId) && !Objects.equals(planId, id)) { + BigDecimal value = BigDecimal.valueOf(Double.parseDouble(gxWeight)); + data = data.add(value); + } + } + } + if (isNumeric(gxWeightData)) { + BigDecimal value = BigDecimal.valueOf(Double.parseDouble(gxWeightData)); + data = data.add(value); + } + if (data.doubleValue() > Constant.MAX_VALUE) { + return true; + } + return false; + } + + /** + * 判断字符串是否为数字 + * + * @param str + * @return boolean + * @description + * @author cwchen + * @date 2024/3/20 9:56 + */ + public static boolean isNumeric(String str) { + try { + Double.parseDouble(str); + return true; + } catch (NumberFormatException e) { + return false; + } + } + @Override public AjaxResult getGxPlanById(GxPlanDto dto) { GxPlanVo vo = new GxPlanVo(); diff --git a/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/base/ProMapper.xml b/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/base/ProMapper.xml index ebfc8cc..5c99b8a 100644 --- a/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/base/ProMapper.xml +++ b/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/base/ProMapper.xml @@ -304,4 +304,11 @@ SELECT COUNT(*) FROM tb_project tp WHERE bid_code = #{bidCode} AND pro_id != #{proId} + + \ No newline at end of file diff --git a/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/base/ProScheduleMapper.xml b/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/base/ProScheduleMapper.xml index 1da4181..4c92b37 100644 --- a/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/base/ProScheduleMapper.xml +++ b/securitycontrol-model/securitycontrol-system/src/main/resources/mapper/base/ProScheduleMapper.xml @@ -10,6 +10,7 @@ gx_progress, gx_id, create_time, + dela_reason, #{progressId}, @@ -17,6 +18,7 @@ #{gxProgress}, #{gxId}, #{createTime}, + #{delaReason},