基于springboot接口的编写

目录

1、模糊分页查询

2、批量删除

3、新增

4、编辑


此接口非彼接口。此接口是MVC的设计模式中的Controller层,一般我们会叫Controller层里的方法为接口。他们是负责接收前端或者其它服务的传来的请求,并对请求进行相应的处理,最终再将处理结果返回给前端或者其它服务。

1、模糊分页查询

   1)Controller层

@RestController
@RequestMapping("camera")
public class CameraAlarmController {@Autowiredprivate IWarehouseOutService warehouseOutService; //注入接口/*** 获取设备相关信息* @param equipAttribute* @param equipType* @param keywords* @param pageNum* @param pageSize* @return*/@GetMapping("getOutboundEquipmentInfo")public Result getOutboundEquipmentInfo(@RequestParam(value ="operationType",required = false) Integer operationType,@RequestParam(value ="warehouseId",required = false) Integer warehouseId,@RequestParam(value ="equipAttribute",required = false) String equipAttribute,@RequestParam(value ="equipTypeId",required = false) Integer equipTypeId,@RequestParam(value = "keywords", required = false) String keywords,@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;
}

 2)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 {@Autowiredprivate WmEquipInfoMapper wmEquipInfoMapper;@Overridepublic 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;}}
}

 3)mapper层

//这上面不加@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">SELECTt2.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` equipTypeNameFROMt_common_wm_equip_info t1LEFT JOIN t_common_wm_repertory_info t2 ON t1.id = t2.equip_idLEFT JOIN t_common_wm_equip_type t3 ON t1.equip_type_id = t3.idWHEREt1.removed = 0AND t2.removed =0AND t3.removed=0AND 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、批量删除

    1) 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));}

 2) 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);}

 3)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_infoset removed = 1,rm_uid = #{userId},rm_time = NOW(),up_time = now()where id =#{item.id}</foreach></update>
3、新增

     1) 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));}

  2) service层

   @Override@Transactionalpublic 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;}

3) mapper层

    单个新增

  <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>

批量新增

<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、编辑

1) 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));}

 2) service层

 @Overridepublic Integer editWareHouseInfo(WmWarehouseInfoDto dto, Integer userId) {dto.setUpUid(userId);return warehouseInfoMapper.updateByPrimaryKeySelective(dto);}

3) 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>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/700848.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工具方法合集-utils.js

通用 import get from lodash.get import cloneDeep from lodash.clonedeep // 深度clone export function deepClone(obj) {return obj ? cloneDeep(obj) : obj } export function lodashGet(obj, key, defaultValue ) {//这个 defaultValue 不能给默认 值 会报错&#xf…

超实用,分享PostgreSQL和mysql的几点区别

前言 今天是元宵节&#xff0c;首先祝大伙元宵快乐&#xff01;上一篇文章&#xff0c;给大家讲解了一下MySQL和PostgreSQL性能上的差别。这篇文章主要是记录一下日常应用中&#xff0c;两者常见的一些语法以及一些区别。 PostgreSQL的数据类型 数值类型 字符串类型 日期|时…

harmony 鸿蒙使用N-API开发Native模块

harmony 鸿蒙使用N-API开发Native模块&#xff0c;其实就是Node.js 官网中已经给出 N-API 接口基础能力&#xff0c;同时&#xff0c;方舟 ArkTS 运行时提供的 N-API 接口&#xff0c;封装了方舟引擎的能力&#xff0c;在功能上与 Node.js 社区保持一致。 N-API 是 Node.js Add…

Java:性能优化细节11-20

Java&#xff1a;性能优化细节11-20 11. 尽量合理的创建HashMap 当你要创建一个比较大的hashMap时&#xff0c;充分利用这个构造函数 public HashMap(int initialCapacity, float loadFactor);合理初始化HashMap的容量和负载因子是提高HashMap性能的关键因素之一。HashMap在…

Linux--shell编程中分区表常用操作 全面且详细

文章中关于分区表常用操作目录&#xff1a; 一、概念 二、​​​​​​​创建分区表语法 ​​​​​​​三、创建一个表带多个分区 四、​​​​​​​加载数据到分区表中 五、加载数据到一个多分区的表中去 ​​​​​​​六、查看分区 七、​​​​​​​添加一个分区…

ChatGPT大致运用了哪些技术

ChatGPT是一个基于OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;架构构建的语言模型。它的大致原理和运用的技术如下&#xff1a; Transformer架构&#xff1a;ChatGPT基于Transformer模型&#xff0c;这是一种使用自注意力机制&#xff08;self-att…

