diff --git a/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/CarouselController.java b/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/CarouselController.java new file mode 100644 index 0000000..2ef5433 --- /dev/null +++ b/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/CarouselController.java @@ -0,0 +1,111 @@ +package com.zf.foodpurchase.fdsafe.web.merchant; + +import com.zf.foodpurchase.common.core.controller.BaseController; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.common.core.domain.entity.SysUser; +import com.zf.foodpurchase.common.core.page.TableDataInfo; +import com.zf.foodpurchase.common.utils.poi.ExcelUtil; +import com.zf.foodpurchase.fdsafe.entity.Carousel; +import com.zf.foodpurchase.fdsafe.service.ICarouselService; +import com.zf.foodpurchase.fdsafe.utils.ImagesPrefixUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 商户轮播图Controller + * + * @author ruoyi + * @date 2024-11-29 + */ +@RestController +@RequestMapping("/merchant/carousel") +public class CarouselController extends BaseController +{ + @Autowired + private ICarouselService carouselService; + + /** + * 查询商户轮播图列表 + */ + @GetMapping("/list") + public TableDataInfo list(Carousel carousel) + { + startPage(); + SysUser loginUser = getLoginUser().getUser(); + if(!loginUser.isAdmin()){ + carousel.setMerchantId(loginUser.getDeptId()); + } + List list = carouselService.selectCarouselList(carousel); + return getDataTable(list); + } + + /** + * 导出商户轮播图列表 + */ + @PostMapping("/export") + public void export(HttpServletResponse response, Carousel carousel) + { + List list = carouselService.selectCarouselList(carousel); + ExcelUtil util = new ExcelUtil(Carousel.class); + util.exportExcel(response, list, "商户轮播图数据"); + } + + /** + * 获取商户轮播图详细信息 + */ + @GetMapping(value = "/{carouselId}") + public AjaxResult getInfo(@PathVariable("carouselId") Long carouselId) + { + return success(carouselService.selectCarouselByCarouselId(carouselId)); + } + + /** + * 新增商户轮播图 + */ + @PostMapping + public AjaxResult add(@Validated @RequestBody Carousel carousel) + { + SysUser loginUser = getLoginUser().getUser(); + if(!loginUser.isAdmin()){ + carousel.setMerchantId(loginUser.getDeptId()); + }else if(carousel.getMerchantId() == null){ + return AjaxResult.error("请指定轮播图所属商户"); + } + List carousels = carouselService.selectCarouselList(carousel); + if(carousels!=null && carousels.size() > 0){ + return AjaxResult.error("该商户已存在该轮播图,无法新增"); + } + StringBuilder firstImages=new StringBuilder(); + StringBuilder destImages=new StringBuilder(); + ImagesPrefixUtil.dealImagesPath(carousel.getCarouselIamges(), firstImages, destImages); + carousel.setCarouselIamges(destImages.toString()); + + return toAjax(carouselService.insertCarousel(carousel)); + } + + /** + * 修改商户轮播图 + */ + @PutMapping + public AjaxResult edit(@Validated @RequestBody Carousel carousel) + { + StringBuilder firstImages=new StringBuilder(); + StringBuilder destImages=new StringBuilder(); + ImagesPrefixUtil.dealImagesPath(carousel.getCarouselIamges(), firstImages, destImages); + carousel.setCarouselIamges(destImages.toString()); + return toAjax(carouselService.updateCarousel(carousel)); + } + + /** + * 删除商户轮播图 + */ + @DeleteMapping("/{carouselIds}") + public AjaxResult remove(@PathVariable Long[] carouselIds) + { + return toAjax(carouselService.deleteCarouselByCarouselIds(carouselIds)); + } +} diff --git a/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/MeBrowseController.java b/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/MeBrowseController.java new file mode 100644 index 0000000..fdba418 --- /dev/null +++ b/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/MeBrowseController.java @@ -0,0 +1,63 @@ +package com.zf.foodpurchase.fdsafe.web.merchant; + + +import com.zf.foodpurchase.common.core.controller.BaseController; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.common.core.domain.entity.SysUser; +import com.zf.foodpurchase.common.core.page.TableDataInfo; +import com.zf.foodpurchase.fdsafe.entity.Browse; +import com.zf.foodpurchase.fdsafe.service.IBrowseService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + *

+ * 商品浏览记录表 前端控制器 + *

