package com.product.admin.service; import com.alibaba.fastjson.JSONObject; import com.product.admin.config.CmnCode; import com.product.admin.config.CmnConst; import com.product.admin.config.SystemCode; import com.product.admin.service.idel.IFunctionService; import com.product.common.lang.StringUtils; import com.product.core.config.CoreConst; import com.product.core.dao.BaseDao; import com.product.core.entity.DataTableEntity; import com.product.core.entity.FieldSetEntity; import com.product.core.exception.BaseException; import com.product.core.service.support.AbstractBaseService; import com.product.core.spring.context.SpringMVCContextHolder; import com.product.core.transfer.Transactional; import com.product.module.sys.entity.SystemUser; import com.product.util.BaseUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; /** * Copyright LX-BASE * * @Title: FunctionsService * @Project: LX-BASE-SERVER * @Date: 2020-06-03 11:48 * @Author: ZhouJie * @Description: 功能管理 */ @Service public class FunctionsService extends AbstractBaseService implements IFunctionService { @Autowired public BaseDao baseDao; @Autowired private CodeService codeService; /** * 产品模块树 * * @return * @auth cheng */ public DataTableEntity getProductModuleTree() { StringBuilder sql = new StringBuilder(); sql.append("\n SELECT "); sql.append("\n uuid,0 type,product_name `name`,null function_description,product_shortcode function_shortcode, "); sql.append("\n tricode,null tricode_parent "); sql.append("\n FROM "); sql.append("\n product_sys_products "); sql.append("\n union all "); sql.append("\n SELECT uuid,data_type type,function_name,function_description,function_shortcode,tricode, "); sql.append("\n tricode_parent "); sql.append("\n FROM "); sql.append("\n product_sys_functions "); sql.append("\n where data_type=2 "); sql.append("\n order by length(tricode),tricode "); DataTableEntity dt = baseDao.listTable(sql.toString(), new Object[]{}); return BaseUtil.dataTableToTreeTable(dt, CmnConst.TRICODE, CmnConst.TRICODE_PARENT, null); } /** * 查询功能根据模块 * * @param fse * @return */ public DataTableEntity getFunctionByModule(FieldSetEntity fse) { if (StringUtils.isEmpty(fse.getString(CmnConst.TRICODE))) { return null; } DataTableEntity dt = baseDao.listTable(CmnConst.PRODUCT_SYS_FUNCTIONS, "data_type=1 and tricode_parent=?", new Object[]{fse.getString(CmnConst.TRICODE)}); baseDao.loadPromptData(dt); return dt; } /** * 功能列表 * * @param fse * @return * @throws BaseException */ public DataTableEntity getFunctionList(FieldSetEntity fse) throws BaseException { DataTableEntity dt = baseDao.listTable(fse.getTableName(), null, null, null, fse.getString("orderby"), fse.getInteger(CmnConst.PAGESIZE), fse.getInteger(CmnConst.CPAGE)); baseDao.loadPromptData(dt); return dt; } /** * @return FieldSetEntity * @Author: cheng * @Description: 查看功能详情 */ public FieldSetEntity findFunction(FieldSetEntity fs) throws BaseException { FieldSetEntity fieldSetEntity; if (!StringUtils.isEmpty(fs.getString(CmnConst.FUNCTION_UUID))) { fieldSetEntity = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_FUNCTIONS, fs.getString(CmnConst.FUNCTION_UUID), true); } else { fieldSetEntity = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_FUNCTIONS, fs.getString(CmnConst.UUID), true); } return fieldSetEntity; } /** * @Date: 2020-06-11 10:09 * @Author: ZhouJie * @Description: 功能版本号 */ public FieldSetEntity findVersion(FieldSetEntity fs) throws BaseException { FieldSetEntity modufs = baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_SYS_FUNCTIONS, CmnConst.TRICODE + " = ? AND data_type = 2 ", new Object[]{fs.getString(CmnConst.TRICODE_PARENT)}, false); if (modufs == null) { throw new BaseException(SystemCode.SYSTEM_ACQUIRE_PARAM_FAIL.getValue(), SystemCode.SYSTEM_ACQUIRE_PARAM_FAIL.getText(), this.getClass(), "findVersion"); } FieldSetEntity profs = baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_SYS_PRODUCTS, CmnConst.UUID + "=?", new Object[]{modufs.getString(CmnConst.PRODUCT_UUID)}, false); if (profs == null) { throw new BaseException(SystemCode.SYSTEM_ACQUIRE_PARAM_FAIL.getValue(), SystemCode.SYSTEM_ACQUIRE_PARAM_FAIL.getText(), this.getClass(), "findVersion"); } FieldSetEntity verfs = baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_SYS_VERSION, CmnConst.UUID + "=?", new Object[]{profs.getString(CmnConst.VERSION_UUID)}, false); modufs.setValue(CmnConst.VERSION_UUID, verfs.getString(CmnConst.VERSION_CODE)); return modufs; } /** * @throws BaseException * @Date: 2020-06-12 11:19 * @Author: ZhouJie * @Description: 新增功能 */ public String addFunction(FieldSetEntity fs) throws BaseException { //判断功能按钮入口唯一 DataTableEntity subDataTable = fs.getSubDataTable(CmnConst.PRODUCT_SYS_FUNCTION_BUTTONS); int sum_main = 0; if (subDataTable != null && subDataTable.getRows() > 0) { for (int i = 0; i < subDataTable.getRows(); i++) { FieldSetEntity button = subDataTable.getFieldSetEntity(i); if ("main".equals(button.getString("type"))) { button.setValue("main", "button_category_uuid"); } if (button.getString("button_category_uuid") != null && "main".equals(button.getString("button_category_uuid"))) { sum_main = sum_main + 1; button.setValue("button_type", 1); button.setValue("is_main", 1); } else { button.setValue("button_type", 2); button.setValue("is_main", 0); } } } if (sum_main != 1) { throw new BaseException(CmnCode.MANY_MAIN.getValue(), CmnCode.MANY_MAIN.getText()); } FieldSetEntity newModule = baseDao.listInternationDataTable(baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_SYS_FUNCTIONS, CmnConst.TRICODE + " = ? AND data_type = 2", new Object[]{fs.getString(CmnConst.TRICODE_PARENT)}, true), null); if (newModule == null) { throw new BaseException(SystemCode.SYSTEM_ACQUIRE_PARAM_FAIL.getValue(), SystemCode.SYSTEM_ACQUIRE_PARAM_FAIL.getText(), this.getClass(), "addFunction"); } fs.setValue("data_type", 1); return baseDao.add(fs); } /** * 删除功能、按钮 * * @param fs * @return * @throws BaseException */ public boolean deletefunction(FieldSetEntity fs) throws BaseException { String uuid = fs.getString(CmnConst.UUID); FieldSetEntity ffs = baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_SYS_FUNCTIONS, CmnConst.UUID + "=?", new Object[]{uuid}, false); FieldSetEntity ffbs = baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_SYS_FUNCTION_BUTTONS, CmnConst.UUID + "=?", new Object[]{uuid}, false); FieldSetEntity fbs = null; DataTableEntity dt = baseDao.listTable(CmnConst.PRODUCT_SYS_FUNCTION_BUTTONS, CmnConst.FUNCTION_UUID + "=?", new Object[]{uuid}); if (ffs != null) {//删除功能 baseDao.delete(CmnConst.PRODUCT_SYS_FUNCTIONS, new String[]{uuid}); } if (ffbs != null) {//单独删除按钮 baseDao.delete(CmnConst.PRODUCT_SYS_FUNCTION_BUTTONS, new String[]{uuid}); } if (dt != null && dt.getRows() > 0) {//删除功能下的按钮 for (int i = 0; i < dt.getRows(); i++) { fbs = dt.getFieldSetEntity(i); String buuid = fbs.getString(CmnConst.UUID); baseDao.delete(CmnConst.PRODUCT_SYS_FUNCTION_BUTTONS, new String[]{buuid}); } } DataTableEntity menus = baseDao.listTable("product_sys_menus", CmnConst.FUNCTION_UUID + "=?", new String[]{uuid}); if (menus != null && menus.getRows() > 0) { for (int i = 0; i < menus.getRows(); i++) { FieldSetEntity fss = menus.getFieldSetEntity(i); String sql = "update product_sys_menus set is_show=0 where uuid=?"; baseDao.executeUpdate(sql, new String[]{fss.getUUID()}); } } return true; } /** * 修改功能按钮 * * @param fs * @return * @throws BaseException */ public boolean updateButton(FieldSetEntity fs) throws BaseException { //判断功能按钮入口唯一 DataTableEntity subDataTable = baseDao.listInternationDataTable(fs.getSubDataTable(CmnConst.PRODUCT_SYS_FUNCTION_BUTTONS), null); int sum_main = 0; if (subDataTable != null && subDataTable.getRows() > 0) { for (int i = 0; i < subDataTable.getRows(); i++) { FieldSetEntity button = subDataTable.getFieldSetEntity(i); if (button.getInteger("is_main") == 1 && StringUtils.isEmpty(button.getString("~type~"))) { sum_main = sum_main + 1; } } } if (sum_main != 1) { throw new BaseException(CmnCode.MANY_MAIN.getValue(), CmnCode.MANY_MAIN.getText()); } // 删除多余的逻辑 2021年1月15日17:16:08 重设主表表名 function 表 ,删除国际化字段 fs.remove("function_name"); fs.getMeta().setTableName(new Object[]{CmnConst.PRODUCT_SYS_FUNCTIONS}); BaseUtil.updatedRegeneratorAndUpdateTime(SpringMVCContextHolder.getCurrentUser(), fs); return update(fs); } /** * 修改功能 * * @param fs * @return * @throws BaseException */ @Transactional public boolean updatefunction(FieldSetEntity fs) throws BaseException { String tricode_parent = fs.getString(CmnConst.TRICODE_PARENT); String uuid = fs.getString(CmnConst.UUID); FieldSetEntity fse = baseDao.getFieldSetEntity(fs.getTableName(), uuid, false); // updateTime 2021年10月25日10:03:32 cheng if (fse != null && !tricode_parent.equals(fse.getString(CmnConst.TRICODE_PARENT))) { // 上级模块改变 codeService.createCode(fs, fs.getTableName(), CmnConst.TRICODE, tricode_parent); } fs.setValue("updated_by", SpringMVCContextHolder.getCurrentUser().getUser_id());// 获取登录帐号 fs.setValue("updated_utc_datetime", new Date());// 创建时间 return baseDao.update(fs); } @Override @Transactional public FieldSetEntity saveModule(FieldSetEntity fse) throws BaseException { String uuid = fse.getUUID(); if (StringUtils.isEmpty(fse.getString(CmnConst.TRICODE_PARENT))) { //默认为顶级设置产品的code给模块 fse.setValue(CmnConst.TRICODE_PARENT, "001"); } DataTableEntity subDt = null; if (StringUtils.isEmpty(uuid)) { //创建编码 codeService.createCode(fse, fse.getTableName(), CmnConst.TRICODE, fse.getString(CmnConst.TRICODE_PARENT)); } else { FieldSetEntity fs = baseDao.getFieldSetEntity(fse.getTableName(), uuid, false); if (FieldSetEntity.isEmpty(fs)) { throw new BaseException(SystemCode.SYSTEM_MODULE_GET_FAIL); } String oldParentCode = fs.getString(CmnConst.TRICODE_PARENT); if (!StringUtils.equals(oldParentCode, fse.getString(CmnConst.TRICODE_PARENT))) { codeService.createCode(fse, fse.getTableName(), CmnConst.TRICODE, fse.getString(CmnConst.TRICODE_PARENT)); //上级编码被修改更改下级编码 DataTableEntity dt = baseDao.listTable(fse.getTableName(), "tricode like concat(?,'-%')", new Object[]{fs.getString(CmnConst.TRICODE)}, new Object[]{CmnConst.UUID, CmnConst.TRICODE, CmnConst.TRICODE_PARENT, "data_type", CmnConst.FUNCTION_NAME, CmnConst.FUNCTION_DESCRIPTION, "function_shortcode"}); for (int i = 0; i < dt.getRows(); i++) { dt.setFieldValue(i, CmnConst.TRICODE, codeService.createCode(fse.getTableName(), CmnConst.TRICODE, fse.getString(CmnConst.TRICODE))); dt.setFieldValue(i, CmnConst.TRICODE_PARENT, fse.getString(CmnConst.TRICODE)); dt.getFieldSetEntity(i).setCodeFieldUpdateFlat(CmnConst.TRICODE, true); dt.setFieldValue(i, CmnConst.UPDATED_UTC_DATETIME, new Date()); } baseDao.update(dt); subDt = dt; } } BaseUtil.createCreatorAndCreationTime(fse); baseDao.saveFieldSetEntity(fse); FieldSetEntity fs = baseDao.getFieldSetByFilter(fse.getTableName() + " a ", new String[]{"ifnull((select uuid from product_sys_functions b WHERE b.tricode=a.tricode_parent),(select uuid from product_sys_products b WHERE b.tricode=a.tricode_parent)) parent_uuid ,a.*"}, "a.uuid=?", new Object[]{fse.getUUID()}, false, null); if (!DataTableEntity.isEmpty(subDt)) { fs.setValue(CmnConst.CHILDREN, BaseUtil.dataTableToTreeData(subDt, CmnConst.TRICODE, CmnConst.TRICODE_PARENT, (f) -> { JSONObject ff = f[0]; ff.put(CmnConst.NAME, ff.getString(CmnConst.FUNCTION_NAME)); ff.put("type", ff.getString("data_type")); ff.remove(CmnConst.FUNCTION_NAME); ff.remove(CmnConst.UPDATED_BY); ff.remove(CmnConst.UPDATED_UTC_DATETIME); ff.remove("data_type"); }, false)); } return fs; } @Override @Transactional public boolean deleteModule(FieldSetEntity fse) throws BaseException { String uuid = fse.getUUID(); if (!StringUtils.isEmpty(uuid)) { String sql = "SELECT uuid,(select 1 from product_sys_functions b where b.tricode_parent=a.tricode limit 1) is_children from product_sys_functions a where uuid=?"; FieldSetEntity fs = baseDao.getFieldSetBySQL(sql, new Object[]{uuid}, false); if (FieldSetEntity.isEmpty(fs)) { return false; } if ("1".equals(fs.getString("is_children"))) { //存在下级模块或功能 throw new BaseException(SystemCode.DELETE_MODULE_FAIL_CHILDREN_EXEIST); } return baseDao.delete(CmnConst.PRODUCT_SYS_FUNCTIONS, new Object[]{uuid}); } return false; } /** * @Date: 2020-08-24 18:08 * @Author: ZhouJie * @Description: 加载功能的所有按钮 */ public Object[] onloadButton(FieldSetEntity fs) throws BaseException { String fuuid = fs.getString(CmnConst.FUNCTION_UUID); //周杰 2020年12月17日 上午11:16 if (StringUtils.isEmpty(fuuid)) { throw new BaseException(SystemCode.SYSTEM_ACQUIRE_PARAM_FAIL.getValue(), SystemCode.SYSTEM_ACQUIRE_PARAM_FAIL.getText(), this.getClass(), "returnPwdSecurity"); } SystemUser user = SpringMVCContextHolder.getCurrentUser(); String role_uuids; if (user.getUserType() == 0) { role_uuids = user.getCurrentCustomer().getString("role_uuid"); } else { role_uuids = user.getCurrentManager().getString("role_uuids"); } //updatetiem 2021年1月14日19:53:48 增加按钮客户端类型过滤 优化查询方式 已测试暂无问题 //修改代码前 运行时间组 start:1610625440822 end:1610625440902 修改代码后 运行时间组 start:1610625657648 end:1610625657660 String[] role_uuid = role_uuids.split(","); StringBuilder sb = new StringBuilder(); sb.append(" SELECT "); sb.append(" * "); sb.append(" FROM "); sb.append(" ( "); sb.append(" SELECT "); sb.append(" c.button_name as uuid, "); sb.append(" button_uuid, "); sb.append(" a.uuid function_permission_uuid "); sb.append(" FROM "); sb.append(" product_sys_function_permission a "); sb.append(" JOIN product_sys_datamodel_field b ON b.field_id <= ( length( a.button_uuid ) - length( REPLACE ( a.button_uuid, ',', '' ) ) + 2 ) "); sb.append(" JOIN product_sys_function_buttons c ON substring_index( substring_index( a.button_uuid, ',', b.field_id ), ',',- 1 ) = c.uuid "); sb.append(" where "); sb.append(" " + BaseUtil.buildQuestionMarkFilter("a.role_uuid", role_uuid.length, true) + " "); sb.append(" and a.function_uuid=? and concat(',',client_type_uuid,',') like concat('%,',?,',%') "); sb.append(" ) a "); sb.append(" GROUP BY "); sb.append(" function_permission_uuid, "); sb.append(" button_uuid, "); sb.append(" uuid "); List params = new ArrayList<>(); params.addAll(Arrays.asList(role_uuid)); params.add(fuuid); params.add(fs.getString(CoreConst.SYSTEM_CLIENT_TYPE_)); DataTableEntity dataTableEntity = baseDao.listTable(sb.toString(), params.toArray()); return dataTableEntity.getUuids(); } }