123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- package com.kingdee.eas.custom.projectbonus.app;
- import com.kingdee.bos.BOSException;
- import com.kingdee.bos.Context;
- import com.kingdee.bos.dao.IObjectPK;
- import com.kingdee.bos.dao.IObjectValue;
- import com.kingdee.bos.dao.ormapping.ObjectUuidPK;
- import com.kingdee.bos.metadata.data.SortType;
- import com.kingdee.bos.metadata.entity.*;
- import com.kingdee.eas.basedata.org.AdminOrgUnitInfo;
- import com.kingdee.eas.basedata.person.PersonInfo;
- import com.kingdee.eas.common.EASBizException;
- import com.kingdee.eas.custom.projectbonus.BonusCycleBusDepProjectAssPersonnelDetailInfo;
- import com.kingdee.eas.custom.projectbonus.BonusCycleBusDepProjectInfo;
- import com.kingdee.eas.custom.projectbonus.bizEnum.BusDepProjectStateEnum;
- import com.kingdee.eas.hr.emp.*;
- import com.kingdee.eas.hr.org.IJobGrade;
- import com.kingdee.eas.hr.org.JobGradeFactory;
- import com.kingdee.eas.hr.org.JobGradeInfo;
- import com.kingdee.util.DateTimeUtils;
- import com.kingdee.util.StringUtils;
- import org.apache.log4j.Logger;
- import java.math.BigDecimal;
- import java.math.RoundingMode;
- import java.util.Date;
- public class BonusCycleBusDepProjectAssPersonnelDetailControllerBean
- extends AbstractBonusCycleBusDepProjectAssPersonnelDetailControllerBean {
- private static Logger logger =
- Logger.getLogger(BonusCycleBusDepProjectAssPersonnelDetailControllerBean.class);
- /**
- * 保存
- *
- * @param ctx
- * @param model
- * @return
- * @throws BOSException
- * @throws EASBizException
- */
- @Override
- protected IObjectPK _save(Context ctx,
- IObjectValue model) throws BOSException, EASBizException {
- BonusCycleBusDepProjectAssPersonnelDetailInfo info =
- (BonusCycleBusDepProjectAssPersonnelDetailInfo) model;
- PersonInfo personInfo = info.getPerson();
- //职级系数
- BigDecimal rankCoefficient = null;
- if (personInfo != null) {
- String personId = personInfo.getId().toString();
- //职位
- PersonPositionInfo personPositionInfo = PersonPositionFactory.getLocalInstance(ctx).getPersonPositionInfo("where person.id = '" + personId + "'");
- info.setPosition(personPositionInfo.getPrimaryPosition());
- //职等信息
- JobGradeInfo jobGrade = info.getGrade();
- if (jobGrade == null) {
- jobGrade = getJobGradeInfo(ctx, personId);
- if (jobGrade != null) {
- rankCoefficient = jobGrade.getBigDecimal("coefficient");
- }
- info.setGrade(jobGrade);
- } else {
- IJobGrade iJobGrade = JobGradeFactory.getLocalInstance(ctx);
- jobGrade = iJobGrade.getJobGradeInfo(new ObjectUuidPK(jobGrade.getId()));
- rankCoefficient = jobGrade.getBigDecimal("coefficient");
- }
- } else {
- throw new BOSException("分配人员不能为空!");
- }
- //奖金期限起算日期
- Date bonusStartingDate = info.getBonusStartingDate();
- //奖金期限截止日期
- Date bonusDueDate = info.getBonusDueDate();
- if (bonusDueDate != null && bonusStartingDate != null) {
- if (bonusStartingDate.compareTo(bonusDueDate) >= 0) {
- throw new BOSException("奖金期限截止日期 不得早于或等于 奖金期限起算日期");
- }
- //出勤率 = (奖金期限截止日期-奖金期限起算日期)/180
- double day = DateTimeUtils.dateDiff(bonusStartingDate, bonusDueDate) / 86400000.0 / 180.0 * 100;
- if (day <= 0) {
- throw new BOSException("出勤率[" + day + "]不能小于等于0!");
- }
- BigDecimal attendanceRate = new BigDecimal(String.valueOf(day)).setScale(0, RoundingMode.HALF_UP);
- info.setAttendanceRate(attendanceRate);
- }
- //Q1绩效系数
- BigDecimal performanceCoeffQ1 = info.getPerformanceCoeffQ1();
- //Q2绩效系数
- BigDecimal performanceCoeffQ2 = info.getPerformanceCoeffQ2();
- if (performanceCoeffQ1 != null && performanceCoeffQ2 != null) {
- //个人考核系数
- BigDecimal assessmentCoeff = performanceCoeffQ1.add(performanceCoeffQ2).divide(BigDecimal.valueOf(2)).setScale(2, RoundingMode.HALF_UP);
- info.setAssessmentCoeff(assessmentCoeff);
- }
- //职能系数
- BigDecimal functionCoefficient = info.getFunctionCoefficient();
- //精力投入系数
- BigDecimal energyInputCoeff = info.getEnergyInputCoeff();
- //出勤率
- BigDecimal attendanceRate = info.getAttendanceRate();
- //个人考核系数
- BigDecimal assessmentCoeff = info.getAssessmentCoeff();
- if (functionCoefficient != null && energyInputCoeff != null
- && rankCoefficient != null && attendanceRate != null && assessmentCoeff != null) {
- //职能系数 * 精力投入系数 * 出勤率 * 职级系数 * 个人考核系数
- BigDecimal cumulative = functionCoefficient.multiply(energyInputCoeff)
- .multiply(attendanceRate).multiply(rankCoefficient).multiply(assessmentCoeff).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
- info.setCumulative(cumulative);
- }
- BigDecimal initialProportion = info.getInitialProportion();
- if (initialProportion.compareTo(BigDecimal.ZERO) < 0 || initialProportion.compareTo(BigDecimal.ONE) > 0) {
- throw new BOSException("个人初始比例只能在[0,1]之间");
- }
- return super._save(ctx, model);
- }
- /**
- * 通过员工id查询员工职层职等信息,返回职等信息
- *
- * @param ctx
- * @param personId
- * @return
- * @throws BOSException
- */
- private JobGradeInfo getJobGradeInfo(Context ctx, String personId) throws BOSException {
- IEmpPostRank iEmpPostRank = EmpPostRankFactory.getLocalInstance(ctx);
- SelectorItemCollection sic = new SelectorItemCollection();
- sic.add("jobGrade.*");
- FilterInfo filterInfo = new FilterInfo();
- FilterItemCollection filterItems = filterInfo.getFilterItems();
- filterItems.add(new FilterItemInfo("person", personId));
- filterItems.add(new FilterItemInfo("isLatest", 1));
- SorterItemCollection sortItems = new SorterItemCollection();
- SorterItemInfo leffdtSortItem = new SorterItemInfo("LEFFDT");
- leffdtSortItem.setSortType(SortType.DESCEND);
- sortItems.add(leffdtSortItem);
- EntityViewInfo entityViewInfo = EntityViewInfo.getInstance(filterInfo, sic, sortItems);
- EmpPostRankCollection empPostRankCols = iEmpPostRank.getEmpPostRankCollection(entityViewInfo);
- if (empPostRankCols.size() > 0) {
- EmpPostRankInfo empPostRankInfo = empPostRankCols.get(0);
- return empPostRankInfo.getJobGrade();
- }
- return null;
- }
- /**
- * 更新部分
- *
- * @param ctx
- * @param model
- * @param sic
- * @throws BOSException
- * @throws EASBizException
- */
- @Override
- protected void _updatePartial(Context ctx, IObjectValue model,
- SelectorItemCollection sic) throws BOSException, EASBizException {
- BonusCycleBusDepProjectAssPersonnelDetailInfo info = (BonusCycleBusDepProjectAssPersonnelDetailInfo) model;
- String id = info.getId().toString();
- if (StringUtils.isEmpty(id)) {
- throw new BOSException("分配明细表id不能为空!");
- }
- for (int i = 0; i < sic.size(); i++) {
- String propertyName = sic.get(i).getPropertyName();
- if ("person".equals(propertyName)) {
- //如果更新分配人员信息,需要同步更新职位、职等和职级系数
- Object person = info.get("person");
- sic.add("position");
- sic.add("grade");
- if (person != null) {
- String personId = null;
- if (person instanceof String) {
- personId = (String) person;
- } else {
- PersonInfo personInfo = (PersonInfo) person;
- personId = personInfo.getId().toString();
- }
- //职位
- PersonPositionInfo personPositionInfo = PersonPositionFactory.getLocalInstance(ctx).getPersonPositionInfo("where person.id = '" + personId + "'");
- info.setPosition(personPositionInfo.getPrimaryPosition());
- //职等信息
- JobGradeInfo jobGrade = getJobGradeInfo(ctx, personId);
- info.setGrade(jobGrade);
- } else {
- throw new BOSException("分配人员不能为空!");
- }
- } else if ("initialProportion".equals(propertyName) && info.getInitialProportion() != null) {
- BigDecimal initialProportion = info.getInitialProportion();
- if (initialProportion.compareTo(BigDecimal.ZERO) < 0 || initialProportion.compareTo(BigDecimal.ONE) > 0) {
- throw new BOSException("个人初始比例只能在[0,1]之间");
- }
- }
- }
- super._updatePartial(ctx, model, sic);
- }
- /**
- * 删除
- *
- * @param ctx
- * @param pk
- * @throws BOSException
- * @throws EASBizException
- */
- @Override
- protected void _delete(Context ctx, IObjectPK pk) throws BOSException, EASBizException {
- SelectorItemCollection sic = new SelectorItemCollection();
- sic.add("parent.state");
- sic.add("parent.project.name");
- sic.add("parent.busDep.name");
- BonusCycleBusDepProjectAssPersonnelDetailInfo info =
- (BonusCycleBusDepProjectAssPersonnelDetailInfo) getValue(ctx, pk, sic);
- BonusCycleBusDepProjectInfo parent = info.getParent();
- BusDepProjectStateEnum state = parent.getState();
- if (!BusDepProjectStateEnum.ENABLE.equals(state)) {
- throw new BOSException(getBusDepMsg(parent) + "非启用状态,不允许删除该项目下的人员数据!");
- }
- super._delete(ctx, pk);
- }
- private String getBusDepMsg(BonusCycleBusDepProjectInfo info) {
- AdminOrgUnitInfo project = info.getProject();
- if (project != null) {
- String projectProject = project.getName();
- return "项目[" + projectProject + "]";
- } else {
- String busdepName = info.getBusDep().getName();
- return "事业部[" + busdepName + "]";
- }
- }
- }
|