package com.ycsoft.business.component.core;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.ycsoft.beans.config.TAcctFeeType;
import com.ycsoft.beans.config.TRuleDefine;
import com.ycsoft.beans.core.cust.CCust;
import com.ycsoft.beans.core.prod.CProdOrder;
import com.ycsoft.beans.core.prod.CProdOrderDto;
import com.ycsoft.beans.core.prod.CProdOrderFee;
import com.ycsoft.beans.core.prod.CProdOrderFeeOut;
import com.ycsoft.beans.core.prod.CProdOrderFollowPay;
import com.ycsoft.beans.core.prod.CProdOrderHis;
import com.ycsoft.beans.core.prod.CProdPropChange;
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.business.commons.abstracts.BaseBusiComponent;
import com.ycsoft.business.component.config.ExpressionUtil;
import com.ycsoft.business.dao.config.TAcctFeeTypeDao;
import com.ycsoft.business.dao.config.TPayTypeDao;
import com.ycsoft.business.dao.config.TRuleDefineDao;
import com.ycsoft.business.dao.core.cust.CCustDao;
import com.ycsoft.business.dao.core.prod.CProdOrderDao;
import com.ycsoft.business.dao.core.prod.CProdOrderFeeDao;
import com.ycsoft.business.dao.core.prod.CProdOrderFeeOutDao;
import com.ycsoft.business.dao.core.prod.CProdOrderHisDao;
import com.ycsoft.business.dao.core.prod.CProdStatusChangeDao;
import com.ycsoft.business.dao.core.user.CUserDao;
import com.ycsoft.business.dao.prod.PPackageProdDao;
import com.ycsoft.business.dao.prod.PProdDao;
import com.ycsoft.business.dao.prod.PProdTariffDisctDao;
import com.ycsoft.business.dto.core.fee.FeeDto;
import com.ycsoft.business.dto.core.prod.OrderProd;
import com.ycsoft.business.dto.core.prod.OrderProdEdit;
import com.ycsoft.business.dto.core.prod.OrderProdPanel;
import com.ycsoft.business.dto.core.prod.PackageGroupUser;
import com.ycsoft.business.dto.core.prod.ProdTariffDto;
import com.ycsoft.commons.constants.BusiCodeConstants;
import com.ycsoft.commons.constants.StatusConstants;
import com.ycsoft.commons.constants.SystemConstants;
import com.ycsoft.commons.exception.ComponentException;
import com.ycsoft.commons.exception.ErrorCode;
import com.ycsoft.commons.exception.ServicesException;
import com.ycsoft.commons.helper.CollectionHelper;
import com.ycsoft.commons.helper.DateHelper;
import com.ycsoft.commons.helper.StringHelper;
import com.ycsoft.daos.core.JDBCException;
import com.ycsoft.daos.helper.BeanHelper;
/**
* 订单组件
* @author new
*
*/
@Component
public class OrderComponent extends BaseBusiComponent {
@Autowired
private PProdDao pProdDao;
@Autowired
private PPackageProdDao pPackageProdDao;
@Autowired
private CProdOrderDao cProdOrderDao;
@Autowired
private CUserDao cUserDao;
@Autowired
private CProdOrderHisDao cProdOrderHisDao;
@Autowired
private CProdStatusChangeDao cProdStatusChangeDao;
@Autowired
private TRuleDefineDao tRuleDefineDao;
@Autowired
private CCustDao cCustDao;
@Autowired
private PProdTariffDisctDao pProdTariffDisctDao;
@Autowired
private BeanFactory beanFactory;
@Autowired
private CProdOrderFeeDao cProdOrderFeeDao;
@Autowired
private TAcctFeeTypeDao tAcctFeeTypeDao;
@Autowired
private TPayTypeDao tPayTypeDao;
@Autowired
private CProdOrderFeeOutDao cProdOrderFeeOutDao;
/**
* 订单编辑的基础数据
* @param order
* @return
* @throws Exception
*/
public OrderProdEdit createOrderEdit(CProdOrderDto order) throws Exception{
OrderProdEdit edit=new OrderProdEdit();
edit.setLast_order_sn(order.getOrder_sn());
edit.setCust_id(order.getCust_id());
edit.setUser_id(order.getUser_id());
edit.setExp_date(order.getExp_date());
edit.setEff_date(order.getEff_date());
edit.setProd_id(order.getProd_id());
if(StringHelper.isNotEmpty(order.getDisct_id())){
edit.setTariff_id(order.getTariff_id()+"_"+order.getDisct_id());
}else{
edit.setTariff_id(order.getTariff_id());
}
edit.setOrder_months(order.getOrder_months());
edit.setOld_order_fee(order.getOrder_fee());
//转移支付费用
int transFee=0;
for(CProdOrderFee orderFee:cProdOrderFeeDao.queryByOrderSn(order.getOrder_sn())){
if(orderFee.getInput_type().equals(SystemConstants.ORDER_FEE_TYPE_TRANSFEE)){
transFee=transFee+orderFee.getFee();
}
}
edit.setOld_transfer_fee(transFee);
//套餐子产品的选择情况,在编辑面板异步加载
if(!order.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){
Map<String,Set<String>> groupUserMap=new HashMap<>();
for(CProdOrder detail: cProdOrderDao.queryPakDetailOrder(order.getOrder_sn())){
Set<String> set=groupUserMap.get(detail.getPackage_group_id());
if(set==null){
set=new HashSet<String>();
groupUserMap.put(detail.getPackage_group_id(), set);
}
set.add(detail.getUser_id());
}
List<PackageGroupUser> groupSelected=new ArrayList<>();
for(String group_id: groupUserMap.keySet()){
PackageGroupUser pgu=new PackageGroupUser();
groupSelected.add(pgu);
pgu.setPackage_group_id(group_id);
pgu.setUserSelectList(Arrays.asList(groupUserMap.get(group_id).toArray(new String[groupUserMap.get(group_id).size()])));
}
edit.setGroupSelected(groupSelected);
}
return edit;
}
/**
* 订单编辑可以使用的产品和资费
* @param cust
* @param filterOrderSn
* @param panel
* @throws Exception
*/
public void queryOrderableEdit(CCust cust,String filterOrderSn,OrderProdEdit panel) throws Exception{
CProdOrderDto order = cProdOrderDao.queryCProdOrderDtoByKey(filterOrderSn);
if (order == null)
return ;
if(order.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)
&&!order.getServ_id().equals(SystemConstants.PROD_SERV_ID_BAND)){
//非宽带单产品处理 (参考 单产品续订)
CUser user = cUserDao.findByKey(order.getUser_id());
panel.setUserDesc(getUserDesc(user));
PProd prod= pProdDao.findByKey(order.getProd_id());
//单产品的情况
List<PProdTariffDisct> tariffList = this.queryTariffList(cust,user, prod);
if (!CollectionHelper.isEmpty(tariffList)){
panel.getProdList().add(prod);
panel.getTariffMap().put(prod.getProd_id(), tariffList);
}
}else if(order.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)
&&order.getServ_id().equals(SystemConstants.PROD_SERV_ID_BAND)){
//宽带单产品处理 (参考 单用户订购宽带)
CUser user = cUserDao.findByKey(order.getUser_id());
panel.setUserDesc(getUserDesc(user));
List<PProd> prodList = pProdDao.queryCanOrderUserProd(user.getUser_type(), user.getCounty_id(),
user.getCounty_id(), SystemConstants.DEFAULT_DATA_RIGHT);
for (PProd prod:prodList){
List<PProdTariffDisct> tariffList = this.queryTariffList(cust,user, prod);
if (!CollectionHelper.isEmpty(tariffList)){
panel.getProdList().add(prod);
panel.getTariffMap().put(prod.getProd_id(), tariffList);
}
}
}else if(!order.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){
//套餐处理(参考 套餐订购)
String custId = cust.getCust_id();
Map<String,Integer> userCountMap = cUserDao.queryUserCountGroupByType(custId);
List<PProd> prodList = pProdDao.queryCanOrderPkg(cust.getCounty_id(), SystemConstants.DEFAULT_DATA_RIGHT);
for (PProd prod:prodList){
if(!prod.getProd_type().equals(order.getProd_type())){
continue;
}
List<PProdTariffDisct> tariffList = this.queryTariffList(cust,null, prod);
if (!CollectionHelper.isEmpty(tariffList)){
boolean flag = true;
if (prod.getProd_type().equals(SystemConstants.PROD_TYPE_CUSTPKG)){
//验证客户名下终端是否满足要求
Map<String,Integer> pkgUserCountMap = pProdDao.queryUserCountGroupByType(prod.getProd_id());
for (Entry<String,Integer> entry:pkgUserCountMap.entrySet()){
if (entry.getValue()>(userCountMap.get(entry.getKey())==null?0:userCountMap.get(entry.getKey()))){
flag = false;
break;
}
}
}
if (flag){
panel.getProdList().add(prod);
panel.getTariffMap().put(prod.getProd_id(), tariffList);
}
}
}
}
}
/**
* 保存订单修改信息
*/
public List<CProdOrder> saveOrderEditBean(CProdOrderDto order,Integer done_code,OrderProd orderProd) throws Exception{
List<CProdOrder> changeOrderList=new ArrayList<>();
cProdOrderDao.updateOrderEdit(order);
//套餐更新子产品
if(!order.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){
//原来的删除
List<CProdOrderHis> pakDetailList=new ArrayList<>();
List<String> detailSnList=new ArrayList<>();
for(CProdOrder pakdetail: cProdOrderDao.queryPakDetailOrder(order.getOrder_sn())){
CProdOrderHis pakdetailhis=new CProdOrderHis();
BeanHelper.copyProperties(pakdetailhis, pakdetail);
pakdetailhis.setDelete_done_code(done_code);
pakdetailhis.setDelete_time(new Date());
pakDetailList.add(pakdetailhis);
detailSnList.add(pakdetail.getOrder_sn());
changeOrderList.add(pakdetail);
}
cProdOrderHisDao.save(pakDetailList.toArray(new CProdOrderHis[pakDetailList.size()]));
cProdOrderDao.remove(detailSnList.toArray(new String[detailSnList.size()]));
//插入新的
if(orderProd.getGroupSelected()!=null&&orderProd.getGroupSelected().size()>0){
changeOrderList.addAll(savePackageUserProd(order,orderProd));
}
}
return changeOrderList;
}
/**
* 处理订单修改的费用记录
* @param cProdorder
* @param payFee
* @param feeSn
* @param doneCode
* @throws Exception
*/
public void saveOrderEditFee(CProdOrder cProdorder,Integer payFee,String feeSn,Integer doneCode) throws Exception{
if(payFee<0){
//退款的情况
//取INPUT_TYPE=CFEE的记录进行扣费
List<CProdOrderFee> orderFeeOuts=new ArrayList<>();
int tempFee=payFee*-1;
for(CProdOrderFee orderFee:cProdOrderFeeDao.queryByOrderSn(cProdorder.getOrder_sn())){
if(tempFee<=0) break;
if(orderFee.getInput_type().equals(SystemConstants.ORDER_FEE_TYPE_CFEE)){
int _kf=0;//扣费金额
if(tempFee>orderFee.getFee()){
_kf=orderFee.getFee();
}else{
_kf=tempFee;
}
tempFee=tempFee-_kf;
orderFee.setOutput_fee(_kf);
orderFee.setOutput_type(SystemConstants.ORDER_FEE_TYPE_CFEE);
orderFee.setOutput_sn(feeSn);
orderFeeOuts.add(orderFee);
}
}
if(tempFee>0){//金额不足,数据有问题
throw new ServicesException(ErrorCode.OrderDateFeeError);
}
this.saveOrderFeeOut(this.getOrderFeeOutFromOrderFee(orderFeeOuts), doneCode);
}
if(payFee>0){
//补收费用的情况
//插入CORDERFEE
CProdOrderFee inputOrderFee=new CProdOrderFee();
inputOrderFee.setOrder_fee_sn(cProdOrderFeeDao.findSequence().toString());
inputOrderFee.setOrder_sn(cProdorder.getOrder_sn());
inputOrderFee.setDone_code(doneCode);
inputOrderFee.setInput_type(SystemConstants.ORDER_FEE_TYPE_CFEE);
inputOrderFee.setInput_sn(feeSn);
inputOrderFee.setInput_fee(payFee);
inputOrderFee.setFee(payFee);
inputOrderFee.setFee_type( StatusConstants.UNPAY);
inputOrderFee.setCounty_id(cProdorder.getCounty_id());
inputOrderFee.setArea_id(cProdorder.getArea_id());
inputOrderFee.setCreate_time(new Date());
cProdOrderFeeDao.save(inputOrderFee);
}
}
/**
* 记录订单修改异动
* @param orderProd
* @param order
* @throws Exception
*/
public List<CProdPropChange> saveOrderEditChange(CProdOrder order,CProdOrder editOrder,Integer done_code) throws Exception{
List<CProdPropChange> changeList=new ArrayList<>();
//产品有无变化
if(!order.getProd_id().equals(editOrder.getProd_id())){
CProdPropChange change=new CProdPropChange();
changeList.add(change);
BeanHelper.copyProperties(change, order);
change.setDone_code(done_code);
change.setProd_sn(order.getOrder_sn());
change.setColumn_name("prod_id");
change.setOld_value(order.getProd_id());
change.setNew_value(editOrder.getProd_id());
order.setProd_id(editOrder.getProd_id());
}
//资费有无变化
if(!order.getTariff_id().equals(editOrder.getTariff_id())){
CProdPropChange change=new CProdPropChange();
changeList.add(change);
BeanHelper.copyProperties(change, order);
change.setDone_code(done_code);
change.setProd_sn(order.getOrder_sn());
change.setColumn_name("tariff_id");
change.setOld_value(order.getTariff_id());
change.setNew_value(editOrder.getTariff_id());
order.setTariff_id(editOrder.getTariff_id());
}
//折扣有无变化
if((order.getDisct_id()==null&&editOrder.getDisct_id()==null)||
(order.getDisct_id()!=null&&order.getDisct_id().equals(editOrder.getDisct_id()))){
//相等的情况,不处理
}else{
CProdPropChange change=new CProdPropChange();
changeList.add(change);
BeanHelper.copyProperties(change, order);
change.setDone_code(done_code);
change.setProd_sn(order.getOrder_sn());
change.setColumn_name("disct_id");
change.setOld_value(order.getDisct_id());
change.setNew_value(editOrder.getDisct_id());
order.setDisct_id(editOrder.getDisct_id());
}
//失效日期有误变化
if(!order.getExp_date().equals(editOrder.getExp_date())){
CProdPropChange change=new CProdPropChange();
changeList.add(change);
BeanHelper.copyProperties(change, order);
change.setDone_code(done_code);
change.setProd_sn(order.getOrder_sn());
change.setColumn_name("exp_date");
change.setOld_value(DateHelper.dateToStr(order.getExp_date()));
change.setNew_value(DateHelper.dateToStr(editOrder.getExp_date()));
order.setExp_date(editOrder.getExp_date());
}
//订购月数有无变化
if(!order.getOrder_months().equals(editOrder.getOrder_months())){
CProdPropChange change=new CProdPropChange();
changeList.add(change);
BeanHelper.copyProperties(change, order);
change.setDone_code(done_code);
change.setProd_sn(order.getOrder_sn());
change.setColumn_name("order_months");
change.setOld_value(order.getOrder_months().toString());
change.setNew_value(editOrder.getOrder_months().toString());
order.setOrder_months(editOrder.getOrder_months());
}
//订购金额有无变化
if(!order.getOrder_fee().equals(editOrder.getOrder_fee())){
CProdPropChange change=new CProdPropChange();
changeList.add(change);
BeanHelper.copyProperties(change, order);
change.setDone_code(done_code);
change.setProd_sn(order.getOrder_sn());
change.setColumn_name("order_fee");
change.setOld_value(order.getOrder_fee().toString());
change.setNew_value(editOrder.getOrder_fee().toString());
order.setOrder_fee(editOrder.getOrder_fee());
}
cProdPropChangeDao.save(changeList.toArray(new CProdPropChange[changeList.size()]));
return changeList;
}
/**
* cust-user-prod
* 客户套餐key=cust--
* 宽带单产品key=cust-user-
* 普通单产品key=cust-user-prod
*/
private String getOrderKey(CProdOrderDto dto){
String key=StringHelper.append(dto.getCust_id(),"-",
dto.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)?dto.getUser_id():"","-",
dto.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)
&&!dto.getServ_id().equals(SystemConstants.PROD_SERV_ID_BAND)?dto.getProd_id():"");
return key;
}
/**
* 查询一个客户有效的订单和最近的订单
* @param custId
* @throws Exception
*/
public List<CProdOrderDto> queryCustEFFAndLastOrder(String custId) throws Exception{
List<CProdOrderDto> orderList=new ArrayList<>();
List<CProdOrderDto> list=cProdOrderDao.queryCustAllOrderDto(custId);
Collections.reverse(list);//倒序
//记录订单是否已存在
Set<String> existsSet=new HashSet<String>();
Date today=DateHelper.today();
for(CProdOrderDto order:list){
if(order.getStatus().equals(StatusConstants.REQSTOP)
||order.getStatus().equals(StatusConstants.LINKSTOP)
||order.getStatus().equals(StatusConstants.INSTALL)){
//报停和关联停且订单失效日期在状态
orderList.add(order);
existsSet.add(getOrderKey(order));
}else if(!order.getExp_date().before(today)){
orderList.add(order);
existsSet.add(getOrderKey(order));
}else if(!existsSet.contains(getOrderKey(order))){
orderList.add(order);
existsSet.add(getOrderKey(order));
}
}
Collections.reverse(orderList);
return orderList;
}
/**
* 查询前 要做锁定判断doneCodeCom*t.checkUnPayOtherLock
* 查询可以缴费的产品信息
* @throws Exception
*/
public List<CProdOrderFollowPay> queryFollowPayOrderDto(String cust_id) throws Exception{
//有效的订购记录
List<CProdOrderFollowPay> list=cProdOrderDao.queryFollowPayOrderDto(cust_id);
//Map<cust_user_prod,不能续费的原因>
Map<String,String> hasPakDetailMap=new HashMap<String,String>();
Map<String,CProdOrderFollowPay> maxFPMap=new HashMap<String,CProdOrderFollowPay>();
for(CProdOrderFollowPay dto:list){
String key=this.getOrderKey(dto);
if(StringHelper.isNotEmpty(dto.getPackage_sn())){
//记录是否套餐子产品
hasPakDetailMap.put(key, "");
}else{
//非套餐,且截止日期大 则装入
CProdOrderDto order=maxFPMap.get(key);
if(order==null||dto.getExp_date().after(order.getExp_date())){
maxFPMap.put(key, dto);
}
}
}
//能否缴费判断和提取可选资费
Map<String,CProdOrderFollowPay> canFollowMap=new HashMap<>();
CCust cust=cCustDao.findByKey(cust_id);
for(Map.Entry<String, CProdOrderFollowPay> entry: maxFPMap.entrySet()){
CProdOrderFollowPay dto= entry.getValue();
canFollowMap.put(dto.getOrder_sn(), dto);
//资费重新组装
if(StringHelper.isNotEmpty(dto.getDisct_id())){
dto.setTariff_id(StringHelper.append(dto.getTariff_id(),"_",dto.getDisct_id()));
}
dto.setCanFollowPay(true);
dto.setRemark("");
if(StringHelper.isEmpty(dto.getUser_id())){
dto.setUser_name("客户套餐");
}
if(hasPakDetailMap.containsKey(entry.getKey())){
//存在套餐子产品订单,能不能缴费
dto.setCanFollowPay(false);
}else{
//判断资费是否还适用判断
CUser user=cUserDao.findByKey(dto.getUser_id());
PProd prod=pProdDao.findByKey(dto.getProd_id());
dto.setTariffList(this.queryTariffList(cust,user,prod));
for(PProdTariffDisct disct: dto.getTariffList()){
if(disct.getTariff_id().equals(dto.getTariff_id())){
//资费有效
dto.setCurrentTariffStatus(true);
}
}
}
//套餐的子产品选择情况
if(!dto.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){
Map<String,Set<String>> groupUserMap=new HashMap<>();
for(CProdOrder detail: cProdOrderDao.queryPakDetailOrder(dto.getOrder_sn())){
Set<String> set=groupUserMap.get(detail.getPackage_group_id());
if(set==null){
set=new HashSet<String>();
groupUserMap.put(detail.getPackage_group_id(), set);
}
set.add(detail.getUser_id());
}
List<PackageGroupUser> groupSelected=new ArrayList<>();
for(String group_id: groupUserMap.keySet()){
PackageGroupUser pgu=new PackageGroupUser();
groupSelected.add(pgu);
pgu.setPackage_group_id(group_id);
pgu.setUserSelectList(Arrays.asList(groupUserMap.get(group_id).toArray(new String[groupUserMap.get(group_id).size()])));
}
dto.setGroupSelected(groupSelected);
}
}
List<CProdOrderFollowPay> followPayList=new ArrayList<CProdOrderFollowPay>();
//排序处理
for(CProdOrderFollowPay dto:list){
if(canFollowMap.containsKey(dto.getOrder_sn())){
followPayList.add(canFollowMap.get(dto.getOrder_sn()));
}
}
return followPayList;
}
public List<CProdOrder> queryPakDetailOrder(String package_sn) throws Exception{
return cProdOrderDao.queryPakDetailOrder(package_sn);
}
/**
* 销户时订单退款金额计算
* @param orderList
* @param isHigh
* @throws Exception
*/
public List<CProdOrderFee> getLogoffOrderFee(List<CProdOrderDto> orderList,boolean isHigh) throws Exception{
List<CProdOrderFee> orderFees=new ArrayList<>();
for(CProdOrderDto order:orderList){
if(order.getIs_pay().equals(SystemConstants.BOOLEAN_FALSE)){
//未支付判断
throw new ServicesException(ErrorCode.NotCancleHasUnPay);
}
List<CProdOrderFee> cancelFeeList=new ArrayList<>();
if(isHigh){
//order.setActive_fee(getOrderCancelFee(order,DateHelper.today()));
cancelFeeList=getOrderCacelFeeDetail(order,DateHelper.today());
}else if(StringHelper.isNotEmpty(order.getPackage_sn())
||(order.getBilling_cycle()>1
&&!DateHelper.isToday(order.getOrder_time())
&&!order.getStatus().equals(StatusConstants.INSTALL))){
//套餐子产品和包多月产品,低权限人员退款金额=0
order.setActive_fee(0);
}else if(order.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)
&& order.getIs_base().equals(SystemConstants.BOOLEAN_TRUE)
&&order.getProtocol_date()!=null
&&DateHelper.today().before(order.getProtocol_date())){
//包1月产品在硬件协议期未到时计算退款余额
//order.setActive_fee(getOrderCancelFee(order,DateHelper.getTruncDate(order.getProtocol_date())));
cancelFeeList=getOrderCacelFeeDetail(order,DateHelper.getTruncDate(order.getProtocol_date()));
}else {
//order.setActive_fee(getOrderCancelFee(order,DateHelper.today()));
cancelFeeList=getOrderCacelFeeDetail(order,DateHelper.today());
}
orderFees.addAll(cancelFeeList);
int outTotalFee=0;
int balanceCfee=0;
for(CProdOrderFee orderFee:cancelFeeList){
outTotalFee=outTotalFee+orderFee.getOutput_fee();
if(orderFee.getOutput_type().equals(SystemConstants.ORDER_FEE_TYPE_CFEE)){
balanceCfee=balanceCfee+orderFee.getOutput_fee();
}
}
order.setActive_fee(outTotalFee);
order.setBalance_cfee(balanceCfee);
order.setBalance_acct(outTotalFee-balanceCfee);
}
return orderFees;
}
/**
* 是否高级退订或销户功能
* @param busi_code
* @return
*/
public boolean isHighCancel(String busi_code){
return BusiCodeConstants.PROD_HIGH_TERMINATE.equals(busi_code)
||BusiCodeConstants.USER_HIGH_WRITE_OFF.equals(busi_code)
||BusiCodeConstants.PROD_SUPER_TERMINATE.equals(busi_code)
||BusiCodeConstants.BATCH_USER_WRITE_OFF.equals(busi_code)
?true:false;
}
/**
* 因为产品退订而重新计算套餐订单的计费时间段(不处理子产品)
* @return 返回开始失效时间变化的订单信息
* @throws Exception
*/
public List<CProdOrder> movePackageOrderToFollow(String cust_id,Integer done_code) throws Exception{
return this.changeToFollow(cProdOrderDao.queryNotExpPackageOrderByEff(cust_id), done_code);
}
/**
* 因为产品退订而重新计算宽带用户订单(含套餐子产品)的计费时间段
* @return 返回开始失效时间变化的订单信息
* @throws Exception
*/
public List<CProdOrder> moveBandOrderToFollow(String user_id,Integer done_code) throws Exception{
return this.changeToFollow(cProdOrderDao.queryNotExpAllOrderByUserOrderEff(user_id), done_code);
}
/**
* 因为产品退订而重新计算普通产品订单(含套餐子产品)(非宽带)的计费时间段
* @return 返回开始失效时间变化的订单信息
* @throws Exception
*/
public List<CProdOrder> moveProdOrderToFollow(String user_id,String prod_id,Integer done_code)throws Exception{
return this.changeToFollow(cProdOrderDao.queryNotExpAllOrderByProdOrderByEff(user_id, prod_id), done_code);
}
/**
* 移动订单接续,并记录开始和结束计费日的异动
* 传入的参数moveList是按exp_date排序的
* @param moveList
* @throws InvocationTargetException
* @throws Exception
*/
private List<CProdOrder> changeToFollow(List<CProdOrder> moveList,Integer done_code) throws Exception{
Date start=DateHelper.today();
Date today=start;
List<CProdPropChange> changeList=new ArrayList<CProdPropChange>();
List<CProdOrder> updateList=new ArrayList<>();
List<CProdOrder> moveResult=new ArrayList<>();
for(CProdOrder order:moveList){
//第一个订购记录必须是今天之前(含今天)开始,后面的订购是接续在上一条订购之后
if((start.equals(today)&&!order.getEff_date().after(start))
||(!start.equals(today)&&start.equals(order.getEff_date()))){
start=DateHelper.addDate(order.getExp_date(), 1);
}else{
Date eff_date=new Date(start.getTime());
PProdTariff tariff=pProdTariffDao.findByKey(order.getTariff_id());
Date exp_date=null;
if(tariff.getBilling_type().equals(SystemConstants.BILLING_TYPE_MONTH)){
exp_date=DateHelper.getNextMonthPreviousDay(eff_date, order.getOrder_months().intValue());
}else if(tariff.getBilling_type().equals(SystemConstants.BILLING_TYPE_DAY)){
int orderDays= Math.round(order.getOrder_months()*30);
exp_date=DateHelper.addDate(eff_date, orderDays-1);
}else{
continue;
}
start=DateHelper.addDate(exp_date, 1);
//记录异动
CProdPropChange change_effdate=new CProdPropChange();
changeList.add(change_effdate);
BeanHelper.copyProperties(change_effdate, order);
change_effdate.setDone_code(done_code);
change_effdate.setProd_sn(order.getOrder_sn());
change_effdate.setColumn_name("eff_date");
change_effdate.setOld_value(DateHelper.dateToStr(order.getEff_date()));
change_effdate.setNew_value(DateHelper.dateToStr(eff_date));
CProdPropChange change_expdate=new CProdPropChange();
changeList.add(change_expdate);
BeanHelper.copyProperties(change_expdate, order);
change_expdate.setDone_code(done_code);
change_expdate.setProd_sn(order.getOrder_sn());
change_expdate.setColumn_name("exp_date");
change_expdate.setOld_value(DateHelper.dateToStr(order.getExp_date()));
change_expdate.setNew_value(DateHelper.dateToStr(exp_date));
//更新开始计费日和结束计费日
order.setEff_date(eff_date);//外部要使用所以更新
order.setExp_date(exp_date);//外部要使用所以更新
moveResult.add(order);
CProdOrder update=new CProdOrder();
update.setOrder_sn(order.getOrder_sn());
update.setEff_date(eff_date);
update.setExp_date(exp_date);
updateList.add(update);
}
}
if(changeList.size()>0){
cProdPropChangeDao.save(changeList.toArray(new CProdPropChange[changeList.size()]));
}
if(updateList.size()>0){
cProdOrderDao.update(updateList.toArray(new CProdOrder[updateList.size()]));
}
return moveResult;
}
/**
* 单产品退订
* 查询一个订单相关的退订清单和可退费用(active_fee)
* 套餐=客户所有未失效套餐
* 宽带=相同用户所有宽带产品(含套餐子宽带产品)
* 非宽带单产品=相同用户相同单产品(含套餐子产品)
* @param cancelOrder
* @param prodConfig
* @return
* @throws Exception
*/
public List<CProdOrderDto> queryOrderByCancelOrder(CProdOrderDto cancelOrder) throws Exception{
List<CProdOrderDto> list=new ArrayList<>();
Date today=DateHelper.today();
if(!cancelOrder.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){
//套餐的情况
for(CProdOrderDto order: cProdOrderDao.queryPackageOrderDtoByCustId(cancelOrder.getCust_id())){
if(order.getExp_date().after(today)||order.getExp_date().equals(today)){
//结束日>=今天
list.add(order);
}
}
}else {
//单产品,非套餐子产品
for(CProdOrderDto order: cProdOrderDao.queryProdOrderDtoByUserId(cancelOrder.getUser_id())){
if(StringHelper.isEmpty(order.getPackage_sn())
&&(order.getExp_date().after(today)||order.getExp_date().equals(today))
&&(cancelOrder.getServ_id().equals(SystemConstants.PROD_SERV_ID_BAND)||cancelOrder.getProd_id().equals(order.getProd_id()))){
list.add(order);
}
}
}
return list;
}
/**
* 提取未过期的订单记录
* @param user_id
* @return
* @throws Exception
*/
public List<CProdOrderDto> queryLogoffProdOrderDtoByUserId(String user_id) throws Exception{
List<CProdOrderDto> list=new ArrayList<>();
Date today=DateHelper.today();
for(CProdOrderDto order:cProdOrderDao.queryProdOrderDtoByUserId(user_id)){
if(order.getExp_date().equals(today)||order.getExp_date().after(today)){
list.add(order);
}
}
return list;
}
public List<CProdOrderDto> queryLogoffProdOrderDtoByUserIds(List<String> userIdList) throws Exception {
return cProdOrderDao.queryProdOrderDtoByUserIdList(userIdList.toArray(new String[userIdList.size()]));
}
public List<CProdOrder> queryOrderProdByUserId(String user_id) throws Exception {
return cProdOrderDao.queryOrderProdByUserId(user_id);
}
public List<CProdOrder> queryNotExpAllOrderByUser(String user_id)throws Exception {
return cProdOrderDao.queryNotExpAllOrderByUser(user_id);
}
/**
* 退出一个所有资金(含已使用部分)明细
* @param cancelOrder
* @return
* @throws Exception
*/
public List<CProdOrderFee> getOrderCancelAllFeeDetail(CProdOrderDto cancelOrder) throws Exception{
List<CProdOrderFee> orderFees=cProdOrderFeeDao.queryByOrderSn(cancelOrder.getOrder_sn());
Map<String,TAcctFeeType> feeTypeMap=CollectionHelper.converToMapSingle( tAcctFeeTypeDao.findAll(), "fee_type");
int feeTotal=0;
for(CProdOrderFee orderFee: orderFees){
feeTotal+=orderFee.getFee();
orderFee.setRemark(cancelOrder.getProd_name());
orderFee.setOutput_fee(orderFee.getFee());
if(feeTypeMap.get(orderFee.getFee_type()).getCan_refund().equals(SystemConstants.BOOLEAN_TRUE)){
orderFee.setOutput_type(SystemConstants.ORDER_FEE_TYPE_CFEE);
}else{
orderFee.setOutput_type(SystemConstants.ORDER_FEE_TYPE_ACCT);
}
}
if(feeTotal!=cancelOrder.getOrder_fee().intValue()){
throw new ComponentException(ErrorCode.OrderFeeDisagree,cancelOrder.getOrder_sn());
}
return orderFees;
}
/**
* 计算一个订单的可退金额的资金明细(产品退订和销户退订)
* @param cancelOrder
* @param cancelDate
* @return
* @throws Exception
*/
public List<CProdOrderFee> getOrderCacelFeeDetail(CProdOrderDto cancelOrder,Date cancelDate) throws Exception{
//总退款金额(含可转部分)
int fee=getMainOrderCancelFee(cancelOrder,cancelDate);
if(fee>0){
List<CProdOrderFee> orderFees=cProdOrderFeeDao.queryByOrderSn(cancelOrder.getOrder_sn());
int totalOrderFee=0;
for(CProdOrderFee orderFee: orderFees){
totalOrderFee=totalOrderFee+orderFee.getFee();
orderFee.setRemark(cancelOrder.getProd_name());
}
if(totalOrderFee!=cancelOrder.getOrder_fee().intValue()){
throw new ComponentException(ErrorCode.OrderFeeDisagree,cancelOrder.getOrder_sn());
}
Map<String,TAcctFeeType> feeTypeMap=CollectionHelper.converToMapSingle( tAcctFeeTypeDao.findAll(), "fee_type");
int outTotalFee=fee;
for(CProdOrderFee orderFee: orderFees){
int outFee=Math.round(orderFee.getFee()*fee*1.0f/totalOrderFee);
if(outFee>orderFee.getFee()){
outFee=orderFee.getFee();
}
if(outFee>outTotalFee){
outFee=outTotalFee;
}
outTotalFee=outTotalFee-outFee;
orderFee.setOutput_fee(outFee);
if(feeTypeMap.get(orderFee.getFee_type()).getCan_refund().equals(SystemConstants.BOOLEAN_TRUE)){
orderFee.setOutput_type(SystemConstants.ORDER_FEE_TYPE_CFEE);
}else{
orderFee.setOutput_type(SystemConstants.ORDER_FEE_TYPE_ACCT);
}
}
if(outTotalFee!=0&&orderFees.size()>0){
CProdOrderFee orderFee=orderFees.get(orderFees.size()-1);
orderFee.setOutput_fee(orderFee.getOutput_fee()+outTotalFee);
}
return orderFees;
}else{
return new ArrayList<>();
}
}
/**
* 计算一个订单的可退金额(终止退订和销户退订)
* 并计算出可退现金部分和可转公用账目部分
* @param cancelOrder
* @param cancelDate
* @return
* @throws Exception
*/
public Map<String,Integer> getOrderCancelFee(CProdOrderDto cancelOrder,String busi_code,Date cancelDate) throws Exception{
Map<String,Integer> cancelFeeMap=new HashMap<>();
cancelFeeMap.put(SystemConstants.ORDER_FEE_TYPE_CFEE, 0);
cancelFeeMap.put(SystemConstants.ORDER_FEE_TYPE_ACCT, 0);
List<CProdOrderFee> orderFees=null;
if(busi_code.equals(BusiCodeConstants.PROD_SUPER_TERMINATE)){
orderFees=getOrderCancelAllFeeDetail(cancelOrder);
}else{
orderFees=getOrderCacelFeeDetail(cancelOrder,cancelDate);
}
for(CProdOrderFee orderFee: orderFees){
cancelFeeMap.put(orderFee.getOutput_type(), orderFee.getOutput_fee() +cancelFeeMap.get(orderFee.getOutput_type()));
}
return cancelFeeMap;
}
/**
* 计算一个订单的可退金额(终止退订和销户退订)
* @param order
* @return
* @throws Exception
*/
public Integer getMainOrderCancelFee(CProdOrder cancelOrder,Date cancelDate) throws Exception{
if(StringHelper.isNotEmpty(cancelOrder.getPackage_sn())||cancelOrder.getOrder_fee()==0){
//套餐子产品可退金额=0;
return 0;
}
//Date cancelDate=DateHelper.today();
//当天订购或订单状态是施工中
if(cancelOrder.getStatus().equals(StatusConstants.INSTALL)
||DateHelper.isToday(cancelOrder.getOrder_time())){
return cancelOrder.getOrder_fee();
}
PProdTariff tariff=pProdTariffDao.findByKey(cancelOrder.getTariff_id());
if(!tariff.getBilling_type().equals(SystemConstants.BILLING_TYPE_MONTH)){
//非包月计费的订单不退款
return 0;
}
//1.退订日在订购计费完整区间之前
if(cancelDate.before(cancelOrder.getEff_date())||cancelDate.equals(cancelOrder.getEff_date())){
//覆盖退订在订购的生效日之前(含)
return cancelOrder.getOrder_fee();
}
//2.退订日在订购计费完整区间之间
//订购的停止计费日根据订购月数反推开始计费日
Date expDate=DateHelper.addDate(cancelOrder.getExp_date(), 1);
Date effDate= DateHelper.getNextMonthByNum(expDate,-1*cancelOrder.getOrder_months().intValue());
if(cancelDate.equals(effDate)||cancelDate.before(effDate)){
//退订日包含了整个订单的订购期间
return cancelOrder.getOrder_fee();
}
//3.退订日在 订购的计费区间内(按剩余使用天数折算)
int months=DateHelper.compareToMonthByDate(cancelDate, expDate);
Date newExpDate=DateHelper.getNextMonthByNum(cancelDate,months);
if(newExpDate.after(expDate)){
//新到期日大于实际到期日,则需要回退一个月再计算
months=months-1;
}
if(months<0){
months=0;
}
return Math.round(months*1.0f*cancelOrder.getOrder_fee()/cancelOrder.getOrder_months());
}
/**
* 恢复被覆盖的订单
* @param recoverDoneCode
*/
public List<CProdOrder> recoverTransCancelOrder(Integer recoverDoneCode,String cust_id,Integer doneCode) throws Exception{
//TODO 查询被覆盖移入历史表的订购记录
List<CProdOrder> list=cProdOrderHisDao.queryCProdOrderByDelete(recoverDoneCode, cust_id);
if(list!=null&&list.size()>0){
//移回正式表
cProdOrderDao.save(list.toArray(new CProdOrder[list.size()]));
for(CProdOrder order:list){
//订单金额记录 覆盖转出信息恢复
//cProdOrderFeeDao.clearOutPutInfo(order.getOrder_sn(),SystemConstants.ORDER_FEE_TYPE_TRANSFEE);
//插入状态异动
cProdStatusChangeDao.saveStatusChange(doneCode, order.getOrder_sn(), order.getStatus());
}
//处理费用转出回退
List<CProdOrderFeeOut> outList=cProdOrderFeeOutDao.queryByDoneCodeTransFee(recoverDoneCode);
this.saveOrderFeeOutToBack(outList,doneCode);
//删除被取消订单的转入记录
for(CProdOrderFeeOut out:outList){
cProdOrderFeeDao.remove(out.getOutput_sn());
}
String orderSns[]=new String[list.size()];
for(int i=0;i<list.size();i++){
orderSns[i]=list.get(i).getOrder_sn();
}
//历史记录表移除
cProdOrderHisDao.remove(orderSns);
//删除出账状态异动(不能删因为如果非当天取消,可能会造成出账错误)
//cProdStatusChangeDao.deleteByDoneCode(recoverDoneCode);
}
return list;
}
/**
* 查询被覆盖取消的订单(套餐订购和升级的情况)
* @param orderProd
* @param busi_code
* @return
* @throws Exception
*/
public List<CProdOrder> queryTransCancelOrderList(OrderProd orderProd,String busi_code) throws Exception{
List<CProdOrder> orderCancelList=new ArrayList<>();
//提取被取消的订购记录
if(busi_code.equals(BusiCodeConstants.PROD_UPGRADE)){
if(StringHelper.isEmpty(orderProd.getLast_order_sn())){
throw new ComponentException(ErrorCode.ParamIsNull);
}
//升级的情况
orderCancelList.addAll(queryTransferFeeByUpProd(orderProd));
}
if(orderProd.getGroupSelected()!=null&&orderProd.getGroupSelected().size()>0){
//套餐订购覆盖普通订购
orderCancelList.addAll(queryTransferFeeByPackage(orderProd));
}
return orderCancelList;
}
/**
* 计算覆盖退订的可退余额(资金明细)
* @param cancelDate
* @param cancelOrder
* @return
* @throws Exception
*/
public Integer getTransCancelFee(Date cancelDate,CProdOrder cancelOrder) throws Exception{
int fee=this.getMainTransCancelFee(cancelDate, cancelOrder);
//资金明细
int inputfee=this.getOrderFeeDetailSum(cancelOrder.getOrder_sn());
if(inputfee!=cancelOrder.getOrder_fee()){
throw new ComponentException(ErrorCode.OrderFeeDisagree,cancelOrder.getOrder_sn());
}
return fee;
}
/**
* 查询一个订单的来源资金明细总额
* @param order_sn
* @return
* @throws Exception
*/
private Integer getOrderFeeDetailSum(String order_sn) throws Exception{
int total=0;
for(CProdOrderFee fee:cProdOrderFeeDao.queryByOrderSn(order_sn)){
total=fee.getFee()+total;
}
return total;
}
/**
* 计算订购主记录的覆盖退订的可退余额
* @param cancelDate
* @param cancelOrder
* @return
* @throws Exception
*/
private Integer getMainTransCancelFee(Date cancelDate,CProdOrder cancelOrder) throws Exception{
//订单金额为0 或者 订单状态是施工中,直接返回订单金额
if(cancelOrder.getOrder_fee()==0||cancelOrder.getStatus().equals(StatusConstants.INSTALL)){
return cancelOrder.getOrder_fee();
}
//1.退订日在订购计费完整区间之前
if(cancelDate.before(cancelOrder.getEff_date())||cancelDate.equals(cancelOrder.getEff_date())){
//覆盖退订在订购的生效日之前(含)
return cancelOrder.getOrder_fee();
}
//2.退订日在订购计费完整区间之前
PProdTariff tariff=pProdTariffDao.findByKey(cancelOrder.getTariff_id());
if(tariff.getBilling_type().equals(SystemConstants.BILLING_TYPE_MONTH)){
//包月的
//订购的停止计费日根据订购月数反推开始计费日
Date expDate=DateHelper.addDate(cancelOrder.getExp_date(), 1);
Date effDate=DateHelper.getNextMonthByNum(expDate,-1*cancelOrder.getOrder_months().intValue());
if(cancelDate.equals(effDate)||cancelDate.before(effDate)){
//退订日包含了整个订单的订购期间
return cancelOrder.getOrder_fee();
}
return this.getTransCancelFeeByBillingTypeMonth(cancelDate, cancelOrder.getOrder_months().intValue(), cancelOrder.getOrder_fee(), expDate);
}else if(tariff.getBilling_type().equals(SystemConstants.BILLING_TYPE_DAY)){
//包天的
//订购的停止计费日根据订购天数反推开始计费日
Date expDate=DateHelper.addDate(cancelOrder.getExp_date(), 1);
Integer orderDays=Math.round(cancelOrder.getOrder_months()*30);
Date effDate=DateHelper.addDate(expDate,-1*orderDays);
if(cancelDate.equals(effDate)||cancelDate.before(effDate)){
//退订日包含了整个订单的订购期间
return cancelOrder.getOrder_fee();
}else{
//提取天数计算金额
int betweenDays=DateHelper.getDiffDays(cancelDate, expDate);
return Math.round(betweenDays*cancelOrder.getOrder_fee()*1.0f/orderDays);
}
}else{
//其他计费类型还没考虑怎么处理
throw new ComponentException(ErrorCode.UNKNOW_EXCEPTION);
}
}
/**
* 包月计费的区间内转移支付金额计算
* 退订日在 订购的计费区间内(按剩余使用天数折算)
* @param cancelDate
* @param order_months
* @param order_fee
* @param exp_date
* @return
*/
private Integer getTransCancelFeeByBillingTypeMonth(Date cancelDate,Integer order_months,Integer order_fee,Date exp_date){
int months=DateHelper.compareToMonthByDate(cancelDate, exp_date);
Date newExpDate=DateHelper.getNextMonthByNum(cancelDate,months);
if(newExpDate.equals(cancelDate)){
//剩余整月的情况
return Math.round(months*1.0f*order_fee/order_months);
}else if(newExpDate.after(exp_date)){
//新到期日大于实际到期日,则需要回退一个月再计算
newExpDate=DateHelper.getNextMonthByNum(cancelDate,months-1);
float months_fee=(months-1)*1.0f*order_fee/order_months;
int days=DateHelper.getDiffDays(newExpDate, exp_date);
float days_fee= days* order_fee/(order_months*30.0f);
return Math.round(months_fee+days_fee);
}else{
float months_fee=months*1.0f*order_fee/order_months;
int days=DateHelper.getDiffDays(newExpDate, exp_date);
float days_fee= days* order_fee/(order_months*30.0f);
return Math.round(months_fee+days_fee);
}
}
/**
* 套餐订购覆盖普通订购的情况提取被退的订单,并结算可退余额
* @throws JDBCException
*/
private List<CProdOrder> queryTransferFeeByPackage(OrderProd orderProd) throws JDBCException{
//加载被覆盖的普通产品订购
List<CProdOrder> orderCancelList=new ArrayList<>();
for(PackageGroupUser pgu: orderProd.getGroupSelected()){
if(pgu.getUserSelectList()==null||pgu.getUserSelectList().size()==0){
continue;
}
PPackageProd pakprod= pPackageProdDao.findByKey(pgu.getPackage_group_id());
for(String prod_id: pakprod.getProd_list().split(",")){
if(StringHelper.isEmpty(prod_id)){continue;}
PProd prod=pProdDao.findByKey(prod_id);
for(String user_id: pgu.getUserSelectList()){
if(SystemConstants.PROD_SERV_ID_BAND.equals(prod.getServ_id())){
orderCancelList.addAll(cProdOrderDao.queryNotExpOrderByBand(user_id));
}else{
orderCancelList.addAll(cProdOrderDao.queryNotExpOrderByProd(user_id, prod_id));
}
}
}
}
return orderCancelList;
}
/**
* 升级订购覆盖的情况 提取被退订的订单,并结算可退余额
*/
private List<CProdOrder> queryTransferFeeByUpProd(OrderProd orderProd)throws Exception{
PProd prod=pProdDao.findByKey(orderProd.getProd_id());
if(prod.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){
//宽带升级
if(SystemConstants.PROD_SERV_ID_BAND.equals(prod.getServ_id())){
CProdOrder prodOrder=cProdOrderDao.findByKey(orderProd.getLast_order_sn());
List<CProdOrder> transferList=cProdOrderDao.queryNotExpAllOrderByUser(prodOrder.getUser_id());
for(CProdOrder order:transferList){
if(StringHelper.isNotEmpty(order.getPackage_sn())){
throw new ServicesException(ErrorCode.OrderDateCanNotUpWhyPak);
}
}
return transferList;
}else{
throw new ServicesException(ErrorCode.OrderDateCanNotUp);
}
}else{
//套餐升级
return cProdOrderDao.queryNotExpPackageOrder(orderProd.getCust_id());
}
}
/**
* 生成订单信息
*/
public CProdOrder createCProdOrder(OrderProd orderProd,
Integer done_code,String optr_id,String area_id,String county_id) throws Exception{
CProdOrder prod=new CProdOrder();
prod.setOrder_sn(cProdOrderDao.findSequence().toString());
prod.setCust_id(orderProd.getCust_id());
prod.setUser_id(orderProd.getUser_id());
prod.setProd_id(orderProd.getProd_id());
//资费处理
String[] tariffSplit=orderProd.getTariff_id().split("_");
if(tariffSplit.length>2){
throw new ComponentException("OrderProd的资费格式错误");
}
prod.setTariff_id(tariffSplit[0]);
if(tariffSplit.length==2){
prod.setDisct_id(tariffSplit[1]);
}
prod.setOrder_months(orderProd.getOrder_months());
prod.setOrder_fee(orderProd.getPay_fee()+orderProd.getTransfer_fee());
//状态要特殊处理
prod.setStatus(StatusConstants.ACTIVE);
prod.setStatus_date(new Date());
prod.setBill_fee(0);
prod.setActive_fee(orderProd.getPay_fee()+orderProd.getTransfer_fee());
prod.setEff_date(orderProd.getEff_date());
prod.setExp_date(orderProd.getExp_date());
prod.setDone_code(done_code);
prod.setOptr_id(optr_id);
prod.setArea_id(area_id);
prod.setCounty_id(county_id);
prod.setOrder_time(new Date());
prod.setPublic_acctitem_type(SystemConstants.PUBLIC_ACCTITEM_TYPE_NONE);
prod.setOrder_type(SystemConstants.PROD_ORDER_TYPE_ORDER);
if(orderProd.getEff_date().equals(DateHelper.today())){
prod.setCheck_time(prod.getOrder_time());
}
return prod;
}
/**
* 创建新订购记录产品状态判断
* @param orderProd
* @return
* @throws Exception
*/
public String getNewOrderProdStatus(CProdOrder lastOrder,OrderProd orderProd) throws Exception{
if(lastOrder!=null){
//有上期订单的情况,返回上期订单状态
return lastOrder.getStatus();
}else if(StringHelper.isNotEmpty(orderProd.getUser_id())){
//单产品的情况:状态跟用户一致
return cUserDao.findByKey(orderProd.getUser_id()).getStatus();
}else{
if(orderProd.getGroupSelected()!=null&&orderProd.getGroupSelected().size()>0){
//套餐的情况: 根据用户选择的情况判断,选中的用户有非正常状态,则返回用户的非正常状态作为产品状态
Map<String,CUser> userMap=new HashMap<String,CUser>();
for(CUser user: cUserDao.queryUserByCustId(orderProd.getCust_id())){
userMap.put(user.getUser_id(), user);
}
for(PackageGroupUser pgu: orderProd.getGroupSelected()){
if(pgu.getUserSelectList()!=null){
for(String user_id:pgu.getUserSelectList()){
if(!userMap.get(user_id).getStatus().equals(StatusConstants.ACTIVE)){
return userMap.get(user_id).getStatus();
}
}
}
}
}
}
return StatusConstants.ACTIVE;
}
/**
* OTT_MOBILE的升级
* @param cProdOrder
* @param orderProd
* @param cacleOrderList
* @return
* @throws Exception
*/
public String saveCProdOrderByOttMobileUpgrade(CProdOrder cProdOrder,OrderProd orderProd,List<CProdOrderDto> cacleOrderList) throws Exception{
int transfee=saveTransCancelProd(cProdOrder,cacleOrderList,DateHelper.today());
if(transfee!=orderProd.getTransfer_fee().intValue()){
throw new ComponentException("转移支付金额不一致,请重新操作!");
}
//保存订单
cProdOrderDao.save(cProdOrder);
//记录创建订单的原始状态
cProdStatusChangeDao.saveStatusChange(cProdOrder.getDone_code(), cProdOrder.getOrder_sn(), cProdOrder.getStatus());
//保存套餐的子订单
if(orderProd.getGroupSelected()!=null&&orderProd.getGroupSelected().size()>0){
savePackageUserProd(cProdOrder,orderProd);
}
return cProdOrder.getOrder_sn();
}
/**
* 保存订购记录
* @return
* @throws Exception
*/
public String saveCProdOrder(CProdOrder cProdOrder,OrderProd orderProd,String busi_code) throws Exception{
//覆盖退订并转移支付余额到新订购记录
int transfee=0;
List<CProdOrder> cacleOrderList=this.queryTransCancelOrderList(orderProd, busi_code);
if(cacleOrderList!=null&&cacleOrderList.size()>0){
transfee=saveTransCancelProd(cProdOrder,cacleOrderList,orderProd.getEff_date());
}
if(transfee!=orderProd.getTransfer_fee().intValue()){
throw new ComponentException("转移支付金额不一致,请重新操作!");
}
//保存订单
cProdOrderDao.save(cProdOrder);
//记录创建订单的原始状态
cProdStatusChangeDao.saveStatusChange(cProdOrder.getDone_code(), cProdOrder.getOrder_sn(), cProdOrder.getStatus());
//保存套餐的子订单
if(orderProd.getGroupSelected()!=null&&orderProd.getGroupSelected().size()>0){
savePackageUserProd(cProdOrder,orderProd);
}
return cProdOrder.getOrder_sn();
}
/**
* 覆盖退订产品
* 未支付的产品不算转移支付余额
* @param cProdOrder
* @param cancelList
* @param cancelDate
* @return
* @throws Exception
*/
public int saveTransCancelProd(CProdOrder cProdOrder,List<? extends CProdOrder> cancelList,Date cancelDate) throws Exception{
int transFee=0;
List<CProdOrderFee> outputList=new ArrayList<>();
List<CProdOrderFee> inputList=new ArrayList<>();
for(CProdOrder cancelOrder:cancelList){
if(cancelOrder.getIs_pay().equals(SystemConstants.BOOLEAN_FALSE)){
throw new ComponentException(ErrorCode.OrderTransUnPayPleaseCancel,cancelOrder.getOrder_sn());
}
int fee=this.getTransCancelFee(cancelDate, cancelOrder);
cancelOrder.setActive_fee(fee);
transFee=transFee+fee;
if(fee>0){
int totalInputFee=0;//被覆盖的订单总的可用余额
List<CProdOrderFee> outputOrderFees=cProdOrderFeeDao.queryByOrderSn(cancelOrder.getOrder_sn());
for(CProdOrderFee outputOrderFee:outputOrderFees){
totalInputFee=totalInputFee+outputOrderFee.getFee();
}
int _tmpFee=fee;//被覆盖的订单需要转出的金额
//转出金额和总余额的比例扣除订单的每条费用记录的余额
for(CProdOrderFee outputOrderFee:outputOrderFees){
int outfee= Math.round(outputOrderFee.getFee()*fee*1.0f/totalInputFee);
if(outfee>outputOrderFee.getFee()){
outfee=outputOrderFee.getFee();
}
if(outfee>_tmpFee){
outfee=_tmpFee;
}
_tmpFee=_tmpFee-outfee;
outputOrderFee.setOutput_fee(outfee);
outputOrderFee.setOutput_type(SystemConstants.ORDER_FEE_TYPE_TRANSFEE);
}
if(_tmpFee!=0&&outputOrderFees.size()>0){
CProdOrderFee outputOrderFee=outputOrderFees.get(outputOrderFees.size()-1);
outputOrderFee.setOutput_fee(outputOrderFee.getOutput_fee()+_tmpFee);
}
//新订购的转入记录
for(CProdOrderFee outputOrderFee:outputOrderFees){
CProdOrderFee inputOrderFee=new CProdOrderFee();
inputOrderFee.setOrder_fee_sn(cProdOrderFeeDao.findSequence().toString());
inputOrderFee.setOrder_sn(cProdOrder.getOrder_sn());
inputOrderFee.setDone_code(cProdOrder.getDone_code());
inputOrderFee.setInput_type(SystemConstants.ORDER_FEE_TYPE_TRANSFEE);
inputOrderFee.setInput_sn(outputOrderFee.getOrder_fee_sn());
inputOrderFee.setInput_fee(outputOrderFee.getOutput_fee());
inputOrderFee.setFee(outputOrderFee.getOutput_fee());
inputOrderFee.setFee_type(outputOrderFee.getFee_type());
inputOrderFee.setCreate_time(new Date());
inputOrderFee.setArea_id(outputOrderFee.getArea_id());
inputOrderFee.setCounty_id(outputOrderFee.getCounty_id());
inputList.add(inputOrderFee);
outputOrderFee.setOutput_sn(inputOrderFee.getOrder_fee_sn());
}
outputList.addAll(outputOrderFees);//装入被覆盖旧订购的转出记录
}
//退订订购记录
this.saveCancelProdOrder(cancelOrder,cProdOrder.getDone_code());
}
//保存转移支付记录
cProdOrderFeeDao.save(inputList.toArray(new CProdOrderFee[inputList.size()]));
//cProdOrderFeeDao.update(outputList.toArray(new CProdOrderFee[outputList.size()]));
//记录订单费用的覆盖转出记录
this.saveOrderFeeOut(getOrderFeeOutFromOrderFee(outputList),cProdOrder.getDone_code());
return transFee;
}
/**
* 处理转出费用回退
* @param outList
* @param doneCode
* @throws JDBCException
*/
public void saveOrderFeeOutToBack(List<CProdOrderFeeOut> outList,Integer doneCode) throws JDBCException{
for(CProdOrderFeeOut out: outList){
CProdOrderFee orderFee=cProdOrderFeeDao.findByKey(out.getOrder_fee_sn());
CProdOrderFeeOut in=new CProdOrderFeeOut();
in.setOrder_fee_sn(out.getOrder_fee_sn());
in.setDone_code(doneCode);
in.setOutput_type(out.getOutput_type());
in.setOutput_sn(out.getOutput_sn());
in.setRemark(out.getRemark());
in.setOutput_fee(out.getOutput_fee()*-1);
in.setPre_fee(orderFee.getFee());
in.setFee(orderFee.getFee()+out.getOutput_fee());
cProdOrderFeeDao.updateOrderFee(out.getOrder_fee_sn(), in.getOutput_fee());
cProdOrderFeeOutDao.save(in);
}
}
/**
* 处理费用转出扣费
* @param outList
* @param doneCode
* @throws JDBCException
*/
public void saveOrderFeeOut(List<CProdOrderFeeOut> outList,Integer doneCode) throws JDBCException{
for(CProdOrderFeeOut out: outList){
CProdOrderFee orderFee=cProdOrderFeeDao.findByKey(out.getOrder_fee_sn());
out.setDone_code(doneCode);
out.setPre_fee(orderFee.getFee());
out.setFee(orderFee.getFee()-out.getOutput_fee());
out.setCreate_time(new Date());
cProdOrderFeeDao.updateOrderFee(orderFee.getOrder_fee_sn(), out.getOutput_fee());
}
cProdOrderFeeOutDao.save(outList.toArray(new CProdOrderFeeOut[outList.size()]));
}
/**
* 从订单费用记录中提取费用转出记录并处理转出
* @param outputList
* @throws JDBCException
*/
public List<CProdOrderFeeOut> getOrderFeeOutFromOrderFee(List<CProdOrderFee> outputList) throws Exception{
List<CProdOrderFeeOut> outList=new ArrayList<>();
for(CProdOrderFee orderFee:outputList){
if(orderFee.getOutput_fee()==null){
throw new ComponentException(ErrorCode.ParamIsNull);
}
if(orderFee.getOutput_fee()==0){
continue;
}
CProdOrderFeeOut out=new CProdOrderFeeOut();
out.setOrder_sn(orderFee.getOrder_sn());
out.setOrder_fee_sn(orderFee.getOrder_fee_sn());
out.setOutput_sn(orderFee.getOutput_sn());
out.setOutput_type(orderFee.getOutput_type());
out.setOutput_fee(orderFee.getOutput_fee());
out.setRemark(orderFee.getRemark());
out.setFee_type(orderFee.getFee_type());
outList.add(out);
}
return outList;
}
/**
* 取消订购记录
* 财务账单计费相关
* @param order
* @throws Exception
*/
public List<CProdOrder> saveCancelProdOrder(CProdOrder order,Integer done_code) throws Exception{
//map<
List<CProdOrder> cancelResultList=new ArrayList<>();
PProd prod=pProdDao.findByKey(order.getProd_id());
CProdOrderHis deleteOrder=new CProdOrderHis();
BeanHelper.copyProperties(deleteOrder, order);
deleteOrder.setDelete_done_code(done_code);
deleteOrder.setDelete_time(new Date());
cProdOrderHisDao.save(deleteOrder);
cProdOrderDao.remove(deleteOrder.getOrder_sn());
//财务出账相关退订状态设置为失效
cProdStatusChangeDao.saveStatusChange(done_code, order.getOrder_sn(), StatusConstants.INVALID);
cancelResultList.add(order);
if(!prod.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)){
//套餐的情况,要退子产品
List<CProdOrderHis> pakDetailList=new ArrayList<>();
List<String> detailSnList=new ArrayList<>();
for(CProdOrder pakdetail: cProdOrderDao.queryPakDetailOrder(order.getOrder_sn())){
CProdOrderHis pakdetailhis=new CProdOrderHis();
BeanHelper.copyProperties(pakdetailhis, pakdetail);
pakdetailhis.setDelete_done_code(done_code);
pakdetailhis.setDelete_time(new Date());
pakDetailList.add(pakdetailhis);
detailSnList.add(pakdetail.getOrder_sn());
cancelResultList.add(pakdetail);
}
cProdOrderHisDao.save(pakDetailList.toArray(new CProdOrderHis[pakDetailList.size()]));
cProdOrderDao.remove(detailSnList.toArray(new String[detailSnList.size()]));
}
return cancelResultList;
}
/**
* 保存套餐子产品
* @throws InvocationTargetException
* @throws Exception
*/
private List<CProdOrder> savePackageUserProd(CProdOrder cProdOrder,OrderProd orderProd) throws Exception{
List<CProdOrder> orderList=new ArrayList<>();
Map<String,CUser> userMap=CollectionHelper.converToMapSingle(cUserDao.queryUserByCustId(cProdOrder.getCust_id()),"user_id");
for(PackageGroupUser pgu: orderProd.getGroupSelected()){
if(pgu.getUserSelectList()==null){
continue;
}
PPackageProd pakprod= pPackageProdDao.findByKey(pgu.getPackage_group_id());
if(!pakprod.getPackage_id().equals(cProdOrder.getProd_id())){
throw new ServicesException(ErrorCode.OrderDatePackageConfig);
}
if(pgu.getUserSelectList().size()>pakprod.getMax_user_cnt()){
throw new ServicesException(ErrorCode.OrderDatePackageUserLimit);
}
for(String prod_id:pakprod.getProd_list().split(",")){
if(StringHelper.isNotEmpty(prod_id)){
for(String user_id: pgu.getUserSelectList()){
CUser user=userMap.get(user_id);
if(user==null){
//用户存在检查
throw new ServicesException(ErrorCode.OrderDateUserNotCust,user_id);
}
if(!user.getUser_type().equals(pakprod.getUser_type())){
//用户适用检查
throw new ServicesException(ErrorCode.OrderDateUserNotCust,user_id);
}
if(StringHelper.isNotEmpty(pakprod.getTerminal_type())
&&!pakprod.getTerminal_type().equals(user.getTerminal_type())){
//用户适用检查
throw new ServicesException(ErrorCode.OrderDateUserNotCust,user_id);
}
CProdOrder order=new CProdOrder();
//copy
BeanHelper.copyProperties(order, cProdOrder);
order.setOrder_sn(cProdOrderDao.findSequence().toString());
order.setProd_id(prod_id);
order.setUser_id(user_id);
order.setPackage_id(cProdOrder.getProd_id());
order.setPackage_sn(cProdOrder.getOrder_sn());
order.setPackage_group_id(pgu.getPackage_group_id());
order.setOrder_fee(0);
order.setActive_fee(0);
orderList.add(order);
}
}
}
}
if(orderList.size()>0){
cProdOrderDao.save(orderList.toArray(new CProdOrder[orderList.size()]));
}
return orderList;
}
/**
* 修改产品信息
* @param doneCode
* @param orderSn
* @param propChangeList
* @throws Exception
*/
public void editOrder(Integer doneCode,String orderSn,List<CProdPropChange> propChangeList) throws Exception{
if(propChangeList == null || propChangeList.size() == 0) return ;
CProdOrder order = new CProdOrder();
order.setOrder_sn(orderSn);
for (CProdPropChange change:propChangeList){
if (change.getColumn_name().indexOf("date")>-1){
if (change.getNew_value().length() ==10)
BeanHelper.setProperty(order, change.getColumn_name(),
DateHelper.parseDate(change.getNew_value(), DateHelper.FORMAT_YMD));
else
BeanHelper.setProperty(order, change.getColumn_name(),
DateHelper.parseDate(change.getNew_value(), DateHelper.FORMAT_TIME));
} else {
BeanHelper.setProperty(order, change.getColumn_name(), change
.getNew_value());
}
change.setProd_sn(orderSn);
change.setDone_code(doneCode);
change.setArea_id(getOptr().getArea_id());
change.setCounty_id(getOptr().getCounty_id());
}
//修改产品信息
cProdOrderDao.update(order);
//保存产品异动信息
cProdPropChangeDao.save(propChangeList.toArray(new CProdPropChange[propChangeList.size()]));
}
/**
* 产品订购面板产品数据初始化加载
* @param busiCode
* @param custId
* @param userId
* @param filterOrderSn
* @return
* @throws Exception
*/
public OrderProdPanel queryOrderableProd(String busiCode,String custId,String userId, String filterOrderSn)
throws Exception {
OrderProdPanel panel =new OrderProdPanel();
CCust cust = cCustDao.findByKey(custId);
List<CProdOrderDto> orderList = cProdOrderDao.queryCustEffOrderDto(custId);
if (busiCode.equals(BusiCodeConstants.PROD_SINGLE_ORDER)){
queryUserOrderableProd(cust,userId,panel,orderList);
} else if (busiCode.equals(BusiCodeConstants.PROD_PACKAGE_ORDER)){
queryCustOrderablePkg(cust,panel,orderList);
} else if (busiCode.equals(BusiCodeConstants.PROD_CONTINUE)){
queryOrderableGoon(cust,filterOrderSn,panel,orderList);
} else if (busiCode.equals(BusiCodeConstants.PROD_UPGRADE)){
queryOrderableUpgrade(cust,filterOrderSn,panel,orderList);
}
return panel;
}
/**
* 升级情况
* @throws Exception
*/
public void queryOrderableUpgrade(CCust cust,String filterOrderSn,OrderProdPanel panel,List<CProdOrderDto> orderList) throws Exception{
CProdOrder order = cProdOrderDao.findByKey(filterOrderSn);
if (order == null)
return ;
panel.setUserId(order.getUser_id());
Map<String,Integer> prodBandWidthMap = pProdDao.queryProdBandWidth();
PProd prod= pProdDao.findByKey(order.getProd_id());
if (prod.getProd_type().equals(SystemConstants.PROD_TYPE_BASE)
&& prod.getServ_id().equals(SystemConstants.USER_TYPE_BAND)){
//升级宽带产品
queryUserOrderableProd(cust,order.getUser_id(),panel,orderList);
//过滤掉带宽小于等于当前套餐的产品 改成过滤掉 当前产品
for (Iterator<PProd> it = panel.getProdList().iterator();it.hasNext();){
PProd selectedProd = it.next();
if (prodBandWidthMap.get(selectedProd.getProd_id())==null ||
//prodBandWidthMap.get(selectedProd.getProd_id())<= prodBandWidthMap.get(prod.getProd_id())){
selectedProd.getProd_id().equals(prod.getProd_id())){
it.remove();
panel.getTariffMap().remove(selectedProd.getProd_id());
panel.getLastOrderMap().remove(prod.getProd_id());
}
}
} else if (prod.getProd_type().equals(SystemConstants.PROD_TYPE_CUSTPKG)
&& prodBandWidthMap.get(prod.getProd_id()) != null){
//含宽带的普通套餐
queryCustOrderablePkg(cust,panel,orderList);
//过滤掉带宽小于等于当前套餐的产品 改成 过滤掉当前套餐
for (Iterator<PProd> it = panel.getProdList().iterator();it.hasNext();){
PProd selectedProd = it.next();
if (prod.getProd_type().equals(SystemConstants.PROD_TYPE_SPKG) ||
prodBandWidthMap.get(selectedProd.getProd_id())==null ||
//prodBandWidthMap.get(selectedProd.getProd_id())<= prodBandWidthMap.get(prod.getProd_id())){
selectedProd.getProd_id().equals(prod.getProd_id())){
it.remove();
panel.getTariffMap().remove(selectedProd.getProd_id());
panel.getLastOrderMap().remove(prod.getProd_id());
}
}
} else if (prod.getProd_type().equals(SystemConstants.PROD_TYPE_SPKG)){
//协议套餐
queryCustOrderablePkg(cust,panel,orderList);
//过滤掉普通套餐
for (Iterator<PProd> it = panel.getProdList().iterator();it.hasNext();){
PProd selectedProd = it.next();
if (prod.getProd_type().equals(SystemConstants.PROD_TYPE_CUSTPKG)){
it.remove();
panel.getTariffMap().remove(selectedProd.getProd_id());
panel.getLastOrderMap().remove(prod.getProd_id());
}
}
} else {
throw new ServicesException(ErrorCode.OrderDateCanNotUp);
}
}
//查找用户能够订购的单产品
private void queryUserOrderableProd(CCust cust,String userId,OrderProdPanel panel,List<CProdOrderDto> orderList) throws Exception {
CUser user = cUserDao.findByKey(userId);
if (user == null)
return;
panel.setUserId(userId);
panel.setUserDesc(getUserDesc(user));
List<PProd> prodList = pProdDao.queryCanOrderUserProd(user.getUser_type(), user.getCounty_id(),
user.getCounty_id(), SystemConstants.DEFAULT_DATA_RIGHT);
for (PProd prod:prodList){
List<PProdTariffDisct> tariffList = this.queryTariffList(cust,user, prod);
if (!CollectionHelper.isEmpty(tariffList)){
panel.getProdList().add(prod);
panel.getTariffMap().put(prod.getProd_id(), tariffList);
CProdOrder order = getUserLastOrder(userId, prod, orderList);
if (order != null){
panel.getLastOrderMap().put(prod.getProd_id(), order);
}
}
}
}
//查找客户能够订购的套餐
private void queryCustOrderablePkg(CCust cust,OrderProdPanel panel,List<CProdOrderDto> orderList) throws Exception {
String custId = cust.getCust_id();
Map<String,Integer> userCountMap = cUserDao.queryUserCountGroupByType(custId);
List<PProd> prodList = pProdDao.queryCanOrderPkg(cust.getCounty_id(), SystemConstants.DEFAULT_DATA_RIGHT);
for (PProd prod:prodList){
List<PProdTariffDisct> tariffList = this.queryTariffList(cust,null, prod);
if (!CollectionHelper.isEmpty(tariffList)){
boolean flag = true;
if (prod.getProd_type().equals(SystemConstants.PROD_TYPE_CUSTPKG)){
//验证客户名下终端是否满足要求
Map<String,Integer> pkgUserCountMap = pProdDao.queryUserCountGroupByType(prod.getProd_id());
for (Entry<String,Integer> entry:pkgUserCountMap.entrySet()){
if (entry.getValue()>(userCountMap.get(entry.getKey())==null?0:userCountMap.get(entry.getKey()))){
flag = false;
break;
}
}
}
if (flag){
panel.getProdList().add(prod);
panel.getTariffMap().put(prod.getProd_id(), tariffList);
CProdOrder order = getCustLastOrder(orderList);
if (order != null){
panel.getLastOrderMap().put(prod.getProd_id(), order);
}
}
}
}
}
private void queryOrderableGoon(CCust cust,String filterOrderSn,OrderProdPanel panel,List<CProdOrderDto> orderList) throws Exception {
CProdOrder order = cProdOrderDao.findByKey(filterOrderSn);
if (order == null)
return;
panel.setUserId(order.getUser_id());
PProd prod= pProdDao.findByKey(order.getProd_id());
if (prod.getExp_date() != null && prod.getEff_date().before(new Date())){
throw new ServicesException(ErrorCode.ProdIsInvalid);
}
CUser user = null;
CProdOrder lastOrder = null;
if (StringHelper.isNotEmpty(order.getUser_id())){
user = cUserDao.findByKey(order.getUser_id());
panel.setUserDesc(getUserDesc(user));
lastOrder = getUserLastOrder(user.getUser_id(), prod, orderList);
} else {
lastOrder = getCustLastOrder(orderList);
}
List<PProdTariffDisct> tariffList = this.queryTariffList(cust,user, prod);
if (!CollectionHelper.isEmpty(tariffList)){
panel.getProdList().add(prod);
panel.getTariffMap().put(prod.getProd_id(), tariffList);
panel.getLastOrderMap().put(prod.getProd_id(), lastOrder);
}
}
/**
* 查找客户用户适用的资费和优惠
* @throws Exception
*/
private List<PProdTariffDisct> queryTariffList(CCust cust,CUser user, PProd prod) throws Exception {
List<PProdTariffDisct> tariffList = new ArrayList<>();
List<ProdTariffDto> ptList = pProdTariffDao.queryProdTariff(prod.getProd_id(), cust.getCounty_id(),
SystemConstants.DEFAULT_DATA_RIGHT);
if (prod.getProd_type().equals(SystemConstants.PROD_TYPE_SPKG)){//协议套餐,验证协议号
for (Iterator<ProdTariffDto> tariffIt = ptList.iterator();tariffIt.hasNext();) {
ProdTariffDto tariff = tariffIt.next();
if (!tariff.getSpkg_sn().equals(cust.getSpkg_sn()))
tariffIt.remove();
}
}if(prod.getProd_type().equals(SystemConstants.PROD_TYPE_CUSTPKG)&&StringHelper.isNotEmpty(cust.getSpkg_sn())){
//有协议号的情况,客户套餐不能订购
ptList.clear();
} else {
for (Iterator<ProdTariffDto> tariffIt = ptList.iterator();tariffIt.hasNext();) {
ProdTariffDto tariff = tariffIt.next();
if (!checkRule(cust,user, tariff.getRule_id()))
tariffIt.remove();
}
}
java.text.DecimalFormat df=new java.text.DecimalFormat("#.##");
//资费的格式
Pattern p = Pattern.compile("USD/*M");
// 如果有适用的资费
if (CollectionHelper.isNotEmpty(ptList)) {
for(ProdTariffDto pt:ptList){
PProdTariffDisct tariff = new PProdTariffDisct();
tariff.setTariff_id(pt.getTariff_id());
tariff.setBilling_cycle(pt.getBilling_cycle());
tariff.setDisct_rent(pt.getRent());
tariff.setDisct_name(pt.getTariff_name());
Matcher tariffRent = p.matcher(tariff.getDisct_name());
if(!tariffRent.find()){
String _v = null;
if(tariff.getBilling_cycle() != null && tariff.getDisct_rent() !=null ){
_v = tariff.getBilling_cycle() == 1 ?"":tariff.getBilling_cycle().toString();
}
if(_v != null){
tariff.setDisct_name(tariff.getDisct_name()+"("+df.format((double)tariff.getDisct_rent()/100)+"USD/"+_v+"M)");
}
}
tariff.setBilling_type(pt.getBilling_type());
tariffList.add(tariff);
// 查找资费所有的优惠
List<PProdTariffDisct> disctList = pProdTariffDisctDao.queryDisctByTariffId(pt.getTariff_id(),
cust.getCounty_id());
if (CollectionHelper.isNotEmpty(disctList)) {
for (PProdTariffDisct disct : disctList) {
boolean flag = true;
if (StringHelper.isNotEmpty(disct.getRule_id())) {
if (!checkRule(cust,user, tRuleDefineDao.findByKey(disct.getRule_id()).getRule_str()))
flag = false;
}
if (flag) {
disct.setTariff_id(disct.getTariff_id() + "_" + disct.getDisct_id());
disct.setBilling_type(pt.getBilling_type());
Matcher disctRent = p.matcher(disct.getDisct_name());
if(!disctRent.find()){
String _v = null;
if(disct.getBilling_cycle() != null && disct.getDisct_rent() !=null ){
_v = disct.getBilling_cycle() == 1 ?"":disct.getBilling_cycle().toString();
}
if(_v != null){
disct.setDisct_name(disct.getDisct_name()+"("+df.format((double)disct.getDisct_rent()/100)+"USD/"+_v+"M)");
}
}
//disct.setDisct_id(disct.getTariff_id() + "-" + disct.getDisct_id());
tariffList.add(disct);
}
}
}
}
}
return tariffList;
}
private boolean checkRule(CCust cust,CUser user, String ruleId) throws Exception{
if (StringHelper.isEmpty(ruleId))
return true;
TRuleDefine rule = tRuleDefineDao.findByKey(ruleId);
if (rule == null)
return true;
ExpressionUtil expressionUtil=new ExpressionUtil(beanFactory);
expressionUtil.setCcust(cust);
expressionUtil.setCuser(user);
return expressionUtil.parseBoolean(rule.getRule_str());
}
private String getUserDesc(CUser user) {
return getFillUserName(user);
}
private CProdOrder getUserLastOrder(String userId,PProd prod,List<CProdOrderDto> orderList){
CProdOrder lastOrder = null;
Date maxExpDate = new Date();
if (CollectionHelper.isNotEmpty(orderList)){
for(CProdOrder order:orderList){
if (order.getExp_date().after(maxExpDate)){
if (userId.equals(order.getUser_id()) && (order.getProd_id().equals(prod.getProd_id()) ||
prod.getServ_id().equals(SystemConstants.USER_TYPE_BAND))){
lastOrder = order;
maxExpDate = order.getExp_date();
}
}
}
}
return lastOrder;
}
private CProdOrder getCustLastOrder(List<CProdOrderDto> orderList){
CProdOrderDto lastOrder = null;
Date maxExpDate = new Date();
if (CollectionHelper.isNotEmpty(orderList)){
for(CProdOrderDto order:orderList){
if (!order.getProd_type().equals(SystemConstants.PROD_TYPE_BASE) && order.getExp_date().after(maxExpDate)){
lastOrder = order;
maxExpDate = order.getExp_date();
}
}
}
return lastOrder;
}
/**
* 更新订单费用缴费的资金类型
* @param upPayDoneCodes
* @param feeType
* @throws Exception
*/
public void updateOrderFeeTypeByPayType(List<FeeDto> feeList,String payType) throws Exception{
String feeType=tPayTypeDao.findByKey(payType).getAcct_feetype();
for(FeeDto fee:feeList){
if(StringHelper.isNotEmpty(fee.getProd_sn())){
cProdOrderFeeDao.updateFeeType(fee.getProd_sn(),fee.getCreate_done_code(), feeType);
}
}
}
/**
* 获取宽带最后一个订单
* @param userId
* @return
* @throws Exception
*/
public CProdOrderDto getBandLastOrder(String userId)throws Exception{
List<CProdOrderDto> orderList = cProdOrderDao.queryProdOrderDtoByUserId(userId);
CProdOrderDto lastOrder = null;
if (CollectionHelper.isNotEmpty(orderList)){
for(CProdOrderDto order:orderList){
if (order.getProd_type().equals(SystemConstants.PROD_TYPE_BASE) &&order.getServ_id().equals(SystemConstants.PROD_SERV_ID_BAND)){
if(lastOrder == null){
lastOrder = order;
}else if(order.getExp_date().after(lastOrder.getExp_date())){
lastOrder = order;
}
}
}
}
return lastOrder;
}
/**
* 整体移动剩下订单的开始和结束计算日期
* @param cancelResultList
* @param userMap
* @param done_code
* @throws Exception
*/
public void moveOrderByCancelOrder(List<CProdOrder> cancelResultList,Map<String,CUser> userMap,Integer done_code) throws Exception{
//key=cust_id+'_'+user_id+"_"
Map<String,CProdOrder> movePackageMap=new HashMap<>();
Map<String,CProdOrder> moveBandMap=new HashMap<>();
Map<String,CProdOrder> moveProdMap=new HashMap<>();
for(CProdOrder order:cancelResultList){
if(StringHelper.isEmpty(order.getUser_id())){
//套餐订单
movePackageMap.put(order.getCust_id(), order);
}else{
CUser user=userMap.get(order.getUser_id());
if(user==null){
user=cUserDao.findByKey(order.getUser_id());
userMap.put(order.getUser_id(), user);
if(user==null){
throw new ServicesException(ErrorCode.OrderDateException,order.getOrder_sn());
}
}
if(user.getUser_type().equals(SystemConstants.USER_TYPE_BAND)){
//宽带订单
moveBandMap.put(order.getUser_id(), order);
}else{
//非宽带单产品订单
String key=StringHelper.append(order.getUser_id()+"_"+order.getProd_id());
moveProdMap.put(key, order);
}
}
}
//套餐订单的接续处理
for(String cust_id: movePackageMap.keySet()){
this.movePackageOrderToFollow(cust_id, done_code);
}
//宽带订单的接续处理
for(String user_id:moveBandMap.keySet()){
this.moveBandOrderToFollow(user_id, done_code);
}
//非宽带单产品的接续处理
for(CProdOrder order:moveProdMap.values()){
this.moveProdOrderToFollow(order.getUser_id(), order.getProd_id(), done_code);
}
}
}