package com.ycsoft.sysmanager.web.action.system; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Controller; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.ycsoft.beans.prod.PPromFee; import com.ycsoft.beans.prod.PPromFeeCounty; import com.ycsoft.beans.prod.PPromFeeDivision; import com.ycsoft.beans.prod.PPromFeeProd; import com.ycsoft.beans.prod.PPromFeeUser; import com.ycsoft.beans.system.SSysChange; import com.ycsoft.business.dto.core.prod.PromFeeProdDto; import com.ycsoft.commons.abstracts.BaseAction; import com.ycsoft.commons.constants.StatusConstants; import com.ycsoft.commons.constants.SysChangeType; import com.ycsoft.commons.exception.ActionException; import com.ycsoft.commons.exception.ComponentException; import com.ycsoft.commons.helper.CollectionHelper; import com.ycsoft.commons.helper.StringHelper; import com.ycsoft.commons.tree.TreeBuilder; import com.ycsoft.commons.tree.TreeNode; import com.ycsoft.daos.helper.BeanHelper; import com.ycsoft.sysmanager.component.prod.ProdComponent; import com.ycsoft.sysmanager.component.prod.PromFeeComponent; import com.ycsoft.sysmanager.dto.PromFeeDto; @Controller public class PromFeeAction extends BaseAction { /** * */ private static final long serialVersionUID = 3623319464696427973L; private ProdComponent prodComponent; private String promFeeId; private String userNo; private PPromFee promFee; private String countyIds; private String promFeeUserListStr; private String promFeeProdListStr; private String promFeeDivisonListStr; private String prodId; private String query; private PromFeeComponent promFeeComponent; public String queryPromFeeUserRule() throws Exception{ getRoot().setRecords(promFeeComponent.queryPromFeeUserRule()); return JSON_RECORDS; } public String queryPromFee() throws Exception{ getRoot().setPage(promFeeComponent.queryPromFee(start, limit,query,optr)); return JSON_PAGE; } public String queryPromFeeUsers() throws Exception{ getRoot().setRecords(promFeeComponent.queryPromFeeUsers(promFeeId)); return JSON_RECORDS; } public String queryPromFeeProds() throws Exception{ getRoot().setSimpleObj(promFeeComponent.queryPromFeeProds(promFeeId)); return JSON_SIMPLEOBJ; } public String queryPromFeeDivision() throws Exception{ getRoot().setRecords(promFeeComponent.queryPromFeeDivision(promFeeId)); return JSON_RECORDS; } /** * 促销主题适用地区树 * @return * @throws Exception */ @SuppressWarnings("unchecked") public String getCountyTree() throws Exception{ String[] type = {"COUNTY","PROMFEE"}; List<TreeNode> prodtree = TreeBuilder.createTreeCheck((List)prodComponent.getCountyTree(optr,type,promFeeId)); getRoot().setRecords(prodtree); return JSON_RECORDS; } public String savePromFee() throws Exception{ String id = promFee.getProm_fee_id(); PromFeeDto oldPromFee = promFeeComponent.queryForSysChangeInfo(id,true); promFeeComponent.savePromFee(promFee,optr,countyIds); PromFeeDto newPromFee = promFeeComponent.queryForSysChangeInfo(promFee.getProm_fee_id(),true); saveChanges(oldPromFee,newPromFee, 1); return JSON; } /** * 禁用套餐 * @return * @throws Exception */ public String stopProm() throws Exception{ PromFeeDto dto = promFeeComponent.queryForSysChangeInfo(promFeeId, false); promFeeComponent.updateStatusProm(promFeeId,StatusConstants.INVALID); PromFeeDto dtoNew = new PromFeeDto(); BeanUtils.copyProperties(dto, dtoNew); PPromFee newPromFee = new PPromFee(); newPromFee.setStatus(StatusConstants.INVALID); dtoNew.setPromFee(newPromFee); saveChanges(dto, dtoNew, 5); return JSON; } /** * 启用套餐 * @return * @throws Exception */ public String userProm() throws Exception{ PromFeeDto dto = promFeeComponent.queryForSysChangeInfo(promFeeId, false); promFeeComponent.updateStatusProm(promFeeId,StatusConstants.ACTIVE); PromFeeDto dtoNew = new PromFeeDto(); BeanUtils.copyProperties(dto, dtoNew); PPromFee newPromFee = new PPromFee(); newPromFee.setStatus(StatusConstants.ACTIVE); dtoNew.setPromFee(newPromFee); saveChanges(dto, dtoNew, 5); return JSON; } public String savePromFeeUsers() throws Exception{ List<PPromFeeUser> promFeeUserList = new ArrayList<PPromFeeUser>(); Type type = new TypeToken<List<PPromFeeUser>>(){}.getType(); Gson gson = new Gson(); promFeeUserList = gson.fromJson(promFeeUserListStr, type); String promFeeId = (promFeeUserList !=null && !promFeeUserList.isEmpty()) ? promFeeUserList.get(0).getProm_fee_id():null; if(StringHelper.isEmpty(promFeeId)){ throw new ActionException("参数有错误,未能获取prom_fee_id"); } List<PPromFeeUser> oldList = promFeeComponent.queryPromFeeUsers(promFeeId); PromFeeDto oldPromFee = promFeeComponent.queryForSysChangeInfo(promFeeId, false); oldPromFee.setUsers(oldList); promFeeComponent.savePromFeeUsers(promFeeId,promFeeUserList); List<PPromFeeUser> newList = promFeeComponent.queryPromFeeUsers(promFeeId); PromFeeDto newPromFee = promFeeComponent.queryForSysChangeInfo(promFeeId, false); newPromFee.setUsers(newList); saveChanges(oldPromFee, newPromFee, 2); return JSON; } /** * 查询不含客户套餐的产品 * @return * @throws Exception */ public String queryProdAll() throws Exception{ getRoot().setRecords(promFeeComponent.queryProdAll(promFeeId)); return JSON_RECORDS; } public String queryAllTariff() throws Exception{ getRoot().setRecords(promFeeComponent.queryAllTariff(promFeeId,prodId)); return JSON_RECORDS; } public String savePromFeeProds() throws Exception{ List<PPromFeeProd> promFeeProdList = new ArrayList<PPromFeeProd>(); Type type = new TypeToken<List<PPromFeeProd>>(){}.getType(); Gson gson = new Gson(); promFeeProdList = gson.fromJson(promFeeProdListStr, type); PromFeeDto oldPromFee = promFeeComponent.queryForSysChangeInfo(promFeeId, false); List<PPromFeeProd> oldList = new ArrayList<PPromFeeProd>(); List<PromFeeProdDto> oldUserProds = promFeeComponent.queryPromFeeProds(promFeeId).get(userNo); if(CollectionHelper.isNotEmpty(oldUserProds)){ oldList.addAll(oldUserProds); } oldPromFee.setProds( oldList ); promFeeComponent.savePromFeeProds(promFeeId,userNo,promFeeProdList); PromFeeDto newPromFee = promFeeComponent.queryForSysChangeInfo(promFeeId, false); List<PPromFeeProd> newList = new ArrayList<PPromFeeProd>(); List<PromFeeProdDto> newUserProds = promFeeComponent.queryPromFeeProds(promFeeId).get(userNo); if(CollectionHelper.isNotEmpty(newUserProds)){ newList.addAll(newUserProds); } newPromFee.setProds(newList); saveChanges(oldPromFee, newPromFee, 3); return JSON; } public String savePromFeeDivision() throws Exception{ List<PPromFeeDivision> divisionList = new ArrayList<PPromFeeDivision>(); Type type = new TypeToken<List<PPromFeeDivision>>(){}.getType(); Gson gson = new Gson(); divisionList = gson.fromJson(promFeeDivisonListStr, type); PromFeeDto oldPromFee = promFeeComponent.queryForSysChangeInfo(promFeeId,false); List<PPromFeeDivision> oldDivisions = promFeeComponent.queryPromFeeDivision(promFeeId); oldPromFee.setDivisions(oldDivisions); promFeeComponent.savePromFeeDivision(promFeeId, divisionList); PromFeeDto newPromFee = promFeeComponent.queryForSysChangeInfo(promFeeId,false); List<PPromFeeDivision> newDivisions = promFeeComponent.queryPromFeeDivision(promFeeId); newPromFee.setDivisions(newDivisions); saveChanges(oldPromFee, newPromFee, 4); return JSON; } /** * @param oldPromFee * @param newPromFee * @param type * <ul> * <li>1:基本信息(包括适用地区)</li> * <li>2:套餐用户、</li> * <li>3:套餐产品、</li> * <li>4:分成配置</li> * <li>5:状态变更,启用/禁用</li> * </ul> * @throws ComponentException */ private void saveChanges(PromFeeDto oldPromFee,PromFeeDto newPromFee, int type) throws ActionException{ if(StringHelper.isEmpty(oldPromFee.getPromFeeId()) && StringHelper.isEmpty(newPromFee.getPromFeeId())){ throw new ActionException("记录异动出现异常,比较的两个对象都为空!"); } try{ List<SSysChange> changes = new ArrayList<SSysChange>(); Integer doneCode = promFeeComponent.getDoneCOde(); String changeType = SysChangeType.PROMFEE.toString(); String key = StringHelper.isEmpty(oldPromFee.getPromFeeId()) ? newPromFee.getPromFeeId() : oldPromFee.getPromFeeId(); String promFeeName = StringHelper.isEmpty(oldPromFee.getPromFeeId()) ? newPromFee.getPromFeeName() : oldPromFee.getPromFeeName(); Date createTime = new Date(); String optrId = getOptr().getOptr_id(); switch (type) { case 1:// 基本信息和适用地区 String baseChangeContent = BeanHelper.beanchange(oldPromFee.getPromFee(), newPromFee.getPromFee()); if(StringHelper.isNotEmpty(baseChangeContent)){ SSysChange baseChange = new SSysChange(changeType, doneCode, key, promFeeName, "套餐配置定义", baseChangeContent, optrId, createTime); changes.add(baseChange); } List<PPromFeeCounty> oldCounty = oldPromFee.getCounty(); List<PPromFeeCounty> newCounty = newPromFee.getCounty(); if(CollectionHelper.isNotEmpty(oldCounty) || CollectionHelper.isNotEmpty(newCounty)){ String countyChange = BeanHelper.listchange(oldCounty, newCounty, "county_name"); if(StringHelper.isNotEmpty(countyChange)){ SSysChange change = new SSysChange(changeType, doneCode, key, promFeeName, "套餐配置适用分公司", countyChange, optrId, createTime); changes.add(change); } } break; case 2:// 套餐用户,所有前台表格可见字段 String [] userProperties = new String[] {"user_no","rule_name","user_fee","prod_count"}; List<PPromFeeUser> oldUsers = oldPromFee.getUsers(); List<PPromFeeUser> newUsers = newPromFee.getUsers(); if(CollectionHelper.isNotEmpty(oldUsers) || CollectionHelper.isNotEmpty(newUsers)){ String userChangeInfo = BeanHelper.listchange(oldUsers, newUsers, userProperties); if(StringHelper.isNotEmpty(userChangeInfo)){ SSysChange change = new SSysChange(changeType, doneCode, key, promFeeName, promFeeName+"_套餐用户配置", userChangeInfo, optrId, createTime); changes.add(change); } } break; case 3:// 套餐产品,所有前台表格可见字段 String [] prodProperties = new String[] {"prod_name","tariff_name","months","real_pay","force_select_text","bind_prod_name"}; List<PPromFeeProd> oldProds = oldPromFee.getProds(); List<PPromFeeProd> newProds = newPromFee.getProds(); if(CollectionHelper.isNotEmpty(oldProds) || CollectionHelper.isNotEmpty(newProds)){ String prodChangeInfo = BeanHelper.listchange(oldProds, newProds, prodProperties); if(StringHelper.isNotEmpty(prodChangeInfo)){ String userno = CollectionHelper.isEmpty(oldProds)? newProds.get(0).getUser_no():oldProds.get(0).getUser_no(); SSysChange change = new SSysChange(changeType, doneCode, key, promFeeName, promFeeName + "_" + userno +"_套餐产品配置", prodChangeInfo, optrId, createTime); changes.add(change); } } break; case 4:// 分成配置,所有前台表格可见字段 String [] divProperties = new String[] {"user_no","prod_name","tariff_name","real_pay","percent_value"}; List<PPromFeeDivision> oldDivisions = oldPromFee.getDivisions(); List<PPromFeeDivision> newDivisions = newPromFee.getDivisions(); if(CollectionHelper.isNotEmpty(oldDivisions) || CollectionHelper.isNotEmpty(newDivisions)){ String divChangeInfo = BeanHelper.listchange(oldDivisions, newDivisions, divProperties); if(StringHelper.isNotEmpty(divChangeInfo)){ SSysChange change = new SSysChange(changeType, doneCode, key, promFeeName, promFeeName + "_分成配置", divChangeInfo, optrId, createTime); changes.add(change); } } break; case 5://状态变更 String content = BeanHelper.beanchange(oldPromFee.getPromFee(), newPromFee.getPromFee(),"status_text"); if(StringHelper.isNotEmpty(content)){ SSysChange baseChange = new SSysChange(changeType, doneCode, key, promFeeName, "禁用/启用套餐收费配置", content, optrId, createTime); changes.add(baseChange); } break; } if (!changes.isEmpty()) { promFeeComponent.getSSysChangeDao().save(changes.toArray(new SSysChange[changes.size()])); } } catch (Exception e) { throw new ActionException(e.getMessage()); } } public void setPromFeeId(String promFeeId) { this.promFeeId = promFeeId; } public PPromFee getPromFee() { return promFee; } public void setPromFee(PPromFee promFee) { this.promFee = promFee; } public void setPromFeeComponent(PromFeeComponent promFeeComponent) { this.promFeeComponent = promFeeComponent; } public void setPromFeeUserListStr(String promFeeUserListStr) { this.promFeeUserListStr = promFeeUserListStr; } public void setPromFeeProdListStr(String promFeeProdListStr) { this.promFeeProdListStr = promFeeProdListStr; } public void setUserNo(String userNo) { this.userNo = userNo; } public void setCountyIds(String countyIds) { this.countyIds = countyIds; } public void setProdComponent(ProdComponent prodComponent) { this.prodComponent = prodComponent; } public void setProdId(String prodId) { this.prodId = prodId; } public void setPromFeeDivisonListStr(String promFeeDivisonListStr) { this.promFeeDivisonListStr = promFeeDivisonListStr; } public String getQuery() { return query; } public void setQuery(String query) { this.query = query; } }