SorterQueryManagerImpl.java
package com.mycim.server.sorter.manager.imp;
import com.fa.sesa.threadlocal.LocalContext;
import com.mycim.framework.jdbc.Page;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.CollectionUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.framework.utils.lang.math.NumberUtils;
import com.mycim.framework.utils.msg.JsonUtils;
import com.mycim.server.base.manager.NamedObjectManager;
import com.mycim.server.base.manager.RelationManager;
import com.mycim.server.carrier.manager.CarrierManager;
import com.mycim.server.security.manager.RoleManager;
import com.mycim.server.sorter.dao.SorterQueryDAO;
import com.mycim.server.sorter.manager.SorterQueryManager;
import com.mycim.server.spec.manager.ProcessSpecItemManager;
import com.mycim.server.system.manager.ReferenceFileManager;
import com.mycim.server.wip.manager.*;
import com.mycim.valueobject.bas.Relation;
import com.mycim.valueobject.consts.LinkTypeList;
import com.mycim.valueobject.consts.SorterEnum;
import com.mycim.valueobject.runcard.util.RunCardUtils;
import com.mycim.valueobject.sorter.*;
import com.mycim.valueobject.wip.Lot;
import com.mycim.valueobject.wip.LotRunCardStore;
import com.mycim.valueobject.wip.SRCLotSpecialStep;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Author: yibing.liu
* @Date: 2021/7/16 10:51
*/
@Service
public class SorterQueryManagerImpl implements SorterQueryManager {
@Autowired
SorterQueryDAO sorterDAO;
@Autowired
NamedObjectManager namedObjectManager;
@Autowired
LotManager lotManager;
@Autowired
LotQueryManager lotQueryManager;
@Autowired
UnitQueryManager unitQueryManager;
@Autowired
CarrierManager carrierManager;
@Autowired
JobManager jobManager;
@Autowired
ReferenceFileManager referenceFileManager;
@Autowired
ProcessSpecItemManager processSpecItemManager;
@Autowired
SorterQueryDAO sorterQueryDAO;
@Autowired
RoleManager roleManager;
@Autowired
RelationManager relationManager;
@Autowired
RunCardQueryManager runCardQueryManager;
@Override
public Page querySorterList(Page page, SorterBean sorterBean) {
boolean hasPromission = false;
List<Relation> userRole = relationManager.getRelationsUseFromRrn(LocalContext.getUserRrn(), LinkTypeList.USER_ROLE_KEY);
List<Relation> userGroupRole = relationManager.getRelationsUseFromRrn(LocalContext.getUserRrn(), LinkTypeList.USER_USERGROUP_KEY);
if(roleManager.isAdminRole(LocalContext.getFacilityRrn(), LocalContext.getUserRrn())){
hasPromission = true;
}else{
//by user role
if (CollectionUtils.isNotEmpty(userRole)&&!hasPromission) {
List<Long> roles = userRole.stream().map(Relation::getToRrn).collect(Collectors.toList());
Map button = CollectionUtils.isEmpty(roles)? MapUtils.EMPTY_MAP:roleManager.getButtonInfoWithRoles(roles,"BTN_VIEW_INLINE_SORTER");
if(MapUtils.isNotEmpty(button)){
hasPromission = true;
}
}
//by user group role
if(CollectionUtils.isNotEmpty(userGroupRole)&&!hasPromission){
List<Relation> gourpRoles = null;
for (Relation userGroup : userGroupRole){
gourpRoles = relationManager.getRelationsUseFromRrn(userGroup.getToRrn(), LinkTypeList.USERGROUP_ROLE_KEY);
List<Long> roleRrns = gourpRoles.stream().map(Relation::getToRrn).collect(Collectors.toList());
Map button = CollectionUtils.isEmpty(roleRrns)? MapUtils.EMPTY_MAP:roleManager.getButtonInfoWithRoles(roleRrns,"BTN_VIEW_INLINE_SORTER");
if(MapUtils.isNotEmpty(button)){
hasPromission = true;
break;
}
};
}
}
if(hasPromission){
return sorterDAO.queryAllSorterList(page,sorterBean);
}
return sorterDAO.querySorterList(page, sorterBean);
}
@Override
public List<SortJobBean> querySortJobByCarrierRrn(long sourceCarrierRrn, long targetCarrierRrn) {
List<SortJobBean> sortJobBeanList = new ArrayList<>();
//源晶舟和目标晶舟可确认唯一SortJob
if (sourceCarrierRrn > 0 && targetCarrierRrn > 0) {
SorterBean sorterBean = new SorterBean();
sorterBean.setSourceCarrierRrn(sourceCarrierRrn);
sorterBean.setTargetCarrierRrn(targetCarrierRrn);
SortJobBean sjb = sorterDAO.getSortJob(sorterBean);
sortJobBeanList.add(sjb);
return sortJobBeanList;
}
//单独查询目标晶舟,存在多个SortJob的情况,例如:Merge
if (targetCarrierRrn > 0) {
sortJobBeanList = sorterDAO.getSortJobByCarrierRrn(targetCarrierRrn);
}
return sortJobBeanList;
}
@Override
public SortJobBean querySortJobByCarrierRrn(long carrierRrn) {
SortJobBean sortJobBean = new SortJobBean();
long mainJobRrn = sorterDAO.querySorterJobRrnByCarrierRrn(carrierRrn, new StatusBean());
if (mainJobRrn > 0) {
sortJobBean = dealSorterData(mainJobRrn);
}
return sortJobBean;
}
@Override
public SortJobBean querySortJobBySourceCarrierRrn(long sourceCarrierRrn) {
SortJobBean sortJobBean = new SortJobBean();
long mainJobRrn = sorterDAO.querySorterJobRrnBySourceCarrierRrn(sourceCarrierRrn);
if (mainJobRrn > 0) {
sortJobBean = dealSorterData(mainJobRrn);
}
return sortJobBean;
}
@Override
public SorterBean getSorterByCarrier(String carrierId) {
return sorterDAO.getSorterByCarrier(carrierId);
}
@Override
public List<SorterBean> getSorterList(SorterBean sorterBean) {
return sorterDAO.getSorterList(sorterBean);
}
@Override
public SortJobBean getSortJob(SorterBean sortBean) {
return sorterDAO.getSortJob(sortBean);
}
@Override
public SortJobBean getSortJob(SortJobBean sortJobBean) {
return sorterDAO.getSortJob(sortJobBean);
}
@Override
public String[] getChildLotIdListByLotId(String lotId) {
String[] childLotIdArr;
List<String> childLotIds = sorterDAO.getChildLotIdListByLotId(lotId);
if (CollectionUtils.isNotEmpty(childLotIds)) {
String maxChildLotId = SorterEnum.getListFirst(childLotIds);
int maxChildLotNum =
NumberUtils.toInt(StringUtils.substring(maxChildLotId, maxChildLotId.indexOf(".") + 1)) + 1;
childLotIdArr = new String[maxChildLotNum];
for (String str : childLotIds) {
childLotIdArr[NumberUtils.toInt(StringUtils.substring(str, str.indexOf(".") + 1)) - 1] = str;
}
} else {
childLotIdArr = new String[0];
}
return childLotIdArr;
}
@Override
public List<String> getChildLotInSortTask(long lotRrn, Long carrierRrn) {
return sorterDAO.getSourceLotIdByTargetCarrier(carrierRrn, SorterEnum.JobType.MERGE.getJobType());
}
@Override
public List<SorterBean> querySorterByCarrier(long sourceCarrierRrn, long targetCarrierRrn) {
return sorterDAO.querySorterByCarriers(sourceCarrierRrn, targetCarrierRrn);
}
@Override
public List<SorterBean> getSoterListByCarrier(Long sourceCarrierRrn) {
return sorterDAO.getSoterListByCarrier(sourceCarrierRrn);
}
@Override
public List<SorterBean> getSoterListByCarrier(Long sourceCarrierRrn, Long targetCarrierRrn) {
return sorterDAO.getSoterListByCarrier(sourceCarrierRrn, targetCarrierRrn);
}
@Override
public List<SorterBean> getJobTypeOrStatusList(String type, String language) {
return sorterDAO.getJobTypeOrStatusList(type, language);
}
@Override
public SortJobBean getSortJobByJobRrnAndStatus(Long jobRrn, Long subJobRrn, StatusBean status) {
return sorterDAO.getSortJobByStatus(jobRrn, subJobRrn, status);
}
@Override
public SorterDetailBean querySorterByLotRrn(Long lotRrn) {
return sorterDAO.getSorterByLotRrn(lotRrn);
}
@Override
public SortJobBean getSortJobByCarrier(Long sourceCarrierRrn, Long targetCarrierRrn, Long targetCarrierRrn2) {
SortJobBean sjb = new SortJobBean();
if (targetCarrierRrn <= 0) {//只需根据SourceCarrierRRN去查询
sjb = querySortJobByCarrierRrn(sourceCarrierRrn);
} else {
if (!sjb.isEmpty()) {
sjb = querySortJobBySourceAndTargetCarrierRrn(sourceCarrierRrn, targetCarrierRrn);
}
if (!sjb.isEmpty() && targetCarrierRrn2 != null && targetCarrierRrn2 > 0) {
sjb = querySortJobByCarrierRrn(targetCarrierRrn2);
}
}
return sjb;
}
@Override
public List<SorterBean> getAllSortJobBySourceCarrierRrn(long carrierRrn) {
return sorterDAO.getAllSortJobBySourceCarrierRrn(carrierRrn, new StatusBean());
}
@Override
public List<SortJobBean> getSortJobListByCarrier(long carrierRrn) {
List<SortJobBean> sortJobList = new ArrayList<>();
List<String> mainJobRrnList = sorterDAO.querySorterJobRrnListByCarrierRrn(carrierRrn);
if (CollectionUtils.isNotEmpty(mainJobRrnList)) {
for (String mainJobStr : mainJobRrnList) {
SortJobBean sortJobBean = getSortJob(new SortJobBean(NumberUtils.toLong(mainJobStr, 0L)));
List<SorterBean> sorterBeans = sortJobBean.getSorterBeans();
SorterBean sb1 = SorterEnum.getListFirst(sorterBeans);
sortJobBean.setSourceCarrierId(sb1.getSourceCarrierId());
sortJobBean.setTargetCarrierId(sb1.getTargetCarrierId());
if (sorterBeans.size() > 1) {
sortJobBean.setTargetCarrierId2(sorterBeans.get(1).getTargetCarrierId());
}
sortJobBean.setJobType(sb1.getJobType());
sortJobBean.setStatus(sb1.getStatus());
sortJobList.add(sortJobBean);
}
}
return sortJobList;
}
@Override
public <T> T parseToJsonT(List<?> unitList, FilterParam filterParam) {
if (unitList == null || filterParam == null) {
return null;
}
Map[] unitMapArr = new Map[filterParam.getSlotCount()];
List<FilterParam.Column> strStrList = filterParam.getColumnArrayList();
for (Map unit : (List<Map<String, Object>>) unitList) {
int seq = MapUtils.getIntValue(unit, filterParam.getIntegerColumn());
if (seq <= 0)
continue;
Map<String, Object> unitMap = new HashMap<>();
unitMap.put(filterParam.getSeqColumn(), seq);
for (FilterParam.Column c : strStrList) {
unitMap.put(c.getMatchColumn(), unit.get(c.getActualColumn()));
}
if (filterParam.isFilter()) {
unitMap.put(filterParam.getKeyColumn(), filterParam.canMark(unit, filterParam.getMark()));
}
unitMapArr[seq - 1] = unitMap;
}
if (filterParam.isFillBlank()) {
for (int i = 0; i < filterParam.getSlotCount(); i++) {
if (unitMapArr[i] == null) {
Map<String, Object> unitMap = new HashMap<>();
unitMap.put(filterParam.getSeqColumn(), i + 1);
for (FilterParam.Column c : strStrList) {
unitMap.put(c.getMatchColumn(), StringUtils.EMPTY);
}
unitMapArr[i] = unitMap;
}
}
}
List list = Arrays.stream(unitMapArr).filter(Objects::nonNull).collect(Collectors.toList());
if (String.class.isAssignableFrom(filterParam.getOutType())) {
return (T) JsonUtils.toString(list);
} else if (List.class.isAssignableFrom(filterParam.getOutType())) {
return (T) list;
} else {
return null;
}
}
private SortJobBean querySortJobBySourceAndTargetCarrierRrn(long sourceCarrierRrn, long targetCarrierRrn) {
SortJobBean sortJobBean = new SortJobBean();
//目前的业务存储能够通过sourceCarrierRrn和targetCarrierRrn确定一个唯一的SorterJob
long mainJobRrn = sorterDAO.querySorterJobRrnBySourceAndTargetCarrierRrn(sourceCarrierRrn, targetCarrierRrn);
if (mainJobRrn > 0) {
sortJobBean = dealSorterData(mainJobRrn);
}
return sortJobBean;
}
private SortJobBean dealSorterData(long mainJobRrn) {
SortJobBean sortJobBean = getSortJob(new SortJobBean(mainJobRrn));
List<SorterBean> sorterBeans = sortJobBean.getSorterBeans();
SorterBean sb1 = SorterEnum.getListFirst(sorterBeans);
sortJobBean.setSourceCarrierId(sb1.getSourceCarrierId());
sortJobBean.setTargetCarrierId(sb1.getTargetCarrierId());
if (sorterBeans.size() > 1) {
sortJobBean.setTargetCarrierId2(sorterBeans.get(1).getTargetCarrierId());
}
sortJobBean.setJobType(sb1.getJobType());
sortJobBean.setStatus(sb1.getStatus());
sortJobBean.setSorterBeans(sorterBeans);
return sortJobBean;
}
@Override
public String getFlipTypeByLot(Lot lot) {
String flipType = StringUtils.EMPTY;
if (RunCardUtils.checkLotIdIsRunCardLot(lot.getLotId())) {
LotRunCardStore lotStore = runCardQueryManager.getSplitRunCardLotStore(lot.getLotRrn());
Long lotSpecialStepRrn = lotStore.getLotSpecialStepRrn();
SRCLotSpecialStep lotSpecialStep = runCardQueryManager
.getLotSplitRunCardSpecialStep(lotSpecialStepRrn, lotStore.getStepSequence());
flipType = lotSpecialStep.getFlipType();
} else {
flipType = processSpecItemManager.getFlipType(lot.getProcessRrn(), lot.getProcessVersion(), lot.getRouteRrn(),
lot.getOperationRrn());
}
return flipType;
}
@Override
public List<SorterCarrierMap> getSorterCarrierMapList(Long subJobRrn) {
return sorterQueryDAO.getSorterCarrierMapList(subJobRrn);
}
}