如何写一个接口
约 1632 字大约 5 分钟
如何写一个接口
此接口非彼接口。此接口是MVC的设计模式中的Controller层,一般我们会叫Controller层里的方法为接口。他们是负责
接收前端或者其它服务的传来的请求,并对请求进行相应的处理,最终再将处理结果返回给前端或者其它服务。
1.模糊分页查询
@RestController
@RequestMapping("camera")
public class CameraAlarmController {
@Autowired
private IWarehouseOutService warehouseOutService; //注入接口
/**
* 获取设备相关信息
* @param equipAttribute
* @param equipType
* @param keywords
* @param pageNum
* @param pageSize
* @return
*/
@GetMapping("getOutboundEquipmentInfo")
public Result getOutboundEquipmentInfo(@RequestParam(value ="operationType",required = false) @RequestParam(value ="pageNum",required = false, defaultValue = "1") Integer pageNum,@RequestParam(value ="pageSize", required = false, defaultValue = "10") Integer pageSize){
PageHelper.startPage(pageNum,pageSize);
PageInfo<OutboundEquipmentInfoVo> pageInfo=new PageInfo<>(warehouseOutService.getOutboundEquipmentInfo(equipAttribute,equipTypeId,warehouseId,operationType,keywords));
return new SuccessResult(pageInfo);
}
}
在进行模糊查询操作的时候,往往有时候需要查询的参数很多,这时候也可以考虑使用实体类接收前端传参,更改如下:
@PostMapping("/getOutboundEquipmentInfo")//这里改成post请求
public Result getOutboundEquipmentInfo(@RequestBody EquipInfoVo vo){
PageHelper.startPage(vo.getPageNum(),vo.getPageSize());
PageInfo<OutboundEquipmentInfoVo> pageInfo=new PageInfo<>(warehouseOutService.getOutboundEquipmentInfo(vo));
return new SuccessResult(pageInfo);
}
接收前端传参实体类代码如下:
@Data
@Accessors(chain = true)
public class EquipInfoVo {
@JsonProperty(value = "operationType")
private Integer operationType;
@JsonProperty(value = "warehouseId")
private Integer warehouseId;
@JsonProperty(value = "equipAttribute")
private String equipAttribute;
@JsonProperty(value = "equipTypeId")
private Integer equipTypeId;
@JsonProperty(value = "keywords")
private String keywords;
@JsonProperty(value = "pageNum")
private Integer pageNum=1;
@JsonProperty(value = "pageSize")
private Integer pageSize=10;
}
service层
定义service层接口(此接口就是我们Java中用intrerface关键字定义的接口了)
//这里不用加service注解 public interface IWarehouseOutService { List<OutboundEquipmentInfoVo> getOutboundEquipmentInfo(String equipAttribute, Integer equipTypeId, Integer warehouseId, Integer operationType, String keywords); }
定义service接口实现
@Service @Slf4j public class WarehouseOutServiceImpl implements IWarehouseOutService { @Autowired private WmEquipInfoMapper wmEquipInfoMapper; @Override public List<OutboundEquipmentInfoVo> getOutboundEquipmentInfo(String equipAttribute, Integer equipTypeId, Integer warehouseId, Integer operationType, String keywords) { //入库操作 if (operationType==WmConstant.EQUIPMENT_INFO_INCOME){ List<OutboundEquipmentInfoVo> outList=wmEquipInfoMapper.getEquipmentInformation(equipAttribute,equipTypeId,keywords); List<WmRepertoryInfoDto> allEquip = wmRepertoryInfoMapper.getAllEquip(warehouseId); outList.forEach(info->{ Optional<WmRepertoryInfoDto> wmRepertoryInfoDto = allEquip.stream().filter(all -> all.getEquipId().equals(info.getId())).findFirst(); if (wmRepertoryInfoDto.isPresent()){ info.setInventoryQuantity(wmRepertoryInfoDto.get().getNum()); info.setDamagesNum(wmRepertoryInfoDto.get().getDamagesNum()); }else { info.setInventoryQuantity(0); info.setDamagesNum(0); } }); return outList; }else{ //出库操作 List<OutboundEquipmentInfoVo> outboundEquipmentInfo = wmEquipInfoMapper.getOutboundEquipmentInfo(equipAttribute, warehouseId, equipTypeId, keywords); List<WmRelationEquipDto> relationEquipDtos=wmOutWarehouseMapper.getOutboundApproval(warehouseId); outboundEquipmentInfo.forEach(out-> relationEquipDtos.forEach(re->{ if (Integer.valueOf(re.getEquipId().toString()).equals(out.getId())){ Integer num=out.getInventoryQuantity()-re.getNum(); out.setInventoryQuantity(num<0?0:num); } }) ); return outboundEquipmentInfo; } } }
//这上面不加@Mapper注解就要,在启动类上加这个注解@MapperScan("com.zcloud.dao.mapper") public interface WmEquipInfoMapper { List<OutboundEquipmentInfoVo> getOutboundEquipmentInfo(@Param("equipAttribute") String equipAttribute, @Param("warehouseId") Integer warehouseId, @Param("equipTypeId") Integer equipTypeId, @Param("keywords") String keywords); }
<select id="getOutboundEquipmentInfo" resultType="com.zcloud.domain.warehousemanage.vo.OutboundEquipmentInfoVo"> SELECT t2.num inventoryQuantity, t2.damages_num, ( SELECT `name` FROM t_dic_item WHERE type_code = "equip_attribute" AND CODE = t1.equip_attribute ) `equipAttributeName`, ( SELECT `name` FROM t_dic_item WHERE type_code = "equip_unit" AND CODE = t1.equip_unit ) equipUnitName, t1.equip_name, t1.equip_brand, t1.id, t1.equip_model, t3.`name` equipTypeName FROM t_common_wm_equip_info t1 LEFT JOIN t_common_wm_repertory_info t2 ON t1.id = t2.equip_id LEFT JOIN t_common_wm_equip_type t3 ON t1.equip_type_id = t3.id WHERE t1.removed = 0 AND t2.removed =0 AND t3.removed=0 AND t2.warehouse_id=#{warehouseId} <if test="equipAttribute!=null and equipAttribute!=''"> AND t1.equip_attribute=#{equipAttribute} </if> //注意Interge类型的条件判断是否为空的时候一定不要加非空字符串判断,因为当你传的值为0的时候,mybatis会把它判断为空字符串 <if test="equipTypeId!=null"> AND t1.equip_type_id=#{equipTypeId} </if> <if test="keywords!=null and keywords!=''"> AND (t1.equip_name like concat('%',#{keywords}) OR t1.equip_model like concat('%',#{keywords}) OR t1.equip_brand like concat('%',#{keywords})) </if> </select>
2.批量删除
controller层
@DeleteMapping(value = "/delete", name = "仓库管理,删除仓库信息") public Result deleteWareHouseInfo(@RequestParam(value = "ids") String ids,HttpServletRequest request ) { Integer userId = (Integer) RequestUtils.getCurrentUser(request).get("userId"); return new SuccessResult(wareHouseInfoService.deleteWareHouseInfo(ids,userId)); }
1,2,3
service层
@Transactional //单表删除不加这个注解可以,多表关联删除一定要加 public Object deleteWareHouseInfo(Integer ids, Integer userId) { List<Integer> idList = Arrays.stream(ids.split(",")) .map(s -> Integer.parseInt(s.trim())).collect(Collectors.toList()); return warehouseInfoMapper.deleteByIds(idList,userId); }
mapper层
Integer deleteByIds(@Param("idList") List<Integer> idList, @Param("userId") Integer userId);
<update id="deleteByIds" parameterType="java.lang.Integer"> <foreach collection="idList" item="item" separator=";"> update t_warehouse_info set removed = 1, rm_uid = #{userId}, rm_time = NOW(), up_time = now() where id =#{item.id} </foreach> </update>
3.新增
controller层
@PostMapping(value = "/add", name = "仓库管理,新增采购") public Result addPurchaseInfo(@RequestBody WmPurchaseInfoAddVo dto, HttpServletRequest request) { Integer userId = (Integer) RequestUtils.getCurrentUser(request).get("userId"); return new SuccessResult(wmPurchaseInfoService.addPurchaseInfo(dto,userId)); }
service层
@Override @Transactional public Integer addPurchaseInfo(WmPurchaseInfoAddVo dto, Integer userId) { Integer result; String orderCode = wmUtils.generateWmCode(WmConstant.PURCHASE_CODE_PREFIX, 1); dto.setOrderCode(orderCode).setCrUid(userId).setUpUid(userId); //插入采购基本信息,返回id //需要注意的是,如果待插入数据的表未设置主键自增,则在这里需要设置主键的值 //而这里是设置了主键自增,所以就需要在mapper层配置sql语句的时候,设置返回自增的主键值 purchaseInfoMapper.insertSelective(dto); List<WmRelationEquipDto> wmRelationEquipDtos = dto.getRelationEquip(); //设置关联设备的,关联id,以及关联类型 wmRelationEquipDtos.forEach(e -> { e.setRelationId(dto.getId()).setType(WmConstant.PURCHASE_RELATION) .setStockPendingNum(e.getNum()); }); //插入关联设备信息 result = relationEquipMapper.insertBatch(wmRelationEquipDtos); return result >= 1 ? 1 : 0; }
mapper层
purchaseInfoMapper.insertSelective(dto);
<insert id="insertSelective" useGeneratedKeys="true" keyProperty="id" keyColumn="id" parameterType="vip.dtcloud.domain.warehousemanage.vo.WmPurchaseInfoAddVo"> insert into t_common_wm_purchase_info <trim prefix="(" suffix=")" suffixOverrides=","> <if test="addVo.orderCode != null"> order_code, </if> <if test="addVo.orderName != null"> order_name, </if> <if test="addVo.purchaseMethod != null"> purchase_method, </if> <if test="addVo.purchaseManager != null"> purchase_manager, </if> <if test="addVo.orderDate != null"> order_date, </if> <if test="addVo.contractId != null"> contract_id, </if> <if test="addVo.biddingDocumentIds != null"> bidding_document_ids, </if> <if test="addVo.purchaseContractIds != null"> purchase_contract_ids, </if> <if test="addVo.meetingSummaryIds != null"> meeting_summary_ids, </if> <if test="addVo.otherFilesIds != null"> other_files_ids, </if> <if test="addVo.remark != null"> remark, </if> up_time, cr_time, <if test="addVo.upUid != null"> up_uid, </if> <if test="addVo.crUid != null"> cr_uid, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="addVo.orderCode != null"> #{addVo.orderCode,jdbcType=VARCHAR}, </if> <if test="addVo.orderName != null"> #{addVo.orderName,jdbcType=VARCHAR}, </if> <if test="addVo.purchaseMethod != null"> #{addVo.purchaseMethod,jdbcType=VARCHAR}, </if> <if test="addVo.purchaseManager != null"> #{addVo.purchaseManager,jdbcType=VARCHAR}, </if> <if test="addVo.orderDate != null"> #{addVo.orderDate,jdbcType=TIMESTAMP}, </if> <if test="addVo.contractId != null"> #{addVo.contractId,jdbcType=INTEGER}, </if> <if test="addVo.biddingDocumentIds != null"> #{addVo.biddingDocumentIds,jdbcType=VARCHAR}, </if> <if test="addVo.purchaseContractIds != null"> #{addVo.purchaseContractIds,jdbcType=VARCHAR}, </if> <if test="addVo.meetingSummaryIds != null"> #{addVo.meetingSummaryIds,jdbcType=VARCHAR}, </if> <if test="addVo.otherFilesIds != null"> #{addVo.otherFilesIds,jdbcType=VARCHAR}, </if> <if test="addVo.remark != null"> #{addVo.remark,jdbcType=VARCHAR}, </if> now(), now(), <if test="addVo.upUid != null"> #{addVo.upUid,jdbcType=INTEGER}, </if> <if test="addVo.crUid != null"> #{addVo.crUid,jdbcType=INTEGER}, </if> </trim> </insert>
relationEquipMapper.insertBatch(wmRelationEquipDtos);
<insert id="insertBatch">
insert into t_common_wm_relation_equip (relation_id, type,
equip_id, equip_serial, equip_code,
num, stock_pending_num, up_time
)
values
<foreach collection="dtoList" item="item" separator=",">
( #{item.relationId,jdbcType=INTEGER}, #{item.type,jdbcType=INTEGER},
#{item.equipId,jdbcType=BIGINT}, #{item.equipSerial,jdbcType=VARCHAR}, #{item.equipCode,jdbcType=VARCHAR},
#{item.num,jdbcType=INTEGER}, #{item.stockPendingNum,jdbcType=INTEGER}, now()
)
</foreach>
</insert>
注意 : 做批量插入的时候,插入的数量不能太多,否则会因为sql语句过长而出现无法执行的问题。一般超过5000条的话就可以使用分页去插入了。比如可以改成
如下这样的插入:
List<List<EquipRealVariableDto>> lists = splitList(wmRelationEquipDtos, 5000);
lists.forEach(e -> {
result += relationEquipMapper.insertBatch(e);
});
splitList方法代码如下:
private static <T> List<List<T>> splitList(List<T> list, int splitCount) {
int length = list.size();
long totalLength = (long)length + (long)splitCount - 1L;
long num = totalLength / (long)splitCount;
List<List<T>> newList = new ArrayList();
for(int i = 0; (long)i < num; ++i) {
int fromIndex = i * splitCount;
int toIndex = (i + 1) * splitCount < length ? (i + 1) * splitCount : length;
newList.add(list.subList(fromIndex, toIndex));
}
return newList;
}
4.编辑
- controller层
@PutMapping(value = "/edit", name = "仓库管理,修改仓库信息")
public Result editWareHouseInfo(@RequestBody WmWarehouseInfoDto dto,HttpServletRequest request) {
Integer userId = (Integer) RequestUtils.getCurrentUser(request).get("userId");
return new SuccessResult(wareHouseInfoService.editWareHouseInfo(dto,userId));
}
Service层
@Override public Integer editWareHouseInfo(WmWarehouseInfoDto dto, Integer userId) { dto.setUpUid(userId); return warehouseInfoMapper.updateByPrimaryKeySelective(dto); }
mapper层
<update id="updateByPrimaryKeySelective" parameterType="vip.dtcloud.domain.warehousemanage.dto.WmWarehouseInfoDto"> update t_common_wm_warehouse_info <set> <if test="warehouseName != null"> warehouse_name = #{warehouseName,jdbcType=VARCHAR}, </if> <if test="warehouseLocation != null"> warehouse_location = #{warehouseLocation,jdbcType=VARCHAR}, </if> <if test="warehouseManager != null"> warehouse_manager = #{warehouseManager,jdbcType=VARCHAR}, </if> <if test="phone != null"> phone = #{phone,jdbcType=VARCHAR}, </if> <if test="departmentId != null"> department_id = #{departmentId,jdbcType=VARCHAR}, </if> <if test="warehouseStatus != null"> warehouse_status = #{warehouseStatus,jdbcType=INTEGER}, </if> up_time = now(), <if test="upUid != null"> up_uid = #{upUid,jdbcType=INTEGER}, </if> </set> where id = #{id,jdbcType=INTEGER} </update>
终极大法 : 看别人是怎么写的,Ctrl c ctrl v ,然后改一改