机器学习:逻辑回归原理

逻辑回归模型是一种广泛应用于分类问题的统计方法。尽管名为“回归”&#xff0c;但它实际上是一种分类算法&#xff0c;主要用于预测观察对象属于某个类别的概率。逻辑回归模型特别适用于二分类问题&#xff0c;但也可以通过一些策略扩展到多分类问题。 逻辑回归的应用与优化…

让C语言代码变抽象(二)

目录 前言&#xff1a; 代码&#xff1a; 前言&#xff1a; 在今天写代码的时候&#xff0c;我又想到一个更抽象的代码。 我在写注释的时候突然想想到条件编译的东西&#xff0c;好像也能用来注释东西。 代码&#xff1a; 我们在这直接上干货 我们知道在条件编译中有一个叫…

飞常准查航班小程序采集

仅限学习使用 <html> <head> </head> <body><script src"AesUtil.js"></script><script src"md5.js"></script><script>function test(a) { return true; }function serialize(o) {var n argumen…

【前端素材】推荐优质后台管理系统Acara平台模板(附源码)

一、需求分析 后台管理系统在多个层次上提供了丰富的功能和细致的管理手段&#xff0c;帮助管理员轻松管理和控制系统的各个方面。其灵活性和可扩展性使得后台管理系统成为各种网站、应用程序和系统不可或缺的管理工具。 后台管理系统是一种用于管理和控制网站、应用程序或系…

Map集合特点、遍历方式、TreeMap排序及Collections和Arrays

目录 ​编辑 一、集合框架 二、 Map集合 特点 遍历方式 HashMap与Hashtable的区别 TreeMap Collections Arrays 一、集合框架 二、 Map集合 Map集合是一种键值对的集合&#xff0c;其中每个键对应一个值。在Java中&#xff0c;Map接口定义了一种将键映射到值的数据结…

Python中websockets服务端从客户端接收消息并发送给多线程

思路&#xff1a; 1.websockets需要从客户端接收消息&#xff0c;由于websockets创建服务端只能绑定一个端口&#xff0c;所以需要单独占用一个线程。收到的消息&#xff0c;我们需要共享给主线程&#xff0c;然后主线程根据设备&#xff08;多线程&#xff09;分发消息给各线…

嵌入式学习-qt-Day3

嵌入式学习-qt-Day3 一、思维导图 二、作业 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳…

「Java开发指南」MyEclipse如何支持Spring Scaffolding?(三)

在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0c;主要为大家介绍了CRUD Scaffolding&#xff0c;本文将继续介绍应用程序的分层、代码助手等。 MyEclipse v2023.1.2离线版下载 3. 应用程序的分层 应用程序分层是应用程序开发领域中非常常见的体系结构方法…

C++之类作用域

目录 1、全局作用域 2、类作用域 2.1、设计模式之Pimpl 2.2、单例模式的自动释放 2.2.0、检测内存泄漏的工具valgrind 2.2.1、可以使用友元形式进行设计 2.2.2、内部类加静态数据成员形式 2.2.3、atexit方式进行 2.2.4、pthread_once形式 作用域可以分为类作用域、类名…

c++学习记录 STL基本概念

1、STL基本概念 STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;STL广义上分为&#xff1a;容器&#xff08;container&#xff09;算法&#xff08;algorithm&#xff09;迭代器&#xff08;iterator&#xff09;容器和算法之间通过迭代器进行无…

线程共享和非共享的资源及线程优缺点

注意&#xff1a;共享的内存地址空间中不包括栈&#xff1b;共享文件描述符表&#xff0c;表示&#xff0c;同一进程中线程可以操作同一文件。

猫头虎分享已解决Bug || TypeError: Cannot read property ‘props‘ of undefined (React)

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

c++的类型转换方法

一、静态类型转换&#xff08;static_cast&#xff09; 静态类型的转换主要用于基本类型之间的转换&#xff0c;比如int类型转换为double类型。但是static_cast也可以支持上下行的转换&#xff08;存在继承关系之间的转换&#xff09; 基本类型之间的转换举例 上下行转换的举…

金航标电子位于广西柳州鹿寨县天线生产基地于大年正月初九开工了!!!

金航标kinghelm&#xff08;www.kinghelm.com.cn&#xff09;总部位于中国深圳市&#xff0c;兼顾技术、成本、管理、效率和可持续发展。东莞塘厦实验室全电波暗室、网络分析仪、高低温测试柜等仪器设备齐全&#xff0c;可进行高低温、双85等测试&#xff0c;独立完成产品的检测…