diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiProductController.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiProductController.java index eabff9d..560f63e 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiProductController.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/controller/AppletApiProductController.java @@ -12,7 +12,7 @@ import org.jeecg.config.shiro.IgnoreAuth; import org.jeecg.modules.applet.service.AppletApiProductService; import org.jeecg.modules.demo.appletProduct.entity.AppletProduct; import org.jeecg.modules.demo.appletProductCategory.entity.AppletProductCategory; -import org.jeecg.modules.demo.appletProductSpec.entity.AppletProductSpec; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductSpec; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiProductService.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiProductService.java index 4dfaf43..15db041 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiProductService.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/AppletApiProductService.java @@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.jeecg.modules.demo.appletProduct.entity.AppletProduct; import org.jeecg.modules.demo.appletProductCategory.entity.AppletProductCategory; -import org.jeecg.modules.demo.appletProductSpec.entity.AppletProductSpec; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductSpec; import java.util.List; diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiCarServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiCarServiceImpl.java index d13715c..04cddaa 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiCarServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiCarServiceImpl.java @@ -11,7 +11,7 @@ import org.jeecg.modules.demo.appletCar.entity.AppletCar; import org.jeecg.modules.demo.appletCar.service.IAppletCarService; import org.jeecg.modules.demo.appletProduct.entity.AppletProduct; import org.jeecg.modules.demo.appletProduct.service.IAppletProductService; -import org.jeecg.modules.demo.appletProductSpec.service.IAppletProductSpecService; +import org.jeecg.modules.demo.appletProduct.service.IAppletProductSpecService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiLoginService.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiLoginService.java index fa9f26b..8ff258e 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiLoginService.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiLoginService.java @@ -191,7 +191,7 @@ public class AppletApiLoginService { // 创建新用户 user = new AppletUser(); user.setOpenid(openid); - user.setName("微信用户" + openid.substring(0, 8)); +// user.setName("微信用户" + openid.substring(0, 8)); user.setCreateTime(new Date()); user.setCreateBy("system"); diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiOrderServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiOrderServiceImpl.java index f023933..1ee718a 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiOrderServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiOrderServiceImpl.java @@ -29,8 +29,8 @@ import org.jeecg.modules.demo.appletOrderEvaluate.service.IAppletOrderAfterSaleS import org.jeecg.modules.demo.appletOrderEvaluate.service.IAppletOrderEvaluateService; import org.jeecg.modules.demo.appletProduct.entity.AppletProduct; import org.jeecg.modules.demo.appletProduct.service.IAppletProductService; -import org.jeecg.modules.demo.appletProductSpec.entity.AppletProductSpec; -import org.jeecg.modules.demo.appletProductSpec.service.IAppletProductSpecService; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductSpec; +import org.jeecg.modules.demo.appletProduct.service.IAppletProductSpecService; import org.jeecg.modules.demo.appletShippingAddress.entity.AppletShippingAddress; import org.jeecg.modules.demo.appletShippingAddress.service.IAppletShippingAddressService; import org.jeecg.modules.demo.appletSubscribeDetection.entity.AppletSubscribeDetection; diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiPaperServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiPaperServiceImpl.java index 051cce6..1e93865 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiPaperServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiPaperServiceImpl.java @@ -23,8 +23,8 @@ import org.jeecg.modules.demo.appletPaperReport.entity.AppletPaperReport; import org.jeecg.modules.demo.appletPaperReport.entity.AppletPaperReportItem; import org.jeecg.modules.demo.appletPaperReport.service.IAppletPaperReportItemService; import org.jeecg.modules.demo.appletPaperReport.service.IAppletPaperReportService; -import org.jeecg.modules.demo.appletProductSpec.entity.AppletProductSpec; -import org.jeecg.modules.demo.appletProductSpec.service.IAppletProductSpecService; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductSpec; +import org.jeecg.modules.demo.appletProduct.service.IAppletProductSpecService; import org.jeecg.modules.demo.appletQuestionTrigger.entity.AppletQuestionTrigger; import org.jeecg.modules.demo.appletQuestionTrigger.service.IAppletQuestionTriggerItemService; import org.jeecg.modules.demo.appletQuestionTrigger.service.IAppletQuestionTriggerService; diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiProductServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiProductServiceImpl.java index 605e1a2..a113df0 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiProductServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/applet/service/impl/AppletApiProductServiceImpl.java @@ -10,10 +10,10 @@ import org.jeecg.modules.demo.appletProduct.entity.AppletProduct; import org.jeecg.modules.demo.appletProduct.service.IAppletProductService; import org.jeecg.modules.demo.appletProductCategory.entity.AppletProductCategory; import org.jeecg.modules.demo.appletProductCategory.service.IAppletProductCategoryService; -import org.jeecg.modules.demo.appletProductPackage.entity.AppletProductPackage; -import org.jeecg.modules.demo.appletProductPackage.service.IAppletProductPackageService; -import org.jeecg.modules.demo.appletProductSpec.entity.AppletProductSpec; -import org.jeecg.modules.demo.appletProductSpec.service.IAppletProductSpecService; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductPackage; +import org.jeecg.modules.demo.appletProduct.service.IAppletProductPackageService; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductSpec; +import org.jeecg.modules.demo.appletProduct.service.IAppletProductSpecService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletCar/entity/AppletCar.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletCar/entity/AppletCar.java index f4b037e..be08b24 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletCar/entity/AppletCar.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletCar/entity/AppletCar.java @@ -11,7 +11,7 @@ import org.jeecg.common.util.SpringContextUtils; import lombok.Data; import com.fasterxml.jackson.annotation.JsonFormat; import org.jeecg.modules.demo.appletProduct.entity.AppletProduct; -import org.jeecg.modules.demo.appletProductSpec.entity.AppletProductSpec; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductSpec; import org.springframework.format.annotation.DateTimeFormat; import org.jeecgframework.poi.excel.annotation.Excel; import org.jeecg.common.aspect.annotation.Dict; diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/controller/AppletProductController.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/controller/AppletProductController.java index 3e36345..cd74057 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/controller/AppletProductController.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/controller/AppletProductController.java @@ -1,38 +1,46 @@ package org.jeecg.modules.demo.appletProduct.controller; +import java.io.UnsupportedEncodingException; +import java.io.IOException; +import java.net.URLDecoder; +import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; +import java.util.HashMap; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import org.jeecg.common.api.vo.Result; -import org.jeecg.common.system.query.QueryGenerator; -import org.jeecg.common.system.query.QueryRuleEnum; -import org.jeecg.common.util.oConvertUtils; -import org.jeecg.modules.demo.appletProduct.entity.AppletProduct; -import org.jeecg.modules.demo.appletProduct.service.IAppletProductService; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import lombok.extern.slf4j.Slf4j; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; import org.jeecgframework.poi.excel.entity.ExportParams; import org.jeecgframework.poi.excel.entity.ImportParams; import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; -import org.jeecg.common.system.base.controller.JeecgController; +import org.jeecg.common.system.vo.LoginUser; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.system.query.QueryGenerator; +import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductSpec; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductPackage; +import org.jeecg.modules.demo.appletProduct.entity.AppletProduct; +import org.jeecg.modules.demo.appletProduct.vo.AppletProductPage; +import org.jeecg.modules.demo.appletProduct.service.IAppletProductService; +import org.jeecg.modules.demo.appletProduct.service.IAppletProductSpecService; +import org.jeecg.modules.demo.appletProduct.service.IAppletProductPackageService; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import org.springframework.web.servlet.ModelAndView; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; -import org.springframework.web.servlet.ModelAndView; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; import com.alibaba.fastjson.JSON; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; @@ -41,16 +49,20 @@ import org.apache.shiro.authz.annotation.RequiresPermissions; /** * @Description: 产品表 * @Author: jeecg-boot - * @Date: 2025-07-21 + * @Date: 2025-10-22 * @Version: V1.0 */ @Tag(name="产品表") @RestController @RequestMapping("/appletProduct/appletProduct") @Slf4j -public class AppletProductController extends JeecgController { +public class AppletProductController { @Autowired private IAppletProductService appletProductService; + @Autowired + private IAppletProductSpecService appletProductSpecService; + @Autowired + private IAppletProductPackageService appletProductPackageService; /** * 分页列表查询 @@ -68,13 +80,11 @@ public class AppletProductController extends JeecgController customeRuleMap = new HashMap<>(); // 自定义多选的查询规则为:LIKE_WITH_OR customeRuleMap.put("type", QueryRuleEnum.LIKE_WITH_OR); - customeRuleMap.put("classId", QueryRuleEnum.LIKE_WITH_OR); + customeRuleMap.put("subscribeType", QueryRuleEnum.LIKE_WITH_OR); QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(appletProduct, req.getParameterMap(),customeRuleMap); Page page = new Page(pageNo, pageSize); IPage pageList = appletProductService.page(page, queryWrapper); @@ -84,31 +94,38 @@ public class AppletProductController extends JeecgController add(@RequestBody AppletProduct appletProduct) { - appletProductService.save(appletProduct); - + public Result add(@RequestBody AppletProductPage appletProductPage) { + AppletProduct appletProduct = new AppletProduct(); + BeanUtils.copyProperties(appletProductPage, appletProduct); + appletProductService.saveMain(appletProduct, appletProductPage.getAppletProductSpecList(),appletProductPage.getAppletProductPackageList()); return Result.OK("添加成功!"); } /** * 编辑 * - * @param appletProduct + * @param appletProductPage * @return */ @AutoLog(value = "产品表-编辑") @Operation(summary="产品表-编辑") - @RequiresPermissions("appletProduct:applet_product:edit") + @RequiresPermissions("appletProduct:applet_product:edit") @RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) - public Result edit(@RequestBody AppletProduct appletProduct) { - appletProductService.updateById(appletProduct); + public Result edit(@RequestBody AppletProductPage appletProductPage) { + AppletProduct appletProduct = new AppletProduct(); + BeanUtils.copyProperties(appletProductPage, appletProduct); + AppletProduct appletProductEntity = appletProductService.getById(appletProduct.getId()); + if(appletProductEntity==null) { + return Result.error("未找到对应数据"); + } + appletProductService.updateMain(appletProduct, appletProductPage.getAppletProductSpecList(),appletProductPage.getAppletProductPackageList()); return Result.OK("编辑成功!"); } @@ -120,10 +137,10 @@ public class AppletProductController extends JeecgController delete(@RequestParam(name="id",required=true) String id) { - appletProductService.removeById(id); + appletProductService.delMain(id); return Result.OK("删除成功!"); } @@ -135,11 +152,11 @@ public class AppletProductController extends JeecgController deleteBatch(@RequestParam(name="ids",required=true) String ids) { - this.appletProductService.removeByIds(Arrays.asList(ids.split(","))); - return Result.OK("批量删除成功!"); + this.appletProductService.delBatchMain(Arrays.asList(ids.split(","))); + return Result.OK("批量删除成功!"); } /** @@ -157,6 +174,34 @@ public class AppletProductController extends JeecgController> queryAppletProductSpecListByMainId(@RequestParam(name="id",required=true) String id) { + List appletProductSpecList = appletProductSpecService.selectByMainId(id); + return Result.OK(appletProductSpecList); + } + /** + * 通过id查询 + * + * @param id + * @return + */ + //@AutoLog(value = "产品套餐通过主表ID查询") + @Operation(summary="产品套餐主表ID查询") + @GetMapping(value = "/queryAppletProductPackageByMainId") + public Result> queryAppletProductPackageListByMainId(@RequestParam(name="id",required=true) String id) { + List appletProductPackageList = appletProductPackageService.selectByMainId(id); + return Result.OK(appletProductPackageList); } /** @@ -168,11 +213,43 @@ public class AppletProductController extends JeecgController queryWrapper = QueryGenerator.initQueryWrapper(appletProduct, request.getParameterMap()); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + + //配置选中数据查询条件 + String selections = request.getParameter("selections"); + if(oConvertUtils.isNotEmpty(selections)) { + List selectionList = Arrays.asList(selections.split(",")); + queryWrapper.in("id",selectionList); + } + //Step.2 获取导出数据 + List appletProductList = appletProductService.list(queryWrapper); + + // Step.3 组装pageList + List pageList = new ArrayList(); + for (AppletProduct main : appletProductList) { + AppletProductPage vo = new AppletProductPage(); + BeanUtils.copyProperties(main, vo); + List appletProductSpecList = appletProductSpecService.selectByMainId(main.getId()); + vo.setAppletProductSpecList(appletProductSpecList); + List appletProductPackageList = appletProductPackageService.selectByMainId(main.getId()); + vo.setAppletProductPackageList(appletProductPackageList); + pageList.add(vo); + } + + // Step.4 AutoPoi 导出Excel + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); + mv.addObject(NormalExcelConstants.FILE_NAME, "产品表列表"); + mv.addObject(NormalExcelConstants.CLASS, AppletProductPage.class); + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("产品表数据", "导出人:"+sysUser.getRealname(), "产品表")); + mv.addObject(NormalExcelConstants.DATA_LIST, pageList); + return mv; } /** - * 通过excel导入数据 + * 通过excel导入数据 * * @param request * @param response @@ -181,7 +258,35 @@ public class AppletProductController extends JeecgController importExcel(HttpServletRequest request, HttpServletResponse response) { - return super.importExcel(request, response, AppletProduct.class); + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; + Map fileMap = multipartRequest.getFileMap(); + for (Map.Entry entity : fileMap.entrySet()) { + // 获取上传文件对象 + MultipartFile file = entity.getValue(); + ImportParams params = new ImportParams(); + params.setTitleRows(2); + params.setHeadRows(1); + params.setNeedSave(true); + try { + List list = ExcelImportUtil.importExcel(file.getInputStream(), AppletProductPage.class, params); + for (AppletProductPage page : list) { + AppletProduct po = new AppletProduct(); + BeanUtils.copyProperties(page, po); + appletProductService.saveMain(po, page.getAppletProductSpecList(),page.getAppletProductPackageList()); + } + return Result.OK("文件导入成功!数据行数:" + list.size()); + } catch (Exception e) { + log.error(e.getMessage(),e); + return Result.error("文件导入失败:"+e.getMessage()); + } finally { + try { + file.getInputStream().close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return Result.OK("文件导入失败!"); } } diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/entity/AppletProduct.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/entity/AppletProduct.java index ff131f7..eb58147 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/entity/AppletProduct.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/entity/AppletProduct.java @@ -1,36 +1,26 @@ package org.jeecg.modules.demo.appletProduct.entity; import java.io.Serializable; -import java.io.UnsupportedEncodingException; -import java.util.Date; -import java.math.BigDecimal; import java.util.List; import com.baomidou.mybatisplus.annotation.*; -import org.jeecg.common.constant.ProvinceCityArea; -import org.jeecg.common.util.SpringContextUtils; import lombok.Data; import com.fasterxml.jackson.annotation.JsonFormat; -import org.jeecg.modules.demo.appletProductPackage.entity.AppletProductPackage; -import org.jeecg.modules.demo.appletProductSpec.entity.AppletProductSpec; import org.springframework.format.annotation.DateTimeFormat; import org.jeecgframework.poi.excel.annotation.Excel; import org.jeecg.common.aspect.annotation.Dict; + import io.swagger.v3.oas.annotations.media.Schema; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; /** * @Description: 产品表 * @Author: jeecg-boot - * @Date: 2025-07-21 + * @Date: 2025-10-22 * @Version: V1.0 */ +@Schema(description="产品表") @Data @TableName("applet_product") -@Accessors(chain = true) -@EqualsAndHashCode(callSuper = false) -@Schema(description="产品表") public class AppletProduct implements Serializable { private static final long serialVersionUID = 1L; @@ -58,22 +48,26 @@ public class AppletProduct implements Serializable { @Excel(name = "产品名称", width = 15) @Schema(description = "产品名称") private java.lang.String name; - /**产品名称*/ - @Excel(name = "产品英文名称", width = 15) - @Schema(description = "产品英文名称") + /**英文名称*/ + @Excel(name = "英文名称", width = 15) + @Schema(description = "英文名称") private java.lang.String enName; + /**图片*/ + @Excel(name = "图片", width = 15) + @Schema(description = "图片") + private java.lang.String image; /**产品描述*/ @Excel(name = "产品描述", width = 15) @Schema(description = "产品描述") private java.lang.String info; /**类型*/ @Excel(name = "类型", width = 15, dicCode = "applet_product_type") - @Dict(dicCode = "applet_product_type") + @Dict(dicCode = "applet_product_type") @Schema(description = "类型") private java.lang.String type; /**分类*/ @Excel(name = "分类", width = 15, dictTable = "applet_product_category", dicText = "name", dicCode = "id") - @Dict(dictTable = "applet_product_category", dicText = "name", dicCode = "id") + @Dict(dictTable = "applet_product_category", dicText = "name", dicCode = "id") @Schema(description = "分类") private java.lang.String classId; /**原价*/ @@ -100,41 +94,32 @@ public class AppletProduct implements Serializable { @Excel(name = "产品内容", width = 15) @Schema(description = "产品内容") private java.lang.String content; - - /**跨境商品*/ - @Excel(name = "跨境商品", width = 15) + /**跨境商品*/ + @Excel(name = "跨境商品", width = 15,replace = {"是_Y","否_N"} ) @Schema(description = "跨境商品") - private String isCrossBorder; - - /**图片*/ - @Excel(name = "图片", width = 15) - @Schema(description = "图片,多张用,分割") - private String image; - - /**首页推荐*/ - @Excel(name = "首页推荐", width = 15) - @Schema(description = "首页推荐") - private String homeRecommend; - - /**服务*/ - @Excel(name = "服务", width = 15) - @Schema(description = "服务") - private String service; - - /**服务*/ - @Excel(name = "检测类型", width = 15) + private java.lang.String isCrossBorder; + /**套餐*/ + @Excel(name = "套餐", width = 15,replace = {"是_Y","否_N"} ) + @Schema(description = "套餐") + private java.lang.String isMeal; + /**推荐*/ + @Excel(name = "推荐", width = 15,replace = {"是_Y","否_N"} ) + @Schema(description = "推荐") + private java.lang.String homeRecommend; + /**检测类型*/ + @Excel(name = "检测类型", width = 15, dicCode = "applett_subscribe_type") + @Dict(dicCode = "applett_subscribe_type") @Schema(description = "检测类型") - private String subscribeType; - - /**合作医院*/ - @Excel(name = "合作医院", width = 15) + private java.lang.String subscribeType; + /**服务*/ + @Excel(name = "服务", width = 15) + @Schema(description = "服务") + private java.lang.String service; + /**合作医院*/ + @Excel(name = "合作医院", width = 15, dictTable = "applet_hospital", dicText = "name", dicCode = "id") + @Dict(dictTable = "applet_hospital", dicText = "name", dicCode = "id") @Schema(description = "合作医院") - private String hospitalId; - - /**是否套餐*/ - @Excel(name = "是否套餐", width = 15) - @Schema(description = "是否套餐") - private String isMeal; + private java.lang.String hospitalId; @TableField(exist = false) diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/entity/AppletProductPackage.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/entity/AppletProductPackage.java new file mode 100644 index 0000000..e3753dd --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/entity/AppletProductPackage.java @@ -0,0 +1,65 @@ +package org.jeecg.modules.demo.appletProduct.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import java.util.Date; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.UnsupportedEncodingException; + +/** + * @Description: 产品套餐 + * @Author: jeecg-boot + * @Date: 2025-10-22 + * @Version: V1.0 + */ +@Schema(description="产品套餐") +@Data +@TableName("applet_product_package") +public class AppletProductPackage implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**所属部门*/ + @Schema(description = "所属部门") + private java.lang.String sysOrgCode; + /**图片*/ + @Excel(name = "图片", width = 15) + @Schema(description = "图片") + private java.lang.String image; + /**标题*/ + @Excel(name = "标题", width = 15) + @Schema(description = "标题") + private java.lang.String titile; + /**产品*/ + @Schema(description = "产品") + private java.lang.String productId; +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/entity/AppletProductSpec.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/entity/AppletProductSpec.java new file mode 100644 index 0000000..f9e2768 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/entity/AppletProductSpec.java @@ -0,0 +1,85 @@ +package org.jeecg.modules.demo.appletProduct.entity; + +import java.io.Serializable; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableLogic; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import java.util.Date; + +import io.swagger.v3.oas.annotations.media.Schema; +import java.io.UnsupportedEncodingException; + +/** + * @Description: 产品规格表 + * @Author: jeecg-boot + * @Date: 2025-10-22 + * @Version: V1.0 + */ +@Schema(description="产品规格表") +@Data +@TableName("applet_product_spec") +public class AppletProductSpec implements Serializable { + private static final long serialVersionUID = 1L; + + /**主键*/ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**规格名称*/ + @Excel(name = "规格名称", width = 15) + @Schema(description = "规格名称") + private java.lang.String specName; + /**详情*/ + @Excel(name = "详情", width = 15) + @Schema(description = "详情") + private java.lang.String content; + /**排序*/ + @Excel(name = "排序", width = 15) + @Schema(description = "排序") + private java.lang.Integer sortOrder; + /**产品*/ + @Schema(description = "产品") + private java.lang.String productId; + /**价格*/ + @Excel(name = "价格", width = 15) + @Schema(description = "价格") + private java.math.BigDecimal price; + /**图片*/ + @Excel(name = "图片", width = 15) + @Schema(description = "图片") + private java.lang.String image; + /**描述*/ + @Excel(name = "描述", width = 15) + @Schema(description = "描述") + private java.lang.String info; + + @Excel(name = "库存", width = 15) + @Schema(description = "库存") + private Integer inventory;//库存 + @Excel(name = "上架", width = 15) + @Schema(description = "上架") + private String putaway;//上架 +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/AppletProductMapper.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/AppletProductMapper.java index 9ffd744..37f85f6 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/AppletProductMapper.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/AppletProductMapper.java @@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * @Description: 产品表 * @Author: jeecg-boot - * @Date: 2025-07-21 + * @Date: 2025-10-22 * @Version: V1.0 */ public interface AppletProductMapper extends BaseMapper { diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/AppletProductPackageMapper.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/AppletProductPackageMapper.java new file mode 100644 index 0000000..9b9757d --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/AppletProductPackageMapper.java @@ -0,0 +1,31 @@ +package org.jeecg.modules.demo.appletProduct.mapper; + +import java.util.List; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductPackage; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * @Description: 产品套餐 + * @Author: jeecg-boot + * @Date: 2025-10-22 + * @Version: V1.0 + */ +public interface AppletProductPackageMapper extends BaseMapper { + + /** + * 通过主表id删除子表数据 + * + * @param mainId 主表id + * @return boolean + */ + public boolean deleteByMainId(@Param("mainId") String mainId); + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List + */ + public List selectByMainId(@Param("mainId") String mainId); +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/AppletProductSpecMapper.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/AppletProductSpecMapper.java new file mode 100644 index 0000000..efa7633 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/AppletProductSpecMapper.java @@ -0,0 +1,31 @@ +package org.jeecg.modules.demo.appletProduct.mapper; + +import java.util.List; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductSpec; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +/** + * @Description: 产品规格表 + * @Author: jeecg-boot + * @Date: 2025-10-22 + * @Version: V1.0 + */ +public interface AppletProductSpecMapper extends BaseMapper { + + /** + * 通过主表id删除子表数据 + * + * @param mainId 主表id + * @return boolean + */ + public boolean deleteByMainId(@Param("mainId") String mainId); + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List + */ + public List selectByMainId(@Param("mainId") String mainId); +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/xml/AppletProductPackageMapper.xml b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/xml/AppletProductPackageMapper.xml new file mode 100644 index 0000000..c606761 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/xml/AppletProductPackageMapper.xml @@ -0,0 +1,16 @@ + + + + + + DELETE + FROM applet_product_package + WHERE + product_id = #{mainId} + + + diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/xml/AppletProductSpecMapper.xml b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/xml/AppletProductSpecMapper.xml new file mode 100644 index 0000000..5fa29ba --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/mapper/xml/AppletProductSpecMapper.xml @@ -0,0 +1,16 @@ + + + + + + DELETE + FROM applet_product_spec + WHERE + product_id = #{mainId} + + + diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/IAppletProductPackageService.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/IAppletProductPackageService.java new file mode 100644 index 0000000..896054e --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/IAppletProductPackageService.java @@ -0,0 +1,22 @@ +package org.jeecg.modules.demo.appletProduct.service; + +import org.jeecg.modules.demo.appletProduct.entity.AppletProductPackage; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + * @Description: 产品套餐 + * @Author: jeecg-boot + * @Date: 2025-10-22 + * @Version: V1.0 + */ +public interface IAppletProductPackageService extends IService { + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List + */ + public List selectByMainId(String mainId); +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/IAppletProductService.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/IAppletProductService.java index 4f91934..0ab0f92 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/IAppletProductService.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/IAppletProductService.java @@ -1,14 +1,51 @@ package org.jeecg.modules.demo.appletProduct.service; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductSpec; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductPackage; import org.jeecg.modules.demo.appletProduct.entity.AppletProduct; import com.baomidou.mybatisplus.extension.service.IService; +import java.io.Serializable; +import java.util.Collection; +import java.util.List; /** * @Description: 产品表 * @Author: jeecg-boot - * @Date: 2025-07-21 + * @Date: 2025-10-22 * @Version: V1.0 */ public interface IAppletProductService extends IService { + /** + * 添加一对多 + * + * @param appletProduct + * @param appletProductSpecList + * @param appletProductPackageList + */ + public void saveMain(AppletProduct appletProduct,List appletProductSpecList,List appletProductPackageList) ; + + /** + * 修改一对多 + * + * @param appletProduct + * @param appletProductSpecList + * @param appletProductPackageList + */ + public void updateMain(AppletProduct appletProduct,List appletProductSpecList,List appletProductPackageList); + + /** + * 删除一对多 + * + * @param id + */ + public void delMain (String id); + + /** + * 批量删除一对多 + * + * @param idList + */ + public void delBatchMain (Collection idList); + } diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/IAppletProductSpecService.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/IAppletProductSpecService.java new file mode 100644 index 0000000..b78cd4b --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/IAppletProductSpecService.java @@ -0,0 +1,32 @@ +package org.jeecg.modules.demo.appletProduct.service; + +import org.jeecg.modules.demo.appletProduct.entity.AppletProductSpec; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + * @Description: 产品规格表 + * @Author: jeecg-boot + * @Date: 2025-10-22 + * @Version: V1.0 + */ +public interface IAppletProductSpecService extends IService { + + /** + * 通过主表id查询子表数据 + * + * @param mainId 主表id + * @return List + */ + public List selectByMainId(String mainId); + + /** + * 检查规格名称是否已存在 + * + * @param productId 产品ID + * @param specName 规格名称 + * @param excludeId 排除的规格ID(编辑时使用) + * @return boolean true-已存在,false-不存在 + */ + public boolean checkSpecNameExists(String productId, String specName, String excludeId); +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/impl/AppletProductPackageServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/impl/AppletProductPackageServiceImpl.java new file mode 100644 index 0000000..37abcf4 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/impl/AppletProductPackageServiceImpl.java @@ -0,0 +1,27 @@ +package org.jeecg.modules.demo.appletProduct.service.impl; + +import org.jeecg.modules.demo.appletProduct.entity.AppletProductPackage; +import org.jeecg.modules.demo.appletProduct.mapper.AppletProductPackageMapper; +import org.jeecg.modules.demo.appletProduct.service.IAppletProductPackageService; +import org.springframework.stereotype.Service; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: 产品套餐 + * @Author: jeecg-boot + * @Date: 2025-10-22 + * @Version: V1.0 + */ +@Service +public class AppletProductPackageServiceImpl extends ServiceImpl implements IAppletProductPackageService { + + @Autowired + private AppletProductPackageMapper appletProductPackageMapper; + + @Override + public List selectByMainId(String mainId) { + return appletProductPackageMapper.selectByMainId(mainId); + } +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/impl/AppletProductServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/impl/AppletProductServiceImpl.java index ed4a6f0..2efc1df 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/impl/AppletProductServiceImpl.java +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/impl/AppletProductServiceImpl.java @@ -1,19 +1,122 @@ package org.jeecg.modules.demo.appletProduct.service.impl; import org.jeecg.modules.demo.appletProduct.entity.AppletProduct; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductSpec; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductPackage; +import org.jeecg.modules.demo.appletProduct.mapper.AppletProductSpecMapper; +import org.jeecg.modules.demo.appletProduct.mapper.AppletProductPackageMapper; import org.jeecg.modules.demo.appletProduct.mapper.AppletProductMapper; import org.jeecg.modules.demo.appletProduct.service.IAppletProductService; +import org.jeecg.modules.demo.appletProduct.service.IAppletProductSpecService; import org.springframework.stereotype.Service; - import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import java.io.Serializable; +import java.util.List; +import java.util.Collection; +import java.util.Set; +import java.util.HashSet; /** * @Description: 产品表 * @Author: jeecg-boot - * @Date: 2025-07-21 + * @Date: 2025-10-22 * @Version: V1.0 */ @Service public class AppletProductServiceImpl extends ServiceImpl implements IAppletProductService { + @Autowired + private AppletProductMapper appletProductMapper; + @Autowired + private AppletProductSpecMapper appletProductSpecMapper; + @Autowired + private AppletProductPackageMapper appletProductPackageMapper; + @Autowired + private IAppletProductSpecService appletProductSpecService; + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveMain(AppletProduct appletProduct, List appletProductSpecList,List appletProductPackageList) { + appletProductMapper.insert(appletProduct); + if(appletProductSpecList!=null && appletProductSpecList.size()>0) { + // 检查规格名称唯一性 + Set specNames = new HashSet<>(); + for(AppletProductSpec entity:appletProductSpecList) { + if (entity.getSpecName() != null && !entity.getSpecName().trim().isEmpty()) { + if (specNames.contains(entity.getSpecName())) { + throw new RuntimeException("规格名称重复: " + entity.getSpecName()); + } + if (appletProductSpecService.checkSpecNameExists(appletProduct.getId(), entity.getSpecName(), null)) { + throw new RuntimeException("规格名称已存在: " + entity.getSpecName()); + } + specNames.add(entity.getSpecName()); + } + //外键设置 + entity.setProductId(appletProduct.getId()); + appletProductSpecMapper.insert(entity); + } + } + if(appletProductPackageList!=null && appletProductPackageList.size()>0) { + for(AppletProductPackage entity:appletProductPackageList) { + //外键设置 + entity.setProductId(appletProduct.getId()); + appletProductPackageMapper.insert(entity); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateMain(AppletProduct appletProduct,List appletProductSpecList,List appletProductPackageList) { + appletProductMapper.updateById(appletProduct); + + //1.先删除子表数据 + appletProductSpecMapper.deleteByMainId(appletProduct.getId()); + appletProductPackageMapper.deleteByMainId(appletProduct.getId()); + + //2.子表数据重新插入 + if(appletProductSpecList!=null && appletProductSpecList.size()>0) { + // 检查规格名称唯一性 + Set specNames = new HashSet<>(); + for(AppletProductSpec entity:appletProductSpecList) { + if (entity.getSpecName() != null && !entity.getSpecName().trim().isEmpty()) { + if (specNames.contains(entity.getSpecName())) { + throw new RuntimeException("规格名称重复: " + entity.getSpecName()); + } + specNames.add(entity.getSpecName()); + } + //外键设置 + entity.setProductId(appletProduct.getId()); + appletProductSpecMapper.insert(entity); + } + } + if(appletProductPackageList!=null && appletProductPackageList.size()>0) { + for(AppletProductPackage entity:appletProductPackageList) { + //外键设置 + entity.setProductId(appletProduct.getId()); + appletProductPackageMapper.insert(entity); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delMain(String id) { + appletProductSpecMapper.deleteByMainId(id); + appletProductPackageMapper.deleteByMainId(id); + appletProductMapper.deleteById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void delBatchMain(Collection idList) { + for(Serializable id:idList) { + appletProductSpecMapper.deleteByMainId(id.toString()); + appletProductPackageMapper.deleteByMainId(id.toString()); + appletProductMapper.deleteById(id); + } + } + } diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/impl/AppletProductSpecServiceImpl.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/impl/AppletProductSpecServiceImpl.java new file mode 100644 index 0000000..b60e3c7 --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/service/impl/AppletProductSpecServiceImpl.java @@ -0,0 +1,39 @@ +package org.jeecg.modules.demo.appletProduct.service.impl; + +import org.jeecg.modules.demo.appletProduct.entity.AppletProductSpec; +import org.jeecg.modules.demo.appletProduct.mapper.AppletProductSpecMapper; +import org.jeecg.modules.demo.appletProduct.service.IAppletProductSpecService; +import org.springframework.stereotype.Service; +import java.util.List; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description: 产品规格表 + * @Author: jeecg-boot + * @Date: 2025-10-22 + * @Version: V1.0 + */ +@Service +public class AppletProductSpecServiceImpl extends ServiceImpl implements IAppletProductSpecService { + + @Autowired + private AppletProductSpecMapper appletProductSpecMapper; + + @Override + public List selectByMainId(String mainId) { + return appletProductSpecMapper.selectByMainId(mainId); + } + + @Override + public boolean checkSpecNameExists(String productId, String specName, String excludeId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("product_id", productId); + queryWrapper.eq("spec_name", specName); + if (excludeId != null && !excludeId.isEmpty()) { + queryWrapper.ne("id", excludeId); + } + return this.count(queryWrapper) > 0; + } +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/vo/AppletProductPage.java b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/vo/AppletProductPage.java new file mode 100644 index 0000000..8d4732e --- /dev/null +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/vo/AppletProductPage.java @@ -0,0 +1,132 @@ +package org.jeecg.modules.demo.appletProduct.vo; + +import java.util.List; +import org.jeecg.modules.demo.appletProduct.entity.AppletProduct; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductSpec; +import org.jeecg.modules.demo.appletProduct.entity.AppletProductPackage; +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; +import org.jeecgframework.poi.excel.annotation.ExcelEntity; +import org.jeecgframework.poi.excel.annotation.ExcelCollection; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import java.util.Date; +import org.jeecg.common.aspect.annotation.Dict; +import org.jeecg.common.constant.ProvinceCityArea; +import org.jeecg.common.util.SpringContextUtils; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * @Description: 产品表 + * @Author: jeecg-boot + * @Date: 2025-10-22 + * @Version: V1.0 + */ +@Data +@Schema(description="产品表") +public class AppletProductPage { + + /**主键*/ + @Schema(description = "主键") + private java.lang.String id; + /**创建人*/ + @Schema(description = "创建人") + private java.lang.String createBy; + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "创建日期") + private java.util.Date createTime; + /**更新人*/ + @Schema(description = "更新人") + private java.lang.String updateBy; + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @Schema(description = "更新日期") + private java.util.Date updateTime; + /**产品名称*/ + @Excel(name = "产品名称", width = 15) + @Schema(description = "产品名称") + private java.lang.String name; + /**英文名称*/ + @Excel(name = "英文名称", width = 15) + @Schema(description = "英文名称") + private java.lang.String enName; + /**图片*/ + @Excel(name = "图片", width = 15) + @Schema(description = "图片") + private java.lang.String image; + /**产品描述*/ + @Excel(name = "产品描述", width = 15) + @Schema(description = "产品描述") + private java.lang.String info; + /**类型*/ + @Excel(name = "类型", width = 15, dicCode = "applet_product_type") + @Dict(dicCode = "applet_product_type") + @Schema(description = "类型") + private java.lang.String type; + /**分类*/ + @Excel(name = "分类", width = 15) + @Schema(description = "分类") + private java.lang.String classId; + /**原价*/ + @Excel(name = "原价", width = 15) + @Schema(description = "原价") + private java.math.BigDecimal originalPrice; + /**现价*/ + @Excel(name = "现价", width = 15) + @Schema(description = "现价") + private java.math.BigDecimal currentPrice; + /**单位*/ + @Excel(name = "单位", width = 15) + @Schema(description = "单位") + private java.lang.String unit; + /**详情*/ + @Excel(name = "详情", width = 15) + @Schema(description = "详情") + private java.lang.String detail; + /**已出售*/ + @Excel(name = "已出售", width = 15) + @Schema(description = "已出售") + private java.lang.Integer sold; + /**产品内容*/ + @Excel(name = "产品内容", width = 15) + @Schema(description = "产品内容") + private java.lang.String content; + /**跨境商品*/ + @Schema(description = "跨境商品") + @Excel(name = "跨境商品", width = 15,replace = {"是_Y","否_N"} ) + private java.lang.String isCrossBorder; + /**套餐*/ + @Schema(description = "套餐") + @Excel(name = "套餐", width = 15,replace = {"是_Y","否_N"} ) + private java.lang.String isMeal; + /**推荐*/ + @Schema(description = "推荐") + @Excel(name = "推荐", width = 15,replace = {"是_Y","否_N"} ) + private java.lang.String homeRecommend; + /**检测类型*/ + @Excel(name = "检测类型", width = 15, dicCode = "applett_subscribe_type") + @Dict(dicCode = "applett_subscribe_type") + @Schema(description = "检测类型") + private java.lang.String subscribeType; + /**服务*/ + @Excel(name = "服务", width = 15) + @Schema(description = "服务") + private java.lang.String service; + /**合作医院*/ + @Excel(name = "合作医院", width = 15, dictTable = "applet_hospital", dicText = "name", dicCode = "id") + @Dict(dictTable = "applet_hospital", dicText = "name", dicCode = "id") + @Schema(description = "合作医院") + private java.lang.String hospitalId; + + @ExcelCollection(name="产品规格表") + @Schema(description = "产品规格表") + private List appletProductSpecList; + @ExcelCollection(name="产品套餐") + @Schema(description = "产品套餐") + private List appletProductPackageList; + +} diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/vue3/AppletProduct.api.ts b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/vue3/AppletProduct.api.ts index a01fc7d..5c9a505 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/vue3/AppletProduct.api.ts +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/vue3/AppletProduct.api.ts @@ -11,16 +11,29 @@ enum Api { deleteBatch = '/appletProduct/appletProduct/deleteBatch', importExcel = '/appletProduct/appletProduct/importExcel', exportXls = '/appletProduct/appletProduct/exportXls', + appletProductSpecList = '/appletProduct/appletProduct/queryAppletProductSpecByMainId', + appletProductPackageList = '/appletProduct/appletProduct/queryAppletProductPackageByMainId', } /** * 导出api * @param params */ export const getExportUrl = Api.exportXls; + /** * 导入api */ export const getImportUrl = Api.importExcel; +/** + * 查询子表数据 + * @param params + */ +export const appletProductSpecList = Api.appletProductSpecList; +/** + * 查询子表数据 + * @param params + */ +export const appletProductPackageList = Api.appletProductPackageList; /** * 列表接口 * @param params diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/vue3/AppletProduct.data.ts b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/vue3/AppletProduct.data.ts index 0d722d5..e6989e5 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/vue3/AppletProduct.data.ts +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/vue3/AppletProduct.data.ts @@ -2,6 +2,7 @@ import {BasicColumn} from '/@/components/Table'; import {FormSchema} from '/@/components/Table'; import { rules} from '/@/utils/helper/validator'; import { render } from '/@/utils/common/renderUtils'; +import {JVxeTypes,JVxeColumn} from '/@/components/jeecg/JVxeTable/types' import { getWeekMonthQuarterYear } from '/@/utils'; //列表数据 export const columns: BasicColumn[] = [ @@ -10,6 +11,17 @@ export const columns: BasicColumn[] = [ align:"center", dataIndex: 'name' }, + { + title: '英文名称', + align:"center", + dataIndex: 'enName' + }, + { + title: '图片', + align:"center", + dataIndex: 'image', + customRender:render.renderImage, + }, { title: '产品描述', align:"center", @@ -45,12 +57,51 @@ export const columns: BasicColumn[] = [ align:"center", dataIndex: 'sold' }, + { + title: '跨境商品', + align:"center", + dataIndex: 'isCrossBorder', + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'Y'},{text:'否',value:'N'}]) + }, + }, + { + title: '套餐', + align:"center", + dataIndex: 'isMeal', + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'Y'},{text:'否',value:'N'}]) + }, + }, + { + title: '推荐', + align:"center", + dataIndex: 'homeRecommend', + customRender:({text}) => { + return render.renderSwitch(text, [{text:'是',value:'Y'},{text:'否',value:'N'}]) + }, + }, + { + title: '检测类型', + align:"center", + dataIndex: 'subscribeType_dictText' + }, + { + title: '服务', + align:"center", + dataIndex: 'service' + }, + { + title: '合作医院', + align:"center", + dataIndex: 'hospitalId_dictText' + }, ]; //查询数据 export const searchFormSchema: FormSchema[] = [ { label: "类型", - field: 'type', + field: "type", component: 'JSelectMultiple', componentProps:{ dictCode:"applet_product_type" @@ -59,10 +110,20 @@ export const searchFormSchema: FormSchema[] = [ }, { label: "分类", - field: 'classId', + field: "classId", + component: 'JTreeSelect', + componentProps:{ + dict:"applet_product_category,name,id", + pidValue:"0", + }, + //colProps: {span: 6}, + }, + { + label: "检测类型", + field: "subscribeType", component: 'JSelectMultiple', componentProps:{ - dictCode:"applet_product_category,name,id" + dictCode:"applett_subscribe_type" }, //colProps: {span: 6}, }, @@ -74,6 +135,19 @@ export const formSchema: FormSchema[] = [ field: 'name', component: 'Input', }, + { + label: '英文名称', + field: 'enName', + component: 'Input', + }, + { + label: '图片', + field: 'image', + component: 'JImageUpload', + componentProps:{ + fileMax: 0 + }, + }, { label: '产品描述', field: 'info', @@ -84,16 +158,18 @@ export const formSchema: FormSchema[] = [ field: 'type', component: 'JDictSelectTag', componentProps:{ - dictCode:"applet_product_type" + dictCode:"applet_product_type", + type: "radio" }, }, { label: '分类', field: 'classId', - component: 'JDictSelectTag', + component: 'JTreeSelect', componentProps:{ - dictCode:"applet_product_category,name,id" - }, + dict:"applet_product_category,name,id", + pidValue:"0", + }, }, { label: '原价', @@ -124,6 +200,48 @@ export const formSchema: FormSchema[] = [ label: '产品内容', field: 'content', component: 'Input', + }, + { + label: '跨境商品', + field: 'isCrossBorder', + component: 'JSwitch', + componentProps:{ + }, + }, + { + label: '套餐', + field: 'isMeal', + component: 'JSwitch', + componentProps:{ + }, + }, + { + label: '推荐', + field: 'homeRecommend', + component: 'JSwitch', + componentProps:{ + }, + }, + { + label: '检测类型', + field: 'subscribeType', + component: 'JDictSelectTag', + componentProps:{ + dictCode:"applett_subscribe_type" + }, + }, + { + label: '服务', + field: 'service', + component: 'Input', + }, + { + label: '合作医院', + field: 'hospitalId', + component: 'JCheckbox', + componentProps:{ + dictCode:"applet_hospital,name,id" + }, }, // TODO 主键隐藏字段,目前写死为ID { @@ -133,24 +251,118 @@ export const formSchema: FormSchema[] = [ show: false }, ]; +//子表单数据 +//子表表格配置 +export const appletProductSpecColumns: JVxeColumn[] = [ + { + title: '规格名称', + key: 'specName', + type: JVxeTypes.input, + width:"200px", + placeholder: '请输入${title}', + defaultValue:'', + }, + { + title: '排序', + key: 'sortOrder', + type: JVxeTypes.inputNumber, + width:"200px", + placeholder: '请输入${title}', + defaultValue:'', + }, + { + title: '价格', + key: 'price', + type: JVxeTypes.inputNumber, + width:"200px", + placeholder: '请输入${title}', + defaultValue:'', + }, + { + title: '图片', + key: 'image', + type: JVxeTypes.image, + token:true, + responseName:"message", + width:"200px", + placeholder: '请输入${title}', + defaultValue:'', + }, + { + title: '描述', + key: 'info', + type: JVxeTypes.input, + width:"200px", + placeholder: '请输入${title}', + defaultValue:'', + }, + ] +export const appletProductPackageColumns: JVxeColumn[] = [ + { + title: '图片', + key: 'image', + type: JVxeTypes.image, + token:true, + responseName:"message", + width:"200px", + placeholder: '请输入${title}', + defaultValue:'', + }, + { + title: '标题', + key: 'titile', + type: JVxeTypes.input, + width:"200px", + placeholder: '请输入${title}', + defaultValue:'', + }, + // { + // title: '产品', + // key: 'productId', + // type: JVxeTypes.input, + // width:"200px", + // placeholder: '请输入${title}', + // defaultValue:'', + // }, + ] // 高级查询数据 export const superQuerySchema = { name: {title: '产品名称',order: 0,view: 'text', type: 'string',}, - info: {title: '产品描述',order: 1,view: 'text', type: 'string',}, - type: {title: '类型',order: 2,view: 'list', type: 'string',dictCode: 'applet_product_type',}, - classId: {title: '分类',order: 3,view: 'list', type: 'string',dictTable: "applet_product_category", dictCode: 'id', dictText: 'name',}, - originalPrice: {title: '原价',order: 4,view: 'number', type: 'number',}, - currentPrice: {title: '现价',order: 5,view: 'number', type: 'number',}, - unit: {title: '单位',order: 6,view: 'text', type: 'string',}, - sold: {title: '已出售',order: 8,view: 'number', type: 'number',}, + enName: {title: '英文名称',order: 1,view: 'text', type: 'string',}, + image: {title: '图片',order: 2,view: 'image', type: 'string',}, + info: {title: '产品描述',order: 3,view: 'text', type: 'string',}, + type: {title: '类型',order: 4,view: 'radio', type: 'string',dictCode: 'applet_product_type',}, + classId: {title: '分类',order: 5,view: 'sel_tree', type: 'string',dict: 'applet_product_category,name,id', pidValue: '0',}, + originalPrice: {title: '原价',order: 6,view: 'number', type: 'number',}, + currentPrice: {title: '现价',order: 7,view: 'number', type: 'number',}, + unit: {title: '单位',order: 8,view: 'text', type: 'string',}, + sold: {title: '已出售',order: 10,view: 'number', type: 'number',}, + isCrossBorder: {title: '跨境商品',order: 12,view: 'switch', type: 'string',}, + isMeal: {title: '套餐',order: 13,view: 'switch', type: 'string',}, + homeRecommend: {title: '推荐',order: 14,view: 'switch', type: 'string',}, + subscribeType: {title: '检测类型',order: 15,view: 'list', type: 'string',dictCode: 'applett_subscribe_type',}, + service: {title: '服务',order: 16,view: 'text', type: 'string',}, + hospitalId: {title: '合作医院',order: 17,view: 'checkbox', type: 'string',dictTable: "applet_hospital", dictCode: 'id', dictText: 'name',}, + //子表高级查询 + appletProductSpec: { + title: '产品规格表', + view: 'table', + fields: { + specName: {title: '规格名称',order: 0,view: 'text', type: 'string',}, + sortOrder: {title: '排序',order: 1,view: 'number', type: 'number',}, + price: {title: '价格',order: 2,view: 'number', type: 'number',}, + image: {title: '图片',order: 3,view: 'image', type: 'string',}, + info: {title: '描述',order: 4,view: 'text', type: 'string',}, + } + }, + appletProductPackage: { + title: '产品套餐', + view: 'table', + fields: { + image: {title: '图片',order: 0,view: 'image', type: 'string',}, + titile: {title: '标题',order: 1,view: 'text', type: 'string',}, + productId: {title: '产品',order: 2,view: 'text', type: 'string',}, + } + }, }; - -/** -* 流程表单调用这个方法获取formSchema -* @param param -*/ -export function getBpmFormSchema(_formData): FormSchema[]{ - // 默认和原始表单保持一致 如果流程中配置了权限数据,这里需要单独处理formSchema - return formSchema; -} \ No newline at end of file diff --git a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/vue3/AppletProductList.vue b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/vue3/AppletProductList.vue index ad46702..62bdd69 100644 --- a/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/vue3/AppletProductList.vue +++ b/jeecg-boot/jeecg-boot-module/jeecgboot-boot-applet/src/main/java/org/jeecg/modules/demo/appletProduct/vue3/AppletProductList.vue @@ -4,10 +4,9 @@