一、前言,首先大致说下,大公司的基本流程。
1、需求评审:基本会用一人天来讲述大致需求,并分配需求到每个人头上
2、开发设计:需求下来后,根据自己的需求,到需求文档中查找自己对应的需求,根据自己的需求,做出对应的开发设计(一般以画图的形式,例如需求简单点的可以使用:EdrawMax,复杂的一般会使用时序图:Visual paradigm),开发设计里面会细节到开发的每一个业务流程步骤,如果开发设计出现问题,那么编写业务代码也将会是错的,所以这一步很重要很重要
3、设计评审:开发设计完成后,会组织一个会议,公司熟悉业务的大佬会过一下每个人的开发设计,若没问题则进入开发。有问题则标注问题点,会议结束后,将标注问题的地方修改好,重新过一下开发设计,没问题则再进行开发
4、代码评审:根据开发设计流程,一步一步编写业务代码,手上所有需求完成后,提交到代码至对应的分支(此时代码不会被合入,需要进行代码评审),评审若出现代码规范问题或者业务逻辑问题,则会被指出,并对问题点进行备注,后面所有代码评审完后,再进行修改。说明:若修改的地方不多,一般会被先合入到对应的分支中,再进行修改,修改完成再提交代码。反之,修改的地方比较多,则需要撤回代码,这个建议提前做好备份(我个人习惯,因人而异)
5、功能测试:代码提交并被合入到对应的分支后,需要和测试人员进行对应的功能点测试联调。一般是自己在本地先测试,测试没什么问题后,会通过jenkins部署到测试环境,测试环境多种场景测试没问题,测试人员会再指定的时间进行项目发版
6、修改BUG:测试人员在测试环境测试功能可能会出现BUG,自己可能测了很多个应用场景没问题,但是测试人员使用的应用场景可能会比你自测的场景多一些,所以就可能出现某个场景的BUG出现,这时候就需要修改对应的功能点,并重新提交代码,重新测试,测试所有功能点没问题后,才算通过
大致就那么多了吧,废话不多说了,上代码-------------->
二、代码部分
声明:这里只提供参考代码规范,代码规范有几点基本要求:
① 参数不得超过3个参数,超过3个参数必须用对象进行封装
② 命名规范,不得用中文去命名,可以对名字进行翻译后进行命名,且必须遵守驼峰的命名规范
③ 三层架构不可出现数字或字符串,若需要则需要单独再一个文件中编写,再三层代码中进行调用
④ 代码复用,使用前全局搜索是否已存在,在进行添加,不然项目代码过于冗余
Controller层:
package com.bat.outsoursing.workload.controller; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*;
/** * 工作量明细和汇总明细接口 * 查询,导出 * * @author liulei 工号 * @since 日期 上午11:03 */ @Api(tags = "工作量明细和汇总明细") @Slf4j @RestController @RequestMapping("/workloadDetail") public class WorkloadDetailController { @Autowired private WorkloadDetailService workloadDetailService; @ApiOperation("工作量汇总明细查询") @PostMapping(value = "/queryWorkloadSummaryDetail") @ResponseBody public BaseResp queryWorkloadSummaryDetail(@ApiParam(value = "查询参数", required = true) @RequestBody QueryParamqueryParam) { // 获取分页后的结果 PageRows voPageRows = workloadDetailService.workloadSummaryDetailBOList2VOList(queryParam); return BaseResp.ok(voPageRows); } }
Service层:
package com.bat.outsoursing.workload.service; import org.springframework.web.multipart.MultipartFile;
/** * 工作量明细和汇总明细接口 * 查询,导出 * @author liulei 工号 * @since 时间 上午11:32 */ public interface WorkloadDetailService { /** * 汇总明细BO转VO * * @param queryParam * @return */ PageRowsworkloadSummaryDetailBOList2VOList(QueryParam queryParam); }
实现类:
package com.bat.outsoursing.workload.service.impl;
import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import com.alibaba.excel.util.DateUtils; import com.alibaba.fastjson.JSON;import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.curator.shaded.com.google.common.collect.Maps; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; /** * 工作量明细和汇总明细 * 查询,导出,删除 接口 * * @author liulei 工号 * @since 日期 上午11:32 */ @Slf4j @Service("DOMESTIC_WORKLOAD_APPLICATION") public class WorkloadDetailServiceImpl extends AbstractImportExcelStrategy implements WorkloadDetailService {
@Override public PageRowsworkloadSummaryDetailBOList2VOList(QueryParam queryParam) { PageRows pageRows = PageUtils.doPageQuery(queryParam.getPageNum(), queryParam.getPageSize(), anything -> queryWorkloadSummaryDetail(queryParam)); //转换vo对象并返回 PageRows workloadSummaryDetailVOPageRows = new PageRows<>(); workloadSummaryDetailVOPageRows.setTotal(pageRows.getTotal()); workloadSummaryDetailVOPageRows.setCurrent(pageRows.getCurrent()); workloadSummaryDetailVOPageRows.setRows(workloadSummaryDetailConverter.workloadSummaryDetailBOList2VOList(pageRows.getRows())); return workloadSummaryDetailVOPageRows; }
/** * 查询拼接后的汇总明细List * * @param queryParam * @return */ private ListqueryWorkloadSummaryDetail(QueryParam queryParam) { // 根据工作量确认单id查询明细 List workloadSummaryDetailBOList = workloadDetailDAO.queryWorkloadSummaryDetail(queryParam.getParam()); // 根据工作量确认单id查询明细 if (CollectionUtils.isEmpty(workloadSummaryDetailBOList)) { return workloadSummaryDetailBOList; } // 从明细数据中获取prId并存储到list集合 List prIdList = workloadSummaryDetailBOList.stream().map(WorkloadSummaryDetailBO::getPrId).collect(Collectors.toList()); // 根据prIdList查询对应的所有采购区域 List purchasingAreaBOList = workloadDetailDAO.queryPurchasingAreaNames(prIdList); if (CollectionUtils.isEmpty(purchasingAreaBOList)) { return workloadSummaryDetailBOList; } // 采购区域实例转map对象 Map purchasingAreaBOListToMap = getPurchasingAreaBOListToMap(purchasingAreaBOList); // 汇总明细拼接采购区域 for (WorkloadSummaryDetailBO workloadSummaryDetailBO : workloadSummaryDetailBOList) { PurchasingAreaBO purchasingAreaBO = purchasingAreaBOListToMap.get(workloadSummaryDetailBO.getPrId()); if (null != purchasingAreaBO) { workloadSummaryDetailBO.setDescriptionEn(purchasingAreaBO.getDescriptionEn()); workloadSummaryDetailBO.setDescriptionZn(purchasingAreaBO.getDescriptionZh()); } } return workloadSummaryDetailBOList; }
/** * 采购区域实例转map对象 * * @param purchasingAreaBOList * @return */ private MapgetPurchasingAreaBOListToMap(List purchasingAreaBOList) { if (CollectionUtils.isEmpty(purchasingAreaBOList)) { return Maps.newHashMap(); } return purchasingAreaBOList.stream().filter(purchasingAreaBO -> purchasingAreaBO.getPrId() > 0).collect(Collectors.toMap(PurchasingAreaBO::getPrId, t -> t, (v1, v2) -> v2)); }
}
DAO层:
package com.bat.outsoursing.workload.dao; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 工作量明细和汇总明细 * 查询,导出,删除 接口 * * @author liulei 工号 * @since 日期 上午11:34 */ @Mapper public interface WorkloadDetailDAO {
/** * 根据工作量确认单id查询汇总明细 * * @param applyOid * @return */ ListqueryWorkloadSummaryDetail(Long applyOid);
/** * 根据prIdList查询对应的所有采购区域 * * @param prIdList * @return */ ListqueryPurchasingAreaNames(@Param("prIdList") List prIdList);
}
xxDAO.xml:
BO实体类(用于Service业务层,这里只介绍BO,同时还有PO,DTO,这里就不细谈了):
package com.bat.outsoursing.workload.bo; import lombok.Data; import java.math.BigDecimal; /** * 汇总明细BO * * @author liulei 工号 * @since 日期 下午3:38 */ @Data public class WorkloadSummaryDetailBO { /** * pr_id */ private Long prId; /** * PO行号 */ private String lineNum; /** * ITEM编码 */ private String itemNum; /** * ITEM名称 */ private String itemDescription; /** * 单位 */ private String unit; /** * 采购区域英文 */ private String descriptionEn; /** * 采购区域中文 */ private String descriptionZn; /** * 申请数量 */ private BigDecimal wccConfirmNum; }
VO实体类(用于Controller层返回,声明:BO转VO,字段一定是一致的,否则找不到):
package com.bat.outsoursing.workload.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.ToString; import java.math.BigDecimal; /** * 汇总明细VO * * @author liulei 工号 * @since 日期 下午4:56 */ @Data @ToString @ApiModel("汇总明细VO") public class WorkloadSummaryDetailVO { /** * PO行号 */ @ApiModelProperty("PO行号") private String lineNum; /** * ITEM编码 */ @ApiModelProperty("ITEM编码") private String itemNum; /** * ITEM名称 */ @ApiModelProperty("ITEM名称") private String itemDescription; /** * 单位 */ @ApiModelProperty("单位") private String unit; /** * 采购区域英文 */ @ApiModelProperty("采购区域英文") private String descriptionEn; /** * 采购区域中文 */ @ApiModelProperty("采购区域中文") private String descriptionZn; /** * 申请数量 */ @ApiModelProperty("申请数量") private BigDecimal wccConfirmNum; }
Converter(用于BO/PO/DTO转VO使用,至于如何转换,spring已经帮我们完成了,下面的@Mapper(componentModel="spring")就是 ):
package com.bat.outsoursing.workload.converter; import org.mapstruct.Mapper; import java.util.List; /** * 汇总明细BO转汇总明细VO * * @author liulei 工号 * @since 日期 下午4:56 */ @Mapper(componentModel = "spring") public interface WorkloadSummaryDetailConverter { /** * 汇总明细BOList转VOList * * @param workloadSummaryDetailBOList */ ListworkloadSummaryDetailBOList2VOList(List workloadSummaryDetailBOList); }