package com.highdatas.mdm.service.impl;
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;
/**
*
* 服务实现类
*
*
* @author kimi
* @since 2019-12-18
*/
@Service
public class SysFieldServiceImpl extends ServiceImpl 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 fieldList = null;
if (StringUtils.isEmpty(maintainId)) {
return null;
}
Maintain maintain = maintainService.selectById(maintainId);
if (maintain == null) {
return null;
}
maintainField = maintainFieldService.selectOne(new EntityWrapper().eq("maintain_id", maintainId).orderBy("order_no desc"));
if (maintainField == null) {
//对应版本找不到 往前找
String maintainFieldId = maintainFieldMapper.getMappedMatintainId(DbUtils.quotedStr(maintain.getTableName()), maintain.getOrderNo());
if (StringUtils.isEmpty(maintainFieldId)) {
return null;
}
maintainField = maintainFieldService.selectById(maintainFieldId);
}
return maintainField;
}
@Override
public List getFieldByMaintain(String maintainId) {
List 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().eq("table_name", maintain.getTableName()).isNull("maintain_field_id").orderBy("order_no"));
return fieldList;
}
String maintainFieldId = maintainField.getId();
String tableName = maintainField.getTableName();
//TODO 判断版本
ActivitiStatus status = flowsService.getStatusByBusinessId(maintainFieldId);
if (status != null && status.equals(ActivitiStatus.open)) {
fieldList = this.selectList(new EntityWrapper().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().eq("table_name", maintain.getTableName()).isNull("maintain_field_id").orderBy("order_no"));
return fieldList;
}else {
Integer preNo = maintainFieldOrderNo - 1;
maintainField = maintainFieldService.selectOne(new EntityWrapper().eq("table_name", maintain.getTableName()).eq("order_no", preNo));
fieldList = this.selectList(new EntityWrapper().eq("maintain_field_id", maintainField.getId()).eq("table_name", tableName).orderBy("order_no"));
return fieldList;
}
}
@Override
public MaintainField getMaintainFieldByMaintain(String maintainId) {
MaintainField maintainField = null;
List fieldList = null;
if (StringUtils.isEmpty(maintainId)) {
return null;
}
Maintain maintain = maintainService.selectById(maintainId);
if (maintain == null) {
return null;
}
List subList = maintainFieldService.selectList(new EntityWrapper().eq("maintain_id", maintainId).orderBy("order_no desc, create_time desc"));
subList.sort(new Comparator() {
@Override
public int compare(MaintainField o1, MaintainField o2) {
return o2.getOrderNo().compareTo(o1.getOrderNo());
}
});
if (!subList.isEmpty()) {
maintainField = subList.get(0);
}
if (maintainField == null) {
//对应版本找不到 往前找
String maintainFieldId = maintainFieldMapper.getMappedMatintainId(DbUtils.quotedStr(maintain.getTableName()), maintain.getOrderNo());
if (StringUtils.isEmpty(maintainFieldId)) {
return new MaintainField().setId(Constant.Default);
}
maintainField = maintainFieldService.selectById(maintainFieldId);
if (maintainField == null){
return new MaintainField().setId(Constant.Default);
}
}
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);
}else {
Integer preNo = maintainFieldOrderNo - 1;
maintainField = maintainFieldService.selectOne(new EntityWrapper().eq("table_name", maintain.getTableName()).eq("order_no", preNo));
return maintainField;
}
}
@Override
public List getFieldByTable(String tableName) {
Maintain nowVersion = maintainService.getNowVersion(tableName);
if (nowVersion == null) {
List fieldList = this.selectList(new EntityWrapper().eq("table_name", tableName).isNull("maintain_field_id").orderBy("order_no"));
if (fieldList.size() ==0) {
List 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());
}
@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 maxFieldList = getFieldByMaintainField(maxVersion.getId());
List 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 nowFields = getFieldByMaintainField(nowVersion.getId());
List 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);
}
@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