//判断PJ计划的文件与内容是否正确
@RequestMapping("checkUp0.do")
@ResponseBody
public ObjectNode checkUp0(HttpServletRequest request)throws Exception {
ObjectMapper mapper = new ObjectMapper();
ObjectNode re = mapper.createObjectNode();
String attachment = request.getParameter("fj");
if (StringUtils.isBlank(attachment) || attachment.length() < 1) {
return returnFaild("错误:请上传附件!");
}
try {
Path path = AttachmentUtils.getAttachByUri(attachment.split(":")[0]).getPath();
if(!path.getFileName().toString().endsWith(".xml")){
path = detService.getXmlFileByZip(path);
if(path == null)
return returnFaild("错误:上传的文件异常!请上传xml文件或只含有一个xml文件的压缩文件!");
}
ProjectFile project = detService.getProjectFileByPath(path);//新的计划
if(project == null){
return returnFaild("错误:PJ计划无法识别!");
}
List<String> listError = new ArrayList<>();//错误信息
for(Task t :project.getAllTasks()){
if(t.getID()==0){
continue;
}
if(t.getName() == null){
listError.add(t.getID()+" 号任务的任务名为空!");
}else{
try{
t.setName(t.getName().trim());
}catch (Exception e){
listError.add(t.getID()+" 号任务的任务名无法成功去除前后空格!");
}
}
if(t.getStart() == null){
listError.add(t.getID()+" 号任务的开始时间为空!");
}if(t.getFinish() == null){
listError.add(t.getID()+" 号任务的完成时间为空!");
}if(t.getDuration() == null){
listError.add(t.getID()+" 号任务的工期为零或空!");
}else if(t.getStart() != null && t.getFinish() != null && (t.getDuration().getDuration() < 0 || t.getStart().getTime() > t.getFinish().getTime())){
listError.add(t.getID()+" 号任务的开始时间大于完成时间!");
}
if(t.getBaselineStart() == null){
listError.add(t.getID()+" 号任务的基准(基准)开始时间为空!");
}if(t.getBaselineFinish() == null){
listError.add(t.getID()+" 号任务的基准(基准)完成时间为空!");
}
if(t.getBaselineDuration() == null ){
listError.add(t.getID()+" 号任务的基线(基准)工期为零或空!");
}else if(t.getBaselineStart() != null && t.getBaselineFinish() != null && (t.getBaselineDuration().getDuration() < 0 || t.getBaselineStart().getTime() > t.getBaselineFinish().getTime())){
listError.add(t.getID()+" 号任务的基线(基准)开始时间大于基线(基准)完成时间!");
}
}
if(listError.size()>0){//存在多种问题,列表形式在页面显示
//去重
List<String> listNew = new ArrayList<>();
for(String error : listError){
boolean flag = true;
for(String ne : listNew){
if(error.equals(ne)){
flag = false;
}
}
if(flag){
listNew.add(error);
}
}
re.put("error", 2);
re.put("msg", "错误!");
re.put("list", StringUtils.join(listNew,","));
return re;
}
}catch (Exception e){
e.printStackTrace();
re.put("error", 1);
re.put("msg", "未知错误!");
return re;
}
re.put("error", 0);
re.put("msg", "正确!");
return re;
}
//将Path转换成ProjectFile
public ProjectFile getProjectFileByPath(Path path){
if(path == null) return null;
String str = getXMLContent(path,null,null,false);
return getProjectFile(str);
}
//将xml字符串转换成ProjectFile
public ProjectFile getProjectFile(String str){
ProjectReader reader = new MSPDIReader();
InputStream inputStream = null;
try{
inputStream = new ByteArrayInputStream(str.getBytes("utf-8"));
ProjectFile project = reader.read(inputStream);
inputStream.close();
return project;
}catch (Exception e){
e.printStackTrace();
}finally {
if(inputStream!=null){
try{
inputStream.close();
}catch (Exception e){
}
}
}
return null;
}
public String getXMLContent(Path path,List<AppProjectDetailEntity> listProDet,String calendarStr,boolean isNeedTimephasedData){
return new XmlHelper().getXmlContent(path.toFile(),listProDet,getCalendar(calendarStr),isNeedTimephasedData);
}
//将日历字符串组装
private List<Map<String,Object>> getCalendar(String calendarStr){
List<Map<String,Object>> liWork = new ArrayList<>();
if(StringUtils.isNotBlank(calendarStr)){
JSONArray workJson = JSONArray.fromObject(calendarStr);
for(int i=0;i<workJson.size();i++){
Map<String,Object> mapW = new HashedMap();
JSONObject d = workJson.getJSONObject(i);
mapW.put("is_work",d.getString("is_work"));
mapW.put("day_name",d.get("day_name")==null?"":d.getString("day_name"));
if(i == 0)
mapW.put("exception",d.get("exception") == null?"":d.getString("exception").split(";"));
mapW.put("hours",d.getString("hours").split(";"));
liWork.add(mapW);
}
}
return liWork;
}
package eiis.app.project.pojo;
import eiis.app.project.entity.AppProjectDetailEntity;
import org.apache.commons.lang3.StringUtils;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* Created by SSKJ on 2017/8/29.
*/
public class XmlHelper extends DefaultHandler{
private final static String needDelete = ";Views;Filters;Groups;Tables;";
private final static String[] WEEKS = {"SUNDAY","MONDAY","TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","SATURDAY"};//默认周
private final static String ADD_DEL = ";"+ProjectField.ActualStart.toString()+";"+ProjectField.ActualFinish.toString()+";"+ProjectField.Stop.toString()+";"+ProjectField.Resume.toString()+";";//需要删除或新增的标签
private StringBuffer sb=new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n");
private boolean isTask=false;//计划标签开始
private boolean isExtendedAttribute=false;//自定义标签开始
private boolean isAssignment=false;//分配标签开始
private boolean isDel=false;//是否删除
private boolean isTimephasedData=false;
private static boolean isNeedTimephasedData=true;//是否需要TimephasedData标签
private boolean isFinish=false;//该任务是否完成
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//时间格式
private String name = "";//当前标签的名称
private String startTime = "";//开始日期的时分秒
private String endTime = "";//完成日期的时分秒
private String FieldID="";//自定义标签的编号
private static AppProjectDetailEntity detEntity = null;//当前计划
private static List<AppProjectDetailEntity> listProDet = new ArrayList<>();//需要更新到xml的计划
private static List<Map<String,Object>> listCalendar = new ArrayList<>();//默认日历
public String getXmlContent(File file,List<AppProjectDetailEntity> listProDet,List<Map<String,Object>> listCalendar,boolean isNeedTimephasedData){
if(listProDet == null)
listProDet = new ArrayList<>();
this.listProDet = listProDet;
if(listCalendar == null)
listCalendar = new ArrayList<>();
this.listCalendar = listCalendar;
this.isNeedTimephasedData = isNeedTimephasedData;
long sT = System.currentTimeMillis();
int len = new Long(file.length()).intValue();
sb.setLength(len);
XmlHelper xmlHelper=new XmlHelper();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
sp.parse(file,xmlHelper);
} catch (IOException e) {
e.printStackTrace();
return null;
} catch (ParserConfigurationException e) {
e.printStackTrace();
return null;
} catch (SAXException e) {
e.printStackTrace();
return null;
}finally {
sb.setLength(0);
listCalendar.clear();
}
//System.out.println("耗时"+((System.currentTimeMillis()-sT)/1000)+"秒"+isNeedTimephasedData);
return xmlHelper.getSb();
}
//标签开始事件
@Override
public void startElement(String uri, String localName, String qName, Attributes att) throws SAXException {
name = qName;
//判断是否进入任务或资源标签里面
if(ProjectField.Task.toString().equals(name)){
isTask=true;
isAssignment = false;
}else if(ProjectField.ExtendedAttribute.toString().equals(name)){
isExtendedAttribute=true;
}else if(ProjectField.Assignment.toString().equals(name)){
isTask = false;
isAssignment = true;
}else if(ProjectField.TimephasedData.toString().equals(name)){
isTimephasedData = true;
}else if(needDelete.contains(";"+name+";")){
//System.out.println(name);
isDel = true;
}
if(isDeleteTag()){
return;
}
//标签名称
sb.append("<"+name);
//标签属性
for(int i = 0;i < att.getLength();i++){
sb.append(" "+att.getQName(i)+"=\""+att.getValue(i)+"\"");
}
sb.append(">");
}
//非标签事件
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
String value=new String(ch,start,length);
//if(detEntity !=null && detEntity.getUniqueId() == 5754){
// System.out.println(name);
//}
if(isDeleteTag() || ProjectField.TimephasedData.toString().equals(name)){
return;
}
if((isTask || isAssignment) && StringUtils.isNotBlank(value)){//进入任务或分配
if((isTask && ProjectField.UID.toString().equals(name)) || (isAssignment && ProjectField.TaskUID.toString().equals(name))){
try{
boolean isHave = false;
for(AppProjectDetailEntity entity : listProDet){
if(Integer.parseInt(value) == entity.getUniqueId()){
isHave = true;
detEntity = entity;
Calendar c = Calendar.getInstance();
c.setTime(detEntity.getStartDate());
String weekStr1 = WEEKS[c.get(Calendar.DAY_OF_WEEK)-1];
c.setTime(detEntity.getEndDate());
String weekStr2 = WEEKS[c.get(Calendar.DAY_OF_WEEK)-1];
for(Map<String,Object> map : listCalendar){
if(map.get("day_name") == null || map.get("is_work") == null || !"WORKING".equalsIgnoreCase(map.get("is_work").toString())){
continue;
}
String[] hours = (String[]) map.get("hours");
if(map.get("day_name").toString().equalsIgnoreCase(weekStr1)){
startTime = "T"+hours[0];
}if(map.get("day_name").toString().equalsIgnoreCase(weekStr2)){
endTime = "T"+hours[hours.length-1];
}
}
//System.out.println(startTime+" "+endTime);
//未完成的任务不需要新增标签
if(detEntity.getTaskState() != 1){
isFinish = false;
}else{
isFinish = true;
}
break;
}
}
if(!isHave){
detEntity = null;
}
}catch (Exception e){}
}else if(detEntity != null){
value = getValueByTaskOrAssignment(value);
}
}
if((ProjectField.Duration.toString().equals(name) || ProjectField.ManualDuration.toString().equals(name) || ProjectField.RemainingDuration.toString().equals(name) || ProjectField.Work.toString().equals(name) || ProjectField.RegularWork.toString().equals(name) || ProjectField.RemainingWork.toString().equals(name) || ProjectField.RemainingOvertimeWork.toString().equals(name) || ProjectField.OvertimeWork.toString().equals(name) || ProjectField.ActualDuration.toString().equals(name) || ProjectField.ActualWork.toString().equals(name) || ProjectField.ActualOvertimeWork.toString().equals(name)) && value.contains("-")){
value = value.replaceAll("-","");
}
sb.append(value);
}
//标签结束事件
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
name = qName;
//需要新增的标签Stop、Resume、
if(ProjectField.Task.toString().equals(name) || ProjectField.Assignment.toString().equals(name)){
if(detEntity != null){
//已经完成的计划
if(isFinish && isNeedTimephasedData){
//新增标签
String[] adds = ADD_DEL.split(";");
for(int i = 0;i < adds.length;i++){
String addName = adds[i];
if(StringUtils.isBlank(addName))
continue;
String value = "";
if(ProjectField.ActualStart.toString().equals(addName)){
value = sdf.format(detEntity.getStartDate())+startTime;
}else if(ProjectField.ActualFinish.toString().equals(addName) || ProjectField.Stop.toString().equals(addName) || ProjectField.Resume.toString().equals(addName)){
value = sdf.format(detEntity.getEndDate())+endTime;
}
if(i == adds.length-1){
sb.append("<"+addName+">"+value+"</"+addName+">\n\t\t");
}else{
sb.append("<"+addName+">"+value+"</"+addName+">\n\t\t\t");
}
}
}
if(isNeedTimephasedData && ProjectField.Assignment.toString().equals(name) && detEntity.getAssUniqueId() != null)
getTimephasedData();
}
//对任务和分配标签的操作结束
isTask = false;
isAssignment = false;
detEntity = null;
}else if(ProjectField.ExtendedAttribute.toString().equals(name) && isExtendedAttribute){
isExtendedAttribute = false;
FieldID = "";
}
if(isDeleteTag()){
if(ProjectField.TimephasedData.toString().equals(name))
isTimephasedData = false;
if(needDelete.contains(";"+name+";"))
isDel = false;
return;
}
sb.append("</"+name+">");
}
private String getValueByTaskOrAssignment(String value){
if(isExtendedAttribute){
if(ProjectField.FieldID.toString().equals(name)){
FieldID = value;
}else if(ProjectField.Value.toString().equals(name)){
if(ProjectField.FieldID_TEXT_9.toString().equals(FieldID)){//文本9,责任成员ID
value = detEntity.getMemberId();
}else if(ProjectField.FieldID_TEXT_10.toString().equals(FieldID)){//文本10,责任成员名称
value = detEntity.getMemberName();
}else if(ProjectField.FieldID_TEXT_11.toString().equals(FieldID)){//文本11,责任单位ID
value = detEntity.getCustomId();
}else if(ProjectField.FieldID_TEXT_12.toString().equals(FieldID)){//文本12,责任单位名称
value = detEntity.getCustomName();
}else if(ProjectField.FieldID_NUM_6.toString().equals(FieldID)){//数字6,任务状态:未开始(-1)、进行中(0)、完成(1)
value = detEntity.getTaskState().toString();
}else if(ProjectField.FieldID_NUM_7.toString().equals(FieldID)){//数字7,实测实量期限
value = detEntity.getTaskMeasureTerm().toString();
}else if(ProjectField.FieldID_NUM_8.toString().equals(FieldID)){//数字8,实测实量提前量
value = detEntity.getTaskMeasureRemind().toString();
}else if(ProjectField.FieldID_NUM_9.toString().equals(FieldID)){//数字9,提醒
value = detEntity.getTaskRemind().toString();
}else if(ProjectField.FieldID_NUM_10.toString().equals(FieldID)){//数字10,管控级别
value = detEntity.getTaskLevel().toString();
}
if(StringUtils.isBlank(value))
value = "";
}
}else if(ProjectField.Start.toString().equals(name) || ProjectField.EarlyStart.toString().equals(name) || ProjectField.LateStart.toString().equals(name) || ProjectField.ManualStart.toString().equals(name)){
if(StringUtils.isBlank(startTime))
startTime = "T"+value.split("T")[1];
value = sdf.format(detEntity.getStartDate())+startTime;
}else if(ProjectField.Finish.toString().equals(name) || ProjectField.EarlyFinish.toString().equals(name) || ProjectField.LateFinish.toString().equals(name) || ProjectField.ManualFinish.toString().equals(name)){
if(StringUtils.isBlank(endTime))
endTime = "T"+value.split("T")[1];
value = sdf.format(detEntity.getEndDate())+endTime;
}else if(ProjectField.Duration.toString().equals(name) || ProjectField.ManualDuration.toString().equals(name) || ProjectField.RemainingDuration.toString().equals(name) || (!isFinish && isAssignment && (ProjectField.Work.toString().equals(name) || ProjectField.RegularWork.toString().equals(name) || ProjectField.RemainingWork.toString().equals(name))) || (isFinish && (ProjectField.Work.toString().equals(name) || ProjectField.RegularWork.toString().equals(name)))){
//工期
value = getDuration(detEntity.getDuration().intValue());
}else if(ProjectField.StartVariance.toString().equals(name) || ProjectField.FinishVariance.toString().equals(name) || ProjectField.FreeSlack.toString().equals(name) || ProjectField.Delay.toString().equals(name) || (isFinish && (ProjectField.TotalSlack.toString().equals(name) || ProjectField.StartSlack.toString().equals(name) || ProjectField.FinishSlack.toString().equals(name)))){
value = "0";
}else if(ProjectField.WorkVariance.toString().equals(name)){
value = "0.00";
}else if(ProjectField.ActualOvertimeWork.toString().equals(name) || ProjectField.RemainingOvertimeWork.toString().equals(name) || ProjectField.OvertimeWork.toString().equals(name) || (!isFinish && isTask && (ProjectField.Work.toString().equals(name) || ProjectField.RegularWork.toString().equals(name) || ProjectField.RemainingWork.toString().equals(name))) || (isFinish && ProjectField.RemainingWork.toString().equals(name))){
value = getDuration(0);
}else if(ProjectField.DurationFormat.toString().equals(name)){
value = "7";//日期格式按天计算
}
if(!isFinish){
//任务未完成
if(ProjectField.ActualDuration.toString().equals(name) || ProjectField.ActualWork.toString().equals(name)){
value = getDuration(0);
}else if(ProjectField.PercentComplete.toString().equals(name) || ProjectField.PercentWorkComplete.toString().equals(name)){
value = "0";
}
}else{
//任务已经完成
if(ProjectField.ActualDuration.toString().equals(name) || ProjectField.ActualWork.toString().equals(name)){
value = getDuration(detEntity.getDuration().intValue());
}else if(ProjectField.PercentComplete.toString().equals(name) || ProjectField.PercentWorkComplete.toString().equals(name)){
value = "100";//完成百分比,工作完成百分比
}
}
return value;
}
//判断是否为需要删除的标签
private boolean isDeleteTag(){
return (isTimephasedData || (isNeedTimephasedData && ADD_DEL.contains(";"+name+";")) || isDel);
}
//拼装TimephasedData标签
private void getTimephasedData(){
//添加TimephasedData标签
try{
Date start = sdf.parse(sdf.format(detEntity.getStartDate()));
Date end = sdf.parse(sdf.format(detEntity.getEndDate()));
Calendar c = Calendar.getInstance();
c.setTime(start);
do{
//<TimephasedData>
// <Type>1</Type>
// <UID>20244</UID>
// <Start>2017-07-13T08:00:00</Start>
// <Finish>2017-07-14T08:00:00</Finish>
// <Unit>2</Unit>
// <Value>PH8H0M0S</Value>
//</TimephasedData>
Date s = c.getTime();
//判断开始这一天是否为工作日
boolean isWork = true;
for(Map<String,Object> map : listCalendar){
if(map.get("exception") != null){
for(String exc : (String[])map.get("exception")){
if(s.equals(sdf.parse(exc))){
isWork = false;
break;
}
}
if(!isWork)
break;
}if(map.get("day_name") != null && map.get("day_name").toString().equalsIgnoreCase(WEEKS[c.get(Calendar.DAY_OF_WEEK)-1])){
//"day_name":"WEDNESDAY","hours":"8;12;13;17","is_work":"WORKING"
if(map.get("is_work") != null && "WORKING".equalsIgnoreCase(map.get("is_work").toString())){
isWork = true;
}else{
isWork = false;
}
break;
}
}
c.set(Calendar.DAY_OF_MONTH,c.get(Calendar.DAY_OF_MONTH)+1);
sb.append("\t<TimephasedData>\n\t\t\t\t");
sb.append("<Type>"+(isFinish?2:1)+"</Type>\n\t\t\t\t");//1表示未完成,2表示已经完成
sb.append("<UID>"+detEntity.getAssUniqueId()+"</UID>\n\t\t\t\t");
sb.append("<Start>"+(sdf.format(s))+startTime+"</Start>\n\t\t\t\t");
sb.append("<Finish>"+(s.equals(end)?(sdf.format(s)+endTime):(sdf.format(c.getTime())+startTime))+"</Finish>\n\t\t\t\t");
sb.append("<Unit>1</Unit>\n\t\t\t\t");
sb.append("<Value>"+(isWork?getDuration(1):"")+"</Value>\n\t\t\t");
sb.append("</TimephasedData>\n\t\t");
}while (!end.before(c.getTime()));
}catch (Exception e){
e.printStackTrace();
}
}
//计算工期
private String getDuration(int day){
String duration = "PT"+(day*8)+"H0M0S";
return duration;
}
public String getSb(){
return this.sb.toString();
}
}
package eiis.app.project.entity;
import javax.persistence.*;
import java.math.BigDecimal;
import java.sql.Timestamp;
/**
* Created by SSKJ on 2017/7/11.
*/
@Entity
@Table(name = "app_project_detail")
public class AppProjectDetailEntity {
private String taskId;
private String taskParentId;
private Integer parentId;
private Integer uniqueId;
private Integer assUniqueId;
private String outlineNumber;
private String taskName;
private String taskNameAll;
private String taskPlanType;
private String taskType;
private Integer taskLevel;
private Integer taskState;
private Integer taskRemind;
private BigDecimal progress;
private Timestamp plannedEndDate;
private BigDecimal plannedDuration;
private Timestamp plannedStartDate;
private Timestamp startDate;
private Timestamp endDate;
private BigDecimal duration;
private String projectId;
private String projectSection;
private String customId;
private String customName;
private String memberId;
private String memberName;
private Integer childrenCount;
private BigDecimal finishCompare;
private String predecessors;
private String preSourceId;
private Integer preTargetId;
private String preLag;
private String preType;
private Integer taskMeasureTerm;
private Integer taskMeasureRemind;
private String originalCode;
private String comment;
private Boolean isValid = false;
private Boolean canQuery = false;
private Double taskTextX;
private Double taskTextY;
@Id
@Column(name = "TASK_ID")
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
@Basic
@Column(name = "TASK_PARENT_ID")
public String getTaskParentId() {
return taskParentId;
}
public void setTaskParentId(String taskParentId) {
this.taskParentId = taskParentId;
}
@Basic
@Column(name = "PARENT_ID")
public Integer getParentId() {
return parentId;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
@Basic
@Column(name = "UNIQUE_ID")
public Integer getUniqueId() {return uniqueId;}
public void setUniqueId(Integer uniqueId) {this.uniqueId = uniqueId;}
@Basic
@Column(name = "ASS_UNIQUE_ID")
public Integer getAssUniqueId() {
return assUniqueId;
}
public void setAssUniqueId(Integer assUniqueId) {
this.assUniqueId = assUniqueId;
}
@Basic
@Column(name = "OUTLINE_NUMBER")
public String getOutlineNumber() {
return outlineNumber;
}
public void setOutlineNumber(String outlineNumber) {
this.outlineNumber = outlineNumber;
}
@Basic
@Column(name = "TASK_NAME")
public String getTaskName() {
return taskName;
}
public void setTaskName(String taskName) {
this.taskName = taskName;
}
@Basic
@Column(name = "TASK_NAME_ALL")
public String getTaskNameAll() {return taskNameAll;}
public void setTaskNameAll(String taskNameAll) {this.taskNameAll = taskNameAll;}
@Basic
@Column(name = "TASK_PLAN_TYPE")
public String getTaskPlanType() {
return taskPlanType;
}
public void setTaskPlanType(String taskPlanType) {
this.taskPlanType = taskPlanType;
}
@Basic
@Column(name = "TASK_TYPE")
public String getTaskType() {
return taskType;
}
public void setTaskType(String taskType) {
this.taskType = taskType;
}
@Basic
@Column(name = "TASK_LEVEL")
public Integer getTaskLevel() {
return taskLevel;
}
public void setTaskLevel(Integer taskLevel) {
this.taskLevel = taskLevel;
}
@Basic
@Column(name = "TASK_STATE")
public Integer getTaskState() {
return taskState;
}
public void setTaskState(Integer taskState) {
this.taskState = taskState;
}
@Basic
@Column(name = "TASK_REMIND")
public Integer getTaskRemind() {
return taskRemind;
}
public void setTaskRemind(Integer taskRemind) {
this.taskRemind = taskRemind;
}
@Basic
@Column(name = "PROGRESS")
public BigDecimal getProgress() {
return progress;
}
public void setProgress(BigDecimal progress) {
this.progress = progress;
}
@Basic
@Column(name = "PLANNED_START_DATE")
public Timestamp getPlannedStartDate() {
return plannedStartDate;
}
public void setPlannedStartDate(Timestamp plannedStartDate) {
this.plannedStartDate = plannedStartDate;
}
@Basic
@Column(name = "PLANNED_END_DATE")
public Timestamp getPlannedEndDate() {
return plannedEndDate;
}
public void setPlannedEndDate(Timestamp plannedEndDate) {
this.plannedEndDate = plannedEndDate;
}
@Basic
@Column(name = "PLANNED_DURATION")
public BigDecimal getPlannedDuration() {
return plannedDuration;
}
public void setPlannedDuration(BigDecimal plannedDuration) {
this.plannedDuration = plannedDuration;
}
@Basic
@Column(name = "START_DATE")
public Timestamp getStartDate() {
return startDate;
}
public void setStartDate(Timestamp startDate) {
this.startDate = startDate;
}
@Basic
@Column(name = "END_DATE")
public Timestamp getEndDate() {
return endDate;
}
public void setEndDate(Timestamp endDate) {
this.endDate = endDate;
}
@Basic
@Column(name = "DURATION")
public BigDecimal getDuration() {
return duration;
}
public void setDuration(BigDecimal duration) {
this.duration = duration;
}
@Basic
@Column(name = "PROJECT_ID")
public String getProjectId() {
return projectId;
}
public void setProjectId(String projectId) {
this.projectId = projectId;
}
@Basic
@Column(name = "PROJECT_SECTION")
public String getProjectSection() {
return projectSection;
}
public void setProjectSection(String projectSection) {
this.projectSection = projectSection;
}
@Basic
@Column(name = "CUSTOM_ID")
public String getCustomId() {
return customId;
}
public void setCustomId(String customId) {
this.customId = customId;
}
@Basic
@Column(name = "CUSTOM_NAME")
public String getCustomName() {
return customName;
}
public void setCustomName(String customName) {
this.customName = customName;
}
@Basic
@Column(name = "MEMBER_ID")
public String getMemberId() {
return memberId;
}
public void setMemberId(String memberId) {
this.memberId = memberId;
}
@Basic
@Column(name = "MEMBER_NAME")
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
@Basic
@Column(name = "CHILDREN_COUNT")
public Integer getChildrenCount() {
return childrenCount;
}
public void setChildrenCount(Integer childrenCount) {
this.childrenCount = childrenCount;
}
@Basic
@Column(name = "FINISH_COMPARE")
public BigDecimal getFinishCompare() {
return finishCompare;
}
public void setFinishCompare(BigDecimal finishCompare) {
this.finishCompare = finishCompare;
}
@Basic
@Column(name = "PREDECESSORS")
public String getPredecessors() {
return predecessors;
}
public void setPredecessors(String predecessors) {
this.predecessors = predecessors;
}
@Basic
@Column(name = "PRE_SOURCE_ID")
public String getPreSourceId() {
return preSourceId;
}
public void setPreSourceId(String preSourceId) {
this.preSourceId = preSourceId;
}
@Basic
@Column(name = "PRE_TARGET_ID")
public Integer getPreTargetId() {
return preTargetId;
}
public void setPreTargetId(Integer preTargetId) {
this.preTargetId = preTargetId;
}
@Basic
@Column(name = "PRE_LAG")
public String getPreLag() {
return preLag;
}
public void setPreLag(String preLag) {
this.preLag = preLag;
}
@Basic
@Column(name = "PRE_TYPE")
public String getPreType() {
return preType;
}
public void setPreType(String preType) {
this.preType = preType;
}
@Basic
@Column(name = "TASK_MEASURE_TERM")
public Integer getTaskMeasureTerm() {return taskMeasureTerm;}
public void setTaskMeasureTerm(Integer taskMeasureTerm) {this.taskMeasureTerm = taskMeasureTerm;}
@Basic
@Column(name = "TASK_MEASURE_REMIND")
public Integer getTaskMeasureRemind() {return taskMeasureRemind;}
public void setTaskMeasureRemind(Integer taskMeasureRemind) {this.taskMeasureRemind = taskMeasureRemind;}
@Basic
@Column(name = "ORIGINAL_CODE")
public String getOriginalCode() {
return originalCode;
}
public void setOriginalCode(String originalCode) {
this.originalCode = originalCode;
}
@Basic
@Column(name = "COMMENT")
public String getComment() {
return comment;
}
public void setComment(String comment) {
this.comment = comment;
}
@Basic
@Column(name = "IS_VALID")
public Boolean getIsValid() {
return isValid;
}
public void setIsValid(Boolean isValid) {
this.isValid = isValid;
}
@Basic
@Column(name = "CAN_QUERY")
public Boolean getCanQuery() {
return canQuery;
}
public void setCanQuery(Boolean canQuery) {
this.canQuery = canQuery;
}
@Basic
@Column(name = "TASK_TEXTX")
public Double getTaskTextX() { return taskTextX; }
public void setTaskTextX(Double taskTextX) { this.taskTextX = taskTextX; }
@Basic
@Column(name = "TASK_TEXTY")
public Double getTaskTextY() { return taskTextY; }
public void setTaskTextY(Double taskTextY) { this.taskTextY = taskTextY; }
}
下面链接是该功能的概要
https://blog.youkuaiyun.com/xsb_20171227/article/details/78949891#commentsedit