package com.engine.organization.service.impl;
import com.api.browser.bean.SearchConditionGroup;
import com.api.browser.bean.SearchConditionItem;
import com.api.browser.bean.SearchConditionOption;
import com.api.browser.util.ConditionType;
import com.api.hrm.bean.HrmFieldBean;
import com.api.hrm.util.HrmFieldSearchConditionComInfo;
import com.api.hrm.util.HrmTransMethod;
import com.cloudstore.eccom.constant.WeaBoolAttr;
import com.cloudstore.eccom.pc.table.WeaTableColumn;
import com.cloudstore.eccom.result.WeaResultMsg;
import com.engine.core.impl.Service;
import com.engine.hrm.util.face.HrmFaceCheckManager;
import com.engine.organization.component.OrganizationWeaTable;
import com.engine.organization.entity.DeleteParam;
import com.engine.organization.entity.chart.ResourceListColumns;
import com.engine.organization.entity.company.bo.CompBO;
import com.engine.organization.entity.company.po.CompPO;
import com.engine.organization.entity.department.bo.DepartmentBO;
import com.engine.organization.entity.department.po.DepartmentPO;
import com.engine.organization.entity.extend.bo.ExtendInfoBO;
import com.engine.organization.entity.extend.po.ExtendInfoPO;
import com.engine.organization.entity.hrmresource.bo.HrmRelationBO;
import com.engine.organization.entity.hrmresource.bo.ResourceChartBO;
import com.engine.organization.entity.hrmresource.param.HrmRelationSaveParam;
import com.engine.organization.entity.hrmresource.param.SearchTemplateParam;
import com.engine.organization.entity.hrmresource.po.*;
import com.engine.organization.entity.hrmresource.vo.HrmResourceVO;
import com.engine.organization.entity.hrmresource.vo.ResourceChartVO;
import com.engine.organization.entity.jclimport.po.CusFormFieldPO;
import com.engine.organization.entity.job.bo.JobBO;
import com.engine.organization.entity.job.po.JobPO;
import com.engine.organization.entity.search.QuickSearchDetail;
import com.engine.organization.entity.searchtree.SearchTree;
import com.engine.organization.entity.searchtree.SearchTreeParams;
import com.engine.organization.enums.HrmGroupEnum;
import com.engine.organization.exception.OrganizationRunTimeException;
import com.engine.organization.mapper.comp.CompMapper;
import com.engine.organization.mapper.condition.QuickSearchMapper;
import com.engine.organization.mapper.department.DepartmentMapper;
import com.engine.organization.mapper.hrmresource.HrmRelationMapper;
import com.engine.organization.mapper.hrmresource.SystemDataMapper;
import com.engine.organization.mapper.job.JobMapper;
import com.engine.organization.mapper.resource.HrmResourceMapper;
import com.engine.organization.mapper.resource.JclOrgCustomTemplateMapper;
import com.engine.organization.service.HrmResourceService;
import com.engine.organization.util.HasRightUtil;
import com.engine.organization.util.MenuBtn;
import com.engine.organization.util.OrganizationAssert;
import com.engine.organization.util.OrganizationDateUtil;
import com.engine.organization.util.db.DBType;
import com.engine.organization.util.db.MapperProxyFactory;
import com.engine.organization.util.detach.DetachUtil;
import com.engine.organization.util.page.PageUtil;
import com.engine.organization.util.tree.SearchTreeUtil;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONException;
import org.json.JSONObject;
import weaver.common.DateUtil;
import weaver.conn.RecordSet;
import weaver.general.BaseBean;
import weaver.general.StringUtil;
import weaver.general.TimeUtil;
import weaver.general.Util;
import weaver.hrm.definedfield.HrmFieldManager;
import weaver.systeminfo.SystemEnv;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import static weaver.general.Util.getIntValue;
/**
* @author:dxfeng
* @createTime: 2022/06/20
* @version: 1.0
*/
public class HrmResourceServiceImpl extends Service implements HrmResourceService {
/**
* 左侧树 类型表示
*
* 0:集团
* 1:分部
* 2:部门
* 3:岗位
*/
private static final String TYPE_COMP = "1";
private static final String TYPE_DEPT = "2";
private static final String TYPE_JOB = "3";
private static final String RIGHT_NAME = "Roster:All";
private HrmRelationMapper getHrmRelationMapper() {
return MapperProxyFactory.getProxy(HrmRelationMapper.class);
}
private DepartmentMapper getDepartmentMapper() {
return MapperProxyFactory.getProxy(DepartmentMapper.class);
}
private CompMapper getCompMapper() {
return MapperProxyFactory.getProxy(CompMapper.class);
}
private JobMapper getJobMapper() {
return MapperProxyFactory.getProxy(JobMapper.class);
}
private HrmResourceMapper getHrmResourceMapper() {
return MapperProxyFactory.getProxy(HrmResourceMapper.class);
}
private SystemDataMapper getSystemDataMapper() {
return MapperProxyFactory.getProxy(SystemDataMapper.class);
}
private JclOrgCustomTemplateMapper getJclOrgCustomTemplateMapper() {
return MapperProxyFactory.getProxy(JclOrgCustomTemplateMapper.class);
}
private QuickSearchMapper getQuickSearchMapper() {
return MapperProxyFactory.getProxy(QuickSearchMapper.class);
}
// 所有满足条件的岗位ID
private List jobTitleList = null;
// 是否
boolean searchJobTitle = false;
@Override
public Map getSearchTree(SearchTreeParams params) {
String keyword = params.getKeyword();
String id = params.getId();
String type = Util.null2String(params.getType());
List treeList = getFilterCompany(id, type, keyword);
return SearchTreeUtil.getSearchTree(type, treeList);
}
@Override
public Map listPage(Map params) {
OrganizationWeaTable table = new OrganizationWeaTable<>(user, HrmResourceVO.class);
String sqlWhere = buildSqlWhere(params);
table.setSqlwhere(sqlWhere);
List weaTableColumnList = new ArrayList<>();
JclOrgCustomTemplatePO jclOrgCustomTemplatePO = MapperProxyFactory.getProxy(JclOrgCustomTemplateMapper.class).queryIsusedTemp("1", String.valueOf(user.getUID()));
//2.是否存在通用模板
if (null == jclOrgCustomTemplatePO) {
jclOrgCustomTemplatePO = MapperProxyFactory.getProxy(JclOrgCustomTemplateMapper.class).queryOverAll();
}
String columns = "";
List fields = new ArrayList<>();
List allConditions = getAllConditions();
String propValue = new BaseBean().getPropValue("hrmOrganization", "orgId");
if (jclOrgCustomTemplatePO != null) {
if (StringUtils.isNotBlank(jclOrgCustomTemplatePO.getBasicFields())) {
columns = jclOrgCustomTemplatePO.getBasicFields();
}
if (StringUtils.isNotBlank(jclOrgCustomTemplatePO.getPersonalFields())) {
columns = columns + "," + jclOrgCustomTemplatePO.getPersonalFields();
}
if (StringUtils.isNotBlank(jclOrgCustomTemplatePO.getWorkFields())) {
columns = columns + "," + jclOrgCustomTemplatePO.getWorkFields();
}
} else {
//初次使用,无模板初始值
columns = "-1_hrm_lastname,-1_hrm_departmentid,-1_hrm_subcompanyid1,-1_hrm_jobtitle,-1_hrm_mobile,-1_hrm_telephone,-1_hrm_managerid,-1_hrm_sporder";
}
List columnList = Arrays.asList(columns.split(","));
BigDecimal decimal = new BigDecimal(100 / columnList.size());
List all = new ArrayList<>();
for (SearchConditionGroup allCondition : allConditions) {
all.addAll(allCondition.getItems());
}
List items = filterByDomkey(all, columnList);
for (SearchConditionItem item : items) {
String columnName = item.getDomkey()[0];
WeaTableColumn weaTableColumn = new WeaTableColumn();
if (columnName.equals("-1_cus_"+propValue)){
fields.add("t.id as " + buildTableSql(columnName).replace(".", "_"));
weaTableColumn.setTransmethod("com.engine.organization.transmethod.HrmResourceTransMethod.getOrgValue");
}else{
fields.add(buildTableSql(columnName) + " as " + buildTableSql(columnName).replace(".", "_"));
weaTableColumn.setTransmethod("com.engine.organization.transmethod.HrmResourceTransMethod.getFieldTrueValue");
}
String scopeId = columnName.split("_")[0];
String fieldName = columnName.substring(columnName.lastIndexOf("_") + 1);
weaTableColumn.setText(getHrmResourceMapper().queryLabelName(fieldName, scopeId, user.getLanguage()));
weaTableColumn.setColumn(buildTableSql(columnName).replace(".", "_"));
weaTableColumn.setOtherpara(columnName);
weaTableColumn.setDisplay(columnList.contains(columnName) ? WeaBoolAttr.TRUE : WeaBoolAttr.FALSE);
weaTableColumn.setWidth(decimal.setScale(2, RoundingMode.HALF_UP).doubleValue() + "%");
weaTableColumnList.add(weaTableColumn);
}
// 增加id字段,跳转人员卡片
WeaTableColumn weaTableColumn = new WeaTableColumn();
weaTableColumn.setColumn("id");
weaTableColumn.setDisplay(WeaBoolAttr.FALSE);
weaTableColumnList.add(weaTableColumn);
fields.add("t.id");
table.setBackfields(StringUtils.join(fields, ","));
table.setColumns(weaTableColumnList);
WeaResultMsg result = new WeaResultMsg(false);
result.putAll(table.makeDataResult());
result.success();
return new HashMap<>(result.getResultMap());
}
@Override
public Map getSaveForm() {
Map apiDatas = new HashMap<>();
List addGroups = new ArrayList<>();
apiDatas.put("condition", addGroups);
return apiDatas;
}
private List filterByDomkey(List items, List domkeys) {
List tempResult = items.stream()
.filter(item -> domkeys.contains(item.getDomkey()[0]))
.collect(Collectors.toList());
Map hashMap = new HashMap<>();
for (SearchConditionItem item : tempResult) {
String domkeyElement = item.getDomkey()[0];
hashMap.put(domkeyElement, item);
}
List resultList = new ArrayList<>();
for (String domkeyElement : domkeys) {
SearchConditionItem item = hashMap.get(domkeyElement);
if (item != null) {
resultList.add(item);
}
}
return resultList;
}
@Override
public Long saveBaseForm(Map params) {
return 0L;
}
@Override
public Map getBaseForm(Map params) {
return new HashMap<>();
}
@Override
public int updateForm(Map params) {
return 0;
}
@Override
public Integer saveSearchTemplate(SearchTemplateParam params) {
// 重复名称校验
SearchTemplatePO searchTemplateByName = getHrmResourceMapper().getSearchTemplateByName(user.getUID(), params.getShowname());
OrganizationAssert.isFalse("默认模板".equals(params.getShowname()) || null != searchTemplateByName, SystemEnv.getHtmlLabelName(547439, user.getLanguage()));
SearchTemplatePO templatePO = buildSearchTemplateByFields(params.getFields());
if (null == templatePO) {
return -1;
}
templatePO.setName(params.getShowname());
templatePO.setCreator(user.getUID());
templatePO.setCreateTime(new Date());
templatePO.setUpdateTime(new Date());
templatePO.setIsused("1");
// 将之前的模板,isused置为null
getHrmResourceMapper().updateCustomTemplateUsed(user.getUID());
getHrmResourceMapper().insertSearchTemplate(templatePO);
return templatePO.getId();
}
@Override
public void deleteSearchTemplate(Integer id) {
getHrmResourceMapper().deleteSearchTemplate(id, user.getUID());
}
@Override
public String getTemplateSelectKeys(Map params) {
String templateId = Util.null2String(params.get("templateId"));
templateId = StringUtils.isBlank(templateId) ? "-1" : templateId;
String type = Util.null2String(params.get("type"));
OrganizationAssert.isTrue(StringUtils.isNotBlank(templateId), SystemEnv.getHtmlLabelName(547440, user.getLanguage()));
// 判断是否为搜索模板
SearchTemplatePO searchTemplateById;
List selectKeys;
if ("custom".equals(type)) {
if ("-1".equals(templateId)) {
selectKeys = Arrays.asList("-1_hrm_lastname,-1_hrm_departmentid,-1_hrm_jobtitle,-1_hrm_mobile,-1_hrm_telephone,-1_hrm_managerid".split(","));
} else {
searchTemplateById = getHrmResourceMapper().getCustomTemplateById(templateId);
selectKeys = getSelectKeys(searchTemplateById);
}
} else {
if ("-1".equals(templateId)) {
selectKeys = getAllConditions().get(0).getItems().stream().map(item -> item.getDomkey()[0]).collect(Collectors.toList());
} else {
searchTemplateById = getHrmResourceMapper().getSearchTemplateById(templateId);
selectKeys = getSelectKeys(searchTemplateById);
}
}
return StringUtils.join(selectKeys, ",");
}
@Override
public Map getSearchTemplate(Map params) {
Map returnMap = new HashMap<>();
String type = Util.null2String(params.get("type"));
String id = Util.null2String(params.get("id"));
if ("".equals(id)) {
id = "-1";
}
int userUID = user.getUID();
// 根据ID查询所存储的模板
List templates;
boolean addDefault = true;
if ("custom".equals(type)) {
templates = getHrmResourceMapper().getCustomTemplatesByUser(userUID);
SearchTemplatePO overallCustomTemplate = getHrmResourceMapper().getOverallCustomTemplate();
if (null != overallCustomTemplate) {
if("-1".equals(id)) {
id = overallCustomTemplate.getId().toString();
}
templates.add(SearchTemplateParam.builder().key(overallCustomTemplate.getId().toString()).showname(overallCustomTemplate.getName()).build());
//}
addDefault = false;
}
returnMap.put("id", id);
} else {
templates = getHrmResourceMapper().getSearchTemplatesByUser(userUID);
}
if (addDefault) {
templates.add(0, SearchTemplateParam.builder().key("-1").showname("默认模板").build());
}
LinkedHashSet