增删改查接口写法
各个层之间有什么关系
1.我们项目主要有以下几个层 searchbean、model、service、serviceImpl、mapper.xml、controller、dto、vo这几个层
2.各个层之间的关系
controller层会调用service层,service层会调用serviceImpl实现类层,serviceImpl层会调用mapper.xml。
controller层里面写的是方法的具体实现,中间数据的处理。
service层里面写的是增删改查的抽象方法。
serviceImpl层里面写的是service中抽象增删改查方法的具体实现,方法中也可以塞值,比如说新增方法中需要添加创建者姓名等也可以在其中加入。
mapper.xml层中我们写的是具体的mybatis实现,就是sql语句。
dto层主要是用来新增和修改是用的,其中除了可以在controller或者serviceImpl中直接塞值的可以不写,其它的新增页面中有的字段我们都要加上。
vo层中主要是用来进行页面展示的用处,可以将vo塞到list里面在页面上面显示,当然也可以对vo进行处理,比如说我在做项目的时候就遇到了一个比较坑爹的问题,就是一个页面上面是一张表中的内容不需要改变但是下面是另一张表中的内容需要添加多条数据。这就遇到了一个问题展示的时候我是查处的两张表的内容,但是上面一部分的内容不需要改变,只需要展示下面一部分的。所以我要在controller层中进行处理,我需要在一个vo中封装另外一个vo:比如费用报销接口中我就是在listvo中封装了vo的内容。
以上就是我们项目中的各个层
注意点
1.首先必须要检查数据库和需求,在明确了需求,数据库也正确的情况下再开始写代码,否则后期在写的时候会遇到很多的问题。比如说我之前在写接口的时候我连数据库中的字段分别代表页面中的那个字段都还没有该清楚就开始写了,导致我后期各个层之间的字段乱七八糟的一堆问题。
2.其次是dto和vo层中要加那些字段一定要搞清楚,比如说dto是用来新增和修改使用的,那么我们只需要加上新增页面中所需要用户填写的字段就可以了,不要增加很多无用的字段,因为这样会给前端人员带来很多的麻烦。
3.其次是我们在做项目的时候一定要自习自习,需要显示哪些字段修改哪些字段我们一定要搞清楚并且释放出来,不然虽然我们的功能可以实现,但是也会有很多的细小的bug。
4.我们在修改完一些东西之后一定要进行测试,因为可能我们在修改完一些东西之后将会导致系统异常,比如说我之前在mapper.xml里面添加了一个字段,但是我没有加上逗号,导致了系统异常,我也真的是无语了。
5.我们在测试的时候一定要结合数据库,比如说虽然页面上面显示我们已经成功了,但是一些字段我们可能并没有添加到数据库中。还有比如修改的时候虽然已经显示已经成功了,但是也会有一些数据并没有修改,这可能是我们在编写的时候一时疏忽大意导致的。
6.mapper.xml中的方法名称一定要和serviceImpl中的方法名称相对应,否则便会出现调错方法的现象。
出现的问题
1.首先我出现的问题是我对于框架中的各个层不是很了解,比如dto是用来新增和修改的,vo是用来显示列表页面的,这个我不是很清楚,所以导致我的代码中出现了大批量的重复字段。因为我之前是无脑的奖两个model中的字段全部都加进去了,我也是醉了。
2.其次我出现的问题是新增和修改的时候少字段,这个主要是因为我dto里面少字段导致的。
3.当一个页面中出现了多张表中的数据的时候我们应该单独的封装出一个modellist,用来在页面中显示数据,我们在mapper.xml中sql语句的返回值就可以是这个listmodel类型的了,我们在controller中也可以用这个listmodel来进行接收。
4.mapper.xml中sql语句的返回值,如果用到的是map进行返回,那么必须要检查上面是否写了这个map,如果没有我们也可以使用resultType进行返回,中间的内容我们用包名下的model来填充。
5.我们在controller层中调用service中的方法的时候我们要检查一下是否调用的是baseservice中的方法。之前我就出现过一个笑话,用的是baseservice中的方法,但是我以为调的是我自己写的方法呢。
接下来我就要讲下我今天联调费用报销接口中出现的问题。
1.首先因为费用报销接口的界面分为两部分比较的特殊。
2.因为以上的问题,所以我们将会用到一对多的方法。
首先是列表页面
我在费用报销列表的listmodel中添加了费用报销的明细表的集合对象
在费用报销列表的service中我们添加查询列表页面的方法是。其中我用的是listmodel接收的。
<E> PageInfo<ExpensePaidDetailListModel> selectExpensePaidDetailByPage(SearchCondition var1, ExpensePaidDetailSearchBean searchBean);
在费用报销l列表的serviceImpl里面的方法我是这样写的。其中我添加了一些在链表页面查询的时候可以自动带入的一些值,当然我同样也是用的listmodel接收的。
public <E> PageInfo<ExpensePaidDetailListModel> selectExpensePaidDetailByPage(SearchCondition searchCondition, ExpensePaidDetailSearchBean searchBean) {
if(searchBean.getCurrPage()<0){
searchCondition.setCurrPage(0);
}else{
searchCondition.setCurrPage(searchBean.getCurrPage());
}
if(searchBean.getPageSize()<0){
searchCondition.setPageSize(1);
}else{
searchCondition.setCurrPage(searchBean.getPageSize());
}
if(StringUtils.isNotEmpty(searchBean.getStartTime())){
searchBean.setStartTime(searchBean.getStartTime()+" 00:00:00");
}
if(StringUtils.isNotEmpty(searchBean.getEndTime())){
searchBean.setEndTime(searchBean.getEndTime()+" 23:59:59");
}
searchCondition.setSearchBean(searchBean);
PageInfo<ExpensePaidDetailListModel> listByPage = expensePaidDetailService.selectListPage(searchCondition);
return listByPage;
}
费用报销列表的mapper.xml中我是这样写的。首先我们要注意的就是返回值类型(在下面我将会附上返回值类型的map)
注意点1.resultmap一定是存在的map
2.字段一定不能少
3.oracle中的连接只能是两个两个相连接,如果多出一个就要再加上一个concat来进行连接。
<select id="selectListPage" resultMap="ExpensePaidDetailAddResultMap"
parameterType="com.founder.ssm.core.common.SearchCondition">
SELECT
FOEPD.DETAIL_ID,
FOEPD.EXPENSE_DESC,
FOEPD.EXPENSE_DT,
FOEPD.EXPENSE_AMOUNT,
FOEPD.EXPENSE_TYPE,
FOAI.APPLY_NO,
FOAI.APPLICANT_DEPARTMENT,
FOAI.APPLICANT_NAME,
FOAI.APPLY_TIME,
FOAI.APPLY_NAME,
FOAI.TOTAL_AMOUNT,
FOAI.APPLY_DESC,
BCTC.CODE_NAME AS APPLY_STATUS
FROM founder_oa_expense_paid_detail FOEPD
LEFT JOIN founder_oa_apply_info FOAI ON FOEPD.apply_no = FOAI.apply_no
LEFT JOIN BASE.COMM_T_CODE BCTC ON BCTC.CODE_VALUE = FOAI.APPLY_STATUS
<where>
BCTC.PARENT_ID = '302'
<if test="searchBean.startTime!=null and searchBean.startTime != ''">
AND FOAI.APPLY_TIME <![CDATA[>=]]> TO_DATE(#{searchBean.startTime},'yyyy-mm-dd hh24:mi:ss')
</if>
<if test="searchBean.endTime!=null and searchBean.endTime != ''">
AND FOAI.APPLY_TIME <![CDATA[<=]]> TO_DATE(#{searchBean.endTime},'yyyy-mm-dd hh24:mi:ss')
</if>
<if test="searchBean.applyNo != null and searchBean.applyNo != ''">
AND FOEPD.APPLY_NO = #{searchBean.applyNo,jdbcType=VARCHAR}
</if>
<if test="searchBean.keyWord != null and searchBean.keyWord != ''">
AND
(
FOAI.APPLY_NAME LIKE CONCAT(CONCAT ('%',#{searchBean.keyWord,jdbcType=VARCHAR}),'%')
OR FOAI.APPLY_NO LIKE CONCAT(CONCAT ('%',#{searchBean.keyWord,jdbcType=VARCHAR}),'%')
OR FOAI.APPLICANT_DEPARTMENT LIKE CONCAT(CONCAT ('%',#{searchBean.keyWord,jdbcType=VARCHAR}),'%')
OR FOAI.APPLICANT_NAME LIKE CONCAT(CONCAT ('%',#{searchBean.keyWord,jdbcType=VARCHAR}),'%')
)
</if>
</where>
ORDER BY FOEPD.CREATE_DT DESC
</select>
返回值类型的map,需要注意的就是collection中property=“expensePaidDetailModels”,还有 type=“com.yhkg.oa.model.ExpensePaidDetailListModel” ,最上面的应该是最大的那个model。
<resultMap type="com.yhkg.oa.model.ExpensePaidDetailListModel" id="ExpensePaidDetailAddResultMap">
<result column="APPLY_NO" property="applyNo" jdbcType="VARCHAR" />
<result column="APPLICANT_DEPARTMENT" property="applicantDepartment" jdbcType="VARCHAR" />
<result column="APPLICANT_NAME" property="applicantName" jdbcType="VARCHAR" />
<result column="APPLY_TIME" property="applyTime" jdbcType="TIMESTAMP" />
<result column="APPLY_NAME" property="applyName" jdbcType="VARCHAR" />
<result column="APPLY_DESC" property="applyDesc" jdbcType="VARCHAR" />
<result column="TOTAL_AMOUNT" property="totalAmount" jdbcType="NUMERIC" />
<result column="APPLY_STATUS" property="applyStatus" jdbcType="VARCHAR" />
<collection property="expensePaidDetailModels" ofType="com.yhkg.oa.model.ExpensePaidDetailModel">
<result column="EXPENSE_DT" property="expenseDt" jdbcType="TIMESTAMP" />
<result column="EXPENSE_AMOUNT" property="expenseAmount" jdbcType="VARCHAR" />
<result column="EXPENSE_TYPE" property="expenseType" jdbcType="VARCHAR" />
<result column="EXPENSE_DESC" property="expenseDesc" jdbcType="VARCHAR" />
</collection>
</resultMap>
费用报销列表的controller中我是这样写的。首先是要处理内部封装的list,然后将分装的listvo再塞进去。同时里面还封装了处理费用类型的方法。
public String list(@RequestBody ExpensePaidDetailSearchBean searchBean) {
try {
PageInfo<ExpensePaidDetailListModel> rows = expensePaidDetailService.selectExpensePaidDetailByPage(searchCondition,searchBean);
List<ExpensePaidDetailListVO> list = new ArrayList<ExpensePaidDetailListVO>();
for (ExpensePaidDetailListModel expensePaidDetailListModel : rows.getList()) {
ExpensePaidDetailListVO vo = new ExpensePaidDetailListVO();
BeanUtils.copyProperties(expensePaidDetailListModel,vo);
List<ExpensePaidDetailModel> expensePaidDetailModels = expensePaidDetailListModel.getExpensePaidDetailModels();
List<ExpensePaidDetailVO> expensePaidDetailVOS = new ArrayList<>();
if(expensePaidDetailModels!=null&&expensePaidDetailModels.size()>0){
for (ExpensePaidDetailModel expensePaidDetailModel:expensePaidDetailModels) {
ExpensePaidDetailVO expensePaidDetailVO = new ExpensePaidDetailVO();
BeanUtils.copyProperties(expensePaidDetailModel,expensePaidDetailVO ,"expenseType");
int expenseType = 0;
if(expensePaidDetailModel.getExpenseType()!=null&&expensePaidDetailModel.getExpenseType()!=""){
try{
expenseType = Integer.valueOf(expensePaidDetailModel.getExpenseType());
}catch (ClassCastException e){
logger.error(e.getMessage());
dataTablesResponse.error("费用类型转换失败");
}
}
expensePaidDetailVO.setExpenseType(expenseType);
expensePaidDetailVOS.add(expensePaidDetailVO);
}
}
vo.setExpensePaidDetailVOS(expensePaidDetailVOS);
list.add(vo);
}
dataTablesResponse.setData(list,rows);
} catch (SystemException e) {
logger.error(e.getMessage());
dataTablesResponse.error(e.getMessage());
} catch (Exception e) {
dataTablesResponse.error();
logger.error(e.getMessage(), e);
}
return JSONObject.toJSONString(dataTablesResponse, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteMapNullValue);
}
费用报销列表对象DTO封装的listDTO
费用报销列表VO封装的listVO
其次是费用报销的新增页面
费用报销新增页面的service中的方法如下
/**
* 插入数据
*/
void insertModel( List<ExpensePaidDetailModel> listModel,ApplyInfoModel applyModel) throws Exception;
费用报销插入页面serviceImpl中的方法如下。其中主要是用到了事物,这周六需要学习一下事物的知识。同时传入的参数也是list类型的。
/**
*插入数据
*/
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void insertModel(List<ExpensePaidDetailModel> listModel, ApplyInfoModel applyModel) throws Exception{ ;
/**
* 利用事物同时插入两张表
*/
applyModel.setApplyTime(new Date());
applyModel.setApplyStatus("0");
applyModel.setProcessStatus("草稿");
applyModel.setCreateDt(new Date());
applyModel.setUpdateDt(new Date());
applyInfoService.insert(applyModel);
if(listModel!=null&&listModel.size()>0){
expensePaidDetailService.insertBatch(listModel);
}
}
费用报销插入页面的mapper.xml中的代码如下。里面主要是用到了一个foreach方法。
<insert id="insertBatch" parameterType="List">
INSERT INTO FOUNDER_OA_EXPENSE_PAID_DETAIL
(DETAIL_ID,APPLY_NO,EXPENSE_DT,EXPENSE_TYPE,EXPENSE_AMOUNT,EXPENSE_DESC,CREATE_BY,CREATE_DT,UPDATE_BY,UPDATE_DT)
<foreach collection="list" item="item" index="index" separator="union all">
( select
#{item.detailId,jdbcType=VARCHAR},
#{item.applyNo,jdbcType=VARCHAR},
#{item.expenseDt,jdbcType=TIMESTAMP},
#{item.expenseType,jdbcType=VARCHAR},
#{item.expenseAmount,jdbcType=VARCHAR},
#{item.expenseDesc,jdbcType=VARCHAR},
#{item.createBy,jdbcType=VARCHAR},
#{item.createDt,jdbcType=TIMESTAMP},
#{item.updateBy,jdbcType=VARCHAR},
#{item.updateDt,jdbcType=TIMESTAMP}
from dual)
</foreach>
</insert>
费用报销插入页面的controller中的代码如下。其中也是设计到了需要处理分装的list对象。
@ApiOperation(value = "新增费用报销", notes = "新增费用报销")
@ApiImplicitParam(name = "dto", value = "审核实体ExpensePaidDetailAddDTO", dataType = "ExpensePaidDetailAddDTO")
@ApiResponses({@ApiResponse(code = CommonStatus.OK, message = "操作成功"),
@ApiResponse(code = CommonStatus.EXCEPTION, message = "服务器内部异常"),
})
@PostMapping(value = "/add", produces = "application/json;charset=UTF-8")
@ResponseBody
public String add(@RequestBody ExpensePaidDetailAddDTO dto) {
try {
ApplyInfoModel applyModel = new ApplyInfoModel();
applyModel.setApplyName(dto.getApplyName());
//新增和发起流程
/*long userId = this.getLoginUser().getUserId();
applyModel.setApplicantId(this.getLoginUser().getUserId());
applyModel.setApplicantName(this.getLoginUser().getName());
AppGroup curOrg = UimUtils.getOrg(userId);//获取所属公司
AppGroup curDept = UimUtils.getDept(userId);//获取所属部门*/
long userId = 1200119390;
applyModel.setApplicantId(1200119390);
applyModel.setApplicantName("admin");
AppGroup curOrg = UimUtils.getOrg(userId);//获取所属公司
AppGroup curDept = UimUtils.getDept(userId);//获取所属部门
if (curOrg != null) {
applyModel.setApplicantCompany(curOrg.getName());
applyModel.setApplicantCompanyId(new Long((int) curOrg.getId()));
}
if (curDept != null) {
applyModel.setApplicantDepartment(curDept.getName());
applyModel.setApplicantDepartmentId(new Long((int) curDept.getId()));
}
//applyModel.setApplicantName(this.getLoginUser().getName());
applyModel.setApplicantName("admin");
applyModel.setApplyName(dto.getApplyName());
applyModel.setApplyNo(dto.getApplyNo());
applyModel.setTotalAmount(dto.getTotalAmount());
applyModel.setApplyDesc(dto.getApplyDesc());
applyModel.setApplyType(ApplyTypeEnum.APPLY_EXPENSE_PAID_DETAIL.getApplyTypeCode());
applyModel.setApplyStatus("0");
List<ExpensePaidDetailDTO> list = dto.getExpensePaidDetailDTOs();
List<ExpensePaidDetailModel> listModel = new ArrayList<>(list.size());
if(list!=null&&list.size()>0){
for (ExpensePaidDetailDTO epdDTO:list) {
ExpensePaidDetailModel expensePaidDetailModel = new ExpensePaidDetailModel();
BeanUtils.copyProperties(epdDTO,expensePaidDetailModel);
expensePaidDetailModel.setCreateBy(String.valueOf(userId));
expensePaidDetailModel.setCreateDt(new Date());
expensePaidDetailModel.setUpdateBy(String.valueOf(userId));
expensePaidDetailModel.setUpdateDt(new Date());
expensePaidDetailModel.setApplyNo(dto.getApplyNo());
expensePaidDetailModel.setDetailId(serialnoService.getSequence("FOUNDER_OA_EXPENSE_PAID_DETAIL"));
listModel.add(expensePaidDetailModel);
}
}
expensePaidDetailService.insertModel(listModel,applyModel);
/* if (dto.getIsStartFlow()) {//如果点击是提交则添加流程
startWorkFlow(expensePaidDetailModel, applyModel);
}*/
} catch (SystemException e) {
logger.error(e.getMessage());
baseResponse.error(e.getMessage());
} catch (Exception e) {
baseResponse.error();
logger.error(e.getMessage(), e);
}
return JSONObject.toJSONString(baseResponse, SerializerFeature.WriteMapNullValue);
}
其次还有费用报销更新页面
费用报销更新页面中的service中的代码如下
void updateExpensePaidDetail( List<ExpensePaidDetailModel> listModel,ApplyInfoModel applyModel);
费用报销更新页面serviceImpl中的代码如下
/**
* 修改数据
*/
@Override
public void updateExpensePaidDetail( List<ExpensePaidDetailModel> listModel,ApplyInfoModel applyModel) {
ApplyInfoModel infoModel = applyInfoService.selectById(applyModel.getApplyNo());
if(infoModel!=null){
infoModel.setApplyName(applyModel.getApplyName());
infoModel.setUpdateDt(new Date());
infoModel.setUpdateBy(applyModel.getUpdateBy());
infoModel.setTotalAmount(applyModel.getTotalAmount());
infoModel.setApplyDesc(applyModel.getApplyDesc());
applyInfoService.update(infoModel);
}
String[] arr = {applyModel.getApplyNo()};
expensePaidDetailService.deleteBatch(arr);
if(listModel!=null&&listModel.size()>0){
expensePaidDetailService.insertBatch(listModel);
}
}
费用报销更新页面mapper.xml中的代码如下。这个代码我看到了带我大哥的聪慧,他先删掉了其中的数据,然后再将数据插入进去,这样也就实现了数据的更新。
<insert id="insertBatch" parameterType="List">
INSERT INTO FOUNDER_OA_EXPENSE_PAID_DETAIL
(DETAIL_ID,APPLY_NO,EXPENSE_DT,EXPENSE_TYPE,EXPENSE_AMOUNT,EXPENSE_DESC,CREATE_BY,CREATE_DT,UPDATE_BY,UPDATE_DT)
<foreach collection="list" item="item" index="index" separator="union all">
( select
#{item.detailId,jdbcType=VARCHAR},
#{item.applyNo,jdbcType=VARCHAR},
#{item.expenseDt,jdbcType=TIMESTAMP},
#{item.expenseType,jdbcType=VARCHAR},
#{item.expenseAmount,jdbcType=VARCHAR},
#{item.expenseDesc,jdbcType=VARCHAR},
#{item.createBy,jdbcType=VARCHAR},
#{item.createDt,jdbcType=TIMESTAMP},
#{item.updateBy,jdbcType=VARCHAR},
#{item.updateDt,jdbcType=TIMESTAMP}
from dual)
</foreach>
</insert>
费用报销更新页面controller中的代码如下。其中也是巧妙的使用了插入删除来达到更新的效果。
@ApiOperation(value="更新费用报销信息", notes="更新费用报销信息")
@ApiImplicitParam(name = "dto", value = "更新费用报销信息", dataType = "ExpensePaidDetailAddDTO")
@ApiResponses({ @ApiResponse(code = CommonStatus.OK, message = "操作成功"),
@ApiResponse(code = CommonStatus.EXCEPTION, message = "服务器内部异常"),
})
@PostMapping(value = "/update", produces = "application/json;charset=UTF-8")
@ResponseBody
public String update(@RequestBody ExpensePaidDetailAddDTO dto) {
try {
long userId = 1200119390;
ApplyInfoModel applyModel = new ApplyInfoModel();
applyModel.setApplyName(dto.getApplyName());
applyModel.setApplyNo(dto.getApplyNo());
applyModel.setTotalAmount(dto.getTotalAmount());
applyModel.setApplyDesc(dto.getApplyDesc());
applyModel.setUpdateBy(String.valueOf(userId));
List<ExpensePaidDetailDTO> list = dto.getExpensePaidDetailDTOs();
List<ExpensePaidDetailModel> listModel = new ArrayList<>(list.size());
if(list!=null&&list.size()>0){
for (ExpensePaidDetailDTO epdDTO:list) {
ExpensePaidDetailModel expensePaidDetailModel = new ExpensePaidDetailModel();
BeanUtils.copyProperties(epdDTO,expensePaidDetailModel);
expensePaidDetailModel.setCreateBy(String.valueOf(userId));
expensePaidDetailModel.setCreateDt(new Date());
expensePaidDetailModel.setUpdateBy(String.valueOf(userId));
expensePaidDetailModel.setUpdateDt(new Date());
expensePaidDetailModel.setApplyNo(dto.getApplyNo());
expensePaidDetailModel.setDetailId(serialnoService.getSequence("FOUNDER_OA_EXPENSE_PAID_DETAIL"));
listModel.add(expensePaidDetailModel);
}
}
expensePaidDetailService.updateExpensePaidDetail(listModel,applyModel);
/* applyModel = applyInfoService.selectById(dto.getApplyNo());
ApplyInfoModel applyModel = new ApplyInfoModel();
if (dto.getIsStartFlow()) {
startWorkFlow(expensePaidDetailModel, applyModel);
}*/
} catch (SystemException e) {
logger.error(e.getMessage());
baseResponse.error(e.getMessage());
} catch (Exception e) {
baseResponse.error();
logger.error(e.getMessage(), e);
}
return JSONObject.toJSONString(baseResponse, SerializerFeature.WriteMapNullValue);
}
费用报销修改页面中的方法,主要是要将数据在页面上面显示出来,方便前端的工作。
@ApiOperation(value = "获取费用报销信息进行编辑", notes = "根据url的id来获取费用报销详细信息")
@ApiImplicitParam(name = "applyNo", value = "费用报销ID", dataType = "String")
@ApiResponses({@ApiResponse(code = CommonStatus.OK, message = "操作成功"),
@ApiResponse(code = CommonStatus.EXCEPTION, message = "服务器内部异常"),
})
@GetMapping(value = "/toEdit", produces = "application/json;charset=UTF-8")
@ResponseBody
public String toEdit(String dealMark, String applyNo, ProcessBean processBean, String steps) {
try {
SimpleDateFormat formatter1 = new SimpleDateFormat("yyyyMMdd");
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
ApplyInfoVO applyInfoVO = new ApplyInfoVO();
if ("add".equals(dealMark)) {
//查询基本信息
/* long userId = this.getLoginUser().getUserId();
AppGroup curOrg = UimUtils.getOrg(userId);//获取所属公司
AppGroup curDept = UimUtils.getDept(userId);//获取所属部门
String createByName = this.getLoginUser().getName();*/
long userId = 1200119390;
AppGroup curOrg = UimUtils.getOrg(1200119390);//获取所属公司
AppGroup curDept = UimUtils.getDept(1200119390);//获取所属部门
String createByName = "admin";
Date currentTime = new Date();
String createDt = formatter.format(currentTime);
applyInfoVO.setApplicantCompany(curOrg.getName());
applyInfoVO.setApplicantDepartment(curDept.getName());
applyInfoVO.setApplicantName(createByName);
applyInfoVO.setProcessStatus("0");
applyInfoVO.setApplyTime(createDt);
String applyNo1 = "EXPD" + formatter1.format(currentTime) + serialnoService.getSequence("FOUNDER_OA_EXPENSE_PAID_DETAIL");
applyInfoVO.setApplyNo(applyNo1);
dataResponse.setData(applyInfoVO);
}
if ("update".equals(dealMark)) {
ExpensePaidDetailModel expensePaidDetailModel = new ExpensePaidDetailModel();
expensePaidDetailModel.setApplyNo(applyNo);
List<ExpensePaidDetailListModel> expensePaidDetailListModels = expensePaidDetailService.selectList(expensePaidDetailModel);
ExpensePaidDetailListModel model = new ExpensePaidDetailListModel();
if (expensePaidDetailListModels != null && expensePaidDetailListModels.size() > 0) {
ExpensePaidDetailListVO formData = new ExpensePaidDetailListVO();
model = expensePaidDetailListModels.get(0);
BeanUtils.copyProperties(model, formData);
dataResponse.setData(formData);
String createDt = formatter.format(model.getApplyTime());
AppGroup curOrg = UimUtils.getOrg(Long.valueOf(model.getCreateBy()).longValue());//获取所属公司
AppGroup curDept = UimUtils.getDept(Long.valueOf(model.getCreateBy()).longValue());//获取所属部门
String name = UimUtils.getUser(Long.valueOf(model.getCreateBy()).longValue()).getName();
applyInfoVO.setApplicantCompany(curOrg.getName());
applyInfoVO.setApplicantDepartment(curDept.getName());
applyInfoVO.setApplicantName(name);
applyInfoVO.setProcessStatus("0");
applyInfoVO.setApplyTime(createDt);
applyInfoVO.setApplyNo(model.getApplyNo());
//dataResponse.setData(applyInfoVO);
}else{
dataResponse.setData(null);
}
}
} catch (SystemException e) {
logger.error(e.getMessage());
dataResponse.error(e.getMessage());
} catch (Exception e) {
dataResponse.error();
logger.error(e.getMessage(), e);
}
return JSONObject.toJSONString(dataResponse, SerializerFeature.WriteMapNullValue);
}
费用报销删除页面
费用报销删除页面service中的代码
/**
* 通过主键列表逻辑删除
* @param ids
*/
void deleteByIds(List<String> ids, String userId)throws Exception;
费用报销删除页面serviceImpl中的代码
/**
*通过IDS进行逻辑删除
*/
@Override
@Transactional
public void deleteByIds(List<String> ids, String userId) {
String[] strArray = ids.toArray(new String[ids.size()]);
applyInfoService.deleteBatch(strArray);
expensePaidDetailService.deleteBatch(strArray);
}
费用报销删除页面中mapper.xml中的代码
<delete id="deleteBatch" parameterType="List">
DELETE FROM FOUNDER_OA_EXPENSE_PAID_DETAIL WHERE APPLY_NO IN
<foreach collection="array" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</delete>
费用报销删除页面中controller中的代码
@ApiOperation(value = "删除It流程为保存(更新当前状态为0:删除)", notes = "根据url的id来删除费用报销信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "ids", value = "申请", required = true, dataType = "String"),
})
@GetMapping(value = "/delete", produces = "application/json;charset=UTF-8")
@ResponseBody
public String delete(@RequestParam("ids") String ids) {
try {
String[] idsArray = ids.split(",");
// expensePaidDetailService.deleteByIds(Arrays.asList(idsArray), this.getLoginUserId());
expensePaidDetailService.deleteByIds(Arrays.asList(idsArray), "1200119390");
} catch (SystemException e) {
logger.error(e.getMessage());
baseResponse.error(e.getMessage());
} catch (Exception e) {
baseResponse.error();
logger.error(e.getMessage(), e);
}
return JSONObject.toJSONString(baseResponse);
}
其次是费用报销的详情页面
费用报销详情页面中service中的代码
T selectById(String var1);
费用报销详情页面中serviceImpl中的代码
public T selectById(String id) {
return (BaseModel)this.baseDao.selectById(this.namespace, id);
}
费用报销详情页面中mapper.xml中的代码如下
<select id="selectById" parameterType="String" resultMap="ExpensePaidDetailResult">
SELECT
FOEPD.DETAIL_ID,
FOEPD.EXPENSE_DESC,
FOEPD.EXPENSE_DT,
FOEPD.EXPENSE_AMOUNT,
FOEPD.EXPENSE_TYPE,
FOAI.APPLY_NO,
FOAI.APPLICANT_DEPARTMENT,
FOAI.APPLICANT_NAME,
FOAI.APPLY_TIME,
FOAI.APPLY_NAME,
FOAI.TOTAL_AMOUNT,
FOAI.APPLY_DESC,
BCTC.CODE_NAME AS applyStatus
FROM founder_oa_expense_paid_detail FOEPD
LEFT JOIN founder_oa_apply_info FOAI ON FOEPD.apply_no = FOAI.apply_no
LEFT JOIN BASE.COMM_T_CODE BCTC ON BCTC.CODE_VALUE = FOAI.APPLY_STATUS
WHERE FOEPD.APPLY_NO = #{APPLY_NO,jdbcType=VARCHAR} AND FOAI.APPLY_NO = #{APPLY_NO,jdbcType=VARCHAR}
</select>
费用报销详情页面中controller中的代码
@ApiOperation(value = "获取费用报销详细信息", notes = "根据url的id来获取费用报销详细信息")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String")
@ApiResponses({@ApiResponse(code = CommonStatus.OK, message = "操作成功"),
@ApiResponse(code = CommonStatus.EXCEPTION, message = "服务器内部异常"),
})
@GetMapping(value = "/expensePaidDetailInfo", produces = "application/json;charset=UTF-8")
@ResponseBody
public String todetail(String id) {
try {
ExpensePaidDetailModel expensePaidDetailModel = new ExpensePaidDetailModel();
expensePaidDetailModel.setApplyNo(id);
List<ExpensePaidDetailListModel> modelList = expensePaidDetailService.selectList(expensePaidDetailModel);
ExpensePaidDetailListModel model = new ExpensePaidDetailListModel();
if(modelList!=null&&modelList.size()>0){
model = modelList.get(0);
}
ExpensePaidDetailListVO vo = new ExpensePaidDetailListVO();
BeanUtils.copyProperties(model, vo);
dataResponse.setData(vo);
} catch (SystemException e) {
logger.error(e.getMessage());
dataResponse.error(e.getMessage());
} catch (Exception e) {
dataResponse.error();
logger.error(e.getMessage(), e);
}
return JSONObject.toJSONString(dataResponse, SerializerFeature.WriteMapNullValue);
}
费用报销到处接口
@ApiOperation(value = "导出费用报销信息", notes = "根据查询信息导出费用报销信息")
@GetMapping(value = "/export")
@ResponseBody
public void export(@ModelAttribute ExpensePaidDetailSearchBean searchBean, HttpServletResponse response) {
try {
searchCondition.setSearchBean(searchBean);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
List<ExpensePaidDetailListModel> list = expensePaidDetailService.selectList("selectExportData", searchCondition);
String[] title = new String[]{"申请人", "所属部门", "申请日期", "金额", "费用发生时间", "表单状态"};
String fileName = "费用报销" + this.getLoginUser().getName();
List<String[]> dataList = new ArrayList<>();
for (ExpensePaidDetailListModel exModel : list) {
String[] data = new String[title.length];
data[1] = exModel.getApplyName();
data[2] = exModel.getApplicantDepartment();
data[3] = formatter.format(exModel.getApplyTime());
data[4] = Double.toString(exModel.getExpenseAmount());
data[5] = formatter.format(exModel.getApplyTime());
data[6] = exModel.getStatus();
dataList.add(data);
}
Workbook wb = ExportDataUtils.exportData(dataList, title, fileName);
if (wb != null) {
OutputStream out = null;
try {
out = response.getOutputStream();
// 告诉浏览器用什么软件可以打开此文件
response.setHeader("content-Type", "application/vnd.ms-excel");
// 下载文件的默认名称
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
wb.write(out);
out.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
}
} catch (SystemException e) {
logger.error(e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
总结
以上就是我这一个多月来的总结,日后每天我都会写一篇技术文档总结当天学到的东西。