package com.ycsoft.business.service.impl;
import static com.ycsoft.commons.constants.SystemConstants.ACCT_TYPE_SPEC;
import static com.ycsoft.commons.constants.SystemConstants.USER_TYPE_BAND;
import static com.ycsoft.commons.constants.SystemConstants.USER_TYPE_DTT;
import static com.ycsoft.commons.constants.SystemConstants.USER_TYPE_OTT;
import static com.ycsoft.commons.constants.SystemConstants.USER_TYPE_OTT_MOBILE;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ycsoft.beans.config.TBusiFee;
import com.ycsoft.beans.config.TDeviceBuyMode;
import com.ycsoft.beans.config.TDeviceChangeReason;
import com.ycsoft.beans.core.acct.CAcct;
import com.ycsoft.beans.core.cust.CCust;
import com.ycsoft.beans.core.cust.CCustDevice;
import com.ycsoft.beans.core.fee.CFee;
import com.ycsoft.beans.core.fee.CFeeAcct;
import com.ycsoft.beans.core.fee.CFeeDevice;
import com.ycsoft.beans.core.job.JUserStop;
import com.ycsoft.beans.core.prod.CProdOrder;
import com.ycsoft.beans.core.prod.CProdOrderDto;
import com.ycsoft.beans.core.prod.CProdOrderFee;
import com.ycsoft.beans.core.prod.CProdOrderFeeOut;
import com.ycsoft.beans.core.prod.CProdPropChange;
import com.ycsoft.beans.core.prod.CancelUserDto;
import com.ycsoft.beans.core.user.CUser;
import com.ycsoft.beans.core.user.CUserPropChange;
import com.ycsoft.beans.prod.PPromotionAcct;
import com.ycsoft.beans.prod.PSpkgOpenbusifee;
import com.ycsoft.beans.prod.PSpkgOpenuser;
import com.ycsoft.beans.system.SOptr;
import com.ycsoft.beans.task.WTaskBaseInfo;
import com.ycsoft.beans.task.WTaskUser;
import com.ycsoft.business.commons.pojo.BusiParameter;
import com.ycsoft.business.component.task.SnTaskComponent;
import com.ycsoft.business.dao.core.fee.CFeeDao;
import com.ycsoft.business.dao.core.prod.CProdOrderDao;
import com.ycsoft.business.dao.core.prod.CProdOrderFeeDao;
import com.ycsoft.business.dao.core.prod.CProdOrderFeeOutDao;
import com.ycsoft.business.dao.task.WTaskBaseInfoDao;
import com.ycsoft.business.dao.task.WTaskUserDao;
import com.ycsoft.business.dto.core.acct.PayDto;
import com.ycsoft.business.dto.core.cust.CustFullInfoDto;
import com.ycsoft.business.dto.core.fee.BusiFeeDto;
import com.ycsoft.business.dto.core.fee.FeeInfoDto;
import com.ycsoft.business.dto.core.prod.DisctFeeDto;
import com.ycsoft.business.dto.core.prod.PromotionDto;
import com.ycsoft.business.dto.core.user.UserInfo;
import com.ycsoft.business.dto.core.user.UserRes;
import com.ycsoft.business.dto.device.DeviceDto;
import com.ycsoft.business.service.IUserService;
import com.ycsoft.commons.constants.BusiCmdConstants;
import com.ycsoft.commons.constants.BusiCodeConstants;
import com.ycsoft.commons.constants.StatusConstants;
import com.ycsoft.commons.constants.SystemConstants;
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.StringHelper;
import com.ycsoft.commons.store.MemoryDict;
import com.ycsoft.daos.core.JDBCException;
@Service
public class UserServiceSN extends BaseBusiService implements IUserService {
@Autowired
private CProdOrderDao cProdOrderDao;
@Autowired
private SnTaskComponent snTaskComponent;
@Autowired
private WTaskBaseInfoDao wTaskBaseInfoDao;
@Autowired
private WTaskUserDao wTaskUserDao;
@Autowired
private CProdOrderFeeDao cProdOrderFeeDao;
@Autowired
private CFeeDao cFeeDao;
@Autowired
private CProdOrderFeeOutDao cProdOrderFeeOutDao;
public void createUser(CUser user, String deviceCode, String deviceType, String deviceModel, String deviceBuyMode,
FeeInfoDto deviceFee) throws Exception {
CCust cust = getBusiParam().getCust();
doneCodeComponent.lockCust(cust.getCust_id());
this.validAccount(user.getLogin_name());
this.canOpenUser(cust);
Integer doneCode = doneCodeComponent.gDoneCode();
getBusiParam().resetUser();
if(user.getUser_type().equals(SystemConstants.USER_TYPE_OTT_MOBILE)){
user = openSingle(cust, user, doneCode, deviceCode, deviceType, deviceModel, deviceBuyMode, deviceFee);
getBusiParam().addUser(user);//设置拦截器所需要的参数
}else{
//用户开户多设备开户
List<DeviceDto> list= deviceComponent.querySaleableDeviceArea(deviceCode,user.getUser_type());
for(DeviceDto device:list){
if(list.size()>1){
user.setLogin_name(null);
}
user = openSingle(cust, user, doneCode, device.getDevice_code(), device.getDevice_type(), device.getDevice_model(), deviceBuyMode, deviceFee);
getBusiParam().addUser(user);//设置拦截器所需要的参数
}
}
/**
String userType = user.getUser_type();
//若没有设备号,新增工单
DTT不开工单
if ((userType.equals(USER_TYPE_BAND) && StringHelper.isEmpty(user.getModem_mac()))
|| (userType.equals(USER_TYPE_OTT) && StringHelper.isEmpty(user.getStb_id()))) {
List<CUser> userList = new ArrayList<CUser>();
user.setDevice_model(deviceModel);
userList.add(user);
snTaskComponent.createOpenTask(doneCode, cust, userList, getBusiParam().getWorkBillAsignType());
}**/
saveAllPublic(doneCode, getBusiParam());
}
public String generateUserName(String custId, String userType) {
String userName = "";
try {
CCust cust = custComponent.queryCustById(custId);
int num = getUserCount(cust, userType);
if (userType.equals(USER_TYPE_BAND)) {
String domainName = custComponent.getDomainByAddr(cust.getAddr_id());
userName = cust.getCust_no() + "0" + num + "@" + domainName;
} else {
userName = cust.getCust_no() + "" + num;
}
} catch (Exception e) {
e.printStackTrace();
}
return userName;
}
private void canOpenUser(CCust cust) throws Exception {
if(cust.getStatus().equals(StatusConstants.PREOPEN)){
throw new ServicesException(ErrorCode.CustStatusIsNotOpenUser);
}
}
@Override
public void createUserBatch(List<UserInfo> userList, String stopType, String isHand) throws Exception {
CCust cust = getBusiParam().getCust();
this.canOpenUser(cust);
doneCodeComponent.lockCust(cust.getCust_id());
Integer doneCode = doneCodeComponent.gDoneCode();
List<CUser> users = new ArrayList<CUser>();
if(SystemConstants.BOOLEAN_TRUE.equals(isHand)){
// 获取客户信息
for (UserInfo userInfo:userList){
for (int i=0;i<userInfo.getUser_count();i++){
CUser user = new CUser();
user.setUser_type(userInfo.getUser_type());
String deviceType;
if (user.getUser_type().equals(USER_TYPE_BAND)){
deviceType = SystemConstants.DEVICE_TYPE_MODEM;
} else {
deviceType = SystemConstants.DEVICE_TYPE_STB;
}
String deviceModel = userInfo.getDevice_model();
String deviceBuyMode = userInfo.getDevice_buy_mode();
FeeInfoDto deviceFee = new FeeInfoDto();
deviceFee.setFee_id(userInfo.getFee_id());
deviceFee.setFee(userInfo.getFee());
user.setStop_type(stopType);
CUser newUser = this.openSingle(cust, user, doneCode, null, deviceType, deviceModel, deviceBuyMode, deviceFee);
users.add(newUser);
}
}
}else{
List<PSpkgOpenuser> spkgUserList = this.querySpkgUser(cust.getCust_id(),cust.getSpkg_sn());
List<PSpkgOpenbusifee> spkgBusiFeeList = this.querySpkgOpenFee(cust.getSpkg_sn());
if(spkgUserList.size() > 0){
for(PSpkgOpenuser openUser : spkgUserList){
CUser user = new CUser();
user.setUser_type(openUser.getUser_type());
String deviceType;
if (user.getUser_type().equals(USER_TYPE_BAND)){
deviceType = SystemConstants.DEVICE_TYPE_MODEM;
} else {
deviceType = SystemConstants.DEVICE_TYPE_STB;
}
String deviceModel = openUser.getDevice_model();
String deviceBuyMode = openUser.getBuy_type();
FeeInfoDto deviceFee = new FeeInfoDto();
deviceFee.setFee_id(openUser.getFee_id());
deviceFee.setFee(openUser.getFee());
user.setStop_type(stopType);
int openNum = openUser.getOpen_num();
for(int i=0;i<openNum;i++){
CUser newUser = this.openSingle(cust, user, doneCode, null, deviceType, deviceModel, deviceBuyMode, deviceFee);
deviceFee.setFee(0);
users.add(newUser);
}
}
}
if(spkgBusiFeeList.size() > 0){
for(PSpkgOpenbusifee busiFee : spkgBusiFeeList){
if(busiFee.getFee() > 0){
feeComponent.saveBusiFee(cust.getCust_id(), cust != null ? cust.getAddr_id() : null, busiFee.getFee_id(), 1,
SystemConstants.PAY_TYPE_UNPAY, busiFee.getFee(), doneCode, doneCode, getBusiParam().getBusiCode(), null, "");
doneCodeComponent.saveDoneCodeUnPay(cust.getCust_id(), doneCode,this.getOptr().getOptr_id());
}
}
}
userComponent.updateOpenUserDoneCode(cust.getSpkg_sn(), doneCode);
}
snTaskComponent.createOpenTask(doneCode, cust, users, getBusiParam().getWorkBillAsignType());
getBusiParam().setSelectedUsers(users);
snTaskComponent.saveTaskCreateBusiExt(cust.getCust_id(), doneCode, getBusiParam());
saveAllPublic(doneCode, getBusiParam());
}
private int getUserCount(CCust cust, String userType) throws Exception {
int num = userComponent.queryMaxNumByLoginName(cust.getCust_id(), cust.getCust_no(), userType);
if(userType.equals(USER_TYPE_BAND)){
num += SystemConstants.USER_TYPE_BAND_NUM;
}else if(userType.equals(USER_TYPE_OTT) || userType.equals(USER_TYPE_OTT_MOBILE)){
if(num == 0){
num += SystemConstants.USER_TYPE_OTT_NUM;
}else{
num += 1;
}
}
return num;
}
private CUser openSingle(CCust cust, CUser cuser, Integer doneCode, String deviceCode, String deviceType,
String deviceModel, String deviceBuyMode, FeeInfoDto deviceFee) throws Exception, JDBCException {
String custId = cust.getCust_id();
String user_id = userComponent.gUserId();
// 创建账户信息
String acctId = acctComponent.createAcct(custId, user_id, ACCT_TYPE_SPEC, null);
// 创建用户信息
CUser user = (CUser)cuser.clone();
user.setUser_id(user_id);
user.setAcct_id(acctId);
user.setCust_id(custId);
user.setStr10(deviceBuyMode);//用户开始时设备购买方式
user.setDevice_model(deviceModel);//工单需要记录设备型号
user.setStr3(deviceModel);
DeviceDto device = null;
if (StringHelper.isNotEmpty(deviceCode)){
device = deviceComponent.queryDeviceByDeviceCode(deviceCode);
setUserDeviceInfo(user, device);
} else {
device = new DeviceDto();
device.setDevice_type(deviceType);
device.setDevice_model(deviceModel);
}
//验证band账号名
if(StringHelper.isNotEmpty(user.getLogin_name()))
this.validAccount(user.getLogin_name());
if(StringHelper.isEmpty(user.getPassword()))
user.setPassword(cust.getPassword());
//设置OTT用户终端类型和默认用户名
String userType = user.getUser_type();
if (userType.equals(USER_TYPE_OTT)) {
if (cust.getCust_type().equals(SystemConstants.CUST_TYPE_NONRESIDENT)){
user.setTerminal_type(SystemConstants.USER_TERMINAL_TYPE_ZZD);
} else {
List<CUser> userList = userComponent.queryUserByCustId(cust.getCust_id());
user.setTerminal_type(SystemConstants.USER_TERMINAL_TYPE_ZZD);
if (userList.size() > 0){
Map<String, List<CUser>> map = CollectionHelper.converToMap(userList, "user_type");
List<CUser> ottList = map.get(USER_TYPE_OTT);
if(ottList == null || (ottList.size() > 0 && ottList.size() % 3 == 0)){//二主一副
user.setTerminal_type(SystemConstants.USER_TERMINAL_TYPE_ZZD);
}else{
user.setTerminal_type(SystemConstants.USER_TERMINAL_TYPE_FZD);
}
}
}
}
TDeviceBuyMode buyModeCfg = busiConfigComponent.queryBuyMode(deviceBuyMode);
//处理设备和授权
//批量开户不添加设备到c_cust_device
if (!user.getUser_type().equals(USER_TYPE_OTT_MOBILE)){
String ownership = SystemConstants.OWNERSHIP_GD;
if (buyModeCfg!= null && buyModeCfg.getChange_ownship().equals(SystemConstants.BOOLEAN_TRUE))
ownership = SystemConstants.OWNERSHIP_CUST;
this.buyDevice(device, deviceBuyMode,ownership, deviceFee, getBusiParam().getBusiCode(), cust, doneCode);
//非自购模式 设置协议截止日期,读取模板配置数据
//去掉协议期
/*if(buyModeCfg!= null && !buyModeCfg.getBuy_mode().equals(SystemConstants.BUSI_BUY_MODE_BUY) && StringHelper.isNotEmpty(deviceModel)){
Integer months = Integer.parseInt( userComponent.queryTemplateConfig(TemplateConfigDto.Config.PROTOCOL_DATE_MONTHS.toString()) );
user.setProtocol_date( DateHelper.addTypeDate(DateHelper.now(), "MONTH", months) );
}*/
}
if(!user.getUser_type().equals(USER_TYPE_DTT) && StringHelper.isEmpty(user.getLogin_name())){
user.setLogin_name( generateUserName(cust.getCust_id(), user.getUser_type()) );
}
userComponent.createUser(user);
if (user.getStatus().equals(StatusConstants.ACTIVE) || user.getUser_type().equals(USER_TYPE_BAND)){
createUserJob(user, custId, doneCode);
}
return user;
}
/**
* 验证ott_mobile账户是否唯一
* @param name
* @throws Exception
*/
public void validAccount(String name) throws Exception {
boolean flag = userComponent.validAccount(name);
if(flag){
throw new ServicesException(ErrorCode.UserLoginNameIsExists);
}
}
public List<TDeviceChangeReason> queryDeviceChangeReason() throws Exception {
List<TDeviceChangeReason> list = userComponent.queryDeviceChangeReason();
for(TDeviceChangeReason reason : list){
reason.setReason_text( MemoryDict.getTransData(reason.getReason_text()) );
}
return list;
}
/**
* 用户更换设备
*/
public void saveChangeDevice(String userId, String deviceCode, String reasonType, String deviceBuyMode, FeeInfoDto deviceFee) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
CCust cust = getBusiParam().getCust();
String busiCode = getBusiParam().getBusiCode();
doneCodeComponent.lockCust(cust.getCust_id());
CUser oldUser = userComponent.queryUserById(userId);
CUser user = userComponent.queryUserById(userId);
String oldDeviceCode = user.getStb_id();
if (user.getUser_type().equals(USER_TYPE_BAND))
oldDeviceCode = user.getModem_mac();
DeviceDto oldDevice = deviceComponent.queryDeviceByDeviceCode(oldDeviceCode);
DeviceDto device = deviceComponent.queryDeviceByDeviceCode(deviceCode);
deviceComponent.checkChangeDevice(oldDevice, device);
CCustDevice oldCustDevice = custComponent.queryCustDeviceByDeviceCode(oldDeviceCode);
/*更换设备,新设备产权和购买方式与原设备一致,只是根据购买原因收费而已*/
//修改用户设备信息
setUserDeviceInfo(user, device);
userComponent.updateDevice(doneCode, user);
TDeviceChangeReason changeReason = userComponent.queryChangeReasonByType(reasonType);
if(changeReason.getIs_charge().equals(SystemConstants.BOOLEAN_TRUE)){
this.buyDevice(device, oldCustDevice.getBuy_mode(), oldDevice.getOwnership(), deviceFee, busiCode, cust, doneCode);
}else{
custComponent.addDevice(doneCode, cust.getCust_id(),
device.getDevice_id(), device.getDevice_type(), device.getDevice_code(),
device.getPairCard() ==null?null:device.getPairCard().getDevice_id(),
device.getPairCard() ==null?null:device.getPairCard().getCard_id(),
null, null,oldCustDevice.getBuy_mode());
if (device != null){
//更新设备仓库状态
deviceComponent.updateDeviceDepotStatus(doneCode, busiCode, device.getDevice_id(),
device.getDepot_status(), StatusConstants.USE, user.getStr10(), true);
if (!device.getOwnership().equals(oldDevice.getOwnership())){
deviceComponent.updateDeviceOwnership(doneCode, busiCode, device.getDevice_id(),device.getOwnership(),oldDevice.getOwnership(),user.getStr10(),true);
}
//更新设备为旧设备
if (SystemConstants.BOOLEAN_TRUE.equals(device.getUsed()))
deviceComponent.updateDeviceUsed(doneCode, busiCode, device.getDevice_id(), SystemConstants.BOOLEAN_TRUE, SystemConstants.BOOLEAN_FALSE,true);
}
}
CCustDevice newCustDevice = custComponent.queryCustDeviceByDeviceCode(deviceCode);
//保存更换原因
if(newCustDevice != null)
custComponent.saveChangeDevice(newCustDevice, changeReason.getReason_type());
if(oldCustDevice != null)
custComponent.saveChangeDevice(oldCustDevice, changeReason.getReason_type());
if(changeReason.getIs_reclaim().equals(SystemConstants.BOOLEAN_TRUE)){
deviceComponent.saveDeviceToReclaim(doneCode, busiCode, oldDevice, cust.getCust_id(), reasonType);
}
if(changeReason.getIs_lost().equals(SystemConstants.BOOLEAN_TRUE)){
deviceComponent.saveLossDevice(doneCode, busiCode, oldDeviceCode);
}
//处理授权
if (user.getUser_type().equals(USER_TYPE_OTT)){
//OTT 发变更用户信息
authComponent.sendAuth(user, null, BusiCmdConstants.CHANGE_USER, doneCode);
} else if (user.getUser_type().equals(USER_TYPE_DTT)){
//DTT新设备发开户指令
authComponent.sendAuth(user, null, BusiCmdConstants.CREAT_USER, doneCode);
//新设备发产品授权
List<CProdOrder> prodList = orderComponent.queryOrderProdByUserId(user.getUser_id());
authComponent.sendAuth(user, prodList, BusiCmdConstants.ACCTIVATE_PROD, doneCode);
//设备回收,发设备销毁指令
if(changeReason.getIs_reclaim().equals(SystemConstants.BOOLEAN_TRUE)){
authComponent.sendAuth(oldUser, null, BusiCmdConstants.DEL_USER, doneCode);
}else{
//设备不回收,旧设备发产品减指令
authComponent.sendAuth(oldUser, prodList, BusiCmdConstants.PASSVATE_PROD, doneCode);
}
}
// 设置拦截器所需要的参数
getBusiParam().resetUser();
getBusiParam().addUser(user);
saveAllPublic(doneCode, getBusiParam());
}
@Override
public void createUser(CUser user, String deviceBuyMode, FeeInfoDto deviceFee) throws Exception {
// TODO Auto-generated method stub
}
/**
* 创建客户,并且自动创建一个用户
*
* @param user_id 用户ID
* @param version OTT业务版本号
* @param user_passwd 用户密码
* @param user_name 用户名称
* @param user_rank 用户等级
* @param telephone 手机号码
* @param email 邮箱
* @throws Exception
*/
public void createOttMobileUser(String userId, String userPassword, String userName, String userRank, String telephone, String email)throws Exception{
}
@Override
public void editUser(List<CUserPropChange> propChangeList) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void saveEzdtoFzd(List<CUserPropChange> propChangeList, String prodSn, String newTariffId) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void editStb(String stbId, String cardId) throws Exception {
// TODO Auto-generated method stub
}
private void logoffUser(Integer doneCode, String busiCode, CCust cust, String userId,
Integer cancelFee, Integer refundFee) throws Exception {
String custId = cust.getCust_id();
CUser user = userComponent.queryUserById(userId);
if(user == null){
throw new ServicesException(ErrorCode.CustDataException);
}
if(!user.getCust_id().equals(custId)){
throw new ServicesException(ErrorCode.CustDataException);
}
if(user.getStatus().equals(StatusConstants.UNTUCK) || user.getStatus().equals(StatusConstants.REQSTOP)
|| user.getStatus().equals(StatusConstants.INSTALL) ){
throw new ServicesException(ErrorCode.UserStatusNotOff);
}
if(SystemConstants.BUSI_BUY_MODE_PRESENT.equals(user.getStr10()) &&
(StringHelper.isNotEmpty(user.getStb_id())||StringHelper.isNotEmpty(user.getCard_id())
|| StringHelper.isNotEmpty(user.getModem_mac()))){
throw new ServicesException(ErrorCode.UserStatusNotOff);
}
List<String> devoceList = new ArrayList<String>();
if(user.getStb_id() != null){
devoceList.add(user.getStb_id());
}
if(user.getCard_id()!=null){
devoceList.add(user.getCard_id());
}
if(user.getModem_mac() != null){
devoceList.add(user.getModem_mac());
}
List<CCustDevice> buyModeList = null;
if(devoceList.size()>0){
buyModeList = custComponent.findBuyModeById(custId, devoceList.toArray(new String[devoceList.size()]));
}
Map<String, CCustDevice> map = CollectionHelper.converToMapSingle(buyModeList, "device_code");
//销户后保存原来的设备购买方式
user.setStb_buy(map.get(user.getStb_id()) != null?map.get(user.getStb_id()).getBuy_mode():null);
user.setCard_buy(map.get(user.getCard_id()) != null?map.get(user.getCard_id()).getBuy_mode():null);
user.setModem_buy(map.get(user.getModem_mac()) != null?map.get(user.getModem_mac()).getBuy_mode():null);
//是否高级权限
boolean isHigh=orderComponent.isHighCancel(busiCode);
List<CProdOrderFee> orderFees=new ArrayList<>();
//检查数据
List<CProdOrderDto> cancelList=checkCancelProdOrderParm(orderFees,isHigh, userId, cancelFee,refundFee);
List<CProdOrderFeeOut> outList=orderComponent.getOrderFeeOutFromOrderFee(orderFees);
if(refundFee<0){
//记录未支付业务
doneCodeComponent.saveDoneCodeUnPay(custId, doneCode, this.getOptr().getOptr_id());
//保存缴费信息
feeComponent.saveCancelFee(cancelList,outList, cust, doneCode, this.getBusiParam().getBusiCode());
}
if(cancelFee-refundFee!=0){
//余额转回公用账目
acctComponent.saveCancelFeeToAcct(outList, custId, doneCode, this.getBusiParam().getBusiCode());
}
//记录费用转出记录
orderComponent.saveOrderFeeOut(outList, doneCode);
List<CProdOrder> cancelResultList=new ArrayList<>();
for(CProdOrderDto dto:cancelList){
//执行退订 返回被退订的用户订单清单
cancelResultList.addAll(orderComponent.saveCancelProdOrder(dto, doneCode));
}
authComponent.sendAuth(user, cancelResultList, BusiCmdConstants.PASSVATE_PROD, doneCode);
authComponent.sendAuth(user, cancelResultList, BusiCmdConstants.DEL_USER, doneCode);
//记录用户到历史表
userComponent.removeUserWithHis(doneCode, user);
}
@Override
public void saveRemoveUser(String userId, Integer cancelFee,Integer refundFee) throws Exception {
//获取客户用户信息
CCust cust = getBusiParam().getCust();
String custId = cust.getCust_id();
doneCodeComponent.lockCust(custId);
Integer doneCode = doneCodeComponent.gDoneCode();
logoffUser(doneCode, getBusiParam().getBusiCode(), getBusiParam().getCust(), userId, cancelFee, refundFee);
saveAllPublic(doneCode,getBusiParam());
}
private List<CProdOrderDto> checkCancelProdOrderParm(List<CProdOrderFee> orderFees,boolean isHigh,String userId,Integer cancelFee,Integer refundFee) throws Exception{
if(StringHelper.isEmpty(userId)||cancelFee==null){
throw new ServicesException(ErrorCode.ParamIsNull);
}
List<CProdOrderDto> orderList = cProdOrderDao.queryProdOrderDtoByUserId(userId);
orderFees.addAll(orderComponent.getLogoffOrderFee(orderList, isHigh));
if(refundFee==0){
for(CProdOrderDto order:orderList){
if(order.getBalance_cfee()!=null&&order.getBalance_cfee()>0){
order.setBalance_acct(order.getBalance_acct()+order.getBalance_cfee());
order.setBalance_cfee(0);
}
}
}
int fee=0;
int balance_cfee=0;
for(CProdOrderFee orderFee:orderFees){
fee=fee+orderFee.getOutput_fee();
if(orderFee.getOutput_type().equals(SystemConstants.ORDER_FEE_TYPE_CFEE)){
if(refundFee<0){
balance_cfee=balance_cfee+orderFee.getOutput_fee();
}else{
//当实际退现金=0时,退现金明细改成转账到公用账目
orderFee.setOutput_type(SystemConstants.ORDER_FEE_TYPE_ACCT);
}
}
}
//金额核对
if(cancelFee!=fee*-1){
throw new ServicesException(ErrorCode.FeeDateException);
}
if(refundFee!=balance_cfee*-1){
throw new ServicesException(ErrorCode.FeeDateException);
}
return orderList;
}
@Override
public void saveOpenInteractive(String netType, String modemMac, String password, String vodUserType,
String remainReplacoverDate) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void saveAtvToDtv(CUser user, int curMonthFee, int payFee) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void untuckUsers() throws Exception{
CCust cust = getBusiParam().getCust();
doneCodeComponent.lockCust(cust.getCust_id());
List<String> userIdList = getBusiParam().getSelectedUserIds();
String[] userIds = userIdList.toArray(new String[userIdList.size()]);
Integer doneCode = doneCodeComponent.gDoneCode();
List<CUser> users = userComponent.queryAllUserByUserIds(userIds);
if (users == null || users.size() == 0 || users.get(0) == null)
throw new ServicesException("请选择用户");
checkUntruckUsers(userIds);
List<CProdOrderDto> orderList = cProdOrderDao.queryCustEffOrderDto(cust.getCust_id());
boolean isCustPkgStop = false;
for(CUser user : users){
//清除原有未执行的预报停
removeStopByUserId(user.getUser_id());
//修改用户状态
updateUserStatus(doneCode, user.getUser_id(), user.getStatus(), StatusConstants.UNTUCK);
//修改用户订单状态为报停状态
for (CProdOrderDto order:orderList){
if (StringHelper.isNotEmpty(order.getUser_id()) && order.getUser_id().equals(user.getUser_id())){
stopProd(doneCode, order, StatusConstants.UNTUCK);
if (StringHelper.isNotEmpty(order.getPackage_sn())){
isCustPkgStop = true;
}
}
}
//生成钝化用户JOB
authComponent.sendAuth(user, null, BusiCmdConstants.PASSVATE_USER, doneCode);
//产品减授权
List<CProdOrder> prodList = orderComponent.queryOrderProdByUserId(user.getUser_id());
if(prodList.size() > 0){
authComponent.sendAuth(user, prodList, BusiCmdConstants.PASSVATE_PROD, doneCode);
}
}
if (isCustPkgStop){
//修改套餐状态
for (CProdOrderDto order:orderList){
if (!order.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){
stopProd(doneCode, order, StatusConstants.UNTUCK);
}
}
}
snTaskComponent.createWriteOffTask(doneCode, cust, users, getBusiParam().getWorkBillAsignType());
snTaskComponent.saveTaskCreateBusiExt(cust.getCust_id(), doneCode, getBusiParam());
saveAllPublic(doneCode,getBusiParam());
}
private void checkUntruckUsers(String[] userIds) throws Exception{
//获取操作的客户、用户信息
CCust cust = getBusiParam().getCust();
List<CUser> users = userComponent.queryAllUserByUserIds(userIds);
if (users == null || users.size() == 0 || users.get(0) == null)
throw new ServicesException("请选择用户");
//查找客户名下所有有效的产品
Map<String,String> packageUserIdS = new HashMap<String,String>();
List<CProdOrder> orderList = cProdOrderDao.queryCustEffOrder(users.get(0).getCust_id());
for (CProdOrder order:orderList){
if (StringHelper.isNotEmpty(order.getPackage_sn()) && StringHelper.isNotEmpty(order.getUser_id())){
packageUserIdS.put(order.getUser_id(),order.getPackage_sn());
}
}
boolean hasPkgUser = false; //销户的用户有归属于客户套餐的
boolean hasBand = false; //有宽带用户
int count=0;
for (CUser user:users){
if (!user.getStatus().equals(StatusConstants.ACTIVE)){
throw new ServicesException("用户["+user.getUser_id()+"]不是正常状态,不能拆机!");
}
if (packageUserIdS.get(user.getUser_id()) != null){
hasPkgUser =true;
count ++;
}
if (user.getUser_type().equals(USER_TYPE_BAND)){
hasBand = true;
}
}
if (hasPkgUser && (count<packageUserIdS.size())){
throw new ServicesException("归属套餐的用户必须同时拆机");
}
if(hasBand && cust.getCust_type().equals(SystemConstants.CUST_TYPE_RESIDENT)){
List<CUser> allUusers = userComponent.queryUserByCustId(cust.getCust_id());
List<String> selectUser = Arrays.asList(userIds);
for(CUser user : allUusers){
if (!user.getStatus().equals(StatusConstants.REQSTOP)){
if(!selectUser.contains(user.getUser_id())){
throw new ServicesException("宽带用户拆机,其他用户都需要拆机");
}
}
}
}
}
@Override
public void checkStopUser(String[] userIds) throws Exception{
//获取操作的客户、用户信息
List<CUser> users = userComponent.queryAllUserByUserIds(userIds);
CCust cust = custComponent.queryCustById(users.get(0).getCust_id());
if (users == null || users.size() == 0 || users.get(0) == null)
throw new ServicesException(ErrorCode.UserIsNotExists);
//查找客户名下所有有效的产品
Map<String,String> packageUserIdS = new HashMap<String,String>();
List<CProdOrder> orderList = cProdOrderDao.queryCustEffOrder(users.get(0).getCust_id());
for (CProdOrder order:orderList){
if (StringHelper.isNotEmpty(order.getPackage_sn()) && StringHelper.isNotEmpty(order.getUser_id())){
packageUserIdS.put(order.getUser_id(),order.getPackage_sn());
}
}
boolean hasPkgUser = false; //报停的用户有归属于客户套餐的
boolean hasBand = false; //有宽带用户
int count=0;
Map<Integer, CUser> map = new HashMap<Integer, CUser>();
for (CUser user:users){
if (!user.getStatus().equals(StatusConstants.ACTIVE)){
throw new ServicesException(ErrorCode.UserStatusIsNotActiveNotStop,user.getUser_id());
}
if (packageUserIdS.get(user.getUser_id()) != null){
hasPkgUser =true;
count ++;
}
if (user.getUser_type().equals(USER_TYPE_BAND)){
hasBand = true;
}
}
if (hasPkgUser && (count<packageUserIdS.size())){
throw new ServicesException(ErrorCode.PackageUserMustToOperation);
}
if(hasBand && cust.getCust_type().equals(SystemConstants.CUST_TYPE_RESIDENT)){
List<CUser> allUusers = userComponent.queryUserByCustId(cust.getCust_id());
List<String> selectUser = Arrays.asList(userIds);
for(CUser user : allUusers){
if (!user.getStatus().equals(StatusConstants.REQSTOP) && user.getUser_type().equals(USER_TYPE_OTT)
&& !selectUser.contains(user.getUser_id())){
throw new ServicesException(ErrorCode.BandUserStopOhterOttUserMustStop);
}
}
}
}
public void checkOpenUser(String[] userIds) throws Exception{
//获取操作的客户、用户信息
List<CUser> users = userComponent.queryAllUserByUserIds(userIds);
CCust cust = custComponent.queryCustById(users.get(0).getCust_id());
if (users == null || users.size() == 0 || users.get(0) == null)
throw new ServicesException(ErrorCode.UserIsNotExists);
//查找客户名下所有有效的产品
Map<String,String> packageUserIdS = new HashMap<String,String>();
List<CProdOrder> orderList = cProdOrderDao.queryCustEffOrder(users.get(0).getCust_id());
for (CProdOrder order:orderList){
if (StringHelper.isNotEmpty(order.getPackage_sn()) && StringHelper.isNotEmpty(order.getUser_id())){
packageUserIdS.put(order.getUser_id(),order.getPackage_sn());
}
}
boolean hasPkgUser = false; //报停的用户有归属于客户套餐的
boolean hasOtt = false; //有OTT用户
int count=0;
Map<Integer, CUser> map = new HashMap<Integer, CUser>();
for (CUser user:users){
if (!user.getStatus().equals(StatusConstants.REQSTOP)){
throw new ServicesException(ErrorCode.UserStatusIsNotReqstopNotOpen,user.getUser_id());
}
if (packageUserIdS.get(user.getUser_id()) != null){
hasPkgUser =true;
count ++;
}
if (user.getUser_type().equals(USER_TYPE_OTT)){
hasOtt = true;
}
}
if (hasPkgUser && (count<packageUserIdS.size())){
throw new ServicesException(ErrorCode.PackageUserMustToOperation);
}
if(hasOtt && cust.getCust_type().equals(SystemConstants.CUST_TYPE_RESIDENT)){
List<CUser> allUusers = userComponent.queryUserByCustId(cust.getCust_id());
List<String> selectUser = Arrays.asList(userIds);
for(CUser user : allUusers){
if (user.getStatus().equals(StatusConstants.REQSTOP) && user.getUser_type().equals(SystemConstants.USER_TYPE_BAND)){
if(!selectUser.contains(user.getUser_id())){
throw new ServicesException(ErrorCode.OttUserOpenOhterBandUserMustOpen);
}
}
}
}
}
public void checkCancelStop(String[] userIds,String custId) throws Exception{
//获取操作的客户、用户信息
List<CUser> users = userComponent.queryAllUserByUserIds(userIds);
CCust cust = custComponent.queryCustById(users.get(0).getCust_id());
if (users == null || users.size() == 0 || users.get(0) == null)
throw new ServicesException(ErrorCode.UserIsNotExists);
List<JUserStop> cancelUsers = jobComponent.queryStopByCustId(custId);
if(cancelUsers.size()==0){
throw new ServicesException(ErrorCode.ForecastStopUserIsNotExists);
}
List<String> cancelUser = CollectionHelper.converValueToList(cancelUsers, "user_id");
//查找客户名下所有有效的产品
Map<String,String> packageUserIdS = new HashMap<String,String>();
List<CProdOrder> orderList = cProdOrderDao.queryCustEffOrder(users.get(0).getCust_id());
for (CProdOrder order:orderList){
if (StringHelper.isNotEmpty(order.getPackage_sn()) && StringHelper.isNotEmpty(order.getUser_id())
&& cancelUser.contains(order.getUser_id())){
packageUserIdS.put(order.getUser_id(),order.getPackage_sn());
}
}
boolean hasPkgUser = false; //报停的用户有归属于客户套餐的
boolean hasOtt = false; //有OTT用户
int count=0;
for (CUser user:users){
if (packageUserIdS.get(user.getUser_id()) != null){
hasPkgUser =true;
count ++;
}
if (user.getUser_type().equals(USER_TYPE_OTT)){
hasOtt = true;
}
}
if (hasPkgUser && (count<packageUserIdS.size())){
throw new ServicesException(ErrorCode.PackageUserMustToOperation);
}
List<CUser> cancelUsersList = userComponent.queryAllUserByUserIds(cancelUser.toArray(new String[cancelUser.size()]));
if(hasOtt && cust.getCust_type().equals(SystemConstants.CUST_TYPE_RESIDENT)){
List<String> selectUser = Arrays.asList(userIds);
for(CUser user : cancelUsersList){
if (user.getUser_type().equals(SystemConstants.USER_TYPE_BAND)){
if(!selectUser.contains(user.getUser_id())){
throw new ServicesException(ErrorCode.OttUserCancelForecastStopBandUserAlso);
}
}
}
}
}
@Override
public void saveStop(String effectiveDate, int tjFee) throws Exception {
CCust cust = getBusiParam().getCust();
doneCodeComponent.lockCust(cust.getCust_id());
//获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
//获取操作的客户、用户信息
List<CUser> users = getBusiParam().getSelectedUsers();
if (effectiveDate.equals(DateHelper.getDate("-"))){
List<CProdOrderDto> orderList = cProdOrderDao.queryCustEffOrderDto(cust.getCust_id());
//当天报停
boolean isCustPkgStop = false;
for(CUser user:users){
//清除原有未执行的预报停
removeStopByUserId(user.getUser_id());
//修改用户状态
updateUserStatus(doneCode, user.getUser_id(), user.getStatus(), StatusConstants.REQSTOP);
//修改用户订单状态为报停状态
for (CProdOrderDto order:orderList){
if (StringHelper.isNotEmpty(order.getUser_id()) && order.getUser_id().equals(user.getUser_id())){
stopProd(doneCode, order, StatusConstants.REQSTOP);
if (StringHelper.isNotEmpty(order.getPackage_sn())){
isCustPkgStop = true;
}
}
}
//生成钝化用户JOB
authComponent.sendAuth(user, null, BusiCmdConstants.PASSVATE_USER, doneCode);
//产品减授权
List<CProdOrder> prodList = orderComponent.queryOrderProdByUserId(user.getUser_id());
if(prodList.size() > 0)
authComponent.sendAuth(user, prodList, BusiCmdConstants.PASSVATE_PROD, doneCode);
}
if (isCustPkgStop){
//修改套餐状态
for (CProdOrderDto order:orderList){
if (!order.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){
stopProd(doneCode, order, StatusConstants.REQSTOP);
}
}
}
} else {
getBusiParam().setBusiCode(BusiCodeConstants.USER_PRE_REQUIRE_STOP);
//预报停
for(CUser user:users){
//清除原有未执行的预报停
removeStopByUserId(user.getUser_id());
//TODO 预报停
jobComponent.createUserStopJob(doneCode, user.getUser_id(), effectiveDate);
}
}
saveAllPublic(doneCode,getBusiParam());
}
//取消预报听
@Override
public void cancelStopUser() throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
List<CUser> users = getBusiParam().getSelectedUsers();
String[] userall = CollectionHelper.converValueToArray(users, "user_id");
if(users.size()>0){
checkCancelStop(userall,getBusiParam().getCust().getCust_id());
}
jobComponent.cancelStopUser(userall);
saveAllPublic(doneCode,getBusiParam());
}
/**
* 报开,传入参数都没有用
*/
@Override
public void saveOpen(String stbId, String cardId, String modemMac, int tjFee) throws Exception {
CCust cust = getBusiParam().getCust();
doneCodeComponent.lockCust(cust.getCust_id());
//获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
//获取操作的客户、用户信息
List<CUser> users = getBusiParam().getSelectedUsers();
if(users.size()>0){
checkOpenUser(CollectionHelper.converValueToArray(users, "user_id"));
}
List<CProdOrderDto> orderList = cProdOrderDao.queryCustEffOrderDto(cust.getCust_id());
boolean isCustPkgOpen = false;
for(CUser user:users){
updateUserStatus(doneCode, user.getUser_id(), user.getStatus(), StatusConstants.ACTIVE);
//修改订单状态为正常状态,并更新到期日
Date startDate = null;
String curProdId = null;
for (CProdOrderDto order:orderList){
if (StringHelper.isNotEmpty(order.getUser_id()) && order.getUser_id().equals(user.getUser_id())){
if (curProdId == null || !order.getProd_id().equals(curProdId))
startDate = null;
startDate = openProd(doneCode, order,startDate);
if (StringHelper.isNotEmpty(order.getPackage_sn())){
isCustPkgOpen = true;
}
curProdId = order.getProd_id();
}
}
//发授权
authComponent.sendAuth(user, null, BusiCmdConstants.ACCTIVATE_USER, doneCode);
//产品的到期日可能变化了,需要重发加授权
List<CProdOrder> prodList = orderComponent.queryOrderProdByUserId(user.getUser_id());
authComponent.sendAuth(user, prodList, BusiCmdConstants.ACCTIVATE_PROD, doneCode);
}
if (isCustPkgOpen){
//修改套餐状态
Date startDate = null;
for (CProdOrderDto order:orderList){
if (!order.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){
startDate = openProd(doneCode, order,startDate);
}
}
}
saveAllPublic(doneCode,getBusiParam());
}
/**
* 指令重发
*/
@Override
public void saveResendCa() throws Exception {
List<CUser> userList = getBusiParam().getSelectedUsers();
//获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
for (CUser user:userList){
//重发加授权指令
List<CProdOrder> prodList = orderComponent.queryOrderProdByUserId(user.getUser_id());
authComponent.sendAuth(user, prodList, BusiCmdConstants.ACCTIVATE_PROD, doneCode);
}
saveAllPublic(doneCode,getBusiParam());
}
@Override
public void saveRefreshCa(String refreshType) throws Exception {
List<CUser> userList = getBusiParam().getSelectedUsers();
//获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
for (CUser user:userList){
//用户刷新
authComponent.sendAuth(user, null, BusiCmdConstants.REFRESH_TERMINAL, doneCode);
//产品指令重发
List<CProdOrder> prodList = orderComponent.queryOrderProdByUserId(user.getUser_id());
authComponent.sendAuth(user, prodList, BusiCmdConstants.ACCTIVATE_PROD, doneCode);
}
saveAllPublic(doneCode,getBusiParam());
}
public void saveBatchUpdateUserName(List<CUser> userList, String custId) throws Exception {
if(CollectionHelper.isEmpty(userList)){
return ;
}
CCust cust=custComponent.queryCustById(custId);
if(cust==null){
throw new ServicesException(ErrorCode.ParamIsNull);
}
Integer doneCode = this.doneCodeComponent.gDoneCode();
BusiParameter busiParam = getBusiParam();
CustFullInfoDto custFullInfo=new CustFullInfoDto();
custFullInfo.setCust(cust);
busiParam.setCustFullInfo(custFullInfo);
for (CUser user : userList) {
userComponent.updateUserNameByDeviceCode(user,custId);
}
busiParam.setBusiCode(BusiCodeConstants.BATCH_MOD_USER_NAME);//其他参数不需要
saveAllPublic(doneCode,busiParam);
}
@Override
public void saveEditPwd(String newLoginName, String newPwd) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
CUser selectedUser = getBusiParam().getSelectedUsers().get(0);
CUser user = queryUserById(selectedUser.getUser_id());
List<CUserPropChange> propChangeList = new ArrayList<CUserPropChange>();
CUserPropChange propChange = new CUserPropChange();
propChange.setColumn_name("password");
propChange.setOld_value(user.getPassword());
propChange.setNew_value(newPwd);
propChangeList.add(propChange);
user.setPassword(newPwd);
if(!user.getLogin_name().equals(newLoginName)){
this.validAccount(newLoginName);
propChange = new CUserPropChange();
propChange.setColumn_name("login_name");
propChange.setOld_value(user.getLogin_name());
propChange.setNew_value(newLoginName);
propChangeList.add(propChange);
user.setLogin_name(newLoginName);
List<CProdOrder> orderList = orderComponent.queryNotExpAllOrderByUser(user.getUser_id());
if(user.getUser_type().equals(USER_TYPE_BAND)){
authComponent.sendAuth(user, null, BusiCmdConstants.REFRESH_TERMINAL, doneCode);
}else{
authComponent.sendAuth(selectedUser, orderList, BusiCmdConstants.DEL_USER, doneCode);
authComponent.sendAuth(user, orderList, BusiCmdConstants.CREAT_USER, doneCode);
}
authComponent.sendAuth(user, orderList, BusiCmdConstants.ACCTIVATE_PROD, doneCode);
}else{
authComponent.sendAuth(user, null, BusiCmdConstants.CHANGE_USER, doneCode);
}
userComponent.editUser(doneCode, user.getUser_id(), propChangeList);
saveAllPublic(doneCode,getBusiParam());
}
@Override
public void saveEditConnect(int maxConn) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void saveClearBind() throws Exception {
// TODO Auto-generated method stub
}
@Override
public void saveOffLine() throws Exception {
// TODO Auto-generated method stub
}
@Override
public void savePromotion(int times, String promotionId, List<DisctFeeDto> feeList, List<PPromotionAcct> acctList)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void saveCancelPromotion(String promotionSn) throws Exception {
// TODO Auto-generated method stub
}
@Override
public List<PromotionDto> querySelectableProm() throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public PromotionDto queryPromInfoById(String custId, String userId, String promotionId) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public void saveOpenTempBatch() throws Exception {
// TODO Auto-generated method stub
}
@Override
public void saveOpenTemp() throws Exception {
// TODO Auto-generated method stub
}
@Override
public void saveRejectRes(String userId, String custId, String resIds) throws Exception {
// TODO Auto-generated method stub
}
@Override
public List<UserRes> queryValidRes(String userId) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public List<SOptr> getByDeptId(String deptId) throws JDBCException {
return userComponent.getByDeptId(deptId);
}
@Override
public Object queryStopByUsers(String userLists) throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public void saveCancelOpenInteractive() throws Exception {
// TODO Auto-generated method stub
}
@Override
public void saveEditNetType(String netType, String modemMac) throws Exception {
// TODO Auto-generated method stub
}
@Override
public TBusiFee queryZlFeeById() throws Exception {
// TODO Auto-generated method stub
return null;
}
@Override
public void saveLeaseFee(String fee_Id, String amount) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void saveAtvCustLine() throws Exception {
// TODO Auto-generated method stub
}
@Override
public void saveAtvActive() throws Exception {
// TODO Auto-generated method stub
}
@Override
public void editUserStop() throws Exception {
// TODO Auto-generated method stub
}
@Override
public void checkLoginName(String loginName) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void saveToSingleCard(String newCardId, String str4, String str5, boolean reclaim, String deviceStatus)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void saveRechargeCard(String icCard, String rechargeCard) throws Exception {
// TODO Auto-generated method stub
}
@Override
public Object createLoginName(String loginName, String county_id) {
// TODO Auto-generated method stub
return null;
}
@Override
public void saveResendUserCmd() throws Exception {
// TODO Auto-generated method stub
}
@Override
public void updateUserStatus(List<String> userIds, String userStatus) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void renewUser(String userId) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void saveChangePromotion(int times, String promotionSn, String promotionId, List<PPromotionAcct> acctList)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void saveCancelCaAuth() throws Exception {
// TODO Auto-generated method stub
}
@Override
public void saveUserInvalid() throws Exception {
// TODO Auto-generated method stub
}
public void batchLogoffUser(List<CancelUserDto> cancelUserList) throws Exception {
Integer doneCode = doneCodeComponent.gDoneCode();
CCust cust = getBusiParam().getCust();
String busiCode = getBusiParam().getBusiCode();
for(CancelUserDto cancelUser : cancelUserList){
String userId = cancelUser.getUser_id();
CUser user = userComponent.queryUserById(userId);
if(user == null){
throw new ServicesException(ErrorCode.CustDataException);
}
logoffUser(doneCode, busiCode, cust, userId, cancelUser.getActive_fee(), cancelUser.getActive_fee());
}
saveAllPublic(doneCode,getBusiParam());
}
@Override
public void editFreeUser(String userId, String prodId, String tariffId, String type, Date tariffStartDate)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void transferUsers(String toCustId) throws Exception {
// TODO Auto-generated method stub
}
/**
* 清除预报停,并且使得操作流水失效
* @param userId
* @throws Exception
*/
public void removeStopByUserId(String userId) throws Exception{
List<JUserStop> userList = jobComponent.queryStopByUserId(userId);
if(userList.size()>0){
jobComponent.removeByUserId(userId);
}
}
@Override
public List<PSpkgOpenuser> querySpkgUser(String custId,String spkgSn) throws Exception {
custComponent.checkCustSpkgSnConfirm(custId,spkgSn);
return userComponent.querySpkgUser(spkgSn);
}
@Override
public List<PSpkgOpenbusifee> querySpkgOpenFee(String spkgSn) throws Exception {
return userComponent.querySpkgOpenFee(spkgSn);
}
private void stopProd(Integer doneCode, CProdOrderDto order, String status) throws Exception {
List<CProdPropChange> changeList = new ArrayList<CProdPropChange>();
changeList.add(new CProdPropChange("status",
order.getStatus(), status));
changeList.add(new CProdPropChange("status_date",
DateHelper.dateToStr(order.getStatus_date()),DateHelper.dateToStr(new Date())));
orderComponent.editProd(doneCode,order.getOrder_sn(),changeList);
}
/**验证用户能不能报停
* 1、协议期用户不能报亭
* 2、OTT主机没有报停的情况下,副机不能报停
* 3、如果用户名下有未到期的归属客户套餐的产品,套餐下用户必须同时报停
*/
/**
* 固定的ip外挂费用信息
* @return
* @throws Exception
*/
public BusiFeeDto queryUserIpFee()throws Exception{
return feeComponent.getBusiFee(SystemConstants.USER_IP_FEE_ID);
}
/**
* 新增外挂IP
* @param user
* @throws Exception
*/
public void saveAddIpUser(CUser user) throws Exception{
CCust cust = getBusiParam().getCust();
doneCodeComponent.lockCust(cust.getCust_id());
// 获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
// 获取客户信息
List<CUserPropChange> propChangeList = new ArrayList<CUserPropChange>();
CUser oldUser = userComponent.queryUserById(user.getUser_id());
if(StringHelper.isNotEmpty(user.getStr4())){
CUserPropChange propChange = new CUserPropChange();
propChange.setColumn_name("str4");
propChange.setOld_value(oldUser.getStr4());
propChange.setNew_value(user.getStr4());
propChangeList.add(propChange);
}
if(StringHelper.isNotEmpty(user.getStr5())){
CUserPropChange propChange = new CUserPropChange();
propChange.setColumn_name("str5");
propChange.setOld_value(oldUser.getStr5());
propChange.setNew_value(user.getStr5());
propChangeList.add(propChange);
}
if(StringHelper.isNotEmpty(user.getStr6())){
CUserPropChange propChange = new CUserPropChange();
propChange.setColumn_name("str6");
propChange.setOld_value(oldUser.getStr6());
propChange.setNew_value(user.getStr6());
propChangeList.add(propChange);
}
userComponent.editUser(doneCode, getBusiParam().getSelectedUserIds().get(0), propChangeList);
// 设置拦截器所需要的参数
getBusiParam().resetUser();
CUser newUser = userComponent.queryUserById(user.getUser_id());
getBusiParam().addUser(newUser);
saveAllPublic(doneCode, getBusiParam());
}
public CProdOrderDto queryBandLastOrder(String userId)throws Exception{
return orderComponent.getBandLastOrder(userId);
}
/**
* 补收IP费用所需要的信息
* @param userId
* @return
* @throws Exception
*/
public Map<String , Object> queryIpFeeLoad(String userId)throws Exception{
Map<String , Object> map = new HashMap<String, Object>();
map.put("CProdOrder", queryBandLastOrder(userId)); //最后订单
map.put("tBusiFee", queryUserIpFee());//IP费 配置信息
return map;
}
/**
* 保存IP费用
* @throws Exception
*/
public void savePayIpFee() throws Exception{
CCust cust = getBusiParam().getCust();
doneCodeComponent.lockCust(cust.getCust_id());
// 获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
saveAllPublic(doneCode, getBusiParam());
}
@Override
public void cancelInstallTask(String taskId) throws Exception {
WTaskBaseInfo task = wTaskBaseInfoDao.findByKey(taskId);
List<WTaskBaseInfo> taskList = wTaskBaseInfoDao.queryTaskByDoneCode(task.getDone_code());
List<String> userIdList = new ArrayList<String> ();
List<WTaskUser> allUserList = new ArrayList<>();
for(WTaskBaseInfo tb:taskList){
List<WTaskUser> userList = wTaskUserDao.queryByTaskId(tb.getTask_id());
for(WTaskUser user:userList){
userIdList.add(user.getUser_id());
allUserList.add(user);
}
}
String[] userIds = userIdList.toArray(new String[userIdList.size()]);
int busiDoneCode = task.getDone_code();
// 获取业务流水
Integer doneCode = doneCodeComponent.gDoneCode();
boolean hasUnpay = false;
//find unpay busi fee
List<CFee> feeList= feeComponent.queryByBusiDoneCode(busiDoneCode);
for (CFee fee:feeList){
if (fee.getStatus().equals(StatusConstants.UNPAY)){
feeComponent.saveCancelFeeUnPay(fee, doneCode);
if (fee.getBusi_code().equals(BusiCodeConstants.FEE_EDIT)){
//作废业务
doneCodeComponent.cancelDoneCode(fee.getCreate_done_code());
}
}
}
// find pay busi fee
feeList = feeComponent.querySumFeeByDoneCode(task.getCust_id(), busiDoneCode);
for (CFee fee:feeList){
if (fee.getReal_pay()>0 && fee.getFee_type().equals(SystemConstants.FEE_TYPE_BUSI)){
feeComponent.saveBusiFee(task.getCust_id(), fee.getAddr_id(), fee.getFee_id(),
1, SystemConstants.PAY_TYPE_UNPAY, fee.getReal_pay()*-1, doneCode, busiDoneCode,
BusiCodeConstants.TASK_CANCEL,null, null);
hasUnpay = true;
}
}
// find pay device fee
List<CFeeDevice> deviceFeeList = feeComponent.queryDeviceByDoneCode(busiDoneCode);
for (CFeeDevice fee:deviceFeeList){
if (fee.getReal_pay()>0 && fee.getStatus().equals(StatusConstants.PAY)){
feeComponent.saveDeviceFee(task.getCust_id(), fee.getAddr_id(), fee.getFee_id(), null,
SystemConstants.PAY_TYPE_UNPAY, fee.getDevice_type(), fee.getDevice_id(),
fee.getDevice_code(), null, null, null, null, fee.getDevice_model(), fee.getReal_pay()*-1,
doneCode, busiDoneCode, BusiCodeConstants.TASK_CANCEL, -1);
hasUnpay = true;
}
}
//取消工单用户相关的产品订单
if(cancelInstallTaskOrder(task,userIds,doneCode)){
hasUnpay=true;
}
if (hasUnpay){
doneCodeComponent.saveDoneCodeUnPay(task.getCust_id(),doneCode , getOptr().getOptr_id());
}
//update device status to idle,write off user
//设置流水中user_id
BusiParameter parameter = getBusiParam();
List<CUser> userList = userComponent.queryUserByTaskId(taskId);
if(userList.size() > 0){
parameter.setSelectedUsers(userList);
}
for (WTaskUser user:allUserList){
if (StringHelper.isNotEmpty(user.getDevice_id())){
DeviceDto device = deviceComponent.queryDeviceByDeviceCode(user.getDevice_id());
deviceComponent.updateDeviceDepotStatus(doneCode, BusiCodeConstants.TASK_CANCEL, device.getDevice_id(),
StatusConstants.USE, StatusConstants.ACTIVE,null, true);
}
// send write off cmd
CUser cuser = userComponent.queryUserById(user.getUser_id());
if(cuser == null)
continue;
authComponent.sendAuth(cuser, null, BusiCmdConstants.DEL_USER, doneCode);
//write off user
userComponent.removeUserWithHis(doneCode, cuser);
}
//cancel task
for (WTaskBaseInfo tb:taskList){
snTaskComponent.cancelTask(doneCode, tb.getTask_id());
}
parameter.setBusiCode(BusiCodeConstants.TASK_CANCEL);
snTaskComponent.saveTaskCreateBusiExt(task.getTask_id(), task.getDone_code(), this.getBusiParam());
saveAllPublic(doneCode, getBusiParam());
}
/**
* 取消工单相关的订单
* 订单提取跟工单相关的订单,a类:所有单产品订单(退订) 、 b类:在工单创建之后订购的套餐(套餐退订)、 c类:在工单创建之前订购的套餐的相关用户子产品(子产品移除)
* 提取a和b订单的未支付费用做取消操作,并恢复被覆盖产品
* a,b如果订单费用已支付,则操作退款,退所有钱(可退的现金退款,不可退的退账户)
* c类只做移除子产品。
* @throws Exception
*/
private boolean cancelInstallTaskOrder(WTaskBaseInfo task,String[] userIds,Integer doneCode) throws Exception{
boolean hasUnpay=false;
List<CProdOrder> changeOrderList=new ArrayList<>();
//List<CFeeAcct> acctFeeList = cFeeDao.queryUserUnPayOrderFee(task.getCust_id(), userIds);
//提取a类和b类的未支付费用记录
List<CFeeAcct> acctFeeList = cFeeDao.queryTaskUserUnPayCFeeAcct(task.getCust_id(),userIds,task.getDone_code());
for(CFeeAcct feeAcct:acctFeeList){
//先取消订单修改
if(feeAcct.getBusi_code().equals(BusiCodeConstants.ORDER_EDIT)){
//回退订单修改的费用
List<CProdOrderFeeOut> outList=cProdOrderFeeOutDao.queryByDoneCodeTransFee(feeAcct.getCreate_done_code());
orderComponent.saveOrderFeeOutToBack(outList,doneCode);
//作废缴费信息
feeComponent.saveCancelFeeUnPay(feeAcct, doneCode);
//作废业务
doneCodeComponent.cancelDoneCode(feeAcct.getCreate_done_code());
}
}
for(CFeeAcct feeAcct:acctFeeList){
if(feeAcct.getReal_pay()>0&&
(feeAcct.getBusi_code().equals(BusiCodeConstants.PROD_PACKAGE_ORDER)
||feeAcct.getBusi_code().equals(BusiCodeConstants.PROD_UPGRADE)
||feeAcct.getBusi_code().equals(BusiCodeConstants.PROD_CONTINUE)
||feeAcct.getBusi_code().equals(BusiCodeConstants.PROD_SINGLE_ORDER))){
//套餐订购,续订,升级,单用户订购存在覆盖转移支付的情况,恢复被覆盖的订单
CProdOrder order=cProdOrderDao.findByKey(feeAcct.getProd_sn());
changeOrderList.addAll(orderComponent.recoverTransCancelOrder(order.getDone_code(),order.getCust_id(),doneCode));
cProdOrderFeeDao.deleteOrderFeeByOrderSn(feeAcct.getProd_sn());
//移除订单到历史表
changeOrderList.addAll(orderComponent.saveCancelProdOrder(order, doneCode));
//作废缴费信息
feeComponent.saveCancelFeeUnPay(feeAcct, doneCode);
//作废业务
doneCodeComponent.cancelDoneCode(feeAcct.getCreate_done_code());
}
}
//处理已支付的订单退款
List<CProdOrderFee> orderFeeList = cProdOrderFeeDao.queryTaskPayedOrderFeeByUser(task.getCust_id(), userIds, task.getDone_code());
for (CProdOrderFee orderFee:orderFeeList){
if (orderFee.getInput_type().equals(SystemConstants.ORDER_FEE_TYPE_CFEE) && orderFee.getFee()>0){
hasUnpay = true;
CProdOrder order = cProdOrderDao.findByKey(orderFee.getOrder_sn());
CFeeAcct fee = cFeeDao.queryAcctFeeByOrderSn(orderFee.getOrder_sn());
PayDto pay=new PayDto();
pay.setCust_id(task.getCust_id());
pay.setUser_id(order.getUser_id());
pay.setAcct_id(fee.getAcct_id());
pay.setAcctitem_id(fee.getAcctitem_id());
pay.setFee(orderFee.getFee()*-1);
pay.setPresent_fee(0);
pay.setProd_sn(orderFee.getOrder_sn());
pay.setInvalid_date(DateHelper.dateToStr(DateHelper.today().before(order.getEff_date())? order.getEff_date():DateHelper.today()));
pay.setBegin_date(DateHelper.dateToStr(order.getExp_date()));
CFeeAcct refundFee = feeComponent.saveAcctFee(task.getCust_id(), fee.getArea_id(), pay, doneCode, BusiCodeConstants.TASK_CANCEL, StatusConstants.UNPAY);
orderFee.setOutput_sn(refundFee.getFee_sn());
orderFee.setOutput_fee(orderFee.getFee());
orderFee.setOutput_type(SystemConstants.ORDER_FEE_TYPE_CFEE);
} else if (orderFee.getInput_type().equals(SystemConstants.ORDER_FEE_TYPE_ACCT) && orderFee.getFee()>0){
//账户
CAcct acct=acctComponent.queryCustAcctByCustId(task.getCust_id());
//按订单转账到公用账目中
String acctItemId=SystemConstants.ACCTITEM_PUBLIC_ID;
String acctId=acct.getAcct_id();
String acct_change_sn=acctComponent.saveAcctAddFee(task.getCust_id(), acct.getAcct_id(), acctItemId,
SystemConstants.ACCT_CHANGE_TRANS, orderFee.getFee(), orderFee.getFee_type(),
BusiCodeConstants.TASK_CANCEL, doneCode,orderFee.getRemark()).getAcct_change_sn();
orderFee.setOutput_sn(acct_change_sn);
orderFee.setOutput_fee(orderFee.getFee());
orderFee.setOutput_type(SystemConstants.ORDER_FEE_TYPE_ACCT);
//cProdOrderFeeDao.update(orderFee);
}
}
//已支付的费用转出记录
orderComponent.saveOrderFeeOut(orderComponent.getOrderFeeOutFromOrderFee(orderFeeList), doneCode);
//退订相关所有订单
List<CProdOrder> taskCancelOrders=cProdOrderDao.queryTaskCancelOrder(task.getCust_id(), userIds, task.getDone_code());
Set<String> hasDetlSet=new HashSet<String>();//已退订的产品
for(CProdOrder order:taskCancelOrders){
//先退订单产品和套餐产品
if(StringHelper.isEmpty(order.getPackage_sn())){
changeOrderList.addAll(orderComponent.saveCancelProdOrder(order, doneCode));
hasDetlSet.add(order.getOrder_sn());
}
}
for(CProdOrder order:taskCancelOrders){
//再退订套餐子产品,且对应套餐没有被退订
if(StringHelper.isNotEmpty(order.getPackage_sn())&&!hasDetlSet.contains(order.getPackage_sn())){
changeOrderList.addAll(orderComponent.saveCancelProdOrder(order, doneCode));
}
}
//移动剩余订单接续
Map<String,CUser> userMap=userComponent.queryUserMap(task.getCust_id());
orderComponent.moveOrderByCancelOrder(changeOrderList, userMap, doneCode);
//处理授权
this.authProdNoPackage(changeOrderList, userMap, doneCode);
return hasUnpay;
}
public void saveSaleDevice(String userId, String deviceModel, String deviceBuyMode, FeeInfoDto deviceFee) throws Exception{
//获取客户用户信息
CCust cust = getBusiParam().getCust();
String custId = cust.getCust_id();
doneCodeComponent.lockCust(custId);
String busiCode = getBusiParam().getBusiCode();
CUser user = userComponent.queryUserById(userId);
if(!user.getCust_id().equals(custId)){
throw new ServicesException(ErrorCode.CustDataException);
}
Integer doneCode = doneCodeComponent.gDoneCode();
//查询设备
String deviceCode = null;
if(StringHelper.isNotEmpty(user.getStb_id())){
deviceCode = user.getStb_id();
}else if(StringHelper.isNotEmpty(user.getModem_mac())){
deviceCode = user.getModem_mac();
}
DeviceDto device = deviceComponent.queryDeviceByDeviceCode(deviceCode);
if(device == null || !device.getDevice_model().equals(deviceModel)){
throw new ServicesException(ErrorCode.DeviceNotExists);
}
TDeviceBuyMode buyModeCfg = busiConfigComponent.queryBuyMode(deviceBuyMode);
if(buyModeCfg!= null && device.getOwnership().equals(SystemConstants.OWNERSHIP_GD)
&& buyModeCfg.getChange_ownship().equals(SystemConstants.BOOLEAN_TRUE)){
String newOwnerShip = SystemConstants.OWNERSHIP_CUST;
deviceComponent.updateDeviceOwnership(doneCode, busiCode, device.getDevice_id(),device.getOwnership(),newOwnerShip,deviceBuyMode,true);
}
//保存设备费用
if (deviceFee != null && deviceFee.getFee_id()!= null && deviceFee.getFee()>0){
String payType = SystemConstants.PAY_TYPE_UNPAY;
if (this.getBusiParam().getPay()!= null && this.getBusiParam().getPay().getPay_type() !=null)
payType = this.getBusiParam().getPay().getPay_type();
doneCodeComponent.saveDoneCodeUnPay(cust.getCust_id(), doneCode, getBusiParam().getOptr().getOptr_id());
feeComponent.saveDeviceFee( cust.getCust_id(), cust.getAddr_id(),deviceFee.getFee_id(),deviceFee.getFee_std_id(),
payType,device.getDevice_type(), device.getDevice_id(), device.getDevice_code(),
null,null,null,null,device.getDevice_model(),deviceFee.getFee(), doneCode,doneCode, busiCode, 1);
}
CCustDevice custDevice = custComponent.queryCustDeviceByDeviceId(device.getDevice_id());
deviceComponent.updateBuyMode(doneCode, busiCode, device.getDevice_id(),custDevice.getBuy_mode(),deviceBuyMode);
custComponent.updateDeviceBuyMode(doneCode, cust.getCust_id(), device.getDevice_id(), deviceBuyMode);
List<CUserPropChange> propChangeList = new ArrayList<CUserPropChange>();
propChangeList.add(new CUserPropChange("str10", user.getStr10(), deviceBuyMode));
userComponent.editUser(doneCode, userId, propChangeList);
saveAllPublic(doneCode, getBusiParam());
}
public void saveDeviceReclaim() throws Exception{
CCust cust = getBusiParam().getCust();
doneCodeComponent.lockCust(cust.getCust_id());
List<CUser> users = getBusiParam().getSelectedUsers();
Integer doneCode = doneCodeComponent.gDoneCode();
for(CUser user : users){
CUser cuser = userComponent.queryUserById(user.getUser_id());
//更新设备状态和仓库
String deviceId = user.getStb_id();
if(cuser.getUser_type().equals(SystemConstants.USER_TYPE_BAND)){
deviceId = user.getModem_mac();
}
DeviceDto device = deviceComponent.queryDeviceByDeviceCode(deviceId);
deviceComponent.updateDeviceDepotId(doneCode, BusiCodeConstants.DEVICE_USER_RECLAIM, device.getDevice_id(),
device.getDepot_id(), getOptr().getDept_id(),cuser.getStr10(), true);
deviceComponent.updateDeviceDepotStatus(doneCode, BusiCodeConstants.DEVICE_USER_RECLAIM, device.getDevice_id(),
device.getDepot_status(), StatusConstants.IDLE,cuser.getStr10(), true);
deviceComponent.updateDeviceOwnership(doneCode, BusiCodeConstants.DEVICE_USER_RECLAIM, device.getDevice_id(),
device.getOwnership(), SystemConstants.OWNERSHIP_GD, cuser.getStr10(), true);
//删除客户设备
custComponent.removeDevice(cust.getCust_id(), device.getDevice_id(), doneCode, SystemConstants.BOOLEAN_FALSE);
//更新用户设备信息为空
List<CUserPropChange> propChangeList = new ArrayList<CUserPropChange>();
if(StringHelper.isNotEmpty(cuser.getStb_id()))
propChangeList.add(new CUserPropChange("stb_id", cuser.getStb_id(), ""));
if(StringHelper.isNotEmpty(cuser.getCard_id()))
propChangeList.add(new CUserPropChange("card_id", cuser.getCard_id(), ""));
if(StringHelper.isNotEmpty(cuser.getModem_mac()))
propChangeList.add(new CUserPropChange("modem_mac", cuser.getModem_mac(), ""));
// propChangeList.add(new CUserPropChange("status", cuser.getStatus(), StatusConstants.UNTUCKEND));
// propChangeList.add(new CUserPropChange("status_date", DateHelper.dateToStr(cuser.getStatus_date()),DateHelper.dateToStr(new Date())));
userComponent.editUser(doneCode, user.getUser_id(), propChangeList);
authComponent.sendAuth(cuser, null, BusiCmdConstants.DEL_USER, doneCode);
}
saveAllPublic(doneCode, getBusiParam());
}
}