|
|
|
|
@ -182,3 +182,136 @@ public class GoodsController {
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GoodsController类,使用了@RestController注解,表明它是Spring框架下用于构建RESTful API的控制器类,主要负责处理与商品(Goods)相关的各种HTTP请求,
|
|
|
|
|
// 并将处理结果以合适的格式(如JSON)返回给客户端(通常是前端应用),在前后端交互中起着关键的桥梁作用,方便前端对商品信息进行查询、添加、修改、删除等操作。
|
|
|
|
|
// 通过@RequestMapping("/goods")注解,为该控制器下所有的请求映射路径设置了公共前缀"/goods",便于对商品相关的接口进行统一管理和分类,便于代码维护以及前端接口调用。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 使用@Autowired注解自动注入IGoodsService接口的实现类对象,通过这个服务对象,可以调用与商品相关的核心业务逻辑方法,
|
|
|
|
|
// 例如分页查询商品信息、添加商品、更新商品信息、删除商品以及获取库存预警商品等操作,具体的业务实现细节则在IGoodsService接口对应的实现类中完成,这里只是进行调用触发相应的业务逻辑流程。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 通过@Autowired注解注入IProviderService接口的实现类对象,用于获取供应商相关的业务服务。在查询商品信息、加载可用商品等操作时,借助该服务根据供应商ID查询供应商的详细信息,
|
|
|
|
|
// 以便将供应商名称等相关信息补充到商品记录中,使返回给前端的数据更加完整,方便前端展示和业务操作时能呈现更全面的供应商相关情况,让用户清楚知道商品对应的供应商是谁。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询商品
|
|
|
|
|
* @param goodsVo 这是一个封装了查询条件的对象,通常包含分页相关信息(如页码、每页显示数量)以及其他筛选条件(如供应商ID、商品名称、产品编码、助记码、描述、规格等),由前端传入,
|
|
|
|
|
* 方便后端统一处理各种不同的查询需求,根据这些条件从数据库中准确获取符合要求的商品记录。
|
|
|
|
|
* @return 返回一个DataGridView对象,该对象一般是项目中自定义用于封装数据展示相关信息的,其中包含了查询到的商品记录的总数量以及具体的商品记录列表,
|
|
|
|
|
* 方便前端进行分页展示以及对数据进行进一步的处理和分析等操作,例如前端可以根据这些数据展示商品列表、进行数据统计等。
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// 创建一个IPage对象,用于实现分页功能,通过传入从goodsVo对象中获取的当前页码(goodsVo.getPage())和每页显示记录数量(goodsVo.getLimit())来确定分页范围,
|
|
|
|
|
// 例如,当页码为2且每页显示数量为10时,表示要获取第2页,每页显示10条商品记录的那部分数据,这样可以对大量的商品记录进行分页管理,提升前端展示效果以及用户查看数据的体验。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 创建一个QueryWrapper对象,用于构建查询条件,它类似于构建SQL语句中的WHERE子句部分,能够灵活地添加各种筛选条件,从而精确地查询出符合特定要求的商品记录。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 对供应商进行查询,如果从goodsVo对象中获取的供应商ID(goodsVo.getProviderid())不为空且不等于0,说明前端传入了供应商筛选条件,
|
|
|
|
|
// 则添加一个相等性查询条件,在数据库表中对应"providerid"字段,查找与传入的供应商ID相等的商品记录,以此实现按供应商来筛选商品信息的功能,方便查看特定供应商提供的商品情况。
|
|
|
|
|
|
|
|
|
|
// 对商品名称进行模糊查询,如果从goodsVo对象中获取的商品名称(goodsVo.getGoodsname())不为空字符串(通过StringUtils.isNotBlank方法判断),
|
|
|
|
|
// 则添加一个模糊查询条件,在数据库表中对应"goodsname"字段,查找包含传入商品名称的商品记录,便于根据部分商品名称来查找相关商品,满足更灵活的查询需求。
|
|
|
|
|
|
|
|
|
|
// 对产品编码进行模糊查询,同理,当goodsVo对象中获取的产品编码(goodsVo.getProductcode())不为空字符串时,添加一个模糊查询条件,
|
|
|
|
|
// 在数据库表的"productcode"字段上进行模糊匹配,查找包含传入产品编码的商品记录,方便根据产品编码来定位商品。
|
|
|
|
|
|
|
|
|
|
// 对助记码进行模糊查询,若goodsVo对象中获取的助记码(goodsVo.getPromitcode())不为空字符串,就在"promitcode"字段添加模糊查询条件,
|
|
|
|
|
// 查找包含传入助记码的商品记录,有助于通过助记码快速查找特定商品,提高查询的便捷性。
|
|
|
|
|
|
|
|
|
|
// 对商品描述进行模糊查询,当goodsVo对象中获取的描述信息(goodsVo.getDescription())不为空字符串时,添加一个模糊查询条件,
|
|
|
|
|
// 在数据库表的"description"字段进行模糊匹配,查找包含传入描述内容的商品记录,方便根据商品的相关描述来查找商品。
|
|
|
|
|
|
|
|
|
|
// 对商品规格进行模糊查询,类似地,若goodsVo对象中获取的规格信息(goodsVo.getSize())不为空字符串,就在"size"字段添加模糊查询条件,
|
|
|
|
|
// 查找包含传入规格的商品记录,便于根据商品规格来筛选商品,满足不同业务场景下对商品数据的查询需求。
|
|
|
|
|
|
|
|
|
|
// 通过商品的ID对查询结果进行降序排序,添加一个按照"id"字段(推测是商品的唯一标识符字段)进行降序排序的条件,使得查询返回的商品记录按照ID从大到小的顺序排列,
|
|
|
|
|
// 这样在前端展示时,用户能先看到较新添加或更新的商品记录,更符合一般的数据查看习惯,方便查看和分析近期的商品情况。
|
|
|
|
|
// 调用goodsService的page方法,传入构建好的分页对象page和查询条件包装器queryWrapper,服务层会根据这些条件执行数据库查询操作,
|
|
|
|
|
// 获取符合条件的商品数据,并将数据填充到page对象中,例如设置page对象中的总记录数、当前页的记录列表等属性,以便后续返回完整的分页数据信息。
|
|
|
|
|
|
|
|
|
|
// 获取查询结果中当前页的商品记录列表,方便后续对每条记录进行补充相关信息的操作,比如添加供应商名称等,使返回给前端的数据更加丰富详细,更具业务价值。
|
|
|
|
|
|
|
|
|
|
// 遍历当前页查询到的每条商品记录,为每条记录补充供应商名称信息,使其展示的数据更加完整全面,方便前端展示以及业务查看和操作使用。
|
|
|
|
|
// 通过providerService的getById方法,根据当前商品记录中的供应商ID(goods.getProviderid())从数据库中查询对应的供应商详细信息,获取到一个Provider对象(如果存在的话)。
|
|
|
|
|
// 如果查询到了对应的供应商信息,将供应商的名称设置到当前商品记录(goods)中,以便前端展示商品记录时能同时显示供应商名称,让数据更直观、完整,便于业务人员查看商品对应的供应商情况。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 创建一个DataGridView对象,将查询得到的商品记录的总数量(通过page.getTotal()获取)以及当前页补充完整信息后的商品记录列表(page.getRecords())进行封装,
|
|
|
|
|
// 最终返回给前端,使得前端能够按照分页逻辑展示商品信息,并且展示的数据包含了丰富的关联信息(供应商名称等),满足业务查看和操作的实际需求。
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 添加商品
|
|
|
|
|
* @param goodsVo 这是一个包含了要添加的商品相关信息的对象,通常由前端传入,里面封装了如商品名称、供应商ID、产品编码、助记码、描述、规格、商品图片等诸多与商品业务相关的属性信息,
|
|
|
|
|
* 这些信息将被保存到数据库中,形成一条新的商品记录。
|
|
|
|
|
* @return 返回一个ResultObj类型的结果对象,ResultObj中定义了诸如ADD_SUCCESS、ADD_ERROR等枚举值,用于明确表示添加商品操作的成功或失败状态,
|
|
|
|
|
* 方便前端根据接收到的返回结果进行相应的提示操作或者后续处理,比如提示用户添加成功或者告知添加失败的原因等。
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// 打印商品图片相关信息(可能用于调试查看图片相关情况,比如确认前端传入的图片路径等是否正确),此处输出只是辅助开发阶段查看相关数据情况,在正式环境可根据需求决定是否保留。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 判断商品图片路径是否不为空且以"_temp"结尾,如果满足该条件,说明可能是临时的图片文件名,需要进行重命名处理。
|
|
|
|
|
|
|
|
|
|
// 调用AppFileUtils的renameFile方法对临时的商品图片文件名进行重命名操作,得到新的文件名,并将新文件名设置回goodsVo对象的"goodsimg"属性中,
|
|
|
|
|
// 以便后续保存商品信息时使用正确的图片文件名,保证图片存储和关联的正确性。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 调用goodsService的save方法,将包含完整商品信息(已处理好图片文件名等情况)的goodsVo对象传递过去,触发服务层中处理添加商品的业务逻辑,
|
|
|
|
|
// 该逻辑可能涉及到向数据库的商品表中插入一条新记录、将商品图片存储到指定的文件存储位置(如果有图片存储相关逻辑)以及其他关联业务模块的数据交互等一系列复杂操作,
|
|
|
|
|
// 如果整个操作过程顺利完成,不会抛出异常;若在执行过程中出现问题(比如数据库插入失败、文件存储失败、业务规则校验不通过等情况),则会抛出异常。
|
|
|
|
|
|
|
|
|
|
// 如果在添加商品的过程中出现异常,通过打印异常堆栈信息(这有助于开发人员在排查问题时了解详细的异常发生位置和原因),
|
|
|
|
|
// 然后返回表示添加商品失败的ResultObj.ADD_ERROR结果对象给前端,使得前端能够知晓操作未成功,进而采取相应的提示告知用户或者其他补救措施等。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 修改商品
|
|
|
|
|
* @param goodsVo 这是一个包含了要修改的商品新信息的对象,通常由前端传入,里面的属性值是修改后的值,通过与数据库中已存在的商品记录的主键等信息进行匹配来确定要更新的具体记录,
|
|
|
|
|
// 例如修改商品名称、规格、图片等信息后,将新的值封装在这个对象中传递过来进行更新操作。
|
|
|
|
|
* @return 返回一个ResultObj类型的结果对象,ResultObj中定义了如UPDATE_SUCCESS、UPDATE_ERROR等枚举值,用于表示修改商品操作的成功或失败状态,
|
|
|
|
|
* 方便前端根据返回结果进行相应的处理或提示用户,比如提示用户更新成功或者告知更新失败的原因等。
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// 判断商品图片是否不是默认图片,这里通过判断图片路径不为空且不等于默认图片路径(Constast.DEFAULT_IMG_GOODS,应该是项目中定义的表示默认商品图片的常量)来确定,
|
|
|
|
|
// 如果不是默认图片,说明可能需要进行图片相关的更新处理操作,比如更换了商品图片等情况。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 进一步判断商品图片路径是否以"_temp"结尾,如果是,说明可能是新上传的临时图片文件名,需要进行重命名处理,以符合实际存储和使用的规范。
|
|
|
|
|
|
|
|
|
|
// 调用AppFileUtils的renameFile方法对临时的商品图片文件名进行重命名操作,得到新的文件名,并将新文件名设置回goodsVo对象的"goodsimg"属性中,
|
|
|
|
|
// 确保后续更新商品信息时使用正确的图片文件名进行关联。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 获取原先商品记录中的图片路径,通过调用goodsService的getById方法根据商品ID(goodsVo.getId())获取对应的商品记录,再获取其图片路径(getGoodsimg方法),
|
|
|
|
|
// 以便后续删除原来的旧图片,避免图片文件冗余,保持文件存储与商品信息的一致性。
|
|
|
|
|
|
|
|
|
|
// 调用AppFileUtils的removeFileByPath方法,根据获取到的旧图片路径删除原先的商品图片文件,实现图片文件的更新替换操作。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 调用goodsService的updateById方法,将包含更新后商品信息的goodsVo对象传递过去,服务层会根据对象中的主键信息(通常是商品记录的ID),
|
|
|
|
|
// 在数据库中找到对应的商品记录,并将其他属性值更新为goodsVo对象中传入的新值,实现更新商品信息的功能,例如修改商品记录中的名称、规格等字段的值,
|
|
|
|
|
// 如果更新操作顺利完成则无异常抛出,若出现问题(比如找不到对应记录、更新数据违反约束等情况)则会抛出异常。
|
|
|
|
|
|
|
|
|
|
// 如果在更新商品信息的过程中出现异常,打印异常堆栈信息(便于开发人员排查问题根源),然后返回表示更新操作失败的ResultObj.UPDATE_ERROR结果对象给前端,
|
|
|
|
|
// 让前端知晓更新操作未成功,以便采取相应的提示或者其他处理措施,比如告知用户更新失败,可尝试再次操作等。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 删除商品
|
|
|
|
|
* @param id 要删除的商品记录的唯一标识符(通常是主键ID),由前端传入,通过这个ID来确定要从数据库中删除的具体商品记录。
|
|
|
|
|
* @param goodsimg 商品图片的路径,用于定位要删除的商品图片文件,确保在删除商品记录的同时,将对应的商品图片文件也从存储中删除,保持数据的一致性。
|
|
|
|
|
* @return 返回一个ResultObj类型的结果对象,ResultObj中定义了如DELETE_SUCCESS、DELETE_ERROR等枚举值,用于表示删除商品操作的成功或失败状态,
|
|
|
|
|
* 方便前端根据返回结果进行相应的处理或提示用户,比如提示用户删除成功或者告知删除失败的原因等。
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
// 调用AppFileUtils的removeFileByPath方法,根据传入的商品图片路径(goodsimg)删除对应的商品图片文件,实现删除商品图片的操作,
|
|
|
|
|
// 避免商品记录删除后图片文件仍残留,浪费存储空间且可能导致数据不一致的问题。
|
|
|
|
|
|
|
|
|
|
// 调用goodsService的deleteGoodsById方法(假设该方法用于根据商品ID删除商品记录,具体实现逻辑在IGoodsService接口对应的实现类中),传入要删除的商品ID,
|
|
|
|
|
// 服务层会根据这个ID在数据库中找到对应的商品记录并执行删除操作,实现删除商品记录的功能,
|
|
|
|
|
// 如果删除操作顺利完成则无异常抛出,若出现问题(比如存在关联数据、违反数据库约束等情况)则会抛出异常。
|
|
|
|
|
|
|
|
|
|
|