/** * */ package com.ycsoft.business.service.impl; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.ycsoft.beans.core.acct.CAcct; import com.ycsoft.beans.core.acct.CAcctAcctitem; import com.ycsoft.beans.core.acct.CAcctAcctitemInactive; import com.ycsoft.beans.core.bill.BBill; import com.ycsoft.beans.core.cust.CCust; import com.ycsoft.beans.core.job.JCaCommand; import com.ycsoft.beans.core.prod.CProd; import com.ycsoft.beans.core.prod.CProdPropChange; import com.ycsoft.beans.core.user.CUser; import com.ycsoft.beans.core.user.CUserAtv; import com.ycsoft.beans.core.user.CUserBroadband; import com.ycsoft.beans.core.user.CUserDtv; import com.ycsoft.beans.core.user.CUserStb; import com.ycsoft.beans.prod.PPackageProd; import com.ycsoft.beans.prod.PProd; import com.ycsoft.beans.prod.PProdTariff; import com.ycsoft.beans.prod.PProdTariffDisct; import com.ycsoft.beans.prod.PProdUserRes; import com.ycsoft.beans.prod.PRes; import com.ycsoft.business.commons.pojo.BusiParameter; import com.ycsoft.business.component.config.ExpressionUtil; import com.ycsoft.business.dto.core.acct.AcctAcctitemActiveDto; import com.ycsoft.business.dto.core.acct.AcctAcctitemChangeDto; import com.ycsoft.business.dto.core.acct.AcctitemDto; import com.ycsoft.business.dto.core.cust.CustFullInfoDto; import com.ycsoft.business.dto.core.prod.CProdBacthDto; import com.ycsoft.business.dto.core.prod.CProdDto; import com.ycsoft.business.dto.core.prod.PProdDto; import com.ycsoft.business.dto.core.prod.ProdDictDto; import com.ycsoft.business.dto.core.prod.ProdListDto; import com.ycsoft.business.dto.core.prod.ProdResDto; import com.ycsoft.business.dto.core.prod.ProdTariffDto; import com.ycsoft.business.dto.core.prod.ResGroupDto; import com.ycsoft.business.dto.core.user.UserDto; import com.ycsoft.business.dto.core.user.UserProdRscDto; import com.ycsoft.business.service.IUserProdService; import com.ycsoft.commons.constants.BusiCmdConstants; import com.ycsoft.commons.constants.BusiCodeConstants; import com.ycsoft.commons.constants.DictKey; import com.ycsoft.commons.constants.StatusConstants; import com.ycsoft.commons.constants.SystemConstants; import com.ycsoft.commons.exception.ComponentException; 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.commons.store.TemplateConfig.Template; import com.ycsoft.daos.core.JDBCException; import com.ycsoft.daos.core.Pager; /** * @author YC-SOFT * */ //@Service public class UserProdService extends BaseBusiService implements IUserProdService { private ExpressionUtil expressionUtil; public void saveOrder(String prodId, String tariffId, String feeDate, List<UserProdRscDto> dynamicRscList, String expDate, Date preOpenTime,String isBankPay) throws ServicesException { try{ Integer doneCode = doneCodeComponent.gDoneCode(); saveOrderBaseList(getBusiParam().getSelectedUsers(),doneCode,prodId,tariffId,feeDate,expDate,dynamicRscList,SystemConstants.PROD_ORDER_TYPE_ORDER,preOpenTime,isBankPay); List<ProdListDto> prodList = new ArrayList<ProdListDto>(); ProdListDto dto = new ProdListDto(); dto.setProdId(prodId); dto.setTariffId(tariffId); dto.setIsBankPay(isBankPay); prodList.add(dto); saveOrderProdDoneInfo(doneCode, prodList); saveAllPublic(doneCode,getBusiParam()); }catch (Exception e) { throw new ServicesException(e); } } /** * 提供给外部借口使用,没有预开通日期这个参数. * @param prodId * @param tariffId * @param feeDate * @param dynamicRscList * @param expDate */ public void saveOrder(String prodId, String tariffId, String feeDate, List<UserProdRscDto> dynamicRscList, String expDate) throws Exception { Date preOpenTime = null; String isBankPay = SystemConstants.BOOLEAN_FALSE; saveOrder(prodId, tariffId, feeDate, dynamicRscList, expDate,preOpenTime,isBankPay); } public void saveOrderList(String pordLists) throws Exception { List<ProdListDto> prodList = null; if(StringHelper.isNotEmpty(pordLists)){ Type type = new TypeToken<List<ProdListDto>>(){}.getType(); prodList = JsonHelper.gson.fromJson( pordLists , type); } Integer doneCode = doneCodeComponent.gDoneCode(); List<ProdListDto> pldList = new ArrayList<ProdListDto>(); for(ProdListDto dto:prodList){ List<UserProdRscDto> dyResList = null; if(StringHelper.isNotEmpty(dto.getDynamicRscList())){ Type type = new TypeToken<List<UserProdRscDto>>(){}.getType(); Gson gson = new Gson(); dyResList = gson.fromJson(dto.getDynamicRscList(), type); } ProdListDto pld = new ProdListDto(); pld.setProdId(dto.getProdId()); pld.setTariffId(dto.getTariffId()); pld.setIsBankPay(dto.getIsBankPay()); pldList.add(pld); saveOrderBaseList(getBusiParam().getSelectedUsers(),doneCode, dto.getProdId(), dto.getTariffId(), dto .getFeeDate(), dto.getExpDate(), dyResList,SystemConstants.PROD_ORDER_TYPE_ORDER,dto.getPreOpenTime(),dto.getIsBankPay()); } saveOrderProdDoneInfo(doneCode, pldList); saveAllPublic(doneCode,getBusiParam()); } public void saveBatchOrder(List<String> userIdList, String prodId, String tariffId, String feeDate, List<UserProdRscDto> dynamicRscList, String expDate) throws Exception { // BusiParameter parameter = getBusiParam(); // //操作员所在县市是否必须订购基本包 // String needBaseProd = userProdComponent.queryTemplateConfig(Template.NEED_BASE_PROD.toString()); // for(String userId : userIdList){ // UserDto user = userComponent.queryUserById(userId); // if(user == null){ // throw new ServicesException("用户不存在,用户ID: " + userId); // } // // //用户是否订购基本包 // if(SystemConstants.BOOLEAN_TRUE.equals(needBaseProd)){ // List<CProdDto> orderProdList = userProdComponent.queryByUserId(userId); // if( orderProdList.size() == 0){ // throw new ServicesException("用户没订购基本包,用户ID: " + userId); // } // } // // expressionUtil.setCuser(user); // //产品已订购 // CProd cprod = expressionUtil.orderPord(prodId); // if(cprod != null){ // throw new ServicesException("产品 "+cprod.getProd_name()+" 已订购,用户ID: " + userId); // } // // PProd prod = prodComponent.queryById(prodId); // if(prod.getServ_id().equals(SystemConstants.PROD_SERV_ID_ITV)){ // if (!user.getUser_type().equals(SystemConstants.USER_TYPE_DTV) // || user.getServ_type().equals( // SystemConstants.DTV_SERV_TYPE_SINGLE)) { // throw new ServicesException("产品服务编号和用户类型不匹配,产品为数字双向产品,用户类型为"+user.getUser_type_text()+",用户ID: " + userId); // } // }else{ // if(!prod.getServ_id().equals(user.getUser_type())){ // throw new ServicesException("产品服务编号和用户类型不匹配,用户ID: " + userId); // } // } // // CCust cust = custComponent.queryCustById(user.getCust_id()); // expressionUtil.setCcust(cust); // // ProdTariffDto tariff = userProdComponent.queryTariffByTariffIds(new String[]{tariffId}).get(0); // //资费不适用当前用户 // if (!expressionUtil.parseBoolean(tariff.getRule_id_text())) { // throw new ServicesException("资费规则不适用,用户ID: " + userId); // } // // // List<CUser> userList = new ArrayList<CUser>(); // userList.add(user); // // CustFullInfoDto custFullInfo = new CustFullInfoDto(); // custFullInfo.setCust(cust); // parameter.setCustFullInfo(custFullInfo); // // if(user.getUser_type().equals(SystemConstants.USER_TYPE_DTV)){ // List<CUserDtv> userDtvList = new ArrayList<CUserDtv>(); // CUserDtv userDtv = new CUserDtv(); // BeanUtils.copyProperties(user, userDtv); // userDtvList.add(userDtv); // parameter.setSelectedDtvs(userDtvList); // }else if(user.getUser_type().equals(SystemConstants.USER_TYPE_ATV)){ // List<CUserAtv> userAtvList = new ArrayList<CUserAtv>(); // CUserAtv userAtv = new CUserAtv(); // BeanUtils.copyProperties(user, userAtv); // userAtvList.add(userAtv); // parameter.setSelectedAtvs(userAtvList); // }else if(user.getUser_type().equals(SystemConstants.USER_TYPE_BAND)){ // List<CUserBroadband> userBandList = new ArrayList<CUserBroadband>(); // CUserBroadband userBand = new CUserBroadband(); // BeanUtils.copyProperties(user, userBand); // userBandList.add(userBand); // parameter.setSelectedBands(userBandList); // } // // Integer doneCode = doneCodeComponent.gDoneCode(); // saveOrderBaseList(userList, doneCode, prodId, tariffId, feeDate, // expDate, dynamicRscList, SystemConstants.PROD_ORDER_TYPE_ORDER,null,SystemConstants.BOOLEAN_FALSE); // // saveAllPublic(doneCode,parameter); // } } /** * 电视营业厅订购 * @param prodId * @param tariffId * @param feeDate * @param fee */ public void saveTVOrder(String prodId, String tariffId, String feeDate, int fee) throws Exception { Integer doneCode = doneCodeComponent.gDoneCode(); String busiCode = getBusiParam().getBusiCode(); List<CUser> userList = getBusiParam().getSelectedUsers(); //保存订购 saveOrderBaseList(userList,doneCode,prodId,tariffId,feeDate,null,null,SystemConstants.PROD_ORDER_TYPE_TVORDER,null,SystemConstants.BOOLEAN_FALSE); CProd prod = userProdComponent.queryByProdId(userList.get(0).getUser_id(), prodId); if(prod != null){ //获取公用账目信息 CAcct acct = acctComponent.queryCustAcctByCustId(prod.getCust_id()); //转账 acctTrans(prod.getCust_id(), doneCode, busiCode,acct.getAcct_id(), SystemConstants.ACCTITEM_PUBLIC_ID, prod.getAcct_id(), prodId, fee); //创建销帐任务 jobComponent.createCustWriteOffJob(doneCode, prod.getCust_id(),SystemConstants.BOOLEAN_TRUE); jobComponent.createAcctModeCalJob(doneCode, prod.getCust_id()); prod = userProdComponent.queryByProdSn(prod.getProd_sn()); //修改失效日期 userProdComponent.updateExpDate(doneCode, prod.getProd_sn(),DateHelper.dateToStr(prod.getInvalid_date())); //保存订购信息 userProdComponent.saveOrderInfo(prod.getUser_id(),prodId,tariffId,fee); } saveAllPublic(doneCode,getBusiParam()); } public void saveOrderBaseList(List<CUser> userList,Integer doneCode, String prodId, String tariffId, String feeDate, String expDate, List<UserProdRscDto> dynamicRscList,String orderType, Date preOpenTime,String isBankPay) throws Exception { // //获取客户用户信息 // CCust cust = getBusiParam().getCust(); // //List<CUser> userList = getBusiParam().getSelectedUsers(); // //获取业务流水 // String busiCode = getBusiParam().getBusiCode(); // // //根据产品和资费id获取产品和资费的基本信息 // PProd prod = prodComponent.queryProdById(prodId); // PProdTariff tariff = prodComponent.queryTariffById(tariffId); // List<PProdUserRes> userResList = prodComponent.queryUserResByCountyId(); // //判断产品是否按到期日停机 // String stopByInvlaidDate = prodComponent.stopByInvaliddate(prod, tariff); // //计算免费天数 // int freeAmount = DateHelper.getDifferDays(DateHelper.getDate("-"), feeDate); // //判断产品是套餐还是基本产品,如果是套餐先保存套餐信息,再将套餐包含的子产品 // List<PPackageProd> packageProdList = null; // if (prod.isPkg()){ // packageProdList = prodComponent.queryPackageProd(prodId,tariffId); // } // // //模拟转数转的钱是否需要转回订购的产品对应的账目的标志位 // boolean needChange = false; // List<AcctAcctitemChangeDto> acctitemChangeList = null;//模拟转数转到公用账目的异动记录 // List<CUserDtv> dtvList = getBusiParam().getSelectedDtvs(); // // // List<CProdDto> cProdList = userProdComponent // .queryByUserIds(CollectionHelper.converValueToArray(dtvList, // "user_id")); // // if(null != cProdList && cProdList.size() == 0){ // acctitemChangeList = acctComponent.queryAtvToDtvAcctitemChange(cust.getCust_id()); // if(null != acctitemChangeList){ // needChange = true; // } // } // // List<CAcctAcctitem> acctItemList = new ArrayList<CAcctAcctitem>(); // List<String> custIdList = new ArrayList<String>(); // //如果产品是基本产品,则直接保存产品信息 // //保存产品时需要判断产品是否有对应的动态资源,如果有则保存产品对应的动态资源 // String sn = null; // for (CUser user:userList){ // if (prod.isPkg()){ // sn = userProdComponent.addPackage(doneCode,cust.getCust_id(), user.getAcct_id(), user.getUser_id() // , prodId,prod.getProd_type(),orderType , feeDate, expDate, // user.getStop_type(),tariff,packageProdList,dynamicRscList,stopByInvlaidDate,prod.getIs_base(),preOpenTime,isBankPay); // // } else { // sn = userProdComponent.addProd(doneCode,cust.getCust_id(), user.getAcct_id(), user.getUser_id(), // null,null, prodId,prod.getProd_type(), orderType, feeDate, expDate, // user.getStop_type(),tariff,dynamicRscList,stopByInvlaidDate,prod.getIs_base(),preOpenTime,isBankPay); // } // expressionUtil.setCcust(cust); // expressionUtil.setCuser(user); // for (PProdUserRes userRes:userResList){ // if (userRes.getProd_id().equals(prod.getProd_id())){ // if (StringHelper.isEmpty(userRes.getRule_id_text()) // || expressionUtil.parseBoolean(userRes.getRule_id_text())){ // String[] res = userRes.getRes_id().split(","); // for (String resId:res){ // userProdComponent.addUserProdres(sn, resId); // } // } // } // } // //// if (freeAmount>0){ //// userProdComponent.addProdRscAcct(doneCode, sn, SystemConstants.BILLING_TYPE_DAY,freeAmount); //// } // // /* // if(needChange){//需要从公用账目转到新订购产品创建的账目 // acctTrans(cust.getCust_id(), doneCode, busiCode, acctitemChange.getAcct_id(), acctitemChange.getAcctitem_id(), acctitem.getAcct_id(), acctitem.getAcctitem_id(), acctitemChange.getChange_fee()); // needChange = false; // }*/ // // //为新订购的产品创建账目 // CAcctAcctitem acctitem = acctComponent.createAcctItem(user.getAcct_id(), prod.getProd_id()); // if(needChange){ // for(AcctAcctitemChangeDto acctitemChange : acctitemChangeList){ // if(acctitemChange.getUser_id().equals(user.getUser_id())){ // acctTrans(cust.getCust_id(), doneCode, busiCode, // acctitemChange.getAcct_id(), acctitemChange // .getAcctitem_id(), acctitem // .getAcct_id(), acctitem // .getAcctitem_id(), acctitemChange // .getChange_fee()); // } // } // } // // //数字电视订购基本包时,查询是否有回退订购,账目异动作废金额小于零 // if (prod.getIs_base().equals(SystemConstants.BOOLEAN_TRUE) // && prod.getServ_id().equals(SystemConstants.USER_TYPE_DTV)) { // AcctAcctitemChangeDto changeDto = acctComponent // .queryOrderZFAcctitemChange(user.getUser_id(), cust.getCust_id()); // if(null != changeDto){ // int changeFee = changeDto.getChange_fee()*-1; // int refundBalance = 0; // int transBalance = 0; // if(prod.getRefund().equals(SystemConstants.BOOLEAN_TRUE)){ // refundBalance = changeFee; // } // if(prod.getTrans().equals(SystemConstants.BOOLEAN_TRUE)){ // transBalance = changeFee; // } // acctComponent.updateActiveBanlance(acctitem.getAcct_id(), // acctitem.getAcctitem_id(), changeFee, 0, refundBalance, // transBalance); // } // } // //// modify after compare // // // if(null != preOpenTime){//如果预开通不为空,则产品状态设置为 预开通 ,不发授权开通指令(数字和宽带),并生成预开通JOB等待执行 // //生成预开通JOB等待执行 // jobComponent.createPreAuthCmdJob(doneCode,sn,preOpenTime,user.getArea_id(),user.getCounty_id()); // }else{ // if(busiCode.equals(BusiCodeConstants.BATCH_PROD_ORDER)){ // //批量订购产品 授权等级为20 // jobComponent.createBusiCmdJob(doneCode, // BusiCmdConstants.ACCTIVATE_PROD, cust.getCust_id(), // user.getUser_id(), user.getStb_id(), user.getCard_id(), // user.getModem_mac(), sn, prod.getProd_id(), null, // SystemConstants.PRIORITY_DSSQ); // }else{ // jobComponent.createBusiCmdJob(doneCode, // BusiCmdConstants.ACCTIVATE_PROD, cust.getCust_id(), // user.getUser_id(), user.getStb_id(), user.getCard_id(), // user.getModem_mac(), sn, prod.getProd_id()); // } // } // // acctItemList.add(acctitem); // // String custId = user.getCust_id(); // if(StringHelper.isNotEmpty(custId) && !custIdList.contains(custId)){ // custIdList.add(custId); // } // // } // if(needChange)needChange = false; // jobComponent.createCreditCalJob(doneCode, cust.getCust_id(), acctItemList,SystemConstants.BOOLEAN_FALSE); // // if(custIdList.size() > 0){ // String[] custIds = custIdList.toArray(new String[custIdList.size()]); // jobComponent.createAcctModeCalJobByCustIds(doneCode, custIds); // jobComponent.createInvalidCalJobByCustIds(doneCode, custIds); // } } public void saveOrderCustPkg(String prodId, String tariffId, String feeDate,String stopType,String[] prodSns) throws Exception{ //获取客户用户信息 CCust cust = getBusiParam().getCust(); CAcct acct = acctComponent.queryCustAcctByCustId(cust.getCust_id()); //获取业务流水 Integer doneCode = doneCodeComponent.gDoneCode(); String busiCode = getBusiParam().getBusiCode(); String custId = getBusiParam().getCust().getCust_id(); //根据产品和资费id获取产品和资费的基本信息 PProd prod = prodComponent.queryProdById(prodId); PProdTariff tariff = prodComponent.queryTariffById(tariffId); //计算免费天数 // int freeAmount = DateHelper.getDifferDays(DateHelper.getDate("-"), feeDate); String stopByInvlaidDate = prodComponent.stopByInvaliddate(prod, tariff); String sn = userProdComponent.addProd(doneCode,cust.getCust_id(), acct.getAcct_id(), null, null,null, prodId,prod.getProd_type(), SystemConstants.PROD_ORDER_TYPE_ORDER, feeDate, null,stopType, tariff,null,stopByInvlaidDate,prod.getIs_base(),null,SystemConstants.BOOLEAN_FALSE); // // if (freeAmount>0){ // userProdComponent.addProdRscAcct(doneCode, sn, SystemConstants.BILLING_TYPE_DAY,freeAmount); // } //为新订购的产品创建账目 acctComponent.createAcctItem(acct.getAcct_id(), prod.getProd_id()); //更新用户产品信息 for (String prodSn:prodSns){ addProdToPkg(doneCode, prod.getProd_id(), sn, prodSn); CProd cprod = userProdComponent.queryByProdSn(prodSn); CUser user = userComponent.queryUserById(cprod.getUser_id()); recoverUserStatus(user, doneCode); //单产品属于客户套餐时,到期日为客户套餐到期日加本身账目余额的到期日 // userProdComponent.updateInvalidDate(doneCode, prodSn, DateHelper.strToDate(feeDate)); // //将产品对应的账目余额转入套餐账目 // CAcctAcctitem acctItem = acctComponent.queryAcctItemByAcctitemId(cProd.getAcct_id(), cProd.getProd_id()); // acctTrans(cust.getCust_id(), doneCode, busiCode,cProd.getAcct_id(), cProd.getProd_id(), acct.getAcct_id(), prod.getProd_id(), acctItem.getCan_trans_balance()); // //删除用户产品对应的账目 // acctComponent.removeAcctItemWithoutHis(cProd.getAcct_id(), cProd.getProd_id()); } jobComponent.createCustWriteOffJob(doneCode, custId, SystemConstants.BOOLEAN_TRUE); jobComponent.createAcctModeCalJob(doneCode, custId); jobComponent.createInvalidCalJob(doneCode, custId); saveAllPublic(doneCode,getBusiParam()); } private String terminate(Integer doneCode, String[] prodSns, String banlanceDealType, String transAcctId, String transAcctItemId) throws Exception { //获取客户用户信息 String custId = getBusiParam().getCust().getCust_id(); CUser user = getBusiParam().getSelectedUsers().get(0); //获取业务流水 String busiCode = getBusiParam().getBusiCode(); String busiInfo = ""; //生成销帐任务 int jobId = jobComponent.createCustWriteOffJob(doneCode, custId,SystemConstants.BOOLEAN_TRUE); //终止产品 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); for (String prodSn:prodSns){ CProd prod = userProdComponent.queryByProdSn(prodSn); PProd p = userProdComponent.queryByProdId(prod.getProd_id()); prod.setProd_name(p.getProd_name()); List<ProdTariffDto> tariffs = userProdComponent.queryTariffByTariffIds(new String[]{prod.getTariff_id()}); Map<String, Object> map = new HashMap<String, Object>(); map.put("prod_name", p.getProd_name()); if(CollectionHelper.isNotEmpty(tariffs)){ map.put("tariff_name", tariffs.get(0).getTariff_name()); } list.add(map); terminateProd(custId,user, doneCode, busiCode, prod, banlanceDealType, transAcctId, transAcctItemId); //保存需要终止的账目 jobComponent.terminateAcct(jobId, prod.getAcct_id(), prod.getProd_id(),doneCode); } getBusiParam().getBusiConfirmParamInfo().put("prod_list", list); getBusiParam().getBusiConfirmParamInfo().put("user", user); doneCodeComponent.saveDoneCodeInfo(doneCode, custId, user.getUser_id(), getBusiParam().getBusiConfirmParamInfo()); return busiInfo; } /** * 终止产品 * @param prodSns * @param banlanceDealType * @throws Exception * 20120401 by wang 退订时候,如何是套餐缴费的话,记录套餐信息 */ public void saveTerminate(String[] prodSns,String banlanceDealType,String transAcctId,String transAcctItemId,String promFeeSn) throws Exception{ Integer doneCode = doneCodeComponent.gDoneCode(); if(StringHelper.isNotEmpty(promFeeSn)){ CAcctAcctitem acctItem = new CAcctAcctitem(); //获取账目信息 if(StringHelper.isNotEmpty(transAcctId) && StringHelper.isNotEmpty(transAcctItemId)){ acctItem = acctComponent.queryAcctItemByAcctitemId(transAcctId,transAcctItemId); } userProdComponent.savePromProdRefund(promFeeSn, prodSns, doneCode,acctItem.getCan_refund_balance()); } terminate(doneCode, prodSns, banlanceDealType, transAcctId, transAcctItemId); jobComponent.createAcctModeCalJob(doneCode, getBusiParam().getCust().getCust_id()); //账务模式,重新计算到期日 jobComponent.createInvalidCalJob(doneCode, getBusiParam().getCust().getCust_id()); // saveAllPublic(doneCode,getBusiParam(),busiInfo); saveAllPublic(doneCode,getBusiParam()); } public void changeBandProd(String prodId, String tariffId, String feeDate, String expDate, String oldProdSn, int presentFee) throws Exception { // Integer doneCode = doneCodeComponent.gDoneCode(); // String custId = getBusiParam().getCust().getCust_id(); // // CProd oldProd = userProdComponent.queryByProdSn(oldProdSn); //原产品 // CUser user = userComponent.queryUserById(oldProd.getUser_id()); //前台用户记录有时未选中 UserPanel // List<CUserBroadband> userBandList = new ArrayList<CUserBroadband>(); // CUserBroadband userBand = new CUserBroadband(); // BeanUtils.copyProperties(user, userBand); // userBandList.add(userBand); // //getBusiParam().setSelectedBands(userBandList); // // Map<String, Object> bu = new HashMap<String, Object>(); // bu.put("net_type", userBand.getNet_type_text()); // bu.put("login_name", userBand.getLogin_name()); // bu.put("modem_mac", userBand.getModem_mac()); // bu.put("bind_type", userBand.getBind_type_text()); // // getBusiParam().setBusiConfirmParam("bandUser", bu); // /*原资费相关信息*/ // String oldProdId = oldProd.getProd_id(); // List<AcctAcctitemActiveDto> oldAcctItemActiveList = acctComponent.queryActiveById(user.getAcct_id(), oldProdId); // CAcctAcctitem oldAcctItem = acctComponent.queryAcctItemByAcctitemId(user.getAcct_id(), oldProdId); // PProdTariff oldTariff = userProdComponent.queryProdTariffById(oldProd.getTariff_id()); // List<CAcctAcctitemInactive> oldInactiveList = acctComponent.queryInactive(user.getAcct_id(), oldProdId); // PProd oldP = userProdComponent.queryByProdId(oldProdId); // Map<String, String> oldMap = new HashMap<String, String>(); // oldMap.put("prod_name", oldP.getProd_name()); // oldMap.put("tariff_name", oldTariff.getTariff_name()); // getBusiParam().setBusiConfirmParam("old_prod", oldMap); // // // //订购新产品 // saveOrderBaseList(getBusiParam().getSelectedUsers(),doneCode,prodId,tariffId,feeDate,expDate,null,SystemConstants.PROD_ORDER_TYPE_ORDER,null,SystemConstants.BOOLEAN_FALSE); // // /*新资费相关信息*/ // CAcctAcctitem newAcctItem = acctComponent.queryAcctItemByAcctitemId(user.getAcct_id(), prodId); // CProd newProd = userProdComponent.queryByAcctItem(user.getAcct_id(), prodId); // PProdTariff newTariff = userProdComponent.queryProdTariffById(tariffId); // Map<String, Object> newMap = new HashMap<String, Object>(); // PProd newP = userProdComponent.queryByProdId(prodId); // newMap.put("prod_name", newP.getProd_name()); // newMap.put("tariff_name", newTariff.getTariff_name()); // String prod_desc = newP.getProd_desc(); // prod_desc = StringHelper.isEmpty(prod_desc) ? "":prod_desc; // prod_desc = prod_desc.replaceAll("\n", "</br>").replaceAll("\r", "").replaceAll("\"", "") ; // int times = ( prod_desc.length() / 64 ) + ( prod_desc.length() % 64 > 0 ? 1: 0 ); // List<String> prod_descs = new ArrayList<String>(); // for(int index =0;index<times;index++){ // int start = index * 64; // int limit = start + 64; // limit = limit > prod_desc.length() ? prod_desc.length() : limit; // String sub = prod_desc.substring(start,limit ); // prod_descs.add(sub); // } // newMap.put("prod_desc", prod_desc); // newMap.put("prod_descs", prod_descs); // getBusiParam().setBusiConfirmParam("new_prod", newMap); // doneCodeComponent.saveDoneCodeInfo(doneCode, custId, user.getUser_id(), getBusiParam().getBusiConfirmParamInfo()); // //非现金余额赠送 现金余额 // int activeUnCashBalance = 0, activeCashBalance = 0, transFee = 0, cashNoTransFee = 0, realBill = 0, inactiveFee = 0; // // for(AcctAcctitemActiveDto active : oldAcctItemActiveList){ // if(active.getIs_cash().equals(SystemConstants.BOOLEAN_FALSE)){ // activeUnCashBalance += active.getBalance().intValue(); // }else{ // activeCashBalance += active.getBalance().intValue(); // } // // //不是现金金额且能转账的,需要扣除,因为退订时已经转账过去了 // if(active.getIs_cash().equals(SystemConstants.BOOLEAN_FALSE) // && active.getCan_trans().equals(SystemConstants.BOOLEAN_TRUE)){ // transFee += active.getBalance().intValue(); // } // // //现金且不能转账的,赠送进新账目中 // if(active.getIs_cash().equals(SystemConstants.BOOLEAN_TRUE) // && active.getCan_trans().equals(SystemConstants.BOOLEAN_FALSE)){ // cashNoTransFee += active.getBalance().intValue(); // } // } // realBill = oldAcctItem.getReal_bill().intValue(); //原产品本月费用 // //// if(activeCashBalance > 0 && activeUnCashBalance == 0){ //只有现金余额 //// //有现金余额,原账目本月费用已除去,其余金额已作可转余额转到新账目中 //// realBill = 0; //// } // // for(CAcctAcctitemInactive inactive : oldInactiveList){ // inactiveFee += inactive.getBalance().intValue(); // } // // //presentFee 根据资费不同,赠送金额 // int activeBalance = activeUnCashBalance + inactiveFee - transFee + cashNoTransFee; // if(realBill>0){ // if(activeCashBalance>realBill) // activeCashBalance-=realBill; // else{ // activeCashBalance=0; // activeBalance-=realBill; // } // if(activeBalance<0) // throw new ComponentException("请先付清原欠费金额!"); // } // activeBalance+=presentFee; // if(activeBalance > 0){ // acctComponent.changeAcctItemBanlance(doneCode, BusiCodeConstants.BAND_CHANG_PROD, newProd.getCust_id(), // newProd.getAcct_id(), newProd.getProd_id(), SystemConstants.ACCT_CHANGE_TRANS, SystemConstants.ACCT_FEETYPE_PRESENT, // activeBalance, null); // // }else{ // //创建欠费账单 // String billingCycle = DateHelper.format(new Date(), DateHelper.FORMAT_YM); // billComponent.createBill(newProd, doneCode, billingCycle, // activeBalance * -1, activeBalance * -1, SystemConstants.BILL_COME_FROM_AUTO); // acctComponent.changeAcctItemOwefee(false, user.getAcct_id(), prodId, activeBalance * -1); // } // //原现金转入新账户 // if(activeCashBalance>0) // acctComponent.changeAcctItemBanlance(doneCode, BusiCodeConstants.BAND_CHANG_PROD, // newProd.getCust_id(), newProd.getAcct_id(), newProd.getProd_id(), // SystemConstants.ACCT_CHANGE_PAY , SystemConstants.ACCT_FEETYPE_CASH, activeCashBalance, null); // // //作废原账目欠费账单 // if(oldAcctItem.getReal_balance().intValue() < 0 // && oldAcctItem.getOrder_balance().intValue() < oldAcctItem.getReal_balance().intValue() * -1){ // List<BBill> oweBillList = billComponent.queryOweBillByProdSn(oldProdSn); // for(BBill bill : oweBillList){ // billComponent.cancelBill(bill.getBill_sn()); // } // } // /*if(oldTariff.getBilling_cycle()>1 && newTariff.getBilling_cycle()>1){ // billComponent.updateBillInfo(oldProdSn, newProd.getProd_sn(), newProd.getTariff_id(), // newProd.getAcct_id(), newProd.getProd_id()); // newAcctItem = acctComponent.queryAcctItemByAcctitemId(newProd.getAcct_id(), newProd.getProd_id()); // int balance = newAcctItem.getActive_balance() + oldAcctItem.getActive_balance(); // int oweFee = balance > newTariff.getRent() ? newTariff.getRent() : balance; // acctComponent.changeAcctItemOwefee(true, newProd.getAcct_id(), newProd.getProd_id(), oweFee); // }*/ // // //退订原产品,将余额转账到新产品中 // terminate(doneCode, new String[] { oldProdSn }, // SystemConstants.ACCT_BALANCE_TRANS, newAcctItem.getAcct_id(), // newAcctItem.getAcctitem_id()); // // if(newTariff.getBilling_cycle() > 1){ // //修改新资费产品到期日和原资费产品到期日一样 // userProdComponent.updateInvalidDate(doneCode, newProd.getProd_sn(), oldProd.getInvalid_date()); // newAcctItem = acctComponent.queryAcctItemByAcctitemId(newProd.getAcct_id(), newProd.getProd_id()); // //作废原有账单 // billComponent.cancelBill(oldProd.getProd_sn(), DateHelper.nowYearMonth()); //// if(oldTariff.getBilling_cycle() == 1){ // //出账剩下还未出账的所有余额 // int balance = newAcctItem.getActive_balance() - newAcctItem.getOwe_fee(); // // if(balance>0){ // int monthCycles=balance/newTariff.getRent(); // if(monthCycles>0){ // throw new ComponentException("数据异常,请与管理员联系"); // } // int monthFee = newTariff.getRent()/newTariff.getBilling_cycle(); // //余额小于月租,将金额累加到当前未出帐账单上 // if(balance < monthFee && oldTariff.getBilling_cycle() == 1){ // billComponent.updateMuchBill(newProd.getProd_sn(), balance, DateHelper.nowYearMonth()); // acctComponent.changeAcctItemOwefee(true, newAcctItem.getAcct_id(), newAcctItem.getAcctitem_id(), balance); // }else{ // int oweFee = balance; // Date invalidDate = newProd.getInvalid_date(); // monthFee=(int)(newTariff.getRent()*1.0/newTariff.getBilling_cycle()); // int monthIndex = 0; // while(balance>0){ // int billFee = monthFee; // //按到期日来判断开始账单的账期 // String billingCycle = DateHelper.format(DateHelper.getNextMonthByNum(invalidDate,monthIndex), DateHelper.FORMAT_YM); // if(monthFee >= balance){ // billFee = balance; // balance = 0; // }else{ // balance = balance - billFee; // } // billComponent.createBill(newProd, doneCode, billingCycle, billFee, billFee, SystemConstants.BILL_COME_FROM_MUCH); // monthIndex++; // } // acctComponent.changeAcctItemOwefee(true, newAcctItem.getAcct_id(), newAcctItem.getAcctitem_id(), oweFee); // } // } // } // userProdComponent.updateInvalidDate(doneCode, newProd.getProd_sn(),0, activeUnCashBalance+activeCashBalance, null); // // acctComponent.saveBandUpgradeInfo(doneCode, // BusiCodeConstants.BAND_CHANG_PROD, custId, user.getUser_id(), // newAcctItem.getAcct_id(), oldProd.getProd_id(), prodId, oldProd.getTariff_id(), // tariffId, oldAcctItem, oldAcctItemActiveList, inactiveFee+presentFee); // // jobComponent.createCreditCalJob(doneCode, custId, null, SystemConstants.BOOLEAN_TRUE); // jobComponent.createCustWriteOffJob(doneCode, custId, SystemConstants.BOOLEAN_TRUE); // jobComponent.createCreditExecJob(doneCode, custId); // jobComponent.createInvalidCalJob(doneCode, custId); // jobComponent.createAcctModeCalJob(doneCode, custId); // // saveAllPublic(doneCode,getBusiParam()); } public void changeProdDynRes(String prodSn,List<UserProdRscDto> dyResList) throws Exception { // Integer doneCode = doneCodeComponent.gDoneCode(); // String custId = getBusiParam().getCust().getCust_id(); // // CProd prod = userProdComponent.queryByProdSn(prodSn); // UserDto user = userComponent.queryUserById(prod.getUser_id()); // // //用户下除旧产品外的所有资源 // List<String> oldResIds = userProdComponent.queryResByUserId(user.getUser_id(), prod.getProd_id()); // List<String> oldProdResIds = userProdComponent.queryUserProdRes(prodSn); //旧产品资源 // //旧产品资源在用户下其他产品不存在,则发减授权,否则不发减授权 // for(String oldProdResId : oldProdResIds){ // boolean flag = true; // for(String oldResId : oldResIds){ // if(oldProdResId.equals(oldResId)){ // flag = false; // break; // } // } // if(flag){ // //减授权 // jobComponent.createBusiCmdJob(doneCode, BusiCmdConstants.PASSVATE_PROD, // custId, user.getUser_id(), user.getStb_id(), user.getCard_id(), // user.getModem_mac(), prod.getProd_sn(), prod.getProd_id(), // "RES_ID:''"+oldProdResId+"''"); // } // } // // //更换资源 // userProdComponent.changeProdDynRes(prodSn, dyResList); // // //加授权 // jobComponent.createBusiCmdJob(doneCode,BusiCmdConstants.ACCTIVATE_PROD, // custId, user.getUser_id(), user.getStb_id(), user.getCard_id(), // user.getModem_mac(), prod.getProd_sn(), prod.getProd_id(), // JsonHelper.fromObject(user)); // // jobComponent.createCreditCalJob(doneCode, custId, null, SystemConstants.BOOLEAN_TRUE); // // if(getBusiParam().getSelectedUserIds().size() == 0){ // if(user.getUser_type().equals(SystemConstants.USER_TYPE_ATV)){ // List<CUserAtv> userList = new ArrayList<CUserAtv>(); // CUserAtv atv = new CUserAtv(); // BeanUtils.copyProperties(user, atv); // userList.add(atv); // getBusiParam().setSelectedAtvs(userList); // }else if(user.getUser_type().equals(SystemConstants.USER_TYPE_DTV)){ // List<CUserDtv> userList = new ArrayList<CUserDtv>(); // CUserDtv dtv = new CUserDtv(); // BeanUtils.copyProperties(user, dtv); // userList.add(dtv); // getBusiParam().setSelectedDtvs(userList); // }else if(user.getUser_type().equals(SystemConstants.USER_TYPE_BAND)){ // List<CUserBroadband> userList = new ArrayList<CUserBroadband>(); // CUserBroadband band = new CUserBroadband(); // BeanUtils.copyProperties(user, band); // userList.add(band); // getBusiParam().setSelectedBands(userList); // } // } // saveAllPublic(doneCode, getBusiParam()); } public void saveBatchCancel(List<String> userIdList, String prodId) throws Exception { // BusiParameter parameter = getBusiParam(); // for(String userId : userIdList){ // UserDto user = userComponent.queryUserById(userId); // if(user == null){ // throw new ServicesException("用户不存在,用户ID: " + userId); // } // // expressionUtil.setCuser(user); // CProd prod = expressionUtil.orderPord(prodId); // if(prod == null){ // throw new ServicesException("未订购该产品,用户ID: " + userId); // } // // //如果是基本包,且用户下无其他基本包,则不能退订 // if(prod.getIs_base().equals(SystemConstants.BOOLEAN_TRUE)){ // boolean flag = true; // List<CProdDto> prodList = userProdComponent.queryByUserId(userId); // for(CProdDto prodDto : prodList){ // if (!prodId.equals(prodDto.getProd_id()) // && prodDto.getIs_base().equals(SystemConstants.BOOLEAN_TRUE)) { // flag = false; // break; // } // } // if(flag){ // throw new ServicesException("该产品为基本包,用户下已无基本包,无法退订,用户ID: " + userId); // } // } // // AcctitemDto acctitem = acctComponent.queryAcctItemByUserId(user.getUser_id(), prodId); // if (acctitem.getReal_balance().intValue() < 0 // && acctitem.getOrder_balance().intValue() != acctitem.getReal_balance().intValue() * -1) { // throw new ServicesException("用户账目欠费,无法退订,用户ID: " + userId); // } // // Integer doneCode = doneCodeComponent.gDoneCode(); // // CustFullInfoDto custFullInfo = new CustFullInfoDto(); // custFullInfo.setCust(custComponent.queryCustById(user.getCust_id())); // parameter.setCustFullInfo(custFullInfo); // // String userType = user.getUser_type(); // if(userType.equals(SystemConstants.USER_TYPE_DTV)){ // List<CUserDtv> userDtvList = new ArrayList<CUserDtv>(); // CUserDtv userDtv = new CUserDtv(); // BeanUtils.copyProperties(user, userDtv); // userDtvList.add(userDtv); // parameter.setSelectedDtvs(userDtvList); // }else if(userType.equals(SystemConstants.USER_TYPE_ATV)){ // List<CUserAtv> userAtvList = new ArrayList<CUserAtv>(); // CUserAtv userAtv = new CUserAtv(); // BeanUtils.copyProperties(user, userAtv); // userAtvList.add(userAtv); // parameter.setSelectedAtvs(userAtvList); // }else if(userType.equals(SystemConstants.USER_TYPE_BAND)){ // List<CUserBroadband> userBandList = new ArrayList<CUserBroadband>(); // CUserBroadband userBand = new CUserBroadband(); // BeanUtils.copyProperties(user, userBand); // userBandList.add(userBand); // parameter.setSelectedBands(userBandList); // } // // //批量退订,账目余额默认作废掉 // String busiInfo = terminate(doneCode, new String[] { prod.getProd_sn() }, // SystemConstants.ACCT_BALANCE_EXPIRE, "", ""); // //账务模式,重新计算到期日 // jobComponent.createInvalidCalJob(doneCode, user.getCust_id()); //// saveAllPublic(doneCode,getBusiParam(),busiInfo); // saveAllPublic(doneCode,getBusiParam()); // } } /** * 终止套餐 * @param prodSns * @param banlanceDealType * @throws Exception */ public void saveTerminatePkg(String prodSn,String banlanceDealType,String transAcctId,String transAcctItemId) throws Exception{ //获取客户用户信息 String custId = getBusiParam().getCust().getCust_id(); //获取业务流水 Integer doneCode = doneCodeComponent.gDoneCode(); String busiCode = getBusiParam().getBusiCode(); //生成销帐任务 int jobId = jobComponent.createCustWriteOffJob(doneCode, custId,SystemConstants.BOOLEAN_TRUE); //更新套餐对应的套餐信息为空 List<CProd> prodList = userProdComponent.queryByPkgSn(prodSn); for (CProd cp:prodList){ removeProdFromPkg(doneCode, cp); } //终止套餐 CProd prod = userProdComponent.queryByProdSn(prodSn); terminateProd(custId,null, doneCode, busiCode, prod, banlanceDealType, transAcctId, transAcctItemId); //保存需要终止的账目 jobComponent.terminateAcct(jobId, prod.getAcct_id(), prod.getProd_id(),doneCode); jobComponent.createAcctModeCalJob(doneCode, custId); //客户到期日计算任务 jobComponent.createInvalidCalJob(doneCode, custId); //保存流水 // saveAllPublic(doneCode,getBusiParam(),prod.getProd_name()); getBusiParam().setBusiConfirmParam("prod_names", prod.getProd_name()); getBusiParam().setBusiConfirmParam("prods", prod); saveAllPublic(doneCode,getBusiParam()); } /** * 修改产品 * @param propChangeList * @throws Exception */ public void saveEditProd(String prodSn , List<CProdPropChange> propChangeList) throws Exception{ //获取业务流水 Integer doneCode = doneCodeComponent.gDoneCode(); userProdComponent.editProd(doneCode, prodSn, propChangeList); //保存流水 saveAllPublic(doneCode,getBusiParam()); } public void saveEditCustPkg(String pkgSn,String stopType, String[] prodSns) throws Exception { //获取业务流水 Integer doneCode = doneCodeComponent.gDoneCode(); //查找客户套餐信息 CProd pkg = userProdComponent.queryByProdSn(pkgSn); if(StringHelper.isNotEmpty(stopType) && !stopType.equals(pkg.getStop_type())){ CProdPropChange propChange = new CProdPropChange(); propChange.setColumn_name("stop_type"); propChange.setOld_value(pkg.getStop_type()); propChange.setNew_value(stopType); List<CProdPropChange> changeList = new ArrayList<CProdPropChange>(); changeList.add(propChange); userProdComponent.editProd(doneCode, pkgSn, changeList); } //查找套餐对应的用户产品 List<CProd> prodList = userProdComponent.queryByPkgSn(pkgSn); //增加新增的用户产品 boolean flag = false; //循环新的子产品prodSns,查找还未加入套餐的, for(String prodSn:prodSns){ flag =false; for (CProd userProd:prodList){ if (prodSn.equals(userProd.getProd_sn())){//产品已经在套餐中 flag=true; break; } } //不存在套餐中时, if (!flag){ this.addProdToPkg(doneCode, pkg.getProd_id(), pkg.getProd_sn(), prodSn); //子产品到期日在本身基础上加上套餐的免费日子 int day = DateHelper.getDiffDays(new Date(), pkg.getInvalid_date()); CProd prod = userProdComponent.queryByProdSn(prodSn); Date newInvalidDate = DateHelper.addDate(prod.getInvalid_date(), day); userProdComponent.updateInvalidDate(doneCode, prodSn, newInvalidDate); CUser user = userComponent.queryUserById(prod.getUser_id()); recoverUserStatus(user, doneCode); } } //从套餐移出产品 //循环已经存在的子产品,去除不属于prodSns的产品 for (CProd userProd:prodList){ flag =false; for(String prodSn:prodSns){ if (prodSn.equals(userProd.getProd_sn())){//产品已经在套餐中 flag=true; break; } } if (!flag) this.removeProdFromPkg(doneCode, userProd); } //生成销账任务 jobComponent.createCustWriteOffJob(doneCode, pkg.getCust_id(), SystemConstants.BOOLEAN_TRUE); jobComponent.createAcctModeCalJob(doneCode, pkg.getCust_id()); //客户到期日计算任务 jobComponent.createInvalidCalJob(doneCode, pkg.getCust_id()); //保存流水 saveAllPublic(doneCode,getBusiParam()); } /** * 变更银行扣费 * @param prodSn * @throws Exception */ public void changeCprodBank(String prodSn) throws Exception { // 获取业务流水 Integer doneCode = doneCodeComponent.gDoneCode(); //获取产品信息 CProd cProd = userProdComponent.queryByProdSn(prodSn); PProd prod = prodComponent.queryProdById(cProd.getProd_id()); CUser user = userComponent.queryUserById(cProd.getUser_id()); CProdPropChange propChange = new CProdPropChange(); propChange.setColumn_name("is_bank_pay"); propChange.setOld_value(cProd.getIs_bank_pay()); propChange.setNew_value("T".equals(cProd.getIs_bank_pay())?"F":"T"); List<CProdPropChange> changeList = new ArrayList<CProdPropChange>(); changeList.add(propChange); userProdComponent.editProd(doneCode, prodSn, changeList); //保存流水 propChange.setOld_value_text(MemoryDict.getDictName(DictKey.BOOLEAN, propChange.getOld_value())); propChange.setNew_value_text(MemoryDict.getDictName(DictKey.BOOLEAN, propChange.getNew_value())); getBusiParam().setBusiConfirmParam("changeInfo", propChange); getBusiParam().setBusiConfirmParam("user", user); getBusiParam().setBusiConfirmParam("prod", prod); doneCodeComponent.saveDoneCodeInfo(doneCode, cProd.getCust_id() ,user.getUser_id(), getBusiParam().getBusiConfirmParamInfo() ); List<CAcctAcctitem> acctItems = new ArrayList<CAcctAcctitem>(); CAcctAcctitem item = new CAcctAcctitem(); item.setAcct_id(cProd.getAcct_id()); item.setAcctitem_id(cProd.getProd_id()); acctItems.add(item); //生成计算信用度任务 jobComponent.createCreditCalJob(doneCode, user.getCust_id(), acctItems ,SystemConstants.BOOLEAN_TRUE); saveAllPublic(doneCode, getBusiParam()); } /** * 将子产品从客户套餐走移走 * @param pkgSn * @param prodSn * @throws Exception */ public void saveEditCustPkg(String prodSn) throws Exception{ //获取业务流水 Integer doneCode = doneCodeComponent.gDoneCode(); //查找客户套餐信息 CProd subProd = userProdComponent.queryByProdSn(prodSn); if(null != subProd){ //移出套餐,并计算到期日 this.removeProdFromPkg(doneCode, subProd); //修改产品状态 if(!StatusConstants.ACTIVE.equals(subProd.getStatus())){ List<CProdPropChange> changeList = new ArrayList<CProdPropChange>(); changeList.add(new CProdPropChange("status", subProd.getStatus(),StatusConstants.ACTIVE)); changeList.add(new CProdPropChange("status_date", DateHelper.dateToStr(subProd.getStatus_date()),DateHelper.dateToStr(new Date()))); userProdComponent.editProd(doneCode,subProd.getProd_sn(),changeList); //生成激活产品任务 if (!isProdOpen(subProd.getStatus())){ CUser user = userComponent.queryUserById(subProd.getUser_id()); jobComponent.createBusiCmdJob(doneCode, BusiCmdConstants.ACCTIVATE_PROD, user.getCust_id(), user.getUser_id(), user.getStb_id(), user.getCard_id(), user.getModem_mac(), subProd.getProd_sn(),subProd.getProd_id()); } } } //生成计算到期日任务 jobComponent.createInvalidCalJob(doneCode, subProd.getCust_id()); //保存流水 saveAllPublic(doneCode,getBusiParam()); } public void editInvalidDate(String prodSn,String invalidDate) throws Exception { //获取业务流水 Integer doneCode = doneCodeComponent.gDoneCode(); CProd cProd = userProdComponent.queryByProdSn(prodSn); String stauts = cProd.getStatus(); //修改到期日 userProdComponent.editInvalidDate(doneCode, cProd, DateHelper.strToDate(invalidDate)); //用户产品非正常状态,需发授权 if (!isProdOpen(stauts)){ CUser user = userComponent.queryUserById(cProd.getUser_id()); jobComponent.createBusiCmdJob(doneCode, BusiCmdConstants.ACCTIVATE_PROD, user.getCust_id(), user.getUser_id(), user.getStb_id(), user.getCard_id(), user.getModem_mac(), prodSn,cProd.getProd_id()); } jobComponent.createInvalidCalJob(doneCode, cProd.getCust_id()); saveAllPublic(doneCode,getBusiParam()); } public void changeTariff(String prodSn, String newTariffId, String effDate,String expDate,boolean isUpdate) throws Exception { //获取业务流水 Integer doneCode = doneCodeComponent.gDoneCode(); changeTariff(prodSn, newTariffId, effDate, expDate,true,isUpdate, doneCode); //生成业务信息 // String busiInfo = ""; PProdTariff newTariff = prodComponent.queryTariffById(newTariffId); PProd prod = prodComponent.queryProdByProdSn(prodSn); // busiInfo +="产品 "+prod.getProd_name()+" 新资费 "+newTariff.getTariff_name()+effDate+"生效"; getBusiParam().setBusiConfirmParam("prod", prod); getBusiParam().setBusiConfirmParam("new_tariff", newTariff); CProd cProd = userProdComponent.queryByProdSn(prodSn); //生成计算到期日任务 jobComponent.createInvalidCalJob(doneCode, cProd.getCust_id()); // saveAllPublic(doneCode,getBusiParam(),busiInfo); saveAllPublic(doneCode,getBusiParam()); } public void bacthChangeTariff(List<CProdBacthDto> pordList,String newTariffId,boolean isUpdate) throws Exception { //获取业务流水 Integer doneCode = doneCodeComponent.gDoneCode(); PProdTariff newTariff = prodComponent.queryTariffById(newTariffId); List<String> custIds = CollectionHelper.converValueToList(pordList, "cust_id"); List<String> userIds = CollectionHelper.converValueToList(pordList, "user_id"); for(CProdBacthDto dto:pordList){ if(dto.getEff_date() == null){ throw new ServicesException("智能卡【"+dto.getCard_id()+"】的生效日期不能为空!"); } changeTariff(dto.getProd_sn(), newTariffId, DateHelper.dateToStr(dto.getEff_date()), DateHelper.dateToStr(dto.getExp_date()),true,isUpdate, doneCode); } //生成计算到期日任务 List<String> list = new ArrayList<String>(); for(String str:custIds){ if(!list.contains(str)) { list.add(str); } } jobComponent.createInvalidCalJobByCustIds(doneCode, list.toArray(new String[list.size()])); String info ="产品 "+pordList.get(0).getProd_name()+" 新资费 "+newTariff.getTariff_name(); for (int i =0 ;i < custIds.size(); i++) { doneCodeComponent.saveDoneCodeInfo(doneCode, custIds.get(i), userIds.get(i),info); } getBusiParam().setDoneCode(doneCode); doneCodeComponent.saveBatchDoneCode(doneCode, getBusiParam().getBusiCode(), getBusiParam().getRemark(), custIds, userIds); } public void removeByProdSn(String prodSn, String tariffId) throws Exception { //获取业务流水 Integer doneCode = doneCodeComponent.gDoneCode(); CProd cprod = userProdComponent.queryByProdSn(prodSn); String currentTariffId = cprod.getTariff_id(); //当前资费 PProdTariff currentTariff = userProdComponent.queryProdTariffById(currentTariffId); //取消资费变更,next_tariff_id设置为空 userProdComponent.removeByProdSn(prodSn, tariffId); //TODO 重新计算并更新到期日 ------------------------------------- CAcctAcctitem acctItem = acctComponent.queryAcctItemByAcctitemId(cprod.getAcct_id(),cprod.getProd_id()); userProdComponent.updateInvalidDateByTariff(doneCode, prodSn, acctItem); //基本包0资费+30年 PProd p = userProdComponent.queryByProdId(cprod.getProd_id()); if(p.getIs_base().equals(SystemConstants.BOOLEAN_TRUE)){//基本产品 if(currentTariff.getRent() == 0){ String newValue = null; Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.YEAR, 30); newValue = DateHelper.format(calendar.getTime(), DateHelper.FORMAT_YMD); userProdComponent.updateInvalidDate(doneCode, prodSn, DateHelper.strToDate(newValue)); }else{ userProdComponent.updateInvalidDate(doneCode, prodSn, cprod.getEff_date()); CAcctAcctitem acctitem = acctComponent.queryAcctItemByAcctitemId(cprod.getAcct_id(), cprod.getProd_id()); if(currentTariff.getBilling_cycle() > 1){ userProdComponent.updateInvalidDate(doneCode, prodSn, 0, acctitem.getActive_balance() - acctitem.getOwe_fee(), acctitem); }else if(currentTariff.getBilling_cycle() == 1){ userProdComponent.updateInvalidDate(doneCode, prodSn, 0, acctitem.getReal_balance(), acctitem); } } }else{//非基本产品 if(currentTariff.getRent()>0){ userProdComponent.updateInvalidDate(doneCode, prodSn, cprod.getEff_date()); CAcctAcctitem acctitem = acctComponent.queryAcctItemByAcctitemId(cprod.getAcct_id(), cprod.getProd_id()); if(currentTariff.getBilling_cycle() > 1){ userProdComponent.updateInvalidDate(doneCode, prodSn, 0, acctitem.getActive_balance() - acctitem.getOwe_fee(), acctitem); }else if(currentTariff.getBilling_cycle() == 1){ userProdComponent.updateInvalidDate(doneCode, prodSn, 0, acctitem.getReal_balance(), acctitem); } } } //TODO over if(cprod != null && cprod.getStatus().equals(StatusConstants.TMPPAUSE)){ String oldStatus = userProdComponent.queryLastStatus(prodSn); if(StringHelper.isNotEmpty(oldStatus)){ userProdComponent.updateProdStatus(doneCode, prodSn, StatusConstants.TMPPAUSE, oldStatus); } jobComponent.createCreditCalJob(doneCode, cprod.getCust_id(), null,SystemConstants.BOOLEAN_TRUE); } saveAllPublic(doneCode,getBusiParam()); } public void saveProdSyn(String[] prodSns, String[] userIds) throws Exception { //获取客户用户信息 String custId = getBusiParam().getCust().getCust_id(); CUser user = getBusiParam().getSelectedUsers().get(0); //获取业务流水 Integer doneCode = doneCodeComponent.gDoneCode(); String busiCode = getBusiParam().getBusiCode(); //客户名下所有产品 List<CProdDto> userProdList = userProdComponent.queryProdByCustId(custId); Map<String,List<CProdDto>> prodMap = CollectionHelper.converToMap(userProdList, "prod_sn") ; //客户名下所有用户 List<CUser> userList = userComponent.queryUserByCustId(custId); Map<String,List<CUser>> userMap = CollectionHelper.converToMap(userList, "user_id"); //客户名下账目 List<AcctitemDto> acctItemList = acctComponent.queryAcctItemByCustId(custId); Map<String,List<AcctitemDto>> acctItemMap = CollectionHelper.converToMap(acctItemList, "prod_sn"); //被选择主机的基本包到期日 Date baseInvalidDate = DateHelper.now(); for (CProdDto mp:userProdList){ if (mp.getUser_id().equals(user.getUser_id()) && mp.getIs_base().equals(SystemConstants.BOOLEAN_TRUE)){ baseInvalidDate = getInvalidDate(mp,acctItemMap.get(mp.getProd_sn()).get(0),null); break; } } boolean isWriteOff = false; for (String mProdSn:prodSns){ CProdDto mp = prodMap.get(mProdSn).get(0); //比较主机基本包到期与产品的到期日,取较小值 Date mpInvalidDate = getInvalidDate(mp,acctItemMap.get(mProdSn).get(0),baseInvalidDate); if (mpInvalidDate.after(DateHelper.now())){ for (String ouId:userIds){ //查找副机下的产品 CProd op = this.getUserProd(userProdList, ouId, mp.getProd_id()); //验证是否有动态资源的产品未订购 List<ProdResDto> resList = prodComponent.queryProdRes(mp.getProd_id()); if(resList != null && resList.size() > 0){ for(ProdResDto prod : resList){ List<ResGroupDto> rgdList = prod.getDynamicResList(); if(rgdList.size() > 0 && op == null){ throw new ServicesException("副终端需先订购产品"+mp.getProd_name()); } } } String isNewProd = SystemConstants.BOOLEAN_FALSE; int fee=0; //副机产品到期日 Date opInvalidDate = null; if (op == null){//如果副机下不存在该产品 //给同步用户订购产品 isNewProd = SystemConstants.BOOLEAN_TRUE; this.saveOrderBaseList(userMap.get(ouId), doneCode, mp.getProd_id(), mp.getTariff_id(), DateHelper.formatNow(), null, null, SystemConstants.PROD_ORDER_TYPE_PRESENT, mp.getPre_open_time(),mp.getIs_bank_pay()); op = userProdComponent.queryByProdId(ouId, mp.getProd_id()); opInvalidDate = DateHelper.now(); } else { opInvalidDate = getInvalidDate(op,acctItemMap.get(op.getProd_sn()).get(0),null); } //主机产品到期日在副机产品之后 if (mpInvalidDate.after(opInvalidDate)){ PProdTariff tariff = userProdComponent.queryProdTariffById(op.getTariff_id()); //零资费修改到期日,月包、包多月修改到期日且修改余额 if (tariff.getRent() == 0){ userProdComponent.updateInvalidDate(doneCode, op.getProd_sn(), mpInvalidDate); } else { //先计算月份数,再计算天数,月份数按每月资费计算,天数按资费/30 Calendar startCal = new GregorianCalendar(); Calendar dealCal = new GregorianCalendar(); startCal.setTime(opInvalidDate); dealCal.setTime(mpInvalidDate); int diffMonth = (dealCal.get(Calendar.YEAR) - startCal.get(Calendar.YEAR)) * 12 + dealCal.get(Calendar.MONTH) - startCal.get(Calendar.MONTH) ; int diffDate = dealCal.get(Calendar.DATE) - startCal.get(Calendar.DATE); fee = diffMonth*tariff.getRent() + diffDate*tariff.getRent()/30; //fee = DateHelper.getDiffDays(opInvalidDate, mpInvalidDate)*tariff.getRent()/30; if (acctItemMap.get(op.getProd_sn()) != null){ AcctitemDto item= acctItemMap.get(op.getProd_sn()).get(0); int oweFee= item.getOwe_fee() + item.getReal_fee() - item.getActive_balance() + item.getInactive_balance() ; if (oweFee>0) fee += oweFee; } CAcctAcctitemInactive inactiveItem = new CAcctAcctitemInactive(); inactiveItem.setPromotion_sn(doneCode.toString()); inactiveItem.setCust_id(op.getCust_id()); inactiveItem.setAcct_id(op.getAcct_id()); inactiveItem.setAcctitem_id(op.getProd_id()); if (tariff != null){ inactiveItem.setCycle(tariff.getBilling_cycle()); } inactiveItem.setActive_amount(fee); inactiveItem.setInit_amount(fee); inactiveItem.setBalance(fee); inactiveItem.setDone_code(doneCode); acctComponent.addAcctItemInactive(inactiveItem); userProdComponent.updateInvalidDate(doneCode, op.getProd_sn(), mpInvalidDate); } userProdComponent.saveProdSyn(doneCode,custId, mp.getUser_id(), ouId, mp.getProd_id(), isNewProd, opInvalidDate, mpInvalidDate, fee); } } isWriteOff = true; } } //生成销账任务 if (isWriteOff ) jobComponent.createCustWriteOffJob(doneCode, custId, SystemConstants.BOOLEAN_TRUE); jobComponent.createAcctModeCalJob(doneCode, custId); saveAllPublic(doneCode,getBusiParam()); } /** * 根据产品到期日,账目余额(暂未考虑),基准到期日计算新的到期日 * @param mp * @param acctitemDto * @return */ private Date getInvalidDate(CProd mp, AcctitemDto acctitemDto,Date baseInvalidDate) { Date invalidDate = null; if (baseInvalidDate != null) invalidDate = mp.getInvalid_date().after(baseInvalidDate)?baseInvalidDate:mp.getInvalid_date(); else invalidDate = mp.getInvalid_date(); if (DateHelper.now().after(invalidDate)) invalidDate = DateHelper.now(); return invalidDate; } private CProd getUserProd(List<CProdDto> userProdList,String userId,String prodId){ for (CProd prod:userProdList){ if (prod.getUser_id().equals(userId) && prod.getProd_id().equals(prodId)){ return prod; } } return null; } public List<ProdTariffDto> queryBatchTariffByTariffId(String[] tariffIds) throws Exception { return userProdComponent.queryTariffByTariffIds(tariffIds); } public List<ProdTariffDto> queryTariffByTariffIds(String[] tariffIds, String[] userIds,String custId) throws Exception { List<ProdTariffDto> result = new ArrayList<ProdTariffDto>(); Map<String, ProdTariffDto> tariffs = CollectionHelper .converToMapSingle(userProdComponent .queryTariffByTariffIds(tariffIds), "tariff_id"); Map<String, List<PProdTariffDisct>> map = CollectionHelper .converToMap( userProdComponent.queryDisctByTariffIds(tariffIds), "tariff_id"); Map<String, CUser> users = CollectionHelper.converToMapSingle( userComponent.queryUserByCustId(custId), "user_id"); expressionUtil.setCcust(custComponent.queryCustById(custId)); //按照折扣大小排序,降序 Comparator<PProdTariffDisct> comparator = new Comparator<PProdTariffDisct>() { public int compare(PProdTariffDisct o1, PProdTariffDisct o2) { if(o1.getDisct_rent() >o2.getDisct_rent()){ return -1; }else if(o1.getDisct_rent() < o2.getDisct_rent()){ return 1; } return 0; } }; for (String element : tariffIds) { ProdTariffDto pt = tariffs.get(element); if (pt != null) { result.add(pt); List<PProdTariffDisct> discts = map.get(pt.getTariff_id()); if (discts != null && discts.size() > 0) { for (int i = discts.size() - 1; i >= 0; i--) { PProdTariffDisct dis = discts.get(i); if (dis != null) for (String userId : userIds) { CUser user = users.get(userId); if (user != null) { expressionUtil.setCuser(user); if (!expressionUtil.parseBoolean(dis .getRule_id_text())) { discts.remove(i); break; } } } } Collections.sort(discts, comparator); pt.setDisctList(discts); } } } return result; } private List<PProd> queryOrderProd(String[] userIds, String userType,String servType) throws Exception { // String servId = userType; // if (userType.equals(SystemConstants.USER_TYPE_DTV) // && servType.equals(SystemConstants.DTV_SERV_TYPE_DOUBLE)) { // servId = SystemConstants.USER_TYPE_DTV + ","+SystemConstants.PROD_SERV_ID_ITV; // } return null;//userProdComponent.queryCanOrderProds(userIds,servId); } private List<PProd> filterProd(List<PProd> prodList, List<CUser> selectedUsers) throws Exception { List<PProd> orderProds = new ArrayList<PProd>(); CCust cust = custComponent.queryCustById(selectedUsers.get(0).getCust_id()); expressionUtil.setCcust(cust); for(PProd prod : prodList){ List<ProdTariffDto> tariffList = prodComponent.queryTariffByProd(prod.getProd_id()); if(tariffList.size() > 0){ boolean flag = false; for(ProdTariffDto tariff : tariffList){ for (CUser user : selectedUsers) { expressionUtil.setCuser(user); if (expressionUtil.parseBoolean(tariff.getRule_id_text(),String.valueOf(selectedUsers.size()))) { flag = true; break; } } if(flag) break; } //如果没有一个适合的资费,不添加该产品 if(flag){ orderProds.add(prod); } } } return orderProds; } public List<ProdDictDto> queryCanOrderProd(String[] userIds, String userType,String servType) throws Exception { List<PProd> prods = this.queryOrderProd(userIds, userType, servType); List<PProd> orderProds = new ArrayList<PProd>(); //过滤掉宽带产品,无资费的(规则限定资费出不来) if(userType.equals(SystemConstants.USER_TYPE_BAND)){ List<CUser> selectedUsers = userComponent.queryAllUserByUserIds(userIds); orderProds = this.filterProd(prods, selectedUsers); }else{ orderProds = prods; } List<ProdDictDto> prodList = prodComponent.queryProdTree(orderProds); return prodList; } public List<PProd> queryCanOrderBandProd(String userId) throws Exception { List<CUser> selectedUsers = userComponent.queryAllUserByUserIds(new String[]{userId}); List<PProd> prods = this.queryOrderProd(new String[]{userId}, SystemConstants.USER_TYPE_BAND, ""); List<PProd> orderProds = new ArrayList<PProd>(); if(selectedUsers.get(0).getUser_type().equals(SystemConstants.USER_TYPE_BAND)){ orderProds = this.filterProd(prods, selectedUsers); }else{ orderProds = prods; } return orderProds; } public List<ProdDictDto> queryBatchCanOrderProd(String userType) throws Exception { List<PProd> orderProds = userProdComponent.queryCanOrderUserProd(userType); List<ProdDictDto> prods = prodComponent.queryProdTree(orderProds); return prods; } public List<PProdDto> queryCanOrderProdToCallCenter(String[] userIds, String userType,String servType) throws Exception { // List<PProd> orderProds = this.queryOrderProd(userIds, userType, servType); List<PProd> orderProds = userProdComponent.queryCanOrderProds(userIds,userType); List<PProdDto> list = new ArrayList<PProdDto>(); for(PProd prod : orderProds){ // List<PProdDto> prodList = prodComponent.queryTariffByProdDisct(prod.getProd_id()); // if(prodList != null && prodList.size() > 0){ // for(PProdDto dto : prodList){ // dto.setProd_id(prod.getProd_id()); // dto.setProd_name(prod.getProd_name()); // } // list.addAll(prodList); // } List<ProdTariffDto> prodTariffDtoList = this.queryProdTariff(userIds, prod.getProd_id(), ""); for(ProdTariffDto tariff : prodTariffDtoList){ PProdDto ppDto = new PProdDto(); BeanUtils.copyProperties(prod, ppDto); ppDto.setTariff_id(tariff.getTariff_id()); ppDto.setTariff_name(tariff.getTariff_name()); ppDto.setBilling_cycle(tariff.getBilling_cycle()); List<PProdTariffDisct> disctList = tariff.getDisctList(); ppDto.setRent(tariff.getRent()); if(null!=disctList){ PProdTariffDisct disct = disctList.get(0); ppDto.setDisct_id(disct.getDisct_id()); ppDto.setDisct_name(disct.getDisct_name()); //ppDto.setFinal_rent(disct.getFinal_rent()); ppDto.setDisct_rent(disct.getDisct_rent()); } list.add(ppDto); } } return list; } public List<ProdDictDto> queryCanOrderPkg(String custId) throws Exception { List<PProd> orderprods = userProdComponent.queryCanOrderPkgs(custId); List<ProdDictDto> prods = prodComponent.queryProdTree(orderprods); return prods; } public List<ProdResDto> queryProdRes(String prodId) throws Exception { return prodComponent.queryProdRes(prodId); } public List<ProdTariffDto> queryBatchProdTariff(String prodId) throws Exception { List<ProdTariffDto> list = prodComponent.queryTariffByProd(prodId); for(ProdTariffDto dto:list){ if(StringHelper.isNotEmpty(dto.getRule_id_text())){ dto.setTariff_name(dto.getTariff_name()+"--"+dto.getRule_name()); } } return list; } public void resumeCustClass()throws Exception { // 获取业务流水 Integer doneCode = doneCodeComponent.gDoneCode(); //保存客户信息 CCust cust = this.getBusiParam().getCust(); custComponent.updateCustClass(doneCode, cust, SystemConstants.CUST_CLASS_YBKH, ""); CProd prod = this.userProdComponent.queryBaseProdByCustId(cust.getCust_id()); // base prod if(prod != null){ cust.setCust_class(SystemConstants.CUST_CLASS_YBKH); List<CUser> zzdUsers = this.userComponent.queryAllUserByUserIds(new String[]{prod.getUser_id()}); this.getBusiParam().addUser(zzdUsers.get(0)); List<ProdTariffDto> prodTariffDto = this.queryProdTariff(new String[]{prod.getUser_id()}, prod.getProd_id(), null); String tariffStartDate = DateHelper.format(new Date(), "yyyy-MM-dd"); if(prodTariffDto.size() > 0){ changeTariff(prod.getProd_sn(), prodTariffDto.get(0).getTariff_id(), tariffStartDate, "", true, true, doneCode); }else{ throw new ServicesException("没有匹配的资费信息,资费修改失败!"); } } saveAllPublic(doneCode, getBusiParam()); } public List<ProdTariffDto> queryProdTariff(String[] userIds, String prodId,String tariffId) throws Exception { List<ProdTariffDto> tariffList = prodComponent .queryTariffByProd(prodId); // Map<String, List<PProdTariffDisct>> disctmap = CollectionHelper // .converToMap(prodComponent.queryTariffDisctByProd(prodId), // "tariff_id"); PProdTariff oldTariff = prodComponent.queryTariffById(tariffId); CCust cust = getBusiParam().getCust(); expressionUtil.setCcust(cust); List<CProdDto> prodList = userProdComponent.queryByCustId(cust.getCust_id()); Map<String,List<CProdDto>> orderprods = CollectionHelper.converToMap(prodList, "user_id"); Map<String, CUserStb> userStbMap = CollectionHelper.converToMapSingle(userComponent.queryUserStbByCustId(getBusiParam().getCust().getCust_id()), "user_id"); List<CUser> selectedUsers = getBusiParam().getSelectedUsers(); int size = tariffList.size(); for (int i = size - 1; i >= 0; i--) { ProdTariffDto tariff = tariffList.get(i); if(null !=oldTariff && !oldTariff.getBilling_cycle().equals(tariff.getBilling_cycle())){ //不同周期不允许修改 tariffList.remove(i); continue; }else if (tariff.getTariff_id().equals(tariffId)){ //剔除原资费,用户资费修改 tariffList.remove(i); continue; } // 产品规则 if(selectedUsers.size() > 0){ for (CUser user : selectedUsers) { expressionUtil.setCuser(user); expressionUtil.setCuserStb(userStbMap.get(user.getUser_id())); expressionUtil.setOrderprods(orderprods.get(user.getUser_id())); if (!expressionUtil.parseBoolean(tariff.getRule_id_text(),String.valueOf(selectedUsers.size()))) { tariffList.remove(i); break; } } }else{ //客户套餐 if (!expressionUtil.parseBoolean(tariff.getRule_id_text(), "0")) { tariffList.remove(i); } } } //按照资费升序排序 Comparator<PProdTariff> comparator = new Comparator<PProdTariff>() { public int compare(PProdTariff o1, PProdTariff o2) { if(o1.getRent() /o1.getBilling_cycle() > o2.getRent() /o2.getBilling_cycle()){ return 1; }else if(o1.getRent() /o1.getBilling_cycle() < o2.getRent() /o2.getBilling_cycle()){ return -1; }else { return 0; } } }; Collections.sort(tariffList, comparator); return tariffList; } public List<ProdTariffDto> queryFreeTariff(String[] userIds, String type,String prodId,String tariffId)throws Exception { List<ProdTariffDto> tariffList = prodComponent.queryTariffByProd(prodId); PProdTariff oldTariff = prodComponent.queryTariffById(tariffId); expressionUtil.setCcust(getBusiParam().getCust()); List<CUser> selectedUsers = getBusiParam().getSelectedUsers(); int size = tariffList.size(); for (int i = size - 1; i >= 0; i--) { ProdTariffDto tariff = tariffList.get(i); if(null !=oldTariff && !oldTariff.getBilling_cycle().equals(tariff.getBilling_cycle())){ //不同周期不允许修改 tariffList.remove(i); continue; }else if (tariff.getTariff_id().equals(tariffId)){ //剔除原资费,用户资费修改 tariffList.remove(i); continue; } // 产品规则 if(selectedUsers.size() > 0){ for (CUser user : selectedUsers) { // //user原先是免费的,改成超额;原先超额改免费 // if(type.equals("OUT")){ // user.setStr19("F"); // }else{ // user.setStr19("T"); // } expressionUtil.setCuser(user); if (!expressionUtil.parseBoolean(tariff.getRule_id_text(),String.valueOf(selectedUsers.size()))) { tariffList.remove(i); break; } } }else{ //客户套餐 if (!expressionUtil.parseBoolean(tariff.getRule_id_text(), "0")) { tariffList.remove(i); } } } //按照资费升序排序 Comparator<PProdTariff> comparator = new Comparator<PProdTariff>() { public int compare(PProdTariff o1, PProdTariff o2) { if(o1.getRent() /o1.getBilling_cycle() > o2.getRent() /o2.getBilling_cycle()){ return 1; }else if(o1.getRent() /o1.getBilling_cycle() < o2.getRent() /o2.getBilling_cycle()){ return -1; }else { return 0; } } }; Collections.sort(tariffList, comparator); return tariffList; } public Map<String,Object> queryEditProdTariff(String[] userIds, String prodId,String tariffId) throws Exception { String dataRight = ""; try { dataRight = prodComponent.queryChangeTariffRole(); } catch (Exception e) { } List<ProdTariffDto> tariffList = prodComponent.queryTariffByProd(prodId); expressionUtil.setCcust(getBusiParam().getCust()); List<CUser> selectedUsers = getBusiParam().getSelectedUsers(); for (int i = tariffList.size() - 1; i >= 0; i--) { ProdTariffDto tariff = tariffList.get(i); if (tariff.getTariff_id().equals(tariffId)){ //剔除原资费,用户资费修改 tariffList.remove(i); continue; } //产品规则 if(selectedUsers.size() > 0){ //用户产品 用户套餐 for (CUser user : selectedUsers) { expressionUtil.setCuser(user); if (!expressionUtil.parseBoolean(tariff.getRule_id_text(),String.valueOf(selectedUsers.size()))) { tariffList.remove(i); break; } } }else{ //客户套餐 if (!expressionUtil.parseBoolean(tariff.getRule_id_text(), "0")) { tariffList.remove(i); } } } Map<String,Object> map = new HashMap<String, Object>(); map.put("dataRight", dataRight); map.put("tariffList", tariffList); return map; } public List<ProdTariffDto> queryAllProdTariff(String[] userIds, String prodId,String tariffId) throws Exception { List<ProdTariffDto> tariffList = prodComponent.queryTariffByProd(prodId); PProdTariff oldTariff = prodComponent.queryTariffById(tariffId); List<CUser> userList = userComponent.queryAllUserByUserIds(userIds); Map<String, List<CUser>> custmap = CollectionHelper.converToMap(userList,"cust_id"); String[] custs = CollectionHelper.converValueToArray(userList, "cust_id"); String[] custArr = null; List<String> list = new ArrayList<String>(); for(int i = 0; i < custs.length; i++) { if(!list.contains(custs[i])) { list.add(custs[i]); } } custArr = list.toArray(new String[list.size()]); List<CCust> custList = custComponent.queryCustBycustIds(custArr); for (CCust custdto:custList){ expressionUtil.setCcust(custdto); List<CUser> selectedUsers = custmap.get(custdto.getCust_id()); for (int i = tariffList.size() - 1; i >= 0; i--) { ProdTariffDto tariff = tariffList.get(i); if(null !=oldTariff && !oldTariff.getBilling_cycle().equals(tariff.getBilling_cycle())){ //不同周期不允许修改 tariffList.remove(i); continue; }else if (tariff.getTariff_id().equals(tariffId)){ //剔除原资费,用户资费修改 tariffList.remove(i); continue; } // 产品规则 if(selectedUsers.size() > 0){ for (CUser dto : selectedUsers) { expressionUtil.setCuser(dto); if (!expressionUtil.parseBoolean(tariff.getRule_id_text(),String.valueOf(selectedUsers.size()))) { tariffList.remove(i); break; } } }else{ if (!expressionUtil.parseBoolean(tariff.getRule_id_text(), "0")) { tariffList.remove(i); } } } } return tariffList; } public List<ProdTariffDto> queryTariffForEzdToFzd(String custId,String userId,String prodId,String tariffId) throws Exception { List<ProdTariffDto> tariffList = prodComponent.queryTariffByProd(prodId); CCust cust = custComponent.queryCustById(custId); expressionUtil.setCcust(cust); CUser userDto = userComponent.queryUserById(userId); CUserDtv dtvUser = new CUserDtv(); BeanUtils.copyProperties(userDto, dtvUser); dtvUser.setTerminal_type(SystemConstants.USER_TERMINAL_TYPE_FZD); expressionUtil.setCuser(dtvUser); for (int i = tariffList.size() - 1; i >= 0; i--) { ProdTariffDto tariff = tariffList.get(i); if (tariff.getTariff_id().equals(tariffId)){ //剔除原资费,用户资费修改 tariffList.remove(i); continue; } if (!expressionUtil.parseBoolean(tariff.getRule_id_text(),String.valueOf(1))) { tariffList.remove(i); } } return tariffList; } public List<PRes> queryProdResByUserProdSn(String prodSn) throws Exception { return userProdComponent.queryResByProdSn(prodSn); } public List<PProd> querySubProds(String prodId) throws Exception { return prodComponent.querSubProds(prodId); } private void addProdToPkg(Integer doneCode, String packageId, String packageSn, String prodSn) throws Exception { //获取产品信息 CProd cProd = userProdComponent.queryByProdSn(prodSn); //如果子产品已停机 if(!isProdOpen(cProd.getStatus())){ userProdComponent.updateProdStatus(doneCode,prodSn,cProd.getStatus(), StatusConstants.ACTIVE); CUser user = userComponent.queryUserById(cProd.getUser_id()); //生成激活产品指令 jobComponent.createBusiCmdJob(doneCode, BusiCmdConstants.ACCTIVATE_PROD, cProd.getCust_id(), user.getUser_id(), user.getStb_id(),user.getCard_id(),user.getModem_mac(), cProd.getProd_sn(),cProd.getProd_id()); } PProdTariff tariff = prodComponent.queryTariffById(cProd.getTariff_id()); //如果是单月的资费 if(tariff.getBilling_cycle() == 1 && SystemConstants.BILLING_TYPE_MONTH.equals(tariff.getBilling_type())){ //出帐 BBill bill = this.billComponent.confirmBill(prodSn, doneCode); if (bill != null){ acctComponent.changeAcctItemOwefee(true,cProd.getAcct_id(), cProd.getProd_id(), bill.getOwe_fee()); } }else if(tariff.getBilling_cycle() > 1 && SystemConstants.BILLING_TYPE_MONTH.equals(tariff.getBilling_type())){ //作废账单 billComponent.cancelBill(prodSn,DateHelper.nowYearMonth()); } //在用户产品历史表中增加记录 // cProd.setBillinfo_eff_date(new Date()); // userProdComponent.addHis(doneCode, cProd); //更新用户产品对应的套餐信息 userProdComponent.updateProdPkg(prodSn, packageSn, packageId); } private void removeProdFromPkg(Integer doneCode, CProd cp) throws Exception { userProdComponent.updateProdPkg(cp.getProd_sn(), "", ""); //处理包多月资费产品账单 CProd prod = userProdComponent.queryByProdSn(cp.getProd_sn()); PProdTariff ppt = userProdComponent.queryProdTariffById(prod.getTariff_id()); //next_bill_date已作废 // if(SystemConstants.BOOLEAN_TRUE.equals(prod.getStop_by_invalid_date()) && null != prod.getNext_bill_date()){ if(SystemConstants.BOOLEAN_TRUE.equals(prod.getStop_by_invalid_date()) && ppt.getBilling_cycle()>1){ List<BBill> oweBillList = billComponent.queryPromOweFeeBill(prod.getProd_sn()); if(oweBillList.size() == 0){ //更新到期日 CAcctAcctitem acctItem = acctComponent.queryAcctItemByAcctitemId(cp.getAcct_id(), cp.getProd_id()); userProdComponent.updateInvalidDateByTariff(doneCode, cp.getProd_sn(), acctItem); } //下次出账日期之前的账单还原,之后的作废 //恢复账单 billComponent.recoverBill(cp.getProd_sn(),DateHelper.nowYearMonth()); //next_bill_date已作废 // billComponent.cancelBill(cp.getProd_sn(),DateHelper.formatYM(prod.getNext_bill_date())); //作废账单 billComponent.cancelBill(cp.getProd_sn(),DateHelper.formatYM(prod.getInvalid_date())); } else { //更新到期日 CAcctAcctitem acctItem = acctComponent.queryAcctItemByAcctitemId(cp.getAcct_id(), cp.getProd_id()); userProdComponent.updateInvalidDateByTariff(doneCode, cp.getProd_sn(), acctItem); } } public void resetUserProdRes() throws Exception { CCust cust = getBusiParam().getCust(); List<CUser> userList = getBusiParam().getSelectedUsers(); if(userList == null || userList.size()==0){ userList = userComponent.queryUserByCustId(cust.getCust_id()); } //查找产品用户资源配置 List<PProdUserRes> userResList = prodComponent.queryUserResByCountyId(); Integer doneCode = doneCodeComponent.gDoneCode(); for (CUser user:userList){ expressionUtil.setCcust(cust); expressionUtil.setCuser(user); //查找用户的所有产品 List<CProdDto> prodList = userProdComponent.queryByUserId(user.getUser_id()); for (CProdDto prod:prodList){ List<String> curReslist = new ArrayList<String>(); boolean hasUserRes = false; for (PProdUserRes userRes:userResList){ if (userRes.getProd_id().equals(prod.getProd_id())){ hasUserRes = true; if (StringHelper.isEmpty(userRes.getRule_id_text()) || expressionUtil.parseBoolean(userRes.getRule_id_text())){ String[] res = userRes.getRes_id().split(","); for (String resId:res){ curReslist.add(resId); } } } } if (hasUserRes){ //查找修改前产品对应的用户资源 List<String> prodResList = userProdComponent.queryUserProdRes(prod.getProd_sn()); String addRes=""; String delRes=""; for (String res1:prodResList){ boolean exits = false; if(curReslist!=null){ for (String resId:curReslist){ if (res1.equals(resId)){ exits = true; break; } } } if (!exits) delRes +=","+res1; } if(curReslist!=null){ for (String resId:curReslist){ boolean exits = false; for (String res1:prodResList){ if (res1.equals(resId)){ exits = true; break; } } if (!exits) addRes +=","+resId; } } if (StringHelper.isNotEmpty(addRes)){ addRes = addRes.substring(1); jobComponent.createBusiCmdJob(doneCode, BusiCmdConstants.ACCTIVATE_PROD, user.getCust_id(), user.getUser_id(), user.getStb_id(), user.getCard_id(), user.getModem_mac(),prod.getProd_sn(), prod.getProd_id(),"RES_ID:''"+addRes+"''"); } if (StringHelper.isNotEmpty(delRes)){ delRes = delRes.substring(1); jobComponent.createBusiCmdJob(doneCode, BusiCmdConstants.PASSVATE_PROD, user.getCust_id(), user.getUser_id(), user.getStb_id(), user.getCard_id(), user.getModem_mac(),prod.getProd_sn(), prod.getProd_id(),"RES_ID:''"+delRes+"''"); } //删除用户产品资源 userProdComponent.removeProdRes(prod.getProd_sn(), delRes.split(",")); //增加用户产品资源 String[] addResArr = addRes.split(","); for (String resId:addResArr){ if (StringHelper.isNotEmpty(resId)) userProdComponent.addUserProdres(prod.getProd_sn(), resId); } } } } } /* (non-Javadoc) * @see com.ycsoft.business.service.IUserProdService#changeExpDate(java.lang.String, java.lang.String) */ public void changeExpDate(String prodSn, String expDate) throws Exception { //获取业务流水 Integer doneCode = doneCodeComponent.gDoneCode(); String custId = getBusiParam().getCust().getCust_id(); userProdComponent.updateExpDate(doneCode, prodSn,expDate); //生成计算到期日任务 jobComponent.createInvalidCalJob(doneCode, custId); saveAllPublic(doneCode,getBusiParam()); } //产品暂停 public void pauseProd(String prodSn,String userId) throws Exception { Integer doneCode = doneCodeComponent.gDoneCode(); this.tempPauseProd(doneCode, prodSn, userId); saveAllPublic(doneCode,getBusiParam()); } public void tempPauseProd(Integer doneCode,String prodSn,String userId) throws Exception { String custId = getBusiParam().getCust().getCust_id(); CUser user = queryUserById(userId); CProd prod = userProdComponent.queryByProdSn(prodSn); if(prod.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){ userProdComponent.updateProdStatus(doneCode, prodSn, prod.getStatus(), StatusConstants.TMPPAUSE); if(isProdOpen(prod.getStatus())){ jobComponent.createBusiCmdJob(doneCode, BusiCmdConstants.PASSVATE_PROD, custId, user.getUser_id(), user.getStb_id(), user.getCard_id(), user.getModem_mac(), prod.getProd_sn(), prod.getProd_id()); } }else{ userProdComponent.updateProdStatus(doneCode, prod.getProd_sn(), prod.getStatus(), StatusConstants.TMPPAUSE); List<CProdDto> childProdList = userProdComponent.queryChildProdByPkgsn(prod.getProd_sn()); for(CProdDto childProd : childProdList){ userProdComponent.updateProdStatus(doneCode, childProd.getProd_sn(), childProd.getStatus(), StatusConstants.TMPPAUSE); if(isProdOpen(childProd.getStatus())){ user = queryUserById(childProd.getUser_id()); jobComponent.createBusiCmdJob(doneCode, BusiCmdConstants.PASSVATE_PROD, custId, user.getUser_id(), user.getStb_id(), user.getCard_id(), user.getModem_mac(), childProd.getProd_sn(), childProd.getProd_id()); } } } } //产品恢复 public void resumeProd(String prodSn,String userId) throws Exception { Integer doneCode = doneCodeComponent.gDoneCode(); String custId = getBusiParam().getCust().getCust_id(); CUser user = queryUserById(userId); CProd prod = userProdComponent.queryByProdSn(prodSn); String oldStatus = userProdComponent.queryLastStatus(prodSn); if (StringHelper.isEmpty(oldStatus)) { if (prod.getInvalid_date().after(prod.getStatus_date())) oldStatus = StatusConstants.ACTIVE; else oldStatus = StatusConstants.OWESTOP; }else if(oldStatus.equals(StatusConstants.REQSTOP)){ oldStatus = StatusConstants.ACTIVE; } if(prod.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){ userProdComponent.updateProdStatus(doneCode, prodSn, prod.getStatus(), oldStatus); if(!isProdOpen(prod.getStatus())){ jobComponent.createBusiCmdJob(doneCode, BusiCmdConstants.ACCTIVATE_PROD, custId, user.getUser_id(), user.getStb_id(), user.getCard_id(), user.getModem_mac(), prod.getProd_sn(), prod.getProd_id()); } }else{ userProdComponent.updateProdStatus(doneCode, prod.getProd_sn(), prod.getStatus(), oldStatus); List<CProdDto> childProdList = userProdComponent.queryChildProdByPkgsn(prod.getProd_sn()); for(CProdDto childProd : childProdList){ userProdComponent.updateProdStatus(doneCode, childProd.getProd_sn(), childProd.getStatus(), oldStatus); if(!isProdOpen(childProd.getStatus())){ user = queryUserById(childProd.getUser_id()); jobComponent.createBusiCmdJob(doneCode, BusiCmdConstants.ACCTIVATE_PROD, custId, user.getUser_id(), user.getStb_id(), user.getCard_id(), user.getModem_mac(), childProd.getProd_sn(), childProd.getProd_id()); } } } //包月非零资费、按到期日停机,修改为按账务模式停机 PProdTariff pt = userProdComponent.queryProdTariffById(prod.getTariff_id()); if(pt.getRent() > 0 && pt.getBilling_type().equals(SystemConstants.BILLING_TYPE_MONTH) && pt.getBilling_cycle() == 1 && prod.getStop_by_invalid_date().equals(SystemConstants.BOOLEAN_TRUE)){ List<CProdPropChange> propChangeList = new ArrayList<CProdPropChange>(); CProdPropChange propChange = new CProdPropChange(); propChange.setColumn_name("stop_by_invalid_date"); propChange.setOld_value(SystemConstants.BOOLEAN_TRUE); propChange.setNew_value(SystemConstants.BOOLEAN_FALSE); propChangeList.add(propChange); userProdComponent.editProd(doneCode, prodSn, propChangeList); } if(pt.getBilling_type().equals(SystemConstants.BILLING_TYPE_MONTH) && (pt.getBilling_cycle()>1 || pt.getRent() ==0)){ userProdComponent.updateInvalidDate(doneCode, prod.getProd_sn(), DateHelper.getDiffDays(prod.getStatus_date(), new Date()), 0, new CAcctAcctitem()); } jobComponent.createCreditExecJob(doneCode, custId); jobComponent.createInvalidCalJob(doneCode, custId); jobComponent.createAcctModeCalJob(doneCode, custId); saveAllPublic(doneCode,getBusiParam()); } /** * @param prodId * @param countyId * @return */ public List<PProdDto> queryProdByCounty(String prodId, String countyId) throws JDBCException { return userProdComponent.queryProdByCountyId(prodId, countyId); } /** * 根据用户Id和产品Id查询已订购产品 */ public CProd queryOrderdProdByUserId(String userId,String prodId) throws Exception{ return userProdComponent.queryByProdId(userId, prodId); } // public Date getInvalidDateByFee(long fee,int balance,int oweFee,int realFee,int rent,String rentType,Date beginFeeDate)throws Exception{ // return userProdComponent.getInvalidDateByFee(fee, balance, oweFee, realFee, rent, rentType, beginFeeDate); // } // // public long getFeeByInvalidDate(int balance,int oweFee,int realFee,int rent,String rentType,Date invaidDate,Date beginFeeDate) throws Exception{ // return userProdComponent.getFeeByInvalidDate(balance, oweFee, realFee, rent, rentType, invaidDate, beginFeeDate); // } public Date getInvalidDateByFee(String prodSn, int payFee) throws Exception { return userProdComponent.getInvalidDateByFeePro(prodSn, payFee); } /** * 重算到期日.` * @param prodSn * @return */ public Date reCalcInvalidDate(String prodSn) throws Exception{ CProd prod = userProdComponent.queryByProdSn(prodSn); Date oldInvalidDate = prod.getInvalid_date(); String oldStr = DateHelper.format(oldInvalidDate, DateHelper.FORMAT_YMD); oldInvalidDate = DateHelper.parseDate(oldStr, DateHelper.FORMAT_YMD); Date newInvalid = userProdComponent.getInvalidDateByFeePro(prodSn, 0); String newStr = DateHelper.format(newInvalid, DateHelper.FORMAT_YMD); newInvalid = DateHelper.parseDate(newStr, DateHelper.FORMAT_YMD); if(null == newInvalid){ throw new ServicesException("已欠费,不能变更到期日!"); } if(newInvalid.getTime() != oldInvalidDate.getTime()){ int doneCOde = userProdComponent.getDoneCOde(); List<CProdPropChange> propChangeList = new ArrayList<CProdPropChange>(); CProdPropChange change = new CProdPropChange(); change.setOld_value(oldStr); change.setNew_value(newStr); change.setColumn_name("invalid_date"); change.setProd_sn(prodSn); propChangeList.add(change); userProdComponent.editProd(doneCOde, prodSn, propChangeList); saveAllPublic(doneCOde, getBusiParam()); }else{ newInvalid = oldInvalidDate; } return newInvalid; } public long getFeeByInvalidDate(String prodSn, Date invalidDate) throws Exception { return userProdComponent.getFeeByInvalidDatePro(prodSn, invalidDate); } /** * @param expressionUtil the expressionUtil to set */ public void setExpressionUtil(ExpressionUtil expressionUtil) { this.expressionUtil = expressionUtil; } /* (non-Javadoc) * @see com.ycsoft.business.service.IUserProdService#saveOrder(java.lang.String, java.lang.String, java.lang.String, java.util.List, java.lang.String, java.lang.String) */ public void saveOrder(String prodId, String tariffId, String feeDate, List<UserProdRscDto> dynamicRscList, String expDate, String publicAcctItemType) throws Exception { Integer doneCode = doneCodeComponent.gDoneCode(); saveOrderBaseList(getBusiParam().getSelectedUsers(),doneCode,prodId,tariffId,feeDate,expDate,dynamicRscList,SystemConstants.PROD_ORDER_TYPE_ORDER,null,SystemConstants.BOOLEAN_FALSE); saveAllPublic(doneCode,getBusiParam()); } public void updateProdPreOpenDate(String prodSn, String countyId,Date newPreOpenDate, Date feeDate) throws ServicesException{ try{ Integer doneCode = doneCodeComponent.gDoneCode(); CProd cprod=userProdComponent.updateProdPreOpenDate(doneCode,prodSn,countyId,newPreOpenDate,feeDate); if(cprod!=null){ jobComponent.createInvalidCalJob(doneCode, cprod.getCust_id()); } saveAllPublic(doneCode,getBusiParam()); }catch (Exception e) { throw new ServicesException(e); } } public void updatePublicAcctItemType(String prodSn, String countyId,String publicAcctitemType)throws ServicesException{ if(StringHelper.isEmpty(publicAcctitemType)){ throw new ServicesException("参数'公用账目适用类型不能为空!'"); } try{ Integer doneCode = doneCodeComponent.gDoneCode(); userProdComponent.updatePublicAcctItemType(doneCode,prodSn,getBusiParam().getCust(),publicAcctitemType); jobComponent.createInvalidCalJob(doneCode, getBusiParam().getCust().getCust_id()); jobComponent.createAcctModeCalJob(doneCode, getBusiParam().getCust().getCust_id()); saveAllPublic(doneCode,getBusiParam()); }catch (Exception e) { throw new ServicesException(e); } } /* (non-Javadoc) * @see com.ycsoft.business.service.IUserProdService#saveBusiCmdCard(java.lang.String) */ public void saveBusiCmdCard(String cardId) throws Exception { if(StringHelper.isEmpty(cardId)){ throw new ServicesException("智能卡不能为空!"); } if(deviceComponent.getIsCard(cardId)){ Integer doneCode = doneCodeComponent.gDoneCode(); getBusiParam().setBusiCode(BusiCodeConstants.CA_SINGLE_CARD); getBusiParam().setRemark(getBusiParam().getRemark()==null?"CARD:"+cardId:getBusiParam().getRemark()+"CARD:"+cardId); jobComponent.createBusiCmdCard(doneCode, cardId, getOptr()); saveAllPublic(doneCode,getBusiParam()); } } public Pager<JCaCommand> queryCaCommandByCardId(String cardId,Integer start, Integer limit) throws Exception { if(StringHelper.isEmpty(cardId)){ throw new ServicesException("智能卡不能为空!"); } return jobComponent.queryCaCommandByCardId(cardId.split(","),start,limit); } }