|
|
@@ -0,0 +1,294 @@
|
|
|
+package nckd.jxccl.swc.init.business;
|
|
|
+
|
|
|
+import kd.bos.algo.DataSet;
|
|
|
+import kd.bos.algo.Row;
|
|
|
+import kd.bos.dataentity.entity.DynamicObject;
|
|
|
+import kd.bos.dataentity.entity.DynamicObjectCollection;
|
|
|
+import kd.bos.db.DB;
|
|
|
+import kd.bos.logging.Log;
|
|
|
+import kd.bos.logging.LogFactory;
|
|
|
+import kd.bos.orm.query.QCP;
|
|
|
+import kd.bos.orm.query.QFilter;
|
|
|
+import kd.bos.servicehelper.BusinessDataServiceHelper;
|
|
|
+import kd.bos.servicehelper.QueryServiceHelper;
|
|
|
+import kd.bos.servicehelper.operation.SaveServiceHelper;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * 员工信息维护(社保专用)列表界面提供一个功能按钮,可以进行即时计算,
|
|
|
+ * 后台提供定时任务(每年12月31日24点执行一次),当年度待遇根据上年度12月31日的人员状态和记录计算补助待遇,
|
|
|
+ * 按照年度生成多行记录,记录历史。当专员手动执行前端更新按钮时(需选中人员),
|
|
|
+ * 系统需根据手动的当前时间获取人员状态和记录计算补助待遇,包括对当前记录进行更新,
|
|
|
+ * 新增人员待遇记录生成。(离职人员不做处理)
|
|
|
+ * 金额调整
|
|
|
+ * 2400--->4800
|
|
|
+ * 1800--->3600
|
|
|
+ * 1200--->2400
|
|
|
+ * 840--->1800
|
|
|
+ * author: turborao
|
|
|
+ * date: 2025/10/27 13:05
|
|
|
+ */
|
|
|
+public class BaseMedicalAllowanceServiceImpl implements BaseMedicalAllowanceService{
|
|
|
+
|
|
|
+ private static final Log logger = LogFactory.getLog(BaseMedicalAllowanceServiceImpl.class);
|
|
|
+ public Map<String, String> calcBaseMedicalAllowanceForAll() {
|
|
|
+
|
|
|
+ //取员工档案
|
|
|
+ String billKey = "hcsi_sinsurfile";
|
|
|
+ QFilter filter1 = new QFilter("iscurrentversion", QCP.equals, true); // 启用
|
|
|
+ QFilter filter2 = new QFilter("datastatus", QCP.equals, "1"); // 启用
|
|
|
+
|
|
|
+ String selectFields="id,employee.id,employee.number,nckd_benefitentry.nckd_effeyear,nckd_benefitentry.nckd_suppbenefit";
|
|
|
+ DynamicObject[] datas = BusinessDataServiceHelper.load(billKey, selectFields, new QFilter[]{filter1.and(filter2)});
|
|
|
+
|
|
|
+ Map<String, String> result = calcBaseMedicalAllowance(datas, true);
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Map<String, String> calcBaseMedicalAllowanceForPersons(List<Long> billIds) {
|
|
|
+
|
|
|
+ //取员工档案
|
|
|
+ String billKey = "hcsi_sinsurfile";
|
|
|
+ QFilter filter1 = new QFilter("iscurrentversion", QCP.equals, true); // 启用
|
|
|
+ QFilter filter2 = new QFilter("datastatus", QCP.equals, "1"); // 启用
|
|
|
+ QFilter filter3 = new QFilter("id", QCP.in, billIds); // 启用
|
|
|
+
|
|
|
+ String selectFields="id,employee.id,employee.number,nckd_benefitentry.nckd_effeyear,nckd_benefitentry.nckd_suppbenefit";
|
|
|
+ DynamicObject[] datas = BusinessDataServiceHelper.load(billKey, selectFields, new QFilter[]{filter1.and(filter2).and(filter3)});
|
|
|
+
|
|
|
+ Map<String, String> result = calcBaseMedicalAllowance(datas,false);
|
|
|
+
|
|
|
+ return result;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public Map<String, String> calcBaseMedicalAllowance(DynamicObject[] datas, boolean isAll) {
|
|
|
+
|
|
|
+ // 获取当前日期
|
|
|
+ LocalDate currentDate = LocalDate.now();
|
|
|
+
|
|
|
+ // 获取上一年的年份
|
|
|
+ //int previousYear = currentDate.minusYears(1).getYear();
|
|
|
+ int previousYear = currentDate.getYear();
|
|
|
+
|
|
|
+ Map<Long, DynamicObject> employeeFileMaps = Arrays.stream(datas).collect(
|
|
|
+ Collectors.toMap(
|
|
|
+ obj -> obj.getLong("employee.id"),
|
|
|
+ obj -> obj,
|
|
|
+ (k1, k2) -> k1
|
|
|
+ )
|
|
|
+ );
|
|
|
+ //将Map转换为List
|
|
|
+ List<Long> employeeIDs = employeeFileMaps.keySet().stream().collect(Collectors.toList());
|
|
|
+ ArrayList<DynamicObject> dynList = new ArrayList<>();
|
|
|
+ /***
|
|
|
+ * 获取员工基本信息
|
|
|
+ */
|
|
|
+ QFilter qFilter1 = new QFilter("id",QCP.in, employeeIDs);
|
|
|
+ QFilter qFilter11 = new QFilter("iscurrentversion", QCP.equals, true); // 启用
|
|
|
+ QFilter qFilter12 = new QFilter("datastatus", QCP.equals, "1"); // 启用
|
|
|
+ DataSet employeeDS = QueryServiceHelper.queryDataSet(this.getClass().getName(),"hrpi_employee", "id,number,name", new QFilter[]{qFilter1,qFilter11,qFilter12},null);
|
|
|
+ employeeDS.print(true);
|
|
|
+ /***
|
|
|
+ * 获取员工档案 任职经历 岗位
|
|
|
+ */
|
|
|
+ QFilter qFilter2 = new QFilter("employee.id",QCP.in, employeeIDs);
|
|
|
+ QFilter qFilter21 = new QFilter("iscurrentdata", QCP.equals, true); // 启用
|
|
|
+ QFilter qFilter22 = new QFilter("isprimary", QCP.equals, "1"); //主任职
|
|
|
+ QFilter qFilter23 = new QFilter("postype.id", QCP.equals, 1010L); //主任职
|
|
|
+ DataSet empOrgRelDS = QueryServiceHelper.queryDataSet(this.getClass().getName(),"hrpi_empposorgrel", "id,employee.id,company.id,company.name,position.id,position.number,position.name,adminorg.number", new QFilter[]{qFilter2,qFilter21,qFilter22,qFilter23},null);
|
|
|
+ empOrgRelDS.print(true);
|
|
|
+ /***
|
|
|
+ * 获取员工档案 雇佣信息 用工关系状态
|
|
|
+ */
|
|
|
+ QFilter qFilter3 = new QFilter("employee.id",QCP.in, employeeIDs);
|
|
|
+ QFilter qFilter31 = new QFilter("iscurrentdata", QCP.equals, true); // 启用
|
|
|
+ QFilter qFilter32 = new QFilter("ishired", QCP.equals, "1"); // 是否在职
|
|
|
+ DataSet empentrelDS = QueryServiceHelper.queryDataSet(this.getClass().getName(),"hrpi_empentrel", "id,employee.id,laborrelstatus.number", new QFilter[]{qFilter3,qFilter31,qFilter32},null);
|
|
|
+
|
|
|
+ /***
|
|
|
+ * 获取员工档案 党政职务 职务级别
|
|
|
+ */
|
|
|
+ QFilter qFilter4 = new QFilter("employee.id",QCP.in, employeeIDs);
|
|
|
+ QFilter qFilter41 = new QFilter("iscurrentdata", QCP.equals, true); // 启用
|
|
|
+ DataSet posgradeDS = QueryServiceHelper.queryDataSet(this.getClass().getName(),"nckd_hrpi_partyposh", "id,employee.id,nckd_posgrade.number", new QFilter[]{qFilter4,qFilter41},null);
|
|
|
+
|
|
|
+ /***
|
|
|
+ * 获取员工档案 职称信息 职称级别 hrpi_perprotitle
|
|
|
+ */
|
|
|
+ QFilter qFilter5 = new QFilter("employee.id",QCP.in, employeeIDs);
|
|
|
+ QFilter qFilter51 = new QFilter("ishigh", QCP.equals, "1"); // 启用
|
|
|
+ DataSet perprotitleDS = QueryServiceHelper.queryDataSet(this.getClass().getName(),"hrpi_perprotitle", "id,employee.id,prolevel.number", new QFilter[]{qFilter5,qFilter51},null);
|
|
|
+
|
|
|
+ /***
|
|
|
+ * 获取员工档案 职业资格 职业资格等级 hrpi_perocpqual
|
|
|
+ */
|
|
|
+ QFilter qFilter6 = new QFilter("employee.id",QCP.in, employeeIDs);
|
|
|
+ QFilter qFilter61 = new QFilter("ismajor", QCP.equals, "1"); // 启用
|
|
|
+ DataSet perocpqualeDS = QueryServiceHelper.queryDataSet(this.getClass().getName(),"hrpi_perocpqual", "id,employee.id,qualevel.number", new QFilter[]{qFilter6,qFilter61},null);
|
|
|
+
|
|
|
+
|
|
|
+ DataSet reDataset = null;
|
|
|
+ reDataset = employeeDS.leftJoin(empOrgRelDS).on("id", "employee.id")
|
|
|
+ .select(employeeDS.getRowMeta().getFieldNames(),new String[] {"company.id as compId","company.name as compName","position.id as positionId","position.number as positionNum","position.name as positionName","adminorg.number as adminorgNum"})
|
|
|
+ .finish();
|
|
|
+ reDataset.print(true);
|
|
|
+
|
|
|
+ reDataset = reDataset.leftJoin(empentrelDS).on("id", "employee.id")
|
|
|
+ .select(reDataset.getRowMeta().getFieldNames(),new String[] {"laborrelstatus.number as laborrelstatusNum"})
|
|
|
+ .finish();
|
|
|
+ reDataset.print(true);
|
|
|
+
|
|
|
+ reDataset = reDataset.leftJoin(posgradeDS).on("id", "employee.id")
|
|
|
+ .select(reDataset.getRowMeta().getFieldNames(),new String[] {"nckd_posgrade.number as posgradeNum"})
|
|
|
+ .finish();
|
|
|
+ reDataset.print(true);
|
|
|
+
|
|
|
+ reDataset = reDataset.leftJoin(perprotitleDS).on("id", "employee.id")
|
|
|
+ .select(reDataset.getRowMeta().getFieldNames(),new String[] {"prolevel.number as prolevelNum"})
|
|
|
+ .finish();
|
|
|
+ reDataset.print(true);
|
|
|
+
|
|
|
+ reDataset = reDataset.leftJoin(perocpqualeDS).on("id", "employee.id")
|
|
|
+ .select(reDataset.getRowMeta().getFieldNames(),new String[] {"qualevel.number as qualevelNum"})
|
|
|
+ .finish();
|
|
|
+ reDataset.print(true);
|
|
|
+
|
|
|
+ Iterator<Row> iterator = reDataset.iterator();
|
|
|
+ while (iterator.hasNext()) {
|
|
|
+ Row row = iterator.next();
|
|
|
+ DynamicObject employeeFile = employeeFileMaps.get(row.getLong("id"));
|
|
|
+ String personNum = row.getString("number") == null ? "" : row.getString("number");
|
|
|
+ String personName = row.getString("name") == null ? "" : row.getString("name");
|
|
|
+ String adminorgNum = row.getString("adminorgNum") == null ? "" : row.getString("adminorgNum");
|
|
|
+ String positionNum = row.getString("positionNum") == null ? "" : row.getString("positionNum");
|
|
|
+ String positionName = row.getString("positionName") == null ? "" : row.getString("positionName");
|
|
|
+ String posgradeNum = row.getString("posgradeNum") == null ? "" : row.getString("posgradeNum");
|
|
|
+ String laborrelstatusNum = row.getString("laborrelstatusNum") == null ? "" : row.getString("laborrelstatusNum");
|
|
|
+ String prolevelNum = row.getString("prolevelNum") == null ? "" : row.getString("prolevelNum");
|
|
|
+ String qualevelNum = row.getString("qualevelNum") == null ? "" : row.getString("qualevelNum");
|
|
|
+
|
|
|
+ if(!isAll) {
|
|
|
+ logger.info("员工编号:{},员工姓名:{},部门:{},岗位:{},职务级别:{},职称级别:{},职业资格等级:{},用工关系状态:{}",
|
|
|
+ personNum, personName, adminorgNum, positionName, posgradeNum, prolevelNum, qualevelNum, laborrelstatusNum);
|
|
|
+ }
|
|
|
+
|
|
|
+ int money = 0;
|
|
|
+ List<String> L4800 = Arrays.asList("1", "2");
|
|
|
+ List<String> L3600 = Arrays.asList("3", "4", "5");
|
|
|
+ List<String> L2400 = Arrays.asList("6", "7", "8", "9");
|
|
|
+ List<String> prolevelHigeList = Arrays.asList("001", "011");
|
|
|
+ List<String> prolevelMiddList = Arrays.asList("002", "010");
|
|
|
+ /**
|
|
|
+ * 公司领导班子成员:对应组织为集团本部-股份公司领导-公司领导和集团本部-集团公司领导在内的所有正式员工【4800/年】
|
|
|
+ */
|
|
|
+ if(laborrelstatusNum.equals("1010_S") && (adminorgNum.equals("01010201") || adminorgNum.equals("01010101"))){
|
|
|
+ money = 4800;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 监事会主席:对应职位编码为ZW01010377的正式员工 【4800/年】
|
|
|
+ * 专职外部董事:对应职位编码为ZW01010173的正式员工 【4800/年】
|
|
|
+ */
|
|
|
+ else if (laborrelstatusNum.equals("1010_S") && (positionNum.equals("ZW01010377") || positionNum.equals("ZW01010173"))) {
|
|
|
+ money = 4800;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 专职监事正副职:对应职位编码为ZW01010378和ZW01010379的正式员工【3600/年】
|
|
|
+ */
|
|
|
+ else if (laborrelstatusNum.equals("1010_S") && (positionNum.equals("ZW01010378") || positionNum.equals("ZW01010379"))) {
|
|
|
+ money = 3600;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 职务级别为"厅级、副厅级"的正式员工 4800
|
|
|
+ */
|
|
|
+ else if (laborrelstatusNum.equals("1010_S") && L4800.contains(posgradeNum) ) {
|
|
|
+ money = 4800;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 职务级别为"中层正职
|
|
|
+ * 中层副职
|
|
|
+ * 中层副职(托管)"的正式员工 3600
|
|
|
+ */
|
|
|
+ else if (laborrelstatusNum.equals("1010_S") && L3600.contains(posgradeNum) ) {
|
|
|
+ money = 3600;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 已聘任正高级职称或特级技师:对应职称级别为正高级、正高级(虚拟);技能等级为特级技师的正式员工 3600
|
|
|
+ */
|
|
|
+ else if (laborrelstatusNum.equals("1010_S") && (prolevelHigeList.contains(prolevelNum) || qualevelNum.equals("0"))) {
|
|
|
+ money = 3600;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 已聘任副高级职称或高级技师:对应职称级别为副高级、副高级(虚拟);技能等级为高级技师的正式员工 2400
|
|
|
+ */
|
|
|
+ else if (laborrelstatusNum.equals("1010_S") && (prolevelMiddList.contains(prolevelNum) || qualevelNum.equals("1"))) {
|
|
|
+ money = 2400;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 职务级别为"基层正职
|
|
|
+ * 基层正职(托管)
|
|
|
+ * 基层副职
|
|
|
+ * 基层副职(托管)"的正式员工 2400
|
|
|
+ */
|
|
|
+ else if (laborrelstatusNum.equals("1010_S") && L2400.contains(posgradeNum) ) {
|
|
|
+ money = 2400;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 协理员:职位名称包含“协理员”的所有正式员工 【2400/年】
|
|
|
+ */
|
|
|
+ else if (laborrelstatusNum.equals("1010_S") && positionName.contains("协理员") ) {
|
|
|
+ money = 2400;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 职务级别为"其他"的正式员工 1800
|
|
|
+ */
|
|
|
+ else if (laborrelstatusNum.equals("1010_S") && posgradeNum.equals("10") ) {
|
|
|
+ money = 1800;
|
|
|
+ }else if (laborrelstatusNum.equals("1010_S")) {
|
|
|
+ money = 1800;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ DynamicObjectCollection benefitEntrys = employeeFile.getDynamicObjectCollection("nckd_benefitentry");
|
|
|
+
|
|
|
+ List<DynamicObject> currYearDyn =
|
|
|
+ benefitEntrys.stream().filter(e -> e.getInt("nckd_effeyear") == previousYear).collect(Collectors.toList());
|
|
|
+ DynamicObject benefitEntry = null;
|
|
|
+ if(currYearDyn.size() == 0){
|
|
|
+ benefitEntry = benefitEntrys.addNew() ;
|
|
|
+ Long entryid = DB.genGlobalLongId();
|
|
|
+ benefitEntry.set("id", entryid);
|
|
|
+ }else{
|
|
|
+ benefitEntry = currYearDyn.get(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ benefitEntry.set("nckd_effeyear", previousYear);
|
|
|
+ benefitEntry.set("nckd_suppbenefit", money);
|
|
|
+
|
|
|
+ dynList.add(employeeFile);
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, String> result = new HashMap<>();
|
|
|
+ int length = 0;
|
|
|
+ if(dynList.size() == 0) {
|
|
|
+ result.put("code", "200");
|
|
|
+ result.put("msg", "当年度待遇标准计算(补充医疗保险),执行成功,但本次没有人员数据!" );
|
|
|
+ }else{
|
|
|
+ //保存
|
|
|
+ Object[] update = SaveServiceHelper.save(dynList.toArray(new DynamicObject[0]));
|
|
|
+ length = update.length;
|
|
|
+ result.put("code", "200");
|
|
|
+ result.put("msg", "当年度待遇标准计算(补充医疗保险),执行成功,本次计算人员数量" + length);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|