package com.gustz.dove.api.menu.service.impl;
import java.util.Date;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.sinovatech.fw.api.vo.Order;
import com.sinovatech.fw.dao.SqlDao;
import com.sinovatech.fw.query.util.QueryInfo;
import com.sinovatech.fw.query.util.QueryInfoBuilder;
import com.sinovatech.fw.service.impl.AbstractDataService;
import com.sinovatech.rd.wcsb.api.dict.service.DictService;
import com.sinovatech.rd.wcsb.api.dict.vo.ErrorVo;
import com.sinovatech.rd.wcsb.api.menu.AppMenuConstants;
import com.sinovatech.rd.wcsb.api.menu.service.AppMenuService;
import com.sinovatech.rd.wcsb.api.menu.vo.AppMenuVo;
import com.gustz.dove.api.service.util.CommConstants;
import com.sinovatech.rd.wcsb.repo.app.AppConstants;
import com.sinovatech.rd.wcsb.repo.dict.DictConstants;
import com.sinovatech.rd.wcsb.repo.menu.dao.AppMenuDao;
import com.sinovatech.rd.wcsb.repo.menu.po.AppMenuPo;
/**
*
* TODO: 应用菜单服务接口的实现
*
* @author ZHENFENG ZHANG
* @since [Jan 19, 2015]
*/
@Service
public class AppMenuServiceImpl extends AbstractDataService<AppMenuVo, AppMenuPo, String> implements AppMenuService {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private SqlDao sqlDao;
private AppMenuDao dao;
private final Lock lock = new ReentrantLock();
@Autowired
private DictService dictService;
@Autowired
public void needDao(AppMenuDao dao) {
super.setDao(dao);
this.dao = dao;
}
@Override
public String getId(AppMenuVo vo) {
return vo.getId();
}
/**
* 保存
*
* @param vo
* @return
*/
@Override
public String save(AppMenuVo vo) {
AppMenuPo _po = this.vo2Po(vo);
_po.setIsDelete(CommConstants.NO);
_po.setCreateTime(new Date());
_po.setStatus(AppMenuConstants.StatusGc.S1.name());
_po.setAppMenuCode(CommConstants.getCommCode());
return this.dao.save(_po);
}
/**
* 更新
*
* @param vo
*/
@Override
public void update(AppMenuVo vo) {
AppMenuPo _newPo = this.vo2Po(vo); // 页面新值
AppMenuPo _oldPo = this.dao.get(vo.getId()); // 数据库旧值
//不能改变的值
_newPo.setCreateTime(_oldPo.getCreateTime());
_newPo.setIsDelete(CommConstants.NO);
_newPo.setAppMenuCode(_oldPo.getAppMenuCode());
_newPo.setStatus(_oldPo.getStatus());
this.dao.update(_newPo);
}
/**
* 批量删除字典组别
*
* @param ids
*/
@Override
public void batchDelete(Iterable<String> ids) {
for (String _id : ids) {
AppMenuPo _po = this.dao.get(_id);
_po.setIsDelete(CommConstants.YES);
this.dao.update(_po);
}
}
/**
* 查询全部
*
* @param search
* @return
*/
@Override
public List<AppMenuVo> listAll(AppMenuVo search) {
return this.ecList(search, 1, CommConstants.LIMIT_MAX, null);
}
/**
* 分页查询
*
* @param search
* @param start
* @param limit
* @param orders
* @return
*/
@Override
public List<AppMenuVo> ecList(AppMenuVo search, int start, int limit, List<Order> orders) {
QueryInfo queryInfo = prepareQuery(search).order(orders).build();
List<AppMenuVo> _list = sqlDao.list(queryInfo.getSql(), start, limit, AppMenuVo.class, queryInfo.getParArr());
if (_list != null && _list.size() > 0) {
for (AppMenuVo vo : _list) {
this.setDict(vo);
}
}
return _list;
}
/**
* 查询总记录数
*
* @param search
* @return
*/
@Override
public int ecCount(AppMenuVo search) {
QueryInfo queryInfo = prepareQuery(search).build();
return sqlDao.count(queryInfo.getCountSql(), queryInfo.getParArr());
}
private QueryInfoBuilder prepareQuery(AppMenuVo search) {
String sql = "select t.*,t1.CLI_APP_NAME,t1.WEBS_CODES,t1.ACCOUNT_CODE,t2.ACCOUNT_TYPE ";
sql += " from WCSB_APP_MENU t,WCSB_CLIENT_APP t1,WCSB_ACCOUNT t2 where 1=1 ";
sql += " and t.CLI_APP_CODE=t1.CLI_APP_CODE and t1.ACCOUNT_CODE=t2.ACCOUNT_CODE ";
QueryInfoBuilder builder = QueryInfoBuilder.ins(sql) //
.andEq("t.IS_DELETE", CommConstants.NO) //
.andEq("t.ID", search.getId()) //
.andEq("t.STATUS", search.getStatus()) // 状态
.andEq("t.CLI_APP_CODE", search.getCliAppCode()) // 客户端应用编码
//
.andEq("t.APP_MENU_CODE", search.getAppMenuCode()) // 菜单编码
.andContains("t.APP_MENU_CODE", search.getAppMenuCodeLk()) //
.andContains("t.APP_MENU_NAME", search.getAppMenuName()) // 菜单名称
// 客户端应用VO
.andEq("t1.IS_DELETE", CommConstants.NO) //
.andEq("t1.STATUS", AppConstants.StatusGc.S0.name()) // 启用状态S0
// 账户VO
.andEq("t2.IS_DELETE", CommConstants.NO) //
.andEq("t2.STATUS", DictConstants.RunStateGc.S0.name()) // 启用状态S0
//
.orderDesc("t.CREATE_TIME");
return builder;
}
private void setDict(AppMenuVo vo) {
// 状态
vo.setStatusText(dictService.text(AppMenuConstants.StatusGc.APP_MENU_STATUS, vo.getStatus()));
}
/**
* 是否存在菜单编码
*
* @param id
* @param menuCode
* @return
*/
@Override
public boolean isExistMenuCode(String id, String menuCode) {
if (StringUtils.isBlank(menuCode)) {
return false;
}
return this.isExistByKw(new AppMenuVo(null, menuCode));
}
/**
* 是否已存在该记录
*
* @param vo
* @return
*/
private boolean isExistByKw(AppMenuVo vo) {
String _id = vo.getId();
if (StringUtils.isNotBlank(_id)) { // update
AppMenuPo _oldPo = this.dao.get(_id);
String _code = vo.getAppMenuCode();
if (StringUtils.isNotBlank(_code) && _code.equals(_oldPo.getAppMenuCode())) {
return false; // 1.没有改变
}
}
// 2. save/update
vo.setId(null);
return (this.ecCount(vo) > 0);
}
@Override
public AppMenuVo get(String id) {
List<AppMenuVo> _list = this.ecList(new AppMenuVo(id), 1, 1, null);
if (_list != null && !_list.isEmpty()) {
return _list.get(0);
}
return null;
}
/**
* 发布应用菜单
*
* @param id
* @param deployMenu
* @throws Exception
*/
@Override
public ErrorVo deployMenu(String id, IDeployMenu deployMenu) throws Exception {
lock.lock();
ErrorVo errorVo = new ErrorVo(-1);
try {
AppMenuVo vo = this.get(id);
// 调用微信服务接口
errorVo = deployMenu.doDeployMenu(vo);
if (errorVo.isSuccess()) {
// 改变状态
AppMenuPo po = this.dao.get(id);
po.setStatus(AppMenuConstants.StatusGc.S0.name());
//
this.dao.update(po);
logger.info("发布菜单成功,菜单[{}] 应用[{}] \n", vo.getAppMenuName(), vo.getCliAppName());
} else {
logger.warn("发布菜单失败,菜单[{}] 应用[{}],返回报文:{} \n", vo.getAppMenuName(), vo.getCliAppName(), errorVo);
}
} finally {
lock.unlock();
}
return errorVo;
}
}