DoorManagerImpl.java
package com.mycim.server.carrier.manager.impl;
import com.fa.sesa.exception.Assert;
import com.fa.sesa.exception.Errors;
import com.fa.sesa.exception.SystemIllegalArgumentException;
import com.mycim.framework.utils.lang.StringUtils;
import com.mycim.framework.utils.lang.collections.MapUtils;
import com.mycim.server.base.manager.EventManager;
import com.mycim.server.base.manager.NamedObjectManager;
import com.mycim.server.base.manager.TransactionLogManager;
import com.mycim.server.carrier.dao.DoorDAO;
import com.mycim.server.carrier.manager.DoorManager;
import com.mycim.server.carrier.manager.PcdManager;
import com.mycim.server.ems.manager.EntityManager;
import com.mycim.server.status.manager.StatusManager;
import com.mycim.valueobject.MessageIdList;
import com.mycim.valueobject.ObjectList;
import com.mycim.valueobject.bas.NamedObject;
import com.mycim.valueobject.bas.TransactionLog;
import com.mycim.valueobject.consts.PcdStatus;
import com.mycim.valueobject.consts.TransactionNames;
import com.mycim.valueobject.ems.Door;
import com.mycim.valueobject.ems.PcdAssembly;
import com.mycim.valueobject.ems.PcdClean;
import com.mycim.valueobject.wip.TransReason;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author yanbing.chen
* @date 2019/8/23
* @since 1.8
**/
@Service
@Transactional
public class DoorManagerImpl implements DoorManager {
@Autowired
DoorDAO doorDAO;
@Autowired
TransactionLogManager transactionLogManager;
@Autowired
PcdManager pcdManager;
@Autowired
EventManager eventManager;
@Autowired
StatusManager statusManager;
@Autowired
NamedObjectManager namedObjectManager;
@Autowired
EntityManager entityManager;
@Override
public Door getDoor(long doorRrn) {
return doorDAO.getDoor(doorRrn);
}
@Override
public Map<String, Object> qrysDoorInfoDetailById(String doorId, String namedSpace) {
return doorDAO.qrysDoorInfoDetailById(doorId, namedSpace);
}
@Override
public void insertDoorH(Long doorRrn, String comments, Long transRrn) {
doorDAO.insertDoorH(doorRrn, comments, transRrn);
PcdClean cleanInfo = pcdManager.getPcdCleanInfo(doorRrn);
if (cleanInfo != null && StringUtils.isNotBlank(cleanInfo.getInstanceId())) {
pcdManager.insertPcdCleanH(transRrn, cleanInfo);
}
}
@Override
public void updateDoorByDeassembly(Long transRrn, Door door) {
doorDAO.updateDoorByDeassembly(transRrn, door);
}
@Override
public void holdDoor(Map transInfo) {
String transPerformedBy = MapUtils.getString(transInfo, "transPerformedBy");
long holdBy = MapUtils.getLong(transInfo, "holdBy");
NamedObject pcd = (NamedObject) transInfo.get("pcd");
long instanceRrn = pcd.getInstanceRrn();
long facilityRrn = MapUtils.getLong(transInfo, "facilityRrn");
TransReason transReason = (TransReason) transInfo.get("transReason");
PcdAssembly pcdAssembly = (PcdAssembly) transInfo.get("pcdAssembly");
TransactionLog transactionLog = transactionLogManager
.startTransactionLog(transPerformedBy, TransactionNames.HOLD_DOOR_KEY);
long transRrn = transactionLog.getTransRrn();
if (pcdAssembly == null) {
pcdAssembly = new PcdAssembly();
pcdAssembly.setDoorRrn(instanceRrn);
}
// step1: update pcd status and add history
Door door = getDoor(instanceRrn);
if (!StringUtils.equalsIgnoreCase(door.getDoorStatus(), PcdStatus.HOLD_KEY)) {
String podEventId = eventManager
.getEventIdBy2Status(facilityRrn, instanceRrn, door.getDoorStatus(), PcdStatus.HOLD_KEY);
statusManager
.changePCDStatusByEvent(facilityRrn, transPerformedBy, instanceRrn, ObjectList.DOOR_KEY, podEventId,
"Hold");
doorDAO.updateDoorStatus(pcdAssembly, transRrn, PcdStatus.HOLD_KEY, null);
}
// step2: insert into multiple_Hold
pcdManager.insertMultipleHold(instanceRrn, holdBy, transRrn);
// step3: insert into trans_reason
pcdManager.insertTransReason(transRrn, instanceRrn, transReason, 1);
transactionLogManager.markTransactionLog(transactionLog);
}
@Override
public void releaseDoor(Map transInfo) {
String transPerformedBy = MapUtils.getString(transInfo, "transPerformedBy");
List releaseReasons = (List) transInfo.get("releaseReasons");
NamedObject pcd = (NamedObject) transInfo.get("pcd");
long instanceRrn = pcd.getInstanceRrn();
String transNames = TransactionNames.RELEASE_DOOR_KEY;
TransReason transReason = (TransReason) transInfo.get("transReason");
String targetStatus = MapUtils.getString(transInfo, "targetStatus");
PcdAssembly pcdAssembly = (PcdAssembly) transInfo.get("pcdAssembly");
long facilityRrn = MapUtils.getLongValue(transInfo, "facilityRrn");
if (pcdAssembly == null) {
pcdAssembly = new PcdAssembly();
pcdAssembly.setDoorRrn(instanceRrn);
}
TransactionLog transactionLog = transactionLogManager.startTransactionLog(transPerformedBy, transNames);
// delete Multiple hold
Object[] releaseReasonArray = releaseReasons.toArray();
for (int i = 0; i < releaseReasonArray.length; i++) {
HashMap releaseReason = (HashMap) releaseReasonArray[i];
pcdManager.deleteMultipleHold(instanceRrn, Long.parseLong((String) releaseReason.get("sequenceNumber")));
}
if (!StringUtils.equalsIgnoreCase(targetStatus, PcdStatus.HOLD_KEY)) {
Door door = getDoor(instanceRrn);
String cstEventId = eventManager
.getEventIdBy2Status(facilityRrn, instanceRrn, door.getDoorStatus(), targetStatus);
statusManager
.changePCDStatusByEvent(facilityRrn, transPerformedBy, instanceRrn, ObjectList.DOOR_KEY, cstEventId,
"Hold");
doorDAO.updateDoorStatus(pcdAssembly, transactionLog.getTransRrn(), targetStatus, null);
}
transReason.setReasonCategory(transNames);
pcdManager.insertTransReason(transactionLog.getTransRrn(), instanceRrn, transReason, 1);
transactionLogManager.markTransactionLog(transactionLog);
}
@Override
public Map<String, Object> getDoorInfoDetailById(String doorId, String namedSpace) {
Map<String, Object> dataMap = doorDAO.qrysDoorInfoDetailById(doorId, namedSpace);
PcdAssembly pcdAssembly = pcdManager.getPcdAssembly(null, null, MapUtils.getLong(dataMap, "doorRrn"));
if (pcdAssembly != null) {
dataMap.put("carrierId", pcdAssembly.getCarrierId());
dataMap.put("podId", pcdAssembly.getPodId());
if (pcdManager.isPcdCleaningTimeIsLessThan3Days(pcdAssembly.getCarrierRrn())) {
dataMap.put("carrierCleanRedFlag", "1");
}
if (pcdManager.isPcdCleaningTimeIsLessThan3Days(pcdAssembly.getPodRrn())) {
dataMap.put("podCleanRedFlag", "1");
}
}
if (pcdManager.isPcdCleaningTimeIsLessThan3Days(MapUtils.getLong(dataMap, "doorRrn"))) {
dataMap.put("doorCleanRedFlag", "1");
}
return dataMap;
}
@Override
public Map<String, Object> qryDoorListByPage(Map<String, Object> argMap) {
int pageSize = 20;
int startRow = 0;
int currentTotalRow = 10;
if (MapUtils.isNotEmpty(argMap) && MapUtils.getInteger(argMap, "startRow") != null) {
startRow = MapUtils.getInteger(argMap, "startRow");
currentTotalRow = startRow + pageSize;
}
if (MapUtils.getLong(argMap, "facility") > 0) {
argMap.put("namedSpace",
namedObjectManager.getNamedSpace(MapUtils.getLong(argMap, "facility"), ObjectList.ENTITY_KEY));
}
if (StringUtils.isNotBlank(MapUtils.getString(argMap, "doorId"))) {
argMap.put("doorId",
StringUtils.replace(MapUtils.getString(argMap, "doorId"), "*", "%").toString().toUpperCase());
}
// 查询数据集和数据总量
int totalCount = doorDAO.getDoorTotalCount(argMap);
List<Map> eqptInfoList = doorDAO.getDoorListByPage(argMap, startRow, currentTotalRow);
for (Map dataMap : eqptInfoList) {
// 替换location
String location = MapUtils.getString(dataMap, "location");
if (StringUtils.isNotBlank(location) && StringUtils.equalsIgnoreCase("$EQPT_LOCATION", location)) {
dataMap.put("location", "");
}
PcdAssembly pcdAssembly = pcdManager.getPcdAssembly(null, null, MapUtils.getLong(dataMap, "doorRrn"));
if (pcdAssembly != null) {
dataMap.put("carrierId", pcdAssembly.getCarrierId());
dataMap.put("podId", pcdAssembly.getPodId());
if (pcdManager.isPcdCleaningTimeIsLessThan3Days(pcdAssembly.getCarrierRrn())) {
dataMap.put("carrierCleanRedFlag", "1");
}
if (pcdManager.isPcdCleaningTimeIsLessThan3Days(pcdAssembly.getPodRrn())) {
dataMap.put("podCleanRedFlag", "1");
}
}
if (pcdManager.isPcdCleaningTimeIsLessThan3Days(MapUtils.getLong(dataMap, "doorRrn"))) {
dataMap.put("doorCleanRedFlag", "1");
}
}
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("data", eqptInfoList);
dataMap.put("totalCount", totalCount);
return dataMap;
}
@Override
public void deleteDoorEntity(String doorId, Long facilityRrn, String user) {
String namedSpace = namedObjectManager.getNamedSpace(facilityRrn, ObjectList.ENTITY_KEY);
long doorRrn = namedObjectManager
.getNamedObjectRrn(doorId, namedSpace, ObjectList.ENTITY_KEY, ObjectList.DOOR_KEY);
Assert.isFalse(doorRrn <= 0,
Errors.create().key(MessageIdList.DOOR_DOOR_ID_MISSING).content("Door号不存在!").build());
// Door存在,检查Door当前信息,判断是否可以删除
Door door = this.getDoor(doorRrn);
// 目前判断不是FREE状态不能删除
if (StringUtils.equalsIgnoreCase(PcdStatus.FREE_KEY, door.getDoorStatus())) {
// 删除Door
door.setTransId("DELETE");
door.setDoorStatus(PcdStatus.DELETED_KEY);
door.setTransPerformedby(user);
deleteDoor(door);
} else {
Assert.isFalse(StringUtils.equalsIgnoreCase(PcdStatus.HOLD_KEY, door.getDoorStatus()),
Errors.create().key(MessageIdList.DOOR_IN_HOLD_STATUS).content("Door在hold 状态,不能删除!")
.build());
throw new SystemIllegalArgumentException(
Errors.create().key(MessageIdList.DOOR_IN_USE_CANNOT_DELETE).content("Door正在使用中,不能删除!").build());
}
}
@Override
public void updateDoorEntity(Map<String, Object> attrMap, Long facilityRrn, String user) {
String allowableEventId = MapUtils.getString(attrMap, "doorAllowableEvent").toUpperCase().trim();
String engineerGroupId = MapUtils.getString(attrMap, "doorEngineerGroupID").toUpperCase().trim();
long allowableEventRrn = namedObjectManager.getNamedObjectRrn(allowableEventId, namedObjectManager
.getNamedSpace(facilityRrn,
ObjectList.ALLOWABLEEVENTSET_KEY), ObjectList.ALLOWABLEEVENTSET_KEY,
ObjectList.DOOR_KEY);
long engineerGroupRrn = namedObjectManager.getNamedObjectRrn(engineerGroupId, namedObjectManager
.getNamedSpace(facilityRrn, ObjectList.USERGROUP_KEY), ObjectList.USERGROUP_KEY);
Assert.isFalse(allowableEventRrn <= 0,
Errors.create().key(MessageIdList.CARRIER_ALLOWABLE_EVENT_EMPTY).content("允许事件集号不能为空!").build());
Assert.isFalse(StringUtils.isNotBlank(engineerGroupId) && engineerGroupRrn <= 0,
Errors.create().key(MessageIdList.ENGINEERGROUP_ENGINEER_GROUP_MISSING).content("工程师组无效!")
.build());
Long doorRrn = MapUtils.getLong(attrMap, "doorRrn");
Door door = getDoor(doorRrn);
door.setAllowableEventsId(allowableEventId);
door.setAllowableEventsRrn(allowableEventRrn);
door.setCarrierCode(MapUtils.getString(attrMap, "doorColor"));
door.setInstanceDesc(MapUtils.getString(attrMap, "doorDesc"));
door.setPollutionLevel(MapUtils.getString(attrMap, "doorPollutionLevel"));
door.setTransId(TransactionNames.MODIFY_KEY);
door.setTransPerformedby(user);
door.setObjectSubtype(MapUtils.getString(attrMap, "doorType"));
door.setMaintenanceEngineerId(engineerGroupId);
door.setMaintenanceEngineerRrn(engineerGroupRrn);
door.setFlagType(MapUtils.getString(attrMap, "doorCategory"));
TransactionLog transactionLog = transactionLogManager.startTransactionLog(user, door.getTransId());
long transRrn = transactionLog.getTransRrn();
if (pcdManager.countPcdCategoryByRrn(door.getInstanceRrn()) > 0) {
// 已经存在数据
pcdManager.updatePcdNamedObjectExt(door.getInstanceRrn(), door.getFlagType());
} else {
pcdManager.insertPcdNamedObjectExt(door.getInstanceRrn(), door.getFlagType(), door.getDmmType());
}
doorDAO.updateDoor(door, transRrn);
PcdClean doorCleanInfo = new PcdClean();
doorCleanInfo.setInstanceRrn(door.getInstanceRrn());
doorCleanInfo.setInstanceId(door.getInstanceId());
doorCleanInfo.setCleanCycle(MapUtils.getDoubleValue(attrMap, "doorCleanCycle"));
doorCleanInfo.setNamedSpace(namedObjectManager.getNamedSpace(facilityRrn, ObjectList.ENTITY_KEY));
pcdManager.updatePcdCleanInfo(transRrn, doorCleanInfo);
// insert into Transaction Log
transactionLogManager.markTransactionLog(transactionLog);
}
@Override
public void addDoorEntity(Map<String, Object> attrMap, Long facilityRrn, String user) {
String allowableEventId = MapUtils.getString(attrMap, "doorAllowableEvent").toUpperCase().trim();
String engineerGroupId = MapUtils.getString(attrMap, "doorEngineerGroupID").toUpperCase().trim();
long allowableEventRrn = namedObjectManager.getNamedObjectRrn(allowableEventId, namedObjectManager
.getNamedSpace(facilityRrn,
ObjectList.ALLOWABLEEVENTSET_KEY),
ObjectList.ALLOWABLEEVENTSET_KEY.toString());
long engineerGroupRrn = namedObjectManager.getNamedObjectRrn(engineerGroupId, namedObjectManager
.getNamedSpace(facilityRrn, ObjectList.USERGROUP_KEY), ObjectList.USERGROUP_KEY);
Assert.isFalse(allowableEventRrn <= 0,
Errors.create().key(MessageIdList.CARRIER_ALLOWABLE_EVENT_EMPTY).content("允许事件集号不能为空!").build());
Assert.isFalse(StringUtils.isNotBlank(engineerGroupId) && engineerGroupRrn <= 0,
Errors.create().key(MessageIdList.ENGINEERGROUP_ENGINEER_GROUP_MISSING).content("工程师组无效!")
.build());
Door door = new Door();
door.setAllowableEventsId(allowableEventId);
door.setAllowableEventsRrn(allowableEventRrn);
door.setCarrierCode(MapUtils.getString(attrMap, "doorColor"));
door.setInstanceId(MapUtils.getString(attrMap, "doorId").toUpperCase().trim());
door.setInstanceDesc(MapUtils.getString(attrMap, "doorDesc"));
door.setInstanceStatus("ACTIVE");
door.setNamedSpace(namedObjectManager.getNamedSpace(facilityRrn, ObjectList.ENTITY_KEY));
door.setObject(ObjectList.ENTITY_KEY);
door.setObjectType(ObjectList.DOOR_KEY);
door.setPollutionLevel(MapUtils.getString(attrMap, "doorPollutionLevel"));
door.setDoorStatus(PcdStatus.FREE_KEY);
door.setTransId(TransactionNames.CREATE_KEY);
door.setTransPerformedby(user);
door.setObjectSubtype(MapUtils.getString(attrMap, "doorType"));
door.setMaintenanceEngineerId(engineerGroupId);
door.setMaintenanceEngineerRrn(engineerGroupRrn);
door.setFlagType(MapUtils.getString(attrMap, "doorCategory"));
door.setCleanCycle(MapUtils.getDoubleValue(attrMap, "doorCleanCycle"));
insertDoor(door, facilityRrn);
}
@Override
public void deleteDoor(Door door) {
// get the transaction log
TransactionLog transactionLog = transactionLogManager
.startTransactionLog(door.getTransPerformedby(), door.getTransId());
// delete the named object.
long transRrn = transactionLog.getTransRrn();
doorDAO.deleteDoor(door, transRrn);
entityManager.deleteEntityOnly(door.getInstanceRrn());
entityManager.deleteEntityConstraints(door.getInstanceRrn());
long instanceRrn = namedObjectManager.deleteNamedObject(door, transRrn);
pcdManager.deletePcdCleanInfo(door.getInstanceRrn(), transRrn);
// insert into Transaction Log
transactionLogManager.markTransactionLog(transactionLog);
}
@Override
public long insertDoor(Door door, Long facilityRrn) {
long instanceRrn = 0;
TransactionLog transactionLog = transactionLogManager
.startTransactionLog(door.getTransPerformedby(), door.getTransId());
instanceRrn = namedObjectManager.insertNamedObject(door, transactionLog.getTransRrn());
door.setInstanceRrn(instanceRrn);
// main or history table handle
pcdManager.insertPcdNamedObjectExt(door.getInstanceRrn(), door.getFlagType(), door.getDmmType());
entityManager.insertParentEntity(door, transactionLog.getTransRrn(), instanceRrn);
entityManager.insertEntityHistory(door, transactionLog.getTransRrn(), instanceRrn);
doorDAO.insertDoor(door, transactionLog.getTransRrn());
pcdManager
.addPcdCleanInfo(door.getInstanceRrn(), transactionLog.getTransRrn(), facilityRrn, ObjectList.DOOR_KEY,
door.getCleanCycle());
// mark transaction end flag
transactionLogManager.markTransactionLog(transactionLog);
return instanceRrn;
}
@Override
public List<Map> getAllDoor(Map<String, Object> getAllDoorMap) {
return doorDAO.getDoorListByPage(getAllDoorMap, 0, Integer.MAX_VALUE);
}
}