package org.fireflow.demo;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.fireflow.demo.security.bean.Group;
import org.fireflow.demo.security.bean.OkErpPermission;
import org.fireflow.demo.security.bean.User;
import org.fireflow.demo.security.bean.UserRole;
import org.fireflow.engine.modules.persistence.nutz.support.ExAnnotationEntityMaker;
import org.nutz.dao.Cnd;
import org.nutz.dao.SqlManager;
import org.nutz.dao.Sqls;
import org.nutz.dao.entity.EntityMaker;
import org.nutz.dao.impl.NutDao;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.sql.SqlCallback;
public class FireflowDemoDao extends NutDao {
public static final String GROUP_CODE_KEY = "T_security_group";
public static final String ORGANIZATION_CODE_KEY = "T_security_organization";
public static final String COMPANY_CODE_KEY = "T_cmn_company";
public static final String CONTRACT_CODE_KEY = "t_crm_contract";
public static final String FINANCIAL_INVOICE_CODE_KEY = "t_financial_invoice_table";
public static final String CRM_CONTRACT_SPLIT = "t_crm_contract_split";
public static final String CRM_ORDER = "t_crm_order";
public static final String CRM_INVOICE_REQUEST_DETAIL_KEY = "t_crm_invoice_request_detail";
public static final String ROLE_CODE_KEY = "T_security_role";
public static final String CRM_CONTRACT_FILE = "T_crm_contract_file";
public static final String COMPANY_CONTACTS_CODE = "T_cmn_company_contacts";
public static final String ORDER_CANCEL_APPLY_CODE = "T_crm_order_cancel_apply";
public static final String ORDER_File_CODE = "T_crm_order_file";
public static final String PROJECT_CODE = "T_crm_project";
public static final String DEPARTMENT_CODE = "T_hr_departments";
public static final String EMPLOYEE_BANK_ACCOUNT_CODE = "T_fnc_employee_bank_account";
public static final String POSITION_CODE = "T_hr_position_expense";
public FireflowDemoDao() {
super();
// TODO Auto-generated constructor stub
}
public FireflowDemoDao(DataSource dataSource, SqlManager sqlManager) {
super(dataSource, sqlManager);
// TODO Auto-generated constructor stub
}
public FireflowDemoDao(DataSource dataSource) {
super(dataSource);
// TODO Auto-generated constructor stub
}
protected EntityMaker createEntityMaker() {
return new ExAnnotationEntityMaker(dataSource, expert, holder);
}
/**
* 获得数据库系统时间
* @return
*/
public Date getSysDate(){
Sql sql = Sqls.create("select now()");
sql.setCallback(new SqlCallback() {
public Object invoke(Connection conn, ResultSet rs, Sql sql) throws SQLException {
Date d = null;
if (rs.next()){
d = rs.getDate(1);
}
return d;
}
});
this.execute(sql);
Date d = (Date)sql.getResult();
return d;
}
public String generateBillCode(){
Date now = this.getSysDate();
Sql sql = Sqls.create("select get_next_value('"+MainModule.BILL_CODE_KEY+"','D')");
sql.setCallback(new SqlCallback() {
public Object invoke(Connection conn, ResultSet rs, Sql sql) throws SQLException {
Long l = null;
if (rs.next()){
l = rs.getLong(1);
}
return l;
}
});
this.execute(sql);
Long bill_code = (Long)sql.getResult();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
String dateStr = format.format(now);
String theBillCode = dateStr+codeToFixLenthStr(bill_code,4);
return theBillCode;
}
/**
* 产生群组编号,群组编号用"GROUP"作为前缀
* @return
*/
public String generateGroupCode(){
return "GROUP_"+commonGenerateCode(GROUP_CODE_KEY);//用群组表的表名为key
}
/**
* 产生部门编号,部门编号用"DEP"作为前缀
* @return
*/
public String generateDepartmentCode(){
return "DEP_"+commonGenerateCode(DEPARTMENT_CODE);//用部门表的表名为key
}
public String generateEmployeeBankAccount(){
return commonGenerateCode(EMPLOYEE_BANK_ACCOUNT_CODE);
}
public String generatePosition(){
return "POSITION_"+commonGenerateCode(POSITION_CODE);//岗位code
}
public String generateRoleCode(){
return "ROLE_"+commonGenerateCode(ROLE_CODE_KEY);//用角色表的表名为key
}
public String generateOrganizationCode(){
return commonGenerateCode(ORGANIZATION_CODE_KEY);//用群组表的表名为key
}
/**
* company是一个6位数字,不足补零
* @return
*/
public String generateCompanyCode(){
Long theCode = generateCodeAsLong(COMPANY_CODE_KEY);
return codeToFixLenthStr(theCode,6);
}
public String generateInvoiceTableCode(){
return commonGenerateCode(FINANCIAL_INVOICE_CODE_KEY);//用公司表的表名为key
}
/**
* 产生合同编号
* 每年滚动从1开始
* roll_flag=Y,序列发生器每年滚动
* @return
*/
public String generateContractCode(){
Sql sql = Sqls.create("select get_next_value('"+CONTRACT_CODE_KEY+"','Y')");
sql.setCallback(new SqlCallback() {
public Object invoke(Connection conn, ResultSet rs, Sql sql) throws SQLException {
Long l = null;
if (rs.next()){
l = rs.getLong(1);
}
return l;
}
});
this.execute(sql);
Long code = (Long)sql.getResult();
return Long.toString(code);
}
/**
* 产生执行单分解编号
* @return
*/
public String generateContractsplitCode(){
return commonGenerateCode(CRM_CONTRACT_SPLIT);//
}
/**
* 产生执行单编号
* @return
*/
public String generateOrderCode(){
return commonGenerateCode(CRM_ORDER);//
}
public String generateInvoiceRequestDetailSn(){
return commonGenerateCode(CRM_INVOICE_REQUEST_DETAIL_KEY);
}
/**
* 产生非标合同文件表编号
* @return
*/
public String generateContractFileCode(){
return commonGenerateCode(CRM_CONTRACT_FILE);//
}
/**
* 产生客户联系方式编号
* @return
*/
public String generateCompanyContactsCode(){
return commonGenerateCode(COMPANY_CONTACTS_CODE);//
}
/**
* 产生执行单撤销申请编号
* @return
*/
public String generateOrderCancelApplyCode(){
//return commonGenerateCode(ORDER_CANCEL_APPLY_CODE);//
return commonGenerateCode(FINANCIAL_INVOICE_CODE_KEY);//注:12、撤销申请的业务单据号和发票申请采用同一个生成函数
}
/**
* 产生执行单原件编号
* @return
*/
public String generateOrderFileCode(){
return commonGenerateCode(ORDER_File_CODE);//
}
/**
* 产生执行单原件编号
* @return
*/
public String generateProjectCode(){
return commonGenerateCode(PROJECT_CODE);//
}
/**
* 通用的产生序列号的函数,
* @param keyName
* @return
*/
private Long generateCodeAsLong(String keyName){
Sql sql = Sqls.create("select get_next_value('"+keyName+"','X')");
sql.setCallback(new SqlCallback() {
public Object invoke(Connection conn, ResultSet rs, Sql sql) throws SQLException {
Long l = null;
if (rs.next()){
l = rs.getLong(1);
}
return l;
}
});
this.execute(sql);
Long code = (Long)sql.getResult();
return code;
}
private String commonGenerateCode(String keyName){
Long theCode = generateCodeAsLong(keyName);
return Long.toString(theCode);
}
private String codeToFixLenthStr(long bill_code,int theLength){
String s = Long.toString(bill_code);
if (s.length()>theLength){
return s;
}else{
int numOfZero = theLength-s.length();
StringBuffer prefix = new StringBuffer("");
for (int i=0;i<numOfZero;i++){
prefix.append("0");
}
return prefix.append(s).toString();
}
}
/**
* 根据用户登录名,查询用户的所有权限,
* @param loginName
* @return
*/
public Map<String,List<OkErpPermission>> findUserPermissions(User user){
Map<String,List<OkErpPermission>> permissions = new HashMap<String,List<OkErpPermission>>();
//1、首先到T_security_permissions表查用户自身的OkErpPermission,将查到的OkErpPermission转换为FunctionCodePermission
/*List<OkErpPermission> userPermissionList = dao().query(OkErpPermission.class, Cnd.where("granteeCode", "=", user.getLoginName())
.and("granteeType", "=", OkErpPermission.GRANTEE_TYPE_USER));*/
List<OkErpPermission> userPermissionList = this.query(OkErpPermission.class,Cnd.where("granteeCode", "=", user.getLoginName()).and("granteeType", "=", OkErpPermission.GRANTEE_TYPE_USER));
permissions.put("用户自身", userPermissionList);
//2、将用户所属的组的OkErpPermission也查询出来,转换成OkErpPermission
Map<String,List<OkErpPermission>> tmp = findGroupPermissions(user.getGroupCode());
if (tmp!=null){
permissions.putAll(tmp);
}
//3、将用户所属的角色的OkErpPermission也查询出来,转换成OkErpPermission
List<UserRole> userRoleList = this.query(UserRole.class, Cnd.where("userCode", "=", user.getLoginName()));
if (userRoleList!=null && userRoleList.size()>0){
for (UserRole ur : userRoleList){
List<OkErpPermission> tmpList = this.query(OkErpPermission.class,Cnd.where("granteeCode", "=", ur.getRoleCode()).and("granteeType", "=", OkErpPermission.GRANTEE_TYPE_ROLE));
if (tmpList!=null){
permissions.put("角色["+ur.getRoleName()+"]", tmpList);
}
}
}
return permissions;
}
private Map<String,List<OkErpPermission>> findGroupPermissions(String groupCode){
Group group = this.fetch(Group.class, groupCode);
if (group==null)return null;
List<OkErpPermission> groupPermissionList = this.query(OkErpPermission.class, Cnd.where("granteeCode", "=", group.getCode())
.and("granteeType", "=", OkErpPermission.GRANTEE_TYPE_GROUP));
Map<String,List<OkErpPermission>> permissions = new HashMap<String,List<OkErpPermission>>();
permissions.put("群组["+group.getName()+"]", groupPermissionList);
Map<String,List<OkErpPermission>> tmp = findGroupPermissions(group.getParentCode());
if (tmp!=null){
permissions.putAll(tmp);
}
return permissions;
}
}