/** * */ package com.ycsoft.business.component.core; import java.io.Serializable; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.beanutils.PropertyUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Component; import com.ycsoft.beans.core.acct.CAcctAcctitem; import com.ycsoft.beans.core.bill.TvOrder; import com.ycsoft.beans.core.cust.CCust; import com.ycsoft.beans.core.job.JProdNextTariff; import com.ycsoft.beans.core.job.JProdNextTariffHis; import com.ycsoft.beans.core.job.JProdPreopen; import com.ycsoft.beans.core.job.JProdPreopenHis; import com.ycsoft.beans.core.prod.CProd; import com.ycsoft.beans.core.prod.CProdHis; import com.ycsoft.beans.core.prod.CProdInvalidTariff; import com.ycsoft.beans.core.prod.CProdPropChange; import com.ycsoft.beans.core.prod.CProdPropPat; import com.ycsoft.beans.core.prod.CProdResourceAcct; import com.ycsoft.beans.core.prod.CProdRsc; import com.ycsoft.beans.core.prod.CProdSyn; import com.ycsoft.beans.core.user.CUser; 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.PRes; import com.ycsoft.business.commons.abstracts.BaseBusiComponent; import com.ycsoft.business.dao.core.bill.TvOrderDao; import com.ycsoft.business.dao.core.job.JProdNextTariffDao; import com.ycsoft.business.dao.core.job.JProdNextTariffHisDao; import com.ycsoft.business.dao.core.job.JProdPreopenDao; import com.ycsoft.business.dao.core.job.JProdPreopenHisDao; import com.ycsoft.business.dao.core.prod.CProdHisDao; import com.ycsoft.business.dao.core.prod.CProdPropChangeDao; import com.ycsoft.business.dao.core.prod.CProdPropPatDao; import com.ycsoft.business.dao.core.prod.CProdResourceAcctDao; import com.ycsoft.business.dao.core.prod.CProdRscDao; import com.ycsoft.business.dao.core.prod.CProdSynDao; import com.ycsoft.business.dao.core.promotion.CPromProdRefundDao; import com.ycsoft.business.dao.core.user.CRejectResDao; import com.ycsoft.business.dao.core.user.CUserDao; import com.ycsoft.business.dao.prod.PProdTariffDisctDao; import com.ycsoft.business.dao.prod.PResDao; import com.ycsoft.business.dto.core.prod.CProdBacthDto; import com.ycsoft.business.dto.core.prod.CProdDto; import com.ycsoft.business.dto.core.prod.CustProdDto; import com.ycsoft.business.dto.core.prod.PProdDto; import com.ycsoft.business.dto.core.prod.ProdResDto; import com.ycsoft.business.dto.core.prod.ProdTariffDto; import com.ycsoft.business.dto.core.prod.PromFeeProdDto; import com.ycsoft.business.dto.core.prod.ResGroupDto; import com.ycsoft.business.dto.core.prod.UserProdDto; import com.ycsoft.business.dto.core.user.UserProdRscDto; import com.ycsoft.commons.constants.BusiCmdConstants; import com.ycsoft.commons.constants.BusiCodeConstants; import com.ycsoft.commons.constants.DataRight; 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.helper.CollectionHelper; import com.ycsoft.commons.helper.DateHelper; import com.ycsoft.commons.helper.LoggerHelper; 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 sheng * Jun 25, 2010 4:41:35 PM */ @Component public class UserProdComponent extends BaseBusiComponent { private CProdHisDao cProdHisDao; private CProdRscDao cProdRscDao; private CProdSynDao cProdSynDao; private CProdResourceAcctDao cProdResourceAcctDao; private PResDao pResDao; private PProdTariffDisctDao pProdTariffDisctDao; private CRejectResDao cRejectResDao; private JProdNextTariffHisDao jProdNextTariffHisDao; private TvOrderDao tvOrderDao; private JProdPreopenDao jProdPreopenDao; private JProdPreopenHisDao jProdPreopenHisDao; private JobComponent jobComponent; private CUserDao cUserDao; private CPromProdRefundDao cPromProdRefundDao; private CProdPropPatDao cProdPropPatDao; /** * 查找套餐缴费中产品对应的已存在prod_sn */ public Map<String, Map<String, PromFeeProdDto>> queryPromFeeProdSn(String custId,String countyId,List<PromFeeProdDto> prodList)throws Exception{ List<CProdDto> list=cProdDao.queryAllProdAcct(custId,countyId); Map<String,Map<String,CProdDto>> prodsnMap=new HashMap<String,Map<String,CProdDto>>(); for(CProdDto o:list){ if(!prodsnMap.containsKey(o.getUser_id())){ Map<String,CProdDto> tmap=new HashMap<String,CProdDto>(); prodsnMap.put(o.getUser_id(), tmap); } if("BAND".equals(o.getServ_id())){ //宽带产品自动匹配,一个用户下要求只有一个宽带产品 prodsnMap.get(o.getUser_id()).put("BAND", o); } prodsnMap.get(o.getUser_id()).put(o.getProd_id(), o); } Map<String,Map<String,PromFeeProdDto>> promMap=new HashMap<String,Map<String,PromFeeProdDto>>(); for(PromFeeProdDto o:prodList){ if(prodsnMap.containsKey(o.getUser_id()) &&prodsnMap.get(o.getUser_id()).containsKey(o.getProd_id())){ CProdDto cp=prodsnMap.get(o.getUser_id()).get(o.getProd_id()); o.setProd_sn(cp.getProd_sn()); o.setTariff_id(cp.getTariff_id()); o.setRent(cp.getTariff_rent()); o.setBilling_cycle(cp.getBilling_cycle()); o.setShould_pay(o.getRent()*o.getMonths()/o.getBilling_cycle()); o.setProd_id(cp.getProd_id()); o.setServ_id(cp.getServ_id()); } if(!promMap.containsKey(o.getUser_id())){ Map<String,PromFeeProdDto> tmap=new HashMap<String,PromFeeProdDto>(); promMap.put(o.getUser_id(), tmap); } promMap.get(o.getUser_id()).put(o.getProd_id(), o); if(o.getProd_id().equals("BAND")){ throw new ComponentException("Error:宽带用户未订基础产品."); } } return promMap; } public List<CProdDto> queryAllProdAcct(String custId, String countyId) throws Exception { return cProdDao.queryAllProdAcct(custId,countyId); } public List<PProdDto> queryProdByCountyId(String countyId, String prodStatus, String tariffStatus, String ruleId, String tariffType) throws Exception { return pProdDao.queryProdByCountyId(countyId, prodStatus, tariffStatus, ruleId, tariffType); } /** * @param prodId * @param countyId * @return */ public List<PProdDto> queryProdByCountyId(String prodId, String countyId) throws JDBCException { return pProdDao.queryProdByCountyId(prodId,countyId); } /** * 查询多个资费的折扣信息 * @param tariffIds * @return * @throws Exception */ public List<ProdTariffDto> queryTariffByTariffIds(String[] tariffIds) throws Exception{ List<ProdTariffDto> list = new ArrayList<ProdTariffDto>(); List<PProdTariff> ptList = pProdTariffDao.queryPTariffByIds(tariffIds); for(PProdTariff pt: ptList){ ProdTariffDto ptdto = new ProdTariffDto(); PropertyUtils.copyProperties(ptdto,pt); list.add(ptdto); } return list; } /** * 查询折扣 * @param tariffIds * @return */ public List<PProdTariffDisct> queryDisctByTariffIds(String[] tariffIds) throws Exception { return pProdTariffDisctDao.queryDisctByTariffIds(tariffIds, getOptr().getCounty_id()); } public PProdTariffDisct queryDistById(String disctId) throws Exception{ return pProdTariffDisctDao.findByKey(disctId); } /** * 保存用户套餐 * @param cust_id * @param acct_id * @param user_id * @param prodId * @param prodOrderTypeOrder * @param feeDate * @param tariff * @return */ public String addPackage(Integer doneCode,String custId,String acctId,String userId, String prodId, String prodType,String orderType, String feeDate, String expDate, String stopType,PProdTariff tariff,List<PPackageProd> packageProdList, List<UserProdRscDto> dynamicRscs,String stopByInvalidDate,String isBase,Date preOpenTime,String isBankPay) throws Exception{ CProd prod = new CProd(); prod.setProd_sn(gUserProdId()); prod.setDone_code(doneCode); prod.setCust_id(custId); prod.setUser_id(userId); prod.setAcct_id(acctId); prod.setProd_id(prodId); prod.setPre_open_time(preOpenTime); prod.setIs_bank_pay(isBankPay); prod.setTariff_id(tariff.getTariff_id()); prod.setOrder_type(orderType); //如果产品资费是非包月的, if(tariff.getBilling_cycle() > 1 && SystemConstants.BILLING_TYPE_MONTH.equals(tariff.getBilling_type())){ prod.setPublic_acctitem_type(SystemConstants.PUBLIC_ACCTITEM_TYPE_NONE); } //如果是订购,公用账目可用类型为都可以用 else if(SystemConstants.PROD_ORDER_TYPE_ORDER.equals(orderType)){ //潜江地区不用公用 if(SystemConstants.COUNTY_9005.equals(getOptr().getCounty_id())){ prod.setPublic_acctitem_type(SystemConstants.PUBLIC_ACCTITEM_TYPE_SPEC_ONLY); }else{ prod.setPublic_acctitem_type(SystemConstants.PUBLIC_ACCTITEM_TYPE_ALL); } }else{ prod.setPublic_acctitem_type(SystemConstants.PUBLIC_ACCTITEM_TYPE_NONE); } prod.setProd_type(prodType); if(null == preOpenTime){ prod.setStatus(StatusConstants.ACTIVE); }else{ prod.setStatus(StatusConstants.PREAUTHOR); } prod.setStatus_date(new Date()); prod.setInvalid_date(DateHelper.strToDate(feeDate)); prod.setStop_by_invalid_date(stopByInvalidDate); prod.setBillinfo_eff_date(DateHelper.strToDate(feeDate)); //next_bill_date已作废 // prod.setNext_bill_date(getNextBillDate(tariff, feeDate)); prod.setCounty_id(getOptr().getCounty_id()); prod.setArea_id(getOptr().getArea_id()); setProdStopType(prod, prodType, isBase, stopType,false); cProdDao.save(prod); createRecordChange( "C_PROD", "INS", prod.getProd_sn()); for (PPackageProd p : packageProdList){ // addProd(doneCode,custId, acctId, userId, prod.getProd_sn(), prodId, p // .getProd_id(), p.getProd().getProd_type(),SystemConstants.PROD_ORDER_TYPE_ORDER, // feeDate, expDate, prod.getStop_type(), p.getProdTariff(), dynamicRscs,stopByInvalidDate,isBase,preOpenTime,isBankPay); } return prod.getProd_sn(); } /** * 用户新增产品(基础产品或者客户套餐)及动态资源信息 * @param custId 客户编号 * @param acctId 账户编号 * @param userId 用户编号 * @param packageSn 所属套餐SN * @param prodId 产品id * @param orderType 订购方式 * @param effDate 开始计费日期 * @param dynamicRscs 动态资源 * @param tariff 资费信息 * @param preOpenTime 预开通日期.</br>    如果预开通不为空,则产品状态设置为 预开通 , * 不发授权开通指令(数字和宽带),并生成预开通JOB等待执行. * @return * @throws Exception */ public String addProd(Integer doneCode,String custId,String acctId,String userId,String packageSn, String packageId,String prodId,String prodType,String orderType,String feeDate,String expDate, String stopType,PProdTariff tariff, List<UserProdRscDto> dynamicRscList, String stopByInvalidDate,String isBase,Date preOpenTime,String isBankPay) throws Exception{ CProd prod = new CProd(); prod.setProd_sn(gUserProdId()); prod.setDone_code(doneCode); prod.setCust_id(custId); prod.setUser_id(userId); prod.setAcct_id(acctId); prod.setProd_id(prodId); prod.setProd_type(prodType); prod.setPackage_id(packageId); prod.setPackage_sn(packageSn); prod.setPre_open_time(preOpenTime); prod.setIs_bank_pay(isBankPay); if(null != tariff){ prod.setTariff_id(tariff.getTariff_id()); } prod.setOrder_type(orderType); //如果产品资费是非包月的, if(null !=tariff && tariff.getBilling_cycle() > 1 && SystemConstants.BILLING_TYPE_MONTH.equals(tariff.getBilling_type())){ prod.setPublic_acctitem_type(SystemConstants.PUBLIC_ACCTITEM_TYPE_NONE); } //如果是订购,公用账目可用类型为都可以用 else if(SystemConstants.PROD_ORDER_TYPE_ORDER.equals(orderType)){ //潜江地区不用公用 if(SystemConstants.COUNTY_9005.equals(getOptr().getCounty_id())){ prod.setPublic_acctitem_type(SystemConstants.PUBLIC_ACCTITEM_TYPE_SPEC_ONLY); }else{ prod.setPublic_acctitem_type(SystemConstants.PUBLIC_ACCTITEM_TYPE_ALL); } }else{ prod.setPublic_acctitem_type(SystemConstants.PUBLIC_ACCTITEM_TYPE_NONE); } if(preOpenTime !=null){ prod.setStatus(StatusConstants.PREAUTHOR); }else{ prod.setStatus(StatusConstants.ACTIVE); } prod.setStatus_date(new Date()); prod.setInvalid_date(DateHelper.strToDate(feeDate)); if(StringHelper.isNotEmpty(expDate)){ prod.setExp_date(DateHelper.strToDate(expDate)); } setProdStopType(prod, prodType, isBase, stopType,StringHelper.isNotEmpty(packageSn)?true:false); prod.setStop_by_invalid_date(stopByInvalidDate); //next_bill_date已作废 // prod.setNext_bill_date(getNextBillDate(tariff, feeDate)); /** * 0资费基本包时,开始计费日应该是订购当天,不应该是到期日前一天. */ if(prodType.equals(SystemConstants.PROD_TYPE_BASE) && tariff.getRent() == 0){ prod.setBillinfo_eff_date(DateHelper.now()); }else{ prod.setBillinfo_eff_date(DateHelper.strToDate(feeDate)); } prod.setCounty_id(getOptr().getCounty_id()); prod.setArea_id(getOptr().getArea_id()); cProdDao.save(prod); createRecordChange( "C_PROD", "INS", prod.getProd_sn()); //产品存在动态资源信息 PRes[] dynamicRscs = getDynamicRsc(prodId,dynamicRscList); if(dynamicRscs != null){ for (PRes rsc : dynamicRscs) { addUserProdres(prod.getProd_sn(), rsc.getRes_id()); } } return prod.getProd_sn(); } /** * 设置用户产品的催停标志 * @param prod * @param prodType * @param isBase * @param stopType */ private void setProdStopType(CProd prod,String prodType,String isBase,String stopType,boolean isChildProd){ if (StringHelper.isEmpty(stopType)) prod.setStop_type(SystemConstants.STOP_TYPE_KCKT); if (prodType.equals(SystemConstants.PROD_TYPE_CUSTPKG) || isChildProd){ prod.setStop_type(stopType); } else { if (SystemConstants.BOOLEAN_TRUE.equals(isBase)){ prod.setStop_type(stopType); } else { prod.setStop_type(SystemConstants.STOP_TYPE_KCKT); } } } public void addUserProdres(String prodSn, String resId) throws Exception { CProdRsc userProdRsc = new CProdRsc(); userProdRsc.setProd_sn(prodSn); userProdRsc.setRes_id(resId); userProdRsc.setCounty_id(getOptr().getCounty_id()); userProdRsc.setArea_id(getOptr().getArea_id()); List<CProdRsc> userProdResList = cProdRscDao.findByEntity(userProdRsc); if (userProdResList == null || userProdResList.size()==0) cProdRscDao.save(userProdRsc); } /** * 增加产品资源账户 */ public void addProdRscAcct(Integer doneCode,String prodSn,String feeUnit,int amount) throws Exception{ CProdResourceAcct rscAcct = new CProdResourceAcct(); rscAcct.setProd_sn(prodSn); rscAcct.setDone_code(doneCode); rscAcct.setFree_unit(feeUnit); rscAcct.setAmount(amount); setBaseInfo(rscAcct); cProdResourceAcctDao.save(rscAcct); } /** * 修改产品资费 * @param prodSn * @param tariffId * @throws JDBCException */ public void updateProdTariff(Integer doneCode, String prodSn,String tariffId) throws Exception{ PProdTariff tariff = this.pProdTariffDao.findByKey(tariffId); // CProd prod = cProdDao.findByKey(prodSn); // PProdTariff oldTariff = pProdTariffDao.findByKey(prod.getTariff_id()); //单月资费改为多月资费 /*if (oldTariff.getBilling_type().equals(SystemConstants.BILLING_TYPE_MONTH) && tariff.getBilling_cycle().intValue() > 1) { cProdDao.updateNextBillDate(prodSn); }*/ String stopByInvlaidDate = SystemConstants.BOOLEAN_FALSE; String publicType = SystemConstants.PUBLIC_ACCTITEM_TYPE_ALL; if ( tariff.getBilling_cycle()>1 || (tariff.getBilling_type().equals(SystemConstants.BILLING_TYPE_MONTH) && tariff.getRent() ==0)){ stopByInvlaidDate = SystemConstants.BOOLEAN_TRUE; publicType = SystemConstants.PUBLIC_ACCTITEM_TYPE_NONE; } cProdDao.updateProdTariff(doneCode, prodSn, tariffId,stopByInvlaidDate, publicType); createRecordChange("C_PROD", "MOD", prodSn); } /** * 修改产品未生效资费 * @param prodSn * @param nextTariffId * @param countyId * @throws Exception */ public void updateNextTariff(String prodSn,String nextTariffId) throws Exception{ cProdDao.updateNextTariff(prodSn, nextTariffId, getOptr().getCounty_id()); } /** * 修改产品状态 * @param doneCode * @param prod_sn * @param status * @param active */ public void updateProdStatus(Integer doneCode, String prodSn, String oldStatus, String newStatus) throws Exception{ CProd prod = cProdDao.findByKey(prodSn); List<CProdPropChange> changeList = new ArrayList<CProdPropChange>(); CProdPropChange propChange = new CProdPropChange(); propChange.setColumn_name("status"); propChange.setOld_value(oldStatus); propChange.setNew_value(newStatus); changeList.add(propChange); propChange = new CProdPropChange(); propChange.setColumn_name("status_date"); propChange.setOld_value(DateHelper.dateToStr(prod.getStatus_date())); propChange.setNew_value(DateHelper.formatNow()); changeList.add(propChange); editProd(doneCode, prodSn, changeList); } /** * 修改产品对应的套餐 * @param prodSn * @param pkgSn * @param pkgId * @throws Exception */ public void updateProdPkg(String prodSn,String pkgSn,String pkgId) throws Exception{ cProdDao.updateProdPkg(prodSn, pkgSn,pkgId, getOptr().getCounty_id()); createRecordChange("C_PROD", "MOD", prodSn); } /** * 更新产品的出帐日期 * @param userId * @param days * @throws Exception */ public void updateNextBillDate(String userId,String stopDate) throws Exception { cProdDao.updateNextBillDate(userId, stopDate, getOptr().getCounty_id()); } /** * @param doneCode * @param busiCode * @param oldUserId * @param newCustId * @param newUserId * @param newAcctId * @throws Exception */ public void updateProd(Integer doneCode, String busiCode, String oldUserId, String newCustId, String newUserId, String newAcctId) throws Exception { List<CProd> prodList = cProdDao.queryByUserId(oldUserId); CUser newUser = cUserDao.findByKey(newUserId); for(CProd prod : prodList){ List<CProdPropChange> propChangeList = new ArrayList<CProdPropChange>(); CProdPropChange change = new CProdPropChange(); change.setProd_sn(prod.getProd_sn()); change.setColumn_name("cust_id"); change.setOld_value(prod.getCust_id()); change.setNew_value(newCustId); change.setBusi_code(busiCode); setBaseInfo(change); propChangeList.add(change); change = new CProdPropChange(); change.setProd_sn(prod.getProd_sn()); change.setColumn_name("user_id"); change.setOld_value(prod.getUser_id()); change.setNew_value(newUserId); change.setBusi_code(busiCode); setBaseInfo(change); propChangeList.add(change); change = new CProdPropChange(); change.setProd_sn(prod.getProd_sn()); change.setColumn_name("acct_id"); change.setOld_value(prod.getAcct_id()); change.setNew_value(newAcctId); change.setBusi_code(busiCode); setBaseInfo(change); propChangeList.add(change); this.editProd(doneCode, prod.getProd_sn(), propChangeList); jobComponent.createBusiCmdJob(doneCode, BusiCmdConstants.ACCTIVATE_PROD, newUser.getCust_id(), newUser.getUser_id(), newUser.getStb_id(), newUser.getCard_id(), newUser.getModem_mac(), prod.getProd_sn(), prod.getProd_id()); } } public List<CProdDto> queryChildProdByPkgsn(String pkgSn) throws Exception { return cProdDao.queryChildProdByPkgsn(pkgSn, getOptr().getCounty_id()); } /** * 删除用户产品 * @param doneCode * @param prodSn * @throws Exception */ public void removeProdWithHis(Integer doneCode,CProd prod) throws Exception{ //保存产品历史 CProdHis prodHis = new CProdHis(); PropertyUtils.copyProperties(prodHis, prod); prodHis.setDone_code(doneCode); prodHis.setOrder_done_code(prod.getDone_code()); prodHis.setStatus(StatusConstants.INVALID); cProdHisDao.save(prodHis); //删除产品 cProdDao.remove(prod.getProd_sn()); createRecordChange("C_PROD", "DEL", prod.getProd_sn()); //cProdRscDao.removeByProdSn(prod.getProd_sn());不能删除产品的动态资源,否则指令就会找不到要发的资源 cProdResourceAcctDao.removeByProdSn(prod.getProd_sn()); //如果是套餐,删除子产品 if (!prod.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){ List<CProdDto> childList = cProdDao.queryChildProdByPkgsn(prod.getProd_sn(), getOptr().getCounty_id()); for (CProdDto childProd:childList){ CProdHis childProdHis = new CProdHis(); PropertyUtils.copyProperties(childProdHis, childProd); childProdHis.setOrder_done_code(childProd.getDone_code()); childProdHis.setDone_code(doneCode); cProdHisDao.save(childProdHis); //删除产品 cProdDao.remove(childProd.getProd_sn()); // cProdRscDao.removeByProdSn(childProd.getProd_sn());不能删除产品的动态资源,否则指令就会找不到要发的资源 createRecordChange("C_PROD", "DEL", prod.getProd_sn()); } } } /** * 删除产品不记录历史 * @param doneCode * @param prodSn * @throws Exception */ public void removeProdWithoutHis(Integer doneCode,String prodSn) throws Exception{ //删除产品 cProdDao.remove(prodSn); createRecordChange("C_PROD", "DEL", prodSn); cProdResourceAcctDao.removeByProdSn(prodSn); cProdResourceAcctDao.removeByProdSn(prodSn); //如果是套餐,删除子产品 List<CProdDto> childList = cProdDao.queryChildProdByPkgsn(prodSn, getOptr().getCounty_id()); if (childList != null){ for (CProdDto childProd:childList){ cProdDao.remove(childProd.getProd_sn()); cProdRscDao.removeByProdSn(childProd.getProd_sn()); createRecordChange("C_PROD", "DEL", prodSn); } } } public void removeProdRes(String prodSn,String[] resIds) throws Exception{ if (resIds != null && resIds.length>0){ cProdRscDao.removeByProdRes(prodSn, resIds); } } /** * 增加一条用户产品历史记录 * @param doneCode * @param prod * @throws Exception */ public void addHis(Integer doneCode,CProd prod) throws Exception{ //保存产品历史 CProdHis prodHis = new CProdHis(); PropertyUtils.copyProperties(prodHis, prod); prodHis.setDone_code(doneCode); prodHis.setOrder_done_code(prod.getDone_code()); prodHis.setInvalid_date(new Date()); cProdHisDao.save(prodHis); } public void saveProdSyn(int doneCode,String custId,String sourceUserId,String orderUserId, String prodId,String isNewProd,Date oldInvalidDate,Date newInvalidDate,int fee) throws Exception { CProdSyn syn = new CProdSyn(); syn.setDone_code(doneCode); syn.setCust_id(custId); syn.setSoruce_user_id(sourceUserId); syn.setOrder_user_id(orderUserId); syn.setProd_id(prodId); syn.setIs_new_prod(isNewProd); syn.setOld_invalid_date(oldInvalidDate); syn.setNew_invalid_date(newInvalidDate); syn.setFee(fee); syn.setArea_id(this.getOptr().getArea_id()); syn.setCounty_id(this.getOptr().getCounty_id()); this.cProdSynDao.save(syn); } public void changeProdDynRes(String prodSn,List<UserProdRscDto> dyResList) throws Exception { cProdRscDao.removeByProdSn(prodSn); List<CProdRsc> prList = new ArrayList<CProdRsc>(); for(UserProdRscDto upRsc : dyResList){ List<PRes> resList = upRsc.getRscList(); for(PRes pres : resList){ CProdRsc pr = new CProdRsc(); pr.setProd_sn(prodSn); pr.setRes_id(pres.getRes_id()); pr.setCounty_id(getOptr().getCounty_id()); pr.setArea_id(getOptr().getArea_id()); prList.add(pr); } } cProdRscDao.save(prList.toArray(new CProdRsc[prList.size()])); createRecordChange( "C_PROD", "INS", prodSn); } /** * 保存套餐缴费中产品的动态资源 * @param prodSn * @param resList */ public void savePromFeeProdDynRes(String prodSn,List<PRes> resList)throws Exception { cProdRscDao.removeByProdSn(prodSn); List<CProdRsc> prList = new ArrayList<CProdRsc>(); Map<String,String> prMap=new HashMap<String,String>();//去掉重复的资源 for(PRes pres : resList){ if(!prMap.containsKey(pres.getRes_id())){ CProdRsc pr = new CProdRsc(); pr.setProd_sn(prodSn); pr.setRes_id(pres.getRes_id()); pr.setCounty_id(getOptr().getCounty_id()); pr.setArea_id(getOptr().getArea_id()); prList.add(pr); prMap.put(pres.getRes_id(), pres.getRes_id()); } } cProdRscDao.save(prList.toArray(new CProdRsc[prList.size()])); } /** * 获取产品的下次出帐日期 * @param tariff * @param effDate * @return */ private Date getNextBillDate(PProdTariff tariff,String effDate){ if (null != tariff && tariff.getBilling_cycle()>1){ return DateHelper.strToDate(effDate); } else { return null; } } /** * 根据流水查找到期日变更的异动记录,算出2个日期的相差天数 * @param doneCode * @return * @throws Exception */ public int getDate(int doneCode) throws Exception { CProdPropChange change = cProdPropChangeDao.queryOldDate(doneCode, getOptr().getCounty_id()); if (change == null) return 0; return DateHelper.getDifferDays(change.getOld_value(),change.getNew_value()); } /** * 0资费产品冲正,根据冲正的流水找到原先交费的天数,目前的到期日期减去这个天数 * @param doneCode * @param oldDoneCode * @param prodSn * @return * @throws Exception */ public Date updateInvalidDateByDoneCode(int doneCode,int oldDoneCode, String prodSn) throws Exception { if(StringHelper.isNotEmpty(prodSn)){ CProd prod = queryByProdSn(prodSn); if (prod != null ){ int num = getDate(oldDoneCode); Date invalidDate = getDate(prod.getInvalid_date(), 0, -num); //如果本产品是用户套餐产品就查询所有子产品 List<CProd> prodList = queryByPkgSn(prodSn); //添加本产品的c_prod到list prodList.add(prod); for(CProd dto:prodList){ List<CProdPropChange> List = new ArrayList<CProdPropChange>(); List.add(new CProdPropChange("invalid_date", DateHelper.dateToStr(dto.getInvalid_date()),DateHelper.dateToStr(invalidDate))); editProd(doneCode, dto.getProd_sn(), List); } return invalidDate; } } return null; } /** * lxr:账务模式修改计算方法 注销原始方法 public Date updateInvalidDate(int doneCode, String prodSn,int freeDays, int changeFee, CAcctAcctitem acctItem) throws Exception { if(StringHelper.isNotEmpty(prodSn)){ CProd prod = queryByProdSn(prodSn); if (prod != null ){ //判断产品资费的租金是否为0,如果是0则不计算 //保存用户到期日异动信息 PProdTariff tariff = this.queryProdTariffById(prod.getTariff_id()); if (tariff.getRent()>0){ int balance = acctItem.getActive_balance() + acctItem.getInactive_balance(); //包多月的产品,账单费用 int billFee = 0; if(tariff.getBilling_cycle() > 1){ billFee = cProdDao.queryBillFeeByProdSn(prodSn); } Date invalidDate = getInvalidDate(prod.getInvalid_date(), prod.getTariff_id(), acctItem.getOwe_fee(),balance,acctItem.getReal_fee(),changeFee,freeDays,billFee); //如果本产品是用户套餐产品就查询所有子产品 List<CProd> prodList = queryByPkgSn(prodSn); //添加本产品的c_prod到list prodList.add(prod); //新增到期日 int day = DateHelper.getDiffDays(prod.getInvalid_date(), invalidDate); for(CProd dto:prodList){ //套餐子产品到期日:原来的到期日加上新增的到期日 if(StringHelper.isNotEmpty(dto.getPackage_sn())){ List<CProdPropChange> List = new ArrayList<CProdPropChange>(); Date newInvalidDate = DateHelper.addDate(dto.getInvalid_date().before(new Date()) ? new Date() : dto.getInvalid_date(), day); List.add(new CProdPropChange("invalid_date", DateHelper.dateToStr(dto.getInvalid_date()),DateHelper.dateToStr(newInvalidDate))); //如果是包多月产品, if(SystemConstants.BOOLEAN_TRUE.equals(dto.getStop_by_invalid_date()) && dto.getNext_bill_date() != null){ Date nextBillDate = dto.getNext_bill_date(); Date today = DateHelper.strToDate(DateHelper.formatNow()); if(nextBillDate.before(DateHelper.strToDate(DateHelper.formatNow()))){ nextBillDate = today; } //如果新的到期日比下次出账日期小,而且已经出过账("已经出账"为了排除那些因第一次免费观看,导致出账在到期日之后的情况) if(!today.equals(invalidDate) && invalidDate.before(nextBillDate) && null !=dto.getLast_bill_date()){ nextBillDate = invalidDate; } if(!dto.getNext_bill_date().equals(nextBillDate)){ List.add(new CProdPropChange("next_bill_date", DateHelper.dateToStr(dto.getNext_bill_date()),DateHelper.dateToStr(nextBillDate))); } } editProd(doneCode, dto.getProd_sn(), List); }else{ List<CProdPropChange> List = new ArrayList<CProdPropChange>(); List.add(new CProdPropChange("invalid_date", DateHelper.dateToStr(dto.getInvalid_date()),DateHelper.dateToStr(invalidDate))); //如果是包多月产品, if(SystemConstants.BOOLEAN_TRUE.equals(dto.getStop_by_invalid_date()) && dto.getNext_bill_date() != null){ Date nextBillDate = dto.getNext_bill_date(); Date today = DateHelper.strToDate(DateHelper.formatNow()); if(nextBillDate.before(DateHelper.strToDate(DateHelper.formatNow()))){ nextBillDate = today; } //如果新的到期日比下次出账日期小,而且已经出过账("已经出账"为了排除那些因第一次免费观看,导致出账在到期日之后的情况) if(!today.equals(invalidDate) && invalidDate.before(nextBillDate) && null !=dto.getLast_bill_date()){ nextBillDate = invalidDate; } if(!dto.getNext_bill_date().equals(nextBillDate)){ List.add(new CProdPropChange("next_bill_date", DateHelper.dateToStr(dto.getNext_bill_date()),DateHelper.dateToStr(nextBillDate))); } } editProd(doneCode, dto.getProd_sn(), List); } } return invalidDate; } } } return null; } public Date updateInvalidDateByTariff(int doneCode, String prodSn, CAcctAcctitem acctItem) throws Exception { if(StringHelper.isNotEmpty(prodSn)){ CProd prod = queryByProdSn(prodSn); if (prod != null ){ //判断产品资费的租金是否为0,如果是0则不计算 //保存用户到期日异动信息 PProdTariff tariff = this.queryProdTariffById(prod.getTariff_id()); if (tariff.getRent()>0){ int balance = acctItem.getActive_balance() + acctItem.getInactive_balance(); Date invalidDate = getInvalidDateByTarrif(DateHelper.now(), prod.getTariff_id(), acctItem.getOwe_fee(),balance,acctItem.getReal_fee()); //如果本产品是用户套餐产品就查询所有子产品 List<CProd> prodList = queryByPkgSn(prodSn); //添加本产品的c_prod到list prodList.add(prod); //新增到期日 int day = DateHelper.getDiffDays(prod.getInvalid_date(), invalidDate); for(CProd dto:prodList){ //套餐子产品到期日:原来的到期日加上新增的到期日 if(StringHelper.isNotEmpty(dto.getPackage_sn())){ List<CProdPropChange> List = new ArrayList<CProdPropChange>(); Date newInvalidDate = DateHelper.addDate(dto.getInvalid_date().before(new Date()) ? new Date() : dto.getInvalid_date(), day); List.add(new CProdPropChange("invalid_date", DateHelper.dateToStr(dto.getInvalid_date()),DateHelper.dateToStr(newInvalidDate))); //如果是包多月产品, if(SystemConstants.BOOLEAN_TRUE.equals(dto.getStop_by_invalid_date()) && dto.getNext_bill_date() != null){ Date nextBillDate = dto.getNext_bill_date(); Date today = DateHelper.strToDate(DateHelper.formatNow()); if(nextBillDate.before(DateHelper.strToDate(DateHelper.formatNow()))){ nextBillDate = today; } //如果新的到期日比下次出账日期小,而且已经出过账("已经出账"为了排除那些因第一次免费观看,导致出账在到期日之后的情况) if(!today.equals(invalidDate) && invalidDate.before(nextBillDate) && null !=dto.getLast_bill_date()){ nextBillDate = invalidDate; } if(!dto.getNext_bill_date().equals(nextBillDate)){ List.add(new CProdPropChange("next_bill_date", DateHelper.dateToStr(dto.getNext_bill_date()),DateHelper.dateToStr(nextBillDate))); } } editProd(doneCode, dto.getProd_sn(), List); }else{ List<CProdPropChange> List = new ArrayList<CProdPropChange>(); List.add(new CProdPropChange("invalid_date", DateHelper.dateToStr(dto.getInvalid_date()),DateHelper.dateToStr(invalidDate))); //如果是包多月产品, if(SystemConstants.BOOLEAN_TRUE.equals(dto.getStop_by_invalid_date()) && dto.getNext_bill_date() != null){ Date nextBillDate = dto.getNext_bill_date(); Date today = DateHelper.strToDate(DateHelper.formatNow()); if(nextBillDate.before(DateHelper.strToDate(DateHelper.formatNow()))){ nextBillDate = today; } //如果新的到期日比下次出账日期小,而且已经出过账("已经出账"为了排除那些因第一次免费观看,导致出账在到期日之后的情况) if(!today.equals(invalidDate) && invalidDate.before(nextBillDate) && null !=dto.getLast_bill_date()){ nextBillDate = invalidDate; } if(!dto.getNext_bill_date().equals(nextBillDate)){ List.add(new CProdPropChange("next_bill_date", DateHelper.dateToStr(dto.getNext_bill_date()),DateHelper.dateToStr(nextBillDate))); } } editProd(doneCode, dto.getProd_sn(), List); } } return invalidDate; } } } return null; } */ /* *//** * 得到下一个到期日 * @param invalidDate * @param tariffId * @param changeFee * @param acctItem * @return * @throws Exception *//* public Date getNextInvalidDate(Date invalidDate,String tariffId,int changeFee, CAcctAcctitem acctItem) throws Exception{ int balance = acctItem.getActive_balance() + acctItem.getInactive_balance(); return getInvalidDate(invalidDate, tariffId, acctItem.getOwe_fee(),balance,acctItem.getReal_fee(),changeFee, 0); }*/ /** * 修改到期日,如果非正常状态变成正常状态 * @param doneCode * @param prod * @param invalidDate * @throws Exception */ public void editInvalidDate(int doneCode, CProd prod,Date invalidDate) throws Exception { //保存用户产品订购方式和到期日异动信息 List<CProdPropChange> changeList = new ArrayList<CProdPropChange>(); changeList.add(new CProdPropChange("invalid_date", DateHelper.dateToStr(prod.getInvalid_date()),DateHelper.dateToStr(invalidDate))); if(!prod.getStatus().equals(StatusConstants.ACTIVE)){ changeList.add(new CProdPropChange("status",prod.getStatus(),StatusConstants.ACTIVE)); //next_bill_date已作废 // changeList.add(new CProdPropChange("next_bill_date",DateHelper.dateToStr(prod.getNext_bill_date()), // DateHelper.dateToStr(invalidDate))); } //新增到期日 //next_bill_date已作废 // int day = DateHelper.getDiffDays(prod.getInvalid_date(), invalidDate); // Date newBillDate = DateHelper.addDate(prod.getNext_bill_date().before(new Date()) ? new Date() : prod.getNext_bill_date(), day); // changeList.add(new CProdPropChange("next_bill_date",DateHelper.dateToStr(prod.getNext_bill_date()), // DateHelper.dateToStr(newBillDate))); editProd(doneCode, prod.getProd_sn(), changeList); List<CProd> prodList = queryByPkgSn(prod.getProd_sn()); for(CProd cprod : prodList){ if(StringHelper.isNotEmpty(cprod.getPackage_sn())){ List<CProdPropChange> cpcList = new ArrayList<CProdPropChange>(); cpcList.add(new CProdPropChange("invalid_date", DateHelper.dateToStr(cprod.getInvalid_date()),DateHelper.dateToStr(invalidDate))); editProd(doneCode, cprod.getProd_sn(), cpcList); } } } /** * 协议缴费,修改到期日,产品状态由非正常,改为正常,并发加授权 * 20130416 by wqy 临时授权,修改到期日,状态改为临时开通,并发加授权 * @param doneCode * @param prodSn * @param invalidDate * @throws Exception */ public void updateInvalidDateStatus(int doneCode, String prodSn,Date invalidDate,String busiCode) throws Exception { if(StringHelper.isNotEmpty(prodSn)){ CProd prod = queryByProdSn(prodSn); //保存用户产品订购方式和到期日异动信息 List<CProdPropChange> changeList = new ArrayList<CProdPropChange>(); changeList.add(new CProdPropChange("invalid_date", DateHelper.dateToStr(prod.getInvalid_date()),DateHelper.dateToStr(invalidDate))); if(!prod.getStatus().equals(StatusConstants.ACTIVE)){ if(busiCode.equals(BusiCodeConstants.ACCT_PAY_ZERO)){ changeList.add(new CProdPropChange("status",prod.getStatus(),StatusConstants.ACTIVE)); }else if(busiCode.equals(BusiCodeConstants.USER_OPEN_TEMP)){ changeList.add(new CProdPropChange("status",prod.getStatus(),StatusConstants.TMPOPEN)); } //发送指令 CUser user = cUserDao.findByKey(prod.getUser_id()); jobComponent.createBusiCmdJob(doneCode, BusiCmdConstants.ACCTIVATE_PROD, user.getCust_id(), user.getUser_id(), user.getStb_id(), user.getCard_id(), user.getModem_mac(), prodSn,prod.getProd_id()); } editProd(doneCode, prod.getProd_sn(), changeList); } } public void updateInvalidDate(int doneCode, String prodSn,Date invalidDate) throws Exception { if(StringHelper.isNotEmpty(prodSn)){ CProd prod = queryByProdSn(prodSn); if(!DateHelper.dateToStr(prod.getInvalid_date()).equals(DateHelper.dateToStr(invalidDate))){ //保存用户产品订购方式和到期日异动信息 List<CProdPropChange> changeList = new ArrayList<CProdPropChange>(); changeList.add(new CProdPropChange("invalid_date", DateHelper.dateToStr(prod.getInvalid_date()),DateHelper.dateToStr(invalidDate))); editProd(doneCode, prod.getProd_sn(), changeList); } } } /** * 修改失效日期 * @param doneCode * @param prodSn * @param newExpDate * @throws Exception */ public void updateExpDate(int doneCode, String prodSn,String newExpDate) throws Exception { if(StringHelper.isNotEmpty(prodSn)){ CProd prod = queryByProdSn(prodSn); List<CProdPropChange> changeList = new ArrayList<CProdPropChange>(); String time = null; if(StringHelper.isNotEmpty(newExpDate)){ time = newExpDate; } changeList.add(new CProdPropChange("exp_date", DateHelper.dateToStr(prod.getExp_date()),time)); editProd(doneCode, prod.getProd_sn(), changeList); } } public void removeByProdSn(String prodSn, String tariffId) throws Exception { JProdNextTariff jProdNextTariff = jProdNextTariffDao.queryByProdSn( prodSn, tariffId, getOptr().getCounty_id()); JProdNextTariffHis jProdNextTariffHis = new JProdNextTariffHis(); BeanUtils.copyProperties(jProdNextTariff, jProdNextTariffHis); jProdNextTariffHisDao.save(jProdNextTariffHis); jProdNextTariffDao.removeByProdSn(prodSn, tariffId, getOptr().getCounty_id()); this.updateNextTariff(prodSn, null); } public void removeNextByProdSn(String prodSn) throws Exception { List<JProdNextTariff> jProdNextTariffList = jProdNextTariffDao.queryNextByProdSn( prodSn, getOptr().getCounty_id()); for(JProdNextTariff dto :jProdNextTariffList){ JProdNextTariffHis jProdNextTariffHis = new JProdNextTariffHis(); BeanUtils.copyProperties(dto, jProdNextTariffHis); jProdNextTariffHisDao.save(jProdNextTariffHis); } jProdNextTariffDao.removeByProdSn(prodSn, getOptr().getCounty_id()); this.updateNextTariff(prodSn, null); } /** * 日期计算 * @param beginDate * @param addMonths * @param addDays * @return * @throws Exception */ public Date getDate(Date beginDate,int addMonths,int addDays) throws Exception{ return cProdDao.getDate(beginDate, addMonths, addDays); } /** * lxr:账务模式到期日 该方法失效 * 产品信息 * @param prod * @param changeBalance 余额变化量 * @return * @throws Exception */ @Deprecated private Date getInvalidDate(Date invalidDate,String tariffId,int oweFee,int balance,int realFee,int changeBalance,int changeFreeDays,int billFee) throws Exception{ PProdTariff tariff = pProdTariffDao.findByKey(tariffId); PProd prod = pProdDao.findByKey(tariff.getProd_id()); if (tariff.getRent() == 0) return invalidDate; int addMonths=0; int addDays =changeFreeDays; if (changeBalance!=0){ if (!prod.getServ_id().equals(SystemConstants.PROD_SERV_ID_ATV)){ changeBalance = changeBalance - (balance>oweFee?0:oweFee-balance); if (invalidDate.before(DateHelper.today())){ changeBalance = changeBalance + balance - realFee; // if ((int)Math.round(tariff.getRent()*1.0/30*(DateHelper.getCurrDAY()-1)) == realFee) { // //invalidDate = DateHelper.strToDate(DateHelper.getFirstDateInCurrentMonth()); // } else { invalidDate = new Date(); // } } } //计费方式包月 if (tariff.getBilling_type().equals(SystemConstants.BILLING_TYPE_MONTH)){ if (tariff.getBilling_cycle()>1){ //如果变化金额+扣除账单后剩余的金额小于0,到期日恢复到当天 if((changeBalance+balance-billFee)<0){ invalidDate = new Date(); }else{ addMonths = ((changeBalance+balance-billFee)/tariff.getRent() - (balance-billFee)/tariff.getRent()) *tariff.getBilling_cycle(); } } else { addMonths = changeBalance/tariff.getRent(); addDays += (changeBalance - tariff.getRent()*addMonths)/(tariff.getRent()/30); } } } invalidDate = getDate(invalidDate, addMonths, addDays); if(LoggerHelper.isDebugEnabled(UserProdComponent.class)){ StringBuffer msg= new StringBuffer(100); msg.append("invalidDate=").append(invalidDate); msg.append("tariffId=").append(tariffId); msg.append("oweFee=").append(oweFee); msg.append("balance=").append(balance); msg.append("realFee=").append(realFee); msg.append("changeBalance=").append(changeBalance); msg.append("changeFreeDays=").append(changeFreeDays); msg.append("addMonths=").append(addMonths); msg.append("addDays=").append(addDays); msg.append("result invalidDate=").append(invalidDate); LoggerHelper.debug(UserProdComponent.class, msg.toString()); } return invalidDate; } /** * 账务模式 到期日 该方法失效 * 现用于资费变更生效时计算到期日,扣除所有欠费后的剩余金额>0时,重新计算到期日 * @param invalidDate 原到期日 * @param tariffId 新资费 * @param oweFee 往月欠费 * @param balance 账户金额 * @param realFee 实时费用 * @return * @throws Exception */ @Deprecated private Date getInvalidDateByTarrif(Date invalidDate,String tariffId,int oweFee,int balance,int realFee) throws Exception{ PProdTariff tariff = pProdTariffDao.findByKey(tariffId); if (tariff.getRent() == 0) return invalidDate; int addMonths=0; int addDays =0; int changeBalance = 0; changeBalance = balance>(oweFee+realFee)?balance-(oweFee+realFee):0; if(changeBalance>0){ //计费方式包月 if (tariff.getBilling_type().equals(SystemConstants.BILLING_TYPE_MONTH)){ if (tariff.getBilling_cycle()>1){ addMonths = (changeBalance/tariff.getRent()) *tariff.getBilling_cycle(); } else { addMonths = changeBalance/tariff.getRent(); addDays += (changeBalance - tariff.getRent()*addMonths)/(tariff.getRent()/30); } } //包月周期>1时,剩余金额<资费金额,那么到期日还是原到期日 if(addMonths>0||addDays>0){ invalidDate = new Date(); } } invalidDate = getDate(invalidDate, addMonths, addDays); return invalidDate; } public int getFeeByNextInvaildDate(Date nextInvalidDate,Date invalidDate,String tariffId,CAcctAcctitem acctItem) throws JDBCException{ int fee = 0; PProdTariff tariff = pProdTariffDao.findByKey(tariffId); //零资费 if (tariff.getRent() == 0){ return fee; } int balance = acctItem.getActive_balance() + acctItem.getInactive_balance(); //余额<=0 if(balance <= 0){ fee = acctItem.getOwe_fee(); } PProd prod = pProdDao.findByKey(tariff.getProd_id()); //服务类型不是模拟 if (!prod.getServ_id().equals(SystemConstants.PROD_SERV_ID_ATV)){ if (invalidDate.before(new Date())){ if ((int)Math.round(tariff.getRent()*1.0/30*(DateHelper.getCurrDAY()-1)) == acctItem.getReal_fee()) { invalidDate = DateHelper.strToDate(DateHelper.getFirstDateInCurrentMonth()); } else { invalidDate = new Date(); // changeBalance = changeBalance + balance - realFee; fee = fee + acctItem.getReal_fee() - balance; } } } Calendar cal = Calendar.getInstance(); cal.setTime(nextInvalidDate); Calendar cal2 = Calendar.getInstance(); cal2.setTime(invalidDate); int months = (cal.get(Calendar.YEAR) - cal2.get(Calendar.YEAR)) * 12 + (cal.get(Calendar.MONTH) - cal2.get(Calendar.MONTH)); int days = cal.get(Calendar.DAY_OF_MONTH) - cal2.get(Calendar.DAY_OF_MONTH); //计费方式包月 if (tariff.getBilling_type().equals(SystemConstants.BILLING_TYPE_MONTH)){ if (tariff.getBilling_cycle()>1){ fee = fee + months * tariff.getRent()/tariff.getBilling_cycle(); } else { fee = fee + months * tariff.getRent() + days * tariff.getRent() / 30; } } return fee; } /** * 查询所有模拟产品 * @return * @throws Exception */ public List<PProd> queryAllAtvProds() throws Exception{ return pProdDao.queryCanOrderUserProd(SystemConstants.PROD_SERV_ID_ATV, getOptr().getArea_id(), getOptr().getCounty_id(), SystemConstants.DEFAULT_DATA_RIGHT); } /** * 查询所有数字产品 * @param areaId * @param countyId * @return * @throws Exception */ public List<PProd> queryAllDtvProds(String servId ,String areaId,String countyId) throws Exception{ return pProdDao.queryCanOrderUserProd(servId, areaId, countyId, "1=1"); } public List<PProd> queryCanOrderUserProd(String servId) throws Exception { String dataRight = this.queryDataRightCon(getOptr(), DataRight.PROD_ORDER.toString()); return pProdDao.queryCanOrderUserProd(servId,getOptr().getArea_id(),getOptr().getCounty_id(),dataRight); } /** * 获得用户可以订购的产品 * @param userIds * @param servId 产品服务 * @return */ public List<PProd> queryCanOrderProds(String[] userIds, String servId) throws Exception { //读取操作员的数据权限 String dataRight = this.queryDataRightCon(getOptr(), DataRight.PROD_ORDER.toString()); List<PProd> prods = pProdDao.queryCanOrderUserProd(servId,getOptr().getArea_id(),getOptr().getCounty_id(),dataRight); List<PProd> result = new ArrayList<PProd>(); List<CProdDto> ordered = queryByUserIds(userIds); String needBaseProd = queryTemplateConfig(Template.NEED_BASE_PROD.toString()); Map<String,List<CProdDto>> map = null; if(userIds.length > 1){ //如果该县市需要基本包 if(SystemConstants.BOOLEAN_TRUE.equals(needBaseProd)){ map = CollectionHelper.converToMap(ordered, "user_id"); //不相等说明有用户没订购基本包 if(map.size() != 0 && map.size() != userIds.length){ throw new ComponentException("有用户没订购基本包,无法批量订购"); } } } for (PProd p : prods) { boolean isfind = false; for (CProd up : ordered) { if (p.getProd_id().equals(up.getProd_id())) { isfind = true; break; } } //如果该县市需要基本包,且用户没有订购任何产品,则至返回基本包产品 if (SystemConstants.BOOLEAN_TRUE.equals(needBaseProd)){ //没订购产品,或订购了一个非基本包节目(按次点播) if (ordered == null || ordered.size()==0 || (ordered.size() == 1 && ordered.get(0).getIs_base().equals(SystemConstants.BOOLEAN_FALSE))){ if (p.getIs_base().equals(SystemConstants.BOOLEAN_FALSE)) isfind = true; } } if (!isfind){ result.add(p); } } return result; } /** * @param custId * @return */ public List<PProd> queryCanOrderPkgs(String custId) throws Exception{ //读取操作员的数据权限 String dataRight = this.queryDataRightCon(getOptr(), DataRight.PROD_ORDER.toString()); List<PProd> prods = pProdDao.queryCanOrderPkg(getOptr().getCounty_id(),dataRight); List<PProd> result = new ArrayList<PProd>(); List<CProdDto> ordered = cProdDao.queryPkgByCustId(custId,getOptr().getCounty_id()); for (PProd p : prods) { boolean isfind = false; for (CProdDto up : ordered) { if (p.getProd_id().equals(up.getProd_id())) { isfind = true; break; } } if (!isfind){ result.add(p); } } return result; } /** * 查找客户下所有产品 * @param custId * @return */ public List<CProdDto> queryProdByCustId(String custId) throws Exception { String dataRight = ""; try { dataRight = this.queryDataRightCon(getOptr(), DataRight.PROD_PAUSE.toString()); } catch (Exception e) { } List<CProdDto> prodList = cProdDao.queryProdByCustId(custId, getOptr().getCounty_id()); if(StringHelper.isNotEmpty(dataRight)){ for(CProdDto prod : prodList){ //规则表达式包含要暂停的产品ID,则该产品可暂停 if(dataRight.indexOf(prod.getProd_id()) > -1){ prod.setIs_pause(SystemConstants.BOOLEAN_TRUE); }else{ prod.setIs_pause(SystemConstants.BOOLEAN_FALSE); } } } return prodList; } private void setUserName(List<UserProdDto> list){ for( UserProdDto userProd :list){ if("DTV".equals(userProd.getUser_type())){ if (StringHelper.isEmpty(userProd.getUser_name())) userProd.setUser_name(MemoryDict.getDictName(DictKey.TERMINAL_TYPE,userProd.getTerminal_type())); }else if("BAND".equals(userProd.getUser_type())){ userProd.setUser_name(userProd.getLogin_name()); }else if("ATV".equals(userProd.getUser_type())){ if (StringHelper.isEmpty(userProd.getUser_name())) userProd.setUser_name("模拟终端"); } } } public List<CProdDto> queryProdBalanceByCustId(String custId) throws Exception { return cProdDao.queryProdBalanceByCustId(custId, getOptr().getCounty_id()); } public List<UserProdDto> queryUserProdToCallCenter(Map<String,Object> p) throws Exception { List<UserProdDto> list = cProdDao.queryUserProdToCallCenter(p, getOptr().getCounty_id()); setUserName(list); return list; } public List<UserProdDto> queryUserProdHisToCallCenter(Map<String,Object> p) throws Exception { List<UserProdDto> list = cProdHisDao.queryUserProdHisToCallCenter(p, getOptr().getCounty_id()); setUserName(list); return list; } public List<CProdDto> queryProdHisByCustId(String custId) throws Exception { return cProdDao.queryProdHisByCustId(custId, getOptr().getCounty_id()); } /** * 根据数组编号查询产品 * @param ids 编号数组 * @param key 判断是客户编号数组"CUST"还是用户编号数组"USER" * @return * @throws Exception */ public List<CProdBacthDto> queryProdByIds(String[] ids,String key,String prodId) throws Exception { List<CProdBacthDto> list = cProdDao.queryProdByIds(ids, getOptr().getCounty_id(),key,prodId); Date now = DateHelper.strToDate(DateHelper.formatNow()); for(CProdBacthDto dto : list){ if(dto.getIs_invalid_tariff().equals(SystemConstants.BOOLEAN_TRUE) ||dto.getIs_zero_tariff().equals(SystemConstants.BOOLEAN_TRUE) ||dto.getTariff_rent() == 0){ dto.setEff_date(now); dto.setIsEdit(false); } //next_bill_date已作废 // else if(dto.getNext_bill_date()!=null){ else if(dto.getBilling_cycle()>1){ dto.setEff_date(DateHelper.addDate(dto.getInvalid_date(), 1)); dto.setIsEdit(false); }else if(DateHelper.strToDate(DateHelper.dateToStr(dto.getOrder_date())).compareTo(now)==0){ dto.setEff_date(now); dto.setIsEdit(false); }else{ Date nextnow = DateHelper.strToDate(DateHelper.formatNow()); nextnow.setDate(1); nextnow.setMonth(nextnow.getMonth()+1); dto.setEff_date(nextnow); dto.setIsEdit(true); } } return list; } public List<CProd> queryBaseProdByIds(String[] ids,String key) throws Exception { return cProdDao.queryBaseProdByIds(ids,key); } /** * 查询用户产品 * @param userId * @return * @throws Exception */ public List<CProdDto> queryByUserId(String userId) throws Exception{ return cProdDao.queryUserProd(userId, getOptr().getCounty_id()); } public List<CProdDto> queryByCustId(String custId) throws Exception{ return cProdDao.queryProdByCustId(custId, getOptr().getCounty_id()); } /** * 查询用户产品,包括套餐子产品 * @param userId * @return * @throws Exception */ public List<CProdDto> queryAllProdsByUserId(String userId) throws Exception{ return cProdDao.queryUserAllProds(userId, getOptr().getCounty_id()); } /** * 查询用户产品 * @param userId * @return * @throws Exception */ public List<CProdDto> queryByUserIds(String[] userIds) throws Exception{ return cProdDao.queryUserProdByUserIds(userIds, getOptr().getCounty_id()); } /** * 查找用户数字电视基本产品 * @param user_id * @return */ public List<CProdDto> queryUserDtvBaseProd(String userId) throws Exception{ return cProdDao.queryUserDtvBaseProd(userId, getOptr().getCounty_id()); } /** * 查找客户套餐 * @param custId * @return */ public List<CProdDto> queryCustPackage(String custId) throws Exception{ String dataRight = ""; try { dataRight = this.queryDataRightCon(getOptr(), DataRight.PROD_PAUSE.toString()); } catch (Exception e) { } List<CProdDto> prodList = cProdDao.queryPkgByCustId(custId, getOptr().getCounty_id()); if(StringHelper.isNotEmpty(dataRight)){ for(CProdDto prod : prodList){ //规则表达式包含要暂停的产品ID,则该产品可暂停 if(dataRight.indexOf(prod.getProd_id()) > -1){ prod.setIs_pause(SystemConstants.BOOLEAN_TRUE); }else{ prod.setIs_pause(SystemConstants.BOOLEAN_FALSE); } } } return prodList; } /** * 查找可以加入套餐的客户产品 * @param custId * @param custType * @param pkgId * @return */ public List<CustProdDto> queryCustProdForPkg(String custId, String custType, String pkgId,String pkgTarrifId) throws Exception{ List<CustProdDto> prodList= null; if (custType.equals(SystemConstants.CUST_TYPE_UNIT)){ prodList = cProdDao.queryUnitProdForPkg(custId,pkgId,pkgTarrifId, getOptr().getCounty_id()); } else { prodList = cProdDao.queryCustProdForPkg(custId,pkgId,pkgTarrifId, getOptr().getCounty_id()); } return prodList; } /** * @param custId * @param pkgId * @return */ public List<CustProdDto> queryProdsOfPkg(String custId, String pkgId) throws Exception { return cProdDao.queryProdsOfPkg(custId,pkgId, getOptr().getCounty_id()); } /** * 根据sn获取产品信息 * @param prodSn * @return * @throws Exception */ public CProd queryByProdSn(String prodSn) throws Exception{ return cProdDao.findByKey(prodSn); } /** * 根据套餐sn获取产品信息 * @param prodSn * @return * @throws Exception */ public List<CProd> queryByPkgSn(String pkgSn) throws Exception{ return cProdDao.queryByPkgSn(pkgSn,getOptr().getCounty_id()); } public CProd queryByAcctItem(String acctId,String acctItemId) throws Exception{ List<CProd> prodList = cProdDao.queryByAcctItem(acctId,acctItemId, getOptr().getCounty_id()); if (prodList != null && prodList.size()>0) return prodList.get(0); else return null; } /** * @param userId * @param acctitem_id * @return */ public CProd queryByProdId(String userId, String acctItemId) throws JDBCException{ List<CProd> prodList = cProdDao.queryByProdId(userId,acctItemId); if (prodList != null && prodList.size()>0) return prodList.get(0); else return null; } /** * @param doneCode * @return */ public List<CProd> queryProdByDoneCode(Integer doneCode) throws Exception{ return cProdDao.queryByDoneCode(doneCode,getOptr().getCounty_id()); } /** * 查询用户产品的的资源信息 * @param prodSn * @return * @throws JDBCException */ public List<PRes> queryResByProdSn(String prodSn) throws Exception { List<PRes> presList = new ArrayList<PRes>(); CProd cProd = cProdDao.findByKey(prodSn); if (cProd == null) return presList; //动态资源 List<PRes> pdycresList =new ArrayList<PRes>(); if(!SystemConstants.PROD_TYPE_BASE.equals(cProd.getProd_type())){ List<CProd> prods = cProdDao.queryByPkgSn(cProd.getProd_sn(), cProd.getCounty_id()); for(CProd prod : prods){ PProd p = pProdDao.queryProdById(prod.getProd_id()); List<PRes> tempPresList = new ArrayList<PRes>(); //静态资源 if(p.getServ_id().equals("DTV")) { //数字电视静态资源 tempPresList = pResDao.queryDTVControlIdByProdSn(prod.getProd_id(),prod.getProd_sn(),prod.getCounty_id()); for(PRes pRes : tempPresList){ presList.add(pRes); } //数字电视动态资源 pdycresList = pResDao.queryControlIdByUserProdSn(prod.getProd_sn(),getOptr().getCounty_id()); for(PRes pRes : pdycresList){ presList.add(pRes); } } else { //vod,宽带静态资源 tempPresList = pResDao.queryITVBANDControlIdByProdId(prod.getProd_id(),prod.getCounty_id()); for(PRes pRes : tempPresList){ presList.add(pRes); } //vod,宽带动态资源 pdycresList = pResDao.queryITVBANDControlIdByUserProdSn(prod.getProd_sn(),getOptr().getCounty_id()); for(PRes pRes : pdycresList){ presList.add(pRes); } } } }else{ PProd p = pProdDao.queryProdById(cProd.getProd_id()); //静态资源 if(p.getServ_id().equals("DTV")){ //数字电视静态资源 presList = pResDao.queryDTVControlIdByProdSn(cProd.getProd_id(),cProd.getProd_sn(),cProd.getCounty_id()); //数字电视动态资源 pdycresList = pResDao.queryControlIdByUserProdSn(prodSn,getOptr().getCounty_id()); for(PRes pRes : pdycresList){ presList.add(pRes); } } else { //vod,宽带静态资源 presList = pResDao.queryITVBANDControlIdByProdId(cProd.getProd_id(),cProd.getCounty_id()); //vod,宽带动态资源 pdycresList = pResDao.queryITVBANDControlIdByUserProdSn(prodSn,getOptr().getCounty_id()); for(PRes pRes : pdycresList){ presList.add(pRes); } } } return presList; } public ProdResDto queryDynResByProdSn(String prodSn) throws Exception { ProdResDto prodRes = new ProdResDto(); //该订购的产品选择的资源 List<String> prodRscList = cProdRscDao.queryUserProdRes(prodSn); CProd prod = cProdDao.findByKey(prodSn); List<ResGroupDto> allResGroup = pProdDao.queryResGroup(prod.getProd_id()); List<ResGroupDto> oldResGroupList = new ArrayList<ResGroupDto>(); for(ResGroupDto resGroup : allResGroup){ List<PRes> resList = pProdDao.queryResByGroupId(resGroup.getGroup_id()); resGroup.setResList(resList); ResGroupDto oldResGroup = new ResGroupDto(); BeanUtils.copyProperties(resGroup, oldResGroup); List<PRes> oldResList = new ArrayList<PRes>(); oldResGroup.setResList(oldResList); for(PRes res : resList){ if(prodRscList.contains(res.getRes_id())){ oldResList.add(res); } } oldResGroupList.add(oldResGroup); } prodRes.setDynamicResList(allResGroup); prodRes.setOldDynamicResList(oldResGroupList); return prodRes; } /** * 查询当前产品的状态异动信息 * @param prodId * @param countyId * @return * @throws Exception */ public Pager<CProdPropChange> queryChangeByProd(String prodId, Integer start, Integer limit) throws Exception{ return cProdDao.queryChangeByProd(prodId,getOptr().getCounty_id(),start,limit); } /** * 查询当前产品的状态异动信息 * @param prodId * @param countyId * @return * @throws Exception */ public List<CProdPropChange> queryChangeByDoneCode(int doneCode) throws Exception{ return cProdDao.queryChangeByDoneCode(doneCode,getOptr().getCounty_id()); } /** * 查询当前产品变更信息 * @param prodId * @return * @throws Exception */ public Pager<CProdInvalidTariff> queryTariffChange(String prodId,Integer start,Integer limit) throws Exception { return cProdDao.queryTariffChange(prodId,start,limit); } /** * 查询产品资费信息 * * @param prodId * @return * @throws Exception */ public PProdTariff queryProdTariffById(String tariffId) throws Exception { return pProdTariffDao.findByKey(tariffId); } /** * 查找产品变更前的状态 * @param prod_sn * @return */ public String queryLastStatus(String prodSn) throws Exception { CProdPropChange change = cProdPropChangeDao.queryLastStatus(prodSn, getOptr().getCounty_id()); if (change == null) return null; return change.getOld_value(); } /** * 保存接口订购信息 * @param userId * @param prodId * @param tariffId * @param fee */ public void saveOrderInfo(String userId, String prodId, String tariffId, int fee) throws Exception { TvOrder orderInfo = new TvOrder(userId,prodId,tariffId,fee,getOptr().getCounty_id()); tvOrderDao.save(orderInfo); } /** * 获取用户id */ private String gUserProdId() throws Exception { return cProdDao.findSequence().toString(); } private PRes[] getDynamicRsc(String prodId,List<UserProdRscDto> dynamicRscList){ PRes[] rscs = null; List<PRes > rscList =new ArrayList<PRes>(); if (dynamicRscList!=null){ for (UserProdRscDto userProdRsc:dynamicRscList){ if (prodId.equals(userProdRsc.getProdId())){ rscList.addAll(userProdRsc.getRscList()); } } } rscs = rscList.toArray(new PRes[rscList.size()]); return rscs; } /** * 查询用户未排斥资源 * @param userId * @param custId * @return * @throws Exception */ public List<PRes> queryUnRejectRes(String userId,String custId) throws Exception { return cRejectResDao.queryUnRejectRes(userId, custId); } /** * 查询用户排斥资源 * @param userId * @param custId * @return * @throws Exception */ public List<PRes> queryRejectRes(String userId,String custId) throws Exception { return cRejectResDao.queryRejectRes(userId, custId); } public List<String> queryUserProdRes(String prodSn) throws Exception { return cProdRscDao.queryUserProdRes(prodSn); } public PProd queryByProdId(String prodId) throws Exception{ return pProdDao.findByKey(prodId); } public List<String> queryResByUserId(String userId,String prodId) throws Exception { return cProdDao.queryResByUserId(userId, prodId, getOptr().getCounty_id()); } /** * 删除产品异动 * @param prodSn * @param doneCode * @throws Exception */ public void removePropChange(String prodSn, Integer doneCode) throws Exception{ cProdPropChangeDao.removeByDoneCode( prodSn, doneCode,getOptr().getCounty_id()); } /** * 查找套餐缴费生成的零资费产品异动 * @param doneCode * @return */ public List<CProdPropChange> queryPromPayChange(Integer doneCode,String countyId) throws Exception{ return cProdPropChangeDao.queryPromPayChange(doneCode,countyId); } public CProdRscDao getCUserProdRscDao() { return cProdRscDao; } public void setCUserProdRscDao(CProdRscDao userProdRscDao) { cProdRscDao = userProdRscDao; } public void setCProdResourceAcctDao(CProdResourceAcctDao prodResourceAcctDao) { cProdResourceAcctDao = prodResourceAcctDao; } /** * @param resDao the pResDao to set */ public void setPResDao(PResDao resDao) { pResDao = resDao; } public void setPProdTariffDisctDao(PProdTariffDisctDao prodTariffDisctDao) { pProdTariffDisctDao = prodTariffDisctDao; } public void setCProdHisDao(CProdHisDao prodHisDao) { cProdHisDao = prodHisDao; } /** * @param prodRscDao the cProdRscDao to set */ public void setCProdRscDao(CProdRscDao prodRscDao) { cProdRscDao = prodRscDao; } /** * 查询属于单位的客户产品 * * @param custId * @param unitIds */ public List<CProd> queryUnitProdByUnitIds(String custId, String[] unitIds) throws JDBCException { return cProdDao.queryUnitProdByUnitIds(custId, unitIds); } /** * 修改产品的预开通时间. * @param prodSn * @param countyId * @param newPreOpenDate 新的预开通时间. */ public CProd updateProdPreOpenDate(Integer doneCode ,String prodSn, String countyId, Date newPreOpenDate, Date feeDate) throws Exception{ List<CProdPropChange> changeList = new ArrayList<CProdPropChange>(); Date now = DateHelper.today(); boolean newDateIsToday = now.equals(newPreOpenDate);//修改后的预开通日期是今天? Map<String, Serializable> params = new HashMap<String, Serializable>(); params.put("prod_sn", prodSn); params.put("county_id", countyId); List<CProd> prods = cProdDao.findByMap(params); if(prods ==null || prods.size() != 1){ throw new ComponentException("未能找到需要修改预开通的产品 "); } CProd cprod = prods.get(0); Date oldFeeDate = cprod.getBillinfo_eff_date(); CUser user = cUserDao.findByKey(cprod.getUser_id()); List<JProdPreopen> jobs = jProdPreopenDao.findByMap(params); if(jobs ==null || jobs.size() != 1){ throw new ComponentException("未能找到需要修改预开通的排程 "); } JProdPreopen job = jobs.get(0); if( oldFeeDate.getTime() - feeDate.getTime() != 0 ){ String stopByInvalidDate = cprod.getStop_by_invalid_date();// if(stopByInvalidDate.equals("T") ){//0资费或者包多月的,包多月的产品和 0资费产品 涉及到到期日修改,根据 开始计费时间变化 //预开通日期变了,到期日跟着变化 Date oldInvalidDate = cprod.getInvalid_date(); CProdPropChange invalidDateChange = new CProdPropChange(); invalidDateChange.setColumn_name("invalid_date"); invalidDateChange.setOld_value(DateHelper.format(oldInvalidDate, DateHelper.FORMAT_YMD));//先去老的值 //缴费等费用业务后,计算新旧生效日期差额,生成新到期日 int days = DateHelper.getDiffDays(cprod.getPre_open_time(), newPreOpenDate); Date newInvalidDate = DateHelper.addDate(oldInvalidDate, days); cprod.setInvalid_date(newInvalidDate);//填充新的值 invalidDateChange.setNew_value(DateHelper.dateToStr(newInvalidDate)); changeList.add(invalidDateChange); if(cprod.getBillinfo_eff_date().getTime() - feeDate.getTime() !=0){ //包多月产品修改已出账账单账期 int changemonths= DateHelper.compareToMonthByDate(cprod.getBillinfo_eff_date(), feeDate); if(changemonths!=0){ bBillDao.updateMuchProdBillByChangeBillinfoEffDate(prodSn, DateHelper.format(cprod.getBillinfo_eff_date(),DateHelper.FORMAT_YM), countyId, changemonths); } } //next_bill_date已作废 /*Date oldNextBillDate = cprod.getNext_bill_date(); //年包 if(oldNextBillDate != null && oldNextBillDate.getTime() - feeDate.getTime() != 0){ CProdPropChange nextBillDateChange = new CProdPropChange(); nextBillDateChange.setColumn_name("next_bill_date"); nextBillDateChange.setOld_value(DateHelper.format(oldNextBillDate, DateHelper.FORMAT_YMD));//先去老的值 cprod.setNext_bill_date(feeDate);//填充新的值 nextBillDateChange.setNew_value(DateHelper.format(feeDate, DateHelper.FORMAT_YMD)); changeList.add(nextBillDateChange); }*/ } CProdPropChange feeDateChange = new CProdPropChange(); feeDateChange.setColumn_name("billinfo_eff_date"); feeDateChange.setOld_value(DateHelper.format(oldFeeDate, DateHelper.FORMAT_YMD));//先去老的值 cprod.setBillinfo_eff_date(feeDate);//填充新的值 feeDateChange.setNew_value(DateHelper.format(feeDate, DateHelper.FORMAT_YMD)); changeList.add(feeDateChange); } CProdPropChange propChange = new CProdPropChange(); propChange.setColumn_name("pre_open_time"); propChange.setOld_value(DateHelper.format(cprod.getPre_open_time(), DateHelper.FORMAT_YMD));//先去老的值 cprod.setPre_open_time(newPreOpenDate);//填充新的值 propChange.setNew_value(DateHelper.format(newPreOpenDate, DateHelper.FORMAT_YMD)); changeList.add(propChange); if(newDateIsToday){//如果信的预开通日期是今天,设置产品状态为 ACTIVE,删除 J_PROD_PREOPEN,添加历史记录 CProdPropChange statusChange = new CProdPropChange(); statusChange.setColumn_name("status"); statusChange.setOld_value(StatusConstants.PREAUTHOR); cprod.setStatus(StatusConstants.ACTIVE); statusChange.setNew_value(StatusConstants.ACTIVE); changeList.add(statusChange); CProdPropChange preChange = new CProdPropChange(); preChange.setColumn_name("pre_open_time"); preChange.setOld_value(DateHelper.dateToStr(cprod.getPre_open_time())); cprod.setPre_open_time(null); preChange.setNew_value(""); changeList.add(preChange); JProdPreopenHis his = new JProdPreopenHis(); BeanUtils.copyProperties(job, his); his.setIs_success("T"); his.setRemark("修改预开通时间到今日 : " + DateHelper.format(newPreOpenDate, DateHelper.FORMAT_YMD) + ",删除预开通job,插入指令job"); jProdPreopenDao.remove(job.getJob_id()); jProdPreopenHisDao.save(his); //发送指令 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.createAcctModeCalJob(doneCode, user.getCust_id()); }else{ job.setPre_open_time(newPreOpenDate); jProdPreopenDao.update(job); } editProd(doneCode, prodSn, changeList); //子产品和套餐保持一致 CProd parentProd = cProdDao.findByKey(prodSn); List<CProdDto> childProds = cProdDao.queryChildProdByPkgsn(prodSn, getOptr().getCounty_id()); for(CProdDto prodDto : childProds){ CProd childProd = new CProd(); BeanUtils.copyProperties(prodDto, childProd); childProd.setPre_open_time(parentProd.getPre_open_time()); childProd.setStatus(parentProd.getStatus()); childProd.setInvalid_date(parentProd.getInvalid_date()); childProd.setBillinfo_eff_date(parentProd.getBillinfo_eff_date()); //next_bill_date已作废 // if(childProd.getNext_bill_date() != null) // childProd.setNext_bill_date(parentProd.getNext_bill_date()); cProdDao.update(childProd); } return parentProd; } /** * 修改产品公用账目使用类型. * @param doneCode * @param prodSn * @param countyId * @param publicAcctitemType */ public void updatePublicAcctItemType(Integer doneCode, String prodSn,CCust cust, String publicAcctitemType) throws Exception{ List<CProdPropChange> changeList = new ArrayList<CProdPropChange>(); Map<String, Serializable> params = new HashMap<String, Serializable>(); params.put("prod_sn", prodSn); params.put("county_id", cust.getCounty_id()); List<CProd> prods = cProdDao.findByMap(params); if(prods ==null || prods.size() != 1){ throw new ComponentException("未能找到需要修改 产品公用账目使用类型 的产品 "); } CProd prod = prods.get(0); String oldValue = prod.getPublic_acctitem_type(); CProdPropChange feeDateChange = new CProdPropChange(); feeDateChange.setColumn_name("public_acctitem_type"); feeDateChange.setOld_value(prod.getPublic_acctitem_type());//先去老的值 prod.setPublic_acctitem_type(publicAcctitemType); feeDateChange.setNew_value(publicAcctitemType); changeList.add(feeDateChange); editProd(doneCode, prodSn, changeList); //http://ljq.vicp.net:82/mantis/view.php?id=1263 if(publicAcctitemType.equals("ALL") || publicAcctitemType.equals("NONE") || publicAcctitemType.equals("SPEC_ONLY") || publicAcctitemType.equals("PUBLIC_ONLY") ){ CProdPropPat cpp = new CProdPropPat(); cpp.setArea_id(cust.getArea_id()); cpp.setProd_sn(prodSn); cpp.setOld_value(oldValue); cpp.setNew_value(publicAcctitemType); cpp.setDone_code(doneCode); cpp.setChange_time(new Date()); cpp.setCounty_id(cust.getCounty_id()); cpp.setStatus(StatusConstants.ACTIVE); cpp.setCust_id(cust.getCust_id()); cProdPropPatDao.save(cpp); }else{//系统默认,设置c_prod_prop_pat 中该产品的所有有效变更记录的状态为失效, CProdPropPat cpp = new CProdPropPat(); cpp.setProd_sn(prodSn); String sql = "update c_prod_prop_pat set status = ? where prod_sn = ? "; cProdPropPatDao.executeUpdate(sql, StatusConstants.INVALID,prodSn); } } public PProdTariff queryTariffByAcctId(String acctId, String acctItemId) throws Exception { return this.pProdTariffDao.queryTariffByAcctId(acctId, acctItemId, getOptr().getCounty_id()); } /** * 退款时候记录套餐缴费信息 * @param promFeeSn * @param prodSns * @param doneCode */ public void savePromProdRefund(String promFeeSn, String[] prodSns,Integer doneCode,Integer refund) throws Exception { cPromProdRefundDao.savePromProdRefund(promFeeSn, prodSns, doneCode,refund*-1); } public List<CProd> queryProdByPackageProd(String custId, String packageId) throws Exception { return cProdDao.queryProdByPackageProd(custId, packageId); } public void setCRejectResDao(CRejectResDao rejectResDao) { cRejectResDao = rejectResDao; } public void setJProdNextTariffHisDao(JProdNextTariffHisDao prodNextTariffHisDao) { jProdNextTariffHisDao = prodNextTariffHisDao; } /** * @param tvOrderDao the tvOrderDao to set */ public void setTvOrderDao(TvOrderDao tvOrderDao) { this.tvOrderDao = tvOrderDao; } /** * @param prodSynDao the cProdSynDao to set */ public void setCProdSynDao(CProdSynDao prodSynDao) { cProdSynDao = prodSynDao; } public void setJProdPreopenDao(JProdPreopenDao jProdPreopenDao) { this.jProdPreopenDao = jProdPreopenDao; } public void setJProdPreopenHisDao(JProdPreopenHisDao jProdPreopenHisDao) { this.jProdPreopenHisDao = jProdPreopenHisDao; } public void setCUserDao(CUserDao cUserDao) { this.cUserDao = cUserDao; } public void setJobComponent(JobComponent jobComponent) { this.jobComponent = jobComponent; } public void setCPromProdRefundDao(CPromProdRefundDao promProdRefundDao) { cPromProdRefundDao = promProdRefundDao; } public void setCProdPropPatDao(CProdPropPatDao cProdPropPatDao) { this.cProdPropPatDao = cProdPropPatDao; } /** * @param cust_id * @return */ public CProd queryBaseProdByCustId(String cust_id)throws Exception { return cProdDao.queryBaseProdByCustId(cust_id, getOptr().getCounty_id()); } public boolean isProdOpen(String status) throws Exception { return cProdDao.isProdOpen(status); } }