kimi
2020-05-27 c007f0ca1785db093d48f4846cda82fe8e955765
src/main/java/com/highdatas/mdm/service/impl/SysFieldServiceImpl.java
@@ -1,10 +1,29 @@
package com.highdatas.mdm.service.impl;
import com.highdatas.mdm.entity.SysField;
import com.highdatas.mdm.mapper.SysFieldMapper;
import com.highdatas.mdm.service.ISysFieldService;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.highdatas.mdm.entity.*;
import com.highdatas.mdm.mapper.MaintainFieldMapper;
import com.highdatas.mdm.mapper.SysFieldMapper;
import com.highdatas.mdm.mapper.TableInfoMapper;
import com.highdatas.mdm.pojo.ActivitiStatus;
import com.highdatas.mdm.pojo.Operate;
import com.highdatas.mdm.pojo.Page;
import com.highdatas.mdm.pojo.Result;
import com.highdatas.mdm.service.IFlowsService;
import com.highdatas.mdm.service.IMaintainFieldService;
import com.highdatas.mdm.service.IMaintainService;
import com.highdatas.mdm.service.ISysFieldService;
import com.highdatas.mdm.util.Constant;
import com.highdatas.mdm.util.DbUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
 * <p>
@@ -16,5 +35,473 @@
 */
