230 lines
14 KiB
Java
230 lines
14 KiB
Java
package com.engine.kq.biz;
|
||
|
||
import com.alibaba.fastjson.JSON;
|
||
import com.engine.kq.entity.KQUsageHistoryEntity;
|
||
import com.engine.kq.jucailin.util.KQDateUtil;
|
||
import com.engine.kq.log.KQLog;
|
||
import weaver.conn.RecordSet;
|
||
import weaver.general.BaseBean;
|
||
import weaver.general.Util;
|
||
import weaver.hrm.resource.ResourceComInfo;
|
||
import weaver.interfaces.schedule.BaseCronJob;
|
||
|
||
import java.math.BigDecimal;
|
||
import java.math.RoundingMode;
|
||
import java.util.ArrayList;
|
||
import java.util.Calendar;
|
||
import java.util.HashMap;
|
||
import java.util.List;
|
||
import java.util.Map;
|
||
|
||
/**
|
||
* 每年1月1日结转去年的年假
|
||
*/
|
||
public class KQLeaveCarryOverJob extends BaseCronJob {
|
||
private KQLog kqLog = new KQLog();
|
||
|
||
public void execute() {
|
||
try {
|
||
ResourceComInfo resourceComInfo = new ResourceComInfo();
|
||
Calendar today = Calendar.getInstance();
|
||
String currentDate = Util.add0(today.get(Calendar.YEAR), 4) + "-" +
|
||
Util.add0(today.get(Calendar.MONTH) + 1, 2) + "-" +
|
||
Util.add0(today.get(Calendar.DAY_OF_MONTH), 2);
|
||
String currentTime = Util.add0(today.get(Calendar.HOUR_OF_DAY), 2) + ":" +
|
||
Util.add0(today.get(Calendar.MINUTE), 2) + ":" +
|
||
Util.add0(today.get(Calendar.SECOND), 2);
|
||
String currentYear = Util.add0(today.get(Calendar.YEAR), 4);
|
||
today.add(Calendar.YEAR, -1);
|
||
String lastYear = Util.add0(today.get(Calendar.YEAR), 4);
|
||
kqLog.info("begin do KQLeaveCarryOverJob invoke ...");
|
||
List<Object> lsCheckInfo = new ArrayList<>();
|
||
Map<String, Object> checkInfo = null;
|
||
RecordSet rs = new RecordSet();
|
||
RecordSet recordSet = new RecordSet();
|
||
String sql = "select * from kq_LeaveRulesDetail where (isDelete is null or isDelete<>1) and carryOver=1 ";
|
||
rs.executeQuery(sql);
|
||
while (rs.next()) {
|
||
String ruledetailId = rs.getString("id");
|
||
String ruleId = rs.getString("ruleid");
|
||
String carryOverDays = Util.null2s(rs.getString("carryOverDays"), "0");
|
||
checkInfo = new HashMap<>();
|
||
checkInfo.put("leaveid", ruleId);
|
||
checkInfo.put("ruledetailId", ruledetailId);
|
||
checkInfo.put("carryOverDays", carryOverDays);
|
||
|
||
lsCheckInfo.add(checkInfo);
|
||
}
|
||
boolean f = false;
|
||
new BaseBean().writeLog(JSON.toJSONString(lsCheckInfo));
|
||
//假期规则缓存类(每个假期类型下可能存在多个假期规则)
|
||
KQLeaveRulesDetailComInfo detailComInfo = new KQLeaveRulesDetailComInfo();
|
||
KQLeaveRulesComInfo rulesComInfo = new KQLeaveRulesComInfo();
|
||
for (int j = 0; lsCheckInfo != null && j < lsCheckInfo.size(); j++) {
|
||
Map<String, Object> leaveInfo = (Map<String, Object>) lsCheckInfo.get(j);
|
||
String leaveid = Util.null2String(leaveInfo.get("leaveid"));
|
||
String carryOverDays = Util.null2String(leaveInfo.get("carryOverDays"));
|
||
String ruledetailId = Util.null2String(leaveInfo.get("ruledetailId"));
|
||
|
||
|
||
int minimumUnit = Util.getIntValue(rulesComInfo.getMinimumUnit(leaveid), -1);
|
||
KQUsageHistoryEntity usageHistoryEntity = new KQUsageHistoryEntity();
|
||
List<KQUsageHistoryEntity> usageHistoryEntityList = new ArrayList<KQUsageHistoryEntity>();
|
||
|
||
List<String> updateList = new ArrayList<String>();
|
||
sql = "select * from kq_balanceOfLeave where belongyear=? and leaverulesid=?";
|
||
rs.executeQuery(sql, lastYear, leaveid);
|
||
while (rs.next()) {
|
||
String id = rs.getString("id");
|
||
String resourceId = rs.getString("resourceid");
|
||
if (resourceId.equals("22")) {
|
||
f = true;
|
||
}
|
||
//分部ID
|
||
String subcompanyId = resourceComInfo.getSubCompanyID(resourceId);
|
||
String departmentId = resourceComInfo.getDepartmentID(resourceId);
|
||
//余额发放方式:1-手动发放、2-按司龄自动发放、3-按工龄自动发放、4-每年自动发放固定天数、5-加班时长自动计入余额、6-按入职时长+工龄自动发放
|
||
int distributionMode = Util.getIntValue(detailComInfo.getDistributionMode(leaveid, subcompanyId, departmentId, resourceId));
|
||
String carryOver = detailComInfo.getCarryOver(leaveid, subcompanyId, departmentId, resourceId);
|
||
String rulesDetailId = detailComInfo.getId(leaveid, subcompanyId, departmentId, resourceId);
|
||
if (!rulesDetailId.equals(ruledetailId) || !carryOver.equals("1")) {
|
||
continue;
|
||
}
|
||
|
||
BigDecimal baseAmount = new BigDecimal(Util.null2s(rs.getString("baseAmount"), "0"));//假期余额基数
|
||
BigDecimal usedAmount = new BigDecimal(Util.null2s(rs.getString("usedAmount"), "0"));//已休的假期时长
|
||
BigDecimal extraAmount = new BigDecimal(Util.null2s(rs.getString("extraAmount"), "0"));//额外的假期时长
|
||
|
||
|
||
//员工假期余额使用记录
|
||
usageHistoryEntity = new KQUsageHistoryEntity();
|
||
usageHistoryEntity.setLeaveRulesId(leaveid);
|
||
usageHistoryEntity.setRelatedId(resourceId);
|
||
usageHistoryEntity.setWfRequestId("");
|
||
usageHistoryEntity.setOperator(resourceId);
|
||
usageHistoryEntity.setOperateDate(currentDate);
|
||
usageHistoryEntity.setOperateTime(currentTime);
|
||
usageHistoryEntity.setOperateType("9");
|
||
usageHistoryEntity.setInsertOrUpdate("update");
|
||
usageHistoryEntity.setBelongYear(lastYear);
|
||
|
||
usageHistoryEntity.setOldMinimumUnit("" + minimumUnit);
|
||
usageHistoryEntity.setNewMinimumUnit("" + minimumUnit);
|
||
|
||
if (distributionMode == 6) {
|
||
|
||
//扣减优先级:1-法定年假、2-福利年假
|
||
int priority = Util.getIntValue(detailComInfo.getPriority(leaveid, subcompanyId, departmentId, resourceId), 1);
|
||
//福利年假的基数
|
||
BigDecimal baseAmount2 = new BigDecimal(Util.null2s(rs.getString("baseAmount2"), "0"));
|
||
//福利年假的额外
|
||
BigDecimal usedAmount2 = new BigDecimal(Util.null2s(rs.getString("usedAmount2"), "0"));
|
||
//福利年假的已休
|
||
BigDecimal extraAmount2 = new BigDecimal(Util.null2s(rs.getString("extraAmount2"), "0"));
|
||
//剩余=已释放+额外-已休
|
||
BigDecimal restAmount1 = baseAmount.add(extraAmount).subtract(usedAmount);
|
||
BigDecimal restAmount2 = baseAmount2.add(extraAmount2).subtract(usedAmount2);
|
||
BigDecimal restAmount = restAmount1.add(restAmount2);
|
||
if (restAmount.compareTo(new BigDecimal(carryOverDays)) > 0) {
|
||
BigDecimal _duration = restAmount.subtract(new BigDecimal(carryOverDays));
|
||
|
||
if (priority == 1) {//扣减优先级:先扣减法定年假、再扣减福利年假
|
||
BigDecimal temp = baseAmount.add(extraAmount).subtract(usedAmount).subtract(_duration);
|
||
if (temp.doubleValue() >= 0) {
|
||
String newUsedAmount = usedAmount.add(_duration).setScale(2, RoundingMode.HALF_UP).toPlainString();
|
||
String updateSql = "update kq_balanceOfLeave set usedAmount=" + (newUsedAmount) + ", update_time=? where id=" + id;
|
||
updateList.add(updateSql);
|
||
|
||
usageHistoryEntity.setOldUsedAmount(usedAmount.setScale(2, RoundingMode.HALF_UP).toPlainString());
|
||
usageHistoryEntity.setNewUsedAmount(newUsedAmount);
|
||
usageHistoryEntity.setBalanceOfLeaveId(id);
|
||
usageHistoryEntityList.add(usageHistoryEntity);
|
||
|
||
} else {
|
||
String newUsedAmount = baseAmount.add(extraAmount).setScale(2, RoundingMode.HALF_UP).toPlainString();
|
||
String newUsedAmount2 = _duration.subtract(baseAmount.add(extraAmount).subtract(usedAmount)).add(usedAmount2).setScale(2, RoundingMode.HALF_UP).toString();
|
||
String updateSql = "update kq_balanceOfLeave set usedAmount=" + (newUsedAmount) + ",usedAmount2=" + (newUsedAmount2) + ", update_time=? where id=" + id;
|
||
updateList.add(updateSql);
|
||
|
||
usageHistoryEntity.setOldUsedAmount(usedAmount.setScale(2, RoundingMode.HALF_UP).toPlainString());
|
||
usageHistoryEntity.setOldUsedAmount2(usedAmount2.setScale(2, RoundingMode.HALF_UP).toPlainString());
|
||
usageHistoryEntity.setNewUsedAmount(newUsedAmount);
|
||
usageHistoryEntity.setNewUsedAmount2(newUsedAmount2);
|
||
usageHistoryEntity.setBalanceOfLeaveId(id);
|
||
usageHistoryEntityList.add(usageHistoryEntity);
|
||
|
||
}
|
||
} else {//扣减优先级:先扣减福利年假、再扣减法定年假
|
||
BigDecimal temp = baseAmount2.add(extraAmount2).subtract(usedAmount2).subtract(_duration);
|
||
if (temp.doubleValue() >= 0) {
|
||
String newUsedAmount2 = usedAmount2.add(_duration).setScale(2, RoundingMode.HALF_UP).toPlainString();
|
||
String updateSql = "update kq_balanceOfLeave set usedAmount2=" + (newUsedAmount2) + ", update_time=? where id=" + id;
|
||
updateList.add(updateSql);
|
||
|
||
usageHistoryEntity.setOldUsedAmount2(usedAmount2.setScale(2, RoundingMode.HALF_UP).toPlainString());
|
||
usageHistoryEntity.setNewUsedAmount2(newUsedAmount2);
|
||
usageHistoryEntity.setBalanceOfLeaveId(id);
|
||
usageHistoryEntityList.add(usageHistoryEntity);
|
||
|
||
} else {
|
||
String newUsedAmount2 = baseAmount2.add(extraAmount2).setScale(5, RoundingMode.HALF_UP).toPlainString();
|
||
String newUsedAmount = _duration.subtract(baseAmount2.add(extraAmount2).subtract(usedAmount2)).add(usedAmount).setScale(5, RoundingMode.HALF_UP).toPlainString();
|
||
String updateSql = "update kq_balanceOfLeave set usedAmount2=" + (newUsedAmount2) + ",usedAmount=" + (newUsedAmount) + ", update_time=? where id=" + id;
|
||
updateList.add(updateSql);
|
||
|
||
usageHistoryEntity.setOldUsedAmount(usedAmount.setScale(2, RoundingMode.HALF_UP).toPlainString());
|
||
usageHistoryEntity.setOldUsedAmount2(usedAmount2.setScale(2, RoundingMode.HALF_UP).toPlainString());
|
||
usageHistoryEntity.setNewUsedAmount(newUsedAmount);
|
||
usageHistoryEntity.setNewUsedAmount2(newUsedAmount2);
|
||
usageHistoryEntity.setBalanceOfLeaveId(id);
|
||
usageHistoryEntityList.add(usageHistoryEntity);
|
||
|
||
|
||
}
|
||
}
|
||
}
|
||
} else {
|
||
//剩余=已释放+额外-已休
|
||
BigDecimal restAmount = baseAmount.add(extraAmount).subtract(usedAmount);
|
||
if (restAmount.compareTo(new BigDecimal(carryOverDays)) > 0) {
|
||
String newUsedAmount = baseAmount.add(extraAmount).subtract(new BigDecimal(carryOverDays)).setScale(2, RoundingMode.HALF_UP).toPlainString();
|
||
String updateSql = "update kq_balanceOfLeave set usedAmount=" + (newUsedAmount) + ", update_time=? where id=" + id;
|
||
updateList.add(updateSql);
|
||
|
||
usageHistoryEntity.setOldUsedAmount(usedAmount.setScale(2, RoundingMode.HALF_UP).toPlainString());
|
||
usageHistoryEntity.setNewUsedAmount(newUsedAmount);
|
||
usageHistoryEntity.setBalanceOfLeaveId(id);
|
||
usageHistoryEntityList.add(usageHistoryEntity);
|
||
}
|
||
}
|
||
}
|
||
|
||
boolean flag = false;
|
||
java.sql.Timestamp updateDate = KQDateUtil.getUpdateTimeStamp();
|
||
for (int i = 0; i < updateList.size(); i++) {
|
||
flag = recordSet.executeUpdate(updateList.get(i), updateDate);
|
||
if (!flag) {
|
||
kqLog.writeLog("结转SQL执行失败。" + "updateListsql=" + updateList.get(i));
|
||
break;
|
||
}
|
||
}
|
||
|
||
/*记录假期使用记录*/
|
||
if (flag && usageHistoryEntityList.size() > 0) {
|
||
KQUsageHistoryBiz usageHistoryBiz = new KQUsageHistoryBiz();
|
||
flag = usageHistoryBiz.save(usageHistoryEntityList);
|
||
if (!flag) {
|
||
kqLog.writeLog("结转SQL日志执行失败。" + "updateListsql=" + JSON.toJSONString(usageHistoryEntityList));
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
kqLog.info("end do KQLeaveCarryOverJob invoke ...");
|
||
} catch (Exception e) {
|
||
new BaseBean().writeLog(e.getMessage());
|
||
new BaseBean().writeLog(e);
|
||
}
|
||
}
|
||
|
||
}
|