package com.product.org.admin.service; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.product.common.lang.StringUtils; import com.product.core.dao.BaseDao; import com.product.core.entity.DataTableEntity; import com.product.core.entity.FieldMetaEntity; import com.product.core.entity.FieldSetEntity; import com.product.core.exception.BaseException; import com.product.core.permission.PermissionService; import com.product.core.service.support.AbstractBaseService; import com.product.core.service.support.QueryFilterService; import com.product.core.transfer.Transactional; import com.product.org.admin.config.CmnConst; import com.product.org.admin.config.SystemCode; import com.product.org.admin.service.idel.IStaffSysPropertyService; import com.product.util.BaseUtil; /** * * Copyright LX-BASE * @Title: LX-BASE- * @Project: StaffSysPropertyService * @Date: 2020-06-20 14:20 * @Author: 杜洪波 * @Description:员工系统属性 */ @Component public class StaffSysPropertyService extends AbstractBaseService implements IStaffSysPropertyService{ @Autowired private BaseDao baseDao; @Autowired PermissionService permissionService; @Autowired QueryFilterService queryFilterService; /** * 员工属性分组列表 * @param cpage * @param pageSize * @return * @throws BaseException */ public DataTableEntity listPropertyGroup(Integer cpage,Integer pageSize, FieldSetEntity fse) throws BaseException { //数据策略 String dataFilter=permissionService.getDataFilter(CmnConst.ORG_LEVEL_UUID) ; //高级搜索 String searchFilter=queryFilterService.getQueryFilter(fse); if (!StringUtils.isEmpty(dataFilter)) { if (!StringUtils.isEmpty(searchFilter)) { dataFilter+=" AND "+ searchFilter; } }else { if (!StringUtils.isEmpty(searchFilter)) { dataFilter=searchFilter; } } return baseDao.listInternationDataTable(baseDao.listTable(CmnConst.PRODUCT_SYS_STAFF_PROPERTY_GROUP, dataFilter, null, null, null, pageSize, cpage),null); } /** * 属性分组详情与属性列表 * @param uuid * @return * @throws BaseException */ public JSONObject findPropertyGroup(String uuid)throws BaseException{ FieldSetEntity fsePropertyGroup=baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_STAFF_PROPERTY_GROUP, uuid, false); if (fsePropertyGroup==null) { throw new BaseException(SystemCode.STSTEM_STAFFS_PROPERTY_GROUP_NO_EXIST.getValue(), SystemCode.STSTEM_STAFFS_PROPERTY_GROUP_NO_EXIST.getText(), this.getClass(), "findPropertyGroup"); } FieldSetEntity fsePropertyGroupLanguage=baseDao.listInternationDataTable(fsePropertyGroup, null); JSONObject as= BaseUtil.fieldSetEntityToJson(fsePropertyGroupLanguage); StringBuilder sqlCommon=new StringBuilder(); sqlCommon.append(" SELECT "); sqlCommon.append(" d.staff_property_group_value_id,d.uuid,d.staff_property_group_uuid,e.uuid staff_property_master_uuid,e.staff_property_master_code,d.value,d.effective_utc_datetime,d.org_level_uuid,d.remarks,e.uuid,e.staff_property_master_name,e.prompt_name,e.data_type "); sqlCommon.append(" FROM ( "); sqlCommon.append(" SELECT "); sqlCommon.append(" a.staff_property_group_value_id,a.uuid,a.staff_property_group_uuid,a.staff_property_master_uuid,a.staff_property_master_code,a.value,a.effective_utc_datetime,a.org_level_uuid,a.remarks, "); sqlCommon.append(" CASE WHEN LOCATE( '|', a.staff_property_master_code) THEN REVERSE(SUBSTR(REVERSE(a.staff_property_master_code) FROM INSTR(REVERSE( a.staff_property_master_code ), '|' ) + 1 )) END AS parent_code "); sqlCommon.append(" FROM product_sys_staff_property_group_default_value AS a, "); sqlCommon.append(" ( "); sqlCommon.append(" SELECT "); sqlCommon.append(" staff_property_master_uuid, "); sqlCommon.append(" MAX(effective_utc_datetime) AS effective_utc_datetime "); sqlCommon.append(" FROM product_sys_staff_property_group_default_value "); sqlCommon.append(" WHERE effective_utc_datetime <= NOW() AND staff_property_group_uuid = ? "); sqlCommon.append(" GROUP BY staff_property_master_uuid "); sqlCommon.append(" ) AS c "); sqlCommon.append(" WHERE a.staff_property_master_uuid = c.staff_property_master_uuid AND a.effective_utc_datetime = c.effective_utc_datetime AND a.staff_property_group_uuid = ? "); sqlCommon.append(" UNION ALL "); sqlCommon.append(" SELECT "); sqlCommon.append(" a.staff_property_group_value_id,a.uuid,a.staff_property_group_uuid,a.staff_property_master_uuid,a.staff_property_master_code,'',a.effective_utc_datetime,a.org_level_uuid,a.remarks, "); sqlCommon.append(" CASE WHEN LOCATE( '|', a.staff_property_master_code) THEN REVERSE(SUBSTR(REVERSE(a.staff_property_master_code) FROM INSTR(REVERSE( a.staff_property_master_code ), '|' ) + 1 )) END AS parent_code"); sqlCommon.append(" FROM product_sys_staff_property_group_default_value AS a, "); sqlCommon.append(" ( "); sqlCommon.append(" SELECT "); sqlCommon.append(" staff_property_master_uuid, "); sqlCommon.append(" MIN(effective_utc_datetime) AS effective_utc_datetime "); sqlCommon.append(" FROM product_sys_staff_property_group_default_value "); sqlCommon.append(" WHERE staff_property_group_uuid= ? "); sqlCommon.append(" GROUP BY staff_property_master_uuid "); sqlCommon.append(" HAVING MIN(effective_utc_datetime) > NOW() "); sqlCommon.append(" ) AS c "); sqlCommon.append(" WHERE a.staff_property_master_uuid = c.staff_property_master_uuid AND a.effective_utc_datetime = c.effective_utc_datetime AND a.staff_property_group_uuid = ? "); sqlCommon.append(" UNION ALL "); sqlCommon.append(" SELECT "); sqlCommon.append(" a.staff_property_group_value_id,a.uuid,a.staff_property_group_uuid,a.staff_property_master_uuid,a.staff_property_master_code,'',a.effective_utc_datetime,a.org_level_uuid,a.remarks, "); sqlCommon.append(" CASE WHEN LOCATE( '|', a.staff_property_master_code) THEN REVERSE(SUBSTR(REVERSE(a.staff_property_master_code) FROM INSTR(REVERSE( a.staff_property_master_code ), '|' ) + 1 )) END AS parent_code"); sqlCommon.append(" FROM product_sys_staff_property_group_default_value AS a, "); sqlCommon.append(" ( "); sqlCommon.append(" SELECT "); sqlCommon.append(" staff_property_master_uuid, "); sqlCommon.append(" staff_property_master_code "); sqlCommon.append(" FROM product_sys_staff_property_group_default_value "); sqlCommon.append(" WHERE staff_property_group_uuid= ? AND effective_utc_datetime IS NULL AND value IS NULL "); sqlCommon.append(" ) AS c "); sqlCommon.append(" WHERE a.staff_property_master_uuid = c.staff_property_master_uuid AND a.staff_property_group_uuid = ? "); sqlCommon.append(" ) AS d "); sqlCommon.append(" RIGHT JOIN product_sys_staff_property_master AS e ON d.staff_property_master_uuid = e.uuid AND d.staff_property_master_code=e.staff_property_master_code"); //杜洪波 updateTime 2020-01-06 11:40:00 属性显示异常 String sqlParent=sqlCommon+" WHERE d.parent_code IS NULL ORDER BY e.sequence"; String sqlSub=sqlCommon+" WHERE d.parent_code IS NOT NULL ORDER BY e.sequence"; //根属性 DataTableEntity dtParent=baseDao.listTable(sqlParent.toString(), new Object[] {uuid,uuid,uuid,uuid,uuid,uuid}); //子属性 DataTableEntity dtSub=baseDao.listTable(sqlSub.toString(), new Object[] {uuid,uuid,uuid,uuid,uuid,uuid}); baseDao.listInternationDataTable(dtParent, null); baseDao.listInternationDataTable(dtSub, null); if (dtParent.getRows()>0) { //装载属性 JSONArray json=sysPropertyGroup(dtParent,dtSub,2); as.put(CmnConst.PRODUCT_SYS_STAFF_PROPERTY_GROUP_DEFALUT_VALUE, json); } return as; } /** * 属性详情 * @param group_uuid 分组uuid * @param master_uuid 属性uuid * @return * @throws BaseException */ public DataTableEntity findProperty(String group_uuid,String master_uuid) throws BaseException { StringBuilder sql=new StringBuilder(); sql.append(" SELECT "); sql.append(" a.uuid, "); sql.append(" a.staff_property_group_value_id,a.staff_property_group_uuid,a.staff_property_master_uuid,a.staff_property_master_code,a.value, "); sql.append(" a.effective_utc_datetime,a.org_level_uuid,b.prompt_name,b.data_type "); sql.append(" FROM product_sys_staff_property_group_default_value a "); sql.append(" LEFT JOIN product_sys_staff_property_master b "); sql.append(" ON a.staff_property_master_uuid=b.uuid AND a.staff_property_master_code=b.staff_property_master_code "); sql.append(" WHERE a.staff_property_group_uuid=? and a.staff_property_master_uuid=? "); return baseDao.listInternationDataTable(baseDao.listTable(sql.toString(), new Object[] {group_uuid,master_uuid}),null); } /** * 新增属性分组 * @param fse 业务数据 * @return * @throws BaseException */ @Transactional public String addPropertyGroup(FieldSetEntity fse)throws BaseException{ return baseDao.add(fse); } /** * 修改属性分组 * @param fse * @return * @throws BaseException */ @Transactional public boolean updatePropertyGroup(FieldSetEntity fse)throws BaseException{ DataTableEntity dtDefaultProperty=fse.getSubDataTable(CmnConst.PRODUCT_SYS_STAFF_PROPERTY_GROUP_DEFALUT_VALUE); if (dtDefaultProperty!=null && dtDefaultProperty.getRows()>0) { int delCount=0; int rowCount=dtDefaultProperty.getRows(); for (int i = 0; i < rowCount; i++) { FieldSetEntity fseDefaultProperty=dtDefaultProperty.getFieldSetEntity(i); String doMethod=fseDefaultProperty.getString("~type~"); if (doMethod!=null && "del".equals(doMethod)) { delCount++; } } if (delCount==rowCount) { FieldSetEntity fseSaveDefaultProperty=dtDefaultProperty.getFieldSetEntity(0); baseDao.executeUpdate("update product_sys_staff_property_group_default_value set effective_utc_datetime = NULL,value=NULL where uuid=?", new Object[] {fseSaveDefaultProperty.getUUID()}); dtDefaultProperty.removeFieldSetEntity(0); } if (dtDefaultProperty.getRows()==0) { return true; }else { return baseDao.update(fse, true); } }else { return baseDao.update(fse,true); } } /** * 删除属性分组 * @param uuid * @return * @throws BaseException */ @Transactional public boolean deletePropertyGroup(String uuid)throws BaseException{ return baseDao.delete(CmnConst.PRODUCT_SYS_STAFF_PROPERTY_GROUP, "uuid=?", new String[] {uuid}); } /** * 系统分组属性封装 * @param dataParent 根属性 * @param dataSub 子属性 * @param type 封装类型 1.从master表获取 2.从业务表获取 * @return * @throws BaseException */ public JSONArray sysPropertyGroup(DataTableEntity dataParent,DataTableEntity dataSub,int type) throws BaseException { JSONArray propertyArray=new JSONArray(); //遍历根属性 for (int i = 0; i < dataParent.getRows(); i++) { JSONObject sysProperty=new JSONObject(); FieldSetEntity fs=dataParent.getFieldSetEntity(i); if (!StringUtils.isEmpty(fs.getString(CmnConst.STAFF_PROPERTY_MASTER_CODE))) { //杜洪波 updateTime 2020-12-17 15:16:00 if (type==1) { sysProperty.put(CmnConst.STAFF_PROPERTY_MASTER_UUID, dataParent.getString(i, "uuid")); //uuid }else { sysProperty.put(CmnConst.VALUE, dataParent.getString(i, CmnConst.VALUE)); //默认值 sysProperty.put(CmnConst.STAFF_PROPERTY_MASTER_UUID, dataParent.getString(i, CmnConst.STAFF_PROPERTY_MASTER_UUID)); //uuid } sysProperty.put(CmnConst.DATA_TYPE, dataParent.getString(i, CmnConst.DATA_TYPE)); //数据类型 sysProperty.put(CmnConst.STAFF_PROPERTY_MASTER_CODE, dataParent.getString(i, CmnConst.STAFF_PROPERTY_MASTER_CODE)); //编码code sysProperty.put(CmnConst.PARENT_CODE, dataParent.getString(i, CmnConst.PARENT_CODE)); //父级编码code sysProperty.put(CmnConst.PROMPT_NAME, dataParent.getString(i, CmnConst.PROMPT_NAME)); //参照名 sysProperty.put(CmnConst.STAFF_PROPERTY_MASTER_NAME, getPropertyNameLanguage(fs.getSubDataTable(CmnConst.STAFF_PROPERTY_MASTER_NAME))); //属性名称 //获取当前根属性的子属性 if (dataSub!=null && dataSub.getRows()>0) { JSONArray moduleChild = sysPropertyGroupSub(dataSub,fs.getString(CmnConst.STAFF_PROPERTY_MASTER_CODE),type); sysProperty.put("children", moduleChild); } propertyArray.add(sysProperty); } } return propertyArray; } /** * 系统属性分组子属性封装 * @param data * @param tricode_parent 父级属性节点编码 * @param type 封装类型 * @return * @throws BaseException */ public JSONArray sysPropertyGroupSub(DataTableEntity dataSub,String tricode_parent,int type) throws BaseException { JSONArray propertyArray=new JSONArray(); //遍历子属性 for (int i = 0; i < dataSub.getRows(); i++) { JSONObject sysProperty=new JSONObject(); FieldSetEntity fs=dataSub.getFieldSetEntity(i); //匹配子属性 if(tricode_parent.equals(dataSub.getString(i, CmnConst.PARENT_CODE))) { //装载属性 if (type==1) { sysProperty.put(CmnConst.STAFF_PROPERTY_MASTER_UUID, dataSub.getString(i, "uuid")); //uuid }else { sysProperty.put(CmnConst.VALUE, dataSub.getString(i, CmnConst.VALUE)); sysProperty.put(CmnConst.STAFF_PROPERTY_MASTER_UUID, dataSub.getString(i, CmnConst.STAFF_PROPERTY_MASTER_UUID)); //uuid } sysProperty.put(CmnConst.DATA_TYPE, dataSub.getString(i, CmnConst.DATA_TYPE)); //数据类型 sysProperty.put(CmnConst.STAFF_PROPERTY_MASTER_CODE, dataSub.getString(i, CmnConst.STAFF_PROPERTY_MASTER_CODE)); //属性编码 sysProperty.put(CmnConst.PARENT_CODE, dataSub.getString(i, CmnConst.PARENT_CODE)); //父级属性编码 sysProperty.put(CmnConst.PROMPT_NAME, dataSub.getString(i, CmnConst.PROMPT_NAME)); //参照名 sysProperty.put(CmnConst.STAFF_PROPERTY_MASTER_NAME, getPropertyNameLanguage(fs.getSubDataTable(CmnConst.STAFF_PROPERTY_MASTER_NAME))); //属性名称 //封装后代属性 JSONArray jsonSub=sysPropertyGroupSub(dataSub, dataSub.getString(i, CmnConst.STAFF_PROPERTY_MASTER_CODE),type); if (!jsonSub.isEmpty()) { sysProperty.put("children", jsonSub); } propertyArray.add(sysProperty); } } return propertyArray; } /** * 新增属性组,获取所有系统属性 * @return * @throws BaseException */ public JSONArray getAllSysProperty() throws BaseException { StringBuilder sqlCommon=new StringBuilder(); sqlCommon.append(" SELECT uuid,staff_property_master_code,staff_property_master_name,prompt_name,data_type,parent_code FROM ( "); sqlCommon.append(" SELECT "); sqlCommon.append(" a.*, "); sqlCommon.append(" CASE WHEN LOCATE( '|', a.staff_property_master_code ) THEN REVERSE( SUBSTR( REVERSE( a.staff_property_master_code )FROM INSTR( REVERSE( a.staff_property_master_code ), '|' ) + 1 ) ) END AS parent_code "); sqlCommon.append(" FROM (SELECT * FROM product_sys_staff_property_master)a "); sqlCommon.append(" )b "); //第一层系统属性 String sqlParent =sqlCommon.toString() + " where b.parent_code is NULL "; //后代系统属性 String sqlSub=sqlCommon.toString() + " where b.parent_code is not NULL "; DataTableEntity dtParentProperty=baseDao.listTable(sqlParent, new Object[] {}); DataTableEntity dtSubProperty=baseDao.listTable(sqlSub, new Object[] {}); baseDao.listInternationDataTable(dtParentProperty, null); baseDao.listInternationDataTable(dtSubProperty, null); JSONArray json=null; if (dtParentProperty.getRows()>0) { //装载属性 json=sysPropertyGroup(dtParentProperty,dtSubProperty,1); } return json; } /** * 封装系统属性名称国际化 * @return * @throws BaseException */ public List getPropertyNameLanguage(DataTableEntity dtPropertyLanguage) throws BaseException { ListlistPropertyName=new ArrayList(); if (dtPropertyLanguage!=null && dtPropertyLanguage.getRows()>0) { //遍历获取语言代码和国际化值 FieldMetaEntity meta = dtPropertyLanguage.getMeta(); Object[] fields12 = meta.getFields(); List asList =new ArrayList<>(); asList.addAll(Arrays.asList(fields12)); Iterator iterator = asList.iterator(); for (int i = 0; i < dtPropertyLanguage.getRows(); i++) { while (iterator.hasNext()) { Object next = iterator.next(); if(!next.toString().equals("uuid") &&!next.toString().equals("language_code")) { String string = dtPropertyLanguage.getString(i, next.toString()); if(!StringUtils.isEmpty(string)) { JSONObject propertyName=new JSONObject(); propertyName.put(next.toString(), string); listPropertyName.add(propertyName); iterator.remove(); break; } }else { iterator.remove(); } } } } return listPropertyName; } }