12-22-项目绩效

This commit is contained in:
2025-12-23 18:00:26 +08:00
parent 14a5c833bf
commit dbd2133c41
2 changed files with 87 additions and 56 deletions

View File

@ -48,6 +48,11 @@ public class BusProjectXmjxVo implements Serializable {
@ExcelProperty(value = "合同产值") @ExcelProperty(value = "合同产值")
private BigDecimal htcz; private BigDecimal htcz;
/**
* 已完成产值百分比
*/
private BigDecimal ywcczbfb;
/** /**
* 系数 * 系数
*/ */

View File

@ -27,6 +27,7 @@ import org.dromara.project.service.IBusProjectZyzbService;
import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.mapper.SysUserMapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -430,11 +431,12 @@ public class BusProjectXmjxServiceImpl extends ServiceImpl<BusProjectXmjxMapper,
//项目负责人绩效 //项目负责人绩效
if (vo.getXmfzr() != null && (vo.getJxxs() != null && vo.getJxxs().compareTo(BigDecimal.ZERO) > 0)){ if (vo.getXmfzr() != null && (vo.getJxxs() != null && vo.getJxxs().compareTo(BigDecimal.ZERO) > 0)){
//总金额 * 项目系数 * 项目负责人系数 (万元) //总金额 * 项目系数 * 项目负责人系数 (万元)
vo.setXmfzjx(vo.getHtcz().multiply(vo.getXs()).multiply(vo.getJxxs()).setScale(6, RoundingMode.HALF_UP)); vo.setXmfzjx(BigDecimal.valueOf(Double.parseDouble(vo.getHtcz().multiply(vo.getXs()).multiply(vo.getJxxs()).setScale(6, RoundingMode.HALF_UP).toPlainString())));
}else { }else {
vo.setXmfzjx(BigDecimal.ZERO); vo.setXmfzjx(BigDecimal.ZERO);
} }
//专业 //专业
BigDecimal ywcczbfb = BigDecimal.ZERO;//已完成产值百分比 所有专业已完成产值百分比 * 专业占比 相加 = 这个项目的产值真实完成百分比
for (BusProjectZyzbVo zyszVo : zyszVos) { for (BusProjectZyzbVo zyszVo : zyszVos) {
//如果这条专业数据的关联id和当前绩效id一致 //如果这条专业数据的关联id和当前绩效id一致
if (Objects.equals(zyszVo.getMainId(), vo.getId())){ if (Objects.equals(zyszVo.getMainId(), vo.getId())){
@ -443,7 +445,7 @@ public class BusProjectXmjxServiceImpl extends ServiceImpl<BusProjectXmjxMapper,
vo.getHtcz().multiply(vo.getXs()) vo.getHtcz().multiply(vo.getXs())
.multiply(zyszVo.getZyzb()) .multiply(zyszVo.getZyzb())
.multiply(sjcz) .multiply(sjcz)
.setScale(6, RoundingMode.HALF_UP)//万元保留6位小数四舍五入 .setScale(6, RoundingMode.HALF_UP).stripTrailingZeros()//万元保留6位小数四舍五入
); );
zsjcz = zsjcz.add(zyszVo.getSjcz()); zsjcz = zsjcz.add(zyszVo.getSjcz());
@ -452,7 +454,7 @@ public class BusProjectXmjxServiceImpl extends ServiceImpl<BusProjectXmjxMapper,
vo.getHtcz().multiply(vo.getXs()) vo.getHtcz().multiply(vo.getXs())
.multiply(zyszVo.getZyzb()) .multiply(zyszVo.getZyzb())
.multiply(jscz) .multiply(jscz)
.setScale(6, RoundingMode.HALF_UP) .setScale(6, RoundingMode.HALF_UP).stripTrailingZeros()
); );
zjscz = zjscz.add(zyszVo.getJscz()); zjscz = zjscz.add(zyszVo.getJscz());
@ -461,12 +463,12 @@ public class BusProjectXmjxServiceImpl extends ServiceImpl<BusProjectXmjxMapper,
vo.getHtcz().multiply(vo.getXs()) vo.getHtcz().multiply(vo.getXs())
.multiply(zyszVo.getZyzb()) .multiply(zyszVo.getZyzb())
.multiply(shcz) .multiply(shcz)
.setScale(6, RoundingMode.HALF_UP) .setScale(6, RoundingMode.HALF_UP).stripTrailingZeros()
); );
zshcz = zshcz.add(zyszVo.getShcz()); zshcz = zshcz.add(zyszVo.getShcz());
//计算审核绩效 审核产值 * 绩效系数 //计算审核绩效 审核产值 * 绩效系数
zyszVo.setShjx(zyszVo.getShcz().multiply(jx).setScale(6, RoundingMode.HALF_UP)); zyszVo.setShjx(zyszVo.getShcz().multiply(jx).setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());
zshjx = zshjx.add(zyszVo.getShjx()); zshjx = zshjx.add(zyszVo.getShjx());
//通过历史记录构建人员详情 //通过历史记录构建人员详情
BusProjectXmjxRyxq shTemp = null; BusProjectXmjxRyxq shTemp = null;
@ -482,39 +484,39 @@ public class BusProjectXmjxServiceImpl extends ServiceImpl<BusProjectXmjxMapper,
shRyxq.setZyId(zyszVo.getId());//专业ID shRyxq.setZyId(zyszVo.getId());//专业ID
shRyxq.setZyName(zyszVo.getZymc());//专业名称 shRyxq.setZyName(zyszVo.getZymc());//专业名称
shRyxq.setJsgw("审核");//角色岗位 shRyxq.setJsgw("审核");//角色岗位
shRyxq.setWcjd(historyVo.getWcjd());//进度h shRyxq.setWcjd(historyVo.getWcjd());//进度
shRyxq.setUserId(historyVo.getUserId());//人员ID shRyxq.setUserId(historyVo.getUserId());//人员ID
shRyxq.setSgsj(historyVo.getCreateTime()); shRyxq.setSgsj(historyVo.getCreateTime());
shRyxq.setGtsj(historyVo.getGtsj()); shRyxq.setGtsj(historyVo.getGtsj());
if (shTemp == null){ if (shTemp == null){
shRyxq.setCz(zyszVo.getShcz().multiply(historyVo.getWcjd()).setScale(6, RoundingMode.HALF_UP));//产值 * 对应完成度 shRyxq.setCz(zyszVo.getShcz().multiply(historyVo.getWcjd()).setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());//产值 * 对应完成度
shRyxq.setJx(zyszVo.getShjx().multiply(historyVo.getWcjd()).setScale(6, RoundingMode.HALF_UP));//设计的绩效 shRyxq.setJx(zyszVo.getShjx().multiply(historyVo.getWcjd()).setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());//设计的绩效
//计算剩余产值和绩效 //计算剩余产值和绩效
shRyxq.setSycz(zyszVo.getShcz().subtract(shRyxq.getCz())); shRyxq.setSycz((zyszVo.getShcz().subtract(shRyxq.getCz())).stripTrailingZeros());
shRyxq.setSyjx(zyszVo.getShjx().subtract(shRyxq.getJx())); shRyxq.setSyjx((zyszVo.getShjx().subtract(shRyxq.getJx())).stripTrailingZeros());
}else { }else {
//基数则为上一个元素的剩余产值和绩效 //基数则为上一个元素的剩余产值和绩效
shRyxq.setCz(shTemp.getSycz().multiply(shRyxq.getWcjd()).setScale(6, RoundingMode.HALF_UP));//产值 * 对应完成度 shRyxq.setCz(shTemp.getSycz().multiply(shRyxq.getWcjd()).setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());//产值 * 对应完成度
shRyxq.setJx(shTemp.getSyjx().multiply(shRyxq.getWcjd()).setScale(6, RoundingMode.HALF_UP));//设计的绩效 shRyxq.setJx(shTemp.getSyjx().multiply(shRyxq.getWcjd()).setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());//设计的绩效
//计算剩余产值和绩效 //计算剩余产值和绩效
shRyxq.setSycz(shTemp.getSycz().subtract(shRyxq.getCz())); shRyxq.setSycz((shTemp.getSycz().subtract(shRyxq.getCz())).stripTrailingZeros());
shRyxq.setSyjx(shTemp.getSyjx().subtract(shRyxq.getJx())); shRyxq.setSyjx((shTemp.getSyjx().subtract(shRyxq.getJx())).stripTrailingZeros());
} }
shywccz = shywccz.add(shRyxq.getCz()); shywccz = shywccz.add(shRyxq.getCz());
shywcjx = shywcjx.add(shRyxq.getJx()); shywcjx = shywcjx.add(shRyxq.getJx());
shRyxq.setZcz(zyszVo.getShcz()); shRyxq.setZcz(zyszVo.getShcz().stripTrailingZeros());
shRyxq.setZjx(zyszVo.getShjx()); shRyxq.setZjx(zyszVo.getShjx().stripTrailingZeros());
shTemp = shRyxq; shTemp = shRyxq;
ryxqs.add(shRyxq); ryxqs.add(shRyxq);
} }
} }
zyszVo.setShywccz(shywccz); zyszVo.setShywccz(shywccz.stripTrailingZeros());
zyszVo.setShywcjx(shywcjx); zyszVo.setShywcjx(shywcjx.stripTrailingZeros());
zyszVo.setShsycz(zyszVo.getShcz().subtract(shywccz));//审核剩余产值 zyszVo.setShsycz((zyszVo.getShcz().subtract(shywccz)).stripTrailingZeros());//审核剩余产值
zyszVo.setShsyjx(zyszVo.getShjx().subtract(shywcjx));//审核剩余绩效 zyszVo.setShsyjx((zyszVo.getShjx().subtract(shywcjx)).stripTrailingZeros());//审核剩余绩效
//计算校审绩效 校审产值 * 绩效系数 //计算校审绩效 校审产值 * 绩效系数
zyszVo.setJsjx(zyszVo.getJscz().multiply(jx).setScale(6, RoundingMode.HALF_UP)); zyszVo.setJsjx(zyszVo.getJscz().multiply(jx).setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());
zjsjx = zjsjx.add(zyszVo.getJsjx()); zjsjx = zjsjx.add(zyszVo.getJsjx());
//通过历史记录构建人员详情 //通过历史记录构建人员详情
BusProjectXmjxRyxq jsTemp = null; BusProjectXmjxRyxq jsTemp = null;
@ -536,35 +538,35 @@ public class BusProjectXmjxServiceImpl extends ServiceImpl<BusProjectXmjxMapper,
jsRyxq.setSgsj(historyVo.getCreateTime()); jsRyxq.setSgsj(historyVo.getCreateTime());
jsRyxq.setGtsj(historyVo.getGtsj()); jsRyxq.setGtsj(historyVo.getGtsj());
if (jsTemp == null){ if (jsTemp == null){
jsRyxq.setCz(zyszVo.getJscz().multiply(historyVo.getWcjd()).setScale(6, RoundingMode.HALF_UP));//产值 * 对应完成度 jsRyxq.setCz(zyszVo.getJscz().multiply(historyVo.getWcjd()).setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());//产值 * 对应完成度
jsRyxq.setJx(zyszVo.getJsjx().multiply(historyVo.getWcjd()).setScale(6, RoundingMode.HALF_UP));//设计的绩效 jsRyxq.setJx(zyszVo.getJsjx().multiply(historyVo.getWcjd()).setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());//设计的绩效
//计算剩余产值和绩效 //计算剩余产值和绩效
jsRyxq.setSycz(zyszVo.getJscz().subtract(jsRyxq.getCz())); jsRyxq.setSycz((zyszVo.getJscz().subtract(jsRyxq.getCz())).stripTrailingZeros());
jsRyxq.setSyjx(zyszVo.getJsjx().subtract(jsRyxq.getJx())); jsRyxq.setSyjx((zyszVo.getJsjx().subtract(jsRyxq.getJx())).stripTrailingZeros());
}else { }else {
//基数则为上一个元素的剩余产值和绩效 //基数则为上一个元素的剩余产值和绩效
jsRyxq.setCz(jsTemp.getSycz().multiply(jsRyxq.getWcjd()).setScale(6, RoundingMode.HALF_UP));//产值 * 对应完成度 jsRyxq.setCz(jsTemp.getSycz().multiply(jsRyxq.getWcjd()).setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());//产值 * 对应完成度
jsRyxq.setJx(jsTemp.getSyjx().multiply(jsRyxq.getWcjd()).setScale(6, RoundingMode.HALF_UP));//设计的绩效 jsRyxq.setJx(jsTemp.getSyjx().multiply(jsRyxq.getWcjd()).setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());//设计的绩效
//计算剩余产值和绩效 //计算剩余产值和绩效
jsRyxq.setSycz(jsTemp.getSycz().subtract(jsRyxq.getCz())); jsRyxq.setSycz((jsTemp.getSycz().subtract(jsRyxq.getCz())).stripTrailingZeros());
jsRyxq.setSyjx(jsTemp.getSyjx().subtract(jsRyxq.getJx())); jsRyxq.setSyjx((jsTemp.getSyjx().subtract(jsRyxq.getJx())).stripTrailingZeros());
} }
jsywccz = jsywccz.add(jsRyxq.getCz()); jsywccz = jsywccz.add(jsRyxq.getCz());
jsywcjx = jsywcjx.add(jsRyxq.getJx()); jsywcjx = jsywcjx.add(jsRyxq.getJx());
jsRyxq.setZcz(zyszVo.getJscz()); jsRyxq.setZcz(zyszVo.getJscz().stripTrailingZeros());
jsRyxq.setZjx(zyszVo.getJsjx()); jsRyxq.setZjx(zyszVo.getJsjx().stripTrailingZeros());
jsTemp = jsRyxq; jsTemp = jsRyxq;
ryxqs.add(jsRyxq); ryxqs.add(jsRyxq);
} }
} }
zyszVo.setJsywccz(jsywccz); zyszVo.setJsywccz(jsywccz.stripTrailingZeros());
zyszVo.setJsywcjx(jsywcjx); zyszVo.setJsywcjx(jsywcjx.stripTrailingZeros());
zyszVo.setJssycz(zyszVo.getJscz().subtract(jsywccz));//校审剩余产值 zyszVo.setJssycz((zyszVo.getJscz().subtract(jsywccz)).stripTrailingZeros());//校审剩余产值
zyszVo.setJssyjx(zyszVo.getJsjx().subtract(jsywcjx));//校审剩余绩效 zyszVo.setJssyjx((zyszVo.getJsjx().subtract(jsywcjx)).stripTrailingZeros());//校审剩余绩效
//计算设计绩效 设计产值 * 绩效系数 //计算设计绩效 设计产值 * 绩效系数
BigDecimal sjywccz = BigDecimal.ZERO;//设计已完成产值 BigDecimal sjywccz = BigDecimal.ZERO;//设计已完成产值
zyszVo.setSjjx(zyszVo.getSjcz().multiply(jx).setScale(6, RoundingMode.HALF_UP)); zyszVo.setSjjx(zyszVo.getSjcz().multiply(jx).setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());
zsjjx = zsjjx.add(zyszVo.getSjjx()); zsjjx = zsjjx.add(zyszVo.getSjjx());
//通过历史记录构建人员详情 //通过历史记录构建人员详情
BusProjectXmjxRyxq sjTemp = null; BusProjectXmjxRyxq sjTemp = null;
@ -584,44 +586,67 @@ public class BusProjectXmjxServiceImpl extends ServiceImpl<BusProjectXmjxMapper,
sjRyxq.setSgsj(historyVo.getCreateTime()); sjRyxq.setSgsj(historyVo.getCreateTime());
sjRyxq.setGtsj(historyVo.getGtsj()); sjRyxq.setGtsj(historyVo.getGtsj());
if (sjTemp == null){ if (sjTemp == null){
sjRyxq.setCz(zyszVo.getSjcz().multiply(historyVo.getWcjd()).setScale(6, RoundingMode.HALF_UP));//产值 * 对应完成度 sjRyxq.setCz(zyszVo.getSjcz().multiply(historyVo.getWcjd()).setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());//产值 * 对应完成度
sjRyxq.setJx(zyszVo.getSjjx().multiply(historyVo.getWcjd()).setScale(6, RoundingMode.HALF_UP));//设计的绩效 sjRyxq.setJx(zyszVo.getSjjx().multiply(historyVo.getWcjd()).setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());//设计的绩效
//计算剩余产值和绩效 //计算剩余产值和绩效
sjRyxq.setSycz(zyszVo.getSjcz().subtract(sjRyxq.getCz())); sjRyxq.setSycz((zyszVo.getSjcz().subtract(sjRyxq.getCz())).stripTrailingZeros());
sjRyxq.setSyjx(zyszVo.getSjjx().subtract(sjRyxq.getJx())); sjRyxq.setSyjx((zyszVo.getSjjx().subtract(sjRyxq.getJx())).stripTrailingZeros());
}else { }else {
//基数则为上一个元素的剩余产值和绩效 //基数则为上一个元素的剩余产值和绩效
sjRyxq.setCz(sjTemp.getSycz().multiply(sjRyxq.getWcjd()).setScale(6, RoundingMode.HALF_UP));//产值 * 对应完成度 sjRyxq.setCz(sjTemp.getSycz().multiply(sjRyxq.getWcjd()).setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());//产值 * 对应完成度
sjRyxq.setJx(sjTemp.getSyjx().multiply(sjRyxq.getWcjd()).setScale(6, RoundingMode.HALF_UP));//设计的绩效 sjRyxq.setJx(sjTemp.getSyjx().multiply(sjRyxq.getWcjd()).setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());//设计的绩效
//计算剩余产值和绩效 //计算剩余产值和绩效
sjRyxq.setSycz(sjTemp.getSycz().subtract(sjRyxq.getCz())); sjRyxq.setSycz((sjTemp.getSycz().subtract(sjRyxq.getCz())).stripTrailingZeros());
sjRyxq.setSyjx(sjTemp.getSyjx().subtract(sjRyxq.getJx())); sjRyxq.setSyjx((sjTemp.getSyjx().subtract(sjRyxq.getJx())).stripTrailingZeros());
} }
sjywccz = sjywccz.add(sjRyxq.getCz()); sjywccz = sjywccz.add(sjRyxq.getCz());
sjywcjx = sjywcjx.add(sjRyxq.getJx()); sjywcjx = sjywcjx.add(sjRyxq.getJx());
sjRyxq.setZcz(zyszVo.getSjcz()); sjRyxq.setZcz(zyszVo.getSjcz().stripTrailingZeros());
sjRyxq.setZjx(zyszVo.getSjjx()); sjRyxq.setZjx(zyszVo.getSjjx().stripTrailingZeros());
sjTemp = sjRyxq; sjTemp = sjRyxq;
ryxqs.add(sjRyxq); ryxqs.add(sjRyxq);
} }
} }
zyszVo.setSjywccz(sjywccz); zyszVo.setSjywccz(sjywccz.stripTrailingZeros());
zyszVo.setSjywcjx(sjywcjx); zyszVo.setSjywcjx(sjywcjx.stripTrailingZeros());
zyszVo.setSjsycz(zyszVo.getSjcz().subtract(sjywccz)); zyszVo.setSjsycz((zyszVo.getSjcz().subtract(sjywccz)).stripTrailingZeros());
zyszVo.setSjsyjx(zyszVo.getSjjx().subtract(sjywcjx));//设计剩余绩效 zyszVo.setSjsyjx((zyszVo.getSjjx().subtract(sjywcjx)).stripTrailingZeros());//设计剩余绩效
//添加数组 //添加数组
zyszVos1.add(zyszVo);//专业详情 zyszVos1.add(zyszVo);//专业详情
//计算项目的产值完成百分比 所有专业完成 = 100 一个专业 设计的产值全部完成占80 校审产值全部完成占15 审核产值全部完成占5
//设计产值已完成百分比
BigDecimal sjczywcbfb = sjywccz.divide(zyszVo.getSjcz(), 2, RoundingMode.HALF_UP);//设计已完成产值/设计产值=设计产值已完成百分比 1.00
//设计已完成百分比 * 设计绩效系数0.8 = 设计真实完成比
BigDecimal sjzswcb = sjczywcbfb.multiply(sjcz);
//校审产值已完成百分比
BigDecimal jsczywcbfb = jsywccz.divide(zyszVo.getJscz(), 2, RoundingMode.HALF_UP);//校审已完成产值/校审产值=校审已完成百分比 1.00
//校审已完成百分比 * 校审绩效系数0.15 = 校审真实完成比
BigDecimal jszswcb = jsczywcbfb.multiply(jscz);
//审核产值已完成百分比
BigDecimal shczywcbfb = shywccz.divide(zyszVo.getShcz(), 2, RoundingMode.HALF_UP);//审核已完成产值/审核产值=审核已完成百分比 1.00
//审核已完成百分比 * 审核绩效系数0.05 = 审核真实完成比
BigDecimal shzswcb = shczywcbfb.multiply(shcz);
//设计+校审+审核 * 专业占比 = 专业占比完成比
BigDecimal zyzbwcb = (sjzswcb.add(jszswcb).add(shzswcb)).multiply(zyszVo.getZyzb()).setScale(2, RoundingMode.HALF_UP);
ywcczbfb = ywcczbfb.add(zyzbwcb);
} }
} }
vo.setZsjcz(zsjcz.setScale(6, RoundingMode.HALF_UP)); vo.setZsjcz(zsjcz.setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());
vo.setZjscz(zjscz.setScale(6, RoundingMode.HALF_UP)); vo.setZjscz(zjscz.setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());
vo.setZshcz(zshcz.setScale(6, RoundingMode.HALF_UP)); vo.setZshcz(zshcz.setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());
vo.setZsjjx(zsjjx.setScale(6, RoundingMode.HALF_UP)); vo.setZsjjx(zsjjx.setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());
vo.setZjsjx(zjsjx.setScale(6, RoundingMode.HALF_UP)); vo.setZjsjx(zjsjx.setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());
vo.setZshjx(zshjx.setScale(6, RoundingMode.HALF_UP)); vo.setZshjx(zshjx.setScale(6, RoundingMode.HALF_UP).stripTrailingZeros());
vo.setYwcczbfb(ywcczbfb.stripTrailingZeros());
Collections.reverse(zyszVos1);//颠倒顺序 Collections.reverse(zyszVos1);//颠倒顺序
vo.setZyszVos(zyszVos1);//专业详情 vo.setZyszVos(zyszVos1);//专业详情
@ -630,6 +655,7 @@ public class BusProjectXmjxServiceImpl extends ServiceImpl<BusProjectXmjxMapper,
} }
} }
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void addHistory(BusProjectZyzbBo zyszBo){ public void addHistory(BusProjectZyzbBo zyszBo){
//向项目人员绩效完成历史添加数据 一条数据要添加3个岗位的历史数据 //向项目人员绩效完成历史添加数据 一条数据要添加3个岗位的历史数据
BusProjectXmjxWcjdHistoryBo sjHistoryBo = new BusProjectXmjxWcjdHistoryBo(); BusProjectXmjxWcjdHistoryBo sjHistoryBo = new BusProjectXmjxWcjdHistoryBo();