@Service
public class SysFieldServiceImpl extends ServiceImpl<SysFieldMapper, SysField> implements ISysFieldService {
    @Autowired
    IMaintainService maintainService;
    @Autowired
    SysFieldMapper fieldMapper;
    @Autowired
    IMaintainFieldService maintainFieldService;
    @Autowired
    MaintainFieldMapper maintainFieldMapper;
    @Autowired
    IFlowsService flowsService;
    @Autowired
    TableInfoMapper tableInfoMapper;
    public MaintainField getMaintainFieldByMaintainId(String maintainId) {
        MaintainField maintainField;
        List<SysField> fieldList = null;
        if (StringUtils.isEmpty(maintainId)) {
            return null;
        }
        Maintain maintain = maintainService.selectById(maintainId);
        if (maintain == null) {
            return null;
        }
        maintainField = maintainFieldService.selectOne(new EntityWrapper<MaintainField>().eq("maintain_id", maintainId).orderBy("order_no desc"));
        if (maintainField == null) {
            //对应版本找不到 往前找
            Map<String, String> maintainFieldMap = maintainFieldMapper.getMappedMatintainId(DbUtils.quotedStr(maintain.getTableName()), maintain.getOrderNo());
            if (maintainFieldMap == null) {
               return null;
            }
            String maintainFieldId = maintainFieldMap.get(Constant.ID);
            maintainField = maintainFieldService.selectById(maintainFieldId);
        }
        return maintainField;
    }
    /**
     *
     * @description:  通过版本获取字段列表
     * @param maintainId 版本id
     * @return: 字段列表
     *
     */
    @Override
    public List<SysField> getFieldByMaintain(String maintainId) {
        List<SysField> fieldList;
        Maintain maintain = maintainService.selectById(maintainId);
        if (maintain == null) {
            return null;
        }
        MaintainField maintainField = getMaintainFieldByMaintain(maintainId);
        if (maintainField == null || Constant.Default.equalsIgnoreCase(maintainField.getId())) {
            fieldList = this.selectList(new EntityWrapper<SysField>().eq("table_name", maintain.getTableName()).isNull("maintain_field_id").orderBy("order_no"));
            return fieldList;
        }
        String maintainFieldId = maintainField.getId();
        String tableName = maintainField.getTableName();
        ActivitiStatus status = flowsService.getStatusByBusinessId(maintainFieldId);
        if (status != null && status.equals(ActivitiStatus.open)) {
            fieldList = this.selectList(new EntityWrapper<SysField>().eq("maintain_field_id", maintainFieldId).eq("table_name", tableName).orderBy("order_no"));
            if (fieldList.size() != 0) {
                return fieldList;
            }
        }
        // 当前版本正在审批  找前一版本
        Integer maintainFieldOrderNo = maintainField.getOrderNo();
        if (maintainFieldOrderNo < 1) {
            fieldList = this.selectList(new EntityWrapper<SysField>().eq("table_name", maintain.getTableName()).isNull("maintain_field_id").orderBy("order_no"));
            return fieldList;
        }else {
            Integer preNo = maintainFieldOrderNo - 1;
            maintainField = maintainFieldService.selectOne(new EntityWrapper<MaintainField>().eq("table_name", maintain.getTableName()).eq("order_no", preNo));
            fieldList = this.selectList(new EntityWrapper<SysField>().eq("maintain_field_id", maintainField.getId()).eq("table_name", tableName).orderBy("order_no"));
            return fieldList;
        }
    }
    /**
     *
     * @description:  通过版本获取字段版本
     * @param maintainId 版本id
     * @return: 字段版本
     *
     */
    @Override
    public MaintainField getMaintainFieldByMaintain(String maintainId) {
        MaintainField maintainField = null;
        List<SysField> fieldList = null;
        if (StringUtils.isEmpty(maintainId)) {
            return null;
        }
        Maintain maintain = maintainService.selectById(maintainId);
        if (maintain == null) {
            return null;
        }
        List<MaintainField> subList = maintainFieldService.selectList(new EntityWrapper<MaintainField>().eq("maintain_id", maintainId).orderBy("order_no desc, create_time desc"));
        subList.sort(new Comparator<MaintainField>() {
            @Override
            public int compare(MaintainField o1, MaintainField o2) {
                return o2.getOrderNo().compareTo(o1.getOrderNo());
            }
        });
        if (!subList.isEmpty()) {
            maintainField = subList.get(0);
        }
        if (maintainField == null) {
            //对应版本找不到 往前找
            Map<String, String> maintainFieldMap = maintainFieldMapper.getMappedMatintainId(DbUtils.quotedStr(maintain.getTableName()), maintain.getOrderNo());
            if (maintainFieldMap == null) {
                return new MaintainField().setId(Constant.Default).setTableName(maintain.getTableName());
            }
            String maintainFieldId = maintainFieldMap.get(Constant.ID);
            maintainField = maintainFieldService.selectById(maintainFieldId);
            if (maintainField == null){
                return new MaintainField().setId(Constant.Default).setTableName(maintain.getTableName());
            }
        }
        String maintainFieldId = maintainField.getId();
        String tableName = maintainField.getTableName();
        ActivitiStatus status = flowsService.getStatusByBusinessId(maintainFieldId);
        if (status != null && status.equals(ActivitiStatus.open)) {
            return maintainFieldService.selectById(maintainField);
        }
        // 当前版本正在审批  找前一版本
        Integer maintainFieldOrderNo = maintainField.getOrderNo();
        if (maintainFieldOrderNo < 1) {
            return new MaintainField().setId(Constant.Default).setTableName(maintain.getTableName());
        }else {
            Integer preNo = maintainFieldOrderNo - 1;
            maintainField = maintainFieldService.selectOne(new EntityWrapper<MaintainField>().eq("table_name", maintain.getTableName()).eq("order_no", preNo));
            return maintainField;
        }
    }
    /**
     *
     * @description:  通过表名获取当前字段列表
     * @param tableName 表名
     * @return: 当前字段列表
     *
     */
    @Override
    public List<SysField> getFieldByTable(String tableName) {
        Maintain nowVersion = maintainService.getNowVersion(tableName);
        if (nowVersion == null) {
            List<SysField> fieldList = this.selectList(new EntityWrapper<SysField>().eq("table_name", tableName).isNull("maintain_field_id").orderBy("order_no"));
            if (fieldList.size() ==0) {
                List<TableSchemaResult> tableField = tableInfoMapper.getTableField(tableName);
                for (TableSchemaResult tableSchemaResult : tableField) {
                    String fieldName = tableSchemaResult.getFieldName();
                    SysField field = new SysField().setField(fieldName);
                    fieldList.add(field);
                }
            }
            return fieldList;
        }
        return getFieldByMaintain(nowVersion.getId());
    }
    /**
     *
     * @description:  通过版本获取数据库字段列表
     * @param tableName 表名
     * @return: 字段列表
     *
     */
    @Override
    public Result getTotalFields(String tableName) {
        JSONObject result = new JSONObject();
        MaintainField maxVersion = maintainFieldService.getMaxVersion(tableName);
        MaintainField nowVersion = maintainFieldService.getNowVersion(tableName);
        if (nowVersion == null && maxVersion == null) {
            result.fluentPut("list", getFieldByTable(tableName));
            result.fluentPut("aduit", false);
            result.fluentPut("flowStatus", null);
            result.fluentPut("maintainFieldId", null);
            return Result.success(result);
        }else if (nowVersion == null){
            List<SysField> maxFieldList = getFieldByMaintainField(maxVersion.getId());
            List<SysField> createdFieldList = getFieldByTable(tableName);
            result.fluentPut("list", packageFieldList(createdFieldList, maxFieldList));
            result.fluentPut("aduit", true);
            result.fluentPut("flowStatus", null);
            result.fluentPut("maintainFieldId", maxVersion.getId());
            String flowId = maxVersion.getFlowId();
            Flows flows = flowsService.selectById(flowId);
            if (flows != null) {
                ActivitiStatus status = flows.getStatus();
                if (!status.equals(ActivitiStatus.open) || !status.equals(ActivitiStatus.close)) {
                    result.fluentPut("aduit", false);
                }
                result.fluentPut("flowStatus", status);
            }
            return Result.success(result);
        }
        if (maxVersion.getOrderNo().equals(nowVersion.getOrderNo())) {
            // 未存在
            result.fluentPut("list", getFieldByMaintainField(nowVersion.getId()));
            result.fluentPut("aduit", false);
            result.fluentPut("flowStatus", null);
            result.fluentPut("maintainFieldId", nowVersion.getId());
            return Result.success(result);
        }
        List<SysField> nowFields = getFieldByMaintainField(nowVersion.getId());
        List<SysField> maxFields = getFieldByMaintainField(maxVersion.getId());
        nowFields = packageFieldList(nowFields, maxFields);
        result.fluentPut("list", nowFields);
        result.fluentPut("aduit", true);
        result.fluentPut("flowStatus", null);
        result.fluentPut("maintainFieldId", maxVersion.getId());
        String flowId = maxVersion.getFlowId();
        Flows flows = flowsService.selectById(flowId);
        if (flows != null) {
            ActivitiStatus status = flows.getStatus();
            if (!status.equals(ActivitiStatus.open) || !status.equals(ActivitiStatus.close)) {
                result.fluentPut("aduit", false);
            }
            result.fluentPut("flowStatus", status);
        }
        return Result.success(result);
    }
    /**
     *
     * @description:  list 通过分页对象筛选
     * @param list 数据列表
     * @param pageNo 页数
     * @param pageSize 每页数量
     * @return: 分页筛选后的数据列表
     *
     */
    @Override
    public Result getPagedDataByList(List list, Integer pageNo, Integer pageSize) {
        JSONObject result = new JSONObject();
        int total = list.size();
        Page page = new Page(total);
        page.setPageSize(pageSize);
        page.setPageNo(pageNo);
        List subList = (List) list.stream().skip(page.getBeginRecordNo_1()).limit(page.getPageSize()).collect(Collectors.toList());
        result.fluentPut("pages", page.getPageCount());
        result.fluentPut("current", pageNo);
        result.fluentPut("size", pageSize);
        result.fluentPut("total", page.getRecordCount());
        result.fluentPut("list", subList);
        return Result.success(result);
    }
    /**
     *
     * @description:  获取分页后的字段列表
     * @param tableName 表名
     * @param pageNo 页数
     * @param pageSize 每页数据
     * @return: 字段列表
     *
     */
    @Override
    public Result getTotalFields(String tableName, Integer pageNo, Integer pageSize) {
        Result totalFields = getTotalFields(tableName);
        JSONObject result = (JSONObject) totalFields.getData();
        JSONArray list = result.getJSONArray("list");
        int total = list.size();
        Page page = new Page(total);
        page.setPageSize(pageSize);
        page.setPageNo(pageNo);
        List<Object> subList = list.stream().skip(page.getBeginRecordNo_1()).limit(page.getPageSize()).collect(Collectors.toList());
        result.fluentPut("pages", page.getPageCount());
        result.fluentPut("current", pageNo);
        result.fluentPut("size", pageSize);
        result.fluentPut("total", page.getRecordCount());
        result.fluentPut("list", subList);
        return Result.success(result);
    }
    /**
     *
     * @description:  分类后给前端展示
     * @param nowFields 当前版本字段列表
     * @param maxFields 全部字段列表
     * @return: 分类后的字段列表
     *
     */
    private List<SysField> packageFieldList(List<SysField> nowFields, List<SysField> maxFields) {
        //原始的清除operate用于前端显示
        nowFields =  nowFields.stream().map(sysField -> sysField.setOperate(null)).collect(Collectors.toList());
        for (SysField maxField : maxFields) {
            String field = maxField.getField();
            Operate operate = maxField.getOperate();
            if (operate == null) {
                continue;
            }
            if (operate.equals(Operate.update) || operate.equals(Operate.delete)) {
                nowFields = nowFields.stream().filter(sysField -> !sysField.getField().equalsIgnoreCase(field)).collect(Collectors.toList());
                nowFields.add(maxField);
            }
            else if (operate.equals(Operate.create)) {
                nowFields.add(maxField);
            }
        }
        Collections.sort(nowFields, new Comparator<SysField>() {
            @Override
            public int compare(SysField o1, SysField o2) {
                Integer o1OrderNo = o1.getOrderNo();
                Integer orderNo = o2.getOrderNo();
                if (o1OrderNo == null && orderNo == null) {
                    return 0;
                }else if (o1OrderNo == null) {
                    return -1;
                }else if  (orderNo == null) {
                    return 1;
                }
                return o1OrderNo - orderNo;
            }
        });
        return nowFields;
    }
    /**
     *
     * @description:  更新基础字段对象信息
     * @param preField 更新前的字段对象
     * @param updateField 更新参数
     * @return: 是否更新成功
     *
     */
    @Override
    public boolean updateCommon(SysField preField, SysField updateField) {
        preField.setWidth(updateField.getWidth());
        preField.setDesp(updateField.getDesp());
        preField.setAlign(updateField.getAlign());
        String maintainId = preField.getMaintainFieldId();
        String maintainParams;
        if (StringUtils.isEmpty(maintainId)) {
            //初始状态
            String tableName = preField.getTableName();
            maintainParams = "maintain_field_id is null and table_name = " + DbUtils.quotedStr(tableName);
        }else {
            maintainParams = "maintain_field_id = " + DbUtils.quotedStr(maintainId);
        }
        Integer updateSize = null;
        Integer preOrderNo = preField.getOrderNo();
        Integer orderNo = updateField.getOrderNo();
        if (orderNo == preOrderNo) {
            return preField.updateById();
        }
//        else if (preOrderNo > orderNo) {
//            //往前调
//            updateSize = fieldMapper.updateOrderNoFront(maintainParams,orderNo, preOrderNo);
//        }else {
//            updateSize = fieldMapper.updateOrderNoBack(maintainParams,orderNo, preOrderNo);
//        }
        if (preField.getOperate() != null) {
            preField.setOperate(updateField.getOperate());
        }
        preField.setOrderNo(updateField.getOrderNo());
        return preField.updateById();
    }
    /**
     *
     * @description:  通过字段版本获取某个字段的对象
     * @param maintainFieldId 字段版本
     * @param field 字段名称
     * @return: 字段对象
     *
     */
    @Override
    public SysField getOneFieldByMaintainField(String maintainFieldId, String field) {
        List<SysField> fieldByMaintain = getFieldByMaintainField(maintainFieldId);
        List<SysField> collect = fieldByMaintain.stream().filter(sysField -> sysField.getField().equalsIgnoreCase(field)).collect(Collectors.toList());
        if (collect.isEmpty()) {
            return null;
        }
        return collect.get(0);
    }
    /**
     *
     * @description:  通过数据版本获取某个字段的对象
     * @param maintainId 数据版本
     * @param field 字段名称
     * @return: 字段对象
     *
     */
    @Override
    public SysField getOneFieldByMaintain(String maintainId, String field) {
        List<SysField> fieldByMaintain = getFieldByMaintain(maintainId);
        if (fieldByMaintain == null || fieldByMaintain.isEmpty()) {
            return null;
        }
        for (SysField sysField : fieldByMaintain) {
            if (sysField.getField().equalsIgnoreCase(field)) {
                return sysField;
            }
        }
        return null;
    }
    /**
     *
     * @description:  通过字段版本获取对象列表
     * @param maintainId 字段版本
     * @return: 字段对象列表
     *
     */
    @Override
    public List<SysField> getFieldByMaintainField(String maintainId) {
        if (StringUtils.isEmpty(maintainId)) {
            return null;
        }
        return selectList(new EntityWrapper<SysField>().eq("maintain_field_id", maintainId).orderBy("order_no"));
    }
    /**
     *
     * @description:  通过表名获取默认字段列表
     * @param tableName 表名
     * @return: 字段对象列表
     *
     */
    @Override
    public List<SysField> getDefaultTableField(String tableName) {
        return selectList(new EntityWrapper<SysField>().eq("table_name", tableName).isNull("maintain_field_id").orderBy("order_no"));
    }
    /**
     *
     * @description:  通过表名获取全部字段列表
     * @param tableName 表名
     * @return: 字段对象列表
     *
     */
    @Override
    public List<SysField> getTotalTableField(String tableName) {
        List<TableSchemaResult> tableField = tableInfoMapper.getTableField(tableName);
        List<SysField> result = new ArrayList<>();
        for (TableSchemaResult tableSchemaResult : tableField) {
            String fieldName = tableSchemaResult.getFieldName();
            List<SysField> fieldList = selectList(new EntityWrapper<SysField>().eq("table_name", tableName).eq(Constant.FIELD, fieldName).orderBy("create_time"));
            if (fieldList.isEmpty()) {
                //没有中文名称的  应该属于系统自留字段 如id
                continue;
            }
            HashSet<SysField> strings = new HashSet<SysField>(fieldList);
            String alias = strings.stream().map(SysField::getAlias).collect(Collectors.joining(Constant.SEMICOLON));
            SysField sysField = new SysField().setField(fieldName).setAlias(alias);
            result.add(sysField);
        }
        return result;
    }
}