前言
在本冲刺我主要负责的是项目这一模块,其中包含了项目、冲刺、用户故事、任务以及燃尽图的增删改查,在刚开始设计数据库的时候没有想得很全面,所有导致后面的修改较为麻烦,但这也是宝贵的经验,知道自己在设计方面还存在哪方面的问题,后续加以改正。
一、修改冲刺
注意:当该冲刺状态不是未开始都不能修改开始和完成时间、修改完成时要判断冲刺下的用户故事是否对已完成。
/**
* 修改冲刺
* @param spurt
* @return
*/
@RequestMapping("/updateSpurt")
@ResponseBody
public ResultInfo updateSpurt(@RequestBody Spurt spurt) throws ParseException {
ResultInfo info=spurtService.updateSpurt(spurt);
return info;
}
/**
* 修改冲刺(当该冲刺状态不是未开始都不能修改开始和完成时间)
* @param spurt
* @return
*/
@Override
public ResultInfo updateSpurt(Spurt spurt){
ResultInfo info=new ResultInfo();
info.setFlag(true);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date startTime = null;
Date endTime=null;
List<Date> betweenDates=null;
try {
if (spurt.getStartTime()!=null&&spurt.getEndTime()!=null){
startTime = sdf.parse(spurt.getStartTime());
endTime = sdf.parse(spurt.getEndTime());
betweenDates = getBetweenDates(startTime, endTime);
}
} catch (ParseException e) {
e.printStackTrace();
}
try {
Spurt spurtById=spurtMapper.selectSpurtBySpurtId(spurt.getId());
if(spurt.getStatus().equals("2")){
//根据冲刺id计算总数
int totalCount=userStoryMapper.selectCountTotal(spurt.getId());
//根据冲刺id计算完成的总数
int totalFinish=userStoryMapper.selectFinishTotal(spurt.getId());
if (totalCount==totalFinish){
spurtMapper.updateSpurt(spurt);
}else {
info.setFlag(false);
info.setErrorMsg("修改冲刺完成失败,请先完成当前冲刺下所有的用户故事!");
return info;
}
}
if (betweenDates==null){
spurt.setStartTime(null);
spurt.setEndTime(null);
spurtMapper.updateSpurt(spurt);
}else {
if (spurtById.getStatus().equals("3")){
//根据冲刺id删除时间
burnDownMapper.deleteBurnDownBySpurtId(spurt.getId());
//1.添加日期为开始的燃尽图
burnDownMapper.addStartBurnDown(spurt.getId());
for (Date betweenDate : betweenDates) {
//依次添加冲刺时间段的燃尽图
burnDownMapper.addBurnDown(sdf.format(betweenDate), spurt.getId());
}
spurtMapper.updateSpurt(spurt);
}else {
spurt.setStartTime(null);
spurt.setEndTime(null);
spurtMapper.updateSpurt(spurt);
}
}
}catch (Exception e){
info.setFlag(false);
info.setErrorMsg("修改失败!");
e.printStackTrace();
}
return info;
}
二、修改用户故事
注意:当前用户故事下的所有任务全部完成时才能修改完成状态、如何修改当前用户的故事点那么也会修改燃尽图中的数据。
/**
* 修改用户故事(修改状态已完成时需注意:当前用户故事下的所有任务全部完成时才能修改状态)
* @param userStory
* @return
*/
@RequestMapping("/updateUserStoryById")
@ResponseBody
public ResultInfo updateUserStoryById(@RequestBody UserStory userStory){
ResultInfo info=userStoryService.updateUserStoryById(userStory);
return info;
}
/**
* 修改用户故事(修改已完成时需注意:当前用户故事下的所有任务全部完成时才能修改)
* @param userStory
* @return
*/
@Override
public ResultInfo updateUserStoryById(UserStory userStory) {
ResultInfo info=new ResultInfo();
info.setFlag(true);
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
String currentDate = format.format(new Date());
//返回当前日期
Calendar cal = Calendar.getInstance();
// 负数当前时间往前,正数是往后
cal.add(Calendar.DATE, -1);
Date d = cal.getTime();
//前一天
String beforeCurrent = format.format(d);
//存储当前日期以及前面的日期
List<String> list=new ArrayList<String>();
try {
//根据用户故事id查询原有的用户故事
UserStory userStoryById = userStoryMapper.selectUserStoryById(userStory.getId()); //status=2:已完成
if (!userStory.getStatus().equals("2")){
//状态不为已完成时直接修改
userStoryMapper.updateUserStoryById(userStory);
}else {
//判断当前用户故事下的任务是否都已完成
//1.计算该用户故事下的任务总数
int countTotal=taskMapper.selectCountByUserStoryId(userStory.getId());
//2.计算该用户故事下的任务已完成的总数
int totalFinish=taskMapper.selectCountByUserStoryIdAndFinish(userStory.getId());
//3.判断
if (countTotal==totalFinish){
if (countTotal==0){
userStory.setStatus(userStoryById.getStatus());
}
userStoryMapper.updateUserStoryById(userStory);
if (userStoryById.getSpurtId()!=0){
//根据冲刺id查询用户故事总数
int selectCountTotal = userStoryMapper.selectCountTotal(userStoryById.getSpurtId());
//根据冲刺id查询用户故事已完成总数
int finishTotal = userStoryMapper.selectFinishTotal(userStoryById.getSpurtId());
//判断是否全部完成
if (selectCountTotal==finishTotal){
spurtMapper.updateSpurtStatus(userStoryById.getSpurtId(),2);
}
}
}else {
//避免修改到status
userStory.setStatus(userStoryById.getStatus());
userStoryMapper.updateUserStoryById(userStory);
info.setErrorMsg("修改已完成状态失败,请先完成当前用户故事下的所有任务!");
}
}
//判断用户故事点是否改变
if (userStory.getStoryPoint()!=0){
//已改变
//计算两个故事点的差值
double count=userStory.getStoryPoint()-userStoryById.getStoryPoint();
if (userStoryById.getSpurtId()!=0){
Spurt spurt = spurtMapper.selectSpurtBySpurtId(userStoryById.getSpurtId());
try {
List<Date> betweenDates = getBetweenDates(format.parse(spurt.getStartTime()), format.parse(spurt.getEndTime()));
for (Date betweenDate : betweenDates) {
list.add(format.format(betweenDate));
}
}catch (Exception e){
e.printStackTrace();
}
//查询冲刺总时长
double startTotal = burnDownMapper.selectStartTotal(userStoryById.getSpurtId());
//修改燃尽图总时长
burnDownMapper.updateBurnDownByStart(startTotal + count, userStoryById.getSpurtId());
for (int i = 0; i < list.size(); i++) {
//根据日期查询总时长
double selectTotal = burnDownMapper.selectTotal(list.get(i), spurt.getId());
if (currentDate.equals(list.get(i))) {
if (selectTotal == 0) {
if (spurt.getStartTime().equals(list.get(i))) {
beforeCurrent = "开始";
}
//查询前一天的总时长
double total = burnDownMapper.selectTotal(beforeCurrent, spurt.getId());
//修改当天的总时长
burnDownMapper.updateBurnDownTime(currentDate, total, spurt.getId());
} else {
burnDownMapper.updateBurnDownTime(currentDate, selectTotal + count, spurt.getId());
}
break;
} else {
burnDownMapper.updateBurnDownTime(list.get(i), selectTotal + count, spurt.getId());
}
}
}
}
}catch (Exception e){
info.setFlag(false);
info.setErrorMsg("修改失败!");
e.printStackTrace();
}
return info;
}
三、燃尽图
注意:每次修改用户故事的故事点、完成任务、删除任务等都会修改燃尽图的数据,所以每次操作都会很麻烦。这里我还有一个问题没有得到解决,那就是我希望每天都会调用查询燃尽图这个接口,但是可能会有人为影响,想有一个定时任务的功能。准备等到下一个冲刺解决。
/**
* 根据冲刺id查询燃尽图
* @param spurtId
* @return
*/
@RequestMapping("/selectBurnDownBySpurtId")
@ResponseBody
public ResultInfo selectBurnDownBySpurtId(@RequestParam("spurtId")int spurtId){
ResultInfo info=burnDownService.selectBurnDownBySpurtId(spurtId);
return info;
}
/**
* 根据冲刺id查询燃尽图
* @param spurtId
* @return
*/
@Override
public ResultInfo selectBurnDownBySpurtId(int spurtId) {
ResultInfo info=new ResultInfo();
info.setFlag(true);
//转换为年月日格式
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
String currentDate = format.format(new Date());
//返回当前日期
Calendar cal = Calendar.getInstance();
// 负数当前时间往前,正数是往后
//当天的前一天日期
cal.add(Calendar.DATE, -1);
Date d = cal.getTime();
String beforeOneCurrent = format.format(d);
try {
//根据冲刺id查询冲刺
Spurt spurt = spurtMapper.selectSpurtBySpurtId(spurtId);
try {
Date parse = format.parse(currentDate);
if (parse.after(format.parse(spurt.getEndTime()))){
currentDate=spurt.getEndTime();
beforeOneCurrent=spurt.getEndTime();
}
}catch (Exception e){
e.printStackTrace();
}
//查询当天的总时长
double selectCurrentTotal = burnDownMapper.selectTotal(currentDate, spurtId);
if (currentDate.equals(spurt.getStartTime())){
beforeOneCurrent="开始";
}
//查询前一天的总时长
double selectBeforeTotal = burnDownMapper.selectTotal(beforeOneCurrent, spurtId);
//判断当天的总时长
if (selectCurrentTotal==0){
burnDownMapper.updateBurnDownTime(currentDate,selectBeforeTotal,spurtId);
}
List<BurnDown> burnDownList=burnDownMapper.selectBurnDownBySpurtId(spurtId);
//
List<BurnDown> list=new ArrayList<BurnDown>();
for (BurnDown burnDown : burnDownList) {
if (burnDown.getTime().equals(currentDate)){
list.add(burnDown);
break;
}else {
list.add(burnDown);
}
}
info.setData(list);
}catch (Exception e){
info.setFlag(false);
info.setErrorMsg("查询失败!");
}
return info;
}
总结
有冲刺二的经验,这次冲刺相对于就要简单一点,更熟悉业务逻辑以及团队合作,但是还是会遇到很多问题,不过经过自己的探索很多问题都能得到解决,所有期待下一次会做得更好。