package com.highdatas.mdm.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.highdatas.mdm.entity.Flows;
import com.highdatas.mdm.entity.Maintain;
import com.highdatas.mdm.entity.MaintainField;
import com.highdatas.mdm.entity.SysField;
import com.highdatas.mdm.mapper.MaintainFieldMapper;
import com.highdatas.mdm.mapper.SysFieldMapper;
import com.highdatas.mdm.pojo.ActivitiStatus;
import com.highdatas.mdm.pojo.Operate;
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.DbUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
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;
@Override
public List getFieldByMaintain(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)) {
fieldList = this.selectList(new EntityWrapper().eq("table_name", maintain.getTableName()).isNull("maintain_field_id").orderBy("order_no"));
return fieldList;
}
maintainField = maintainFieldService.selectById(maintainFieldId);
if (maintainField == null){
//无对应版本
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--;
maintainField = maintainFieldService.selectOne(new EntityWrapper().eq("table_name", maintain.getTableName()).eq("order_no", preNo));
fieldList = this.selectList(new EntityWrapper().eq("maintain_field_id", maintainFieldId).eq("table_name", tableName).orderBy("order_no"));
return fieldList;
}
}
@Override
public List getFieldByTable(String tableName) {
Maintain nowVersion = maintainService.getNowVersion(tableName);
if (nowVersion == null) {
return null;
}
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);
}
private List packageFieldList(List nowFields, List 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() {
@Override
public int compare(SysField o1, SysField o2) {
return o1.getOrderNo() - o2.getOrderNo() ;
}
});
return nowFields;
}
@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();
}
@Override
public SysField getOneFieldByMaintainField(String maintainFieldId, String field) {
List fieldByMaintain = getFieldByMaintainField(maintainFieldId);
List collect = fieldByMaintain.stream().filter(sysField -> sysField.getField().equalsIgnoreCase(field)).collect(Collectors.toList());
if (collect.isEmpty()) {
return null;
}
return collect.get(0);
}
@Override
public List getFieldByMaintainField(String maintainId) {
if (StringUtils.isEmpty(maintainId)) {
return selectList(new EntityWrapper().isNull("maintain_field_id").orderBy("order_no"));
}
return selectList(new EntityWrapper().eq("maintain_field_id", maintainId).orderBy("order_no"));
}
}