+ * + * @author lilj + * @since 2024-11-15 + */ +@Api(tags = "商品浏览记录") +@RestController +@RequestMapping("/merchant/browse") +public class MeBrowseController extends BaseController { + @Autowired + private IBrowseService browseService; + + // 需要关联商品信息,关联查询. + @ApiOperation("查询用户浏览记录") + @GetMapping("list") + public AjaxResult list() { + SysUser user = getLoginUser().getUser(); + Browse browse = new Browse(); + if (!user.isAdmin()) { + browse.setMerchantId(user.getDeptId()); + } + List list = browseService.joinQueryList(browse); + return success(list); + } + + @ApiOperation("查询用户浏览记录") + @GetMapping("pageList") + public TableDataInfo pageList(Browse browse) { + startPage(); + SysUser user = getLoginUser().getUser(); + if (!user.isAdmin()) { + browse.setMerchantId(user.getDeptId()); + }else{ + browse.setMerchantId(null); + } + List list = browseService.joinQueryList(browse); + return getDataTable(list); + } + + + +} diff --git a/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/MerchantController.java b/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/MerchantController.java new file mode 100644 index 0000000..4238acc --- /dev/null +++ b/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/MerchantController.java @@ -0,0 +1,44 @@ +package com.zf.foodpurchase.fdsafe.web.merchant; + +import com.zf.foodpurchase.common.constant.Constants; +import com.zf.foodpurchase.common.constant.UserConstants; +import com.zf.foodpurchase.common.core.controller.BaseController; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.common.core.domain.entity.SysDept; +import com.zf.foodpurchase.common.core.domain.entity.SysUser; +import com.zf.foodpurchase.system.service.ISysDeptService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author:lilj + * @date:2024/12/17 + */ + +@RestController +@RequestMapping("admin/merchant") +public class MerchantController extends BaseController { + + @Autowired + private ISysDeptService sysDeptService; + + @GetMapping("/merchantQuery") + public AjaxResult merchantQuery(){ + SysUser user = getLoginUser().getUser(); + if(!user.isAdmin()){ + return error("非管理员账号无法调用此接口"); + } + + SysDept queryDept = new SysDept(); + // 只查询商户部门 + queryDept.setMerchantFlag("1"); + queryDept.setDelFlag(Constants.DEL_FLAG_NORMAL); + queryDept.setStatus(UserConstants.DEPT_NORMAL); + List depts = sysDeptService.selectDeptList(queryDept); + return success(depts); + } +} diff --git a/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/ProductsController.java b/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/ProductsController.java new file mode 100644 index 0000000..dcacbe8 --- /dev/null +++ b/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/ProductsController.java @@ -0,0 +1,221 @@ +package com.zf.foodpurchase.fdsafe.web.merchant; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.zf.foodpurchase.common.constant.Constants; +import com.zf.foodpurchase.common.core.controller.BaseController; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.common.core.domain.entity.SysUser; +import com.zf.foodpurchase.common.core.page.TableDataInfo; +import com.zf.foodpurchase.common.exception.ServiceException; +import com.zf.foodpurchase.common.utils.DateUtils; +import com.zf.foodpurchase.common.utils.StringUtils; +import com.zf.foodpurchase.common.utils.poi.ExcelUtil; +import com.zf.foodpurchase.fdsafe.entity.Products; +import com.zf.foodpurchase.fdsafe.entity.ProductsSpec; +import com.zf.foodpurchase.fdsafe.entity.SpecValues; +import com.zf.foodpurchase.fdsafe.service.IProductsService; +import com.zf.foodpurchase.fdsafe.service.IProductsSpecService; +import com.zf.foodpurchase.fdsafe.service.ISpecValuesService; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + +/** + * 商品Controller + * + * @author ruoyi + * @date 2024-11-16 + */ +@RestController +@RequestMapping("/merchant/products") +public class ProductsController extends BaseController +{ + @Autowired + private IProductsService productsService; + + @Autowired + private IProductsSpecService productsSpecService; + + @Autowired + private ISpecValuesService specValuesService; + + private boolean isAllowDeleteSpecs = true; + + /** + * 查询商品列表 + */ + @GetMapping("/list") + public TableDataInfo list(Products products) + { + startPage(); + SysUser sysUser = getLoginUser().getUser(); + if(!sysUser.isAdmin()){ + products.setMerchantId(sysUser.getDeptId()); + } + List list = productsService.selectProductsList(products); + + if(CollectionUtils.isNotEmpty(list)){ + + // 遍历products + list.forEach(item->{ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProductsSpec::getProductId,item.getProductId()); + List productsSpecs = productsSpecService.listWithProductSpecValues(queryWrapper); + if(CollectionUtils.isNotEmpty(productsSpecs)){ + item.setProductsSpecList(productsSpecs); + + // 遍历productsSpecList + for(ProductsSpec productsSpec:productsSpecs){ + List specValuesIds = productsSpec.getSpecValuesIds(); + List> specValueArray =new ArrayList<>(); + if(CollectionUtils.isNotEmpty(specValuesIds)){ + for(Integer integer : specValuesIds){ + if(integer!=null){ + SpecValues specValues = specValuesService.getById(integer); + if(specValues!=null){ + List arrayItem = new ArrayList<>(); + arrayItem.add(specValues.getSpecType()); + arrayItem.add(specValues.getId()); + specValueArray.add(arrayItem); + } + } + + } + productsSpec.setSpecValueArray(specValueArray); + } + } + } + else{ + item.setProductsSpecList(new ArrayList<>()); + } + }); + + } + + return getDataTable(list); + } + + /** + * 导出商品列表 + */ + @PostMapping("/export") + public void export(HttpServletResponse response, Products products) + { + List list = productsService.selectProductsList(products); + ExcelUtil util = new ExcelUtil(Products.class); + util.exportExcel(response, list, "商品数据"); + } + + /** + * 获取商品详细信息 + */ + @GetMapping(value = "/{productId}") + public AjaxResult getInfo(@PathVariable("productId") Integer productId) + { + return success(productsService.selectProductsByProductId(productId)); + } + + /** + * 新增商品 + */ + @PostMapping + public AjaxResult add(@Validated @RequestBody Products products) + { + SysUser sysUser = getLoginUser().getUser(); + if(sysUser.isAdmin() ){ + if( products.getMerchantId() == null){ + return AjaxResult.warn("请选择所属商家"); + } + } else{ + products.setMerchantId(sysUser.getDeptId()); + } + + if(StringUtils.isBlank(products.getImages())){ + return AjaxResult.error("商品图片不能为空"); + } + products.setProductId(null); + products.setOperId(sysUser.getUserId()); + products.setCreateTime(DateUtils.getNowDate()); + // 多规格商品的库存添加对应规格商品时,自动累加 + if(Constants.MULTI_SPEC.equals(products.getIsSpecs())){ + products.setTotalStock(0); + }else{ + if(Constants.GOODS_MONEY_BUY.equals(products.getType()) && products.getBasePrice()<=0){ + throw new ServiceException("人民币购买商品价格要大于0"); + } + + if(Constants.GOODS_INTEGRAL_BUY.equals(products.getType()) && products.getBaseIntegral()<=0){ + throw new ServiceException("积分兑换商品积分要大于0"); + } + } + + return toAjax(productsService.insertProducts(products)); + } + + /** + * 修改商品 + */ + @PutMapping + public AjaxResult edit(@Validated @RequestBody Products products) + { + if(products.getUpdateTime()==null){ + products.setUpdateTime(DateUtils.getNowDate()); + } + SysUser sysUser = getLoginUser().getUser(); + if(sysUser.isAdmin() ){ + if(products.getMerchantId() == null){ + return AjaxResult.warn("请选择所属商家"); + } + } else{ + products.setMerchantId(sysUser.getDeptId()); + } + products.setOperId(sysUser.getUserId()); + products.setUpdateTime(DateUtils.getNowDate()); + if(products.getIsSpecs()==null){ + return AjaxResult.error("请指定商品是否多规格"); + } + if(Constants.SINGLE_SPEC.equals(products.getIsSpecs())){ + // return toAjax(productsService.updateProducts(products)); + // 商品类型为但规格处理 + boolean flag = productsSpecService.updateSingleProducts(products); + return flag ? success("修改成功") : error("修改失败"); + } + + else if(Constants.MULTI_SPEC.equals(products.getIsSpecs())){ + // 实现多规格商品信息变更的逻辑 + boolean flag = productsSpecService.updateMulSpecProducts(products); + return flag ? success("修改成功") : error("修改失败"); + } + + else{ + return AjaxResult.error("请指定商品是否多规格"); + } + // return toAjax(productsSpecService.commonUpdateProducts(products)); + // return toAjax(productsService.updateProductsAndSpec(products)); + } + + /** + * 删除商品 + */ + @DeleteMapping("/{productIds}") + public AjaxResult remove(@PathVariable Integer[] productIds) + { + return toAjax(productsService.deleteProductsByProductIds(productIds,isAllowDeleteSpecs)); + } + + /** + * 逻辑删除商品 + */ + @DeleteMapping("/logic/{productIds}") + public AjaxResult logicDelete(@PathVariable Integer[] productIds) + { + return toAjax(productsService.deleteProductsLogicByProductIds(productIds)); + } + + +} diff --git a/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/RepositoryController.java b/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/RepositoryController.java new file mode 100644 index 0000000..af04089 --- /dev/null +++ b/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/RepositoryController.java @@ -0,0 +1,130 @@ +package com.zf.foodpurchase.fdsafe.web.merchant; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.zf.foodpurchase.common.core.controller.BaseController; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.common.core.domain.entity.SysUser; +import com.zf.foodpurchase.common.core.page.TableDataInfo; +import com.zf.foodpurchase.common.utils.DateUtils; +import com.zf.foodpurchase.fdsafe.entity.Repository; +import com.zf.foodpurchase.fdsafe.service.IRepositoryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.List; + +/** + *

+ * 仓库列表 前端控制器 + *

+ * + * @author lilj + * @since 2024-11-20 + */ +@RestController +@RequestMapping("/merchant/repository") +public class RepositoryController extends BaseController { + @Autowired + private IRepositoryService repositoryService; + + @GetMapping("/list") + public AjaxResult list(Repository repository) { + List list = repositoryService.joinQueryList(getQuryRepository(repository)); + return AjaxResult.success("查询成功", list); + } + + + @GetMapping("/pageList") + public TableDataInfo pageList(Repository repository) { + List list = repositoryService.joinQueryList(getQuryRepository(repository)); + return getDataTable(list); + } + + @PostMapping("/addRepo") + public AjaxResult addRepo(@Validated @RequestBody Repository repository) { + SysUser user = getLoginUser().getUser(); + if (!user.isAdmin()) { + repository.setMerchantId(user.getDeptId()); + }else { + if(repository.getMerchantId() == null){ + return error("必须指定要添加的仓库所属商户"); + } + } + repository.setCreateTime(DateUtils.getNowDate()); + repository.setOperId(getUserId()); + return repositoryService.saveRepo(repository); + } + + /** + * 修改前增加一步校验 + * + * @param repository + * @return + */ + @PostMapping("/modifyRepo") + public AjaxResult modifyRepo(@Validated @RequestBody Repository repository) { + if (repository.getId() == null) { + return error("必须指定要修改的仓库id"); + } + if (!verifyUpdateAuth(repository)) { + return error("传入的商店下没有该仓库"); + } + return repositoryService.modifyRepo(repository); + } + + @DeleteMapping("/delete") + public AjaxResult delete(Long[] ids) { + SysUser user = getLoginUser().getUser(); + boolean flag = false; + List list = Arrays.asList(ids); + if (!user.isAdmin()) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.in(Repository::getId, list); + queryWrapper.eq(Repository::getMerchantId, user.getDeptId()); + flag = repositoryService.remove(queryWrapper); + }else{ + flag = repositoryService.removeByIds(list); + } + return flag?AjaxResult.success("删除成功"):AjaxResult.error("删除失败"); + } + + /** + * 查询条件构建 + * + * @return + */ + public Repository getQuryRepository(Repository repository) { + if (repository == null) { + repository = new Repository(); + } + SysUser user = getLoginUser().getUser(); + if (!user.isAdmin()) { + repository.setMerchantId(user.getDeptId()); + } else { + repository.setMerchantId(null); + } + return repository; + } + + /** + * 验证是够具有修改记录的权限 + * + * @param repository + * @return + */ + public boolean verifyUpdateAuth(Repository repository) { + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(Repository::getId, repository.getId()); + queryWrapper.eq(Repository::getMerchantId, getLoginUser().getUser().getDeptId()); + long count = repositoryService.count(queryWrapper); + if (getLoginUser().getUser().isAdmin()) { + return true; + } + return count > 0; + } + +} diff --git a/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/SpecTypesController.java b/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/SpecTypesController.java new file mode 100644 index 0000000..1cbea11 --- /dev/null +++ b/fp-admin/src/main/java/com/zf/foodpurchase/fdsafe/web/merchant/SpecTypesController.java @@ -0,0 +1,219 @@ +package com.zf.foodpurchase.fdsafe.web.merchant; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.zf.foodpurchase.common.core.controller.BaseController; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.common.core.domain.entity.SysUser; +import com.zf.foodpurchase.common.core.page.TableDataInfo; +import com.zf.foodpurchase.common.utils.DateUtils; +import com.zf.foodpurchase.fdsafe.entity.Cascade; +import com.zf.foodpurchase.fdsafe.entity.SpecTypes; +import com.zf.foodpurchase.fdsafe.entity.SpecValues; +import com.zf.foodpurchase.fdsafe.service.ISpecTypesService; +import com.zf.foodpurchase.fdsafe.service.ISpecValuesService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +/** + *

+ * 商品规格类型表 前端控制器 + *

+ * + * @author lilj + * @since 2024-11-16 + */ +@Api(tags = "规格类型管理") +@RestController +@RequestMapping("/merchant/specTypes") +public class SpecTypesController extends BaseController { + @Autowired + private ISpecTypesService specTypesService; + + @Autowired + private ISpecValuesService specValuesService; + + @ApiOperation("查询规格类型列表") + @GetMapping("/list") + public TableDataInfo list(String specName) { + startPage(); + List typeList = new ArrayList<>(); + SysUser user=getLoginUser().getUser(); + Long merchantId = user.isAdmin()? null:user.getDeptId(); + + // 管理员 + if(merchantId == null){ + if(StringUtils.isNotBlank(specName)){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.like(SpecTypes::getSpecName, specName); + typeList = specTypesService.list(queryWrapper); + }else{ + typeList = specTypesService.list(); + } + } + // 非管理员 + else{ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SpecTypes::getMerchantId, merchantId); + queryWrapper.like(StringUtils.isNotBlank(specName),SpecTypes::getSpecName, specName); + typeList = specTypesService.list(queryWrapper); + } + + for (SpecTypes specTypes : typeList) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SpecValues::getSpecType, specTypes.getSpecType()); + List specValuesList = specValuesService.list(queryWrapper); + specTypes.setSpecValuesList(specValuesList); + // 是否有子节点 + boolean hasChildren = !CollectionUtils.isEmpty(specValuesList); + specTypes.setHasChildren(hasChildren); + + if(hasChildren){ + specTypes.getSpecValuesList().forEach(specValues -> specValues.setSpecName(specTypes.getSpecName())); + } + } + return getDataTable(typeList); + } + + @ApiOperation("规格列表级联结构") + @GetMapping("/cascade") + public AjaxResult cascade(Long merchantId) { + List typeList = new ArrayList<>(); + SysUser user=getLoginUser().getUser(); + if(user.isAdmin()){ + if(merchantId == null){ + return error("请传入商户id"); + }else{ + typeList = specTypesService.list(new LambdaQueryWrapper().eq(SpecTypes::getMerchantId, merchantId)); + } + }else{ + merchantId = user.getDeptId(); + typeList = specTypesService.list(new LambdaQueryWrapper().eq(SpecTypes::getMerchantId, merchantId)); + } + HashMap> map = new HashMap<>(); + List parentList = new ArrayList<>(); + // 逐层构建 + for (SpecTypes specTypes : typeList) { + Cascade parentNode = new Cascade(); + parentNode.setLabel(specTypes.getSpecName()); + parentNode.setValue(specTypes.getSpecType()); + // 级联结构构件 + List childrenList = new ArrayList<>(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SpecValues::getSpecType, specTypes.getSpecType()); + List specValuesList = specValuesService.list(queryWrapper); + // 是否有子节点 + boolean hasChildren = !CollectionUtils.isEmpty(specValuesList); + if(hasChildren){ + specValuesList.forEach(specValues -> { + Cascade cascade = new Cascade(); + if(StringUtils.isNotBlank(specValues.getSpecUnit())){ + cascade.setLabel(specValues.getSpecValue()+specValues.getSpecUnit()); + }else { + cascade.setLabel(specValues.getSpecValue()); + } + cascade.setValue(specValues.getId()); + childrenList.add(cascade); + + } ); + parentNode.setChildren(childrenList); + parentList.add(parentNode); + } + } + + return success(parentList); + } + + @ApiOperation("添加规格类型列表") + @PostMapping("/addSpecTypes") + public AjaxResult addSpecTypes(@Validated @RequestBody SpecTypes specTypes) { + SysUser user=getLoginUser().getUser(); + if(user.isAdmin()){ + if(specTypes.getMerchantId() == null){ + return error("请指定商户"); + } + }else{ + specTypes.setMerchantId(user.getDeptId()); + } + specTypes.setOperId(getUserId()); + specTypes.setCreateTime(DateUtils.getNowDate()); + return specTypesService.saveTypes(specTypes); + } + + // @ApiOperation("修改规格类型列表") + // @PostMapping("/modifySpecName") + // public AjaxResult modifySpecName(@Validated @RequestBody SpecTypes specTypes) { + // SysUser user=getLoginUser().getUser(); + // specTypes.setOperId(getUserId()); + // specTypes.setUpdateTime(DateUtils.getNowDate()); + // if(user.isAdmin()){ + // if(specTypes.getMerchantId() == null){ + // return error("请指定商户"); + // } + // }else{ + // specTypes.setMerchantId(user.getDeptId()); + // } + // return specTypesService.updateType(specTypes,user.isAdmin()); + // } + + // @ApiOperation("删除规格类型列表-单个") + // @DeleteMapping("/deleteById") + // public AjaxResult deleteById(Long id) { + // if (id == null) { + // return warn("请选择要删除的数据"); + // } + // + // // todo:如果有类型值关联,需要先删除对应的类型值 + // LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + // queryWrapper.eq(SpecValues::getSpecType, id); + // if (specValuesService.count(queryWrapper) > 0) { + // return error("该规格类型下有规格值,请先删除规格值"); + // } + // + // return toAjax(specTypesService.removeById(id)); + // } + + /** + * 注意: 需要确保改ids不存在关联的规格值,否则无法删除 + * + * @param id + * @return + */ + @ApiOperation("删除规格类型列表-多个") + @DeleteMapping("/deleteByIds") + public AjaxResult deleteByIds(Long id) { + if (id == null ) { + return warn("请选择要删除的数据"); + } + List list = new ArrayList<>(); + list.add(id); + SysUser user=getLoginUser().getUser(); + Long merchantId = user.isAdmin()? null:user.getDeptId(); + return specTypesService.removeSpecTypes(list,merchantId); + } + + + @ApiOperation("删除规格类型列表-多个") + @DeleteMapping("/deleteMoreIds") + public AjaxResult deleteMoreIds(Long[] ids) { + if (ids == null || ids.length <= 0) { + return warn("请选择要删除的数据"); + } + List list = Arrays.asList(ids); + SysUser user=getLoginUser().getUser(); + Long merchantId = user.isAdmin()? null:user.getDeptId(); + return specTypesService.removeSpecTypes(list,merchantId); + } + +} + diff --git a/fp-admin/src/main/resources/application-druid.yml b/fp-admin/src/main/resources/application-druid.yml index 0c88866..e70fcf1 100644 --- a/fp-admin/src/main/resources/application-druid.yml +++ b/fp-admin/src/main/resources/application-druid.yml @@ -12,13 +12,6 @@ spring: url: jdbc:mysql://39.165.209.170:3307/zf_school_food?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: zheng_wXn_fan*QFs_6aNvFq@keji_qDr.gPYsfBL - # 从库数据源 - slave: - # 从数据源开关/默认关闭 - #enabled: false - url: jdbc:mysql://39.165.209.170:3307/zf_shopping_mall?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 - username: root - password: zheng_wXn_fan*QFs_6aNvFq@keji_qDr.gPYsfBL # 初始连接数 initialSize: 5 # 最小连接池数量 diff --git a/fp-admin/src/main/resources/application.yml b/fp-admin/src/main/resources/application.yml index 23c6496..15c5987 100644 --- a/fp-admin/src/main/resources/application.yml +++ b/fp-admin/src/main/resources/application.yml @@ -26,7 +26,7 @@ server: port: 8090 servlet: # 应用的访问路径 - context-path: / + context-path: /schoolfood tomcat: # tomcat的URI编码 uri-encoding: UTF-8 @@ -79,9 +79,15 @@ spring: redis: # host: localhost # port: 6379 - host: 125.46.39.9 - database: 11 - password: zhengfan999 + # 地址 + host: 39.165.209.170 + # 端口,默认为6379 服务器密码:zhengfan999 + port: 6379 + # 数据库索引 + database: 0 + # 密码 + password: zheng_wXn_fan*QFs_6aNvFq@keji_qDr.gPYsfBL + # 连接超时时间 timeout: 10s lettuce: pool: diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/Browse.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/Browse.java new file mode 100644 index 0000000..917c561 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/Browse.java @@ -0,0 +1,96 @@ +package com.zf.foodpurchase.fdsafe.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 商品浏览记录表 + *

+ * + * @author lilj + * @since 2024-11-15 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("browse") +public class Browse implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户id + */ + @TableField("user_id") + private Long userId; + + @TableField(exist = false) + private String nickName; + + @NotNull(message="商家id不能为空") + @TableField("merchant_id") + private Long merchantId; + + + @TableField(exist = false) + private String merchantName; + /** + * 商品id + */ + @NotNull(message="商品id不能为空") + @TableField("product_id") + private Long productId; + + @TableField(exist = false) + private String productName; + + /** + * 浏览开始时间 + */ + @NotNull(message="浏览开始时间不能为空") + @TableField("start_time") + private Date startTime; + + /** + * 浏览结束时间 + */ + @NotNull(message="浏览结束时间不能为空") + @TableField("end_time") + private Date endTime; + + /** + * 浏览时间,单位:秒 + */ + @TableField("remain_time") + private Long remainTime; + + /** + * 创建时间 + */ + @TableField("create_time") + // @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @TableField(exist = false) + // @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date queryBeginTime; + + @TableField(exist = false) + // @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private Date queryEndTime; + + +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/Carousel.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/Carousel.java new file mode 100644 index 0000000..18a21f2 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/Carousel.java @@ -0,0 +1,82 @@ +package com.zf.foodpurchase.fdsafe.entity; + +import com.zf.foodpurchase.common.annotation.Excel; +import com.zf.foodpurchase.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import javax.validation.constraints.NotBlank; + +/** + * 商户轮播图对象 carousel + * + * @author ruoyi + * @date 2024-11-29 + */ +public class Carousel extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 一组轮播图id */ + @Excel(name = "一组轮播图id ") + private Long carouselId; + + /** 商户id */ + private Long merchantId; + + + /** 商户名称 */ + private String merchantName; + + /** 轮播图片url */ + @Excel(name = "轮播图片url") + @NotBlank(message = "图片不能为空") + private String carouselIamges; + + public String getMerchantName() { + return merchantName; + } + + public void setMerchantName(String merchantName) { + this.merchantName = merchantName; + } + + public void setCarouselId(Long carouselId) + { + this.carouselId = carouselId; + } + + public Long getCarouselId() + { + return carouselId; + } + public void setMerchantId(Long merchantId) + { + this.merchantId = merchantId; + } + + public Long getMerchantId() + { + return merchantId; + } + public void setCarouselIamges(String carouselIamges) + { + this.carouselIamges = carouselIamges; + } + + public String getCarouselIamges() + { + return carouselIamges; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("carouselId", getCarouselId()) + .append("merchantId", getMerchantId()) + .append("carouselIamges", getCarouselIamges()) + .append("createTime", getCreateTime()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/CartItem.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/CartItem.java new file mode 100644 index 0000000..d7dad42 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/CartItem.java @@ -0,0 +1,128 @@ +package com.zf.foodpurchase.fdsafe.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 购物车明细表 + *

+ * + * @author lilj + * @since 2024-11-19 + */ +@Data +public class CartItem implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 用户id + */ + @TableField("user_id") + private Long userId; + + /** + * 购物车id + */ + @TableField("cart_id") + @NotNull(message = "购物车id不能为空") + private Integer cartId; + + /** + * 商品id + */ + @NotNull(message = "商品id不能为空") + @TableField("product_id") + private Integer productId; + + @TableField("product_name") + private String productName; + + /** + * 商品规格id + */ + @TableField("product_spec_id") + private Integer productSpecId; + + /** + * 商品规格字符串 + */ + @TableField("spec_str") + private String specStr; + + /** + * 商品规格信息 + */ + @TableField(exist = false) + private ProductsSpec productSpec; + + /** + * 基础商品还是多规格商品 + */ + @NotNull(message = "是否为多规格商品不能为空") + @Length(max = 1, min = 1, message = "是否为多规格字段长度只能为1") + @TableField("is_specs") + private String isSpecs; + + /** + * 商品基本信息以及规格信息 + */ + @TableField(exist = false) + private Products products; + + /** + * 商品数量 + */ + @TableField("quantity") + @NotNull(message = "商品数量不能为空") + @Min(value = 1, message = "商品数量不能小于1") + private Integer quantity; + + /** + * 加入购物车时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + /** + * 更新时间 + */ + @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + + @TableField("merchant_id") + private Long merchantId; + + /** + * 微信平台跟服务商绑定的商户id + */ + @TableField("mchid") + private String mchid; + + /** + * 用户收货地址id + */ + @NotNull(message = "用户收货地址不能为空") + @TableField("address_id") + private Integer addressId; + + @TableField(exist = false) + private String image; + + @TableField(exist = false) + private String address; +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/Cascade.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/Cascade.java new file mode 100644 index 0000000..8778517 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/Cascade.java @@ -0,0 +1,22 @@ +package com.zf.foodpurchase.fdsafe.entity; + +/** + * @author:lilj + * @date:2024/12/24 + */ + +import lombok.Data; + +import java.util.List; + +/** + * 级联数据结构 + */ +@Data +public class Cascade { + + private String label; + private Integer value; + + private List children; +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/LogisticsInfo.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/LogisticsInfo.java new file mode 100644 index 0000000..711e83c --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/LogisticsInfo.java @@ -0,0 +1,150 @@ +package com.zf.foodpurchase.fdsafe.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 物流订单信息 + *

+ * + * @author lilj + * @since 2024-11-20 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class LogisticsInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 订单项id + */ + @TableField("out_trade_no") + @NotBlank(message = "订单号不能为空") + private String outTradeNo; + + /** + * 物流公司名称 + */ + @TableField("logistics_company") + @NotBlank(message = "物流公司名称不能为空") + private String logisticsCompany; + + /** + * 快递单号 + */ + @TableField("tracking_no") + @NotBlank(message = "快递单号不能为空") + private String trackingNo; + + /** + * 快递状态 + */ + @TableField("status") + @NotNull(message = "快递状态不能为空") + private Integer status; + + /** + * 快递当前位置 + */ + @TableField("current_location") + @NotBlank(message = "快递当前位置不能为空") + private String currentLocation; + + /** + * 发货位置 + */ + @TableField("start_location") + @NotBlank(message = "发货位置不能为空") + private String startLocation; + + /** + * 收货位置 + */ + @TableField("end_location") + private String endLocation; + + /** + * 预计抵达时间 + */ + @TableField("expected_delivery_date") + private Date expectedDeliveryDate; + + /** + * 创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + /** + * 更新时间 + */ + @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 商家id + */ + @TableField("merchant_id") + private Long merchantId; + + @TableField(exist = false ) + private String merchantName; + + /** + * 小程序用户id + */ + @TableField("user_id") + private Long userId; + + + @TableField(exist = false ) + private String nickName; + + /** + * 创建/更改物流信息人员id(商家/管理员) + */ + @TableField("oper_id") + private Long operId; + + @TableField("del_flag") + private String delFlag; + + @TableField(exist = false) + private String operName; + + @TableField(exist = false) + private Date beginTime; + + @TableField(exist = false) + private Date endTime; + + /** + * 发货时间 + */ + @TableField(exist = false) + private Date sendTime; + + /** + * 签收时间: + * 根据orderItem是否增加签收时间来判断是否放开注释 + */ + // @TableField(exist = false) + // private Date signTime; + +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/OrderItem.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/OrderItem.java new file mode 100644 index 0000000..9d57400 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/OrderItem.java @@ -0,0 +1,216 @@ +package com.zf.foodpurchase.fdsafe.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 订单明细表 + *

+ * + * @author lilj + * @since 2024-11-26 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class OrderItem implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 订单项 + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 微信用户标识 + */ + @TableField("openid") + private String openid; + + /** + * 用户id + */ + @TableField("user_id") + private Long userId; + + /** + * 微信支付订单号 + */ + @TableField("transaction_id") + private String transactionId; + + /** + * 微信合单商户订单号 + */ + @TableField("combine_out_trade_no") + private String combineOutTradeNo; + + /** + * 子单商户订单号 + */ + @TableField("out_trade_no") + private String outTradeNo; + + /** + * 父订单号 + */ + @TableField("order_id") + private Integer orderId; + + /** + * 商品id + */ + @TableField("product_id") + private Integer productId; + + /** + * 商户id + */ + @TableField("merchant_id") + private Long merchantId; + + @TableField("merchant_name") + private String merchantName; + + /** + * 规格JSON,[{规格类型:规格值},{规格类型:规格值}] + */ + @TableField("spec_str") + private String specStr; + + @TableField("spec_values") + private String specValueIds; + + /** + * 商品名称 + */ + @TableField("product_name") + private String productName; + + /** + * 商品价格 + */ + @TableField("price") + private Integer price; + + /** + * 购买类型:0 人民币购买;1 积分兑换 + */ + @TableField("buy_type") + private String buyType; + + /** + * 兑换所需积分 + */ + @TableField("integral") + private Integer integral; + + /** + * 购买数量 + */ + @TableField("quantity") + private Integer quantity; + + /** + * 商品url,用来订单中展示商品的缩略图 + */ + @TableField("product_pic_url") + private String productPicUrl; + + /** + * 支付时间 + */ + @TableField("pay_time") + private Date payTime; + + /** + * 发货时间 + */ + @TableField("send_time") + private Date sendTime; + + /** + * 交易成交时间 + */ + @TableField("finish_time") + private Date finishTime; + + + /** + * 订单创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + /** + * 订单更新时间 + */ + @TableField(value = "update_time", fill = FieldFill.UPDATE) + private Date updateTime; + + /** + * 订单状态:0 未支付;1 支付成功; 2 超时关闭; 3 用户取消; 4 已发货; 5 运输中; 6 已签收; 7 交易结束; 8 退款中;9 已退款; 10 退款异常; 11 物流异常 + */ + @TableField("order_status") + private Integer orderStatus; + + /** + * 是否逻辑删除 +逻辑删除:0 正常;1 已删除 + */ + @TableField("del_flag") + private String delFlag; + + /** + * 商品规格id + */ + @TableField("product_spec_id") + private Integer productSpecId; + + @TableField("product_description") + private String productDescription; + + @TableField("return_integral") + private Integer returnIntegral; + + @TableField("mchid") + private String mchid; + + @TableField("user_address_id") + private Integer userAddressId; + + @TableField("area_code") + private String areaCode; + + @TableField("detail_address") + private String detailAddress; + + @TableField(exist = false) + private String showAddress; + + @TableField("phone_number") + private String phoneNumber; + + @TableField("logistics_id") + private Integer logisticsId; + + @TableField(exist = false) + private LogisticsInfo logisticsInfo; + + @TableField(exist = false) + private String nickName; + + @TableField("recp_name") + private String recpName; +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/Products.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/Products.java new file mode 100644 index 0000000..0fb57b0 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/Products.java @@ -0,0 +1,496 @@ +package com.zf.foodpurchase.fdsafe.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.zf.foodpurchase.common.annotation.Excel; +import com.zf.foodpurchase.common.core.domain.BaseEntity; +import com.zf.foodpurchase.fdsafe.vo.ProductsSpecVO; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.List; + +/** + * 商品对象 products + * + * @author ruoyi + * @date 2024-11-16 + */ +public class Products extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 商品id + */ + private Integer productId; + + /** + * 商户id + */ + @Excel(name = "商户id") + private Long merchantId; + + /** + * 商户id + */ + @Excel(name = "商家名称") + private String merchantName; + + /** + * 名称 + */ + @Excel(name = "名称") + @NotBlank(message = "商品名称不能为空") + private String productName; + + /** + * 描述 + */ + @Excel(name = "描述") + private String description; + + public String getFirstImage() { + return firstImage; + } + + public void setFirstImage(String firstImage) { + this.firstImage = firstImage; + } + + /** + * 单价 + */ + @Excel(name = "单价") + @Min(value = 0, message = "价格不能小于0") + private Integer basePrice; + + /** + * 库存 + */ + @Excel(name = "库存") + @Min(value = 0, message = "库存不能小于0") + private Integer totalStock; + + @Min(value = 1, message = "购买数量不能小于0") + private Integer buyCount; + + /** + * 商品图片 + */ + @Excel(name = "商品图片") + private String images; + + private String firstImage; + + private String[] imagesArray; + + /** + * 所属类别 + */ + @Excel(name = "所属类别") + @NotBlank(message = "所属类别不能为空") + private String categoryId; + + /** + * 上架状态 + */ + @Excel(name = "上架状态") + @NotNull(message = "上架状态不能为空") + @Length(min = 1, max = 1, message = "上架状态最大长度为1") + private String status; + + /** + * 购买类型 + */ + @Excel(name = "购买类型") + @NotNull(message = "购买类型不能为空") + @Length(min = 1, max = 1, message = "购买类型最大长度为1") + private String type; + + /** + * 所需积分 + */ + @Excel(name = "所需积分") + @Min(value = 0, message = "所需积分不能小于0") + private Integer baseIntegral; + + /** + * 返还积分 + */ + @Excel(name = "返还积分") + @Min(value = 0, message = "返还积分不能小于0") + private Integer baseReturnIntergral; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 操作人id + */ + @Excel(name = "操作人id") + private Long operId; + + /** + * 是否 + */ + @Excel(name = "是否") + private String delFlag; + + /** + * 详情图片 + */ + @Excel(name = "详情图片") + private String detailImages; + + private Long version; + + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } + + /** + * 多规格级联结构 + */ + private List specs; + + /** + * 收获地址id,微信小程序生成订单时使用 + */ + private Integer addressId; + + public Integer getAddressId() { + return addressId; + } + + public void setAddressId(Integer addressId) { + this.addressId = addressId; + } + + public List getSpecs() { + return specs; + } + + public void setSpecs(List specs) { + this.specs = specs; + } + + private String firstDetailsImage; + + public String getFirstDetailsImage() { + return firstDetailsImage; + } + + public void setFirstDetailsImage(String firstDetailsImage) { + this.firstDetailsImage = firstDetailsImage; + } + + public String[] getDetailImagesArray() { + return detailImagesArray; + } + + public void setDetailImagesArray(String[] detailImagesArray) { + this.detailImagesArray = detailImagesArray; + } + + public String[] getImagesArray() { + return imagesArray; + } + + public void setImagesArray(String[] imagesArray) { + this.imagesArray = imagesArray; + } + + private String[] detailImagesArray; + + @Excel(name = "是否多规格商品") + private String isSpecs; + + private Integer sailCount; + + private String hot; + + private String recommend; + + private ProductsSpec productsSpec; + + public List getProductsSpecList() { + return productsSpecList; + } + + public void setProductsSpecList(List productsSpecList) { + this.productsSpecList = productsSpecList; + } + + private List productsSpecList; + + private Integer limitNum = 5; + + private String isNew; + + public String getIsNew() { + return isNew; + } + + public void setIsNew(String isNew) { + this.isNew = isNew; + } + + public Integer getLimitNum() { + return limitNum; + } + + public void setLimitNum(Integer limitNum) { + this.limitNum = limitNum; + } + + public ProductsSpec getProductsSpec() { + return productsSpec; + } + + public void setProductsSpec(ProductsSpec productsSpec) { + this.productsSpec = productsSpec; + } + + List specValuesList; + + public Integer getSailCount() { + return sailCount; + } + + public void setSailCount(Integer sailCount) { + this.sailCount = sailCount; + } + + public String getHot() { + return hot; + } + + public void setHot(String hot) { + this.hot = hot; + } + + public String getRecommend() { + return recommend; + } + + public void setRecommend(String recommend) { + this.recommend = recommend; + } + + + public List getSpecValuesList() { + return specValuesList; + } + + public void setSpecValuesList(List specValuesList) { + this.specValuesList = specValuesList; + } + + public String getMerchantName() { + return merchantName; + } + + public void setMerchantName(String merchantName) { + this.merchantName = merchantName; + } + + public String getIsSpecs() { + return isSpecs; + } + + public void setIsSpecs(String isSpecs) { + this.isSpecs = isSpecs; + } + + public void setProductId(Integer productId) { + this.productId = productId; + } + + public Integer getProductId() { + return productId; + } + + public void setMerchantId(Long merchantId) { + this.merchantId = merchantId; + } + + public Long getMerchantId() { + return merchantId; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public String getProductName() { + return productName; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } + + public void setBasePrice(Integer basePrice) { + this.basePrice = basePrice; + } + + public Integer getBasePrice() { + return basePrice; + } + + public void setTotalStock(Integer totalStock) { + this.totalStock = totalStock; + } + + public Integer getTotalStock() { + return totalStock; + } + + public void setImages(String images) { + this.images = images; + } + + public String getImages() { + return images; + } + + public void setCategoryId(String categoryId) { + this.categoryId = categoryId; + } + + public String getCategoryId() { + return categoryId; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } + + public void setType(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + public void setBaseIntegral(Integer baseIntegral) { + this.baseIntegral = baseIntegral; + } + + public Integer getBaseIntegral() { + return baseIntegral; + } + + public void setBaseReturnIntergral(Integer baseReturnIntergral) { + this.baseReturnIntergral = baseReturnIntergral; + } + + public Integer getBaseReturnIntergral() { + return baseReturnIntergral; + } + + @Override + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + @Override + + public Date getCreateTime() { + return createTime; + } + + @Override + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + @Override + public Date getUpdateTime() { + return updateTime; + } + + public void setOperId(Long operId) { + this.operId = operId; + } + + public Long getOperId() { + return operId; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDetailImages(String detailImages) { + this.detailImages = detailImages; + } + + public String getDetailImages() { + return detailImages; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("productId", getProductId()) + .append("merchantId", getMerchantId()) + .append("productName", getProductName()) + .append("description", getDescription()) + .append("basePrice", getBasePrice()) + .append("totalStock", getTotalStock()) + .append("images", getImages()) + .append("categoryId", getCategoryId()) + .append("status", getStatus()) + .append("type", getType()) + .append("baseIntegral", getBaseIntegral()) + .append("baseReturnIntergral", getBaseReturnIntergral()) + .append("createTime", getCreateTime()) + .append("updateTime", getUpdateTime()) + .append("operId", getOperId()) + .append("delFlag", getDelFlag()) + .append("detailImages", getDetailImages()) + .toString(); + } + + public Integer getBuyCount() { + return buyCount; + } + + public void setBuyCount(Integer buyCount) { + this.buyCount = buyCount; + } +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/ProductsSpec.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/ProductsSpec.java new file mode 100644 index 0000000..6118d7f --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/ProductsSpec.java @@ -0,0 +1,158 @@ +package com.zf.foodpurchase.fdsafe.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + *

+ * 商品价格表 + *

+ * + * @author lilj + * @since 2024-11-18 + */ +@Data +public class ProductsSpec implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 商品-规格id + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 商品id + */ + @TableField("product_id") + @NotNull(message = "商品id不能为空") + private Integer productId; + + @TableField("merchant_id") + private Long merchantId; + + /** + * 规格值ids + */ + @TableField("spec_values") + // @NotNull(message = "规格值不能为空") + private String specValues; + + /** + * specValueArray + */ + @TableField(exist = false) + private List> specValueArray; + + /** + * 规格值类型与规格类型id + */ + @TableField(exist = false) + List specValuesList; + + /** + * 商品价格 + */ + @TableField("price") + @NotNull(message = "价格不能为空") + @Min(value = 0, message = "价格不能小于0") + private Integer price; + + /** + * 改规格商品数量 + */ + @TableField("stock") + @NotNull(message = "库存不能为空") + @Min(value = 0, message = "库存不能小于0") + private Integer stock; + + @TableField(exist = false) + private Integer buyCount; + /** + * 0:人民币购买; 1:积分兑换 + */ + @TableField("type") + // @NotBlank(message = "购买类型不能为空") + private String type; + + /** + * 所需积分数 + */ + @TableField("integral") + private Integer integral; + + /** + * 向推荐人返还积分数 + */ + @TableField("return_integral") + @Min(value = 0, message = "返还积分不能小于0") + private Integer returnIntegral; + + /** + * 创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + /** + * 更新时间 + */ + @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 规格对应商品图片 + */ + @TableField("spec_image") + private String specImage; + + + @TableField(exist = false) + private String firstSpecImage; + + @TableField(exist = false) + private String[] specImagesArray; + + /** + * 操作人id + */ + @TableField("oper_id") + private Long operId; + + + public List getSpecValuesIds(){ + List specValuesIds = new ArrayList<>(); + if(specValues!=null){ + if(!specValues.contains(",")){ + specValuesIds.add(Integer.parseInt(specValues)); + }else{ + String[] split = specValues.split(","); + for (String s : split) { + specValuesIds.add(Integer.parseInt(s)); + } + } + } + return specValuesIds; + } + + @TableField(exist = false) + private String specStr; + + @TableField("ps_version") + private Long psVersion; + + @TableField(exist = false) + private int addressId; + +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/Repository.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/Repository.java new file mode 100644 index 0000000..e5d3654 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/Repository.java @@ -0,0 +1,89 @@ +package com.zf.foodpurchase.fdsafe.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 仓库列表 + *

+ * + * @author lilj + * @since 2024-11-20 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class Repository implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @NotNull(message = "仓库名称不能为空") + @TableField("repo_name") + private String repoName; + /** + * 所属商户id + */ + @TableField("merchant_id") + private Long merchantId; + + + /** + * 所属商户名称 + */ + @TableField(exist = false) + private String merchantName; + + /** + * 区划编码 + */ + // @NotNull(message = "所属区划不能为空") + @TableField("area_code") + private String areaCode; + + /** + * 详细地址 + */ + @NotNull(message = "详细地址不能为空") + @TableField("detail_address") + private String detailAddress; + + /** + * 是否是默认仓库:0 否 1 是 + */ + @NotNull(message = "是否是默认仓库不能为空") + @TableField("default_repo") + private String defaultRepo; + + /** + * 创建时间 + */ + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + /** + * 更新时间 + */ + @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) + private Date updateTime; + + /** + * 操作人 + */ + @TableField("oper_id") + private Long operId; + + +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/SpecTypes.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/SpecTypes.java new file mode 100644 index 0000000..b6836d9 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/SpecTypes.java @@ -0,0 +1,76 @@ +package com.zf.foodpurchase.fdsafe.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + *

+ * 商品规格类型表 + *

+ * + * @author lilj + * @since 2024-11-16 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("spec_types") +public class SpecTypes implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 规格类型 + */ + @TableId(value = "spec_type", type = IdType.AUTO) + private Integer specType; + + /** + * 所属商户id + */ + @TableField("merchant_id") + private Long merchantId; + + /** + * 规格名称 + */ + @TableField("spec_name") + @NotNull(message = "规格名称不能为空") + private String specName; + + @TableField(exist = false) + List specValuesList; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @TableField("update_time") + private Date updateTime; + + /** + * 操作人id + */ + @TableField("oper_id") + private Long operId; + + @TableField(exist = false) + private boolean hasChildren; + +} + diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/SpecValues.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/SpecValues.java new file mode 100644 index 0000000..d362d72 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/entity/SpecValues.java @@ -0,0 +1,81 @@ +package com.zf.foodpurchase.fdsafe.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 规格值表 + *

+ * + * @author lilj + * @since 2024-11-16 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class SpecValues implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 规格类型id + */ + @TableField("spec_type") + @NotNull(message = "规格类型不能为空") + private Integer specType; + + @TableField(exist = false) + private String specName; + + /** + * 所属商户id + */ + @TableField("merchant_id") + private Long merchantId; + + /** + * 规格值 + */ + @TableField("spec_value") + @NotBlank(message = "规格值不能为空") + private String specValue; + + /** + * 规格单位 + */ + @TableField("spec_unit") + private String specUnit; + + /** + * 创建时间 + */ + @TableField("create_time") + private Date createTime; + + /** + * 更新时间 + */ + @TableField("update_time") + private Date updateTime; + + /** + * 操作人 + */ + @TableField("oper_id") + private Long operId; + + +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/BrowseMapper.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/BrowseMapper.java new file mode 100644 index 0000000..1112ee5 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/BrowseMapper.java @@ -0,0 +1,19 @@ +package com.zf.foodpurchase.fdsafe.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zf.foodpurchase.fdsafe.entity.Browse; + +import java.util.List; + +/** + *

+ * 商品浏览记录表 Mapper 接口 + *

+ * + * @author lilj + * @since 2024-11-15 + */ +public interface BrowseMapper extends BaseMapper { + + List joinQueryList(Browse browse); +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/CarouselMapper.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/CarouselMapper.java new file mode 100644 index 0000000..958f00e --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/CarouselMapper.java @@ -0,0 +1,63 @@ +package com.zf.foodpurchase.fdsafe.mapper; + + +import com.zf.foodpurchase.fdsafe.entity.Carousel; + +import java.util.List; + +/** + * 商户轮播图Mapper接口 + * + * @author ruoyi + * @date 2024-11-29 + */ +public interface CarouselMapper +{ + /** + * 查询商户轮播图 + * + * @param carouselId 商户轮播图主键 + * @return 商户轮播图 + */ + public Carousel selectCarouselByCarouselId(Long carouselId); + + /** + * 查询商户轮播图列表 + * + * @param carousel 商户轮播图 + * @return 商户轮播图集合 + */ + public List selectCarouselList(Carousel carousel); + + /** + * 新增商户轮播图 + * + * @param carousel 商户轮播图 + * @return 结果 + */ + public int insertCarousel(Carousel carousel); + + /** + * 修改商户轮播图 + * + * @param carousel 商户轮播图 + * @return 结果 + */ + public int updateCarousel(Carousel carousel); + + /** + * 删除商户轮播图 + * + * @param carouselId 商户轮播图主键 + * @return 结果 + */ + public int deleteCarouselByCarouselId(Long carouselId); + + /** + * 批量删除商户轮播图 + * + * @param carouselIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteCarouselByCarouselIds(Long[] carouselIds); +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/ProductsMapper.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/ProductsMapper.java new file mode 100644 index 0000000..aa402c1 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/ProductsMapper.java @@ -0,0 +1,97 @@ +package com.zf.foodpurchase.fdsafe.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zf.foodpurchase.fdsafe.entity.Products; + +import java.util.List; + +/** + * 商品Mapper接口 + * + * @author ruoyi + * @date 2024-11-16 + */ +public interface ProductsMapper extends BaseMapper +{ + /** + * 查询商品 + * + * @param productId 商品主键 + * @return 商品 + */ + public Products selectProductsByProductId(Integer productId); + + /** + * 查询商品列表 + * + * @param products 商品 + * @return 商品集合 + */ + public List selectProductsList(Products products); + + /** + * 热销商品查询 + * + * @param products 商品 + * @return 商品集合 + */ + public List selectHotProducts(Products products); + + /** + * 推荐商品 + * + * @param products 商品 + * @return 商品集合 + */ + public List selectRecommendProducts(Products products); + + /** + * 新品上架 + * + * @param products 商品 + * @return 商品集合 + */ + public List selectNewProductsList(Products products); + + /** + * 查询商品列表,按销量查询 + * + * @param products 商品 + * @return 商品集合 + */ + public List selectSailCountProducts(Products products); + + /** + * 新增商品 + * + * @param products 商品 + * @return 结果 + */ + public int insertProducts(Products products); + + /** + * 修改商品 + * + * @param products 商品 + * @return 结果 + */ + public int updateProducts(Products products); + + /** + * 删除商品 + * + * @param productId 商品主键 + * @return 结果 + */ + public int deleteProductsByProductId(Integer productId); + + /** + * 批量删除商品 + * + * @param productIds 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteProductsByProductIds(Integer[] productIds); + + int deleteProductsLogicByProductIds(Integer[] productIds); +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/ProductsSpecMapper.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/ProductsSpecMapper.java new file mode 100644 index 0000000..80b5a73 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/ProductsSpecMapper.java @@ -0,0 +1,21 @@ +package com.zf.foodpurchase.fdsafe.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zf.foodpurchase.fdsafe.entity.ProductsSpec; + +import java.util.Map; + +/** + *

+ * 商品价格表 Mapper 接口 + *

+ * + * @author lilj + * @since 2024-11-18 + */ +public interface ProductsSpecMapper extends BaseMapper { + + int updateProductsSpec(ProductsSpec productsSpec); + + Map selectMinOne(Integer productId); +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/RepositoryMapper.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/RepositoryMapper.java new file mode 100644 index 0000000..a8691c2 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/RepositoryMapper.java @@ -0,0 +1,19 @@ +package com.zf.foodpurchase.fdsafe.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zf.foodpurchase.fdsafe.entity.Repository; + +import java.util.List; + +/** + *

+ * 仓库列表 Mapper 接口 + *

+ * + * @author lilj + * @since 2024-11-20 + */ +public interface RepositoryMapper extends BaseMapper { + + List joinQueryList(Repository quryRepository); +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/SpecTypesMapper.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/SpecTypesMapper.java new file mode 100644 index 0000000..4087620 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/SpecTypesMapper.java @@ -0,0 +1,16 @@ +package com.zf.foodpurchase.fdsafe.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zf.foodpurchase.fdsafe.entity.SpecTypes; + +/** + *

+ * 商品规格类型表 Mapper 接口 + *

+ * + * @author lilj + * @since 2024-11-16 + */ +public interface SpecTypesMapper extends BaseMapper { + +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/SpecValuesMapper.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/SpecValuesMapper.java new file mode 100644 index 0000000..a39b31f --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/mapper/SpecValuesMapper.java @@ -0,0 +1,21 @@ +package com.zf.foodpurchase.fdsafe.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zf.foodpurchase.fdsafe.entity.SpecValues; + +import java.util.List; + +/** + *

+ * 规格值表 Mapper 接口 + *

+ * + * @author lilj + * @since 2024-11-16 + */ +public interface SpecValuesMapper extends BaseMapper { + + List queryList(SpecValues specValues); + + List queryByIds(List specValuesIds); +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/IBrowseService.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/IBrowseService.java new file mode 100644 index 0000000..74b1d8b --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/IBrowseService.java @@ -0,0 +1,19 @@ +package com.zf.foodpurchase.fdsafe.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.zf.foodpurchase.fdsafe.entity.Browse; + +import java.util.List; + +/** + *

+ * 商品浏览记录表 服务类 + *

+ * + * @author lilj + * @since 2024-11-15 + */ +public interface IBrowseService extends IService { + + List joinQueryList(Browse browse); +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/ICarouselService.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/ICarouselService.java new file mode 100644 index 0000000..d8039a5 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/ICarouselService.java @@ -0,0 +1,63 @@ +package com.zf.foodpurchase.fdsafe.service; + + +import com.zf.foodpurchase.fdsafe.entity.Carousel; + +import java.util.List; + +/** + * 商户轮播图Service接口 + * + * @author ruoyi + * @date 2024-11-29 + */ +public interface ICarouselService +{ + /** + * 查询商户轮播图 + * + * @param carouselId 商户轮播图主键 + * @return 商户轮播图 + */ + public Carousel selectCarouselByCarouselId(Long carouselId); + + /** + * 查询商户轮播图列表 + * + * @param carousel 商户轮播图 + * @return 商户轮播图集合 + */ + public List selectCarouselList(Carousel carousel); + + /** + * 新增商户轮播图 + * + * @param carousel 商户轮播图 + * @return 结果 + */ + public int insertCarousel(Carousel carousel); + + /** + * 修改商户轮播图 + * + * @param carousel 商户轮播图 + * @return 结果 + */ + public int updateCarousel(Carousel carousel); + + /** + * 批量删除商户轮播图 + * + * @param carouselIds 需要删除的商户轮播图主键集合 + * @return 结果 + */ + public int deleteCarouselByCarouselIds(Long[] carouselIds); + + /** + * 删除商户轮播图信息 + * + * @param carouselId 商户轮播图主键 + * @return 结果 + */ + public int deleteCarouselByCarouselId(Long carouselId); +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/IProductsService.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/IProductsService.java new file mode 100644 index 0000000..502f0ec --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/IProductsService.java @@ -0,0 +1,116 @@ +package com.zf.foodpurchase.fdsafe.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.fdsafe.entity.Products; + +import java.util.List; + +/** + * 商品Service接口 + * + * @author ruoyi + * @date 2024-11-16 + */ +public interface IProductsService extends IService +{ + /** + * 查询商品 + * + * @param productId 商品主键 + * @return 商品 + */ + public Products selectProductsByProductId(Integer productId); + + /** + * 查询商品列表 + * + * @param products 商品 + * @return 商品集合 + */ + public List selectProductsList(Products products); + + /** + * 新增商品 + * + * @param products 商品 + * @return 结果 + */ + public int insertProducts(Products products); + + /** + * 直接插入不做任何处理 + * + * @param products 商品 + * @return 结果 + */ + public int insertProductsDirect(Products products); + + /** + * 新增商品带单品 + * + * @param products 商品 + * @return 结果 + */ + public int insertProductsAndSpec(Products products); + /** + * 修改商品 + * + * @param products 商品 + * @return 结果 + */ + public int updateProducts(Products products); + + /** + * 多规格变动更新商品 + * @param products + * @return + */ + public int updateProductsAndSpec(Products products); + + /** + * 通用更新,多规格变单规格,单规格变多规格 + * @param products + * @return + */ + public int commonUpdateProducts(Products products); + + + /** + * 系统内部调用,不校验商品直接修改 + * @param products + * @return + */ + public int updateProductsDirect(Products products); + + /** + * 批量删除商品 + * + * @param productIds 需要删除的商品主键集合 + * @return 结果 + */ + public int deleteProductsByProductIds(Integer[] productIds ,boolean isAllowDeleteSpecs); + + /** + * 删除商品信息 + * + * @param productId 商品主键 + * @return 结果 + */ + public int deleteProductsByProductId(Integer productId,boolean isAllowDeleteSpecs); + + int deleteProductsLogicByProductIds(Integer[] productIds); + + List selectHotProducts(Products products); + + List selectRecommendProducts(Products products); + + List selectNewProductsList(Products products); + + List selectSailCountProducts(Products products); + + AjaxResult getDetails(Integer productId); + + public Products preDealProducts(Products products); + +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/IProductsSpecService.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/IProductsSpecService.java new file mode 100644 index 0000000..21053aa --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/IProductsSpecService.java @@ -0,0 +1,48 @@ +package com.zf.foodpurchase.fdsafe.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.common.core.page.TableDataInfo; +import com.zf.foodpurchase.fdsafe.entity.Products; +import com.zf.foodpurchase.fdsafe.entity.ProductsSpec; + +import java.util.List; + +/** + *

+ * 商品价格表 服务类 + *

+ * + * @author lilj + * @since 2024-11-18 + */ +public interface IProductsSpecService extends IService { + + TableDataInfo queryList(ProductsSpec productsSpec); + + + Integer queryExists(ProductsSpec productsSpec); + + + AjaxResult removeProductsByIds(List list); + + List listWithProductSpecValues(LambdaQueryWrapper queryWrapper); + + + ProductsSpec preDealSpecValues(ProductsSpec spec); + + public ProductsSpec preDealProductsSpec(Products products, ProductsSpec productsSpec); + + boolean addWithSpec(Products products); + + public Products preDealMultisSpecProducts(Products products); + + boolean modifyProductsSepcList(List productsSpecList); + + int commonUpdateProducts(Products products); + + boolean updateSingleProducts(Products products); + + boolean updateMulSpecProducts(Products products); +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/IRepositoryService.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/IRepositoryService.java new file mode 100644 index 0000000..3212b35 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/IRepositoryService.java @@ -0,0 +1,24 @@ +package com.zf.foodpurchase.fdsafe.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.fdsafe.entity.Repository; + +import java.util.List; + +/** + *

+ * 仓库列表 服务类 + *

+ * + * @author lilj + * @since 2024-11-20 + */ +public interface IRepositoryService extends IService { + + List joinQueryList(Repository quryRepository); + + AjaxResult saveRepo(Repository repository); + + AjaxResult modifyRepo(Repository repository); +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/ISpecTypesService.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/ISpecTypesService.java new file mode 100644 index 0000000..3398cad --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/ISpecTypesService.java @@ -0,0 +1,25 @@ +package com.zf.foodpurchase.fdsafe.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.fdsafe.entity.SpecTypes; + +import java.util.List; + +/** + *

+ * 商品规格类型表 服务类 + *

+ * + * @author lilj + * @since 2024-11-16 + */ +public interface ISpecTypesService extends IService { + + + AjaxResult saveTypes(SpecTypes specTypes); + + AjaxResult removeSpecTypes(List list,Long merchantId); + + AjaxResult updateType(SpecTypes specTypes, boolean admin); +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/ISpecValuesService.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/ISpecValuesService.java new file mode 100644 index 0000000..5497b37 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/ISpecValuesService.java @@ -0,0 +1,27 @@ +package com.zf.foodpurchase.fdsafe.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.fdsafe.entity.SpecValues; + +import java.util.List; + +/** + *

+ * 规格值表 服务类 + *

+ * + * @author lilj + * @since 2024-11-16 + */ +public interface ISpecValuesService extends IService { + + List queryList(SpecValues specValues); + + + List queryByIds(List specValuesIds); + + AjaxResult updateSpecValues(SpecValues specValues,boolean isAdmin); + + AjaxResult removeValues(List idList, Long merchantId); +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/BrowseServiceImpl.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/BrowseServiceImpl.java new file mode 100644 index 0000000..00a3a4d --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/BrowseServiceImpl.java @@ -0,0 +1,29 @@ +package com.zf.foodpurchase.fdsafe.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.zf.foodpurchase.fdsafe.entity.Browse; +import com.zf.foodpurchase.fdsafe.service.IBrowseService; +import com.zf.foodpurchase.fdsafe.mapper.BrowseMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 商品浏览记录表 服务实现类 + *

+ * + * @author lilj + * @since 2024-11-15 + */ +@Service +public class BrowseServiceImpl extends ServiceImpl implements IBrowseService { + @Autowired + private BrowseMapper browseMapper; + + @Override + public List joinQueryList(Browse browse) { + return browseMapper.joinQueryList(browse); + } +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/CarouselServiceImpl.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/CarouselServiceImpl.java new file mode 100644 index 0000000..de57e8d --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/CarouselServiceImpl.java @@ -0,0 +1,97 @@ +package com.zf.foodpurchase.fdsafe.service.impl; + +import com.zf.foodpurchase.common.utils.DateUtils; +import com.zf.foodpurchase.fdsafe.entity.Carousel; +import com.zf.foodpurchase.fdsafe.mapper.CarouselMapper; +import com.zf.foodpurchase.fdsafe.service.ICarouselService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 商户轮播图Service业务层处理 + * + * @author ruoyi + * @date 2024-11-29 + */ +@Service +public class CarouselServiceImpl implements ICarouselService +{ + @Autowired + private CarouselMapper carouselMapper; + + /** + * 查询商户轮播图 + * + * @param carouselId 商户轮播图主键 + * @return 商户轮播图 + */ + @Override + public Carousel selectCarouselByCarouselId(Long carouselId) + { + return carouselMapper.selectCarouselByCarouselId(carouselId); + } + + /** + * 查询商户轮播图列表 + * + * @param carousel 商户轮播图 + * @return 商户轮播图 + */ + @Override + public List selectCarouselList(Carousel carousel) + { + return carouselMapper.selectCarouselList(carousel); + } + + /** + * 新增商户轮播图 + * + * @param carousel 商户轮播图 + * @return 结果 + */ + @Override + public int insertCarousel(Carousel carousel) + { + carousel.setCreateTime(DateUtils.getNowDate()); + return carouselMapper.insertCarousel(carousel); + } + + /** + * 修改商户轮播图 + * + * @param carousel 商户轮播图 + * @return 结果 + */ + @Override + public int updateCarousel(Carousel carousel) + { + carousel.setUpdateTime(DateUtils.getNowDate()); + return carouselMapper.updateCarousel(carousel); + } + + /** + * 批量删除商户轮播图 + * + * @param carouselIds 需要删除的商户轮播图主键 + * @return 结果 + */ + @Override + public int deleteCarouselByCarouselIds(Long[] carouselIds) + { + return carouselMapper.deleteCarouselByCarouselIds(carouselIds); + } + + /** + * 删除商户轮播图信息 + * + * @param carouselId 商户轮播图主键 + * @return 结果 + */ + @Override + public int deleteCarouselByCarouselId(Long carouselId) + { + return carouselMapper.deleteCarouselByCarouselId(carouselId); + } +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/ProductsServiceImpl.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/ProductsServiceImpl.java new file mode 100644 index 0000000..ad7ac28 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/ProductsServiceImpl.java @@ -0,0 +1,580 @@ +package com.zf.foodpurchase.fdsafe.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.zf.foodpurchase.common.constant.Constants; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.common.exception.ServiceException; +import com.zf.foodpurchase.common.utils.StringUtils; +import com.zf.foodpurchase.fdsafe.entity.Products; +import com.zf.foodpurchase.fdsafe.entity.ProductsSpec; +import com.zf.foodpurchase.fdsafe.entity.SpecValues; +import com.zf.foodpurchase.fdsafe.mapper.ProductsMapper; +import com.zf.foodpurchase.fdsafe.mapper.ProductsSpecMapper; +import com.zf.foodpurchase.fdsafe.service.IProductsService; +import com.zf.foodpurchase.fdsafe.service.ISpecValuesService; +import com.zf.foodpurchase.fdsafe.utils.ImagesPrefixUtil; +import com.zf.foodpurchase.fdsafe.vo.ProductsSpecVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.*; + +/** + * 商品Service业务层处理 + * + * @author ruoyi + * @date 2024-11-16 + */ +@Service +public class ProductsServiceImpl extends ServiceImpl implements IProductsService { + @Autowired + private ProductsMapper productsMapper; + + @Autowired + private ProductsSpecMapper productsSpecMapper; + + @Autowired + private ISpecValuesService specValuesService; + + + /** + * 查询商品 + * + * @param productId 商品主键 + * @return 商品 + */ + @Override + public Products selectProductsByProductId(Integer productId) { + return productsMapper.selectProductsByProductId(productId); + } + + /** + * 查询商品列表 + * + * @param products 商品 + * @return 商品 + */ + @Override + public List selectProductsList(Products products) { + return productsMapper.selectProductsList(products); + } + + /** + * 新增商品 + * + * @param products 商品 + * @return 结果 + */ + @Override + public int insertProducts(Products products) { + products = preDealProducts(products); + return productsMapper.insertProducts(products); + } + + /** + * 新增商品-直接插入不做任何校验处理 + * + * @param products 商品 + * @return 结果 + */ + @Override + public int insertProductsDirect(Products products) { + return productsMapper.insertProducts(products); + } + + /** + * 新增商品 + * + * @param products 多规格带一个单规格 + * @return 结果 + */ + @Override + public int insertProductsAndSpec(Products products) { + + products = preDealProductsAndSpec(products); + return productsMapper.insertProducts(products); + } + + /** + * 修改商品:单品变规格商品库存清零,添加具体规格商品自动计算. + * 多规格商品变单规格商品,自动清除规格信息 + * + * @param products 商品 + * @return 结果 + */ + @Transactional + @Override + public int updateProducts(Products products) { + String msg = null; + // 需要校验是否修改商品的库存信息 + Products oldProducts = selectProductsByProductId(products.getProductId()); + + // 不允许单规格变多规格,规格类型不发生变动,其实都可以的。规格类型变动了呢? + if (Constants.MULTI_SPEC.equals(products.getIsSpecs()) && Constants.SINGLE_SPEC.equals(oldProducts.getIsSpecs())) { + // products.setTotalStock(0); + throw new ServiceException("单品无法修改为多规格"); + } + // 商品为多规格商品,且修改了库存数目 + if (oldProducts.getIsSpecs().equals(Constants.MULTI_SPEC) && !oldProducts.getTotalStock().equals(products.getTotalStock())) { + throw new ServiceException("多规格商品不允许直接修改商品库存,请修改具体规格下的商品库存"); + } + + + + // 多规格商品变单规格商品,清除多规格商品 + if (Constants.SINGLE_SPEC.equals(products.getIsSpecs()) && Constants.MULTI_SPEC.equals(oldProducts.getIsSpecs())) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProductsSpec::getProductId, products.getProductId()); + productsSpecMapper.delete(queryWrapper); + } + + // 商品的购买类型发生变动 + // 商品购买类型发生变动,多规格需要提示信息 + if (!oldProducts.getType().equals(products.getType())) { + // 价格与积分不兼容 + + + // if(Constants.MULTI_SPEC.equals(products.getIsSpecs())){ + // // 规格变动默认进行下架处理,因为价格和积分不兼容 + // products.setStatus(Constants.GOODS_STATUS_DOWN); + // msg = "多规格商品类型变更,默认下架,请检查商品的规格信息"; + // throw new ServiceException("多规格商品不允许修改购买类型"); + // } + // LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + // queryWrapper.eq(ProductsSpec::getProductId, products.getProductId()); + // List productsSpecList = productsSpecMapper.selectList(queryWrapper); + // for (ProductsSpec productsSpec : productsSpecList) { + // productsSpec.setType(products.getType()); + // productsSpecMapper.updateProductsSpec(productsSpec); + // } + + if (Constants.MULTI_SPEC.equals(products.getIsSpecs())) { + throw new ServiceException("多规格商品不允许修改购买类型"); + } + + + } + return productsMapper.updateProducts(products); + } + + /** + * 多规格信息变动更新信息 + * @param products + * @return + */ + @Transactional + @Override + public int updateProductsAndSpec(Products products) { + String msg = null; + // 需要校验是否修改商品的库存信息 + Products oldProducts = selectProductsByProductId(products.getProductId()); + + + // 暂时不允许单规格变为多规格 + if (Constants.MULTI_SPEC.equals(products.getIsSpecs()) && Constants.SINGLE_SPEC.equals(oldProducts.getIsSpecs())) { + // products.setTotalStock(0); + throw new ServiceException("单品无法修改为多规格"); + // 单变多: + // 更新products内容。 + + // 插入productSpec数据 + } + + // 后面是多规格商品的处理。 + // 商品为多规格商品,且修改了库存数目 + if (oldProducts.getIsSpecs().equals(Constants.MULTI_SPEC) && !oldProducts.getTotalStock().equals(products.getTotalStock())) { + throw new ServiceException("多规格商品不允许直接修改商品库存,请修改具体规格下的商品库存"); + } + + // 多规格商品变单规格商品,清除多规格商品 + if (Constants.SINGLE_SPEC.equals(products.getIsSpecs()) && Constants.MULTI_SPEC.equals(oldProducts.getIsSpecs())) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProductsSpec::getProductId, products.getProductId()); + productsSpecMapper.delete(queryWrapper); + } + + // 商品的购买类型发生变动 + // 商品购买类型发生变动,多规格需要提示信息 + if (!oldProducts.getType().equals(products.getType())) { + // 价格与积分不兼容 + + + // if(Constants.MULTI_SPEC.equals(products.getIsSpecs())){ + // // 规格变动默认进行下架处理,因为价格和积分不兼容 + // products.setStatus(Constants.GOODS_STATUS_DOWN); + // msg = "多规格商品类型变更,默认下架,请检查商品的规格信息"; + // throw new ServiceException("多规格商品不允许修改购买类型"); + // } + // LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + // queryWrapper.eq(ProductsSpec::getProductId, products.getProductId()); + // List productsSpecList = productsSpecMapper.selectList(queryWrapper); + // for (ProductsSpec productsSpec : productsSpecList) { + // productsSpec.setType(products.getType()); + // productsSpecMapper.updateProductsSpec(productsSpec); + // } + + if (Constants.MULTI_SPEC.equals(products.getIsSpecs())) { + throw new ServiceException("多规格商品不允许修改购买类型"); + } + + + } + // 求出最小值,确保每次更新多规格商品都能都能取到正确值 + Map stringIntegerMap = selectMinPriceAndIntegralByProductId(products.getProductId()); + products.setBasePrice(stringIntegerMap.get("price") == null ? 0 :stringIntegerMap.get("price")); + products.setBaseIntegral(stringIntegerMap.get("integral") == null ? 0 : stringIntegerMap.get("integral")); + + products = preDealProductsAndSpec(products); + return productsMapper.updateProducts(products); + } + + + /** + * 来源于ProductsController商品更新 + * 更新商品信息,保存规格信息 + * @param products + * @return + */ + @Override + @Transactional + public int commonUpdateProducts(Products products) { + int count=0; + int specSize =0; + // 需要校验是否修改商品的库存信息 + Products oldProducts = selectProductsByProductId(products.getProductId()); + if(oldProducts==null){ + throw new ServiceException("商品不存在"); + } + + // 暂时不允许单规格变为多规格 + // 单独规格变多规格 + if (Constants.MULTI_SPEC.equals(products.getIsSpecs()) && Constants.SINGLE_SPEC.equals(oldProducts.getIsSpecs())) { + // products.setTotalStock(0); + // throw new ServiceException("单品无法修改为多规格"); + // 单变多 + // 更新products信息,products的价格,积分,返还积分都要重新计算 + int stock = 0; + int minPrice = -1; + int minIntegral = -1; + // 多规格商品的库存添加对应规格商品时,自动累加 + if (Constants.MULTI_SPEC.equals(products.getIsSpecs())) { + List productsSpecList = products.getProductsSpecList(); + if (productsSpecList == null || productsSpecList.size() == 0) { + throw new ServiceException("多规格商品至少设置一种规格"); + } + specSize = productsSpecList.size(); + for (ProductsSpec productsSpec : productsSpecList) { + if (productsSpec.getStock() == null || productsSpec.getStock() < 0) { + throw new ServiceException("商品库存不能为空且不能小于0"); + } + minPrice = minPrice == -1 ? productsSpec.getPrice() : Math.min(minPrice, productsSpec.getPrice()); + minIntegral = minIntegral == -1 ? productsSpec.getIntegral() : Math.min(minIntegral, productsSpec.getIntegral()); + stock += productsSpec.getStock(); + } + + // 校验数量是否一致 + // if(products.getTotalStock() != stock){ + // throw new ServiceException("商品库存与各规格库存之和不一致"); + // } + products.setTotalStock(stock); + products.setBasePrice(minPrice); + products.setBaseIntegral(minIntegral); + + } + products = preDealProductsAndSpec(products); + if (products != null) { + List productsSpecList = products.getProductsSpecList(); + + // 保存规格信息 + if (Constants.MULTI_SPEC.equals(products.getIsSpecs()) && !CollectionUtils.isEmpty(productsSpecList)) { + for(ProductsSpec productsSpec : productsSpecList){ + productsSpec.setProductId(products.getProductId()); + productsSpec.setType(products.getType()); + if(StringUtils.isBlank(productsSpec.getSpecImage())){ + productsSpec.setSpecImage(null); + } + count += productsSpecMapper.insert(productsSpec); + + } + } + } + + // 更新products + products = preDealProductsAndSpec(products); + count += productsMapper.updateProducts(products); + if(count!=specSize+1){ + throw new ServiceException("商品信息更新失败"); + } + + return count; + } + // 商品为多规格商品,且修改了库存数目 + if (oldProducts.getIsSpecs().equals(Constants.MULTI_SPEC) && !oldProducts.getTotalStock().equals(products.getTotalStock())) { + throw new ServiceException("多规格商品不允许直接修改商品库存,请修改具体规格下的商品库存"); + } + + + // 多规格商品变单规格商品,清除多规格商品 + if (Constants.SINGLE_SPEC.equals(products.getIsSpecs()) && Constants.MULTI_SPEC.equals(oldProducts.getIsSpecs())) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProductsSpec::getProductId, products.getProductId()); + productsSpecMapper.delete(queryWrapper); + } + + // 商品的购买类型发生变动 + // 商品购买类型发生变动,多规格需要提示信息 + if (!oldProducts.getType().equals(products.getType())) { + // 价格与积分不兼容 + + + // if(Constants.MULTI_SPEC.equals(products.getIsSpecs())){ + // // 规格变动默认进行下架处理,因为价格和积分不兼容 + // products.setStatus(Constants.GOODS_STATUS_DOWN); + // msg = "多规格商品类型变更,默认下架,请检查商品的规格信息"; + // throw new ServiceException("多规格商品不允许修改购买类型"); + // } + // LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + // queryWrapper.eq(ProductsSpec::getProductId, products.getProductId()); + // List productsSpecList = productsSpecMapper.selectList(queryWrapper); + // for (ProductsSpec productsSpec : productsSpecList) { + // productsSpec.setType(products.getType()); + // productsSpecMapper.updateProductsSpec(productsSpec); + // } + + if (Constants.MULTI_SPEC.equals(products.getIsSpecs())) { + throw new ServiceException("多规格商品不允许修改购买类型"); + } + + + } + // 求出最小值 + Map stringIntegerMap = selectMinPriceAndIntegralByProductId(products.getProductId()); + products.setBasePrice(stringIntegerMap.get("price") == null ? 0 :stringIntegerMap.get("price")); + products.setBaseIntegral(stringIntegerMap.get("integral") == null ? 0 : stringIntegerMap.get("integral")); + + products = preDealProductsAndSpec(products); + return productsMapper.updateProducts(products); + } + + public Map selectMinPriceAndIntegralByProductId(Integer productId) { + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(ProductsSpec::getProductId, productId); + + // 查询 price 的最小值 + Map map=productsSpecMapper.selectMinOne(productId); + Map map1=new HashMap<>(); + map1.put("price",map.get("price")==null?0:map.get("price").intValue()); + map1.put("integral",map.get("integral")==null?0:map.get("integral").intValue()); + return map1; + } + + @Transactional + @Override + public int updateProductsDirect(Products products) { + return productsMapper.updateProducts(products); + } + + /** + * 批量删除商品 + * + * @param productIds 需要删除的商品主键 + * @return 结果 + */ + @Transactional + @Override + public int deleteProductsByProductIds(Integer[] productIds, boolean isAllowDeleteSpecs) { + if (!isAllowDeleteSpecs) { + // 不允许删除商品规格信息 + for (Integer productId : productIds) { + Products products = selectProductsByProductId(productId); + List productsSpecList = productsSpecMapper.selectList(new LambdaQueryWrapper().eq(ProductsSpec::getProductId, products.getProductId())); + if (products.getIsSpecs().equals(Constants.MULTI_SPEC) && !productsSpecList.isEmpty()) { + // throw new ServiceException("待删除商品中存在多规格商品,需要先删除所有商品的规格商品"); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProductsSpec::getProductId, products.getProductId()); + productsSpecMapper.delete(queryWrapper); + } + } + } else { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + List idList = Arrays.asList(productIds); + queryWrapper.in(ProductsSpec::getProductId, idList); + productsSpecMapper.delete(queryWrapper); + } + return productsMapper.deleteProductsByProductIds(productIds); + } + + /** + * 删除商品信息 + * + * @param productId 商品主键 + * @return 结果 + */ + @Transactional + @Override + public int deleteProductsByProductId(Integer productId, boolean isAllowDeleteSpecs) { + if (!isAllowDeleteSpecs) { + Products products = selectProductsByProductId(productId); + if (products.getIsSpecs().equals(Constants.MULTI_SPEC)) { + throw new ServiceException("该商品为多规格商品,请先删除所有规格的商品,再删除当前商品"); + } + } else { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProductsSpec::getProductId, productId); + productsSpecMapper.delete(queryWrapper); + } + return productsMapper.deleteProductsByProductId(productId); + } + + @Override + public int deleteProductsLogicByProductIds(Integer[] productIds) { + return productsMapper.deleteProductsLogicByProductIds(productIds); + } + + @Override + public List selectHotProducts(Products products) { + return productsMapper.selectHotProducts(products); + } + + @Override + public List selectRecommendProducts(Products products) { + return productsMapper.selectRecommendProducts(products); + } + + @Override + public List selectNewProductsList(Products products) { + return productsMapper.selectNewProductsList(products); + } + + @Override + public List selectSailCountProducts(Products products) { + return productsMapper.selectSailCountProducts(products); + } + + @Override + public AjaxResult getDetails(Integer productId) { + Products products = this.selectProductsByProductId(productId); + if (products == null || !Constants.GOODS_STATUS_SOLD.equals(products.getStatus())) { + return AjaxResult.success("查询成功"); + } + ImagesPrefixUtil.productImageDeals(products); + if (Constants.MULTI_SPEC.equals(products.getIsSpecs())) { + // 获取商品规格关联信息 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProductsSpec::getProductId, productId); + List list = productsSpecMapper.selectList(queryWrapper); + Set specValueIds = new HashSet<>(); + if (list != null && list.size() > 0) { + products.setProductsSpecList(list); + // 构建 规格级联信息.specType小的为父节点,大的为子节点 + List> trees = new ArrayList<>(); + for (ProductsSpec productsSpec : list) { + ImagesPrefixUtil.productSpecImageDeals(productsSpec); + List specValuesIds = productsSpec.getSpecValuesIds(); + specValueIds.addAll(specValuesIds); + + // 设置specStr信息 + List specValues = specValuesService.queryByIds(specValuesIds); + // 对specValues排序 + + + StringBuilder sb = new StringBuilder(); + + // 级联末位节点是否可选 + boolean isDisabled = productsSpec.getStock() <= 0; + List productsSpecVOS = ProductsSpecVO.buildVOS(specValues, isDisabled); + trees.add(productsSpecVOS); + for (SpecValues specValue : specValues) { + + sb.append(specValue.getSpecValue()); + if (specValue.getSpecUnit() != null) { + sb.append(specValue.getSpecUnit()); + } + sb.append(" "); + } + sb.deleteCharAt(sb.length() - 1); + productsSpec.setSpecStr(sb.toString()); + } + + List productsSpecVOS = ProductsSpecVO.mergeSpec(trees); + products.setSpecs(productsSpecVOS); + + } + + } + return AjaxResult.success("查询成功", products); + } + + + /** + * 插入/修改商品,对商品对象进行预处理 + * + * @param products + * @return + */ + @Override + public Products preDealProducts(Products products) { + if (products == null) { + return null; + } + // 购买类型校验 + switch (products.getType()) { + // 自动设置所需积分为0 + case Constants.GOODS_MONEY_BUY: + if (products.getBasePrice() == null || products.getBasePrice() < 0) { + throw new ServiceException("商品购买类型为金额购买时,商品基础价格不能为空且不能小于0"); + } + products.setBaseIntegral(0); + break; + // 自动设置价格为0 + case Constants.GOODS_INTEGRAL_BUY: + if (products.getBaseIntegral() == null || products.getBaseIntegral() < 0) { + throw new ServiceException("商品购买类型为积分购买时,商品所需积分不能为空且不能小于0"); + } + products.setBasePrice(0); + break; + default: + throw new ServiceException("商品购买类型错误"); + } + + // 目前只有单规格商品调用此方法,不考虑多规格情况 + // if (Constants.MULTI_SPEC.equals(products.getIsSpecs())) { + // products.setBaseIntegral(0); + // } + + return products; + } + + + public Products preDealProductsAndSpec(Products products) { + if (products == null) { + return null; + } + // 购买类型校验 + switch (products.getType()) { + // 自动设置所需积分为0 + case Constants.GOODS_MONEY_BUY: + if (products.getBasePrice() == null || products.getBasePrice() < 0) { + throw new ServiceException("商品购买类型为金额购买时,商品基础价格不能为空且不能小于0"); + } + products.setBaseIntegral(0); + break; + // 自动设置价格为0 + case Constants.GOODS_INTEGRAL_BUY: + if (products.getBaseIntegral() == null || products.getBaseIntegral() < 0) { + throw new ServiceException("商品购买类型为积分购买时,商品所需积分不能为空且不能小于0"); + } + products.setBasePrice(0); + break; + default: + throw new ServiceException("商品购买类型错误"); + } + + return products; + } + +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/ProductsSpecServiceImpl.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/ProductsSpecServiceImpl.java new file mode 100644 index 0000000..f6f4bb6 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/ProductsSpecServiceImpl.java @@ -0,0 +1,753 @@ +package com.zf.foodpurchase.fdsafe.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.zf.foodpurchase.common.constant.Constants; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.common.core.page.TableDataInfo; +import com.zf.foodpurchase.common.exception.ServiceException; +import com.zf.foodpurchase.common.utils.DateUtils; +import com.zf.foodpurchase.common.utils.StringUtils; +import com.zf.foodpurchase.fdsafe.entity.Products; +import com.zf.foodpurchase.fdsafe.entity.ProductsSpec; +import com.zf.foodpurchase.fdsafe.entity.SpecValues; +import com.zf.foodpurchase.fdsafe.mapper.ProductsSpecMapper; +import com.zf.foodpurchase.fdsafe.service.IProductsService; +import com.zf.foodpurchase.fdsafe.service.IProductsSpecService; +import com.zf.foodpurchase.fdsafe.utils.SpecUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.*; +import java.util.stream.Collectors; + +import static com.zf.foodpurchase.common.utils.SecurityUtils.getLoginUser; + +/** + *

+ * 商品价格表 服务实现类 + *

+ * + * @author lilj + * @since 2024-11-18 + */ +@Service +public class ProductsSpecServiceImpl extends ServiceImpl implements IProductsSpecService { + @Autowired + private IProductsService productsService; + + @Autowired + private ProductsSpecMapper productsSpecMapper; + @Autowired + private SpecValuesServiceImpl specValuesServiceImpl; + + @Override + public TableDataInfo queryList(ProductsSpec productsSpec) { + return null; + } + + private Integer maxSpecTypeCount = 3; + + + + @Override + public Integer queryExists(ProductsSpec productsSpec) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProductsSpec::getProductId, productsSpec.getProductId()); + queryWrapper.eq(ProductsSpec::getSpecValues, productsSpec.getSpecValues()); + queryWrapper.eq(ProductsSpec::getType, productsSpec.getType()); + return (int) count(queryWrapper); + } + + + /** + * 本来就是多规格商品变导致库存可能变更 + * @param productsSpecList + * @return + */ + @Transactional + @Override + public boolean modifyProductsSepcList(List productsSpecList) { + ProductsSpec firstSpec = productsSpecList.get(0); + Integer productId = firstSpec.getProductId(); + Products products = productsService.selectProductsByProductId(productId); + if (products == null) { + throw new ServiceException("商品不存在"); + } + products.setProductsSpecList(productsSpecList); + products.setUpdateTime(DateUtils.getNowDate()); + products.setOperId(firstSpec.getOperId()); + // 商品基础信息:总库存,基础价格,基础积分变动 + Integer minPrice = -1; + Integer minIntegral = -1; + Integer stock = 0; + Set specValuesSet = new HashSet<>(); + + List updateList = new ArrayList<>(); + List insertList = new ArrayList<>(); + + for (ProductsSpec productsSpec : productsSpecList) { + // 修改时不会修改规格类型 + productsSpec.setType(products.getType()); + // 购买类型校验 + switch (productsSpec.getType()) { + // 自动设置所需积分为0 + case Constants.GOODS_MONEY_BUY: + if (productsSpec.getPrice() == null || productsSpec.getPrice() <= 0) { + throw new ServiceException("商品购买类型为金额购买时,商品价格不能为空且必须大于0"); + } + productsSpec.setIntegral(0); + break; + // 自动设置价格为0 + case Constants.GOODS_INTEGRAL_BUY: + if (productsSpec.getIntegral() == null || productsSpec.getIntegral() <= 0) { + throw new ServiceException("商品购买类型为积分购买时,商品所需积分不能为空且不能小于0"); + } + productsSpec.setPrice(0); + break; + default: + throw new ServiceException("商品购买类型错误"); + } + + dealProductsSpecArrayToValues(productsSpec); + preDealSpecValues(productsSpec); + specValuesSet.add(productsSpec.getSpecValues()); + if(productsSpec.getStock()==null || productsSpec.getStock()<0){ + throw new ServiceException("商品库存不能为空且不能小于0"); + } + stock+= productsSpec.getStock(); + + // + minPrice = minPrice==-1 ? productsSpec.getPrice() : Math.min(minPrice, productsSpec.getPrice()); + minIntegral = minIntegral == -1 ? productsSpec.getIntegral() : Math.min(minIntegral, productsSpec.getIntegral()); + + if(productsSpec.getId()!=null){ + updateList.add(productsSpec); + }else{ + insertList.add(productsSpec); + } + } + + if(specValuesSet.size()!=productsSpecList.size()){ + throw new ServiceException("规格商品不能有重复的规格"); + } + if(minPrice!=-1){ + products.setBasePrice(minPrice); + } + if(minIntegral!=-1){ + products.setBaseIntegral(minIntegral); + + } + products.setTotalStock(stock); + + + + // 更新规格信息 + int count = 0; + for (ProductsSpec productsSpec : updateList) { + if (productsSpecMapper.updateProductsSpec(productsSpec) > 0) { + count++; + } + } + for(ProductsSpec productsSpec:insertList){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProductsSpec::getProductId, productsSpec.getProductId()); + queryWrapper.eq(ProductsSpec::getSpecValues, productsSpec.getSpecValues()); + if(this.count(queryWrapper)>0){ + throw new ServiceException("存在重复规格商品数据,保存失败"); + } + if(this.save(productsSpec)){ + count++; + } + } + if(count!=productsSpecList.size()){ + throw new ServiceException("保存失败"); + } + // 更新商品信息 + // productsService.updateProducts(products); + + // 商品就更新了个库存,直接更新不做校验 + return productsService.updateProductsDirect(products)>0; + + } + + /** + * 来源于ProductsController商品更新 + * 更新商品信息,保存规格信息 + * @param products + * @return + */ + @Override + @Transactional + public int commonUpdateProducts(Products products) { + int count=0; + int specSize =0; + // 需要校验是否修改商品的库存信息 + Products oldProducts = productsService.selectProductsByProductId(products.getProductId()); + if(oldProducts==null){ + throw new ServiceException("商品不存在"); + } + + // 暂时不允许单规格变为多规格 + // 单独规格变多规格 + if (Constants.MULTI_SPEC.equals(products.getIsSpecs()) && Constants.SINGLE_SPEC.equals(oldProducts.getIsSpecs())) { + // products.setTotalStock(0); + // throw new ServiceException("单品无法修改为多规格"); + // 单变多 + // 更新products信息,products的价格,积分,返还积分都要重新计算 + int stock = 0; + int minPrice = -1; + int minIntegral = -1; + // 多规格商品的库存添加对应规格商品时,自动累加 + if (Constants.MULTI_SPEC.equals(products.getIsSpecs())) { + List productsSpecList = products.getProductsSpecList(); + if (productsSpecList == null || productsSpecList.size() == 0) { + throw new ServiceException("多规格商品至少设置一种规格"); + } + specSize = productsSpecList.size(); + for (ProductsSpec productsSpec : productsSpecList) { + if (productsSpec.getStock() == null || productsSpec.getStock() < 0) { + throw new ServiceException("商品库存不能为空且不能小于0"); + } + minPrice = minPrice == -1 ? productsSpec.getPrice() : Math.min(minPrice, productsSpec.getPrice()); + minIntegral = minIntegral == -1 ? productsSpec.getIntegral() : Math.min(minIntegral, productsSpec.getIntegral()); + stock += productsSpec.getStock(); + } + + // 校验数量是否一致 + // if(products.getTotalStock() != stock){ + // throw new ServiceException("商品库存与各规格库存之和不一致"); + // } + products.setTotalStock(stock); + products.setBasePrice(minPrice); + products.setBaseIntegral(minIntegral); + + } + products = preDealProductsAndSpec(products); + if (products != null) { + List productsSpecList = products.getProductsSpecList(); + this.preDealMultisSpecProducts(products); + // 保存规格信息 + if (Constants.MULTI_SPEC.equals(products.getIsSpecs()) && !CollectionUtils.isEmpty(productsSpecList)) { + for(ProductsSpec productsSpec : productsSpecList){ + productsSpec.setProductId(products.getProductId()); + productsSpec.setType(products.getType()); + if(StringUtils.isBlank(productsSpec.getSpecImage())){ + productsSpec.setSpecImage(null); + } + count += productsSpecMapper.insert(productsSpec); + + } + } + } + + // 更新products + products = preDealProductsAndSpec(products); + count += productsService.updateProductsDirect(products); + if(count!=specSize+1){ + throw new ServiceException("商品信息更新失败"); + } + + return count; + } + + + // 商品为多规格商品,且修改了库存数目 + if (oldProducts.getIsSpecs().equals(Constants.MULTI_SPEC) && !oldProducts.getTotalStock().equals(products.getTotalStock())) { + throw new ServiceException("多规格商品不允许直接修改商品库存,请修改具体规格下的商品库存"); + } + + + // 多规格商品变单规格商品,清除多规格商品 + if (Constants.SINGLE_SPEC.equals(products.getIsSpecs()) && Constants.MULTI_SPEC.equals(oldProducts.getIsSpecs())) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProductsSpec::getProductId, products.getProductId()); + productsSpecMapper.delete(queryWrapper); + } + + // 商品的购买类型发生变动 + // 商品购买类型发生变动,多规格需要提示信息 + if (!oldProducts.getType().equals(products.getType())) { + if (Constants.MULTI_SPEC.equals(products.getIsSpecs())) { + throw new ServiceException("多规格商品不允许修改购买类型"); + } + + + } + // 求出最小值 + Map map=productsSpecMapper.selectMinOne(products.getProductId()); + products.setBasePrice(map.get("price") == null ? 0 :map.get("price").intValue()); + products.setBaseIntegral(map.get("integral") == null ? 0 : map.get("integral").intValue()); + + products = preDealProductsAndSpec(products); + return productsService.updateProductsDirect(products); + } + + /** + * 修改商品信息,前端传过来的是但规格商品 + * @param products + * @return + */ + @Transactional + @Override + public boolean updateSingleProducts(Products products) { + // 校验products的基本信息 + Products oldProducts = productsService.selectProductsByProductId(products.getProductId()); + if(oldProducts==null){ + throw new ServiceException("商品不存在"); + } + String type= products.getType(); + switch (type) { + case Constants.GOODS_MONEY_BUY: + if (products.getBasePrice() == null || products.getBasePrice() <= 0) { + throw new ServiceException("商品购买类型为金额购买时,商品价格不能为空且必须大于0"); + } + products.setBaseIntegral(0); + break; + case Constants.GOODS_INTEGRAL_BUY: + if (products.getBaseIntegral() == null || products.getBaseIntegral() <= 0) { + throw new ServiceException("商品购买类型为积分兑换时,商品所需积分不能为空且必须大于0"); + } + products.setBasePrice(0); + break; + default: + throw new ServiceException("商品购买类型错误"); + } + + // 校验库存信息 + if(products.getTotalStock() == null || products.getTotalStock() < 0){ + throw new ServiceException("商品库存不能为空且不能小于0"); + } + + //设置 + // 2.原来是单规格的直接更新;非但规格的清空规格商品信息在更新商品信息 + if(Constants.MULTI_SPEC.equals(oldProducts.getIsSpecs())){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProductsSpec::getProductId, products.getProductId()); + productsSpecMapper.delete(queryWrapper); + } + int count= productsService.updateProductsDirect(products); + return count>0; + } + + /** + * 前端传入的商品节点信息是 + * @param products + * @return + */ + @Override + @Transactional + public boolean updateMulSpecProducts(Products products) { + + // 不允许单规格变多规格的实现 + // 需要校验是否修改商品的库存信息 + Products oldProducts = productsService.selectProductsByProductId(products.getProductId()); + if(oldProducts==null){ + throw new ServiceException("商品不存在"); + } + if(Constants.MULTI_SPEC.equals(oldProducts.getIsSpecs()) ){ + // 多规格的限制,不更新basePrice,baseIntegral,totalStock,type(多规格的type没法变动) + if(!products.getType().equals(oldProducts.getType())){ + throw new ServiceException("多规格商品不允许修改购买类型"); + } + + // 库存不进行修改 + products.setBasePrice(oldProducts.getBasePrice()); + products.setBaseIntegral(oldProducts.getBaseIntegral()); + products.setTotalStock(oldProducts.getTotalStock()); + + int count=productsService.updateProductsDirect(products); + return count>0; + } + + // 暂定但规格无法转变为多规格 + if(Constants.SINGLE_SPEC.equals(oldProducts.getIsSpecs())){ + throw new ServiceException("单规格商品不允许修改为多规格商品"); + + // 允许添加多规格逻辑 + + } + return false; + } + + + public Products preDealProductsAndSpec(Products products) { + if (products == null) { + return null; + } + // 购买类型校验 + switch (products.getType()) { + // 自动设置所需积分为0 + case Constants.GOODS_MONEY_BUY: + if (products.getBasePrice() == null || products.getBasePrice() < 0) { + throw new ServiceException("商品购买类型为金额购买时,商品基础价格不能为空且不能小于0"); + } + products.setBaseIntegral(0); + break; + // 自动设置价格为0 + case Constants.GOODS_INTEGRAL_BUY: + if (products.getBaseIntegral() == null || products.getBaseIntegral() < 0) { + throw new ServiceException("商品购买类型为积分购买时,商品所需积分不能为空且不能小于0"); + } + products.setBasePrice(0); + break; + default: + throw new ServiceException("商品购买类型错误"); + } + + return products; + } + + public void dealProductsSpecArrayToValues(ProductsSpec productsSpec) { + List> specValueArray = productsSpec.getSpecValueArray(); + if (specValueArray == null || specValueArray.size() == 0) { + throw new RuntimeException("多规格商品必须指定具体规格"); + } + if (specValueArray.size() > maxSpecTypeCount) { + throw new RuntimeException("多规格商品最多只能设置" + maxSpecTypeCount + "个规格"); + } + + StringBuilder valueItems = new StringBuilder(); + for (List item : specValueArray) { + if (CollectionUtils.isEmpty(item) || item.size() != 2) { + throw new RuntimeException("多规格商品必须具体规格有误"); + } + valueItems.append(item.get(1)).append(","); + } + valueItems.deleteCharAt(valueItems.length() - 1); + + productsSpec.setSpecValues(valueItems.toString()); + } + + + + private void dealProductsSpec(Products products, List productsSpecs) { + if (products == null) { + return; + } + if (CollectionUtils.isEmpty(productsSpecs)) { + return; + } + + if (Constants.MULTI_SPEC.equals(products.getIsSpecs())) { + Integer minPrice = -1; + Integer minIntegral = -1; + for (ProductsSpec ps : productsSpecs) { + minPrice = minPrice == -1 ? ps.getPrice() : Math.min(minPrice, ps.getPrice()); + minIntegral = minIntegral == -1 ? ps.getIntegral() : Math.min(minIntegral, ps.getIntegral()); + } + if (minPrice != -1) { + products.setBasePrice(minPrice); + } + if (minIntegral != -1) { + products.setBaseIntegral(minIntegral); + } + + } + } + + /** + * 如果该商品列表中存在商品只有一个商品规格信息, + * 删除规格后会自动将该商品库存置0,设置为非多规格商品,并下架(因为库存为0); + * 并将该商品加入列表中返回给前端 + * + * @param list + * @return + */ + @Transactional + @Override + public AjaxResult removeProductsByIds(List list) { + List lastProducts = new ArrayList<>(); + for (Integer id : list) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProductsSpec::getId, id); + ProductsSpec productsSpec = getOne(queryWrapper); + + Products products = productsService.selectProductsByProductId(productsSpec.getProductId()); + if (productsSpec == null || products == null) { + continue; + } + // 判断是否为最后一个规格 + queryWrapper.clear(); + queryWrapper.eq(ProductsSpec::getProductId, productsSpec.getProductId()); + List productsSpecs = list(queryWrapper); + // 修改库存 + products.setTotalStock(products.getTotalStock() - productsSpec.getStock()); + products.setUpdateTime(DateUtils.getNowDate()); + products.setOperId(getLoginUser().getUser().getUserId()); + boolean isLast = productsSpecs.size() == 1; + // 最后一个规格: + if (isLast) { + return AjaxResult.error("多规格商品至少要有一个规格商品,如果确实需要删除,请直接删除商品"); + } + removeById(id); + + // 设置products的最小值 + // 查询 price 的最小值 + Map map=productsSpecMapper.selectMinOne(products.getProductId()); + products.setBasePrice(map.get("price")==null?0:map.get("price").intValue()); + products.setBaseIntegral(map.get("integral")==null?0:map.get("integral").intValue()); + boolean isUpdate = productsService.updateProductsDirect(products)>0; + if (!isUpdate) { + throw new RuntimeException("删除失败"); + } + lastProducts.add(products); + } + + return AjaxResult.success("删除成功").put("data", lastProducts); + } + + @Override + public List listWithProductSpecValues(LambdaQueryWrapper queryWrapper) { + List productsSpecs = list(queryWrapper); + if (productsSpecs == null || productsSpecs.size() == 0) { + return Collections.emptyList(); + } + for (ProductsSpec productsSpec : productsSpecs) { + String specValues = productsSpec.getSpecValues(); + List specValuesIds = new ArrayList<>(); + if (StringUtils.isBlank(specValues)) { + continue; + } + if (!specValues.contains(",")) { + specValuesIds.add(Integer.parseInt(specValues)); + } else { + specValuesIds = Arrays.stream(specValues.split(",")).map(Integer::parseInt).collect(Collectors.toList()); + } + List list = specValuesServiceImpl.queryByIds(specValuesIds); + productsSpec.setSpecValuesList(list); + String specStr = SpecUtils.getSpecStr(list); + productsSpec.setSpecStr(specStr); + + } + return productsSpecs; + } + + /** + * 对productSpec预处理, + * 按照对应value的id对应specType的id由低到高排序 + * + * @param productsSpec + * @return + */ + @Override + public ProductsSpec preDealSpecValues(ProductsSpec productsSpec) { + if (productsSpec == null || StringUtils.isBlank(productsSpec.getSpecValues())) { + return productsSpec; + } + // 规格值在系统中是否存在校验 + List specValueIdList = productsSpec.getSpecValuesIds(); + if (specValueIdList.size() > 0) { + // 逐个校验规格类型 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SpecValues::getId, specValueIdList); + queryWrapper.eq(SpecValues::getMerchantId, productsSpec.getMerchantId()); + List valuesList = specValuesServiceImpl.list(queryWrapper); + int listSize = valuesList == null ? 0 : valuesList.size(); + if (listSize != specValueIdList.size()) { + throw new ServiceException("部分规格在系统中不存在请检查"); + } + + // 存在多个valueList需要重新排序 + if (valuesList.size() > 1) { + // 获取specTypeList + List specTypeList = valuesList.stream() + .map(SpecValues::getSpecType) + .distinct() + .sorted() + .collect(Collectors.toList()); + + if (specTypeList.size() != specValueIdList.size()) { + throw new ServiceException("每种类型的规格值至多为一个"); + } + + // 重新排序 + Collections.sort(valuesList, Comparator.comparingInt(SpecValues::getSpecType)); + + List collect = valuesList.stream().map(SpecValues::getId).collect(Collectors.toList()); + productsSpec.setSpecValues(StringUtils.join(collect, ",")); + + } + + } + + + return productsSpec; + + } + + /** + * 插入/修改商品规格,对商品规格对象进行预处理 + * + * @param products + * @return + */ + @Override + public ProductsSpec preDealProductsSpec(Products products, ProductsSpec productsSpec) { + + if (products == null || productsSpec == null) { + throw new ServiceException("商品或商品规格不能为空"); + } + // 修改时不会修改规格类型 + productsSpec.setType(products.getType()); + // if (!products.getType().equals(productsSpec.getType())) { + // throw new ServiceException("商品购买类型与商品规格购买类型必须要保持一致"); + // } + // 购买类型校验 + switch (productsSpec.getType()) { + // 自动设置所需积分为0 + case Constants.GOODS_MONEY_BUY: + if (productsSpec.getPrice() == null || productsSpec.getPrice() <= 0) { + throw new ServiceException("商品购买类型为金额购买时,商品价格不能为空且必须大于0"); + } + productsSpec.setIntegral(0); + break; + // 自动设置价格为0 + case Constants.GOODS_INTEGRAL_BUY: + if (productsSpec.getIntegral() == null || productsSpec.getIntegral() <= 0) { + throw new ServiceException("商品购买类型为积分购买时,商品所需积分不能为空且不能小于0"); + } + productsSpec.setPrice(0); + break; + default: + throw new ServiceException("商品购买类型错误"); + } + + return productsSpec; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean addWithSpec(Products products) { + + // 单规格商品处理 + if(Constants.SINGLE_SPEC.equals(products.getIsSpecs())){ + boolean flag = productsService.insertProducts(products) > 0; + return flag; + } + + // 多规格处理 + int stock = 0; + int minPrice = -1; + int minIntegral = -1; + // 多规格商品的库存添加对应规格商品时,自动累加 + // 计算商品基本信息: 库存,最小价格,最小积分 + //代替preDealProducts_addWithSpec方法 + if (Constants.MULTI_SPEC.equals(products.getIsSpecs())) { + List productsSpecList = products.getProductsSpecList(); + if (productsSpecList == null || productsSpecList.size() == 0) { + throw new ServiceException("多规格商品至少设置一种规格"); + } + for (ProductsSpec productsSpec : productsSpecList) { + if (productsSpec.getStock() == null || productsSpec.getStock() < 0) { + throw new ServiceException("商品库存不能为空且不能小于0"); + } + + // 处理商品规格信息填充 + // 插入商品商品才会有productId + // productsSpec.setProductId(products.getProductId()); + productsSpec.setMerchantId(products.getMerchantId()); + productsSpec.setType(products.getType()); + dealProductsSpecArrayToValues(productsSpec); + productsSpec = preDealSpecValues(productsSpec); + productsSpec.setOperId(products.getOperId()); + productsSpec.setCreateTime(DateUtils.getNowDate()); + + // 规格商品校验--代替preDealProductsSpec()方法 + String type= productsSpec.getType(); + switch (type) { + case Constants.GOODS_MONEY_BUY: + if (productsSpec.getPrice() == null || productsSpec.getPrice() <= 0) { + throw new ServiceException("商品购买类型为金额购买时,商品价格不能为空且必须大于0"); + } + productsSpec.setIntegral(0); + break; + case Constants.GOODS_INTEGRAL_BUY: + if (productsSpec.getIntegral() == null || productsSpec.getIntegral() <= 0) { + throw new ServiceException("商品购买类型为积分兑换时,商品所需积分不能为空且必须大于0"); + } + productsSpec.setPrice(0); + break; + default: + throw new ServiceException("商品购买类型错误"); + } + minPrice = minPrice == -1 ? productsSpec.getPrice() : Math.min(minPrice, productsSpec.getPrice()); + minIntegral = minIntegral == -1 ? productsSpec.getIntegral() : Math.min(minIntegral, productsSpec.getIntegral()); + stock += productsSpec.getStock(); + + if (productsSpec.getStock() < 0) { + throw new ServiceException("规格商品的库存不能小于0"); + } + } + + products.setTotalStock(stock); + products.setBasePrice(minPrice); + products.setBaseIntegral(minIntegral); + // 不需要额外校验products的类别 + + } + + + // 保存商品信息 + // boolean flag = productsService.insertProductsAndSpec(products) > 0; + boolean flag = productsService.insertProductsDirect(products) > 0; + + if (flag) { + List productsSpecList = products.getProductsSpecList(); + + // 保存规格信息 + if (Constants.MULTI_SPEC.equals(products.getIsSpecs()) && !CollectionUtils.isEmpty(productsSpecList)) { + for(ProductsSpec productsSpec : productsSpecList){ + // 设置product_id + productsSpec.setProductId(products.getProductId()); + if(StringUtils.isBlank(productsSpec.getSpecImage())){ + productsSpec.setSpecImage(null); + } + } + flag = this.saveBatch(productsSpecList); + } + }else{ + throw new ServiceException("商品保存失败"); + } + + return flag; + } + + @Override + public Products preDealMultisSpecProducts(Products products) { + int stock = 0; + if (products == null) { + return null; + } + products.setCreateTime(DateUtils.getNowDate()); + // 是否对多规格处理 + List productsSpecList = products.getProductsSpecList(); + if (Constants.MULTI_SPEC.equals(products.getIsSpecs()) && !CollectionUtils.isEmpty(productsSpecList)) { + for (ProductsSpec productsSpec : productsSpecList) { + if (productsSpec.getStock() < 0) { + throw new ServiceException("规格商品的库存不能小于0"); + } + + productsSpec.setProductId(products.getProductId()); + productsSpec.setMerchantId(products.getMerchantId()); + productsSpec.setType(products.getType()); + + + productsSpec = preDealProductsSpec(products, productsSpec); + dealProductsSpecArrayToValues(productsSpec); + productsSpec = preDealSpecValues(productsSpec); + productsSpec.setOperId(products.getOperId()); + productsSpec.setCreateTime(DateUtils.getNowDate()); + + stock += productsSpec.getStock(); + } + } + products.setTotalStock(stock); + return products; + } + + + +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/RepositoryServiceImpl.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/RepositoryServiceImpl.java new file mode 100644 index 0000000..6bf5988 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/RepositoryServiceImpl.java @@ -0,0 +1,74 @@ +package com.zf.foodpurchase.fdsafe.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.zf.foodpurchase.common.constant.Constants; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.fdsafe.entity.Repository; +import com.zf.foodpurchase.fdsafe.mapper.RepositoryMapper; +import com.zf.foodpurchase.fdsafe.service.IRepositoryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 轮播图 + *

+ * 仓库列表 服务实现类 + *

+ * + * @author lilj + * @since 2024-11-20 + */ +@Service +public class RepositoryServiceImpl extends ServiceImpl implements IRepositoryService { + @Autowired + private RepositoryMapper repositoryMapper; + + @Override + public List joinQueryList(Repository quryRepository) { + return repositoryMapper.joinQueryList(quryRepository); + } + + @Override + public AjaxResult saveRepo(Repository repository) { + if (checkRepoNameUnique(repository)) { + return AjaxResult.error("仓库名称已存在请更换仓库名称"); + } + return save(repository) ? AjaxResult.success("新增成功") : AjaxResult.error("新增失败"); + } + + @Transactional + @Override + public AjaxResult modifyRepo(Repository repository) { + if (checkRepoNameUnique(repository)) { + return AjaxResult.error("仓库名称已存在请更换仓库名称"); + } + boolean update = updateById(repository); + // 如果是默认仓库,需要修改其他仓库为非默认仓库 + if(Constants.REPO_DEFAULT.equals(repository.getDefaultRepo())){ + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(Repository::getMerchantId, repository.getMerchantId()); + updateWrapper.ne(Repository::getId, repository.getId()); + updateWrapper.ne(Repository::getDefaultRepo, Constants.REPO_UN_DEFAULT); + updateWrapper.set(Repository::getDefaultRepo, Constants.REPO_UN_DEFAULT); + update(updateWrapper); + } + return update ? AjaxResult.success("修改成功") : AjaxResult.error("修改失败"); + } + + public boolean checkRepoNameUnique(Repository repository) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Repository::getRepoName, repository.getRepoName()); + queryWrapper.eq(Repository::getMerchantId, repository.getMerchantId()); + // 不为空说明是修改,同一商户下仓库名不能重复 + if (repository.getId() != null) { + queryWrapper.ne(Repository::getId, repository.getId()); + } + return repositoryMapper.selectCount(queryWrapper) > 0; + } + +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/SpecTypesServiceImpl.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/SpecTypesServiceImpl.java new file mode 100644 index 0000000..03c193a --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/SpecTypesServiceImpl.java @@ -0,0 +1,73 @@ +package com.zf.foodpurchase.fdsafe.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.fdsafe.entity.SpecTypes; +import com.zf.foodpurchase.fdsafe.entity.SpecValues; +import com.zf.foodpurchase.fdsafe.mapper.SpecTypesMapper; +import com.zf.foodpurchase.fdsafe.service.ISpecTypesService; +import com.zf.foodpurchase.fdsafe.service.ISpecValuesService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 商品规格类型表 服务实现类 + *

+ * + * @author lilj + * @since 2024-11-16 + */ +@Service +public class SpecTypesServiceImpl extends ServiceImpl implements ISpecTypesService { + + @Autowired + private ISpecValuesService specValuesService; + + @Override + public AjaxResult saveTypes(SpecTypes specTypes) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SpecTypes::getSpecName, specTypes.getSpecName()); + queryWrapper.eq(SpecTypes::getMerchantId, specTypes.getMerchantId()); + if (this.count(queryWrapper) > 0) { + return AjaxResult.error("规格类型已存在,不能重复添加"); + } + boolean result =this.save(specTypes); + return result?AjaxResult.success("添加成功"):AjaxResult.error("添加失败"); + } + + @Override + public AjaxResult removeSpecTypes(List list,Long merchantId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SpecValues::getSpecType, list); + if (specValuesService.count(queryWrapper) > 0) { + return AjaxResult.error("该规格类型下有规格值,请先删除规格值"); + } + // 管理员删除所有,非管理员删除其所在部门下 + LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); + deleteWrapper.in(SpecTypes::getSpecType, list); + if(merchantId!=null){ + deleteWrapper.eq(SpecTypes::getMerchantId,merchantId); + } + this.remove(deleteWrapper); + return AjaxResult.success("删除成功"); + } + + @Override + public AjaxResult updateType(SpecTypes specTypes, boolean admin) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(SpecTypes::getSpecType, specTypes.getSpecType()); + if (admin) { + updateWrapper.eq(SpecTypes::getMerchantId, specTypes.getMerchantId()); + } + boolean flag=this.update(specTypes, updateWrapper); + return flag?AjaxResult.success("修改成功"):AjaxResult.error("修改失败"); + } + + public void preValidateInsert(SpecTypes specTypes){ + } +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/SpecValuesServiceImpl.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/SpecValuesServiceImpl.java new file mode 100644 index 0000000..14654de --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/service/impl/SpecValuesServiceImpl.java @@ -0,0 +1,77 @@ +package com.zf.foodpurchase.fdsafe.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.zf.foodpurchase.common.core.domain.AjaxResult; +import com.zf.foodpurchase.fdsafe.entity.ProductsSpec; +import com.zf.foodpurchase.fdsafe.entity.SpecValues; +import com.zf.foodpurchase.fdsafe.mapper.ProductsSpecMapper; +import com.zf.foodpurchase.fdsafe.mapper.SpecValuesMapper; +import com.zf.foodpurchase.fdsafe.service.ISpecValuesService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

+ * 规格值表 服务实现类 + *

+ * + * @author lilj + * @since 2024-11-16 + */ +@Service +public class SpecValuesServiceImpl extends ServiceImpl implements ISpecValuesService { + + @Autowired + private SpecValuesMapper specValuesMapper; + + @Autowired + private ProductsSpecMapper productsSpecMapper; + + @Override + public List queryList(SpecValues specValues) { + return specValuesMapper.queryList(specValues); + } + + @Override + public List queryByIds(List specValuesIds) { + return specValuesMapper.queryByIds(specValuesIds); + } + + @Override + public AjaxResult updateSpecValues(SpecValues specValues,boolean isAdmin) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(SpecValues::getId,specValues.getId()); + if(!isAdmin){ + updateWrapper.eq(SpecValues::getMerchantId,specValues.getMerchantId()); + } + int count=specValuesMapper.update(specValues,updateWrapper); + return count>0 ? AjaxResult.success("修改成功"):AjaxResult.error("修改失败"); + } + + @Override + public AjaxResult removeValues(List idList, Long merchantId) { + // todo:判断商品规格表有无关联商品 + for (Long id : idList) { + List list = productsSpecMapper.selectList(new LambdaQueryWrapper().like(ProductsSpec::getSpecValues, id)); + if (list != null && list.size() > 0) { + return AjaxResult.error("该规格类型下有商品关联,请先解除关联"); + } + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.in(SpecValues::getId,idList); + if(merchantId!=null){ + queryWrapper.eq(SpecValues::getMerchantId,merchantId); + } + if(specValuesMapper.delete(queryWrapper)>0){ + return AjaxResult.success("删除成功"); + } + return AjaxResult.error("删除失败"); + } + + +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/utils/ImagesPrefixUtil.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/utils/ImagesPrefixUtil.java new file mode 100644 index 0000000..360963c --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/utils/ImagesPrefixUtil.java @@ -0,0 +1,286 @@ +package com.zf.foodpurchase.fdsafe.utils; + +import com.zf.foodpurchase.common.config.RuoYiConfig; +import com.zf.foodpurchase.common.utils.StringUtils; +import com.zf.foodpurchase.fdsafe.entity.CartItem; +import com.zf.foodpurchase.fdsafe.entity.OrderItem; +import com.zf.foodpurchase.fdsafe.entity.Products; +import com.zf.foodpurchase.fdsafe.entity.ProductsSpec; + +import java.util.List; + +/** + * @author:lilj + * @date:2024/11/27 + */ +public class ImagesPrefixUtil { + public static void productImageDeals(List productsList) { + for (Products products : productsList) { + String images = products.getImages(); + if(StringUtils.isNotBlank(images)){ + if (images.contains(",")) { + String[] imageArray = images.split(","); + for (int i = 0; i < imageArray.length; i++) { + if(!imageArray[i].contains("http")){ + imageArray[i] = RuoYiConfig.getImagePrefix()+ imageArray[i]; + } + } + products.setImages(String.join(",", imageArray)); + products.setFirstImage(imageArray[0]); + products.setImagesArray(imageArray); + } else { + if(!images.contains("http")){ + images = RuoYiConfig.getImagePrefix()+ images; + } + products.setFirstImage( images); + products.setImages(images); + products.setImagesArray(new String[]{images}); + } + } + + + String detailImages = products.getDetailImages(); + if (StringUtils.isBlank(detailImages)) { + continue; + } + if (detailImages.contains(",")) { + String[] imageArray = detailImages.split(","); + for (int i = 0; i < imageArray.length; i++) { + if(!imageArray[i].contains("http")){ + imageArray[i] = RuoYiConfig.getImagePrefix()+ imageArray[i]; + } + } + products.setFirstDetailsImage(imageArray[0]); + products.setDetailImages(String.join(",", imageArray)); + products.setDetailImagesArray(imageArray); + } else { + if(!detailImages.contains("http")){ + detailImages = RuoYiConfig.getImagePrefix()+ detailImages; + } + products.setFirstDetailsImage(detailImages); + products.setDetailImages(detailImages); + products.setDetailImagesArray(new String[]{detailImages}); + } + } + + } + + public static void productImageDeals(Products products) { + String images = products.getImages(); + if (StringUtils.isNotBlank(images)) { + if (images.contains(",")) { + String[] imageArray = images.split(","); + products.setFirstImage(imageArray[0]); + for (int i = 0; i < imageArray.length; i++) { + if(!imageArray[i].contains("http")){ + imageArray[i] = RuoYiConfig.getImagePrefix()+ imageArray[i]; + } + } + products.setImages(String.join(",", imageArray)); + products.setImagesArray(imageArray); + } else { + if(!images.contains("http")){ + images = RuoYiConfig.getImagePrefix()+ images; + } + products.setFirstImage(images); + products.setImages(images); + products.setImagesArray(new String[]{images}); + } + } + + + String detailImages = products.getDetailImages(); + if (StringUtils.isBlank(detailImages)) { + return; + } + if (detailImages.contains(",")) { + String[] imageArray = detailImages.split(","); + for (int i = 0; i < imageArray.length; i++) { + if(!imageArray[i].contains("http")){ + imageArray[i] = RuoYiConfig.getImagePrefix()+ imageArray[i]; + } + } + products.setFirstDetailsImage(imageArray[0]); + products.setDetailImages(String.join(",", imageArray)); + products.setDetailImagesArray(imageArray); + } else { + if(!detailImages.contains("http")){ + detailImages = RuoYiConfig.getImagePrefix()+ detailImages; + } + products.setFirstDetailsImage(detailImages); + products.setDetailImages(detailImages); + products.setDetailImagesArray(new String[]{detailImages}); + + } + } + + public static void productSpecImageDeals(List productsSpecs) { + for (ProductsSpec productsSpec : productsSpecs) { + String images = productsSpec.getSpecImage(); + if (StringUtils.isBlank(images)) { + continue; + } + if (images.contains(",")) { + String[] imageArray = images.split(","); + productsSpec.setFirstSpecImage(imageArray[0]); + for (int i = 0; i < imageArray.length; i++) { + if(!imageArray[i].contains("http")){ + imageArray[i] = RuoYiConfig.getImagePrefix()+ imageArray[i]; + } + } + + productsSpec.setSpecImage(String.join(",", imageArray)); + productsSpec.setSpecImagesArray(imageArray); + } else { + if(!images.contains("http")){ + images = RuoYiConfig.getImagePrefix()+ images; + } + productsSpec.setFirstSpecImage(images); + productsSpec.setSpecImage(images); + productsSpec.setSpecImagesArray(new String[]{images}); + } + } + + } + + public static void productSpecImageDeals(ProductsSpec productsSpec) { + + String images = productsSpec.getSpecImage(); + if (StringUtils.isBlank(images)) { + return; + } + if (images.contains(",")) { + String[] imageArray = images.split(","); + + for (int i = 0; i < imageArray.length; i++) { + if(!imageArray[i].contains("http")){ + imageArray[i] = RuoYiConfig.getImagePrefix()+ imageArray[i]; + } + } + productsSpec.setFirstSpecImage(imageArray[0]); + productsSpec.setSpecImage(String.join(",", imageArray)); + productsSpec.setSpecImagesArray(imageArray); + } else { + if(!images.contains("http")){ + images = RuoYiConfig.getImagePrefix()+ images; + } + productsSpec.setFirstSpecImage(images); + productsSpec.setSpecImage(images); + productsSpec.setSpecImagesArray(new String[]{images}); + } + } + + + public static void cartItemImage(CartItem item, Products products) { + String images = products.getImages(); + String firstImage = getFirstImage(images); + item.setImage(firstImage); + } + + public static void cartItemImage(CartItem item, ProductsSpec spec) { + String images = spec.getSpecImage(); + String firstImage = getFirstImage(images); + item.setImage(firstImage); + } + + + /** + * 处理查询的出的orderItem的图片参数信息 + */ + public static void dealOrderItemPic(OrderItem item){ + if(item == null || StringUtils.isBlank(item.getProductPicUrl()) ){ + return; + } + String picUrl = item.getProductPicUrl(); + String firstImage= getFirstImage(picUrl); + item.setProductPicUrl(firstImage); + + } + + /** + * 批量处理 + * @param list + */ + public static void dealOrderItemPics(List list){ + for(OrderItem item:list){ + dealOrderItemPic(item); + } + } + + public static String imagesDeal(String images){ + if (StringUtils.isBlank(images)) { + return null; + } + if (images.contains(",")) { + String[] imageArray = images.split(","); + for (int i = 0; i < imageArray.length; i++) { + if(!imageArray[i].contains("http")){ + imageArray[i] = RuoYiConfig.getImagePrefix()+ imageArray[i]; + } + } + images = String.join(",", imageArray); + }else { + if (!images.contains("http")) { + images = RuoYiConfig.getImagePrefix() + images; + } + } + return images; + } + + + /** + * 轮播图是商户上传的轮播图,对应的路径应该为商户的路径 + * @param sourceStr + * @param firstImages + * @param destStr + */ + public static void dealImagesPath(String sourceStr,StringBuilder firstImages,StringBuilder destStr){ + String images = sourceStr; + if (images == null) { + firstImages=null; + destStr=null; + return; + } + if (images.contains(",")) { + String[] imageArray = images.split(","); + for (int i = 0; i < imageArray.length; i++) { + if(!imageArray[i].contains("http")){ + imageArray[i] = RuoYiConfig.getImagePrefix() + imageArray[i]; + } + destStr.append(imageArray[i]).append(","); + } + if(destStr.length()>1){ + destStr.deleteCharAt(destStr.length()-1); + } + firstImages .append( imageArray[0]); + } else { + if(!images.contains("http")){ + images = RuoYiConfig.getImagePrefix()+ images; + } + firstImages.append(images); + destStr.append(images); + } + } + + + public static String getFirstImage(String sourceStr){ + String firstImage=null; + if (StringUtils.isBlank(sourceStr)) { + return null; + } + if (sourceStr.contains(",")) { + String[] imageArray = sourceStr.split(","); + firstImage = imageArray[0]; + if(!firstImage.contains("http")){ + firstImage = RuoYiConfig.getImagePrefix() + firstImage; + } + } else { + if(!sourceStr.contains("http")){ + sourceStr = RuoYiConfig.getImagePrefix()+ sourceStr; + } + firstImage= sourceStr; + } + return firstImage; + } + +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/utils/SpecUtils.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/utils/SpecUtils.java new file mode 100644 index 0000000..5eac517 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/utils/SpecUtils.java @@ -0,0 +1,29 @@ +package com.zf.foodpurchase.fdsafe.utils; + +import com.zf.foodpurchase.fdsafe.entity.SpecValues; +import org.springframework.util.CollectionUtils; + +import java.util.List; + +/** + * @author:lilj + * @date:2024/12/5 + */ +public class SpecUtils { + + public static String getSpecStr(List specValuesList) { + if(CollectionUtils.isEmpty(specValuesList)){ + return null; + } + StringBuilder sb = new StringBuilder(); + for (SpecValues specValue : specValuesList) { + sb.append(specValue.getSpecValue()); + if (specValue.getSpecUnit() != null) { + sb.append(specValue.getSpecUnit()); + } + sb.append(" "); + } + sb.deleteCharAt(sb.length() - 1); + return sb.toString(); + } +} diff --git a/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/vo/ProductsSpecVO.java b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/vo/ProductsSpecVO.java new file mode 100644 index 0000000..6cd3298 --- /dev/null +++ b/fp-system/src/main/java/com/zf/foodpurchase/fdsafe/vo/ProductsSpecVO.java @@ -0,0 +1,154 @@ +package com.zf.foodpurchase.fdsafe.vo; + +import com.zf.foodpurchase.common.utils.StringUtils; +import com.zf.foodpurchase.fdsafe.entity.SpecValues; +import lombok.Data; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author:lilj + * @date:2024/12/2 + */ +@Data +public class ProductsSpecVO { + + /** + * 规格名 + */ + private String text; + + /** + * 规格值id. + */ + private Integer value; + + /** + * 规格单位 + */ + private String unit; + + /** + * 是否可选 + */ + private Boolean disabled; + + /** + * 需要该属性辅助构建树形结构 + */ + private Integer parentId; + + /** + * 唯一标识 + */ + private String uniqueKey; + + private String parentKey; + + List children; + + /** + * 合并多个规格 + * + * @param trees + * @return + */ + + public static List mergeSpec(List> trees) { + // Step 1: Create a map to store all nodes by their value + Map nodeMap = new HashMap<>(); + for (List tree : trees) { + for (ProductsSpecVO node : tree) { + // nodeMap.put(node.getParentId() + ":" + node.getValue(), node); + nodeMap.put(node.getUniqueKey(), node); + } + } + + // Step 2: Build the tree structure + for (ProductsSpecVO node : nodeMap.values()) { + String parentKey= node.getParentKey(); + if (parentKey != null && nodeMap.containsKey(parentKey)) { + ProductsSpecVO parent = nodeMap.get(parentKey); + if (parent.getChildren() == null) { + parent.setChildren(new ArrayList<>()); + } + parent.getChildren().add(node); + // parent.getChildrenMap().put(node.getValue(), node); + } + } + + // Step 3: Collect root nodes (nodes with parentId == null) + List rootNodes = new ArrayList<>(); + for (ProductsSpecVO node : nodeMap.values()) { + if (node.getParentId() == null) { + rootNodes.add(node); + } + } + + return rootNodes; + } + + /** + * 构建节点基本信息 + * + * @param specValuesList + * @param isDisabled + * @return + */ + public static List buildVOS(List specValuesList, Boolean isDisabled) { + + List productsSpecVOList = new ArrayList<>(); + List specTypeList = specValuesList.stream() + .map(SpecValues::getSpecType) + .distinct() + .sorted() + .collect(Collectors.toList()); + + + Map specTypeToSpecValueMap = specValuesList.stream() + .collect(Collectors.toMap( + SpecValues::getSpecType, // Key: specType + value -> value // Value: specValue + )); + + + // 初始化根节点 + ProductsSpecVO preNod = null; + for (int i = 0; i < specTypeList.size(); i++) { + ProductsSpecVO node = new ProductsSpecVO(); + node = new ProductsSpecVO(); + + SpecValues specValues =specTypeToSpecValueMap.get(specTypeList.get(i)); + if(StringUtils.isNotBlank(specValues.getSpecUnit())){ + node.setText(specValues.getSpecValue()+specValues.getSpecUnit()); + + }else{ + node.setText(specValues.getSpecValue()); + } + node.setValue(specValues.getId()); + node.setUnit(specValues.getSpecUnit()); + if (i == specValuesList.size() - 1) { + node.setDisabled(isDisabled); + } else { + node.setDisabled(false); + } + if (i != 0) { + node.setParentId(preNod.getValue()); + node.setUniqueKey(preNod.getUniqueKey()+":"+node.getValue()); + node.setParentKey(preNod.getUniqueKey()); + }else{ + node.setUniqueKey("0"+":"+node.getValue().toString()); + } + productsSpecVOList.add(node); + preNod = node; + + } + + return productsSpecVOList; + + } +} diff --git a/fp-system/src/main/resources/mapper/BrowseMapper.xml b/fp-system/src/main/resources/mapper/BrowseMapper.xml new file mode 100644 index 0000000..fc05c5f --- /dev/null +++ b/fp-system/src/main/resources/mapper/BrowseMapper.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + select b.id, + b.user_id, + b.merchant_id, + b.product_id, + b.start_time, + b.end_time, + b.remain_time, + b.create_time, + IFNULL(u.nickname,'未设置昵称') as nickname, + m.dept_name, + p.product_name + from browse b inner join user u on b.user_id=u.id inner join sys_dept m on b.merchant_id=m.dept_id inner join products p on b.product_id=p.product_id + + + + diff --git a/fp-system/src/main/resources/mapper/CarouselMapper.xml b/fp-system/src/main/resources/mapper/CarouselMapper.xml new file mode 100644 index 0000000..fd1382d --- /dev/null +++ b/fp-system/src/main/resources/mapper/CarouselMapper.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + select carousel_id, c.merchant_id, carousel_iamges, c.create_time,c.update_time,dept_name from carousel c inner join sys_dept d on + c.merchant_id = d.dept_id + + + + + + + + insert into carousel + + merchant_id, + carousel_iamges, + create_time, + update_time, + + + #{merchantId}, + #{carouselIamges}, + #{createTime}, + #{updateTime}, + + + + + update carousel + + merchant_id = #{merchantId}, + carousel_iamges = #{carouselIamges}, + update_time = #{updateTime}, + + where carousel_id = #{carouselId} + + + + delete from carousel where carousel_id = #{carouselId} + + + + delete from carousel where carousel_id in + + #{carouselId} + + + diff --git a/fp-system/src/main/resources/mapper/ProductsMapper.xml b/fp-system/src/main/resources/mapper/ProductsMapper.xml new file mode 100644 index 0000000..c062607 --- /dev/null +++ b/fp-system/src/main/resources/mapper/ProductsMapper.xml @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select product_id, merchant_id, + d.dept_name as dept_name, product_name, + description, base_price, total_stock, + images, category_id, p.status as status, + type, base_integral, base_return_intergral, + p.create_time, p.update_time, oper_id, + p.del_flag as del_flag, detail_images , + is_specs, + sail_count, hot, recommend, + is_new,version + from products p inner join sys_dept d on d.dept_id = p.merchant_id + + + + + + + + + + + + + + + + + + insert into products + + merchant_id, + product_name, + description, + base_price, + total_stock, + images, + category_id, + status, + type, + base_integral, + base_return_intergral, + create_time, + update_time, + oper_id, + del_flag, + detail_images, + is_specs, + sail_count, + hot, + recommend, + is_new, + + + #{merchantId}, + #{productName}, + #{description}, + #{basePrice}, + #{totalStock}, + #{images}, + #{categoryId}, + #{status}, + #{type}, + #{baseIntegral}, + #{baseReturnIntergral}, + #{createTime}, + #{updateTime}, + #{operId}, + #{delFlag}, + #{detailImages}, + #{isSpecs}, + #{sailCount}, + #{hot}, + #{recommend}, + #{isNew}, + + + + + update products + + merchant_id = #{merchantId}, + product_name = #{productName}, + description = #{description}, + base_price = #{basePrice}, + total_stock = #{totalStock}, + images = #{images}, + category_id = #{categoryId}, + status = #{status}, + type = #{type}, + base_integral = #{baseIntegral}, + base_return_intergral = #{baseReturnIntergral}, + create_time = #{createTime}, + update_time = #{updateTime}, + oper_id = #{operId}, + del_flag = #{delFlag}, + detail_images = #{detailImages}, + is_specs = #{isSpecs}, + sail_count= #{sailCount}, + hot=#{hot}, + recommend=#{recommend}, + is_new=#{isNew}, + version=#{version}+1, + + where product_id = #{productId} and version=#{version} + + + + delete from products where product_id = #{productId} + + + + delete from products where product_id in + + #{productId} + + + + update products set del_flag = '1' where product_id in + + #{productId} + + + diff --git a/fp-system/src/main/resources/mapper/ProductsSpecMapper.xml b/fp-system/src/main/resources/mapper/ProductsSpecMapper.xml new file mode 100644 index 0000000..0714b86 --- /dev/null +++ b/fp-system/src/main/resources/mapper/ProductsSpecMapper.xml @@ -0,0 +1,29 @@ + + + + + + update products_spec + + product_id = #{productId}, + spec_values = #{specValues}, + price = #{price}, + stock = #{stock}, + type = #{type}, + integral = #{integral}, + return_integral = #{returnIntegral}, + create_time = #{createTime}, + update_time = #{updateTime}, + oper_id = #{operId}, + spec_image = #{specImage}, + ps_version = #{psVersion}+1, + + where id = #{id} and ps_version=#{psVersion} + + + + + + diff --git a/fp-system/src/main/resources/mapper/RepositoryMapper.xml b/fp-system/src/main/resources/mapper/RepositoryMapper.xml new file mode 100644 index 0000000..0a125bd --- /dev/null +++ b/fp-system/src/main/resources/mapper/RepositoryMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + select r.id, r.merchant_id,r.repo_name, r.area_code, r.detail_address, r.default_repo, r.create_time, r.update_time, r.oper_id,d.dept_name as merchant_name + from repository r left join sys_dept d on r.merchant_id = d.dept_id + + + + diff --git a/fp-system/src/main/resources/mapper/SpecTypesMapper.xml b/fp-system/src/main/resources/mapper/SpecTypesMapper.xml new file mode 100644 index 0000000..b467546 --- /dev/null +++ b/fp-system/src/main/resources/mapper/SpecTypesMapper.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/fp-system/src/main/resources/mapper/SpecValuesMapper.xml b/fp-system/src/main/resources/mapper/SpecValuesMapper.xml new file mode 100644 index 0000000..45299a1 --- /dev/null +++ b/fp-system/src/main/resources/mapper/SpecValuesMapper.xml @@ -0,0 +1,57 @@ + + + + +select + id, + spec_type as specType, + spec_value as specValue, + spec_unit as specUnit, + create_time as createTime, + update_time as updateTime, + oper_id as operId + from spec_values + + + SELECT + v.id, + v.spec_type AS specType, + v.spec_value AS specValue, + v.spec_unit AS specUnit, + v.create_time AS createTime, + v.update_time AS updateTime, + v.oper_id AS operId, + t.spec_name AS specName +FROM + spec_values v + LEFT JOIN spec_types t ON v.spec_type = t.spec_type + + + + + + +