diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/BaseDataController.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/BaseDataController.java index 0836c35fb..217ba16a3 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/BaseDataController.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/BaseDataController.java @@ -20,6 +20,7 @@ import com.zhgd.xmgl.modules.basicdata.service.ICompanyService; import com.zhgd.xmgl.modules.basicdata.service.IOrganizationDeptService; import com.zhgd.xmgl.modules.basicdata.service.IOrganizationJobService; import com.zhgd.xmgl.modules.basicdata.service.ISystemUserService; +import com.zhgd.xmgl.util.JiuzhuUtil; import com.zhgd.xmgl.util.MD5; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -48,7 +49,7 @@ public class BaseDataController { private final String ADDRESS = "http://218.95.151.122:18000"; @Autowired - private RedisRepository redisRepository; + private JiuzhuUtil jiuzhuUtil; @Autowired private IOrganizationJobService organizationJobService; @@ -70,7 +71,7 @@ public class BaseDataController { params.put("pagesize", 1000); params.put("curpage", 1); jsonParams.put("params", params); - String result = testRestful(ADDRESS, "/api/hrm/resful/getHrmsubcompanyWithPage", JSONObject.toJSONString(jsonParams)); + String result = jiuzhuUtil.testRestful(ADDRESS, "/api/hrm/resful/getHrmsubcompanyWithPage", JSONObject.toJSONString(jsonParams), APPID); if (StringUtils.isNotBlank(result)) { JSONObject obj = JSONObject.parseObject(result); JSONArray jsonArray = obj.getJSONObject("data").getJSONArray("dataList"); @@ -115,7 +116,7 @@ public class BaseDataController { params.put("pagesize", 1000); params.put("curpage", 1); jsonParams.put("params", params); - String result = testRestful(ADDRESS, "/api/hrm/resful/getHrmdepartmentWithPage", JSONObject.toJSONString(jsonParams)); + String result = jiuzhuUtil.testRestful(ADDRESS, "/api/hrm/resful/getHrmdepartmentWithPage", JSONObject.toJSONString(jsonParams), APPID); if (StringUtils.isNotBlank(result)) { JSONObject obj = JSONObject.parseObject(result); JSONArray jsonArray = obj.getJSONObject("data").getJSONArray("dataList"); @@ -159,7 +160,7 @@ public class BaseDataController { params.put("pagesize", 1000); params.put("curpage", 1); jsonParams.put("params", params); - String result = testRestful(ADDRESS, "/api/hrm/resful/getJobtitleInfoWithPage", JSONObject.toJSONString(jsonParams)); + String result = jiuzhuUtil.testRestful(ADDRESS, "/api/hrm/resful/getJobtitleInfoWithPage", JSONObject.toJSONString(jsonParams), APPID); if (StringUtils.isNotBlank(result)) { JSONObject obj = JSONObject.parseObject(result); JSONArray jsonArray = obj.getJSONObject("data").getJSONArray("dataList"); @@ -186,7 +187,7 @@ public class BaseDataController { params.put("pagesize", 1000); params.put("curpage", 1); jsonParams.put("params", params); - String result = testRestful(ADDRESS, "/api/hrm/resful/getHrmUserInfoWithPage", JSONObject.toJSONString(jsonParams)); + String result = jiuzhuUtil.testRestful(ADDRESS, "/api/hrm/resful/getHrmUserInfoWithPage", JSONObject.toJSONString(jsonParams), APPID); if (StringUtils.isNotBlank(result)) { JSONObject obj = JSONObject.parseObject(result); JSONArray jsonArray = obj.getJSONObject("data").getJSONArray("dataList"); @@ -227,106 +228,4 @@ public class BaseDataController { } return Result.success(null); } - - - private String testRestful(String address,String api,String jsonParams){ - - //ECOLOGY返回的token - String token= (String) redisRepository.get("JIUZHU_SERVER_TOKEN"); - if (StrUtil.isEmpty(token)){ - token = (String) testGetoken(address).get("token"); - } - - String spk = (String) redisRepository.get("JIUZHU_SERVER_PUBLIC_KEY"); - //封装请求头参数 - RSA rsa = new RSA(null,spk); - //对用户信息进行加密传输,暂仅支持传输OA用户ID - String encryptUserid = rsa.encryptBase64("1",CharsetUtil.CHARSET_UTF_8,KeyType.PublicKey); - - //调用ECOLOGY系统接口 - String data = HttpRequest.post(address + api) - .header("appid",APPID) - .header("token",token) - .header("userid",encryptUserid) - .body(jsonParams) - .execute().body(); - System.out.println("testRestful():"+data); - return data; - } - - /** - * 第一步: - * - * 调用ecology注册接口,根据appid进行注册,将返回服务端公钥和Secret信息 - */ - private Map testRegist(String address){ - - //获取当前系统RSA加密的公钥 - RSA rsa = new RSA(); - String publicKey = rsa.getPublicKeyBase64(); - String privateKey = rsa.getPrivateKeyBase64(); - - // 客户端RSA私钥 - redisRepository.set("JIUZHU_LOCAL_PRIVATE_KEY",privateKey); - // 客户端RSA公钥 - redisRepository.set("JIUZHU_LOCAL_PUBLIC_KEY",publicKey); - - //调用ECOLOGY系统接口进行注册 - String data = HttpRequest.post(address + "/api/ec/dev/auth/regist") - .header("appid",APPID) - .header("cpk",publicKey) - .timeout(2000) - .execute().body(); - - // 打印ECOLOGY响应信息 - System.out.println("testRegist():"+data); - Map datas = JSONUtil.parseObj(data); - - //ECOLOGY返回的系统公钥 - redisRepository.set("JIUZHU_SERVER_PUBLIC_KEY", StrUtil.nullToEmpty((String)datas.get("spk"))); - //ECOLOGY返回的系统密钥 - redisRepository.set("JIUZHU_SERVER_SECRET",StrUtil.nullToEmpty((String)datas.get("secrit"))); - return datas; - } - - - - /** - * 第二步: - * - * 通过第一步中注册系统返回信息进行获取token信息 - */ - private Map testGetoken(String address){ - // 从系统缓存或者数据库中获取ECOLOGY系统公钥和Secret信息 - String secret = (String) redisRepository.get("JIUZHU_SERVER_SECRET"); - String spk = (String) redisRepository.get("JIUZHU_SERVER_PUBLIC_KEY"); - - // 如果为空,说明还未进行注册,调用注册接口进行注册认证与数据更新 - if (Objects.isNull(secret)||Objects.isNull(spk)){ - testRegist(address); - // 重新获取最新ECOLOGY系统公钥和Secret信息 - secret = (String) redisRepository.get("JIUZHU_SERVER_SECRET"); - spk = (String) redisRepository.get("JIUZHU_SERVER_PUBLIC_KEY"); - } - - // 公钥加密,所以RSA对象私钥为null - RSA rsa = new RSA(null,spk); - //对秘钥进行加密传输,防止篡改数据 - String encryptSecret = rsa.encryptBase64(secret, CharsetUtil.CHARSET_UTF_8, KeyType.PublicKey); - - //调用ECOLOGY系统接口进行注册 - String data = HttpRequest.post(address+ "/api/ec/dev/auth/applytoken") - .header("appid",APPID) - .header("secret",encryptSecret) - .header("time","3600") - .execute().body(); - - System.out.println("testGetoken():"+data); - Map datas = JSONUtil.parseObj(data); - - //ECOLOGY返回的token - // TODO 为Token缓存设置过期时间 - redisRepository.setExpire("JIUZHU_SERVER_TOKEN",StrUtil.nullToEmpty((String)datas.get("token")), 60 * 30); - return datas; - } } diff --git a/src/main/java/com/zhgd/xmgl/modules/cost/controller/CostContractPlanController.java b/src/main/java/com/zhgd/xmgl/modules/cost/controller/CostContractPlanController.java index ca641d146..f50425fe0 100644 --- a/src/main/java/com/zhgd/xmgl/modules/cost/controller/CostContractPlanController.java +++ b/src/main/java/com/zhgd/xmgl/modules/cost/controller/CostContractPlanController.java @@ -7,6 +7,7 @@ import com.zhgd.xmgl.modules.basicdata.entity.Company; import com.zhgd.xmgl.modules.basicdata.service.ICompanyService; import com.zhgd.xmgl.modules.cost.dto.CostBudgetDto; import com.zhgd.xmgl.modules.cost.dto.CostContractPlanDto; +import com.zhgd.xmgl.modules.cost.dto.DynamicCostDto; import com.zhgd.xmgl.modules.cost.entity.CostSubject; import com.zhgd.xmgl.modules.cost.vo.CostContractPlanVo; import com.zhgd.xmgl.modules.project.entity.Project; @@ -315,4 +316,25 @@ public class CostContractPlanController { return Result.ok("文件导入失败!"); } + /** + * 树形查询动态成本 + * + * @param map + * @return + */ + @OperLog(operModul = "合约规划管理", operType = "列表查询", operDesc = "树形查询动态成本") + @ApiOperation(value = " 树形查询动态成本", notes = "树形查询动态成本", httpMethod = "POST") + @ApiImplicitParam(name = "projectSn", value = "项目SN", paramType = "body", dataType = "String") + @PostMapping(value = "/dynamicTree") + public Result> dynamicTree(@ApiIgnore @RequestBody Map map) { + String projectSn = MapUtils.getString(map, "projectSn"); + ProjectInfoExtVo projectInfoBySn = projectService.getProjectInfoBySn(projectSn); + Company company = companyService.getOne(Wrappers.lambdaQuery().eq(Company::getCompanySn, projectInfoBySn.getCompanySn())); + map.put("companySn", company.getHeadquartersSn()); + QueryWrapper queryWrapper = QueryGenerator.initPageQueryWrapper(CostSubject.class, map); + queryWrapper.lambda().eq(CostSubject::getType, projectInfoBySn.getProjectLx()); + List list = costContractPlanService.dynamicTree(queryWrapper, projectInfoBySn); + return Result.success(list); + } + } diff --git a/src/main/java/com/zhgd/xmgl/modules/cost/controller/CostPayPlanController.java b/src/main/java/com/zhgd/xmgl/modules/cost/controller/CostPayPlanController.java index 29278b420..e8d3b4843 100644 --- a/src/main/java/com/zhgd/xmgl/modules/cost/controller/CostPayPlanController.java +++ b/src/main/java/com/zhgd/xmgl/modules/cost/controller/CostPayPlanController.java @@ -5,9 +5,14 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zhgd.annotation.OperLog; +import com.zhgd.xmgl.modules.basicdata.entity.Company; +import com.zhgd.xmgl.modules.cost.dto.ContractPayOverviewDto; +import com.zhgd.xmgl.modules.cost.dto.DynamicCostDto; import com.zhgd.xmgl.modules.cost.entity.CostQuantity; +import com.zhgd.xmgl.modules.cost.entity.CostSubject; import com.zhgd.xmgl.modules.cost.service.ICostQuantityService; import com.zhgd.xmgl.modules.project.entity.Project; +import com.zhgd.xmgl.modules.project.entity.vo.ProjectInfoExtVo; import com.zhgd.xmgl.modules.project.service.IProjectService; import com.zhgd.xmgl.util.PageUtil; import io.swagger.annotations.Api; @@ -259,4 +264,19 @@ public class CostPayPlanController { } return result; } + + /** + * 支付总览 + * + * @param map + * @return + */ + @OperLog(operModul = "资金计划管理", operType = "列表查询", operDesc = "支付总览") + @ApiOperation(value = " 支付总览", notes = "支付总览", httpMethod = "POST") + @ApiImplicitParam(name = "projectSn", value = "项目SN", paramType = "body", dataType = "String") + @PostMapping(value = "/payOverview") + public Result> payOverview(@ApiIgnore @RequestBody Map map) { + List list = costPayPlanService.payOverview(MapUtils.getString(map, "projectSn")); + return Result.success(list); + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/cost/controller/IndexController.java b/src/main/java/com/zhgd/xmgl/modules/cost/controller/IndexController.java index 4b0b86966..341bbeeed 100644 --- a/src/main/java/com/zhgd/xmgl/modules/cost/controller/IndexController.java +++ b/src/main/java/com/zhgd/xmgl/modules/cost/controller/IndexController.java @@ -4,6 +4,7 @@ import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; 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.zhgd.annotation.OperLog; import com.zhgd.jeecg.common.api.vo.Result; import com.zhgd.jeecg.common.system.query.QueryGenerator; @@ -14,6 +15,8 @@ import com.zhgd.xmgl.modules.cost.entity.CostSubject; import com.zhgd.xmgl.modules.cost.service.ICostBudgetService; import com.zhgd.xmgl.modules.cost.service.ICostContractService; import com.zhgd.xmgl.modules.cost.service.ICostSubjectService; +import com.zhgd.xmgl.modules.jz.entity.*; +import com.zhgd.xmgl.modules.jz.service.*; import com.zhgd.xmgl.modules.project.entity.ProgressPanoramaNodePlan; import com.zhgd.xmgl.modules.project.entity.Project; import com.zhgd.xmgl.modules.project.service.IProgressPanoramaNodePlanService; @@ -67,6 +70,21 @@ public class IndexController { @Autowired private IProgressPanoramaNodePlanService progressPanoramaNodePlanService; + @Autowired + private IJzCustomerService jzCustomerService; + + @Autowired + private IJzProjectService jzProjectService; + + @Autowired + private IJzBidService jzBidService; + + @Autowired + private IJzProjectFollowService jzProjectFollowService; + + @Autowired + private IJzBidResultService jzBidResultService; + /** * 成本统计信息 * @return @@ -128,11 +146,37 @@ public class IndexController { Map stateMap = new HashMap(); stateMap.put("total", list.size()); stateMap.put("unStart", list.stream().filter(l -> l.getStatus() == 1).count()); - stateMap.put("inProgress", list.stream().filter(l -> l.getStatus() == 2 && DateUtil.parseDate(l.getFinishDate()).compareTo(new Date()) >= 0).count()); - stateMap.put("delay", list.stream().filter(l -> l.getStatus() == 2 && DateUtil.parseDate(l.getFinishDate()).compareTo(new Date()) < 0).count()); + stateMap.put("inProgress", list.stream().filter(l -> l.getStatus() == 2).count()); + stateMap.put("delay", list.stream().filter(l -> l.getStatus() < 3 && DateUtil.parseDate(l.getPlanFinishDate()).compareTo(new Date()) < 0).count()); stateMap.put("delayCompletion", list.stream().filter(l -> l.getStatus() == 4).count()); stateMap.put("completion", list.stream().filter(l -> l.getStatus() == 3).count()); resultMap.put("stateMap", stateMap); return Result.success(resultMap); } + + /** + * 项目招投标管理 + * @return + */ + @OperLog(operModul = "门户信息管理", operType = "列表查询", operDesc = "项目招投标管理") + @ApiOperation(value = "项目招投标管理", notes = "项目招投标管理", httpMethod = "GET") + @GetMapping(value = "jzProjectStat") + public Result> jzProjectStat() { + List jzCustomerList = jzCustomerService.list(); + List jzProjectList = jzProjectService.pageList(new Page(-1, -1), null).getRecords(); + List jzBidList = jzBidService.list(); + List jzProjectFollowList = jzProjectFollowService.list(); + List jzBidResults = jzBidResultService.list(Wrappers.lambdaQuery().eq(JzBidResult::getWinBid, 1)); + Map stateMap = new HashMap(); + stateMap.put("customer", jzCustomerList.size()); + stateMap.put("project", jzProjectList.size()); + stateMap.put("build", jzProjectList.stream().filter(l -> l.getStatus() == 1).count()); + stateMap.put("result", jzBidResults.size()); + stateMap.put("totalList", jzProjectList); + stateMap.put("buildList", jzProjectList.stream().filter(l -> l.getStatus() == 1).collect(Collectors.toList())); + stateMap.put("follow", jzProjectList.stream().filter(j -> jzProjectFollowList.stream().map(b -> b.getProjectId()).collect(Collectors.toList()).contains(j.getId().toString())).collect(Collectors.toList())); + stateMap.put("bidList", jzProjectList.stream().filter(j -> jzBidList.stream().map(b -> b.getProjectId()).collect(Collectors.toList()).contains(j.getId().toString())).collect(Collectors.toList())); + stateMap.put("resultList", jzProjectList.stream().filter(j -> jzBidResults.stream().map(b -> b.getProjectId()).collect(Collectors.toList()).contains(j.getId().toString())).collect(Collectors.toList())); + return Result.success(stateMap); + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/cost/dto/ContractPayOverviewDto.java b/src/main/java/com/zhgd/xmgl/modules/cost/dto/ContractPayOverviewDto.java new file mode 100644 index 000000000..d823282be --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/cost/dto/ContractPayOverviewDto.java @@ -0,0 +1,30 @@ +package com.zhgd.xmgl.modules.cost.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel(value = "支付总览(DTO)", description = "ContractPayOverviewDto") +public class ContractPayOverviewDto { + + @ApiModelProperty(value = "项目ID") + private Long projectId; + + @ApiModelProperty(value = "项目名称") + private String projectName; + + @ApiModelProperty(value = "计划付款金额") + private BigDecimal planPayAmount = new BigDecimal(0); + + @ApiModelProperty(value = "实际支付金额") + private BigDecimal payAmount = new BigDecimal(0); + + @ApiModelProperty(value = "计划与实际支付差额") + private BigDecimal costDifference = new BigDecimal(0); + + @ApiModelProperty(value = "计划与实际支付差额百分比") + private String costDifferenceRatio = "0"; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/cost/dto/DynamicCostDto.java b/src/main/java/com/zhgd/xmgl/modules/cost/dto/DynamicCostDto.java new file mode 100644 index 000000000..2ef2d887e --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/cost/dto/DynamicCostDto.java @@ -0,0 +1,48 @@ +package com.zhgd.xmgl.modules.cost.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +@Data +@ApiModel(value = "动态成本(DTO)", description = "DynamicCostDto") +public class DynamicCostDto { + + @ApiModelProperty(value = "科目名称") + private Long subjectId; + + @ApiModelProperty(value = "科目名称") + private String subjectName; + + @ApiModelProperty(value = "目标+调整") + private BigDecimal goal = new BigDecimal(0); + + @ApiModelProperty(value = "动态成本") + private BigDecimal dynamicCost = new BigDecimal(0); + + @ApiModelProperty(value = "差额比例") + private String costDifference = "0"; + + @ApiModelProperty(value = "合同金额") + private BigDecimal contractAmount = new BigDecimal(0); + + @ApiModelProperty(value = "在途成本") + private BigDecimal underApproval = new BigDecimal(0); + + @ApiModelProperty(value = "待发生合约") + private BigDecimal toOccur = new BigDecimal(0); + + @ApiModelProperty(value = "预估变更") + private BigDecimal estimatedChange = new BigDecimal(0); + + @ApiModelProperty(value = "规划余量") + private BigDecimal allowance = new BigDecimal(0); + + @ApiModelProperty(value = "子级动态成本信息") + private List children = new ArrayList<>(); +} diff --git a/src/main/java/com/zhgd/xmgl/modules/cost/entity/CostContract.java b/src/main/java/com/zhgd/xmgl/modules/cost/entity/CostContract.java index d4b84e824..59e57185d 100644 --- a/src/main/java/com/zhgd/xmgl/modules/cost/entity/CostContract.java +++ b/src/main/java/com/zhgd/xmgl/modules/cost/entity/CostContract.java @@ -32,6 +32,12 @@ public class CostContract implements Serializable { @TableId(type = IdType.INPUT) @ApiModelProperty(value = "合同ID") private Integer id; + /** + * 成本科目ID + */ + @Excel(name = "成本科目ID", width = 15) + @ApiModelProperty(value = "成本科目ID") + private Long subjectId; /** * 合同摘要 */ diff --git a/src/main/java/com/zhgd/xmgl/modules/cost/service/ICostContractPlanService.java b/src/main/java/com/zhgd/xmgl/modules/cost/service/ICostContractPlanService.java index 321d3f7d3..788eb9f9b 100644 --- a/src/main/java/com/zhgd/xmgl/modules/cost/service/ICostContractPlanService.java +++ b/src/main/java/com/zhgd/xmgl/modules/cost/service/ICostContractPlanService.java @@ -3,6 +3,7 @@ package com.zhgd.xmgl.modules.cost.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zhgd.xmgl.modules.cost.dto.CostBudgetDto; import com.zhgd.xmgl.modules.cost.dto.CostContractPlanDto; +import com.zhgd.xmgl.modules.cost.dto.DynamicCostDto; import com.zhgd.xmgl.modules.cost.entity.CostContractPlan; import com.baomidou.mybatisplus.extension.service.IService; import com.zhgd.xmgl.modules.cost.entity.CostSubject; @@ -21,6 +22,8 @@ public interface ICostContractPlanService extends IService { List tree(QueryWrapper wrapper, ProjectInfoExtVo projectInfoBySn); + List dynamicTree(QueryWrapper wrapper, ProjectInfoExtVo projectInfoBySn); + boolean saveInfo(CostContractPlanVo costContractPlanVo); boolean updateInfo(CostContractPlanVo costContractPlanVo); diff --git a/src/main/java/com/zhgd/xmgl/modules/cost/service/ICostPayPlanService.java b/src/main/java/com/zhgd/xmgl/modules/cost/service/ICostPayPlanService.java index c4f94dad0..c21773cff 100644 --- a/src/main/java/com/zhgd/xmgl/modules/cost/service/ICostPayPlanService.java +++ b/src/main/java/com/zhgd/xmgl/modules/cost/service/ICostPayPlanService.java @@ -1,8 +1,11 @@ package com.zhgd.xmgl.modules.cost.service; +import com.zhgd.xmgl.modules.cost.dto.ContractPayOverviewDto; import com.zhgd.xmgl.modules.cost.entity.CostPayPlan; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + /** * @Description: 资金计划 * @author: pengj @@ -13,4 +16,6 @@ public interface ICostPayPlanService extends IService { CostPayPlan queryById(String id); + + List payOverview(String projectSn); } diff --git a/src/main/java/com/zhgd/xmgl/modules/cost/service/impl/CostContractPlanServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/cost/service/impl/CostContractPlanServiceImpl.java index 2aa3fa9a6..153cd9583 100644 --- a/src/main/java/com/zhgd/xmgl/modules/cost/service/impl/CostContractPlanServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/cost/service/impl/CostContractPlanServiceImpl.java @@ -5,14 +5,13 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zhgd.xmgl.modules.cost.dto.CostBudgetDto; import com.zhgd.xmgl.modules.cost.dto.CostContractPlanDto; -import com.zhgd.xmgl.modules.cost.entity.CostBudget; -import com.zhgd.xmgl.modules.cost.entity.CostContractPayPlan; -import com.zhgd.xmgl.modules.cost.entity.CostContractPlan; -import com.zhgd.xmgl.modules.cost.entity.CostSubject; +import com.zhgd.xmgl.modules.cost.dto.DynamicCostDto; +import com.zhgd.xmgl.modules.cost.entity.*; import com.zhgd.xmgl.modules.cost.mapper.CostContractPayPlanMapper; import com.zhgd.xmgl.modules.cost.mapper.CostContractPlanMapper; import com.zhgd.xmgl.modules.cost.service.ICostContractPayPlanService; import com.zhgd.xmgl.modules.cost.service.ICostContractPlanService; +import com.zhgd.xmgl.modules.cost.service.ICostContractService; import com.zhgd.xmgl.modules.cost.service.ICostSubjectService; import com.zhgd.xmgl.modules.cost.vo.CostContractPlanVo; import com.zhgd.xmgl.modules.project.entity.vo.ProjectInfoExtVo; @@ -24,7 +23,9 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -41,6 +42,9 @@ public class CostContractPlanServiceImpl extends ServiceImpl dynamicTree(QueryWrapper wrapper, ProjectInfoExtVo projectInfoBySn) { + List allSubList = costSubjectService.list(wrapper); + List parentSubList = allSubList.stream().filter(l -> l.getParentId().toString().equals("0") && StringUtils.isNotBlank(l.getName())).collect(Collectors.toList()); + List resultList = new ArrayList<>(); + if (allSubList.size() > 0) { + List contractPlanList = this.list(Wrappers.lambdaQuery() + .eq(CostContractPlan::getProjectSn, projectInfoBySn.getProjectSn())); + List contractList = costContractService.list(Wrappers.lambdaQuery() + .eq(CostContract::getProjectSn, projectInfoBySn.getProjectSn())); + resultList = getDynamicChildren(parentSubList, allSubList, contractPlanList, contractList); + } + return resultList; + } + @Override public boolean saveInfo(CostContractPlanVo costContractPlanVo) { List costContractPayPlanList = costContractPlanVo.getCostContractPayPlanList(); @@ -138,6 +157,37 @@ public class CostContractPlanServiceImpl extends ServiceImpl getDynamicChildren(List list, List allList, List contractPlanList, List contractList) { + List dynamicCostDtoList = new ArrayList<>(); + for (CostSubject costSubject : list) { + DynamicCostDto dynamicCostDto = new DynamicCostDto(); + dynamicCostDto.setSubjectId(costSubject.getId()); + dynamicCostDto.setSubjectName(costSubject.getName()); + // 查询合约 + List children = allList.stream().filter(a -> Arrays.asList(a.getAncestors().split(",")).contains(costSubject.getId().toString())).collect(Collectors.toList()); + List childrenSubIds = children.stream().map(c -> c.getId().toString()).collect(Collectors.toList()); + List contractPlans = new ArrayList<>(); + List contracts = new ArrayList<>(); + if (childrenSubIds.size() > 0) { + contractPlans = contractPlanList.stream().filter(c -> childrenSubIds.contains(c.getSubjectId().toString())).collect(Collectors.toList()); + contracts = contractList.stream().filter(c -> childrenSubIds.contains(c.getSubjectId().toString())).collect(Collectors.toList()); + } else { + contractPlans = contractPlanList.stream().filter(c -> c.getSubjectId().toString().equals(costSubject.getId().toString())).collect(Collectors.toList()); + contracts = contractList.stream().filter(c -> c.getSubjectId().toString().equals(costSubject.getId().toString())).collect(Collectors.toList()); + } + dynamicCostDto.setGoal(contractPlans.stream().map(c -> new BigDecimal(c.getGoal())).reduce(BigDecimal.ZERO, BigDecimal::add)); + dynamicCostDto.setContractAmount(contracts.stream().filter(c -> c.getZt().equals("已生效")).map(c -> c.getHthszj()).reduce(BigDecimal.ZERO, BigDecimal::add)); + dynamicCostDto.setUnderApproval(contracts.stream().filter(c -> c.getZt().equals("内审中")).map(c -> c.getHthszj()).reduce(BigDecimal.ZERO, BigDecimal::add)); + dynamicCostDto.setDynamicCost(dynamicCostDto.getContractAmount().add(dynamicCostDto.getUnderApproval()).add(dynamicCostDto.getToOccur()).add(dynamicCostDto.getContractAmount())); + BigDecimal subtract = dynamicCostDto.getGoal().subtract(dynamicCostDto.getDynamicCost()); + dynamicCostDto.setCostDifference(dynamicCostDto.getGoal().compareTo(new BigDecimal(0)) > 0 ? subtract.divide(dynamicCostDto.getGoal(), 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)).toString() : "0"); + dynamicCostDto.setAllowance(subtract); + dynamicCostDto.setChildren(getDynamicChildren(children, allList, contractPlanList, contractList)); + dynamicCostDtoList.add(dynamicCostDto); + } + return dynamicCostDtoList; + } + private List convert(List list) { List dtoList = new ArrayList<>(); for (CostSubject costSubject : list) { diff --git a/src/main/java/com/zhgd/xmgl/modules/cost/service/impl/CostPayPlanServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/cost/service/impl/CostPayPlanServiceImpl.java index 09ed8bc6a..6061a5fbc 100644 --- a/src/main/java/com/zhgd/xmgl/modules/cost/service/impl/CostPayPlanServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/cost/service/impl/CostPayPlanServiceImpl.java @@ -1,17 +1,22 @@ package com.zhgd.xmgl.modules.cost.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.zhgd.xmgl.modules.cost.dto.ContractPayOverviewDto; import com.zhgd.xmgl.modules.cost.entity.CostPayPlan; import com.zhgd.xmgl.modules.cost.entity.CostQuantity; import com.zhgd.xmgl.modules.cost.mapper.CostPayPlanMapper; import com.zhgd.xmgl.modules.cost.mapper.CostQuantityMapper; import com.zhgd.xmgl.modules.cost.service.ICostPayPlanService; import com.zhgd.xmgl.modules.cost.service.ICostQuantityService; +import com.zhgd.xmgl.modules.project.entity.Project; +import com.zhgd.xmgl.modules.project.service.IProjectService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.math.BigDecimal; +import java.util.ArrayList; import java.util.List; /** @@ -26,6 +31,9 @@ public class CostPayPlanServiceImpl extends ServiceImpl list = costQuantityService.list(Wrappers.lambdaQuery().eq(CostQuantity::getPayPlanId, id)); @@ -33,4 +41,25 @@ public class CostPayPlanServiceImpl extends ServiceImpl payOverview(String projectSn) { + List overviewDtos = new ArrayList<>(); + List projects = projectService.list(); + List list = this.list(); + for (Project project : projects) { + ContractPayOverviewDto contractPayOverviewDto = new ContractPayOverviewDto(); + contractPayOverviewDto.setProjectId(project.getProjectId()); + contractPayOverviewDto.setProjectName(project.getProjectName()); + contractPayOverviewDto.setPlanPayAmount(list.stream().map(l -> new BigDecimal(l.getPayAmount())).reduce(BigDecimal.ZERO, BigDecimal::add)); + contractPayOverviewDto.setPayAmount(new BigDecimal(0)); + contractPayOverviewDto.setCostDifference(contractPayOverviewDto.getPlanPayAmount().subtract(contractPayOverviewDto.getPayAmount())); + if (contractPayOverviewDto.getPlanPayAmount().compareTo(new BigDecimal(0)) != 0) { + contractPayOverviewDto.setCostDifferenceRatio(contractPayOverviewDto.getCostDifference().divide(contractPayOverviewDto.getPlanPayAmount(), 2, BigDecimal.ROUND_HALF_UP) + .multiply(new BigDecimal(100)).toString()); + } + overviewDtos.add(contractPayOverviewDto); + } + return overviewDtos; + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/jz/controller/JzProjectController.java b/src/main/java/com/zhgd/xmgl/modules/jz/controller/JzProjectController.java index 56dcee7e2..8b7616fa2 100644 --- a/src/main/java/com/zhgd/xmgl/modules/jz/controller/JzProjectController.java +++ b/src/main/java/com/zhgd/xmgl/modules/jz/controller/JzProjectController.java @@ -89,13 +89,17 @@ public class JzProjectController { Integer state = MapUtils.getInteger(map, "state"); if (state != null) { List projectIds = new ArrayList<>(); - if (state == 2) { - projectIds = jzProjectFollowService.list().stream().map(p -> p.getProjectId()).distinct().collect(Collectors.toList()); - } else if (state == 3) { - projectIds = jzBidExamService.list().stream().map(p -> p.getProjectId()).distinct().collect(Collectors.toList()); + if (state == 1) { + queryWrapper.lambda().eq(JzProject::getStatus, 1); + } else { + if (state == 2) { + projectIds = jzProjectFollowService.list().stream().map(p -> p.getProjectId()).distinct().collect(Collectors.toList()); + } else if (state == 3) { + projectIds = jzBidExamService.list().stream().map(p -> p.getProjectId()).distinct().collect(Collectors.toList()); + } + projectIds.add(0L); + queryWrapper.lambda().in(JzProject::getId, projectIds); } - projectIds.add(0L); - queryWrapper.lambda().in(JzProject::getId, projectIds); } IPage pageList = jzProjectService.pageList(page, queryWrapper); return Result.success(pageList); @@ -238,7 +242,7 @@ public class JzProjectController { String [] type = {"工程类", "供货配合调试类", "售后服务类", "软件研发类", "维修类", "人员服务类", "纯销售类", "其他"}; List list = jzProjectService.list(); int follow = (int) jzProjectFollowService.list().stream().map(p -> p.getProjectId()).distinct().count(); - int [] num = {list.size(), follow, 0}; + int [] num = {(int) list.stream().filter(l -> l.getStatus() == 1).count(), follow, 0}; for (int i = 0; i < state.length; i++) { TableDto tableDto = new TableDto(); tableDto.setTitle(state[i]); @@ -253,7 +257,7 @@ public class JzProjectController { tableDto.setTitle(type[i]); Integer value = i + 1; tableDto.setValue("2-" + value); - tableDto.setNum((int) list.stream().filter(l -> l.getType().equals(value.toString())).count()); + tableDto.setNum((int) list.stream().filter(l -> l.getStatus() == 1 && l.getType().equals(value.toString())).count()); tableDto.setFlag(2); tableDtoList.add(tableDto); } diff --git a/src/main/java/com/zhgd/xmgl/modules/jz/entity/JzProject.java b/src/main/java/com/zhgd/xmgl/modules/jz/entity/JzProject.java index 8b7c10c64..a17af33dd 100644 --- a/src/main/java/com/zhgd/xmgl/modules/jz/entity/JzProject.java +++ b/src/main/java/com/zhgd/xmgl/modules/jz/entity/JzProject.java @@ -210,6 +210,24 @@ public class JzProject implements Serializable { @Excel(name = "附件", width = 15) @ApiModelProperty(value = "附件") private String fileUrl; + /** + * 状态(0:未立项;1:已立项) + */ + @Excel(name = "状态(0:未立项;1:已立项)", width = 15) + @ApiModelProperty(value = "状态(0:未立项;1:已立项)") + private Integer status; + /** + * 项目负责人ID + */ + @Excel(name = "项目负责人ID", width = 15) + @ApiModelProperty(value = "项目负责人ID") + private String chargerId; + /** + * 项目负责人名称 + */ + @Excel(name = "项目负责人名称", width = 15) + @ApiModelProperty(value = "项目负责人名称") + private String chargerName; @TableField(exist = false) diff --git a/src/main/java/com/zhgd/xmgl/modules/project/controller/ProgressPanoramaNodePlanController.java b/src/main/java/com/zhgd/xmgl/modules/project/controller/ProgressPanoramaNodePlanController.java index 2edc13a71..66d0e9607 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/controller/ProgressPanoramaNodePlanController.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/controller/ProgressPanoramaNodePlanController.java @@ -3,6 +3,7 @@ package com.zhgd.xmgl.modules.project.controller; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; +import cn.hutool.http.HttpRequest; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -17,13 +18,19 @@ import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.jeecg.common.mybatis.EntityMap; import com.zhgd.jeecg.common.system.query.QueryGenerator; import com.zhgd.xmgl.modules.basicdata.dto.ProjectKeyNode; +import com.zhgd.xmgl.modules.basicdata.entity.DictionaryItem; +import com.zhgd.xmgl.modules.basicdata.service.IDictionaryItemService; import com.zhgd.xmgl.modules.basicdata.service.ISystemUserService; import com.zhgd.xmgl.modules.project.entity.*; import com.zhgd.xmgl.modules.project.entity.dto.ProgressPanoramaNodePlanDto; +import com.zhgd.xmgl.modules.project.entity.dto.ProgressPanoramaNodePlanExecDto; import com.zhgd.xmgl.modules.project.entity.vo.ProjectInfoExtVo; import com.zhgd.xmgl.modules.project.service.IProgressPanoramaNodePlanHistoryService; import com.zhgd.xmgl.modules.project.service.IProgressPanoramaNodePlanService; import com.zhgd.xmgl.modules.project.service.IProjectService; +import com.zhgd.xmgl.security.entity.UserInfo; +import com.zhgd.xmgl.security.util.SecurityUtils; +import com.zhgd.xmgl.util.JiuzhuUtil; import com.zhgd.xmgl.util.MessageUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -33,9 +40,11 @@ import jodd.util.StringUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; +import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -48,7 +57,7 @@ import java.util.stream.Collectors; * @version: V1.0 */ @RestController - @RequestMapping("/xmgl/progressPanoramaNodePlan") +@RequestMapping("/xmgl/progressPanoramaNodePlan") @Slf4j @Api(tags="进度-全景节点计划") public class ProgressPanoramaNodePlanController { @@ -58,6 +67,15 @@ public class ProgressPanoramaNodePlanController { @Autowired private IProjectService projectService; + @Autowired + private IDictionaryItemService dictionaryItemService; + + @Autowired + private JiuzhuUtil jiuzhuUtil; + + @Value("${jiuzhu.address}") + private final String ADDRESS = "http://218.95.151.122:18000"; + // /** // * 列表查询 // * @return @@ -103,6 +121,10 @@ public class ProgressPanoramaNodePlanController { @PostMapping(value = "/filterList") public Result> filterList(@RequestBody ProgressPanoramaNodePlan progressPanoramaNodePlan) { QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(progressPanoramaNodePlan); + if (progressPanoramaNodePlan.getNature() != null) { + List projectList = projectService.list(Wrappers.lambdaQuery().eq(Project::getNature, progressPanoramaNodePlan.getNature())); + queryWrapper.lambda().in(ProgressPanoramaNodePlan::getProjectSn, projectList.stream().map(p -> p.getProjectSn()).collect(Collectors.toList())); + } return Result.success(progressPanoramaNodePlanService.list(queryWrapper)); } @@ -120,9 +142,10 @@ public class ProgressPanoramaNodePlanController { @PostMapping(value = "/keyNodeList") public Result> keyNodeList(@RequestBody Map map) { String projectSn = MapUtils.getString(map, "projectSn"); + String nature = MapUtils.getString(map, "nature"); Integer type = MapUtils.getInteger(map, "type"); - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery().eq(Project::getNature, 1); - if (StringUtil.isNotBlank(projectSn)) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery().eq(Project::getNature, nature); + if (StringUtil.isNotBlank(projectSn)) { wrapper.eq(Project::getProjectSn, projectSn); } List list = projectService.list(wrapper); @@ -360,4 +383,114 @@ public class ProgressPanoramaNodePlanController { } return Result.success(resultMap); } + + /** + * 计划达成统计 + * @param + * @return + */ + @ApiOperation(value = "计划达成统计", notes = "计划达成统计", httpMethod = "POST") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "beginTime", value = "开始时间", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "body", required = true, dataType = "String") + }) + @PostMapping(value = "/planExec") + public Result> planExec(@RequestBody Map map) { + List execDtoList = new ArrayList<>(); + String projectSn = MapUtils.getString(map, "projectSn"); + String beginTime = MapUtils.getString(map, "beginTime"); + String endTime = MapUtils.getString(map, "endTime"); + List list = progressPanoramaNodePlanService.list(Wrappers.lambdaQuery() + .eq(ProgressPanoramaNodePlan::getProjectSn, projectSn) + .eq(ProgressPanoramaNodePlan::getApprovalStatue, 2) + .ge(ProgressPanoramaNodePlan::getPlanFinishDate, beginTime) + .le(ProgressPanoramaNodePlan::getPlanFinishDate, endTime) + .orderByAsc(ProgressPanoramaNodePlan::getPlanFinishDate)); + String [] name = {"主项任务", "专项任务"}; + for (int i = 0; i < name.length; i++) { + int finalI = i; + List panoramaNodePlans = list.stream().filter(l -> l.getLevelName().equals(name[finalI])).collect(Collectors.toList()); + ProgressPanoramaNodePlanExecDto execDto = new ProgressPanoramaNodePlanExecDto(); + execDto.setPlanName(name[i]); + execDto.setTotal(panoramaNodePlans.size()); + List planCompalete = panoramaNodePlans.stream().filter(p -> DateUtil.parseDate(p.getPlanFinishDate()).compareTo(new Date()) < 0).collect(Collectors.toList()); + execDto.setPlanCompleteNum(planCompalete.size()); + int normalNum = (int) panoramaNodePlans.stream().filter(p -> p.getStatus() == 3).count(); + execDto.setNormalNum(normalNum); + execDto.setNormalRatio(planCompalete.size() == 0 ? new BigDecimal(0) : new BigDecimal(normalNum).divide(new BigDecimal(planCompalete.size()), 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100))); + int delayNum = (int) panoramaNodePlans.stream().filter(p -> p.getStatus() == 4).count(); + execDto.setDelayNum(delayNum); + int completeNum = normalNum + delayNum; + execDto.setCompleteNum(completeNum); + execDto.setCompleteRatio(planCompalete.size() == 0 ? new BigDecimal(0) : new BigDecimal(completeNum).divide(new BigDecimal(planCompalete.size()), 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100))); + execDto.setDelayUnComplete((int) panoramaNodePlans.stream().filter(p -> p.getStatus() < 3 && DateUtil.parseDate(p.getPlanFinishDate()).compareTo(new Date()) < 0).count()); + execDtoList.add(execDto); + } + List planType = dictionaryItemService.getDictList("plan_type", null); + for (DictionaryItem dictionaryItem : planType) { + List panoramaNodePlans = list.stream().filter(l -> StringUtils.isNotBlank(l.getType()) && l.getType().equals(dictionaryItem.getData())).collect(Collectors.toList()); + ProgressPanoramaNodePlanExecDto execDto = new ProgressPanoramaNodePlanExecDto(); + execDto.setPlanName(dictionaryItem.getName()); + execDto.setTotal(panoramaNodePlans.size()); + List planCompalete = panoramaNodePlans.stream().filter(p -> DateUtil.parseDate(p.getPlanFinishDate()).compareTo(new Date()) < 0).collect(Collectors.toList()); + execDto.setPlanCompleteNum(planCompalete.size()); + int normalNum = (int) panoramaNodePlans.stream().filter(p -> p.getStatus() == 3).count(); + execDto.setNormalNum(normalNum); + execDto.setNormalRatio(planCompalete.size() == 0 ? new BigDecimal(0) : new BigDecimal(normalNum).divide(new BigDecimal(planCompalete.size()), 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100))); + int delayNum = (int) panoramaNodePlans.stream().filter(p -> p.getStatus() == 4).count(); + execDto.setDelayNum(delayNum); + int completeNum = normalNum + delayNum; + execDto.setCompleteNum(completeNum); + execDto.setCompleteRatio(planCompalete.size() == 0 ? new BigDecimal(0) : new BigDecimal(completeNum).divide(new BigDecimal(planCompalete.size()), 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100))); + execDto.setDelayUnComplete((int) panoramaNodePlans.stream().filter(p -> p.getStatus() < 3 && DateUtil.parseDate(p.getPlanFinishDate()).compareTo(new Date()) < 0).count()); + execDtoList.add(execDto); + } + return Result.success(execDtoList); + } + + /** + * 任务催办 + * @param + * @return + */ + @ApiOperation(value = "任务催办", notes = "任务催办", httpMethod = "POST") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "任务ID", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "content", value = "催办内容", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "requireDate", value = "要求完成日期", paramType = "body", required = true, dataType = "String") + }) + @PostMapping(value = "/supervision") + public Result supervision(@RequestBody Map map) { + ProgressPanoramaNodePlan nodePlan = progressPanoramaNodePlanService.getById(MapUtils.getString(map, "id")); + UserInfo user = SecurityUtils.getUser(); + Map params = new HashMap<>(); + Map mainMap = new HashMap<>(); + mainMap.put("sqr", user.getUserId()); + mainMap.put("sqrg", DateUtil.formatDate(new Date())); + mainMap.put("zbr", nodePlan.getChargerId()); + mainMap.put("jhksrq", nodePlan.getPlanStartDate()); + mainMap.put("jhjsrq", nodePlan.getPlanFinishDate()); + mainMap.put("rwmc", nodePlan.getNodeName()); + mainMap.put("content", MapUtils.getString(map, "content")); + mainMap.put("requireDate", MapUtils.getString(map, "requireDate")); + JSONArray mainData = new JSONArray(); + for (String s : mainMap.keySet()) { + JSONObject obj = new JSONObject(); + obj.put("fieldName", s); + obj.put("fieldValue", mainMap.get(s)); + mainData.add(obj); + } + params.put("requestName", "任务督办"); + params.put("mainData", JSON.toJSONString(mainData)); + params.put("detailData","[]"); + params.put("workflowId", "422"); + params.put("remark","restful接口创建流程测试"); + Map otherParams = new HashMap<>(); + otherParams.put("isVerifyPer","0"); + params.put("otherParams",JSONObject.toJSONString(otherParams)); + System.out.println(JSON.toJSONString(params)); +// String result = jiuzhuUtil.testRestful1(ADDRESS, "/api/workflow/paService/doCreateRequest", params, "5583bc0e-220e-4a44-8e14-d838d47ad9b9"); + return Result.ok(); + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNode.java b/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNode.java index 03018f372..d92cf9f27 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNode.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNode.java @@ -71,4 +71,7 @@ public class ProgressPanoramaNode implements Serializable { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @ApiModelProperty(value = "最后操作时间") private Date updateTime; + + @ApiModelProperty(value = "项目性质") + private Integer nature; } diff --git a/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlan.java b/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlan.java index d5cc77a9b..8de7fe4c7 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlan.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlan.java @@ -1,6 +1,7 @@ package com.zhgd.xmgl.modules.project.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.databind.annotation.JsonSerialize; @@ -88,7 +89,7 @@ public class ProgressPanoramaNodePlan implements Serializable { * 状态 */ @Excel(name = "状态", width = 15) - @ApiModelProperty(value = "状态 2-已发布(进行中),3-节点汇报审批中,4-计划审批中,6-归档(完成)") + @ApiModelProperty(value = "状态(1:未开始[默认状态];2:进行中;3:正常完成;4:延期完成)") private Integer status; /** * 实际偏差 @@ -194,4 +195,12 @@ public class ProgressPanoramaNodePlan implements Serializable { */ @ApiModelProperty(value = "完成标准") private String completeStandard; + + @TableField(exist = false) + @ApiModelProperty(value = "节点类别") + private String typeName; + + @TableField(exist = false) + @ApiModelProperty(value = "项目性质") + private Integer nature; } diff --git a/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlanChangeRecord.java b/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlanChangeRecord.java index 615958ac4..9521cd20d 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlanChangeRecord.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlanChangeRecord.java @@ -76,35 +76,11 @@ public class ProgressPanoramaNodePlanChangeRecord implements Serializable { @ApiModelProperty(value = "计划完成时间") private String planFinishDate; /** - * 实际开始时间 + * 节点责任部门名称 */ - @Excel(name = "实际开始时间", width = 15) - @ApiModelProperty(value = "实际开始时间") - private String startDate; - /** - * 实际完成时间 - */ - @Excel(name = "实际完成时间", width = 15) - @ApiModelProperty(value = "实际完成时间") - private String finishDate; - /** - * 状态 - */ - @Excel(name = "状态", width = 15) - @ApiModelProperty(value = "状态") - private Integer status; - /** - * 实际偏差 - */ - @Excel(name = "实际偏差", width = 15) - @ApiModelProperty(value = "实际偏差") - private String diffDate; - /** - * 节点责任人编号 - */ - @Excel(name = "节点责任人编号", width = 15) - @ApiModelProperty(value = "节点责任人编号") - private String chargerId; + @Excel(name = "节点责任部门名称", width = 15) + @ApiModelProperty(value = "节点责任部门名称") + private String chargerDeptName; /** * 节点责任人名称 */ @@ -112,23 +88,11 @@ public class ProgressPanoramaNodePlanChangeRecord implements Serializable { @ApiModelProperty(value = "节点责任人名称") private String chargerName; /** - * 成果物明细 + * 协助人名称 */ - @Excel(name = "成果物明细", width = 15) - @ApiModelProperty(value = "成果物明细") - private String deliverable; - /** - * 父级ID - */ - @Excel(name = "父级ID", width = 15) - @ApiModelProperty(value = "父级ID") - private Integer parentId; - /** - * 祖级关系 - */ - @Excel(name = "祖级关系", width = 15) - @ApiModelProperty(value = "祖级关系") - private String ancestors; + @Excel(name = "协助人名称", width = 15) + @ApiModelProperty(value = "协助人名称") + private String assistName; /** * 工期天数 */ @@ -136,21 +100,19 @@ public class ProgressPanoramaNodePlanChangeRecord implements Serializable { @ApiModelProperty(value = "工期天数") private String duration; /** - * 是否为关键节点0:否;1:是(默认为0) + * 节点类别 */ - @Excel(name = "是否为关键节点0:否;1:是(默认为0)", width = 15) - @ApiModelProperty(value = "是否为关键节点0:否;1:是(默认为0)") - private Integer keyNode; + @Excel(name = "节点类别", width = 15) + @ApiModelProperty(value = "节点类别") + private String typeName; /** - * 是否为里程碑0:否;1:是(默认为0) + * 完成标准 */ - @Excel(name = "是否为里程碑0:否;1:是(默认为0)", width = 15) - @ApiModelProperty(value = "是否为里程碑0:否;1:是(默认为0)") - private Integer milepostNode; + @ApiModelProperty(value = "完成标准") + private String completeStandard; /** - * 是否为阶段性成果节点0:否;1:是(默认为0) + * 任务业务类型 */ - @Excel(name = "是否为阶段性成果节点0:否;1:是(默认为0)", width = 15) - @ApiModelProperty(value = "是否为阶段性成果节点0:否;1:是(默认为0)") - private Integer resultNode; + @ApiModelProperty(value = "任务业务类型") + private String businessType; } diff --git a/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlanDraft.java b/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlanDraft.java index ec9107357..f51f33119 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlanDraft.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlanDraft.java @@ -4,6 +4,7 @@ import java.io.Serializable; import java.util.Date; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -65,6 +66,12 @@ public class ProgressPanoramaNodePlanDraft implements Serializable { @Excel(name = "节点类型", width = 15) @ApiModelProperty(value = "节点类型") private String levelName; + /** + * 节点类别 + */ + @Excel(name = "节点类别", width = 15) + @ApiModelProperty(value = "节点类别") + private String type; /** * 计划开始时间 */ @@ -155,4 +162,51 @@ public class ProgressPanoramaNodePlanDraft implements Serializable { @Excel(name = "是否为阶段性成果节点0:否;1:是(默认为0)", width = 15) @ApiModelProperty(value = "是否为阶段性成果节点0:否;1:是(默认为0)") private Boolean resultNode; + /** + * 阶段性成果类型ID + */ + @ApiModelProperty(value = "阶段性成果类型ID") + private Long resultId; + /** + * 节点责任部门编号 + */ + @Excel(name = "节点责任部门编号", width = 15) + @ApiModelProperty(value = "节点责任部门编号") + private String chargerDeptId; + /** + * 节点责任部门名称 + */ + @Excel(name = "节点责任部门名称", width = 15) + @ApiModelProperty(value = "节点责任部门名称") + private String chargerDeptName; + /** + * 协助人编号 + */ + @Excel(name = "协助人编号", width = 15) + @ApiModelProperty(value = "协助人编号") + private String assistId; + /** + * 协助人名称 + */ + @Excel(name = "协助人名称", width = 15) + @ApiModelProperty(value = "协助人名称") + private String assistName; + /** + * 任务业务类型 + */ + @ApiModelProperty(value = "任务业务类型") + private String businessType; + /** + * 完成标准 + */ + @ApiModelProperty(value = "完成标准") + private String completeStandard; + /** + * 里程碑类型ID + */ + @ApiModelProperty(value = "里程碑类型ID") + private Long milepostId; + + @ApiModelProperty(value = "节点类别") + private String typeName; } diff --git a/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlanTemplate.java b/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlanTemplate.java index f2ea7eab3..6c0348a63 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlanTemplate.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/entity/ProgressPanoramaNodePlanTemplate.java @@ -97,6 +97,31 @@ public class ProgressPanoramaNodePlanTemplate implements Serializable { */ @ApiModelProperty(value = "最后操作时间") private Date updateTime; + /** + * 是否为关键节点0:否;1:是(默认为0) + */ + @ApiModelProperty(value = "是否为关键节点0:否;1:是(默认为0)") + private Boolean keyNode; + /** + * 是否为里程碑0:否;1:是(默认为0) + */ + @ApiModelProperty(value = "是否为里程碑0:否;1:是(默认为0)") + private Boolean milepostNode; + /** + * 是否为阶段性成果节点0:否;1:是(默认为0) + */ + @ApiModelProperty(value = "是否为阶段性成果节点0:否;1:是(默认为0)") + private Boolean resultNode; + /** + * 阶段性成果类型ID + */ + @ApiModelProperty(value = "阶段性成果类型ID") + private Long resultId; + /** + * 里程碑类型ID + */ + @ApiModelProperty(value = "里程碑类型ID") + private Long milepostId; @TableField(exist = false) @ApiModelProperty(value = "子级模版信息") diff --git a/src/main/java/com/zhgd/xmgl/modules/project/entity/dto/ProgressPanoramaNodePlanExecDto.java b/src/main/java/com/zhgd/xmgl/modules/project/entity/dto/ProgressPanoramaNodePlanExecDto.java new file mode 100644 index 000000000..875ccee47 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/project/entity/dto/ProgressPanoramaNodePlanExecDto.java @@ -0,0 +1,41 @@ +package com.zhgd.xmgl.modules.project.entity.dto; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@ApiModel(value = "计划达成统计(DTO)", description = "ProgressPanoramaNodePlanExecDto") +public class ProgressPanoramaNodePlanExecDto { + + @ApiModelProperty(value = "计划名称") + private String planName; + + @ApiModelProperty(value = "计划总数") + private Integer total; + + @ApiModelProperty(value = "计划应完成数") + private Integer planCompleteNum; + + @ApiModelProperty(value = "按期完成数") + private Integer normalNum; + + @ApiModelProperty(value = "按期达成率") + private BigDecimal normalRatio; + + @ApiModelProperty(value = "延期完成数") + private Integer delayNum; + + @ApiModelProperty(value = "已完成数") + private Integer completeNum; + + @ApiModelProperty(value = "综合达成率") + private BigDecimal completeRatio; + + @ApiModelProperty(value = "延期未完成") + private Integer delayUnComplete; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/project/mapper/xml/ProgressPanoramaNodePlanMapper.xml b/src/main/java/com/zhgd/xmgl/modules/project/mapper/xml/ProgressPanoramaNodePlanMapper.xml index 8c7a23312..6c65836ff 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/mapper/xml/ProgressPanoramaNodePlanMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/project/mapper/xml/ProgressPanoramaNodePlanMapper.xml @@ -2,8 +2,9 @@