package com.ycsoft.business.component.resource;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.google.gson.reflect.TypeToken;
import com.ycsoft.beans.config.TBusiFeeDevice;
import com.ycsoft.beans.config.TDeviceBuyMode;
import com.ycsoft.beans.core.cust.CCustDevice;
import com.ycsoft.beans.core.fee.CFeeDevice;
import com.ycsoft.beans.core.valuable.CValuableCard;
import com.ycsoft.beans.core.valuable.CValuableCardFee;
import com.ycsoft.beans.core.valuable.CValuableCardHis;
import com.ycsoft.beans.depot.RDepotDefine;
import com.ycsoft.beans.device.RCard;
import com.ycsoft.beans.device.RDevice;
import com.ycsoft.beans.device.RDeviceFee;
import com.ycsoft.beans.device.RDeviceModel;
import com.ycsoft.beans.device.RDeviceReclaim;
import com.ycsoft.beans.device.RDeviceUseRecords;
import com.ycsoft.beans.device.RModem;
import com.ycsoft.beans.device.RStb;
import com.ycsoft.beans.device.RStbModel;
import com.ycsoft.beans.system.SDept;
import com.ycsoft.beans.system.SOptr;
import com.ycsoft.business.commons.abstracts.BaseBusiComponent;
import com.ycsoft.business.dao.config.TBusiFeeDeviceDao;
import com.ycsoft.business.dao.config.TDeviceBuyModeDao;
import com.ycsoft.business.dao.core.cust.CCustDeviceDao;
import com.ycsoft.business.dao.core.cust.CCustDeviceHisDao;
import com.ycsoft.business.dao.core.valuable.CValuableCardDao;
import com.ycsoft.business.dao.core.valuable.CValuableCardFeeDao;
import com.ycsoft.business.dao.core.valuable.CValuableCardHisDao;
import com.ycsoft.business.dao.resource.device.RCardDao;
import com.ycsoft.business.dao.resource.device.RCardModelDao;
import com.ycsoft.business.dao.resource.device.RDepotDefineDao;
import com.ycsoft.business.dao.resource.device.RDeviceChangeDao;
import com.ycsoft.business.dao.resource.device.RDeviceDao;
import com.ycsoft.business.dao.resource.device.RDeviceFeeDao;
import com.ycsoft.business.dao.resource.device.RDeviceModelDao;
import com.ycsoft.business.dao.resource.device.RDeviceReclaimDao;
import com.ycsoft.business.dao.resource.device.RDeviceUseRecordsDao;
import com.ycsoft.business.dao.resource.device.RModemDao;
import com.ycsoft.business.dao.resource.device.RModemModelDao;
import com.ycsoft.business.dao.resource.device.RPairCfgDao;
import com.ycsoft.business.dao.resource.device.RStbDao;
import com.ycsoft.business.dao.resource.device.RStbModelDao;
import com.ycsoft.business.dao.system.SDeptDao;
import com.ycsoft.business.dto.config.TemplateConfigDto;
import com.ycsoft.business.dto.device.DeviceDto;
import com.ycsoft.business.dto.device.DeviceSmallDto;
import com.ycsoft.business.dto.device.ValuableCardDto;
import com.ycsoft.commons.constants.DataRight;
import com.ycsoft.commons.constants.StatusConstants;
import com.ycsoft.commons.constants.SystemConstants;
import com.ycsoft.commons.exception.ComponentException;
import com.ycsoft.commons.exception.ErrorCode;
import com.ycsoft.commons.exception.ServicesException;
import com.ycsoft.commons.helper.CollectionHelper;
import com.ycsoft.commons.helper.DateHelper;
import com.ycsoft.commons.helper.JsonHelper;
import com.ycsoft.commons.helper.StringHelper;
import com.ycsoft.commons.store.MemoryDict;
import com.ycsoft.daos.core.JDBCException;
import com.ycsoft.daos.core.Pager;
import com.ycsoft.sysmanager.dto.resource.RDeviceModelTotalDto;
/**
* 设备组件
*
* @author YC-SOFT
*
*/
@Component
public class DeviceComponent extends BaseBusiComponent {
private RDeviceChangeDao rDeviceChangeDao;
private RDeviceDao rDeviceDao;
private RStbDao rStbDao;
private RCardDao rCardDao;
private RModemDao rModemDao;
private RStbModelDao rStbModelDao;
private RCardModelDao rCardModelDao;
private RModemModelDao rModemModelDao;
private RDeviceFeeDao rDeviceFeeDao;
private RDepotDefineDao rDepotDefineDao;
private TDeviceBuyModeDao tDeviceBuyModeDao;
private SDeptDao sDeptDao;
private CValuableCardDao cValuableCardDao;
private CValuableCardHisDao cValuableCardHisDao;
private CValuableCardFeeDao cValuableCardFeeDao;
private RDeviceReclaimDao rDeviceReclaimDao;
private RPairCfgDao rPairCfgDao;
private RDeviceUseRecordsDao rDeviceUseRecordsDao;
private TBusiFeeDeviceDao tBusiFeeDeviceDao;
private CCustDeviceDao cCustDeviceDao;
private RDeviceModelDao rDeviceModelDao;
@Autowired
private CCustDeviceHisDao cCustDeviceHisDao;
/**
* 根据设备编号查询设备及客户信息
* @param deviceCode
* @return
* @throws Exception
*/
public com.ycsoft.sysmanager.dto.resource.DeviceDto queryDeviceInfoByCode(String deviceCode)
throws Exception {
return rDeviceDao.queryDeviceInfoByCode(deviceCode);
}
public DeviceDto queryDeviceInfoByCodeAndModel(String deviceCode,String models ) throws Exception {
if(StringHelper.isEmpty(models)){
throw new ComponentException(ErrorCode.TaskDeviceModelIsNull);
}
DeviceDto dto = rDeviceDao.queryDeviceInfoByCodeAndModel(deviceCode);
isDeviceSaleable(dto);
// String[] modesArr = models.split(",");
// boolean isModel = false;
// for(int i=0;i<modesArr.length;i++){
// if(modesArr[i].equals(dto.getDevice_model())){
// isModel = true;
// break;
// }
// }
// if(!models.equals(dto.getDevice_model())){
// throw new ComponentException(ErrorCode.TaskDeviceModelIsWrong,dto.getDevice_model_text());
// }
return dto;
}
/**
* 修改设备的仓库状态
* @param doneCode 业务流水
* @param busiCode 业务代码
* @param deviceId 设备id
* @param status 修改的仓库状态
*/
public void updateDeviceDepotStatus(Integer doneCode, String busiCode,
String deviceId, String oldValue,String newValue,String buyMode,boolean key) throws Exception {
if (!oldValue.equals(newValue)){
RDevice rd = new RDevice();
rd.setDevice_id(deviceId);
rd.setDepot_status(newValue);
rDeviceDao.update(rd);
if (key){
saveDeviceChangeAndBuyMode(doneCode, busiCode, deviceId, "depot_status",
oldValue, newValue,buyMode);
}
}
}
/**
* 保存到待回收设备
* @param doneCode
* @param busiCode
* @param deviceId
* @param depotId
* @throws JDBCException
*/
public void saveDeviceReclaim(Integer doneCode, String busiCode,
String deviceId, String custId,String reclaimReason) throws Exception {
CCustDevice cDevice = cCustDeviceDao.findByDeviceId(deviceId,getOptr().getCounty_id());
//以前的回收记录转成历史
rDeviceReclaimDao.updateReclaimHistory(deviceId, getOptr().getDept_id());
RDeviceReclaim rd = new RDeviceReclaim();
rd.setDone_code(doneCode);
rd.setDevice_id(deviceId);
rd.setBusi_code(busiCode);
if(cDevice!=null){
rd.setBuy_mode(cDevice.getBuy_mode());
}
rd.setDepot_id(getOptr().getDept_id());
rd.setOptr_id(getOptr().getOptr_id());
rd.setDept_id(getOptr().getDept_id());
rd.setStatus(StatusConstants.UNCONFIRM);
rd.setCust_id(custId);
rd.setReclaim_reason(reclaimReason);
rDeviceReclaimDao.save(rd);
}
/**
* 更换设备直接回收
* @param doneCode
* @param busiCode
* @param oldDevice
* @param custId
* @param reclaimReason
* @throws Exception
*/
public void saveDeviceToReclaim(Integer doneCode, String busiCode,
DeviceDto oldDevice, String custId,String reclaimReason) throws Exception {
CCustDevice cDevice = cCustDeviceDao.findByDeviceId(oldDevice.getDevice_id(),getOptr().getCounty_id());
//以前的回收记录转成历史
rDeviceReclaimDao.updateReclaimHistory(oldDevice.getDevice_id(), getOptr().getDept_id());
List<String> deviceIds = new ArrayList<String>();
deviceIds.add(oldDevice.getDevice_id());
RCard pairCard = null;
RModem pairModem = null;
if(oldDevice != null){
pairCard = oldDevice.getPairCard();
if(null !=pairCard && SystemConstants.BOOLEAN_FALSE.equals(pairCard.getIs_virtual()) ){
deviceIds.add(pairCard.getDevice_id());
}else{
pairCard = null;
}
pairModem = oldDevice.getPairModem();
if(null !=pairModem && SystemConstants.BOOLEAN_FALSE.equals(pairModem.getIs_virtual())){
deviceIds.add(pairModem.getDevice_id());
}else{
pairModem = null;
}
}
for(String devId:deviceIds){
RDeviceReclaim reclaim = new RDeviceReclaim();
reclaim.setDone_code(doneCode);
reclaim.setDevice_id(devId);
reclaim.setBusi_code(busiCode);
if(cDevice!=null){
reclaim.setBuy_mode(cDevice.getBuy_mode());
}
reclaim.setDepot_id(getOptr().getDept_id());
reclaim.setOptr_id(getOptr().getOptr_id());
reclaim.setDept_id(getOptr().getDept_id());
reclaim.setStatus(StatusConstants.CONFIRM);
reclaim.setCust_id(custId);
reclaim.setReclaim_reason(reclaimReason);
reclaim.setConfirm_optr(getOptr().getOptr_id());
reclaim.setConfirm_time(DateHelper.now());
rDeviceReclaimDao.save(reclaim);
CCustDevice custDevice = cCustDeviceDao.queryCustDeviceByDeviceId(custId, devId);
if(custDevice != null){
cCustDeviceDao.removeDevice(custId, devId, doneCode, SystemConstants.BOOLEAN_TRUE);
}else{
cCustDeviceHisDao.updateRecliam(custId, devId);
}
RDevice device = new RDevice();
device.setDevice_id(devId);
device.setDepot_status(StatusConstants.IDLE);
device.setOwnership(SystemConstants.OWNERSHIP_GD);
rDeviceDao.update(device);
}
saveDeviceChange(doneCode, busiCode, oldDevice.getDevice_id(), "depot_status",
oldDevice.getDepot_status(), StatusConstants.IDLE);
if(!SystemConstants.OWNERSHIP_GD.equals(oldDevice.getOwnership())){
saveDeviceChange(doneCode, busiCode, oldDevice.getDevice_id(), "ownership",
oldDevice.getOwnership(), SystemConstants.OWNERSHIP_GD);
}
if(pairCard !=null){
saveDeviceChange(doneCode, busiCode, pairCard.getDevice_id(), "depot_status",
pairCard.getDepot_status(), StatusConstants.IDLE);
saveDeviceChange(doneCode, busiCode, pairCard.getDevice_id(), "ownership",
pairCard.getOwnership(), SystemConstants.OWNERSHIP_GD);
}
if(pairModem !=null){
saveDeviceChange(doneCode, busiCode, pairModem.getDevice_id(), "depot_status",
pairModem.getDepot_status(), StatusConstants.IDLE);
saveDeviceChange(doneCode, busiCode, pairModem.getDevice_id(), "ownership",
pairModem.getOwnership(), SystemConstants.OWNERSHIP_GD);
}
}
public void saveLossDevice(Integer doneCode, String busiCode, String deviceCode) throws Exception {
RDevice rd = rDeviceDao.findByDeviceCode(deviceCode);
if(rd.getIs_loss().equals(SystemConstants.BOOLEAN_FALSE)){
rDeviceDao.updateDeviceLoss(rd.getDevice_id(), SystemConstants.BOOLEAN_TRUE);
saveDeviceChange(doneCode, busiCode, rd.getDevice_id(), "is_loss", rd.getIs_loss(),
SystemConstants.BOOLEAN_TRUE);
}
}
/**
* 查询待回收的设备
*
* @param deviceId
* @return
* @throws Exception
*/
public RDeviceReclaim queryDeviceReclaim(String deviceId) throws Exception{
return rDeviceReclaimDao.queryDeviceReclaim(deviceId);
}
/**
* 修改设备状态
* @param doneCode 业务流水
* @param busiCode 业务代码
* @param deviceId 设备id
* @param status 修改的设备状态
*/
public void updateDeviceStatus(Integer doneCode, String busiCode,
String deviceId, String oldValue,String newValue,boolean key) throws Exception {
if (!oldValue.equals(newValue)){
RDevice rd = new RDevice();
rd.setDevice_id(deviceId);
rd.setDevice_status(newValue);
rDeviceDao.update(rd);
if(key){
saveDeviceChange(doneCode, busiCode, deviceId, "device_status",
oldValue, newValue);
}
}
}
/**
* 修改设备到当前操作员的部门
* @param doneCode
* @param busiCode
* @param deviceId
* @param depot_id
*/
public void updateDeviceDepotId(Integer doneCode, String busiCode,
String deviceId, String oldDepotId, String newDepotId,String buyMode,boolean key) throws Exception {
if (!oldDepotId.equals(newDepotId)) {
RDevice rd = new RDevice();
rd.setDevice_id(deviceId);
rd.setDepot_id(newDepotId);
rDeviceDao.update(rd);
if(key){
saveDeviceChangeAndBuyMode(doneCode, busiCode, deviceId, "depot_id",
oldDepotId, newDepotId,buyMode);
}
}
}
/**
* 修改设备产权
* @param doneCode
* @param busiCode
* @param deviceId
* @param ownerShip
*/
public void updateDeviceOwnership(Integer doneCode, String busiCode,
String deviceId, String oldValue,String newValue,String buyMode,boolean key) throws Exception {
if (!oldValue.equals(newValue)){
RDevice rd = new RDevice();
rd.setDevice_id(deviceId);
rd.setOwnership(newValue);
rDeviceDao.update(rd);
if(key){
saveDeviceChangeAndBuyMode(doneCode, busiCode, deviceId, "ownership",
oldValue, newValue,buyMode);
}
}
}
/**
* 新机变成旧机
* @param doneCode
* @param busiCode
* @param deviceId
* @param oldValue
* @param newValue
* @throws Exception
*/
public void updateDeviceIsNewStb(Integer doneCode, String busiCode,
String deviceId, String oldValue,String newValue,boolean key) throws Exception {
if (oldValue==null || !oldValue.equals(newValue)){
RDevice rd = new RDevice();
rd.setDevice_id(deviceId);
rd.setIs_new_stb(newValue);
rDeviceDao.update(rd);
if(key){
saveDeviceChange(doneCode, busiCode, deviceId, "is_new_stb",
oldValue, newValue);
}
}
}
/**
* 更新设备新旧属性
* @param doneCode
* @param busiCode
* @param deviceId
* @param ownerShip
* @throws JDBCException
*/
public void updateDeviceUsed(Integer doneCode, String busiCode,
String deviceId, String oldValue,String newValue,boolean key) throws Exception {
if (!oldValue.equals(newValue)){
RDevice rd = new RDevice();
rd.setDevice_id(deviceId);
rd.setUsed(newValue);
rDeviceDao.update(rd);
if(key){
saveDeviceChange(doneCode, busiCode, deviceId, "used",
oldValue, newValue);
}
}
}
/**
* 购买方式更新
* @param doneCode
* @param busiCode
* @param deviceId
* @param oldBuyMode
* @param newBuyMode
* @throws Exception
*/
public void updateBuyMode(Integer doneCode, String busiCode,String deviceId, String oldBuyMode, String newBuyMode) throws Exception {
saveDeviceChange(doneCode, busiCode, deviceId, "buy_mode",oldBuyMode, newBuyMode);
}
/**
* 记录更换原因
* @param doneCode
* @param busiCode
* @param deviceId
* @param changeReason
* @throws Exception
*/
public void updateChangeReason(Integer doneCode, String busiCode,String deviceId, String changeReason) throws Exception {
saveDeviceChange(doneCode, busiCode, deviceId, "change_reason","", changeReason);
}
public void saveDeviceUseRecords(Integer doneCode, String busiCode, String deviceId,
String deviceType, String deviceCode, String custId, String custNo) throws Exception {
RDeviceUseRecords records = new RDeviceUseRecords();
records.setDone_code(doneCode);
records.setDevice_id(deviceId);
records.setDevice_type(deviceType);
records.setDevice_code(deviceCode);
records.setBusi_code(busiCode);
records.setCust_id(custId);
records.setCust_no(custNo);
records.setDone_date(DateHelper.now());
setBaseInfo(records);
rDeviceUseRecordsDao.save(records);
}
public RDevice findByDeviceCode(String deviceCode) throws JDBCException {
return rDeviceDao.findByDeviceCode(deviceCode);
}
/**
* 根据设备编号查找设备信息
* 如果设备编号对应的设备为机顶盒,判断pair_card_id是否为空,如果不为空,设置机顶盒的配对卡信息
* @param deviceCode
* @return
* @throws Exception
*/
public DeviceDto queryDeviceByDeviceCode(String deviceCode) throws JDBCException{
if (StringHelper.isEmpty(deviceCode))
return null;
RDevice rd = findByDeviceCode(deviceCode.replace(":","").replace(":", ""));
if (rd == null)
return null;
return queryDeviceByDeviceId(rd);
}
/**
* 修改机顶盒配对的智能卡
* @param stbDeviceId
* @param cardId
*/
public void updatePairCard(Integer doneCode, String busiCode,
String stbDeviceId, String oldCardId,String newCardId,boolean key) throws Exception {
if (!oldCardId.equals(newCardId)){
rStbDao.updatePairCard(stbDeviceId, newCardId);
if(key){
saveDeviceChange(doneCode, busiCode, stbDeviceId, "pair_card_id",
oldCardId, newCardId);
}
}
}
public void updatePairModem(Integer doneCode, String busiCode,
String stbDeviceId, String oldModemId,String newModemId,boolean key) throws Exception {
if (!oldModemId.equals(newModemId)){
rStbDao.updatePairModem(stbDeviceId, newModemId);
if(key){
saveDeviceChange(doneCode, busiCode, stbDeviceId, "pair_modem_id",
oldModemId, newModemId);
}
}
}
/**
* 记录智能卡的原配对盒号和新配对盒号异动
* @param doneCode
* @param busiCode
* @param cardDeviceId
* @param oldStbId
* @param newStbId
* @param key
* @throws Exception
*/
public void savePairStbChange(Integer doneCode, String busiCode,
String cardDeviceId, String oldStbId,String newStbId,boolean key) throws Exception {
if (!oldStbId.equals(newStbId)){
if(key){
saveDeviceChange(doneCode, busiCode, cardDeviceId, "pair_stb_id",
oldStbId, newStbId);
}
}
}
/**
* 设备产权互换
* @param doneCode 业务流水号
* @param busiCode 业务编号
* @param d1 设备1
* @param d2 设备2
*/
public void exchangeDeviceOwnership(Integer doneCode,String busiCode,
DeviceDto d1,DeviceDto d2) throws Exception{
if (!d1.getOwnership().equals(d2.getOwnership())){
updateDeviceOwnership(doneCode, busiCode, d1.getDevice_id(), d2.getOwnership(),d1.getOwnership(),null,true);
updateDeviceOwnership(doneCode, busiCode, d2.getDevice_id(), d1.getOwnership(),d2.getOwnership(),null,true);
}
}
/**
* 根据设备类型查找设备型号信息
* @param deviceId
* @param deviceType
* @return
* @throws JDBCException
*/
public RDeviceModel queryDeviceModelByDeviceType(String deviceId,String deviceType) throws JDBCException {
RDeviceModel deviceModel = null;
if(SystemConstants.DEVICE_TYPE_STB.equals(deviceType)){
deviceModel = rStbModelDao.findByDeviceId(deviceId);
}else if(SystemConstants.DEVICE_TYPE_CARD.equals(deviceType)){
deviceModel = rCardModelDao.findByDeviceId(deviceId);
}else if(SystemConstants.DEVICE_TYPE_MODEM.equals(deviceType)){
deviceModel = rModemModelDao.findByDeviceId(deviceId);
}
return deviceModel;
}
/**
* 根据设备id查找设备信息
* 如果设备编号对应的设备为机顶盒,判断pair_card_id是否为空,如果不为空,设置机顶盒的配对卡信息
* @param deviceId
* @return
* @throws Exception
*/
public DeviceDto queryDeviceByDeviceId(String deviceId) throws JDBCException {
RDevice rd = rDeviceDao.findByDeviceId(deviceId);
if (rd == null)
return null;
return queryDeviceByDeviceId(rd);
}
public DeviceDto queryDeviceByDeviceId(RDevice rd) throws JDBCException {
RDeviceModel deviceModel = null;
String deviceCode = null;
DeviceDto dto = new DeviceDto();
BeanUtils.copyProperties(rd, dto);
if (rd.getDevice_type().equals(SystemConstants.DEVICE_TYPE_STB)) {
deviceModel = rStbModelDao.findByDeviceId(rd.getDevice_id());
RStb stb = rStbDao.findByKey(rd.getDevice_id());
deviceCode = stb.getStb_id();
// 设置配对信息
dto.setPairCard(rCardDao.findPairCardByStbDeviceId(rd.getDevice_id()));
dto.setPairModem(rModemDao.findPairModemByStbDeviceId(rd.getDevice_id()));
dto.setStbMac(stb.getMac());
} else if (rd.getDevice_type().equals(SystemConstants.DEVICE_TYPE_CARD)) {
deviceModel = rCardModelDao.findByDeviceId(rd.getDevice_id());
deviceCode = rCardDao.findByKey(rd.getDevice_id()).getCard_id();
if(StringHelper.isEmpty(dto.getIs_virtual()))
dto.setIs_virtual(deviceModel.getIs_virtual());
if(null != rStbDao.findPairStbByCardDeviceId(rd.getDevice_id())){
//设置是否配对智能卡的标识位
dto.setIsPairCard(SystemConstants.BOOLEAN_TRUE);
}
} else if (rd.getDevice_type()
.equals(SystemConstants.DEVICE_TYPE_MODEM)) {
deviceModel = rModemModelDao.findByDeviceId(rd.getDevice_id());
deviceCode = rModemDao.findByKey(rd.getDevice_id()).getModem_mac();
if(StringHelper.isEmpty(dto.getIs_virtual()))
dto.setIs_virtual(deviceModel.getIs_virtual());
if(null != rStbDao.findPairStbByModemDeviceId(rd.getDevice_id())){
//设置是否配对MODEM的标识位
dto.setIsPairModem(SystemConstants.BOOLEAN_TRUE);
}
}
dto.setDevice_code(deviceCode);
dto.setDeviceModel(deviceModel);
return dto;
}
public RStb findPairStbByModemDeviceId(String deviceId) throws Exception {
return rStbDao.findPairStbByModemDeviceId(deviceId);
}
public RStb findPairStbByCardDeviceId(String deviceId) throws Exception {
return rStbDao.findPairStbByCardDeviceId(deviceId);
}
public RStb queryStbById(String stbId) throws Exception {
return rStbDao.queryStbById(stbId);
}
/**
* 根据设备编号查找可以销售的设备信息
* @param deviceCode
* @return
* @throws Exception
*/
public DeviceDto querySaleableDevice(String deviceCode) throws Exception{
DeviceDto rd = queryDevice(deviceCode);
if(isDeviceSaleable(rd))
return rd;
else
return null;
}
/**
* 开户时输入多个设备编号,验证这些设备是否可用
* @param deviceCodes
* @param userType
* @return 最后一个设备的型号
* @throws Exception
*/
public List<DeviceDto> querySaleableDeviceArea(String deviceCodes,String userType) throws Exception{
//TODO
if(StringHelper.isEmpty(deviceCodes)||StringHelper.isEmpty(userType)){
throw new ComponentException(ErrorCode.ParamIsNull);
}
String[] deviceCodeArrays=deviceCodes.split("\n");
List<DeviceDto> list=new ArrayList<>();
for(String deviceCode:deviceCodeArrays){
DeviceDto rd = queryDevice(deviceCode);
if(isDeviceSaleable(rd)){
//判断设备仓库是否可用
checkDeviceDepotCanUse(rd);
//判断设备和用户类型是否匹配
checkDeviceUserType(rd,userType);
}
list.add(rd);
}
return list;
}
/**
* 判断设备跟用户类型是否匹配
* singleStbNotSupDTT: '此设备为单向机顶盒,不支持当前的OTT用户类型!',
doubleStbNotSupOTT: '此设备为双向机顶盒,不支持当前的DTT用户类型!',
modemNotSupUserType: '设备为Modem猫,不支持所选[{0}]用户类型!',
currDeviceNotSupUserType: '此设备不支持当前的用户类型!',
* @throws ComponentException
*/
public boolean checkDeviceUserType(DeviceDto rd,String userType) throws ComponentException{
if(userType.equals(SystemConstants.USER_TYPE_DTT)
&&SystemConstants.DEVICE_TYPE_STB.equals(rd.getDevice_type())
&&SystemConstants.DTV_SERV_TYPE_SINGLE.equals(rd.getDeviceModel().getInteractive_type())){
return true;
}else if(userType.equals(SystemConstants.USER_TYPE_OTT)
&&SystemConstants.DEVICE_TYPE_STB.equals(rd.getDevice_type())
&&SystemConstants.DTV_SERV_TYPE_DOUBLE.equals(rd.getDeviceModel().getInteractive_type())){
return true;
}else if(userType.equals(SystemConstants.USER_TYPE_BAND)
&&SystemConstants.DEVICE_TYPE_MODEM.equals(rd.getDevice_type())){
return true;
}else {
throw new ComponentException(ErrorCode.DeviceNotSupUserType,rd.getDevice_code(),userType);
}
}
/**
* 判断设备仓库和操作员部门是否匹配
*/
private void checkDeviceDepotCanUse(DeviceDto device) throws Exception{
String scopeDevice = queryTemplateConfig(TemplateConfigDto.Config.SCOPE_DEVICE.toString());
if (SystemConstants.SYS_LEVEL_DEPT.equals(scopeDevice)) {
//按营业厅
if (!getOptr().getDept_id().equals(device.getDepot_id())) {
SDept dept = sDeptDao.findByKey(device.getDepot_id());
if (dept == null) {
throw new ComponentException("当前设备所在仓库数据有问题");
}
throw new ComponentException(ErrorCode.DeviceNotInRightDepot,device.getDevice_code(),dept.getDept_name());
}
} else if (SystemConstants.SYS_LEVEL_COUNTY.equals(scopeDevice)) {
//按县市
SDept dept = sDeptDao.findByKey(device.getDepot_id());
if (!getOptr().getCounty_id().equals(dept.getCounty_id())) {
throw new ComponentException(ErrorCode.DeviceNotInRightDepot,device.getDevice_code(),dept.getDept_name());
}
}
}
public static void main(String args[]){
String aaa="aaa\nbbb\nccc\n";
String[] bbb=aaa.split("\n");
for(String b:bbb)
System.out.println("##"+b);
}
public DeviceDto queryChangeDevice(String userType, String deviceCode) throws Exception {
DeviceDto rd = queryDevice(deviceCode);
if(rd.getDevice_type().equals(SystemConstants.DEVICE_TYPE_STB)){
RStbModel stbModel = rStbModelDao.findByDeviceId(rd.getDevice_id());
if(userType.equals(SystemConstants.USER_TYPE_OTT) && stbModel.getInteractive_type().equals(SystemConstants.DTV_SERV_TYPE_SINGLE)){
throw new ComponentException(ErrorCode.OTTIsNotSingle);
}else if(userType.equals(SystemConstants.USER_TYPE_DTT) && stbModel.getInteractive_type().equals(SystemConstants.DTV_SERV_TYPE_DOUBLE)){
throw new ComponentException(ErrorCode.DTTIsNotDouble);
}
}
if(isDeviceSaleable(rd))
return rd;
else
return null;
}
/**
* 查询可以单独购买的智能卡
* @param deviceCode
* @return
* @throws ComponentException
* @throws JDBCException
*/
public DeviceDto querySaleableCard(String deviceCode) throws Exception{
DeviceDto rd = queryDeviceByDeviceCode(deviceCode);
if (rd == null)
throw new ComponentException("设备不存在");
if(!SystemConstants.DEVICE_TYPE_CARD.equals(rd.getDevice_type())){
throw new ComponentException("设备不是智能卡");
}else{
RStb stb = rStbDao.findPairStbByCardDeviceId(rd.getDevice_id());
if (stb != null) {
throw new ComponentException("智能卡有配对的机顶盒");
}
}
if(isDeviceSaleable(rd))
return rd;
else
return null;
}
/**
* 查询可以单独购买的MODEM
* @param deviceCode
* @return
* @throws ComponentException
* @throws JDBCException
*/
public DeviceDto querySaleableModem(String deviceCode) throws Exception{
DeviceDto rd = queryDeviceByDeviceCode(deviceCode);
if (rd == null)
throw new ComponentException("设备不存在");
if(!SystemConstants.DEVICE_TYPE_MODEM.equals(rd.getDevice_type())){
throw new ComponentException("设备不是MODEM");
}else{
RStb stb = rStbDao.findPairStbByModemDeviceId(rd.getDevice_id());
if (stb != null) {
throw new ComponentException("MODEM有配对的机顶盒");
}
}
if(isDeviceSaleable(rd))
return rd;
else
return null;
}
public boolean isPair(String stbModel,String cardModel) throws Exception {
return rPairCfgDao.isPair(stbModel, cardModel);
}
/**
* 根据设备编号查找可以的设备信息
*
* 如果设备为配对的卡,返回为配对的机顶盒
* @param deviceCode
* @return
* @throws Exception
*/
public DeviceDto queryDevice(String deviceCode) throws JDBCException,
ComponentException {
DeviceDto rd = queryDeviceByDeviceCode(deviceCode);
if (rd == null)
throw new ComponentException(ErrorCode.DeviceNotExists);
/*if (rd.getDevice_type().equals(SystemConstants.DEVICE_TYPE_CARD)) {
RStb stb = rStbDao.findPairStbByCardDeviceId(rd.getDevice_id());
if (stb != null) {
rd = queryDeviceByDeviceId(stb.getDevice_id());
}
}
if (rd.getDevice_type().equals(SystemConstants.DEVICE_TYPE_MODEM)) {
RStb stb = rStbDao.findPairStbByModemDeviceId(rd.getDevice_id());
if (stb != null) {
rd = queryDeviceByDeviceId(stb.getDevice_id());
}
}*/
return rd;
}
/**
* 根据设备型号和销售方式查找销售费用信息
* @param deviceModel
* @param buyMode
* @return
*/
public List<RDeviceFee> queryDeviceFee(String deviceType,String deviceModel,String buyMode) throws Exception{
String templateId = queryTemplateId(SystemConstants.TEMPLATE_TYPE_FEE);
return rDeviceFeeDao.queryFee(deviceType,deviceModel,buyMode,templateId);
}
public List<RDeviceFee> queryUpgradeuFee(String deviceType) throws Exception{
String templateId = queryTemplateId(SystemConstants.TEMPLATE_TYPE_FEE);
return rDeviceFeeDao.queryUpgradeuFee(deviceType,SystemConstants.BUSI_BUY_MODE_UPGRADE,templateId);
}
public TBusiFeeDevice queryFeeByMode(String deviceType) throws Exception{
return tBusiFeeDeviceDao.queryFeeByMode(deviceType);
}
/**
* 判断设备是否可以销售
* @param device
* @return
*/
private boolean isDeviceSaleable(DeviceDto device) throws Exception{
if (device == null){
throw new ComponentException(ErrorCode.DeviceNotExists);
}
if (device.getDepot_status().equals(StatusConstants.USE)) {
throw new ComponentException("设备已被使用");
}
if(device.getIs_loss().equals(SystemConstants.BOOLEAN_TRUE)){
throw new ComponentException("设备已被挂失");
}
if (device.getOwnership().equals(SystemConstants.OWNERSHIP_CUST)) {
throw new ComponentException("设备产权不属于广电");
}
if(SystemConstants.BOOLEAN_TRUE.equals(device.getFreezed())){
throw new ComponentException("设备已被冻结");
}
if (StatusConstants.UNCONFIRM.equals(device.getTran_status())){
throw new ComponentException("该设备正处于调拨中");
}
if (!SystemConstants.DEVICE_DIFFENCN_TYPE_NODIFF.equals(device.getDiffence_type())){
throw new ComponentException("该设备实物状态和库存状态不一致");
}
if(StatusConstants.CORRUPT.equals(device.getDevice_status())){
throw new ComponentException("该设备已损坏");
}
if(StatusConstants.SCRAP.equals(device.getDevice_status())){
throw new ComponentException("该设备已报废");
}
if(SystemConstants.BOOLEAN_TRUE.equals(device.getIs_virtual())){
throw new ComponentException("该设备为虚拟"+device.getDevice_type_text());
}
/*String scopeDevice = queryTemplateConfig(TemplateConfigDto.Config.SCOPE_DEVICE.toString());
if (SystemConstants.SYS_LEVEL_DEPT.equals(scopeDevice)) {
//按营业厅
if (!getOptr().getDept_id().equals(device.getDepot_id())) {
RDepotDefine depot = rDepotDefineDao.findBydepotId(device
.getDepot_id());
if (depot == null) {
throw new ComponentException("当前设备所在仓库数据有问题");
}
throw new ComponentException("设备在" + depot.getDepot_name()
+ ",不在当前仓库");
}
} else if (SystemConstants.SYS_LEVEL_COUNTY.equals(scopeDevice)) {
//按县市
SDept dept = sDeptDao.findByKey(device.getDepot_id());
if (!getOptr().getCounty_id().equals(dept.getCounty_id())) {
throw new ComponentException("设备在" + dept.getCounty_name()
+ ",不在当前仓库");
}
}*/
return true;
}
/**
* 记录设备的信息异动
* @param deviceId
* @param columnName
* @param oldValue
* @param newValue
* @throws Exception
*/
private void saveDeviceChange(Integer doneCode, String busiCode,
String deviceId, String columnName, String oldValue, String newValue) throws Exception {
rDeviceChangeDao.saveDeviceChange(doneCode,busiCode,deviceId,columnName,oldValue,newValue,getOptr().getOptr_id()
,getOptr().getDept_id(),getOptr().getCounty_id(),getOptr().getArea_id());
}
private void saveDeviceChangeAndBuyMode(Integer doneCode, String busiCode,
String deviceId, String columnName, String oldValue, String newValue,String buyMode) throws Exception {
rDeviceChangeDao.saveDeviceChangeAndBuyMode(doneCode,busiCode,deviceId,columnName,oldValue,newValue,buyMode,getOptr().getOptr_id()
,getOptr().getDept_id(),getOptr().getCounty_id(),getOptr().getArea_id());
}
/**
*
* @param doneCode
* @return
*/
public void recover(Integer doneCode) throws Exception{
rDeviceChangeDao.recover(doneCode) ;
}
/**
* 根据机顶盒编号查询机顶盒类型信息
* @param stbId
* @return
* @throws Exception
*/
public RStbModel queryByStbId(String stbId) throws Exception{
return rStbModelDao.queryByStbId(stbId);
}
/**
* 查找客户下 指定购买的设备
* @param custId
* @param modelName
*/
public List<RDevice> queryDeviceByBuyModel(String custId, String modelName)
throws JDBCException {
return rDeviceDao.queryDeviceByBuyModel(custId, modelName);
}
/**
* 查询设备购买方式
* @return
*/
public List<TDeviceBuyMode> queryDeviceBuyModel() throws Exception {
String dataRight = this.queryDataRightCon(getOptr(), DataRight.BUY_MODE.toString());
List<TDeviceBuyMode> list = tDeviceBuyModeDao.queryDeviceBuyModeByParams(
SystemConstants.BUY_TYPE_BUSI,
SystemConstants.BUSI_BUY_MODE_BUY, dataRight);
for(TDeviceBuyMode buyMode : list){
buyMode.setBuy_mode_name( MemoryDict.getTransData(buyMode.getBuy_mode_name()) );
}
return list;
}
/**
* 查询设备型号
* @return
*/
public List<RDeviceModel> queryDeviceModel() throws Exception {
return rDeviceModelDao.queryDeviceModel();
}
/**
* 查询充值卡
* @param deviceCode
* @return
* @throws JDBCException
* @throws ComponentException
*/
public CValuableCard queryValuableCardById(String deviceCode) throws JDBCException,ComponentException{
return cValuableCardDao.findByKey(deviceCode);
}
public List<ValuableCardDto> queryValuableCardById(String[] valuableId,String countyId) throws JDBCException,ComponentException{
return cValuableCardDao.queryById(valuableId,countyId);
}
public List<CValuableCard> queryBydoneCode(Integer doneCode) throws JDBCException,ComponentException{
return cValuableCardDao.queryBydoneCode(doneCode);
}
/**
* 保存充值卡,并验证是否已经存在
* @param doneCode
* @param records
* @param optr
* @throws Exception
*/
public void saveValuableCard(Integer doneCode,String records,String feeSn, SOptr optr) throws Exception {
List<CValuableCard> list = new ArrayList<CValuableCard>();
if (StringHelper.isNotEmpty(records)) {
Type type = new TypeToken<List<CValuableCard>>() {
}.getType();
list = JsonHelper.gson.fromJson(records, type);
}
String[] cards = CollectionHelper.converValueToArray(list, "valuable_id");
List<CValuableCard> cardList = cValuableCardDao.queryByValuableId(cards);
if(cardList.size()>0){
throw new ComponentException("输入的充值卡号:【"+cardList.get(0).getValuable_id()+"】已经存在!");
}
List<CValuableCard> msgList = new ArrayList<CValuableCard>();
if (list.size() > 0) {
for (CValuableCard dto : list) {
CValuableCard msg = new CValuableCard();
BeanUtils.copyProperties(dto, msg);
msg.setDept_id(getOptr().getDept_id());
msg.setCreate_time(DateHelper.now());
msg.setCounty_id(getOptr().getCounty_id());
msg.setOptr_id(getOptr().getOptr_id());
msg.setDone_code(doneCode);
msgList.add(msg);
}
cValuableCardDao.save(msgList.toArray(new CValuableCard[msgList.size()]));
}
}
public void editValuableCard(String doneCode,String custName) throws Exception {
cValuableCardDao.editValuableCard(doneCode,custName);
}
/**
* 删除充值卡,并记录历史
* @param doneCode
* @param deviceCode
* @param optr
* @throws Exception
*/
public void removeValuableCard(Integer doneCode,List<ValuableCardDto> valuableList) throws Exception {
List<CValuableCardHis> cardHisList = new ArrayList<CValuableCardHis>();
List<String> list = new ArrayList<String>();
for(ValuableCardDto dto:valuableList){
CValuableCardHis cardHis = new CValuableCardHis();
BeanUtils.copyProperties(dto, cardHis);
list.add(dto.getValuable_id());
cardHis.setBusi_done_code(doneCode);
cardHisList.add(cardHis);
}
String[] arr = (String[])list.toArray(new String[list.size()]);
cValuableCardHisDao.save(cardHisList.toArray(new CValuableCardHis[cardHisList.size()]));
cValuableCardDao.deleteById(arr);
}
public void saveValuableCardFee(CValuableCardFee valuableCardFee) throws JDBCException{
cValuableCardFeeDao.save(valuableCardFee);
}
public Pager<ValuableCardDto> queryValuableAllCard(Integer start, Integer limit, String query,String queryItem) throws Exception{
if(queryItem.equals(SystemConstants.BOOLEAN_FALSE)){
return cValuableCardDao.queryValuableHisAllCard(start,limit,query,getOptr().getCounty_id());
}else{
return cValuableCardDao.queryValuableAllCard(start,limit,query,getOptr().getCounty_id());
}
}
public void checkChangeDevice(DeviceDto oldDevice, DeviceDto device) throws Exception {
if (!oldDevice.getDevice_type().equals(device.getDevice_type()))
throw new ServicesException("设备类型不正确!");
if (device.getDevice_type().equals(SystemConstants.DEVICE_TYPE_STB)){
//判断设备型号的INTERACTIVE_TYPE是否一致
RStbModel oldModel = rStbModelDao.findByKey(oldDevice.getDevice_model());
RStbModel newModel = rStbModelDao.findByKey(device.getDevice_model());
if (!oldModel.getInteractive_type().equals(newModel.getInteractive_type()))
throw new ServicesException("设备类型不正确!");
}
}
/**
* 根据doneCode查询本次业务被回收的设备信息.
* @param doneCode
* @return
*/
public DeviceDto queryReclaimedDevice(Integer doneCode) throws Exception{
RDeviceReclaim rr = rDeviceReclaimDao.queryReclaimDevice(doneCode, null);
return queryDeviceByDeviceId(rr.getDevice_id());
}
public boolean getIsCard(String deviceCode) throws Exception{
RDevice rd = rDeviceDao.findByDeviceCode(deviceCode);
if (rd == null){
throw new ComponentException("设备不存在");
}
boolean flag = rDeviceDao.isDeviceProcure(rd.getDevice_id());
if(!flag){
throw new ComponentException("该智能卡不是一体机领用,不能发预授权!");
}
return true;
}
/**
* 器材数量减去购买数量
* @param deviceType
* @param deviceModel
* @param optr
* @param buyNum
* @param buyMode
* @throws Exception
*/
public void removeTotalNumDevice(Integer doneCode,String busiCode,String deviceId, Integer buyNum,String buyMode, SOptr optr) throws Exception{
RDevice device = rDeviceDao.findByKey(deviceId);
//总数异动记录
rDeviceChangeDao.saveMateralTransChange(doneCode,busiCode,device.getDevice_id(),"total_num",device.getTotal_num()
,device.getTotal_num()-buyNum,optr.getOptr_id(),optr.getDept_id(),optr.getCounty_id(), optr.getArea_id(),buyMode);
//减去数量
rDeviceDao.removeMateralDevice(deviceId, buyNum);
RDevice nextRdevice = rDeviceDao.findByKey(deviceId);
if(nextRdevice.getTotal_num()<0){
throw new ComponentException(ErrorCode.DeviceTotalNumIsNull);
}
}
/**
* 原器材加上购买数量
* @param deviceId
* @param buyNum
* @throws Exception
*/
public void addTotalNumDevice(String deviceId, Integer buyNum) throws Exception{
//加上数量购买数量
rDeviceDao.addMateralDevice(deviceId, buyNum);
}
public void updateDeviceNum(CFeeDevice feeDevice) throws Exception{
RDevice r = rDeviceDao.findByKey(feeDevice.getDevice_id());
if(r == null || !r.getDevice_model().equals(feeDevice.getDevice_model())){
throw new ComponentException(ErrorCode.DeviceDateException,feeDevice.getDevice_id());
}
addTotalNumDevice(feeDevice.getDevice_id(),feeDevice.getBuy_num());
}
public RDevice queryTotalNumDevice(String deviceModel,String deptId) throws Exception{
//原器材
RDevice device = rDeviceDao.queryIdleMateralDevice(deviceModel, deptId);
if(device == null){
throw new ComponentException(ErrorCode.DeviceNotExists);
}
return device;
}
public List<RDeviceModelTotalDto> queryMateralTransferDeviceByDepotId(SOptr optr)throws Exception{
String depotId = optr.getDept_id();
List<RDevice> list = rDeviceDao.queryMateralDeviceByDepotId(depotId);
List<RDeviceModel> modelList = queryDeviceModel();
Map<String, List<RDevice>> deviceMap = CollectionHelper.converToMap(list,new String[]{"device_type","device_model"});
List<RDeviceModelTotalDto> deviceList = new ArrayList<RDeviceModelTotalDto>();
for(RDeviceModel _r : modelList){
RDeviceModelTotalDto dto = new RDeviceModelTotalDto();
BeanUtils.copyProperties(_r, dto);
dto.setTotal_num(0);
String type = StringHelper.join(new String[]{_r.getDevice_type(),_r.getDevice_model()},"_");
if(deviceMap != null && deviceMap.get(type) != null){
List<RDevice> device = deviceMap.get(type);
if(device.size()==1){
dto.setTotal_num(device.get(0).getTotal_num());
}else{
throw new ComponentException(ErrorCode.DeviceDateException,type);
}
}
deviceList.add(dto);
}
return deviceList;
}
public List<RDeviceModelTotalDto> queryDeviceCanBuy(String dept_id) throws Exception{
List<RDeviceModelTotalDto> list = new ArrayList<RDeviceModelTotalDto>();
List<RDevice> deviceList= rDeviceDao.queryMateralDeviceByDepotId(dept_id);
for(RDevice dto : deviceList){
RDeviceModelTotalDto f = new RDeviceModelTotalDto();
f.setDevice_model(dto.getDevice_model());
f.setDevice_type(dto.getDevice_type());
f.setTotal_num(dto.getTotal_num());
List<RDeviceFee> fList = queryDeviceFee(dto.getDevice_type(), dto.getDevice_model(), SystemConstants.BUSI_BUY_MODE_BUY);
if(fList.size()>0){
f.setFee_id(fList.get(0).getFee_id());
f.setFee_value(fList.get(0).getFee_value());
f.setFee_std_id(fList.get(0).getFee_std_id());
}else{
//未配置BUY的费用返回-1
f.setFee_value(-1);
}
list.add(f);
}
return list;
}
public List<DeviceSmallDto> getDeviceCodeByDeviceId(String[] deviceIds) throws Exception{
if(deviceIds.length>0){
return rDeviceDao.getDeviceCodeByDeviceId(deviceIds);
}else{
return null;
}
}
public void setCValuableCardHisDao(CValuableCardHisDao valuableCardHisDao) {
cValuableCardHisDao = valuableCardHisDao;
}
public void setCValuableCardDao(CValuableCardDao valuableCardDao) {
cValuableCardDao = valuableCardDao;
}
public void setRDeviceChangeDao(RDeviceChangeDao deviceChangeDao) {
rDeviceChangeDao = deviceChangeDao;
}
public void setRDeviceDao(RDeviceDao deviceDao) {
rDeviceDao = deviceDao;
}
/**
* @param stbDao the rStbDao to set
*/
public void setRStbDao(RStbDao stbDao) {
rStbDao = stbDao;
}
/**
* @param stbModelDao the rStbModelDao to set
*/
public void setRStbModelDao(RStbModelDao stbModelDao) {
rStbModelDao = stbModelDao;
}
/**
* @param cardModelDao the rCardModelDao to set
*/
public void setRCardModelDao(RCardModelDao cardModelDao) {
rCardModelDao = cardModelDao;
}
/**
* @param modemModelDao the rModemModelDao to set
*/
public void setRModemModelDao(RModemModelDao modemModelDao) {
rModemModelDao = modemModelDao;
}
/**
* @param cardDao the rCardDao to set
*/
public void setRCardDao(RCardDao cardDao) {
rCardDao = cardDao;
}
/**
* @param deviceFeeDao the rDeviceFeeDao to set
*/
public void setRDeviceFeeDao(RDeviceFeeDao deviceFeeDao) {
rDeviceFeeDao = deviceFeeDao;
}
/**
* @param depotDefineDao the rDepotDefineDao to set
*/
public void setRDepotDefineDao(RDepotDefineDao depotDefineDao) {
rDepotDefineDao = depotDefineDao;
}
/**
* @param modemDao the rModemDao to set
*/
public void setRModemDao(RModemDao modemDao) {
rModemDao = modemDao;
}
/**
* @param doneCode
*/
public void removeChange(Integer doneCode) throws Exception{
rDeviceChangeDao.removeByDoneCode(doneCode);
}
/**
* @param deviceBuyModeDao the tDeviceBuyModeDao to set
*/
public void setTDeviceBuyModeDao(TDeviceBuyModeDao deviceBuyModeDao) {
tDeviceBuyModeDao = deviceBuyModeDao;
}
/**
* @param deptDao the sDeptDao to set
*/
public void setSDeptDao(SDeptDao deptDao) {
sDeptDao = deptDao;
}
public void setCValuableCardFeeDao(CValuableCardFeeDao valuableCardFeeDao) {
cValuableCardFeeDao = valuableCardFeeDao;
}
public void setRDeviceReclaimDao(RDeviceReclaimDao deviceReclaimDao) {
rDeviceReclaimDao = deviceReclaimDao;
}
public void setRPairCfgDao(RPairCfgDao pairCfgDao) {
rPairCfgDao = pairCfgDao;
}
public void setRDeviceUseRecordsDao(RDeviceUseRecordsDao deviceUseRecordsDao) {
rDeviceUseRecordsDao = deviceUseRecordsDao;
}
public void setTBusiFeeDeviceDao(TBusiFeeDeviceDao busiFeeDeviceDao) {
tBusiFeeDeviceDao = busiFeeDeviceDao;
}
public void setCCustDeviceDao(CCustDeviceDao custDeviceDao) {
cCustDeviceDao = custDeviceDao;
}
public void setRDeviceModelDao(RDeviceModelDao deviceModelDao) {
this.rDeviceModelDao = deviceModelDao;
}
}