package com.yeqifu.bus.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yeqifu.bus.entity.Goods;
import com.yeqifu.bus.entity.Outport;
import com.yeqifu.bus.entity.Provider;
import com.yeqifu.bus.service.IGoodsService;
import com.yeqifu.bus.service.IOutportService;
import com.yeqifu.bus.service.IProviderService;
import com.yeqifu.bus.vo.OutportVo;
import com.yeqifu.sys.common.DataGridView;
import com.yeqifu.sys.common.ResultObj;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
*
* InnoDB free: 9216 kB 前端控制器
*
*
* @author luoyi-
* @since 2019-12-19
*/
@RestController
@RequestMapping("/outport")
public class OutportController {
@Autowired
private IOutportService outportService;
@Autowired
private IProviderService providerService;
@Autowired
private IGoodsService goodsService;
/**
* 添加退货信息
* @param id 进货单ID
* @param number 退货数量
* @param remark 备注
* @return
*/
@RequestMapping("addOutport")
public ResultObj addOutport(Integer id,Integer number,String remark){
try {
outportService.addOutport(id,number,remark);
return ResultObj.BACKINPORT_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ResultObj.BACKINPORT_ERROR;
}
}
/**t
* 查询商品退货
* @param outportVo
* @return
*/
@RequestMapping("loadAllOutport")
public DataGridView loadAllOuport(OutportVo outportVo){
IPage page = new Page(outportVo.getPage(),outportVo.getLimit());
QueryWrapper queryWrapper = new QueryWrapper();
//对供应商进行查询
queryWrapper.eq(outportVo.getProviderid()!=null&&outportVo.getProviderid()!=0,"providerid",outportVo.getProviderid());
//对商品进行查询
queryWrapper.eq(outportVo.getGoodsid()!=null&&outportVo.getGoodsid()!=0,"goodsid",outportVo.getGoodsid());
//对时间进行查询要求大于开始时间小于结束时间
queryWrapper.ge(outportVo.getStartTime()!=null,"outputtime",outportVo.getStartTime());
queryWrapper.le(outportVo.getEndTime()!=null,"outputtime",outportVo.getEndTime());
//通过进货时间对商品进行排序
queryWrapper.orderByDesc("outputtime");
IPage page1 = outportService.page(page, queryWrapper);
List records = page1.getRecords();
for (Outport ouport : records) {
Provider provider = providerService.getById(ouport.getProviderid());
if (provider!=null){
//设置供应商姓名
ouport.setProvidername(provider.getProvidername());
}
Goods goods = goodsService.getById(ouport.getGoodsid());
if (goods!=null){
//设置商品名称
ouport.setGoodsname(goods.getGoodsname());
//设置商品规格
ouport.setSize(goods.getSize());
}
}
return new DataGridView(page1.getTotal(),page1.getRecords());
}
/**
* 删除退货信息
* @param id
* @return
*/
@RequestMapping("deleteOutport")
public ResultObj deleteOutport(Integer id){
try {
outportService.removeById(id);
return ResultObj.DELETE_SUCCESS;
} catch (Exception e) {
e.printStackTrace();
return ResultObj.DELETE_ERROR;
}
}
}
// OutportController类,使用了@RestController注解,表明这是一个Spring框架中的RESTful风格的控制器类,
// 用于处理与商品退货(Outport)相关的HTTP请求,并将处理结果以JSON等格式返回给客户端(通常是前端页面),是连接前端与后端业务逻辑的重要环节。
// 同时通过@RequestMapping("/outport")注解,为该控制器下的所有请求映射路径设置了一个公共的前缀"/outport",方便对相关的API进行统一管理和区分。
// 使用@Autowired注解自动注入IOutportService接口的实现类对象,用于调用与商品退货相关的业务逻辑方法,
// 例如添加退货信息、分页查询退货记录、删除退货信息等操作,具体的业务实现是在对应的服务层接口实现类中完成的,这里只是进行调用触发相应逻辑。
// 同样通过@Autowired注解注入IProviderService接口的实现类对象,用于获取供应商相关的业务服务,
// 在查询商品退货信息时,会借助该服务根据供应商ID查询供应商详细信息,以便补充到退货记录中展示更完整的数据。
// 注入IGoodsService接口的实现类对象,用于获取商品相关的业务服务,在查询商品退货信息时,通过该服务依据商品ID查询商品详情(如名称、规格等),
// 然后将这些商品相关信息设置到退货记录中,使返回给前端的数据更加丰富全面,方便前端展示和业务操作。
/**
* 添加退货信息
* @param id 进货单ID,用于明确此次退货操作是针对哪一笔进货业务进行的,是关联到具体进货记录的关键标识,由前端传入。
* @param number 退货数量,指定了要退回商品的具体数量,这个数量信息对于后续更新库存、统计退货数据等业务操作至关重要,同样由前端传入。
* @param remark 备注,用于记录一些额外的关于此次退货的相关情况说明,比如退货原因(是商品质量问题、数量不符还是其他原因等)、特殊的退货协商结果等内容,也是由前端传入。
* @return 返回一个ResultObj类型的结果对象,ResultObj中定义了诸如BACKINPORT_SUCCESS、BACKINPORT_ERROR等枚举值,用于明确表示添加退货信息操作的成功或失败状态,以便前端根据返回结果进行相应提示或处理。
*/
// 调用outportService的addOutport方法,将前端传入的进货单ID、退货数量和备注信息传递过去,触发服务层的添加退货信息业务逻辑,
// 该逻辑可能涉及到更新库存、在数据库中插入退货记录、处理与财务等相关模块的数据交互等一系列复杂操作,如果操作顺利完成则无异常抛出,若过程中出现问题(比如数据库操作失败、业务规则校验不通过等)则会抛出异常。
// 如果在添加退货信息过程中出现异常,打印异常堆栈信息(方便开发人员排查问题根源),然后返回表示添加退货信息失败的ResultObj.BACKINPORT_ERROR结果对象给前端,
// 使得前端能够知晓操作未成功,进而进行相应的提示告知用户或者采取其他补救措施等。
/**
* 查询商品退货
* @param outportVo 这是一个封装了查询条件的对象,通常包含分页相关信息(如页码、每页显示数量)以及其他筛选条件(如供应商ID、商品ID、时间范围等),由前端传入,方便在后端统一处理各种查询需求。
* @return 返回一个DataGridView对象,该对象一般是项目中自定义用于封装数据展示相关信息的,这里面包含了查询到的商品退货记录的总数量以及具体的退货记录列表,方便前端进行分页展示和数据处理等操作。
*/
// 创建一个IPage对象,用于实现分页功能,通过传入从outportVo对象中获取的当前页码(outportVo.getPage())和每页显示记录数量(outportVo.getLimit())来确定分页范围,
// 例如,当页码为2且每页显示数量为10时,表示要获取第2页,每页显示10条商品退货记录的那部分数据,方便对大量退货记录进行分页展示,提升前端展示和用户查看数据的体验。
// 创建一个QueryWrapper对象,用于构建查询条件,类似于构建SQL语句中的WHERE子句部分,方便灵活地添加各种筛选条件来精确查询符合要求的商品退货记录。
// 对供应商进行查询,如果outportVo对象中获取的供应商ID(outportVo.getProviderid())不为空且不等于0,说明前端传入了供应商筛选条件,
// 则添加一个相等性查询条件,在数据库表中对应"providerid"字段,查找与传入的供应商ID相等的退货记录,以此实现按供应商筛选退货信息的功能。
// 对商品进行查询,同理,当outportVo对象中获取的商品ID(outportVo.getGoodsid())不为空且不等于0时,表明前端传入了商品筛选条件,
// 就在数据库表的"goodsid"字段添加相等性查询条件,查找与传入商品ID匹配的退货记录,便于根据具体商品来查询其退货情况。
// 对时间进行查询要求大于开始时间小于结束时间,当outportVo对象中的开始时间(outportVo.getStartTime())不为空时,添加一个大于等于(ge)的查询条件,
// 在数据库表的"outputtime"字段(推测是退货时间字段)上,筛选出退货时间大于等于传入的开始时间的退货记录;同样,当结束时间(outportVo.getEndTime())不为空时,
// 添加一个小于等于(le)的查询条件,筛选出退货时间小于等于传入的结束时间的退货记录,这样就能获取到处于指定时间范围内的商品退货信息,方便按时间区间进行数据查询和统计分析等操作。
// 通过进货时间对商品进行排序,添加一个按照"outputtime"字段(退货时间)进行降序排序的条件,使得查询返回的退货记录按照退货时间从近到远的顺序排列,
// 这样在前端展示时,用户能先看到较新的退货记录,更符合一般的数据查看习惯,方便查看和分析近期的退货情况。
// 调用outportService的page方法,传入构建好的分页对象page和查询条件包装器queryWrapper,服务层会根据这些条件执行数据库查询操作,
// 获取符合条件的商品退货数据,并将数据填充到page对象中,例如设置page对象中的总记录数、当前页的记录列表等属性,最终返回填充好数据的page对象赋值给page1。
// 获取查询结果中当前页的退货记录列表,方便后续对每条记录进行补充相关信息的操作,比如添加供应商名称、商品名称和规格等,使返回给前端的数据更加完整详细。
// 遍历当前页查询到的每条商品退货记录,为每条记录补充供应商名称、商品名称和规格等信息,使其展示的数据更加丰富全面,方便前端展示和业务查看使用。
// 通过providerService的getById方法,根据当前退货记录中的供应商ID(ouport.getProviderid())从数据库中查询对应的供应商详细信息,获取到一个Provider对象(如果存在的话)。
// 如果查询到了对应的供应商信息,将供应商的名称设置到当前退货记录(ouport)中,以便前端展示退货记录时能同时显示供应商名称,让数据更直观、完整。
// 通过goodsService的getById方法,依据当前退货记录中的商品ID(ouport.getGoodsid())从数据库中查询对应的商品详细信息,获取到一个Goods对象(若存在的话)。
// 如果查询到了商品信息,将商品的名称设置到当前退货记录(ouport)中,方便前端展示退货记录时能呈现商品名称,使数据更具可读性。
// 同时将商品的规格信息也设置到当前退货记录(ouport)中,进一步丰富退货记录展示的数据内容,便于业务操作和查看详细情况。
// 创建一个DataGridView对象,将查询得到的商品退货记录的总数量(通过page1.getTotal()获取)以及当前页补充完整信息后的退货记录列表(page1.getRecords())进行封装,
// 最终返回给前端,使得前端能够按照分页逻辑展示商品退货信息,并且展示的数据包含了丰富的关联信息(供应商名称、商品名称和规格等),满足业务查看和操作的需求。
/**
* 删除退货信息
* @param id 要删除的退货记录的唯一标识符(通常是主键ID),由前端传入,通过这个ID来确定要从数据库中删除的具体退货记录。
* @return 返回一个ResultObj类型的结果对象,ResultObj中定义了如DELETE_SUCCESS、DELETE_ERROR等枚举值,用于表示删除退货信息操作的成功或失败状态,方便前端根据返回结果进行相应处理或提示用户。
*/
// 调用outportService的removeById方法,传入要删除的退货记录的ID,服务层会根据这个ID在数据库中找到对应的退货记录并执行删除操作,
// 如果删除操作顺利完成则无异常抛出,若出现问题(比如存在关联数据、违反数据库约束等)则会抛出异常。
// 如果在删除退货信息过程中出现异常,打印异常堆栈信息(便于开发人员排查问题),然后返回表示删除操作失败的ResultObj.DELETE_ERROR结果对象给前端,
// 让前端知晓删除操作未成功,以便采取相应的提示或其他处理措施。