package com.nanometer.smartlab.service;
|
|
import com.nanometer.smartlab.dao.BaseMetaDao;
|
import com.nanometer.smartlab.dao.SysWarehouseDao;
|
import com.nanometer.smartlab.entity.*;
|
import com.nanometer.smartlab.entity.dto.InWarehouseInfoDto;
|
import com.nanometer.smartlab.entity.dto.ReagentReceivingDto;
|
import com.nanometer.smartlab.entity.dto.SysWarehouseDto;
|
import com.nanometer.smartlab.entity.enumtype.*;
|
import com.nanometer.smartlab.exception.AlarmCode;
|
import com.nanometer.smartlab.exception.AlarmException;
|
import com.nanometer.smartlab.exception.BusinessException;
|
import com.nanometer.smartlab.exception.ExceptionEnumCode;
|
import com.nanometer.smartlab.util.IDUtils;
|
import com.nanometer.smartlab.util.MessageUtil;
|
import org.apache.commons.lang.StringUtils;
|
import org.apache.log4j.Logger;
|
import org.springframework.dao.DataAccessException;
|
import org.springframework.dao.DataIntegrityViolationException;
|
import org.springframework.dao.DuplicateKeyException;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Propagation;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
|
/**
|
* Created by cmower on 17/11/20.
|
*/
|
@Service("sysWarehouseService")
|
public class SysWarehouseServiceImpl implements SysWarehouseService {
|
|
private static Logger logger = Logger.getLogger(SysWarehouseService.class);
|
|
@Resource(name = "sysWarehouseDao")
|
SysWarehouseDao sysWarehouseDao;
|
@Resource
|
DangerousEncodeService dangerousEncodeService;
|
@Resource
|
BaseMetaService baseMetaService;
|
@Resource
|
BaseMetaDao baseMetaDao;
|
@Resource
|
SysReagentService sysReagentService;
|
@Resource
|
OpeReagentStatusService opeReagentStatusService;
|
@Resource
|
OpeUseFlowService opeUseFlowService;
|
@Resource
|
OpeWarehouseReserveService opeWarehouseReserveService;
|
|
@Transactional(propagation = Propagation.REQUIRED)
|
public List<SysWarehouse> getSysWarehouseList(String type, String name, Integer first, Integer pageSize) {
|
try {
|
Map<String, Object> params = new HashMap<String, Object>();
|
if (StringUtils.isNotBlank(type)) {
|
params.put("type", type);
|
}
|
if (StringUtils.isNotBlank(name)) {
|
params.put("name", "%" + name + "%");
|
}
|
params.put("first", first);
|
params.put("pageSize", pageSize);
|
return this.sysWarehouseDao.getSysWarehouseList(params);
|
} catch (DataAccessException e) {
|
logger.error(e.getMessage(), e);
|
throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), e);
|
}
|
}
|
@Transactional(propagation = Propagation.REQUIRED)
|
public int getSysWarehouseTotalCount(String type, String name) {
|
try {
|
Map<String, Object> params = new HashMap<String, Object>();
|
if (StringUtils.isNotBlank(type)) {
|
params.put("type", type);
|
}
|
if (StringUtils.isNotBlank(name)) {
|
params.put("name", "%" + name + "%");
|
}
|
return this.sysWarehouseDao.getSysWarehouseTotalCount(params);
|
} catch (DataAccessException e) {
|
logger.error(e.getMessage(), e);
|
throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), e);
|
}
|
}
|
|
@Transactional(propagation = Propagation.REQUIRED)
|
public SysWarehouse getSysWarehouse(String id) {
|
try {
|
return this.sysWarehouseDao.getSysWarehouse(id);
|
} catch (DataAccessException e) {
|
logger.error(e.getMessage(), e);
|
throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), e);
|
}
|
}
|
|
@Transactional(propagation = Propagation.REQUIRED)
|
public SysWarehouse insertSysWarehouse(SysWarehouse sysWarehouse) {
|
try {
|
if (sysWarehouse.getId() == null) {
|
sysWarehouse.setId(IDUtils.uuid());
|
}
|
this.sysWarehouseDao.insertSysWarehouse(sysWarehouse);
|
return sysWarehouse;
|
} catch (DuplicateKeyException ex) {
|
logger.warn(ex.getMessage(), ex);
|
throw new AlarmException(AlarmCode.DATA_DUPLICATE, MessageUtil.getMessage(AlarmCode.DATA_DUPLICATE.getCode()));
|
} catch (DataIntegrityViolationException ex) {
|
logger.warn(ex.getMessage(), ex);
|
throw new AlarmException(AlarmCode.DATA_CONFICT, MessageUtil.getMessage(AlarmCode.DATA_CONFICT.getCode()));
|
} catch (DataAccessException ex) {
|
logger.error(ex.getMessage(), ex);
|
throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), ex);
|
}
|
}
|
|
@Transactional(propagation = Propagation.REQUIRED)
|
public boolean updateSysWarehouse(SysWarehouse sysWarehouse) {
|
try {
|
int row = this.sysWarehouseDao.updateSysWarehouse(sysWarehouse);
|
|
if (row == 0) {
|
return false;
|
}
|
return true;
|
} catch (DuplicateKeyException ex) {
|
logger.warn(ex.getMessage(), ex);
|
throw new AlarmException(AlarmCode.DATA_DUPLICATE, MessageUtil.getMessage(AlarmCode.DATA_DUPLICATE.getCode()));
|
} catch (DataIntegrityViolationException ex) {
|
logger.warn(ex.getMessage(), ex);
|
throw new AlarmException(AlarmCode.DATA_CONFICT, MessageUtil.getMessage(AlarmCode.DATA_CONFICT.getCode()));
|
} catch (DataAccessException ex) {
|
logger.error(ex.getMessage(), ex);
|
throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), ex);
|
}
|
}
|
|
@Transactional(propagation = Propagation.REQUIRED)
|
public boolean deleteSysWarehouse(List<SysWarehouse> sysWarehouseList) {
|
try {
|
if (sysWarehouseList == null || sysWarehouseList.size() == 0) {
|
return false;
|
}
|
|
List<String> ids = new ArrayList<String>();
|
for (SysWarehouse sysWarehouse : sysWarehouseList) {
|
ids.add(sysWarehouse.getId());
|
}
|
|
int row = this.sysWarehouseDao.deleteSysWarehouses(ids);
|
if (row == 0) {
|
return false;
|
}
|
|
return true;
|
} catch (DataIntegrityViolationException ex) {
|
logger.warn(ex.getMessage(), ex);
|
throw new AlarmException(AlarmCode.DATA_CONFICT, MessageUtil.getMessage(AlarmCode.DATA_CONFICT.getCode()));
|
} catch (DataAccessException ex) {
|
logger.error(ex.getMessage(), ex);
|
throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), ex);
|
}
|
}
|
public List<SysWarehouse> getAllSysWarehouseList() {
|
return this.sysWarehouseDao.getAllSysWarehouseList();
|
}
|
|
@Transactional(propagation = Propagation.REQUIRED)
|
public boolean isSysWarehouseExist(String barCode, String editId) {
|
try {
|
Map<String, Object> params = new HashMap<String, Object>();
|
params.put("barCode", barCode);
|
params.put("editId", editId);
|
|
int count = this.sysWarehouseDao.getSysWarehouseTotalCount(params);
|
return count > 0;
|
} catch (DataAccessException e) {
|
logger.error(e.getMessage(), e);
|
throw new BusinessException(ExceptionEnumCode.DB_ERR, MessageUtil.getMessageByCode(ExceptionEnumCode.DB_ERR.getCode()), e);
|
}
|
}
|
|
@Override
|
public List<SysWarehouseDto> getWarehouseList() {
|
return sysWarehouseDao.selectWarehouse();
|
}
|
|
@Override
|
@Transactional
|
public void putInWarehouse(InWarehouseInfoDto inWarehouseInfo) throws Exception {
|
List<String> codes = inWarehouseInfo.getReagentCode();
|
if (codes !=null && codes.size()>0){
|
//
|
codes.forEach(code->{
|
//获取试剂名称码 5到8位
|
String reagentCode = code.substring(4, 8);
|
//获取厂商编码 第3位
|
String factoryCode = code.substring(2, 3);
|
//获取规格 第4位
|
String specificationsCode = code.substring(3, 4);
|
//获取包装 第19位
|
String packingCode = code.substring(18, 19);
|
|
//厂商
|
BaseMeta factory = baseMetaService
|
.getBaseMeta("encode_replace_"+ReplaceDictType.factory.getKey(), factoryCode,null);
|
//规格
|
BaseMeta specifications = baseMetaService
|
.getBaseMeta("encode_replace_"+ReplaceDictType.specifications.getKey(), specificationsCode,null);
|
//厂商信息
|
BaseMeta packing= baseMetaService
|
.getBaseMeta("encode_replace_"+ReplaceDictType.packing.getKey(), packingCode,null);
|
|
//Todo 校验
|
DangerousEncode dangerousEncode = new DangerousEncode();
|
//数据库存储的前缀00空着
|
dangerousEncode.setReagentCode("00"+reagentCode);
|
List<DangerousEncode> dangerousEncodes =
|
dangerousEncodeService.selectAll(dangerousEncode,null,null);
|
|
String reagentName = dangerousEncodes.get(0).getReagentName();
|
String cas = dangerousEncodes.get(0).getCas();
|
//查找是否存在试剂
|
List<SysReagent> reagent = sysReagentService
|
.getReagent(reagentName, cas, factory.getId(), specifications.getId(), packing.getId());
|
|
OpeReagentStatus ors = new OpeReagentStatus();
|
if (reagent != null &&reagent.size()>0){
|
//存在试剂
|
String reagentId = reagent.get(0).getId();
|
ors.setReagentId(reagentId);
|
|
}else{
|
//试剂不存在
|
SysReagent sr = new SysReagent();
|
sr.setId(IDUtils.uuid());
|
sr.setCas(cas);
|
sr.setName(reagentName);
|
sr.setProductHome(factory.getId());
|
sr.setReagentFormat(specifications.getId());
|
sr.setReagentUnit(packing.getId());
|
//设备生成试剂类型 为3
|
sr.setType(3);
|
sr.setDangerousFlag(DangerousFlag.NORMAL);
|
SysReagent sysReagent = sysReagentService.insertSysReagent(sr);
|
String reagentId = sysReagent.getId();
|
ors.setReagentId(reagentId);
|
}
|
|
ors.setId(IDUtils.uuid());
|
//入仓库
|
ors.setStatus(ArrivalStatus.WAREHOUSE);
|
//批号
|
ors.setArticleNumber(inWarehouseInfo.getArticleNumber());
|
ors.setValidFlag(ValidFlag.VALID);
|
ors.setContainerId(inWarehouseInfo.getContainerId());
|
ors.setHouseId(inWarehouseInfo.getWarehouseId());
|
ors.setUserId(inWarehouseInfo.getUser());
|
ors.setReagentCode(code);
|
opeReagentStatusService.insertOpeReagentStatus(ors);
|
|
//更新试剂流向
|
OpeUseFlow opeUseFlow = new OpeUseFlow();
|
//入仓库
|
opeUseFlow.setStatus(ArrivalStatus.WAREHOUSE);
|
opeUseFlow.setContainerId(inWarehouseInfo.getContainerId());
|
opeUseFlow.setHouseId(inWarehouseInfo.getWarehouseId());
|
opeUseFlow.setStoreType(StoreType.DIRECTSTORE);
|
opeUseFlow.setReagentCode(code);
|
//持有者
|
opeUseFlow.setUserId(inWarehouseInfo.getUser());
|
Map<String, String> metaMap = new HashMap<>();
|
metaMap.put("groupId", "operate_status");
|
metaMap.put("metaKey", String.valueOf(OperateStatus.WAREHOUSEIN.getKey()));
|
List<BaseMeta> baseMetaList = baseMetaDao.getBaseMetaList(metaMap);
|
opeUseFlow.setOperateState(baseMetaList.get(0).getId());
|
opeUseFlowService.insertOpeUseFlow(opeUseFlow);
|
|
//更新仓库库存
|
// 仓库库存update
|
OpeWarehouseReserve opeWarehouseReserve = opeWarehouseReserveService
|
.getOpeWarehouseReserve2(ors.getReagentId(), inWarehouseInfo.getArticleNumber(), inWarehouseInfo.getWarehouseId());
|
if (opeWarehouseReserve == null) {
|
opeWarehouseReserve = new OpeWarehouseReserve();
|
opeWarehouseReserve.setReagentId(ors.getReagentId());
|
opeWarehouseReserve.setArticleNumber(inWarehouseInfo.getArticleNumber());
|
opeWarehouseReserve.setReserve(0);
|
opeWarehouseReserve.setWarehouseId(inWarehouseInfo.getWarehouseId());
|
}
|
//库存加1
|
opeWarehouseReserve.setReserve(opeWarehouseReserve.getReserve() + 1);
|
if (StringUtils.isBlank(opeWarehouseReserve.getId())) {
|
this.opeWarehouseReserveService.insertOpeWarehouseReserve(opeWarehouseReserve);
|
} else {
|
this.opeWarehouseReserveService.updateOpeWarehouseReserve(opeWarehouseReserve);
|
}
|
|
});
|
}
|
|
}
|
|
@Override
|
@Transactional
|
public void reagentReceiving(ReagentReceivingDto reagentReceiving) {
|
|
reagentReceiving.getReagentCode().forEach(code->{
|
//
|
OpeReagentStatus ors = opeReagentStatusService.getOpeReagentStatusByReagentCode(code);
|
//1.更新试剂状态 在仓库-》领用
|
ors.setStatus(ArrivalStatus.PERSONAL);
|
ors.setContainerId(reagentReceiving.getLabContainerId());
|
ors.setHouseId(reagentReceiving.getLabId());
|
ors.setUserId(reagentReceiving.getApplyUserId());
|
opeReagentStatusService.updateReagentStatus(ors);
|
});
|
|
}
|
}
|