package com.engine.salary.wrapper;
import com.cloudstore.eccom.result.WeaResultMsg;
import com.engine.common.util.ServiceUtil;
import com.engine.core.impl.Service;
import com.engine.salary.component.SalaryWeaTable;
import com.engine.salary.component.WeaFormOption;
import com.engine.salary.entity.salaryitem.bo.SalaryItemBO;
import com.engine.salary.entity.salaryitem.bo.SysSalaryItemBO;
import com.engine.salary.entity.salaryitem.dto.SalaryItemFormDTO;
import com.engine.salary.entity.salaryitem.dto.SalaryItemListDTO;
import com.engine.salary.entity.salaryitem.param.SalaryItemSaveParam;
import com.engine.salary.entity.salaryitem.param.SalaryItemSearchParam;
import com.engine.salary.entity.salaryitem.po.SalaryItemPO;
import com.engine.salary.entity.salaryitem.po.SysSalaryItemPO;
import com.engine.salary.entity.salarysob.po.SalarySobItemPO;
import com.engine.salary.enums.SalaryItemTypeEnum;
import com.engine.salary.exception.SalaryRunTimeException;
import com.engine.salary.service.SalaryFormulaService;
import com.engine.salary.service.SalaryItemService;
import com.engine.salary.service.SalarySobItemService;
import com.engine.salary.service.SysSalaryItemService;
import com.engine.salary.service.impl.SalaryItemServiceImpl;
import com.engine.salary.service.impl.SalarySobItemServiceImpl;
import com.engine.salary.service.impl.SysSalaryItemServiceImpl;
import com.engine.salary.util.SalaryEntityUtil;
import com.engine.salary.util.SalaryI18nUtil;
import com.engine.salary.util.valid.RuntimeTypeEnum;
import com.engine.salary.util.valid.ValidUtil;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang3.StringUtils;
import weaver.hrm.User;
import java.util.*;
import java.util.stream.Collectors;
/**
* 薪资项目
*
Copyright: Copyright (c) 2022
* Company: 泛微软件
*
* @author qiantao
* @version 1.0
**/
public class SalaryItemWrapper extends Service {
private SalaryItemService getSalaryItemService(User user) {
return (SalaryItemService) ServiceUtil.getService(SalaryItemServiceImpl.class, user);
}
private SysSalaryItemService getSysSalaryItemService(User user) {
return (SysSalaryItemService) ServiceUtil.getService(SysSalaryItemServiceImpl.class, user);
}
private SalaryFormulaService salaryFormulaService;
private SalarySobItemService getSalarySobItemService(User user) {
return (SalarySobItemService) ServiceUtil.getService(SalarySobItemServiceImpl.class, user);
}
/**
* 薪资项目列表
*
* @param searchParam 查询参数
* @return
*/
public Map listPage(SalaryItemSearchParam searchParam) {
SalaryWeaTable table = new SalaryWeaTable(user, SalaryItemListDTO.class);
String fields = " t.id" +
" , t.name" +
" , t.code" +
" , t.system_type" +
" , t.sys_salary_item_id" +
" , t.category" +
" , t.item_type as itemType" +
" , t.use_default as useDefault" +
" , t.use_in_employee_salary as useInEmployeeSalary" +
" , t.rounding_mode as roundingMode" +
" , t.pattern" +
" , t.value_type as valueType" +
" , t.datasource" +
" , t.formula_id" +
" , t.description" +
" , t.can_edit" +
" , t.can_delete";
String from = "from hrsa_salary_item t";
table.setBackfields(fields);
table.setSqlform(from);
table.setSqlwhere(makeSqlWhere(searchParam));
table.setSqlorderby("t.id DESC");
table.setSqlprimarykey("t.id");
table.setSqlisdistinct("false");
WeaResultMsg result = new WeaResultMsg(false);
result.putAll(table.makeDataResult());
result.success();
return result.getResultMap();
// // 1、查询薪资项目
// PageInfo page = getSalaryItemService(user).listPageByParam(searchParam);
// List salaryItemList = page.getList();
//
// //最终返回的分页对象
// PageInfo salaryItemListDTOPage = new PageInfo<>();
//
// if (CollectionUtils.isNotEmpty(salaryItemList)) {
// //2、填充公式内容
// Set formulaIds = SalaryEntityUtil.properties(salaryItemList, SalaryItemPO::getFormulaId);
// // todo 查询公式
// List expressFormulas = salaryFormulaService.listExpressFormula(formulaIds);
// // 转换成薪资项目列表dto
// salaryItemListDTOPage.setList(SalaryItemBO.convert2ListDTO(salaryItemList, expressFormulas));
//
// //3、被引用的薪资项目不能删除
// // 查询被账套引用的薪资项目
// Set salaryItemIds = SalaryEntityUtil.properties(salaryItemList, SalaryItemPO::getId);
// List salarySobItemPOS = salarySobItemService.listBySalaryItemIds(salaryItemIds);
// }
// // 构建前端所需的数据格式
// WeaTable weaTable = SalaryFormatUtil.getInstance().buildTable(SalaryItemListDTO.class, dtoPage);
// // 被薪资账套引用的薪资项目不可删除
// if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isNotEmpty(salarySobItems)) {
// Set salaryItemIds = SalaryEntityUtil.properties(salarySobItems, SalarySobItemPO::getSalaryItemId);
// for (int i = 0; i < page.getRecords().size(); i++) {
// SalaryItemPO salaryItemPO = page.getRecords().get(i);
// if (salaryItemIds.contains(salaryItemPO.getId())) {
// Permission permission = weaTable.getOperatesPermission().get(i).get(1);
// permission.setVisible(false);
// permission.setDisabled(true);
// }
// }
// }
}
private String makeSqlWhere(SalaryItemSearchParam searchParam) {
String sqlWhere = " t.delete_type = 0 ";
String name = searchParam.getName();
if (StringUtils.isNotBlank(name)) {
sqlWhere += " AND t.name = " + name;
}
String description = searchParam.getDescription();
if (StringUtils.isNotBlank(description)) {
sqlWhere += " AND t.description = " + description;
}
Integer category = searchParam.getCategory();
if (category != null) {
sqlWhere += " AND t.category = " + category;
}
Integer itemType = searchParam.getItemType();
if (itemType != null) {
sqlWhere += " AND t.item_type = " + itemType;
}
Integer useInEmployeeSalary = searchParam.getUseInEmployeeSalary();
if (useInEmployeeSalary != null) {
sqlWhere += " AND t.use_in_employee_salary = " + useInEmployeeSalary;
}
Integer useDefault = searchParam.getUseDefault();
if (useDefault != null) {
sqlWhere += " AND t.use_default = " + useDefault;
}
Integer valueType = searchParam.getValueType();
if (valueType != null) {
sqlWhere += " AND t.value_type = " + valueType;
}
Collection excludeIds = searchParam.getExcludeIds();
if (CollectionUtils.isNotEmpty(excludeIds)) {
String idsStr = excludeIds.stream().map(String::valueOf).collect(Collectors.joining(","));
sqlWhere += " AND t.id NOT IN (" + idsStr + ")";
}
return sqlWhere;
}
/**
* 可以删除的薪资项目列表
*
* @param searchParam 查询人员
* @return
*/
public Map listPage4CanDelete(SalaryItemSearchParam searchParam) {
// 查询所有薪资账套中的薪资项目副本
List salarySobItemPOS = getSalarySobItemService(user).list();
// 被引用的薪资项目id
Set salaryItemIds = SalaryEntityUtil.properties(salarySobItemPOS, SalarySobItemPO::getSalaryItemId);
// 排除被引用的薪资项目(被引用的薪资项目不可以删除)
searchParam.setExcludeIds(salaryItemIds);
// 转换成前端所需的数据格式
Map map = listPage(searchParam);
return map;
}
/**
* 根据主键id获取薪资项目详情
*
* @param ids 薪资项目的主键id
* @return
*/
public List listByIds(Collection ids) {
List salaryItemPOS = getSalaryItemService(user).listByIds(ids);
if (CollectionUtils.isEmpty(salaryItemPOS)) {
return Collections.emptyList();
}
// 查询公式详情
Set formulaIds = SalaryEntityUtil.properties(salaryItemPOS, SalaryItemPO::getFormulaId);
// todo List expressFormulas = salaryFormulaService.listExpressFormula(formulaIds);
// 转换成薪资项目列表dto
return SalaryItemBO.convert2ListDTO(salaryItemPOS, null);
}
// /**
// * 薪资项目列表的高级搜索
// *
// * @return
// */
// public WeaSearchCondition getSearchCondition() {
// WeaSearchCondition searchCondition = SalaryFormatUtil.getInstance()
// .buildCondition(SalaryItemSearchConditionDTO.class, new SalaryItemSearchConditionDTO(), "salaryItemCondition");
// // "其他条件"不要
// searchCondition.getGroups().remove(1);
// return searchCondition;
// }
/**
* 薪资项目详情
*
* @param id 主键id
* @return
*/
public SalaryItemFormDTO getForm(Long id) {
SalaryItemFormDTO salaryItemFormDTO = new SalaryItemFormDTO();
// 默认可以编辑
salaryItemFormDTO.setCanEdit(NumberUtils.INTEGER_ONE);
if (!Objects.isNull(id)) {
// 查询薪资项目
SalaryItemPO salaryItemPO = getSalaryItemService(user).getById(id);
// 系统薪资项目
SysSalaryItemPO sysSalaryItemPO = getSysSalaryItemService(user).getById(id);
if (Objects.isNull(salaryItemPO) && Objects.isNull(sysSalaryItemPO)) {
throw new SalaryRunTimeException(SalaryI18nUtil.getI18nLabel(98299, "参数错误,薪资项目不存在或已被删除"));
}
//todo 公式详情
// ExpressFormula expressFormula;
// // 转换成薪资项目详情dto
if (Objects.isNull(salaryItemPO)) {
salaryItemFormDTO = SysSalaryItemBO.convert2FormDTO(sysSalaryItemPO);
// expressFormula = salaryFormulaService.getExpressFormula(sysSalaryItemPO.getFormulaId());
} else {
salaryItemFormDTO = SalaryItemBO.convert2FormDTO(salaryItemPO);
// expressFormula = salaryFormulaService.getExpressFormula(salaryItemPO.getFormulaId());
}
// salaryItemFormDTO.setFormulaContent(Optional.ofNullable(expressFormula).map(ExpressFormula::getFormula).orElse(""));
}
return salaryItemFormDTO;
}
/**
* 获取薪资项目可选的类型(与属性有联动)
*
* @return
*/
public Map> listSalaryItemTypeOption() {
return SalaryEntityUtil.group2ListMap(Arrays.asList(SalaryItemTypeEnum.values()),
e -> e.getCategory().name(),
e -> new WeaFormOption(e.name(), SalaryI18nUtil.getI18nLabel(e.getLabelId(), e.getDefaultLabel())));
}
/**
* 保存薪资项目
*
* @param saveParam 保存参数
*/
public void save(SalaryItemSaveParam saveParam) {
ValidUtil.doValidator(saveParam);
getSalaryItemService(user).save(saveParam);
}
/**
* 编辑薪资项目
*
* @param saveParam 更新参数
*/
public void update(SalaryItemSaveParam saveParam) {
ValidUtil.doValidator(saveParam, RuntimeTypeEnum.UPDATE);
getSalaryItemService(user).update(saveParam);
}
/**
* 删除薪资项目
*
* @param ids 主键id
*/
public void delete(Collection ids) {
getSalaryItemService(user).deleteByIds(ids);
}
}