package com.highdatas.mdm.service.impl;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
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.pojo.ActivitiStatus;
import com.highdatas.mdm.pojo.Operate;
import com.highdatas.mdm.service.IFlowsService;
import com.highdatas.mdm.service.IMaintainFieldService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
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.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.MessageFormat;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 服务实现类
*
*
* @author kimi
* @since 2020-03-06
*/
@Service
public class MaintainFieldServiceImpl extends ServiceImpl implements IMaintainFieldService {
@Autowired
IMaintainService maintainService;
@Autowired
IFlowsService flowsService;
@Autowired
ISysFieldService fieldService;
@Autowired
MaintainFieldMapper maintainFieldMapper;
@Override
public MaintainField getNextMaintain(String tableName, String userId) {
MaintainField maintain = this.getMaxVersion(tableName);
Maintain nowVersion = maintainService.getNowVersion(tableName);
if (nowVersion == null) {
return null;
}
if (maintain == null){
MaintainField maintainField = new MaintainField().setId(DbUtils.getUUID()).setVersion(Constant.VERSION_Default).setCreateTime(new Date()).setChargeId(userId).setOrderNo(0).setTableName(tableName);
maintainField.setMaintainId(nowVersion.getId());
return maintainField;
}
MaintainField unFlowMaxVersion = this.getUnFlowMaxVersion(tableName);
if (unFlowMaxVersion == null) {
unFlowMaxVersion = new MaintainField();
if (maintain != null) {
unFlowMaxVersion.setVersion(DbUtils.versionAddSub(maintain.getVersion()));
int orderNo = maintain.getOrderNo();
orderNo++;
unFlowMaxVersion.setOrderNo(orderNo);
} else {
unFlowMaxVersion.setVersion(Constant.VERSION_Default);
unFlowMaxVersion.setOrderNo(0);
}
unFlowMaxVersion.setId(DbUtils.getUUID());
unFlowMaxVersion.setChargeId(userId);
unFlowMaxVersion.setCreateTime(new Date());
unFlowMaxVersion.setTableName(tableName);
}
MaintainField nowMaintain = unFlowMaxVersion;
if (DbUtils.compareVersion(maintain, unFlowMaxVersion) != 0) {
nowMaintain = new MaintainField();
String maintanId = DbUtils.getUUID();
nowMaintain.setId(maintanId);
nowMaintain.setCreateTime(new Date());
int orderNo = maintain.getOrderNo();
orderNo++;
nowMaintain.setVersion(DbUtils.versionAddSub(maintain.getVersion()));
nowMaintain.setOrderNo(orderNo);
nowMaintain.setTableName(tableName);
}
if (nowVersion!= null){
nowMaintain.setMaintainId(nowVersion.getId());
}
nowMaintain.setChargeId(userId);
String maintainId = nowMaintain.getId();
if(StringUtils.isEmpty(maintainId)) {
nowMaintain.setId(DbUtils.getUUID());
}
return nowMaintain;
}
@Override
public boolean checkNowVersion(String maintainFieldId) {
MaintainField maintain = selectById(maintainFieldId);
MaintainField maxVersion = getNowVersion(maintain.getTableName());
Integer compared = DbUtils.compareVersion(maxVersion, maintain);
if (compared != null && compared == 0) {
return true;
} else {
return false;
}
}
@Override
public boolean checkFirstVersion(String id) {
MaintainField maintain = selectById(id);
MaintainField order_no = selectOne(new EntityWrapper().eq("table_name", maintain.getTableName()).orderBy("order_no"));
if (maintain.getId().equalsIgnoreCase(order_no.getId())) {
return true;
}
return false;
}
@Override
public boolean checkdMaxVersion(String maintainFieldId) {
MaintainField maintain = selectById(maintainFieldId);
MaintainField maxVersion = getMaxVersion(maintain.getTableName());
Integer compared = DbUtils.compareVersion(maxVersion, maintain);
if (compared == 0) {
return true;
} else {
return false;
}
}
@Override
public MaintainField getMaxVersion(String tableName) {
Wrapper versionWrapper = new EntityWrapper().eq("table_name", tableName).orderBy("order_no desc");
MaintainField maxVersion = this.selectOne(versionWrapper);
return maxVersion;
}
@Override
public MaintainField getUnFlowMaxVersion(String tableName) {
Wrapper versionWrapper = new EntityWrapper().isNull("flow_id").eq("table_name", tableName).orderBy("order_no desc");
MaintainField maxVersion = selectOne(versionWrapper);
return maxVersion;
}
@Override
public MaintainField getNowVersion(String tableName) {
Wrapper versionWrapper = new EntityWrapper().eq("table_name", tableName).isNotNull("flow_id").orderBy("order_no desc");
List maintains = selectList(versionWrapper);
for (MaintainField maintain : maintains) {
Flows flows = flowsService.selectById(maintain.getFlowId());
if (flows == null){
continue;
}
ActivitiStatus status = flows.getStatus();
if (status.equals(ActivitiStatus.open)) {
return maintain;
}
}
return null;
}
@Override
public MaintainField getMaintainFromVersion(String tableName, String verison) {
Wrapper versionWrapper = new EntityWrapper().eq("version", verison).eq("table_name", tableName);
MaintainField maxVersion = selectOne(versionWrapper);
return maxVersion;
}
@Override
public void dealFlow(String maintainId, ActivitiStatus status) {
MaintainField maintainField = selectById(maintainId);
if (status.equals(ActivitiStatus.close)) {
//delete maintain
fieldService.delete(new EntityWrapper().eq("maintain_field_id", maintainField.getId()));
maintainField.deleteById();
}
else if (status.equals(ActivitiStatus.open)) {
List fieldList = fieldService.selectList(new EntityWrapper().eq("maintain_field_id", maintainField.getId()));
List collect = fieldList.stream().filter(sysField -> Operate.delete.equals(sysField.getOperate())).collect(Collectors.toList());
//delete
for (SysField field : collect) {
field.deleteById();
}
//update
List updateList = fieldList.stream().filter(sysField -> (Operate.update.equals(sysField.getOperate()))).collect(Collectors.toList());
for (SysField field : updateList) {
field.setOperate(null).updateById();
}
List createList = fieldList.stream().filter(sysField -> (Operate.create.equals(sysField.getOperate()))).collect(Collectors.toList());
for (SysField field : createList) {
String fieldType = field.getFieldType();
if (StringUtils.isEmpty(fieldType)) {
fieldType = Constant.varchar;
}
String fieldTypeStr;
if (fieldType.equalsIgnoreCase(Constant.varchar)) {
fieldTypeStr = DbUtils.StrJoin(fieldType, Constant.varcharSize);
}else {
fieldTypeStr = fieldType;
}
String tableName = field.getTableName();
String tempTableName = Constant.Temp + tableName;
String recordTableName = tableName + Constant.RECORD;
maintainFieldMapper.addCloumn(tempTableName, field.getField(), fieldTypeStr);
maintainFieldMapper.addCloumn(recordTableName, field.getField(), fieldTypeStr);
maintainFieldMapper.addCloumn(tableName, field.getField(), fieldTypeStr);
field.setOperate(null).updateById();
}
}
}
@Override
public int getUnFlowCount(String tableName, String userId) {
List maintainFields = selectList(new EntityWrapper().eq("table_name", tableName));
List flowIdList = maintainFields.stream().filter(maintainField -> maintainField.getFlowId() != null).map(MaintainField::getFlowId).collect(Collectors.toList());
if (flowIdList.size() == 0) {
return 0;
}
List flowsList = flowsService.selectBatchIds(flowIdList);
List unFlowedList = flowsList.stream().filter(flows -> flows.getStatus().equals(ActivitiStatus.working) || flows.getStatus().equals(ActivitiStatus.refuse)).collect(Collectors.toList());
int cnt = 0;
for (Flows flows : unFlowedList) {
boolean nextAudit = flowsService.isNextAudit(flows, userId);
if (nextAudit) {
cnt++;
}
}
return cnt;
}
}