diff --git a/null/download/0e2d25a8f9d149f3ab4c445324053c02_品牌管理数据.xlsx b/null/download/0e2d25a8f9d149f3ab4c445324053c02_品牌管理数据.xlsx new file mode 100644 index 000000000..4d1702cfd Binary files /dev/null and b/null/download/0e2d25a8f9d149f3ab4c445324053c02_品牌管理数据.xlsx differ diff --git a/null/download/1270f8e502594e65ad824f60a1143fec_订单发货记录数据.xlsx b/null/download/1270f8e502594e65ad824f60a1143fec_订单发货记录数据.xlsx new file mode 100644 index 000000000..327cfb2e3 Binary files /dev/null and b/null/download/1270f8e502594e65ad824f60a1143fec_订单发货记录数据.xlsx differ diff --git a/null/download/1bd4d07992404cfeb22b56531008c55c_订单操作历史记录数据.xlsx b/null/download/1bd4d07992404cfeb22b56531008c55c_订单操作历史记录数据.xlsx new file mode 100644 index 000000000..87b5fb932 Binary files /dev/null and b/null/download/1bd4d07992404cfeb22b56531008c55c_订单操作历史记录数据.xlsx differ diff --git a/null/download/58daf39a34a0464fbe04e2ce4ed6f64b_订单中所包含的商品数据.xlsx b/null/download/58daf39a34a0464fbe04e2ce4ed6f64b_订单中所包含的商品数据.xlsx new file mode 100644 index 000000000..0d4b4daa4 Binary files /dev/null and b/null/download/58daf39a34a0464fbe04e2ce4ed6f64b_订单中所包含的商品数据.xlsx differ diff --git a/null/download/65f1eb5e9b024c058352c617c95c4fc7_微信订单表数据.xlsx b/null/download/65f1eb5e9b024c058352c617c95c4fc7_微信订单表数据.xlsx new file mode 100644 index 000000000..d9fbf1a4a Binary files /dev/null and b/null/download/65f1eb5e9b024c058352c617c95c4fc7_微信订单表数据.xlsx differ diff --git a/null/download/6b5ae4bf0f974ac1b92e66c246a0dbce_订单售后数据.xlsx b/null/download/6b5ae4bf0f974ac1b92e66c246a0dbce_订单售后数据.xlsx new file mode 100644 index 000000000..5f6eb5138 Binary files /dev/null and b/null/download/6b5ae4bf0f974ac1b92e66c246a0dbce_订单售后数据.xlsx differ diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 0d10300ca..65774a12c 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -144,6 +144,19 @@ tenant: - ums_member_account - ums_member_logininfor - ums_member_cart + - oms_aftersale + - oms_aftersale_item + - oms_order + - oms_order_delivery_history + - oms_order_item + - oms_order_operate_history + - oms_wechat_payment_history + - pms_brand + - pms_product + - pms_product_category + - pms_product_snapshot + - pms_sku + - pms_sku_snapshot # MyBatisPlus配置 # https://baomidou.com/config/ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java index 23fa2cfe2..b08036f4c 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/MimeTypeUtils.java @@ -1,5 +1,7 @@ package org.dromara.common.core.utils.file; +import cn.hutool.core.util.StrUtil; + /** * 媒体类型工具类 * @@ -37,4 +39,29 @@ public class MimeTypeUtils { // pdf "pdf"}; + + public static String getExtension(String prefix) + { + switch (prefix) + { + case IMAGE_PNG: + return "png"; + case IMAGE_JPG: + return "jpg"; + case IMAGE_JPEG: + return "jpeg"; + case IMAGE_BMP: + return "bmp"; + case IMAGE_GIF: + return "gif"; + default: + return ""; + } + } + + public static boolean isImg(String contentType) { + String ext = MimeTypeUtils.getExtension(contentType); + return StrUtil.isNotEmpty(ext); + } + } diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseConverter.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseConverter.java index df51eec9e..cdca1d20b 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseConverter.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseConverter.java @@ -1,9 +1,6 @@ package org.dromara.common.web.core; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.mapstruct.MapperConfig; import java.util.List; @@ -19,6 +16,7 @@ public interface BaseConverter { /** * dto列表转vo + * * @param tList * @return */ diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/BrandController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/BrandController.java index 937cb93e0..d748f3d37 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/BrandController.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/BrandController.java @@ -1,21 +1,22 @@ package com.wzj.soopin.goods.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wzj.soopin.goods.convert.BrandConvert; +import com.wzj.soopin.goods.domain.bo.BrandBo; import com.wzj.soopin.goods.domain.entity.Brand; import com.wzj.soopin.goods.domain.query.BrandQuery; import com.wzj.soopin.goods.domain.vo.BrandVO; -import com.wzj.soopin.goods.service.BrandService; +import com.wzj.soopin.goods.service.impl.BrandServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.dromara.common.core.domain.R; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.web.core.BaseController; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -31,55 +32,51 @@ import java.util.List; @RequestMapping("/pms/brand") public class BrandController extends BaseController { @Autowired - private BrandService service; + private BrandServiceImpl service; @Autowired private BrandConvert convert; -// @ApiOperation("查询品牌管理列表") -// @PostMapping("/list") -// public ResponseEntity> list(@RequestBody BrandQuery query, Pageable page) { -// List list = service.selectList(query, page); -// return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); -// } + @ApiOperation("所有品牌管理列表") - @PostMapping("/all") - public ResponseEntity> all(@RequestBody BrandQuery query) { - return ResponseEntity.ok(service.selectList(query, null)); + @PostMapping("list") + public R> list(@RequestBody BrandBo query, Page page) { + Page brandPage = service.page(page,query.toWrapper()); + return R.ok(convert.toVO(brandPage)); } @ApiOperation("导出品牌管理列表") @Log(title = "品牌管理", businessType = BusinessType.EXPORT) - @GetMapping("/export") - public ResponseEntity export(BrandQuery query) { - List list = service.selectList(query, null); - ExcelUtil util = new ExcelUtil(BrandVO.class); - return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "品牌管理数据")); + @GetMapping("export") + public ResponseEntity export(BrandBo query) { + List list = service.list(query.toWrapper()); + ExcelUtil util = new ExcelUtil<>(BrandVO.class); + return ResponseEntity.ok(util.writeExcel(convert.toVO(list), "品牌管理数据")); } @ApiOperation("获取品牌管理详细信息") @GetMapping(value = "/{id}") - public ResponseEntity getInfo(@PathVariable("id") Long id) { - return ResponseEntity.ok(service.selectById(id)); + public R getInfo(@PathVariable("id") Long id) { + return R.ok(service.getById(id)); } @ApiOperation("新增品牌管理") @Log(title = "品牌管理", businessType = BusinessType.INSERT) - @PostMapping - public ResponseEntity add(@RequestBody Brand brand) { - return ResponseEntity.ok(service.insert(brand)); + @PostMapping("/add") + public R add(@RequestBody Brand brand) { + return R.ok(service.save(brand)); } @ApiOperation("修改品牌管理") @Log(title = "品牌管理", businessType = BusinessType.UPDATE) - @PutMapping - public ResponseEntity edit(@RequestBody Brand brand) { - return ResponseEntity.ok(service.update(brand)); + @PostMapping("/update") + public R edit(@RequestBody Brand brand) { + return R.ok(service.updateById(brand)); } @ApiOperation("删除品牌管理") @Log(title = "品牌管理", businessType = BusinessType.DELETE) @DeleteMapping("/{id}") - public ResponseEntity remove(@PathVariable Long id) { - return ResponseEntity.ok(service.deleteById(id)); + public R remove(@PathVariable Long id) { + return R.ok(service.removeById(id)); } } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductCategoryController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductCategoryController.java index 0bc751ab1..8f3c15673 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductCategoryController.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductCategoryController.java @@ -1,12 +1,18 @@ package com.wzj.soopin.goods.controller; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wzj.soopin.goods.convert.ProductCategoryConvert; +import com.wzj.soopin.goods.domain.bo.BrandBo; +import com.wzj.soopin.goods.domain.bo.ProductCategoryBo; +import com.wzj.soopin.goods.domain.entity.Brand; import com.wzj.soopin.goods.domain.entity.ProductCategory; import com.wzj.soopin.goods.domain.query.ProductCategoryQuery; +import com.wzj.soopin.goods.domain.vo.BrandVO; import com.wzj.soopin.goods.domain.vo.ProductCategoryVO; -import com.wzj.soopin.goods.service.ProductCategoryService; +import com.wzj.soopin.goods.service.impl.ProductCategoryServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.dromara.common.core.domain.R; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.web.core.BaseController; @@ -27,41 +33,41 @@ import java.util.List; @RequestMapping("/pms/productCategory") public class ProductCategoryController extends BaseController { @Autowired - private ProductCategoryService service; + private ProductCategoryServiceImpl service; @Autowired private ProductCategoryConvert convert; @ApiOperation("查询商品分类列表") - @PostMapping("/list") - public ResponseEntity> list(@RequestBody ProductCategoryQuery query) { - List list = service.selectList(query, null); - return ResponseEntity.ok(list); + @PostMapping("list") + public R> list(@RequestBody ProductCategoryBo query, Page page) { + Page productCategoryPage = service.page(page,query.toWrapper()); + return R.ok(convert.toVO(productCategoryPage)); } @ApiOperation("获取商品分类详细信息") @GetMapping(value = "/{id}") - public ResponseEntity getInfo(@PathVariable("id") Long id) { - return ResponseEntity.ok(service.selectById(id)); + public R getInfo(@PathVariable("id") Long id) { + return R.ok(service.getById(id)); } @ApiOperation("新增商品分类") @Log(title = "商品分类", businessType = BusinessType.INSERT) - @PostMapping - public ResponseEntity add(@RequestBody ProductCategory productCategory) { - return ResponseEntity.ok(service.insert(productCategory)); + @PostMapping("/add") + public R add(@RequestBody ProductCategory productCategory) { + return R.ok(service.save(productCategory)); } @ApiOperation("修改商品分类") @Log(title = "商品分类", businessType = BusinessType.UPDATE) - @PutMapping - public ResponseEntity edit(@RequestBody ProductCategory productCategory) { - return ResponseEntity.ok(service.update(productCategory)); + @PostMapping("/update") + public R edit(@RequestBody ProductCategory productCategory) { + return R.ok(service.updateById(productCategory)); } @ApiOperation("删除商品分类") @Log(title = "商品分类", businessType = BusinessType.DELETE) @DeleteMapping("/{id}") - public ResponseEntity remove(@PathVariable Long id) { - return ResponseEntity.ok(service.deleteById(id)); + public R remove(@PathVariable Long id) { + return R.ok(service.removeById(id)); } } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductController.java index fb630c7ee..20c17707a 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductController.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/ProductController.java @@ -1,21 +1,27 @@ package com.wzj.soopin.goods.controller; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wzj.soopin.goods.convert.ProductConvert; +import com.wzj.soopin.goods.domain.bo.BrandBo; +import com.wzj.soopin.goods.domain.bo.ProductBo; +import com.wzj.soopin.goods.domain.bo.ProductCategoryBo; +import com.wzj.soopin.goods.domain.entity.Brand; import com.wzj.soopin.goods.domain.entity.Product; +import com.wzj.soopin.goods.domain.entity.ProductCategory; import com.wzj.soopin.goods.domain.query.ProductQuery; +import com.wzj.soopin.goods.domain.vo.BrandVO; +import com.wzj.soopin.goods.domain.vo.ProductCategoryVO; import com.wzj.soopin.goods.domain.vo.ProductVO; -import com.wzj.soopin.goods.service.ProductService; +import com.wzj.soopin.goods.service.impl.ProductServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.dromara.common.core.domain.R; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.web.core.BaseController; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -31,50 +37,52 @@ import java.util.List; @RequestMapping("/pms/product") public class ProductController extends BaseController { @Autowired - private ProductService service; + private ProductServiceImpl service; @Autowired private ProductConvert convert; -// @ApiOperation("查询商品信息列表") -// @PostMapping("/list") -// public ResponseEntity> list(@RequestBody ProductQuery query, Pageable page) { -// List list = service.selectList(query, page); -// return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); -// } + @ApiOperation("查询商品信息列表") + @PostMapping("list") + public R> list(@RequestBody ProductBo query, Page page) { + Page productPage = service.page(page,query.toWrapper()); + return R.ok(convert.toVO(productPage)); + } + @ApiOperation("导出商品信息列表") @Log(title = "商品信息", businessType = BusinessType.EXPORT) - @GetMapping("/export") - public ResponseEntity export(ProductQuery query) { - List list = service.selectList(query, null); - ExcelUtil util = new ExcelUtil(ProductVO.class); - return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "商品信息数据")); + @GetMapping("export") + public ResponseEntity export(ProductBo query) { + List list = service.list(query.toWrapper()); + ExcelUtil util = new ExcelUtil<>(ProductVO.class); + return ResponseEntity.ok(util.writeExcel(convert.toVO(list), "商品信息数据")); } + @ApiOperation("获取商品信息详细信息") @GetMapping(value = "/{id}") - public ResponseEntity getInfo(@PathVariable("id") Long id) { - return ResponseEntity.ok(service.selectById(id)); + public R getInfo(@PathVariable("id") Long id) { + return R.ok(service.getById(id)); } @ApiOperation("新增商品信息") @Log(title = "商品信息", businessType = BusinessType.INSERT) - @PostMapping - public ResponseEntity add(@RequestBody ProductVO product) { - return ResponseEntity.ok(service.insert(product)); + @PostMapping("/add") + public R add(@RequestBody Product product) { + return R.ok(service.save(product)); } @ApiOperation("修改商品信息") @Log(title = "商品信息", businessType = BusinessType.UPDATE) - @PutMapping - public ResponseEntity edit(@RequestBody ProductVO product) { - return ResponseEntity.ok(service.update(product)); + @PostMapping("/update") + public R edit(@RequestBody Product product) { + return R.ok(service.updateById(product)); } @ApiOperation("删除商品信息") @Log(title = "商品信息", businessType = BusinessType.DELETE) @DeleteMapping("/{id}") - public ResponseEntity remove(@PathVariable Long id) { - return ResponseEntity.ok(service.deleteById(id)); + public R remove(@PathVariable Long id) { + return R.ok(service.removeById(id)); } } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/SkuController.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/SkuController.java index 79d6d3593..cb1b794f8 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/SkuController.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/controller/SkuController.java @@ -1,20 +1,23 @@ package com.wzj.soopin.goods.controller; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wzj.soopin.goods.convert.SkuConvert; +import com.wzj.soopin.goods.domain.bo.ProductBo; +import com.wzj.soopin.goods.domain.bo.SkuBo; +import com.wzj.soopin.goods.domain.entity.Product; import com.wzj.soopin.goods.domain.entity.Sku; import com.wzj.soopin.goods.domain.query.SkuQuery; +import com.wzj.soopin.goods.domain.vo.ProductVO; import com.wzj.soopin.goods.domain.vo.SkuVO; -import com.wzj.soopin.goods.service.SkuService; +import com.wzj.soopin.goods.service.impl.SkuServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.dromara.common.core.domain.R; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.web.core.BaseController; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -30,50 +33,52 @@ import java.util.List; @RequestMapping("/pms/sku") public class SkuController extends BaseController { @Autowired - private SkuService service; + private SkuServiceImpl service; @Autowired private SkuConvert convert; -// @ApiOperation("查询sku信息列表") -// @PostMapping("/list") -// public ResponseEntity> list(@RequestBody SkuQuery query, Pageable page) { -// List list = service.selectList(query, page); -// return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); -// } + + @ApiOperation("查询商品信息列表") + @PostMapping("list") + public R> list(@RequestBody SkuBo query, Page page) { + Page skuPage = service.page(page,query.toWrapper()); + return R.ok(convert.toVO(skuPage)); + } + @ApiOperation("导出sku信息列表") @Log(title = "sku信息", businessType = BusinessType.EXPORT) - @GetMapping("/export") - public ResponseEntity export(SkuQuery query) { - List list = service.selectList(query, null); + @GetMapping("export") + public ResponseEntity export(SkuBo query) { + List list = service.list(query.toWrapper()); ExcelUtil util = new ExcelUtil<>(SkuVO.class); - return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "sku信息数据")); + return ResponseEntity.ok(util.writeExcel(convert.toVO(list), "sku信息数据")); } @ApiOperation("获取sku信息详细信息") @GetMapping(value = "/{id}") - public ResponseEntity getInfo(@PathVariable("id") Long id) { - return ResponseEntity.ok(service.selectById(id)); + public R getInfo(@PathVariable("id") Long id) { + return R.ok(service.getById(id)); } @ApiOperation("新增sku信息") @Log(title = "sku信息", businessType = BusinessType.INSERT) - @PostMapping - public ResponseEntity add(@RequestBody Sku sku) { - return ResponseEntity.ok(service.insert(sku)); + @PostMapping("/add") + public R add(@RequestBody Sku sku) { + return R.ok(service.save(sku)); } @ApiOperation("修改sku信息") @Log(title = "sku信息", businessType = BusinessType.UPDATE) - @PutMapping - public ResponseEntity edit(@RequestBody Sku sku) { - return ResponseEntity.ok(service.update(sku)); + @PostMapping("/update") + public R edit(@RequestBody Sku sku) { + return R.ok(service.updateById(sku)); } @ApiOperation("删除sku信息") @Log(title = "sku信息", businessType = BusinessType.DELETE) @DeleteMapping("/{id}") - public ResponseEntity remove(@PathVariable Long id) { - return ResponseEntity.ok(service.deleteById(id)); + public R remove(@PathVariable Long id) { + return R.ok(service.removeById(id)); } } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/BrandConvert.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/BrandConvert.java index 006105b9f..a690bd6d1 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/BrandConvert.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/BrandConvert.java @@ -1,7 +1,9 @@ package com.wzj.soopin.goods.convert; +import com.wzj.soopin.goods.domain.bo.BrandBo; import com.wzj.soopin.goods.domain.entity.Brand; import com.wzj.soopin.goods.domain.vo.BrandVO; +import org.dromara.common.web.core.BaseConverter; import org.mapstruct.Mapper; import java.util.List; @@ -11,7 +13,7 @@ import java.util.List; * @author zcc */ @Mapper(componentModel = "spring") -public interface BrandConvert { +public interface BrandConvert extends BaseConverter { - List dos2vos(List list); +// List dos2vos(List list); } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductCategoryConvert.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductCategoryConvert.java index 83b17907d..12ee36da8 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductCategoryConvert.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductCategoryConvert.java @@ -1,8 +1,10 @@ package com.wzj.soopin.goods.convert; +import com.wzj.soopin.goods.domain.bo.ProductCategoryBo; import com.wzj.soopin.goods.domain.dto.CategoryDTO; import com.wzj.soopin.goods.domain.entity.ProductCategory; import com.wzj.soopin.goods.domain.vo.ProductCategoryVO; +import org.dromara.common.web.core.BaseConverter; import org.mapstruct.Mapper; import java.util.List; @@ -12,9 +14,9 @@ import java.util.List; * @author zcc */ @Mapper(componentModel = "spring") -public interface ProductCategoryConvert { +public interface ProductCategoryConvert extends BaseConverter { - List dos2vos(List list); - - CategoryDTO do2dto(ProductCategory it); +// List dos2vos(List list); +// +// CategoryDTO do2dto(ProductCategory it); } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductConvert.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductConvert.java index 58557c1ad..838c2ab95 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductConvert.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/ProductConvert.java @@ -1,10 +1,12 @@ package com.wzj.soopin.goods.convert; +import com.wzj.soopin.goods.domain.bo.ProductBo; import com.wzj.soopin.goods.domain.entity.Product; import com.wzj.soopin.goods.domain.vo.H5ProductVO; import com.wzj.soopin.goods.domain.vo.ProductVO; import org.apache.poi.ss.formula.functions.T; +import org.dromara.common.web.core.BaseConverter; import org.mapstruct.Mapper; import java.util.List; @@ -14,11 +16,11 @@ import java.util.List; * @author zcc */ @Mapper(componentModel = "spring") -public interface ProductConvert { +public interface ProductConvert extends BaseConverter { - List dos2vos(List list); - Product vo2do(ProductVO productVO); - ProductVO do2vo(Product product); - - List dos2dtos(List products); +// List dos2vos(List list); +// Product vo2do(ProductVO productVO); +// ProductVO do2vo(Product product); +// +// List dos2dtos(List products); } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/SkuConvert.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/SkuConvert.java index 6ab291bed..dc06a01bf 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/SkuConvert.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/convert/SkuConvert.java @@ -1,7 +1,9 @@ package com.wzj.soopin.goods.convert; +import com.wzj.soopin.goods.domain.bo.SkuBo; import com.wzj.soopin.goods.domain.entity.Sku; import com.wzj.soopin.goods.domain.vo.SkuVO; +import org.dromara.common.web.core.BaseConverter; import org.mapstruct.Mapper; import java.util.List; @@ -11,7 +13,7 @@ import java.util.List; * @author zcc */ @Mapper(componentModel = "spring") -public interface SkuConvert { +public interface SkuConvert extends BaseConverter { - List dos2vos(List list); +// List dos2vos(List list); } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/bo/BrandBo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/bo/BrandBo.java new file mode 100644 index 000000000..cfc274e6c --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/bo/BrandBo.java @@ -0,0 +1,48 @@ +package com.wzj.soopin.goods.domain.bo; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.goods.domain.entity.Brand; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(description="品牌管理 查询 对象") +public class BrandBo { + + @ApiModelProperty("NAME 精确匹配") + private String nameLike; + + @ApiModelProperty("SORT 精确匹配") + private Integer sort; + + @ApiModelProperty("SHOW_STATUS 精确匹配") + private Integer showStatus; + + @ApiModelProperty("品牌logo 精确匹配") + private String logo; + + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + + if (nameLike != null && !nameLike.isEmpty()) { + queryWrapper.like(Brand::getName, nameLike); + } + + // 精确匹配字段 + if (sort != null) { + queryWrapper.eq(Brand::getSort, sort); + } + if (showStatus != null) { + queryWrapper.eq(Brand::getShowStatus, showStatus); + } + if (logo != null && !logo.isEmpty()) { + queryWrapper.eq(Brand::getLogo, logo); + } + + return queryWrapper; + } +} + diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/bo/ProductBo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/bo/ProductBo.java new file mode 100644 index 000000000..5226eec4f --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/bo/ProductBo.java @@ -0,0 +1,148 @@ +package com.wzj.soopin.goods.domain.bo; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.wzj.soopin.goods.domain.entity.Product; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@ApiModel(description = "商品信息 查询 对象") +public class ProductBo { + + @ApiModelProperty("BRAND_ID 精确匹配") + private Long brandId; + + @ApiModelProperty("CATEGORY_ID 精确匹配") + private Long categoryId; + + @ApiModelProperty("商品编码 精确匹配") + private String outProductId; + + @ApiModelProperty("NAME 模糊匹配") + private String nameLike; + + @ApiModelProperty("主图 精确匹配") + private String pic; + + @ApiModelProperty("画册图片,连产品图片限制为5张,以逗号分割 精确匹配") + private String albumPics; + + @ApiModelProperty("上架状态:0->下架;1->上架 精确匹配") + private Integer publishStatus; + + @ApiModelProperty("排序 精确匹配") + private Integer sort; + + @ApiModelProperty("PRICE 精确匹配") + private BigDecimal price; + + @ApiModelProperty("单位 精确匹配") + private String unit; + + @ApiModelProperty(name = "商品销售属性,json格式") + private String productAttr; + + @ApiModelProperty("商品重量,默认为克 精确匹配") + private BigDecimal weight; + + @ApiModelProperty("产品详情网页内容 精确匹配") + private String detailHtml; + + @ApiModelProperty("移动端网页详情 精确匹配") + private String detailMobileHtml; + + @ApiModelProperty("品牌名称 模糊匹配") + private String brandNameLike; + + @ApiModelProperty("商品分类名称 模糊匹配") + private String productCategoryNameLike; + + @ApiModelProperty("排序字段") + private String orderField = "sort"; + + @ApiModelProperty("排序规则") + private String orderSort = "desc"; + + @ApiModelProperty("搜索关键字") + private String search; + + // 排查的id + private List excludeProductIds; + + private List ids; + + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 精确匹配字段 + if (brandId != null) { + queryWrapper.eq(Product::getBrandId, brandId); + } + if (categoryId != null) { + queryWrapper.eq(Product::getCategoryId, categoryId); + } + if (outProductId != null && !outProductId.isEmpty()) { + queryWrapper.eq(Product::getOutProductId, outProductId); + } + if (pic != null && !pic.isEmpty()) { + queryWrapper.eq(Product::getPic, pic); + } + if (albumPics != null && !albumPics.isEmpty()) { + queryWrapper.eq(Product::getAlbumPics, albumPics); + } + if (publishStatus != null) { + queryWrapper.eq(Product::getPublishStatus, publishStatus); + } + if (sort != null) { + queryWrapper.eq(Product::getSort, sort); + } + if (price != null) { + queryWrapper.eq(Product::getPrice, price); + } + if (unit != null && !unit.isEmpty()) { + queryWrapper.eq(Product::getUnit, unit); + } + if (productAttr != null && !productAttr.isEmpty()) { + queryWrapper.eq(Product::getProductAttr, productAttr); + } + if (weight != null) { + queryWrapper.eq(Product::getWeight, weight); + } + if (detailHtml != null && !detailHtml.isEmpty()) { + queryWrapper.eq(Product::getDetailHtml, detailHtml); + } + if (detailMobileHtml != null && !detailMobileHtml.isEmpty()) { + queryWrapper.eq(Product::getDetailMobileHtml, detailMobileHtml); + } + + // 模糊匹配字段 + if (nameLike != null && !nameLike.isEmpty()) { + queryWrapper.like(Product::getName, nameLike); + } + if (brandNameLike != null && !brandNameLike.isEmpty()) { + queryWrapper.like(Product::getBrandName, brandNameLike); + } + if (productCategoryNameLike != null && !productCategoryNameLike.isEmpty()) { + queryWrapper.like(Product::getProductCategoryName, productCategoryNameLike); + } + + // 排除ID列表 + if (excludeProductIds != null && !excludeProductIds.isEmpty()) { + queryWrapper.notIn(Product::getId, excludeProductIds); + } + + // 指定ID列表 + if (ids != null && !ids.isEmpty()) { + queryWrapper.in(Product::getId, ids); + } + + return queryWrapper; + } + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/bo/ProductCategoryBo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/bo/ProductCategoryBo.java new file mode 100644 index 000000000..a1fa7dc0f --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/bo/ProductCategoryBo.java @@ -0,0 +1,66 @@ +package com.wzj.soopin.goods.domain.bo; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.goods.domain.entity.ProductCategory; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@ApiModel(description="商品分类 查询 对象") +public class ProductCategoryBo { + + @ApiModelProperty("上级分类的编号:0表示一级分类 精确匹配") + private Long parentId; + + @ApiModelProperty("NAME 精确匹配") + private String nameLike; + + @ApiModelProperty("分类级别:0->1级;1->2级 精确匹配") + private Integer level; + + @ApiModelProperty("显示状态:0->不显示;1->显示 精确匹配") + private Integer showStatus; + + @ApiModelProperty("SORT 精确匹配") + private Integer sort; + + @ApiModelProperty("图标 精确匹配") + private String icon; + + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 精确匹配字段 + if (parentId != null) { + queryWrapper.eq(ProductCategory::getParentId, parentId); + } + if (level != null) { + queryWrapper.eq(ProductCategory::getLevel, level); + } + if (showStatus != null) { + queryWrapper.eq(ProductCategory::getShowStatus, showStatus); + } + if (sort != null) { + queryWrapper.eq(ProductCategory::getSort, sort); + } + if (icon != null && !icon.isEmpty()) { + queryWrapper.eq(ProductCategory::getIcon, icon); + } + + // 模糊匹配字段 + if (nameLike != null && !nameLike.isEmpty()) { + queryWrapper.like(ProductCategory::getName, nameLike); + } + + return queryWrapper; + } + + + + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/bo/SkuBo.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/bo/SkuBo.java new file mode 100644 index 000000000..1a2d9388b --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/domain/bo/SkuBo.java @@ -0,0 +1,54 @@ +package com.wzj.soopin.goods.domain.bo; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.goods.domain.entity.Sku; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel(description="sku信息 查询 对象") +public class SkuBo { + + @ApiModelProperty("PRODUCT_ID 精确匹配") + private Long productId; + + @ApiModelProperty("sku编码 精确匹配") + private String outSkuId; + + @ApiModelProperty("PRICE 精确匹配") + private BigDecimal price; + + @ApiModelProperty("展示图片 精确匹配") + private String pic; + + @ApiModelProperty("商品销售属性,json格式 精确匹配") + private String spData; + + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 精确匹配字段 + if (productId != null) { + queryWrapper.eq(Sku::getProductId, productId); + } + if (outSkuId != null && !outSkuId.isEmpty()) { + queryWrapper.eq(Sku::getOutSkuId, outSkuId); + } + if (price != null) { + queryWrapper.eq(Sku::getPrice, price); + } + if (pic != null && !pic.isEmpty()) { + queryWrapper.eq(Sku::getPic, pic); + } + if (spData != null && !spData.isEmpty()) { + queryWrapper.eq(Sku::getSpData, spData); + } + + return queryWrapper; + } + +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/BrandService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/BrandService.java index 5617ffc45..aea8951b4 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/BrandService.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/BrandService.java @@ -1,99 +1,7 @@ package com.wzj.soopin.goods.service; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; - +import com.baomidou.mybatisplus.extension.service.IService; import com.wzj.soopin.goods.domain.entity.Brand; -import com.wzj.soopin.goods.domain.query.BrandQuery; -import com.wzj.soopin.goods.mapper.BrandMapper; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 品牌管理Service业务层处理 - * - * - * @author zcc - */ -@Service -public class BrandService { - @Autowired - private BrandMapper brandMapper; - - /** - * 查询品牌管理 - * - * @param id 品牌管理主键 - * @return 品牌管理 - */ - public Brand selectById(Long id) { - return brandMapper.selectById(id); - } - - /** - * 查询品牌管理列表 - * - * @param query 查询条件 - * @param page 分页条件 - * @return 品牌管理 - */ - public List selectList(BrandQuery query, Pageable page) { -// if (page != null) { -// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); -// } - QueryWrapper qw = new QueryWrapper<>(); - String nameLike = query.getNameLike(); - if (!StringUtils.isEmpty(nameLike)) { - qw.like("name", nameLike); - } - Integer sort = query.getSort(); - if (sort != null) { - qw.eq("sort", sort); - } - Integer showStatus = query.getShowStatus(); - if (showStatus != null) { - qw.eq("show_status", showStatus); - } - String logo = query.getLogo(); - if (!StringUtils.isEmpty(logo)) { - qw.eq("logo", logo); - } - qw.orderByAsc("sort"); - return brandMapper.selectList(qw); - } - - /** - * 新增品牌管理 - * - * @param brand 品牌管理 - * @return 结果 - */ - public int insert(Brand brand) { - brand.setCreateTime(LocalDateTime.now()); - return brandMapper.insert(brand); - } - - /** - * 修改品牌管理 - * - * @param brand 品牌管理 - * @return 结果 - */ - public int update(Brand brand) { - return brandMapper.updateById(brand); - } - - /** - * 删除品牌管理信息 - * - * @param id 品牌管理主键 - * @return 结果 - */ - public int deleteById(Long id) { - return brandMapper.deleteById(id); - } +public interface BrandService extends IService { } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductCategoryService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductCategoryService.java index 0de03af2d..ee3e7cd58 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductCategoryService.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductCategoryService.java @@ -1,245 +1,7 @@ package com.wzj.soopin.goods.service; -import cn.hutool.core.collection.CollUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.metadata.OrderItem; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.wzj.soopin.goods.convert.ProductCategoryConvert; -import com.wzj.soopin.goods.convert.ProductConvert; -import com.wzj.soopin.goods.domain.dto.CategoryDTO; -import com.wzj.soopin.goods.domain.entity.Product; +import com.baomidou.mybatisplus.extension.service.IService; import com.wzj.soopin.goods.domain.entity.ProductCategory; -import com.wzj.soopin.goods.domain.query.ProductCategoryQuery; -import com.wzj.soopin.goods.domain.vo.ProductCategoryVO; -import com.wzj.soopin.goods.mapper.ProductCategoryMapper; -import com.wzj.soopin.goods.mapper.ProductMapper; -import org.apache.commons.lang3.StringUtils; -import org.dromara.common.core.exception.base.BaseException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 商品分类Service业务层处理 - * - * @author zcc - */ -@Service -public class ProductCategoryService { - @Autowired - private ProductCategoryMapper productCategoryMapper; - @Autowired - private ProductMapper productMapper; - @Autowired - private ProductCategoryConvert convert; - @Autowired - private ProductConvert productConvert; - - /** - * 查询商品分类 - * - * @param id 商品分类主键 - * @return 商品分类 - */ - public ProductCategory selectById(Long id) { - return productCategoryMapper.selectById(id); - } - - /** - * 查询商品分类列表 - * - * @param query 查询条件 - * @param page 分页条件 - * @return 商品分类 - */ - public List selectList(ProductCategoryQuery query, Pageable page) { -// if (page != null) { -// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); -// } - QueryWrapper qw = new QueryWrapper<>(); - Long parentId = query.getParentId(); - if (parentId != null) { - qw.eq("parent_id", parentId); - } - String nameLike = query.getNameLike(); - if (!StringUtils.isEmpty(nameLike)) { - qw.like("name", nameLike); - } - Integer level = query.getLevel(); - if (level != null) { - qw.eq("level", level); - } - Integer showStatus = query.getShowStatus(); - if (showStatus != null) { - qw.eq("show_status", showStatus); - } - Integer sort = query.getSort(); - if (sort != null) { - qw.eq("sort", sort); - } - String icon = query.getIcon(); - if (!StringUtils.isEmpty(icon)) { - qw.eq("icon", icon); - } - qw.orderByAsc("sort"); - - List productCategories = productCategoryMapper.selectList(qw); - List productCategoryVOS = convert.dos2vos(productCategories); - return formatTree(productCategoryVOS); - - } - - private List formatTree(List nodes) { - List tree = new ArrayList<>(); - List children = new ArrayList<>(); - // 1)先获取到所有根节点 - for (ProductCategoryVO node : nodes) { - if (node.getParentId() == null || node.getParentId() == 0) { - tree.add(node); - } else { - children.add(node); - } - } - // 2)把所有除根结点外的节点作为子节点,然后遍历每一个根节点 - for (ProductCategoryVO node : tree) { - // 3)递归构建此根的子节点 - recur(node, children); - } - return tree; - } - - private void recur(ProductCategoryVO rootNode, List children) { - // 1)遍历剩余子节点,找出当前根的子节点 - for (ProductCategoryVO node : children) { - // 2)如果子节点的父id等于根节点的id,那么就将这个节点加到根节点的children列表中 - if (rootNode.getId() == node.getParentId()) { - if (rootNode.getChildren() == null) { - rootNode.setChildren(new ArrayList<>()); - } - rootNode.getChildren().add(node); - // 3)以当前节点作为根节点进行递归,检查是否还有子节点。 - recur(node, children); - } - } - } - - - /** - * 新增商品分类 - * - * @param productCategory 商品分类 - * @return 结果 - */ - public int insert(ProductCategory productCategory) { - productCategory.setCreateTime(LocalDateTime.now()); - return productCategoryMapper.insert(productCategory); - } - - /** - * 修改商品分类 - * - * @param productCategory 商品分类 - * @return 结果 - */ - public int update(ProductCategory productCategory) { - return productCategoryMapper.updateById(productCategory); - } - - /** - * 删除商品分类信息 - * - * @param id 商品分类主键 - * @return 结果 - */ - public int deleteById(Long id) { - return productCategoryMapper.deleteById(id); - } - - public List queryCategoryWithProductsForH5() { - QueryWrapper qw1 = new QueryWrapper<>(); -// qw1.eq("level", 0); - qw1.eq("show_status", 1); - Page pageReq = new Page<>(); - pageReq.setCurrent(1L) - .setSize(10) - .setOrders(Collections.singletonList(OrderItem.desc("sort"))); - List categories = productCategoryMapper.selectPage(pageReq, qw1).getRecords(); - if (CollUtil.isEmpty(categories)) { - return Collections.emptyList(); - } - ; - return categories.stream().map(it -> { - CategoryDTO dto = convert.do2dto(it); - // 寻找该分类下的所有子类 - List allChildCate = queryAllChildCate(Collections.singletonList(it.getId()), 0); - QueryWrapper qw = new QueryWrapper<>(); - qw.select("id", "pic", "name", "price", "category_id"); - qw.in("category_id", allChildCate); - qw.le("sort", 100); - List categoryId2List = productMapper.selectList(qw); - dto.setProductList(productConvert.dos2dtos(categoryId2List)); - return dto; - }).collect(Collectors.toList()); - } - - private List queryAllChildCate(List categoryIds, int level) { - List res = new ArrayList<>(); - QueryWrapper qw = new QueryWrapper<>(); - qw.select("id"); - List ids = categoryIds; - while (true) { - qw.clear(); - qw.in("parent_id", ids); - qw.eq("level", level + 1); - qw.eq("show_status", 1); - ids = productCategoryMapper.selectList(qw).stream().map(ProductCategory::getId).collect(Collectors.toList()); - if (CollUtil.isEmpty(ids)) { - break; - } - res.addAll(ids); - level++; - } - res.addAll(categoryIds); - return res; - } - - public List h5Categories() { - QueryWrapper qw = new QueryWrapper<>(); - qw.select("id", "parent_id", "name", "level", "sort", "icon"); - qw.eq("show_status", 1); -// qw.le("level", 2); - return productCategoryMapper.selectList(qw); - } - - public List getBrotherAndChild(Long id, boolean withChild) { - ProductCategory category = productCategoryMapper.selectById(id); - if (category == null) { - throw new BaseException("参数错误"); - } - LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); - qw.eq(ProductCategory::getParentId, category.getParentId()); - qw.eq(ProductCategory::getLevel, category.getLevel()); - qw.eq(ProductCategory::getShowStatus, 1); - qw.select(ProductCategory::getId, ProductCategory::getParentId, ProductCategory::getName, ProductCategory::getLevel, ProductCategory::getSort, ProductCategory::getIcon); - List res = productCategoryMapper.selectList(qw); - if (withChild) { - qw.clear(); - qw.eq(ProductCategory::getParentId, category.getId()); - qw.eq(ProductCategory::getLevel, category.getLevel() + 1); - qw.eq(ProductCategory::getShowStatus, 1); - List childs = productCategoryMapper.selectList(qw); - res.addAll(childs); - } - if (category.getParentId() != null && category.getParentId() != -1) { - res.add(productCategoryMapper.selectById(category.getParentId())); - } - return res; - } +public interface ProductCategoryService extends IService { } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductService.java index 8c56e2d28..841d2d3f3 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductService.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/ProductService.java @@ -1,210 +1,7 @@ package com.wzj.soopin.goods.service; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.wzj.soopin.goods.convert.ProductConvert; +import com.baomidou.mybatisplus.extension.service.IService; import com.wzj.soopin.goods.domain.entity.Product; -import com.wzj.soopin.goods.domain.entity.Sku; -import com.wzj.soopin.goods.domain.query.ProductQuery; -import com.wzj.soopin.goods.domain.vo.ProductDetailVO; -import com.wzj.soopin.goods.domain.vo.ProductVO; -import com.wzj.soopin.goods.mapper.BrandMapper; -import com.wzj.soopin.goods.mapper.ProductMapper; -import com.wzj.soopin.goods.mapper.SkuMapper; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * 商品信息Service业务层处理 - * - * - * @author zcc - */ -@Service -@Slf4j -public class ProductService { - @Autowired - private ProductMapper productMapper; - - @Autowired - private SkuMapper skuMapper; - @Autowired - private BrandMapper brandMapper; - @Autowired - private ProductConvert convert; - - /** - * 查询商品信息 - * - * @param id 商品信息主键 - * @return 商品信息 - */ - public ProductVO selectById(Long id) { - Product product = productMapper.selectById(id); - ProductVO productVO = convert.do2vo(product); - QueryWrapper qw = new QueryWrapper<>(); - qw.eq("product_id", product.getId()); - List skus = skuMapper.selectList(qw); - productVO.setSkuList(skus); - return productVO; - } - - /** - * 查询商品信息列表 - * - * @param query 查询条件 - * @param page 分页条件 - * @return 商品信息 - */ - public List selectList(ProductQuery query, Pageable page) { -// if (page != null) { -// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); -// } - QueryWrapper qw = new QueryWrapper<>(); - if (StringUtils.isNoneEmpty(query.getOrderField())){ - if (StringUtils.isNotEmpty(query.getOrderSort()) && "desc".equalsIgnoreCase(query.getOrderSort())) { - qw.orderByDesc(query.getOrderField()); - } else { - qw.orderByAsc(query.getOrderField()); - } - }else { - qw.orderByDesc("publish_status"); - qw.orderByAsc("sort"); - } - Long categoryId = query.getCategoryId(); - if (categoryId != null) { - qw.eq("category_id", categoryId); - } - Integer publishStatus = query.getPublishStatus(); - if (publishStatus != null) { - qw.eq("publish_status", publishStatus); - } - String search = query.getSearch(); - if (StringUtils.isNoneEmpty(search)){ - qw.like("name", "%".concat(query.getSearch().trim()).concat("%")); - } - if (CollectionUtil.isNotEmpty(query.getExcludeProductIds())) { - qw.notIn("id",query.getExcludeProductIds()); - } - if (CollectionUtil.isNotEmpty(query.getIds())) { - qw.in("id",query.getIds()); - } - return productMapper.selectList(qw); - } - - /** - * 新增商品信息 - * - * @param productVO 商品信息 - * @return 结果 - */ - @Transactional - public int insert(ProductVO productVO) { - - Product product = convert.vo2do(productVO); - product.setCreateTime(LocalDateTime.now()); - List skuList = productVO.getSkuList(); - productMapper.insert(product); - if(skuList!=null){ - skuList.forEach(sku -> { - sku.setProductId(product.getId()); - sku.setCreateTime(LocalDateTime.now()); - skuMapper.insert(sku); - }); - } - return 1; - } - - /** - * 修改商品信息 - * - * @param productVO 商品信息 - * @return 结果 - */ - @Transactional - public int update(ProductVO productVO) { - Product dbProduct = productMapper.selectById(productVO.getId()); - List idList = productVO.getSkuList().stream().filter(it -> it.getId() != null).map(it -> it.getId()).collect(Collectors.toList()); - if (dbProduct == null) { - return 0; - } -// Long userId = SecurityUtils.getUserId(); - Product product = convert.vo2do(productVO); - List skuList = productVO.getSkuList(); -// product.setUpdateBy(userId); - product.setUpdateTime(LocalDateTime.now()); - productMapper.updateById(product); - //查找库中所有的sku - Map map = new HashMap<>(); - map.put("product_id", product.getId()); - Map skuMap = skuMapper.selectByMap(map).stream().collect(Collectors.toMap(it -> it.getId(), it -> it)); - //针对已有的进行编辑 - List updateList = productVO.getSkuList().stream().filter(it -> it.getId() != null).collect(Collectors.toList()); - if (!CollectionUtil.isEmpty(updateList)) { - log.info("共有{}个sku需要修改,{},productId:{}",updateList.size(), JSONUtil.toJsonStr(updateList),productVO.getId()); - updateList.forEach(it->{ - Sku sku = skuMap.get(it.getId()); -// sku.setUpdateBy(SecurityUtils.getUserId()); - sku.setUpdateTime(LocalDateTime.now()); - sku.setPrice(it.getPrice()); - sku.setSpData(it.getSpData()); - sku.setPic(it.getPic()); - sku.setOutSkuId(it.getOutSkuId()); - sku.setStock(it.getStock()); - skuMapper.updateById(sku); - }); - } - //针对没有的进行新增 - List addList = productVO.getSkuList().stream().filter(it -> it.getId() == null).collect(Collectors.toList()); - if (!CollectionUtil.isEmpty(addList)) { - log.info("共有{}个sku需要新增,{},productId:{}",addList.size(), JSONUtil.toJsonStr(addList),productVO.getId()); - addList.forEach(sku -> { - sku.setProductId(product.getId()); - sku.setCreateTime(LocalDateTime.now()); - skuMapper.insert(sku); - }); - } - //删除 - List deleteIds = skuMap.keySet().stream().filter(it -> !idList.contains(it)).collect(Collectors.toList()); - if (!CollectionUtil.isEmpty(deleteIds)) { - log.info("共有{}个sku需要删除,{},productId:{}",deleteIds.size(), JSONUtil.toJsonStr(deleteIds),productVO.getId()); - skuMapper.deleteBatchIds(deleteIds); - } - return 1; - } - - /** - * 删除商品信息信息 - * - * @param id 商品信息主键 - * @return 结果 - */ - public int deleteById(Long id) { - return productMapper.deleteById(id); - } - - public ProductDetailVO queryDetail(Long id) { - ProductDetailVO res = new ProductDetailVO(); - Product d = productMapper.selectById(id); - res.setProduct(d); - LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); - qw.eq(Sku::getProductId, id); - res.setSkus(skuMapper.selectList(qw)); - if (d.getBrandId() != null) { - res.setBrand(brandMapper.selectById(d.getBrandId())); - } - return res; - } +public interface ProductService extends IService { } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/SkuService.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/SkuService.java index 944022f07..c2e11259b 100644 --- a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/SkuService.java +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/SkuService.java @@ -1,102 +1,7 @@ package com.wzj.soopin.goods.service; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; import com.wzj.soopin.goods.domain.entity.Sku; -import com.wzj.soopin.goods.domain.query.SkuQuery; -import com.wzj.soopin.goods.mapper.SkuMapper; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; - -/** - * sku信息Service业务层处理 - * - * - * @author zcc - */ -@Service -public class SkuService { - @Autowired - private SkuMapper skuMapper; - - /** - * 查询sku信息 - * - * @param id sku信息主键 - * @return sku信息 - */ - public Sku selectById(Long id) { - return skuMapper.selectById(id); - } - - /** - * 查询sku信息列表 - * - * @param query 查询条件 - * @param page 分页条件 - * @return sku信息 - */ - public List selectList(SkuQuery query, Pageable page) { -// if (page != null) { -// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); -// } - QueryWrapper qw = new QueryWrapper<>(); - Long productId = query.getProductId(); - if (productId != null) { - qw.eq("product_id", productId); - } - String outSkuId = query.getOutSkuId(); - if (!StringUtils.isEmpty(outSkuId)) { - qw.eq("out_sku_id", outSkuId); - } - BigDecimal price = query.getPrice(); - if (price != null) { - qw.eq("price", price); - } - String pic = query.getPic(); - if (!StringUtils.isEmpty(pic)) { - qw.eq("pic", pic); - } - String spData = query.getSpData(); - if (!StringUtils.isEmpty(spData)) { - qw.eq("sp_data", spData); - } - return skuMapper.selectList(qw); - } - - /** - * 新增sku信息 - * - * @param sku sku信息 - * @return 结果 - */ - public int insert(Sku sku) { - sku.setCreateTime(LocalDateTime.now()); - return skuMapper.insert(sku); - } - - /** - * 修改sku信息 - * - * @param sku sku信息 - * @return 结果 - */ - public int update(Sku sku) { - return skuMapper.updateById(sku); - } - - /** - * 删除sku信息信息 - * - * @param id sku信息主键 - * @return 结果 - */ - public int deleteById(Long id) { - return skuMapper.deleteById(id); - } +public interface SkuService extends IService { } diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/BrandServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/BrandServiceImpl.java new file mode 100644 index 000000000..f70f45c30 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/BrandServiceImpl.java @@ -0,0 +1,101 @@ +package com.wzj.soopin.goods.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.goods.domain.entity.Brand; +import com.wzj.soopin.goods.domain.query.BrandQuery; +import com.wzj.soopin.goods.mapper.BrandMapper; +import com.wzj.soopin.goods.service.BrandService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 品牌管理Service业务层处理 + * + * + * @author zcc + */ +@Service +public class BrandServiceImpl extends ServiceImpl implements BrandService { + @Autowired + private BrandMapper brandMapper; + + /** + * 查询品牌管理 + * + * @param id 品牌管理主键 + * @return 品牌管理 + */ + public Brand selectById(Long id) { + return brandMapper.selectById(id); + } + + /** + * 查询品牌管理列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 品牌管理 + */ + public List selectList(BrandQuery query, Pageable page) { +// if (page != null) { +// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); +// } + QueryWrapper qw = new QueryWrapper<>(); + String nameLike = query.getNameLike(); + if (!StringUtils.isEmpty(nameLike)) { + qw.like("name", nameLike); + } + Integer sort = query.getSort(); + if (sort != null) { + qw.eq("sort", sort); + } + Integer showStatus = query.getShowStatus(); + if (showStatus != null) { + qw.eq("show_status", showStatus); + } + String logo = query.getLogo(); + if (!StringUtils.isEmpty(logo)) { + qw.eq("logo", logo); + } + qw.orderByAsc("sort"); + return brandMapper.selectList(qw); + } + + /** + * 新增品牌管理 + * + * @param brand 品牌管理 + * @return 结果 + */ + public int insert(Brand brand) { + brand.setCreateTime(LocalDateTime.now()); + return brandMapper.insert(brand); + } + + /** + * 修改品牌管理 + * + * @param brand 品牌管理 + * @return 结果 + */ + public int update(Brand brand) { + return brandMapper.updateById(brand); + } + + /** + * 删除品牌管理信息 + * + * @param id 品牌管理主键 + * @return 结果 + */ + public int deleteById(Long id) { + return brandMapper.deleteById(id); + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/ProductCategoryServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/ProductCategoryServiceImpl.java new file mode 100644 index 000000000..a919ac720 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/ProductCategoryServiceImpl.java @@ -0,0 +1,248 @@ +package com.wzj.soopin.goods.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.goods.convert.ProductCategoryConvert; +import com.wzj.soopin.goods.convert.ProductConvert; +import com.wzj.soopin.goods.domain.dto.CategoryDTO; +import com.wzj.soopin.goods.domain.entity.Product; +import com.wzj.soopin.goods.domain.entity.ProductCategory; +import com.wzj.soopin.goods.domain.query.ProductCategoryQuery; +import com.wzj.soopin.goods.domain.vo.ProductCategoryVO; +import com.wzj.soopin.goods.mapper.ProductCategoryMapper; +import com.wzj.soopin.goods.mapper.ProductMapper; +import com.wzj.soopin.goods.service.ProductCategoryService; +import com.wzj.soopin.goods.service.ProductService; +import org.apache.commons.lang3.StringUtils; +import org.dromara.common.core.exception.base.BaseException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 商品分类Service业务层处理 + * + * @author zcc + */ +@Service +public class ProductCategoryServiceImpl extends ServiceImpl implements ProductCategoryService { + @Autowired + private ProductCategoryMapper productCategoryMapper; + @Autowired + private ProductMapper productMapper; + @Autowired + private ProductCategoryConvert convert; + @Autowired + private ProductConvert productConvert; + + /** + * 查询商品分类 + * + * @param id 商品分类主键 + * @return 商品分类 + */ + public ProductCategory selectById(Long id) { + return productCategoryMapper.selectById(id); + } + + /** + * 查询商品分类列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 商品分类 + */ +// public List selectList(ProductCategoryQuery query, Pageable page) { +//// if (page != null) { +//// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); +//// } +// QueryWrapper qw = new QueryWrapper<>(); +// Long parentId = query.getParentId(); +// if (parentId != null) { +// qw.eq("parent_id", parentId); +// } +// String nameLike = query.getNameLike(); +// if (!StringUtils.isEmpty(nameLike)) { +// qw.like("name", nameLike); +// } +// Integer level = query.getLevel(); +// if (level != null) { +// qw.eq("level", level); +// } +// Integer showStatus = query.getShowStatus(); +// if (showStatus != null) { +// qw.eq("show_status", showStatus); +// } +// Integer sort = query.getSort(); +// if (sort != null) { +// qw.eq("sort", sort); +// } +// String icon = query.getIcon(); +// if (!StringUtils.isEmpty(icon)) { +// qw.eq("icon", icon); +// } +// qw.orderByAsc("sort"); +// +// List productCategories = productCategoryMapper.selectList(qw); +// List productCategoryVOS = convert.dos2vos(productCategories); +// return formatTree(productCategoryVOS); +// +// } + + private List formatTree(List nodes) { + List tree = new ArrayList<>(); + List children = new ArrayList<>(); + // 1)先获取到所有根节点 + for (ProductCategoryVO node : nodes) { + if (node.getParentId() == null || node.getParentId() == 0) { + tree.add(node); + } else { + children.add(node); + } + } + // 2)把所有除根结点外的节点作为子节点,然后遍历每一个根节点 + for (ProductCategoryVO node : tree) { + // 3)递归构建此根的子节点 + recur(node, children); + } + return tree; + } + + private void recur(ProductCategoryVO rootNode, List children) { + // 1)遍历剩余子节点,找出当前根的子节点 + for (ProductCategoryVO node : children) { + // 2)如果子节点的父id等于根节点的id,那么就将这个节点加到根节点的children列表中 + if (rootNode.getId() == node.getParentId()) { + if (rootNode.getChildren() == null) { + rootNode.setChildren(new ArrayList<>()); + } + rootNode.getChildren().add(node); + // 3)以当前节点作为根节点进行递归,检查是否还有子节点。 + recur(node, children); + } + } + } + + + /** + * 新增商品分类 + * + * @param productCategory 商品分类 + * @return 结果 + */ + public int insert(ProductCategory productCategory) { + productCategory.setCreateTime(LocalDateTime.now()); + return productCategoryMapper.insert(productCategory); + } + + /** + * 修改商品分类 + * + * @param productCategory 商品分类 + * @return 结果 + */ + public int update(ProductCategory productCategory) { + return productCategoryMapper.updateById(productCategory); + } + + /** + * 删除商品分类信息 + * + * @param id 商品分类主键 + * @return 结果 + */ + public int deleteById(Long id) { + return productCategoryMapper.deleteById(id); + } +// +// public List queryCategoryWithProductsForH5() { +// QueryWrapper qw1 = new QueryWrapper<>(); +//// qw1.eq("level", 0); +// qw1.eq("show_status", 1); +// Page pageReq = new Page<>(); +// pageReq.setCurrent(1L) +// .setSize(10) +// .setOrders(Collections.singletonList(OrderItem.desc("sort"))); +// List categories = productCategoryMapper.selectPage(pageReq, qw1).getRecords(); +// if (CollUtil.isEmpty(categories)) { +// return Collections.emptyList(); +// } +// ; +// return categories.stream().map(it -> { +// CategoryDTO dto = convert.do2dto(it); +// // 寻找该分类下的所有子类 +// List allChildCate = queryAllChildCate(Collections.singletonList(it.getId()), 0); +// QueryWrapper qw = new QueryWrapper<>(); +// qw.select("id", "pic", "name", "price", "category_id"); +// qw.in("category_id", allChildCate); +// qw.le("sort", 100); +// List categoryId2List = productMapper.selectList(qw); +// dto.setProductList(productConvert.dos2dtos(categoryId2List)); +// return dto; +// }).collect(Collectors.toList()); +// } + + private List queryAllChildCate(List categoryIds, int level) { + List res = new ArrayList<>(); + QueryWrapper qw = new QueryWrapper<>(); + qw.select("id"); + List ids = categoryIds; + while (true) { + qw.clear(); + qw.in("parent_id", ids); + qw.eq("level", level + 1); + qw.eq("show_status", 1); + ids = productCategoryMapper.selectList(qw).stream().map(ProductCategory::getId).collect(Collectors.toList()); + if (CollUtil.isEmpty(ids)) { + break; + } + res.addAll(ids); + level++; + } + res.addAll(categoryIds); + return res; + } + + public List h5Categories() { + QueryWrapper qw = new QueryWrapper<>(); + qw.select("id", "parent_id", "name", "level", "sort", "icon"); + qw.eq("show_status", 1); +// qw.le("level", 2); + return productCategoryMapper.selectList(qw); + } + + public List getBrotherAndChild(Long id, boolean withChild) { + ProductCategory category = productCategoryMapper.selectById(id); + if (category == null) { + throw new BaseException("参数错误"); + } + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(ProductCategory::getParentId, category.getParentId()); + qw.eq(ProductCategory::getLevel, category.getLevel()); + qw.eq(ProductCategory::getShowStatus, 1); + qw.select(ProductCategory::getId, ProductCategory::getParentId, ProductCategory::getName, ProductCategory::getLevel, ProductCategory::getSort, ProductCategory::getIcon); + List res = productCategoryMapper.selectList(qw); + if (withChild) { + qw.clear(); + qw.eq(ProductCategory::getParentId, category.getId()); + qw.eq(ProductCategory::getLevel, category.getLevel() + 1); + qw.eq(ProductCategory::getShowStatus, 1); + List childs = productCategoryMapper.selectList(qw); + res.addAll(childs); + } + if (category.getParentId() != null && category.getParentId() != -1) { + res.add(productCategoryMapper.selectById(category.getParentId())); + } + return res; + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/ProductServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/ProductServiceImpl.java new file mode 100644 index 000000000..2809075b8 --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/ProductServiceImpl.java @@ -0,0 +1,212 @@ +package com.wzj.soopin.goods.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.goods.convert.ProductConvert; +import com.wzj.soopin.goods.domain.entity.Product; +import com.wzj.soopin.goods.domain.entity.Sku; +import com.wzj.soopin.goods.domain.query.ProductQuery; +import com.wzj.soopin.goods.domain.vo.ProductDetailVO; +import com.wzj.soopin.goods.domain.vo.ProductVO; +import com.wzj.soopin.goods.mapper.BrandMapper; +import com.wzj.soopin.goods.mapper.ProductMapper; +import com.wzj.soopin.goods.mapper.SkuMapper; +import com.wzj.soopin.goods.service.ProductService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 商品信息Service业务层处理 + * + * + * @author zcc + */ +@Service +@Slf4j +public class ProductServiceImpl extends ServiceImpl implements ProductService { + @Autowired + private ProductMapper productMapper; + + @Autowired + private SkuMapper skuMapper; + @Autowired + private BrandMapper brandMapper; + @Autowired + private ProductConvert convert; + + /** + * 查询商品信息 + * + * @param id 商品信息主键 + * @return 商品信息 + */ +// public ProductVO selectById(Long id) { +// Product product = productMapper.selectById(id); +// ProductVO productVO = convert.do2vo(product); +// QueryWrapper qw = new QueryWrapper<>(); +// qw.eq("product_id", product.getId()); +// List skus = skuMapper.selectList(qw); +// productVO.setSkuList(skus); +// return productVO; +// } + + /** + * 查询商品信息列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 商品信息 + */ + public List selectList(ProductQuery query, Pageable page) { +// if (page != null) { +// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); +// } + QueryWrapper qw = new QueryWrapper<>(); + if (StringUtils.isNoneEmpty(query.getOrderField())){ + if (StringUtils.isNotEmpty(query.getOrderSort()) && "desc".equalsIgnoreCase(query.getOrderSort())) { + qw.orderByDesc(query.getOrderField()); + } else { + qw.orderByAsc(query.getOrderField()); + } + }else { + qw.orderByDesc("publish_status"); + qw.orderByAsc("sort"); + } + Long categoryId = query.getCategoryId(); + if (categoryId != null) { + qw.eq("category_id", categoryId); + } + Integer publishStatus = query.getPublishStatus(); + if (publishStatus != null) { + qw.eq("publish_status", publishStatus); + } + String search = query.getSearch(); + if (StringUtils.isNoneEmpty(search)){ + qw.like("name", "%".concat(query.getSearch().trim()).concat("%")); + } + if (CollectionUtil.isNotEmpty(query.getExcludeProductIds())) { + qw.notIn("id",query.getExcludeProductIds()); + } + if (CollectionUtil.isNotEmpty(query.getIds())) { + qw.in("id",query.getIds()); + } + return productMapper.selectList(qw); + } + + /** + * 新增商品信息 + * + * @param productVO 商品信息 + * @return 结果 + */ +// @Transactional +// public int insert(ProductVO productVO) { +// +// Product product = convert.vo2do(productVO); +// product.setCreateTime(LocalDateTime.now()); +// List skuList = productVO.getSkuList(); +// productMapper.insert(product); +// if(skuList!=null){ +// skuList.forEach(sku -> { +// sku.setProductId(product.getId()); +// sku.setCreateTime(LocalDateTime.now()); +// skuMapper.insert(sku); +// }); +// } +// return 1; +// } + + /** + * 修改商品信息 + * + * @param productVO 商品信息 + * @return 结果 + */ +// @Transactional +// public int update(ProductVO productVO) { +// Product dbProduct = productMapper.selectById(productVO.getId()); +// List idList = productVO.getSkuList().stream().filter(it -> it.getId() != null).map(it -> it.getId()).collect(Collectors.toList()); +// if (dbProduct == null) { +// return 0; +// } +//// Long userId = SecurityUtils.getUserId(); +// Product product = convert.vo2do(productVO); +// List skuList = productVO.getSkuList(); +//// product.setUpdateBy(userId); +// product.setUpdateTime(LocalDateTime.now()); +// productMapper.updateById(product); +// //查找库中所有的sku +// Map map = new HashMap<>(); +// map.put("product_id", product.getId()); +// Map skuMap = skuMapper.selectByMap(map).stream().collect(Collectors.toMap(it -> it.getId(), it -> it)); +// //针对已有的进行编辑 +// List updateList = productVO.getSkuList().stream().filter(it -> it.getId() != null).collect(Collectors.toList()); +// if (!CollectionUtil.isEmpty(updateList)) { +// log.info("共有{}个sku需要修改,{},productId:{}",updateList.size(), JSONUtil.toJsonStr(updateList),productVO.getId()); +// updateList.forEach(it->{ +// Sku sku = skuMap.get(it.getId()); +//// sku.setUpdateBy(SecurityUtils.getUserId()); +// sku.setUpdateTime(LocalDateTime.now()); +// sku.setPrice(it.getPrice()); +// sku.setSpData(it.getSpData()); +// sku.setPic(it.getPic()); +// sku.setOutSkuId(it.getOutSkuId()); +// sku.setStock(it.getStock()); +// skuMapper.updateById(sku); +// }); +// } +// //针对没有的进行新增 +// List addList = productVO.getSkuList().stream().filter(it -> it.getId() == null).collect(Collectors.toList()); +// if (!CollectionUtil.isEmpty(addList)) { +// log.info("共有{}个sku需要新增,{},productId:{}",addList.size(), JSONUtil.toJsonStr(addList),productVO.getId()); +// addList.forEach(sku -> { +// sku.setProductId(product.getId()); +// sku.setCreateTime(LocalDateTime.now()); +// skuMapper.insert(sku); +// }); +// } +// //删除 +// List deleteIds = skuMap.keySet().stream().filter(it -> !idList.contains(it)).collect(Collectors.toList()); +// if (!CollectionUtil.isEmpty(deleteIds)) { +// log.info("共有{}个sku需要删除,{},productId:{}",deleteIds.size(), JSONUtil.toJsonStr(deleteIds),productVO.getId()); +// skuMapper.deleteBatchIds(deleteIds); +// } +// return 1; +// } + + /** + * 删除商品信息信息 + * + * @param id 商品信息主键 + * @return 结果 + */ + public int deleteById(Long id) { + return productMapper.deleteById(id); + } + + public ProductDetailVO queryDetail(Long id) { + ProductDetailVO res = new ProductDetailVO(); + Product d = productMapper.selectById(id); + res.setProduct(d); + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(Sku::getProductId, id); + res.setSkus(skuMapper.selectList(qw)); + if (d.getBrandId() != null) { + res.setBrand(brandMapper.selectById(d.getBrandId())); + } + return res; + } +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/SkuServiceImpl.java b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/SkuServiceImpl.java new file mode 100644 index 000000000..4b8cd08ef --- /dev/null +++ b/ruoyi-modules/ruoyi-goods/src/main/java/com/wzj/soopin/goods/service/impl/SkuServiceImpl.java @@ -0,0 +1,104 @@ +package com.wzj.soopin.goods.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.goods.domain.entity.Sku; +import com.wzj.soopin.goods.domain.query.SkuQuery; +import com.wzj.soopin.goods.mapper.SkuMapper; +import com.wzj.soopin.goods.service.SkuService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * sku信息Service业务层处理 + * + * + * @author zcc + */ +@Service +public class SkuServiceImpl extends ServiceImpl implements SkuService { + @Autowired + private SkuMapper skuMapper; + + /** + * 查询sku信息 + * + * @param id sku信息主键 + * @return sku信息 + */ + public Sku selectById(Long id) { + return skuMapper.selectById(id); + } + + /** + * 查询sku信息列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return sku信息 + */ + public List selectList(SkuQuery query, Pageable page) { +// if (page != null) { +// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); +// } + QueryWrapper qw = new QueryWrapper<>(); + Long productId = query.getProductId(); + if (productId != null) { + qw.eq("product_id", productId); + } + String outSkuId = query.getOutSkuId(); + if (!StringUtils.isEmpty(outSkuId)) { + qw.eq("out_sku_id", outSkuId); + } + BigDecimal price = query.getPrice(); + if (price != null) { + qw.eq("price", price); + } + String pic = query.getPic(); + if (!StringUtils.isEmpty(pic)) { + qw.eq("pic", pic); + } + String spData = query.getSpData(); + if (!StringUtils.isEmpty(spData)) { + qw.eq("sp_data", spData); + } + return skuMapper.selectList(qw); + } + + /** + * 新增sku信息 + * + * @param sku sku信息 + * @return 结果 + */ + public int insert(Sku sku) { + sku.setCreateTime(LocalDateTime.now()); + return skuMapper.insert(sku); + } + + /** + * 修改sku信息 + * + * @param sku sku信息 + * @return 结果 + */ + public int update(Sku sku) { + return skuMapper.updateById(sku); + } + + /** + * 删除sku信息信息 + * + * @param id sku信息主键 + * @return 结果 + */ + public int deleteById(Long id) { + return skuMapper.deleteById(id); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/AddressMapper.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/AddressMapper.java index 7090b66bf..570733e04 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/AddressMapper.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/AddressMapper.java @@ -1,5 +1,6 @@ package com.wzj.soopin.member.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.wzj.soopin.member.domain.po.Address; @@ -10,6 +11,7 @@ import java.util.List; * * @author sjm */ +@InterceptorIgnore(tenantLine = "true") // 忽略租户过滤 public interface AddressMapper extends BaseMapper
{ /** * 查询【请填写功能名称】列表 diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberMapper.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberMapper.java index 3e7d14685..616a76dbb 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberMapper.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberMapper.java @@ -1,5 +1,6 @@ package com.wzj.soopin.member.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -16,6 +17,7 @@ import java.util.List; * * @author zcc */ +@InterceptorIgnore(tenantLine = "true") public interface MemberMapper extends BaseMapper { /** * 查询会员信息列表 diff --git a/ruoyi-modules/ruoyi-order/pom.xml b/ruoyi-modules/ruoyi-order/pom.xml index d0fd47a17..b80721b67 100644 --- a/ruoyi-modules/ruoyi-order/pom.xml +++ b/ruoyi-modules/ruoyi-order/pom.xml @@ -143,5 +143,12 @@ 0.2.9 + + + org.springframework.boot + spring-boot-starter-data-jpa + + + diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleController.java index a95fee23f..cfcf2d7ca 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleController.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleController.java @@ -1,28 +1,40 @@ package com.wzj.soopin.order.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.wzj.soopin.member.domain.bo.FeedbackBO; +import com.wzj.soopin.member.domain.bo.MemberAccountBO; +import com.wzj.soopin.member.domain.bo.MemberBO; +import com.wzj.soopin.member.domain.po.Feedback; +import com.wzj.soopin.member.domain.po.Member; +import com.wzj.soopin.member.domain.po.MemberAccount; +import com.wzj.soopin.member.domain.vo.FeedbackVO; +import com.wzj.soopin.member.domain.vo.MemberAccountVO; +import com.wzj.soopin.member.domain.vo.MemberVO; import com.wzj.soopin.order.convert.AftersaleConvert; +import com.wzj.soopin.order.domain.bo.AftersaleBo; +import com.wzj.soopin.order.domain.entity.OrderOperateHistory; +import com.wzj.soopin.order.service.AftersaleService; import com.wzj.soopin.order.domain.entity.Aftersale; import com.wzj.soopin.order.domain.form.DealWithAftersaleForm; import com.wzj.soopin.order.domain.form.ManagerAftersaleOrderForm; import com.wzj.soopin.order.domain.query.AftersaleQuery; -import com.wzj.soopin.order.domain.vo.ManagerRefundOrderDetailVO; -import com.wzj.soopin.order.domain.vo.ManagerRefundOrderVO; -import com.wzj.soopin.order.domain.vo.OrderOperateHistoryVO; -import com.wzj.soopin.order.service.AftersaleService; +import com.wzj.soopin.order.domain.vo.*; +import com.wzj.soopin.order.service.impl.AftersaleServiceImpl; import com.wzj.soopin.order.utils.SecurityUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.redis.redis.RedisService; import org.dromara.common.web.core.BaseController; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -40,27 +52,30 @@ import java.util.List; @Slf4j public class AftersaleController extends BaseController { @Autowired - private AftersaleService service; + private AftersaleServiceImpl service; @Autowired private AftersaleConvert convert; @Autowired private RedisService redisService; + @Autowired + private AftersaleService aftersaleService; + + + @ApiOperation("查询订单售后列表") + @PostMapping("/list") + public R> list(@RequestBody AftersaleBo query, Page page) { + Page list = aftersaleService.page(page,query.toWrapper() ); + return R.ok(convert.toVO(list)); + } -// @ApiOperation("查询订单售后列表") -// @PostMapping("/list") -// public ResponseEntity> list(@RequestBody ManagerAftersaleOrderForm query, Pageable page) { -// List list = service.selectList(query, page); -// return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); -// } @ApiOperation("导出订单售后列表") @Log(title = "订单售后", businessType = BusinessType.EXPORT) - @GetMapping("/export") - public ResponseEntity export(AftersaleQuery query) { -// List list = service.selectList(query, null); -// ExcelUtil util = new ExcelUtil<>(AftersaleVO.class); -// return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单售后数据")); - return null; + @GetMapping("export") + public ResponseEntity export(AftersaleBo query) { + List list = service.list(query.toWrapper()); + ExcelUtil util = new ExcelUtil<>(AftersaleVO.class); + return ResponseEntity.ok(util.writeExcel(convert.toVO(list), "订单售后数据")); } @ApiOperation("获取订单售后详细信息") @@ -71,16 +86,16 @@ public class AftersaleController extends BaseController { @ApiOperation("新增订单售后") @Log(title = "订单售后", businessType = BusinessType.INSERT) - @PostMapping - public ResponseEntity add(@RequestBody Aftersale aftersale) { - return ResponseEntity.ok(service.insert(aftersale)); + @PostMapping("/add") + public R add(@RequestBody AftersaleBo query) { + return R.ok(service.save(convert.toPo(query))); } @ApiOperation("修改订单售后") @Log(title = "订单售后", businessType = BusinessType.UPDATE) - @PutMapping - public ResponseEntity edit(@RequestBody Aftersale aftersale) { - return ResponseEntity.ok(service.update(aftersale)); + @PostMapping("/update") + public R edit(@RequestBody Aftersale aftersale) { + return R.ok(service.updateById(aftersale)); } @ApiOperation("删除订单售后") @@ -114,7 +129,7 @@ public class AftersaleController extends BaseController { @ApiOperation("查看日志") @GetMapping("/log/{orderId}") - public ResponseEntity> log(@PathVariable Long orderId){ - return ResponseEntity.ok(service.log(orderId)); + public R log(@PathVariable Long orderId){ + return R.ok(service.log(orderId)); } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleItemController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleItemController.java index 400859d51..62b5471a1 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleItemController.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/AftersaleItemController.java @@ -1,21 +1,32 @@ package com.wzj.soopin.order.controller; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.wzj.soopin.member.domain.bo.MemberAccountBO; +import com.wzj.soopin.member.domain.po.Member; +import com.wzj.soopin.member.domain.po.MemberAccount; +import com.wzj.soopin.member.domain.vo.MemberAccountVO; import com.wzj.soopin.order.convert.AftersaleItemConvert; +import com.wzj.soopin.order.domain.bo.AftersaleBo; +import com.wzj.soopin.order.domain.bo.AftersaleItemBo; +import com.wzj.soopin.order.domain.entity.Aftersale; import com.wzj.soopin.order.domain.entity.AftersaleItem; +import com.wzj.soopin.order.domain.form.ManagerAftersaleOrderForm; import com.wzj.soopin.order.domain.query.AftersaleItemQuery; import com.wzj.soopin.order.domain.vo.AftersaleItemVO; +import com.wzj.soopin.order.domain.vo.AftersaleVO; +import com.wzj.soopin.order.domain.vo.PageVO; import com.wzj.soopin.order.service.AftersaleItemService; +import com.wzj.soopin.order.service.impl.AftersaleItemServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.dromara.common.core.domain.R; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.web.core.BaseController; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -31,9 +42,11 @@ import java.util.List; @RequestMapping("/oms/aftersaleItem") public class AftersaleItemController extends BaseController { @Autowired - private AftersaleItemService service; + private AftersaleItemServiceImpl service; @Autowired private AftersaleItemConvert convert; + @Autowired + private AftersaleItemService aftersaleItemService; // @ApiOperation("查询订单售后列表") // @PostMapping("/list") @@ -42,39 +55,50 @@ public class AftersaleItemController extends BaseController { // return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); // } + @ApiOperation("查询订单售后列表") + @PostMapping("/list") + public R> list(@RequestBody AftersaleItemBo query, Page page) { + Page list = aftersaleItemService.page(page,query.toWrapper() ); + return R.ok(convert.toVO(list)); + } + + + @ApiOperation("导出订单售后列表") @Log(title = "订单售后", businessType = BusinessType.EXPORT) - @GetMapping("/export") - public ResponseEntity export(AftersaleItemQuery query) { - List list = service.selectList(query, null); + @GetMapping("export") + public ResponseEntity export(AftersaleItemBo query) { + List list = service.list(query.toWrapper()); ExcelUtil util = new ExcelUtil<>(AftersaleItemVO.class); - return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单售后数据")); + return ResponseEntity.ok(util.writeExcel(convert.toVO(list), "订单售后数据")); } @ApiOperation("获取订单售后详细信息") @GetMapping(value = "/{id}") public ResponseEntity getInfo(@PathVariable("id") Long id) { - return ResponseEntity.ok(service.selectById(id)); + return ResponseEntity.ok(service.getById(id)); } @ApiOperation("新增订单售后") @Log(title = "订单售后", businessType = BusinessType.INSERT) - @PostMapping - public ResponseEntity add(@RequestBody AftersaleItem aftersaleItem) { - return ResponseEntity.ok(service.insert(aftersaleItem)); + @PostMapping("/add") + public R add(@RequestBody AftersaleItemBo aftersaleItem) { + return R.ok(service.save(convert.toPo(aftersaleItem))); } + @ApiOperation("修改订单售后") @Log(title = "订单售后", businessType = BusinessType.UPDATE) - @PutMapping - public ResponseEntity edit(@RequestBody AftersaleItem aftersaleItem) { - return ResponseEntity.ok(service.update(aftersaleItem)); + @PostMapping("/update") + public R edit(@RequestBody AftersaleItem aftersaleItem) { + return R.ok(service.updateById(aftersaleItem)); } + @ApiOperation("删除订单售后") @Log(title = "订单售后", businessType = BusinessType.DELETE) @DeleteMapping("/{id}") - public ResponseEntity remove(@PathVariable Long id) { - return ResponseEntity.ok(service.deleteById(id)); + public R remove(@PathVariable Long id) { + return R.ok(service.removeById(id)); } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java index 9d8895050..abf6162c0 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java @@ -1,26 +1,36 @@ package com.wzj.soopin.order.controller; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wzj.soopin.order.convert.OrderConvert; +import com.wzj.soopin.order.domain.bo.AftersaleBo; +import com.wzj.soopin.order.domain.bo.AftersaleItemBo; +import com.wzj.soopin.order.domain.bo.OrderBo; +import com.wzj.soopin.order.domain.entity.AftersaleItem; import com.wzj.soopin.order.domain.entity.Order; import com.wzj.soopin.order.domain.form.DeliverProductForm; +import com.wzj.soopin.order.domain.form.ManagerAftersaleOrderForm; import com.wzj.soopin.order.domain.form.ManagerOrderQueryForm; +import com.wzj.soopin.order.domain.query.AftersaleItemQuery; import com.wzj.soopin.order.domain.query.OrderQuery; -import com.wzj.soopin.order.domain.vo.ManagerOrderDetailVO; -import com.wzj.soopin.order.domain.vo.ManagerOrderVO; -import com.wzj.soopin.order.domain.vo.OrderOperateHistoryVO; +import com.wzj.soopin.order.domain.vo.*; import com.wzj.soopin.order.service.OrderService; +import com.wzj.soopin.order.service.impl.OrderServiceImpl; import com.wzj.soopin.order.utils.SecurityUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.redis.redis.RedisService; import org.dromara.common.web.core.BaseController; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; + import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -36,66 +46,81 @@ import java.util.List; @Slf4j public class OrderController extends BaseController { @Autowired - private OrderService service; + private OrderServiceImpl service; @Autowired private OrderConvert convert; @Autowired private RedisService redisService; + @Autowired + private OrderService orderService; - @ApiOperation("查询订单表列表") + + + + @ApiOperation("查询订单售后列表") @PostMapping("/list") - public ResponseEntity> list(@RequestBody ManagerOrderQueryForm query, Pageable page) { - return ResponseEntity.ok(service.selectList(query, page)); + public R> list(@RequestBody OrderBo query, Page page) { + Page list = service.page(page,query.toWrapper() ); + return R.ok(convert.toVO(list)); } +// @ApiOperation("查询订单表列表") +// @PostMapping("/list") +// public R> list(@RequestBody ManagerOrderQueryForm query, IPage page) { +// Page list = (Page) orderService.page(page,query.toWrapper() ); +// return R.ok(convert.toVO(list)); +// } + + + @ApiOperation("修改收件人信息") @PostMapping("/receiver/update") - public ResponseEntity updateReceiver(@RequestBody Order order) { - return ResponseEntity.ok(service.updateReceiver(order)); + public R updateReceiver(@RequestBody Order order) { + return R.ok(service.updateById(order)); } @ApiOperation("导出订单表列表") - @Log(title = "订单表", businessType = BusinessType.EXPORT) - @GetMapping("/export") - public ResponseEntity export(OrderQuery query) { -// List list = service.selectList(query, null); -// ExcelUtil util = new ExcelUtil<>(OrderVO.class); -// return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单表数据")); - return null; + @Log(title = "订单售后", businessType = BusinessType.EXPORT) + @GetMapping("export") + public ResponseEntity export(OrderBo query) { + List list = service.list(query.toWrapper()); + ExcelUtil util = new ExcelUtil<>(OrderVO.class); + return ResponseEntity.ok(util.writeExcel(convert.toVO(list), "订单售后数据")); } + @ApiOperation("获取订单表详细信息") @GetMapping(value = "/{id}") - public ResponseEntity getInfo(@PathVariable("id") Long id) { - return ResponseEntity.ok(service.selectById(id)); + public R getInfo(@PathVariable("id") Long id) { + return R.ok(service.selectById(id)); } @ApiOperation("新增订单表") @Log(title = "订单表", businessType = BusinessType.INSERT) - @PostMapping - public ResponseEntity add(@RequestBody Order order) { - return ResponseEntity.ok(service.insert(order)); + @PostMapping("/add") + public R add(@RequestBody Order order) { + return R.ok(service.save(order)); } @ApiOperation("修改订单表") @Log(title = "订单表", businessType = BusinessType.UPDATE) - @PutMapping - public ResponseEntity edit(@RequestBody Order order) { - return ResponseEntity.ok(service.update(order)); + @PostMapping("/update") + public R edit(@RequestBody Order order) { + return R.ok(service.updateById(order)); } @ApiOperation("删除订单表") @Log(title = "订单表", businessType = BusinessType.DELETE) @DeleteMapping("/{id}") - public ResponseEntity remove(@PathVariable Long id) { - return ResponseEntity.ok(service.deleteById(id)); + public R remove(@PathVariable Long id) { + return R.ok(service.removeById(id)); } @ApiOperation("添加备注") @Log(title = "订单表", businessType = BusinessType.UPDATE) @PostMapping("/merchantNote/add") - public ResponseEntity saveMerchantNote(@RequestBody Order order){ - return ResponseEntity.ok(service.saveMerchantNote(order)); + public R saveMerchantNote(@RequestBody Order order){ + return service.saveMerchantNote(order); } @ApiOperation("管理后台订单发货") @@ -121,14 +146,13 @@ public class OrderController extends BaseController { @ApiOperation("订单日志") @GetMapping("/log/{orderId}") - public ResponseEntity> log(@PathVariable Long orderId){ - return ResponseEntity.ok(service.log(orderId)); + public R log(@PathVariable Long orderId){ + return R.ok(service.log(orderId)); } @ApiOperation("订单解密") @GetMapping("/decryptPhone/{orderId}") - public ResponseEntity decryptPhone(@PathVariable Long orderId){ - String decryptPhone = service.decryptPhone(orderId); - return ResponseEntity.ok(decryptPhone); + public R decryptPhone(@PathVariable Long orderId){ + return service.decryptPhone(orderId); } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderDeliveryHistoryController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderDeliveryHistoryController.java index b10816394..985b8a9f4 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderDeliveryHistoryController.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderDeliveryHistoryController.java @@ -1,20 +1,29 @@ package com.wzj.soopin.order.controller; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wzj.soopin.order.convert.OrderDeliveryHistoryConvert; +import com.wzj.soopin.order.domain.bo.OrderBo; +import com.wzj.soopin.order.domain.bo.OrderDeliveryHistoryBo; +import com.wzj.soopin.order.domain.entity.Order; import com.wzj.soopin.order.domain.entity.OrderDeliveryHistory; +import com.wzj.soopin.order.domain.form.DeliverProductForm; +import com.wzj.soopin.order.domain.form.ManagerOrderQueryForm; import com.wzj.soopin.order.domain.query.OrderDeliveryHistoryQuery; +import com.wzj.soopin.order.domain.vo.ManagerOrderVO; import com.wzj.soopin.order.domain.vo.OrderDeliveryHistoryVO; +import com.wzj.soopin.order.domain.vo.OrderVO; +import com.wzj.soopin.order.domain.vo.PageVO; import com.wzj.soopin.order.service.OrderDeliveryHistoryService; +import com.wzj.soopin.order.service.impl.OrderDeliveryHistoryServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.dromara.common.core.domain.R; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.web.core.BaseController; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -30,9 +39,11 @@ import java.util.List; @RequestMapping("/oms/orderDeliveryHistory") public class OrderDeliveryHistoryController extends BaseController { @Autowired - private OrderDeliveryHistoryService service; + private OrderDeliveryHistoryServiceImpl service; @Autowired private OrderDeliveryHistoryConvert convert; + @Autowired + private OrderDeliveryHistoryService historyService; // @ApiOperation("查询订单发货记录列表") // @PostMapping("/list") @@ -41,39 +52,49 @@ public class OrderDeliveryHistoryController extends BaseController { // return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); // } + @ApiOperation("查询订单表列表") + @PostMapping("/list") + public R> list(@RequestBody OrderDeliveryHistoryBo query, Page page) { + Page list = historyService.page(page,query.toWrapper() ); + return R.ok(convert.toVO(list)); + } + + @ApiOperation("导出订单发货记录列表") @Log(title = "订单发货记录", businessType = BusinessType.EXPORT) - @GetMapping("/export") - public ResponseEntity export(OrderDeliveryHistoryQuery query) { - List list = service.selectList(query, null); + @GetMapping("export") + public ResponseEntity export(OrderDeliveryHistoryBo query) { + List list = service.list(query.toWrapper()); ExcelUtil util = new ExcelUtil<>(OrderDeliveryHistoryVO.class); - return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单发货记录数据")); + return ResponseEntity.ok(util.writeExcel(convert.toVO(list), "订单发货记录数据")); } + @ApiOperation("获取订单发货记录详细信息") @GetMapping(value = "/{id}") - public ResponseEntity getInfo(@PathVariable("id") Long id) { - return ResponseEntity.ok(service.selectById(id)); + public R getInfo(@PathVariable("id") Long id) { + return R.ok(service.getById(id)); } + @ApiOperation("新增订单发货记录") @Log(title = "订单发货记录", businessType = BusinessType.INSERT) - @PostMapping - public ResponseEntity add(@RequestBody OrderDeliveryHistory orderDeliveryHistory) { - return ResponseEntity.ok(service.insert(orderDeliveryHistory)); + @PostMapping("/add") + public R add(@RequestBody OrderDeliveryHistory orderDeliveryHistory) { + return R.ok(service.save(orderDeliveryHistory)); } @ApiOperation("修改订单发货记录") @Log(title = "订单发货记录", businessType = BusinessType.UPDATE) - @PutMapping - public ResponseEntity edit(@RequestBody OrderDeliveryHistory orderDeliveryHistory) { - return ResponseEntity.ok(service.update(orderDeliveryHistory)); + @PostMapping("/update") + public R edit(@RequestBody OrderDeliveryHistory orderDeliveryHistory) { + return R.ok(service.updateById(orderDeliveryHistory)); } @ApiOperation("删除订单发货记录") @Log(title = "订单发货记录", businessType = BusinessType.DELETE) @DeleteMapping("/{id}") - public ResponseEntity remove(@PathVariable Long id) { - return ResponseEntity.ok(service.deleteById(id)); + public R remove(@PathVariable Long id) { + return R.ok(service.removeById(id)); } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderItemController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderItemController.java index e5be3e4d4..4a91cbb97 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderItemController.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderItemController.java @@ -1,20 +1,35 @@ package com.wzj.soopin.order.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.wzj.soopin.member.domain.bo.MemberBO; +import com.wzj.soopin.member.domain.po.Member; +import com.wzj.soopin.member.domain.vo.MemberVO; import com.wzj.soopin.order.convert.OrderItemConvert; +import com.wzj.soopin.order.domain.bo.AftersaleBo; +import com.wzj.soopin.order.domain.bo.AftersaleItemBo; +import com.wzj.soopin.order.domain.bo.OrderDeliveryHistoryBo; +import com.wzj.soopin.order.domain.bo.OrderItemBo; +import com.wzj.soopin.order.domain.entity.AftersaleItem; +import com.wzj.soopin.order.domain.entity.OrderDeliveryHistory; import com.wzj.soopin.order.domain.entity.OrderItem; +import com.wzj.soopin.order.domain.query.OrderDeliveryHistoryQuery; import com.wzj.soopin.order.domain.query.OrderItemQuery; +import com.wzj.soopin.order.domain.vo.AftersaleItemVO; +import com.wzj.soopin.order.domain.vo.OrderDeliveryHistoryVO; import com.wzj.soopin.order.domain.vo.OrderItemVO; +import com.wzj.soopin.order.domain.vo.PageVO; import com.wzj.soopin.order.service.OrderItemService; +import com.wzj.soopin.order.service.impl.OrderItemServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.dromara.common.core.domain.R; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.web.core.BaseController; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -30,9 +45,11 @@ import java.util.List; @RequestMapping("/oms/orderItem") public class OrderItemController extends BaseController { @Autowired - private OrderItemService service; + private OrderItemServiceImpl service; @Autowired private OrderItemConvert convert; + @Autowired + private OrderItemService orderItemService; // @ApiOperation("查询订单中所包含的商品列表") // @PostMapping("/list") @@ -41,39 +58,47 @@ public class OrderItemController extends BaseController { // return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); // } - @ApiOperation("导出订单中所包含的商品列表") - @Log(title = "订单中所包含的商品", businessType = BusinessType.EXPORT) - @GetMapping("/export") - public ResponseEntity export(OrderItemQuery query) { - List list = service.selectList(query, null); + @ApiOperation("查询订单中所包含的商品列表") + @PostMapping("/list") + public R> list(@RequestBody OrderItemBo query, Page page) { + Page list = orderItemService.page(page,query.toWrapper() ); + return R.ok(convert.toVO(list)); + } + + + @ApiOperation("导出会员信息列表") + @Log(title = "会员信息", businessType = BusinessType.EXPORT) + @GetMapping("export") + public ResponseEntity export(OrderItemBo query) { + List list = service.list(query.toWrapper()); ExcelUtil util = new ExcelUtil<>(OrderItemVO.class); - return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单中所包含的商品数据")); + return ResponseEntity.ok(util.writeExcel(convert.toVO(list), "订单中所包含的商品数据")); } @ApiOperation("获取订单中所包含的商品详细信息") @GetMapping(value = "/{id}") - public ResponseEntity getInfo(@PathVariable("id") Long id) { - return ResponseEntity.ok(service.selectById(id)); + public R getInfo(@PathVariable("id") Long id) { + return R.ok(service.getById(id)); } @ApiOperation("新增订单中所包含的商品") @Log(title = "订单中所包含的商品", businessType = BusinessType.INSERT) - @PostMapping - public ResponseEntity add(@RequestBody OrderItem orderItem) { - return ResponseEntity.ok(service.insert(orderItem)); + @PostMapping("/add") + public R add(@RequestBody OrderItem orderItem) { + return R.ok(service.save(orderItem)); } @ApiOperation("修改订单中所包含的商品") @Log(title = "订单中所包含的商品", businessType = BusinessType.UPDATE) - @PutMapping - public ResponseEntity edit(@RequestBody OrderItem orderItem) { - return ResponseEntity.ok(service.update(orderItem)); + @PostMapping("/update") + public R edit(@RequestBody OrderItem orderItem) { + return R.ok(service.updateById(orderItem)); } @ApiOperation("删除订单中所包含的商品") @Log(title = "订单中所包含的商品", businessType = BusinessType.DELETE) @DeleteMapping("/{id}") - public ResponseEntity remove(@PathVariable Long id) { - return ResponseEntity.ok(service.deleteById(id)); + public R remove(@PathVariable Long id) { + return R.ok(service.removeById(id)); } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderOperateHistoryController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderOperateHistoryController.java index ae0e5ec63..d0442a412 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderOperateHistoryController.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderOperateHistoryController.java @@ -1,20 +1,28 @@ package com.wzj.soopin.order.controller; +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wzj.soopin.order.convert.OrderOperateHistoryConvert; +import com.wzj.soopin.order.domain.bo.OrderItemBo; +import com.wzj.soopin.order.domain.bo.OrderOperateHistoryBo; +import com.wzj.soopin.order.domain.entity.OrderItem; import com.wzj.soopin.order.domain.entity.OrderOperateHistory; +import com.wzj.soopin.order.domain.query.OrderItemQuery; import com.wzj.soopin.order.domain.query.OrderOperateHistoryQuery; +import com.wzj.soopin.order.domain.vo.OrderItemVO; import com.wzj.soopin.order.domain.vo.OrderOperateHistoryVO; +import com.wzj.soopin.order.domain.vo.PageVO; import com.wzj.soopin.order.service.OrderOperateHistoryService; +import com.wzj.soopin.order.service.impl.OrderOperateHistoryServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.dromara.common.core.domain.R; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.web.core.BaseController; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -30,9 +38,11 @@ import java.util.List; @RequestMapping("/oms/orderOperateHistory") public class OrderOperateHistoryController extends BaseController { @Autowired - private OrderOperateHistoryService service; + private OrderOperateHistoryServiceImpl service; @Autowired private OrderOperateHistoryConvert convert; + @Autowired + private OrderOperateHistoryService orderOperateHistoryService; // @ApiOperation("查询订单操作历史记录列表") // @PostMapping("/list") @@ -41,39 +51,47 @@ public class OrderOperateHistoryController extends BaseController { // return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); // } + @ApiOperation("查询订单操作历史记录列表") + @PostMapping("/list") + public R> list(@RequestBody OrderOperateHistoryBo query, Page page) { + Page list = service.page(page,query.toWrapper() ); + return R.ok(convert.toVO(list)); + } + + @ApiOperation("导出订单操作历史记录列表") @Log(title = "订单操作历史记录", businessType = BusinessType.EXPORT) - @GetMapping("/export") - public ResponseEntity export(OrderOperateHistoryQuery query) { - List list = service.selectList(query, null); + @GetMapping("export") + public ResponseEntity export(OrderOperateHistoryBo query) { + List list = service.list(query.toWrapper()); ExcelUtil util = new ExcelUtil<>(OrderOperateHistoryVO.class); - return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "订单操作历史记录数据")); + return ResponseEntity.ok(util.writeExcel(convert.toVO(list), "订单操作历史记录数据")); } @ApiOperation("获取订单操作历史记录详细信息") @GetMapping(value = "/{id}") - public ResponseEntity getInfo(@PathVariable("id") Long id) { - return ResponseEntity.ok(service.selectById(id)); + public R getInfo(@PathVariable("id") Long id) { + return R.ok(service.getById(id)); } @ApiOperation("新增订单操作历史记录") @Log(title = "订单操作历史记录", businessType = BusinessType.INSERT) - @PostMapping - public ResponseEntity add(@RequestBody OrderOperateHistory orderOperateHistory) { - return ResponseEntity.ok(service.insert(orderOperateHistory)); + @PostMapping("/add") + public R add(@RequestBody OrderOperateHistory orderOperateHistory) { + return R.ok(service.save(orderOperateHistory)); } @ApiOperation("修改订单操作历史记录") @Log(title = "订单操作历史记录", businessType = BusinessType.UPDATE) - @PutMapping - public ResponseEntity edit(@RequestBody OrderOperateHistory orderOperateHistory) { - return ResponseEntity.ok(service.update(orderOperateHistory)); + @PostMapping("/update") + public R edit(@RequestBody OrderOperateHistory orderOperateHistory) { + return R.ok(service.updateById(orderOperateHistory)); } @ApiOperation("删除订单操作历史记录") @Log(title = "订单操作历史记录", businessType = BusinessType.DELETE) @DeleteMapping("/{id}") - public ResponseEntity remove(@PathVariable Long id) { - return ResponseEntity.ok(service.deleteById(id)); + public R remove(@PathVariable Long id) { + return R.ok(service.removeById(id)); } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/WechatPaymentHistoryController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/WechatPaymentHistoryController.java index 8af7bc09e..bcc4b64a6 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/WechatPaymentHistoryController.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/WechatPaymentHistoryController.java @@ -1,20 +1,27 @@ package com.wzj.soopin.order.controller; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wzj.soopin.order.convert.WechatPaymentHistoryConvert; +import com.wzj.soopin.order.domain.bo.OrderOperateHistoryBo; +import com.wzj.soopin.order.domain.bo.WechatPaymentHistoryBo; +import com.wzj.soopin.order.domain.entity.OrderOperateHistory; import com.wzj.soopin.order.domain.entity.WechatPaymentHistory; +import com.wzj.soopin.order.domain.query.OrderOperateHistoryQuery; import com.wzj.soopin.order.domain.query.WechatPaymentHistoryQuery; +import com.wzj.soopin.order.domain.vo.OrderOperateHistoryVO; +import com.wzj.soopin.order.domain.vo.PageVO; import com.wzj.soopin.order.domain.vo.WechatPaymentHistoryVO; import com.wzj.soopin.order.service.WechatPaymentHistoryService; +import com.wzj.soopin.order.service.impl.WechatPaymentHistoryServiceImpl; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.dromara.common.core.domain.R; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.web.core.BaseController; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -30,9 +37,11 @@ import java.util.List; @RequestMapping("/pms/omsWechatPaymentHistory") public class WechatPaymentHistoryController extends BaseController { @Autowired - private WechatPaymentHistoryService service; + private WechatPaymentHistoryServiceImpl service; @Autowired private WechatPaymentHistoryConvert convert; + @Autowired + private WechatPaymentHistoryService wechatPaymentHistoryService; // @ApiOperation("查询微信订单表列表") // @PostMapping("/list") @@ -41,39 +50,47 @@ public class WechatPaymentHistoryController extends BaseController { // return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); // } + @ApiOperation("查询微信订单表列表") + @PostMapping("/list") + public R> list(@RequestBody WechatPaymentHistoryBo query, Page page) { + Page list = wechatPaymentHistoryService.page(page,query.toWrapper() ); + return R.ok(convert.toVO(list)); + } + + @ApiOperation("导出微信订单表列表") @Log(title = "微信订单表", businessType = BusinessType.EXPORT) - @GetMapping("/export") - public ResponseEntity export(WechatPaymentHistoryQuery query) { - List list = service.selectList(query, null); + @GetMapping("export") + public ResponseEntity export(WechatPaymentHistoryBo query) { + List list = service.list(query.toWrapper()); ExcelUtil util = new ExcelUtil<>(WechatPaymentHistoryVO.class); - return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "微信订单表数据")); + return ResponseEntity.ok(util.writeExcel(convert.toVO(list), "微信订单表数据")); } @ApiOperation("获取微信订单表详细信息") @GetMapping(value = "/{id}") - public ResponseEntity getInfo(@PathVariable("id") Long id) { - return ResponseEntity.ok(service.selectById(id)); + public R getInfo(@PathVariable("id") Long id) { + return R.ok(service.getById(id)); } @ApiOperation("新增微信订单表") @Log(title = "微信订单表", businessType = BusinessType.INSERT) - @PostMapping - public ResponseEntity add(@RequestBody WechatPaymentHistory wechatPaymentHistory) { - return ResponseEntity.ok(service.insert(wechatPaymentHistory)); + @PostMapping("/add") + public R add(@RequestBody WechatPaymentHistory wechatPaymentHistory) { + return R.ok(service.save(wechatPaymentHistory)); } @ApiOperation("修改微信订单表") @Log(title = "微信订单表", businessType = BusinessType.UPDATE) - @PutMapping - public ResponseEntity edit(@RequestBody WechatPaymentHistory wechatPaymentHistory) { - return ResponseEntity.ok(service.update(wechatPaymentHistory)); + @PostMapping("/update") + public R edit(@RequestBody WechatPaymentHistory wechatPaymentHistory) { + return R.ok(service.updateById(wechatPaymentHistory)); } @ApiOperation("删除微信订单表") @Log(title = "微信订单表", businessType = BusinessType.DELETE) @DeleteMapping("/{id}") - public ResponseEntity remove(@PathVariable Long id) { - return ResponseEntity.ok(service.deleteById(id)); + public R remove(@PathVariable Long id) { + return R.ok(service.removeById(id)); } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleConvert.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleConvert.java index d29c774bb..62c4f0fa8 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleConvert.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleConvert.java @@ -1,7 +1,14 @@ package com.wzj.soopin.order.convert; +import com.wzj.soopin.member.domain.bo.MemberAddressBO; +import com.wzj.soopin.member.domain.po.MemberAddress; +import com.wzj.soopin.member.domain.vo.MemberAddressVO; +import com.wzj.soopin.order.domain.bo.AftersaleBo; import com.wzj.soopin.order.domain.entity.Aftersale; +import com.wzj.soopin.order.domain.form.ManagerAftersaleOrderForm; import com.wzj.soopin.order.domain.vo.AftersaleVO; +import com.wzj.soopin.order.domain.vo.ManagerRefundOrderVO; +import org.dromara.common.web.core.BaseConverter; import org.mapstruct.Mapper; import java.util.List; @@ -11,7 +18,7 @@ import java.util.List; * @author zcc */ @Mapper(componentModel = "spring") -public interface AftersaleConvert { +public interface AftersaleConvert extends BaseConverter { - List dos2vos(List list); +// List dos2vos(List list); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleItemConvert.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleItemConvert.java index 16244abac..8ead85e7f 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleItemConvert.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleItemConvert.java @@ -1,8 +1,14 @@ package com.wzj.soopin.order.convert; +import com.wzj.soopin.member.domain.bo.MemberAccountBO; +import com.wzj.soopin.order.domain.bo.AftersaleItemBo; import com.wzj.soopin.order.domain.entity.AftersaleItem; +import com.wzj.soopin.order.domain.query.AftersaleItemQuery; import com.wzj.soopin.order.domain.vo.AftersaleItemVO; +import com.wzj.soopin.order.domain.vo.AftersaleVO; +import org.dromara.common.web.core.BaseConverter; import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; import java.util.List; /** @@ -11,7 +17,7 @@ import java.util.List; * @author zcc */ @Mapper(componentModel = "spring") -public interface AftersaleItemConvert { +public interface AftersaleItemConvert extends BaseConverter { - List dos2vos(List list); +// List dos2vos(List list); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderConvert.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderConvert.java index de0fd0ffb..9924fb938 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderConvert.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderConvert.java @@ -1,9 +1,20 @@ package com.wzj.soopin.order.convert; +import com.wzj.soopin.order.domain.bo.OrderBo; +import com.wzj.soopin.order.domain.entity.AftersaleItem; import com.wzj.soopin.order.domain.entity.Order; +import com.wzj.soopin.order.domain.form.ManagerAftersaleOrderForm; +import com.wzj.soopin.order.domain.form.ManagerOrderQueryForm; +import com.wzj.soopin.order.domain.query.AftersaleItemQuery; +import com.wzj.soopin.order.domain.query.OrderQuery; +import com.wzj.soopin.order.domain.vo.AftersaleItemVO; +import com.wzj.soopin.order.domain.vo.AftersaleVO; +import com.wzj.soopin.order.domain.vo.ManagerOrderVO; import com.wzj.soopin.order.domain.vo.OrderVO; +import org.dromara.common.web.core.BaseConverter; import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; import java.util.List; /** @@ -12,9 +23,9 @@ import java.util.List; * @author zcc */ @Mapper(componentModel = "spring") -public interface OrderConvert { +public interface OrderConvert extends BaseConverter { - List dos2vos(List list); +// List dos2vos(List list); - OrderVO do2vo(Order order); +// OrderVO do2vo(Order order); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderDeliveryHistoryConvert.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderDeliveryHistoryConvert.java index 926661998..0a29bba14 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderDeliveryHistoryConvert.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderDeliveryHistoryConvert.java @@ -1,8 +1,15 @@ package com.wzj.soopin.order.convert; +import com.baomidou.mybatisplus.extension.service.IService; +import com.wzj.soopin.order.domain.bo.OrderDeliveryHistoryBo; import com.wzj.soopin.order.domain.entity.OrderDeliveryHistory; +import com.wzj.soopin.order.domain.form.DeliverProductForm; +import com.wzj.soopin.order.domain.query.OrderDeliveryHistoryQuery; +import com.wzj.soopin.order.domain.vo.AftersaleVO; import com.wzj.soopin.order.domain.vo.OrderDeliveryHistoryVO; +import org.dromara.common.web.core.BaseConverter; import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; import java.util.List; /** @@ -11,7 +18,7 @@ import java.util.List; * @author zcc */ @Mapper(componentModel = "spring") -public interface OrderDeliveryHistoryConvert { +public interface OrderDeliveryHistoryConvert extends BaseConverter { - List dos2vos(List list); +// List dos2vos(List list); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderItemConvert.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderItemConvert.java index 1dbdea53b..4f556e487 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderItemConvert.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderItemConvert.java @@ -1,8 +1,13 @@ package com.wzj.soopin.order.convert; +import com.wzj.soopin.order.domain.bo.OrderItemBo; import com.wzj.soopin.order.domain.entity.OrderItem; +import com.wzj.soopin.order.domain.query.OrderItemQuery; +import com.wzj.soopin.order.domain.vo.AftersaleVO; import com.wzj.soopin.order.domain.vo.OrderItemVO; +import org.dromara.common.web.core.BaseConverter; import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; import java.util.List; /** @@ -11,7 +16,7 @@ import java.util.List; * @author zcc */ @Mapper(componentModel = "spring") -public interface OrderItemConvert { +public interface OrderItemConvert extends BaseConverter { - List dos2vos(List list); +// List dos2vos(List list); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderOperateHistoryConvert.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderOperateHistoryConvert.java index d33107d33..5bf9f9418 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderOperateHistoryConvert.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/OrderOperateHistoryConvert.java @@ -1,9 +1,14 @@ package com.wzj.soopin.order.convert; +import com.wzj.soopin.order.domain.bo.OrderOperateHistoryBo; import com.wzj.soopin.order.domain.entity.OrderOperateHistory; +import com.wzj.soopin.order.domain.query.OrderOperateHistoryQuery; +import com.wzj.soopin.order.domain.vo.AftersaleVO; import com.wzj.soopin.order.domain.vo.OrderOperateHistoryVO; +import org.dromara.common.web.core.BaseConverter; import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; import java.util.List; /** @@ -12,7 +17,7 @@ import java.util.List; * @author zcc */ @Mapper(componentModel = "spring") -public interface OrderOperateHistoryConvert { +public interface OrderOperateHistoryConvert extends BaseConverter { - List dos2vos(List list); +// List dos2vos(List list); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/WechatPaymentHistoryConvert.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/WechatPaymentHistoryConvert.java index 481b8da62..f4cdefb5e 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/WechatPaymentHistoryConvert.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/WechatPaymentHistoryConvert.java @@ -1,8 +1,13 @@ package com.wzj.soopin.order.convert; +import com.wzj.soopin.order.domain.bo.WechatPaymentHistoryBo; import com.wzj.soopin.order.domain.entity.WechatPaymentHistory; +import com.wzj.soopin.order.domain.query.WechatPaymentHistoryQuery; +import com.wzj.soopin.order.domain.vo.AftersaleVO; import com.wzj.soopin.order.domain.vo.WechatPaymentHistoryVO; +import org.dromara.common.web.core.BaseConverter; import org.mapstruct.Mapper; +import org.mapstruct.MappingTarget; import java.util.List; /** @@ -11,7 +16,7 @@ import java.util.List; * @author zcc */ @Mapper(componentModel = "spring") -public interface WechatPaymentHistoryConvert { +public interface WechatPaymentHistoryConvert extends BaseConverter { - List dos2vos(List list); +// List dos2vos(List list); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/AftersaleBo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/AftersaleBo.java new file mode 100644 index 000000000..c26179ae4 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/AftersaleBo.java @@ -0,0 +1,125 @@ +package com.wzj.soopin.order.domain.bo; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.wzj.soopin.order.domain.entity.Aftersale; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +@ApiModel(description="订单售后 查询 对象") +public class AftersaleBo { + @ApiModelProperty("MEMBER_ID 精确匹配") + private Long memberId; + + @ApiModelProperty("订单id 精确匹配") + private Long orderId; + + @ApiModelProperty("退款金额 精确匹配") + private BigDecimal returnAmount; + + @ApiModelProperty("售后类型:1:退款,2:退货退款 精确匹配") + private Integer type; + + @ApiModelProperty("申请状态:0->待处理;1->退货中;2->已完成;3->已拒绝 精确匹配") + private Integer status; + + @ApiModelProperty("处理时间 精确匹配") + private LocalDateTime handleTime; + + @ApiModelProperty("退货数量 精确匹配") + private Integer quantity; + + @ApiModelProperty("原因 精确匹配") + private String reason; + + @ApiModelProperty("描述 精确匹配") + private String description; + + @ApiModelProperty("凭证图片,以逗号隔开 精确匹配") + private String proofPics; + + @ApiModelProperty("处理备注 精确匹配") + private String handleNote; + + @ApiModelProperty("处理人员 精确匹配") + private String handleMan; + + @ApiModelProperty(name = "startTime", value = "开始时间", required = true, dataType = "Date") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + + @ApiModelProperty(name = "endTime", value = "结束时间", required = true, dataType = "Date") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime endTime; + + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + if (memberId != null) { + queryWrapper.eq(Aftersale::getMemberId, memberId); + } + + if (orderId != null) { + queryWrapper.eq(Aftersale::getOrderId, orderId); + } + + if (returnAmount != null) { + queryWrapper.eq(Aftersale::getReturnAmount, returnAmount); + } + + if (type != null) { + queryWrapper.eq(Aftersale::getType, type); + } + + if (status != null) { + queryWrapper.eq(Aftersale::getStatus, status); + } + + if (handleTime != null) { + queryWrapper.eq(Aftersale::getHandleTime, handleTime); + } + + if (quantity != null) { + queryWrapper.eq(Aftersale::getQuantity, quantity); + } + + if (reason != null && !reason.isEmpty()) { + queryWrapper.eq(Aftersale::getReason, reason); + } + + if (description != null && !description.isEmpty()) { + queryWrapper.eq(Aftersale::getDescription, description); + } + + if (proofPics != null && !proofPics.isEmpty()) { + queryWrapper.eq(Aftersale::getProofPics, proofPics); + } + + if (handleNote != null && !handleNote.isEmpty()) { + queryWrapper.eq(Aftersale::getHandleNote, handleNote); + } + + if (handleMan != null && !handleMan.isEmpty()) { + queryWrapper.eq(Aftersale::getHandleMan, handleMan); + } + + if (startTime != null && endTime != null) { + queryWrapper.between(Aftersale::getCreateTime, startTime, endTime); + } else if (startTime != null) { + queryWrapper.ge(Aftersale::getCreateTime, startTime); + } else if (endTime != null) { + queryWrapper.le(Aftersale::getCreateTime, endTime); + } + + return queryWrapper; + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/AftersaleItemBo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/AftersaleItemBo.java new file mode 100644 index 000000000..b3aefff08 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/AftersaleItemBo.java @@ -0,0 +1,64 @@ +package com.wzj.soopin.order.domain.bo; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.order.domain.entity.AftersaleItem; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.dromara.common.excel.annotation.Excel; + +import java.math.BigDecimal; + +@Data +@ApiModel(description="订单中所包含的商品 查询 对象") +public class AftersaleItemBo { + + @ApiModelProperty("MEMBER_ID 精确匹配") + private Long memberId; + + @ApiModelProperty("订单id 精确匹配") + private Long orderId; + + @ApiModelProperty("子订单id 精确匹配") + private Long orderItemId; + + @ApiModelProperty("退款金额 精确匹配") + private BigDecimal returnAmount; + + @ApiModelProperty("退货数量 精确匹配") + private Integer quantity; + + @ApiModelProperty("售后单id") + private Long aftersaleId; + + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + if (memberId != null) { + queryWrapper.eq(AftersaleItem::getMemberId, memberId); + } + + if (orderId != null) { + queryWrapper.eq(AftersaleItem::getOrderId, orderId); + } + + if (orderItemId != null) { + queryWrapper.eq(AftersaleItem::getOrderItemId, orderItemId); + } + + if (returnAmount != null) { + queryWrapper.eq(AftersaleItem::getReturnAmount, returnAmount); + } + + if (quantity != null) { + queryWrapper.eq(AftersaleItem::getQuantity, quantity); + } + + if (aftersaleId != null) { + queryWrapper.eq(AftersaleItem::getAftersaleId, aftersaleId); + } + + return queryWrapper; + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderBo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderBo.java new file mode 100644 index 000000000..27bb44fb3 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderBo.java @@ -0,0 +1,220 @@ +package com.wzj.soopin.order.domain.bo; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.order.domain.entity.Order; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import jakarta.persistence.PrePersist; +import lombok.Data; +import org.dromara.common.excel.annotation.Excel; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.Random; + +@Data +@ApiModel(description="订单表 查询 对象") +public class OrderBo { + + @ApiModelProperty("MEMBER_ID 精确匹配") + private Long memberId; + + @ApiModelProperty("订单编号") + private String orderSn; + + @ApiModelProperty("用户帐号 精确匹配") + private String memberUsernameLike; + + @ApiModelProperty("订单总金额 精确匹配") + private BigDecimal totalAmount; + + @ApiModelProperty("采购价 精确匹配") + private BigDecimal purchasePrice; + + @ApiModelProperty("应付金额(实际支付金额) 精确匹配") + private BigDecimal payAmount; + + @ApiModelProperty("运费金额 精确匹配") + private BigDecimal freightAmount; + + @ApiModelProperty("支付方式:0->未支付;1->支付宝;2->微信 精确匹配") + private Integer payType; + + @ApiModelProperty("订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单 精确匹配") + private Integer status; + + @ApiModelProperty("退款状态,枚举值:1:无售后或售后关闭,2:售后处理中,3:退款中,4: 退款成功 精确匹配") + private Integer aftersaleStatus; + + @ApiModelProperty("物流公司 精确匹配") + private String deliveryCompany; + + @ApiModelProperty("物流单号 精确匹配") + private String deliverySn; + + @ApiModelProperty("自动确认时间(天) 精确匹配") + private Integer autoConfirmDay; + + @ApiModelProperty("收货人姓名 精确匹配") + private String receiverNameLike; + + @ApiModelProperty("收货人电话 精确匹配") + private String receiverPhone; + + @ApiModelProperty("收货人邮编 精确匹配") + private String receiverPostCode; + + @ApiModelProperty("省份/直辖市 精确匹配") + private String receiverProvince; + + @ApiModelProperty("城市 精确匹配") + private String receiverCity; + + @ApiModelProperty("区 精确匹配") + private String receiverDistrict; + + @ApiModelProperty("省份/直辖市id 精确匹配") + private Long receiverProvinceId; + + @ApiModelProperty("城市id 精确匹配") + private Long receiverCityId; + + @ApiModelProperty("区id 精确匹配") + private Long receiverDistrictId; + + @ApiModelProperty("详细地址 精确匹配") + private String receiverDetailAddress; + + @ApiModelProperty("订单备注 精确匹配") + private String note; + + @ApiModelProperty("商家备注") + private String merchantNote; + + @ApiModelProperty("确认收货状态:0->未确认;1->已确认 精确匹配") + private Integer confirmStatus; + + @ApiModelProperty("删除状态:0->未删除;1->已删除 精确匹配") + private Integer deleteStatus; + + @ApiModelProperty("支付时间 精确匹配") + private LocalDateTime paymentTime; + + @ApiModelProperty("发货时间 精确匹配") + private LocalDateTime deliveryTime; + + @ApiModelProperty("确认收货时间 精确匹配") + private LocalDateTime receiveTime; + + @ApiModelProperty("创建订单开始时间") + private LocalDateTime startTime; + + @ApiModelProperty("创建订单结束时间") + private LocalDateTime endTime; + + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 精确匹配字段 + if (memberId != null) { + queryWrapper.eq(Order::getMemberId, memberId); + } + if (orderSn != null) { + queryWrapper.eq(Order::getOrderSn, orderSn); + } + if (totalAmount != null) { + queryWrapper.eq(Order::getTotalAmount, totalAmount); + } + if (purchasePrice != null) { + queryWrapper.eq(Order::getPurchasePrice, purchasePrice); + } + if (payAmount != null) { + queryWrapper.eq(Order::getPayAmount, payAmount); + } + if (merchantNote != null) { + queryWrapper.eq(Order::getMerchantNote, merchantNote); + } + if (freightAmount != null) { + queryWrapper.eq(Order::getFreightAmount, freightAmount); + } + if (payType != null) { + queryWrapper.eq(Order::getPayType, payType); + } + if (status != null) { + queryWrapper.eq(Order::getStatus, status); + } + if (aftersaleStatus != null) { + queryWrapper.eq(Order::getAftersaleStatus, aftersaleStatus); + } + if (deliveryCompany != null &&!deliveryCompany.isEmpty()) { + queryWrapper.eq(Order::getDeliveryCompany, deliveryCompany); + } + if (deliverySn != null &&!deliverySn.isEmpty()) { + queryWrapper.eq(Order::getDeliverySn, deliverySn); + } + if (autoConfirmDay != null) { + queryWrapper.eq(Order::getAutoConfirmDay, autoConfirmDay); + } + if (receiverPhone != null &&!receiverPhone.isEmpty()) { + queryWrapper.eq(Order::getReceiverPhone, receiverPhone); + } + if (receiverPostCode != null &&!receiverPostCode.isEmpty()) { + queryWrapper.eq(Order::getReceiverPostCode, receiverPostCode); + } + if (receiverProvince != null &&!receiverProvince.isEmpty()) { + queryWrapper.eq(Order::getReceiverProvince, receiverProvince); + } + if (receiverCity != null &&!receiverCity.isEmpty()) { + queryWrapper.eq(Order::getReceiverCity, receiverCity); + } + if (receiverDistrict != null &&!receiverDistrict.isEmpty()) { + queryWrapper.eq(Order::getReceiverDistrict, receiverDistrict); + } + if (receiverProvinceId != null) { + queryWrapper.eq(Order::getReceiverProvinceId, receiverProvinceId); + } + if (receiverCityId != null) { + queryWrapper.eq(Order::getReceiverCityId, receiverCityId); + } + if (receiverDistrictId != null) { + queryWrapper.eq(Order::getReceiverDistrictId, receiverDistrictId); + } + if (receiverDetailAddress != null &&!receiverDetailAddress.isEmpty()) { + queryWrapper.eq(Order::getReceiverDetailAddress, receiverDetailAddress); + } + if (note != null &&!note.isEmpty()) { + queryWrapper.eq(Order::getNote, note); + } + if (confirmStatus != null) { + queryWrapper.eq(Order::getConfirmStatus, confirmStatus); + } + if (deleteStatus != null) { + queryWrapper.eq(Order::getDeleteStatus, deleteStatus); + } + if (paymentTime != null) { + queryWrapper.eq(Order::getPaymentTime, paymentTime); + } + if (deliveryTime != null) { + queryWrapper.eq(Order::getDeliveryTime, deliveryTime); + } + if (receiveTime != null) { + queryWrapper.eq(Order::getReceiveTime, receiveTime); + } + + + // 时间范围查询 + if (startTime != null && endTime != null) { + queryWrapper.between(Order::getCreateTime, startTime, endTime); + } else if (startTime != null) { + queryWrapper.ge(Order::getCreateTime, startTime); + } else if (endTime != null) { + queryWrapper.le(Order::getCreateTime, endTime); + } + + return queryWrapper; + } + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderDeliveryHistoryBo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderDeliveryHistoryBo.java new file mode 100644 index 000000000..cb4ce0eab --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderDeliveryHistoryBo.java @@ -0,0 +1,39 @@ +package com.wzj.soopin.order.domain.bo; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.order.domain.entity.OrderDeliveryHistory; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(description="订单发货记录 查询 对象") +public class OrderDeliveryHistoryBo { + @ApiModelProperty("订单id 精确匹配") + private Long orderId; + + @ApiModelProperty("物流公司 精确匹配") + private String deliveryCompany; + + @ApiModelProperty("物流单号 精确匹配") + private String deliverySn; + + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + if (orderId != null) { + queryWrapper.eq(OrderDeliveryHistory::getOrderId, orderId); + } + + if (deliveryCompany != null && !deliveryCompany.isEmpty()) { + queryWrapper.eq(OrderDeliveryHistory::getDeliveryCompany, deliveryCompany); + } + + if (deliverySn != null && !deliverySn.isEmpty()) { + queryWrapper.eq(OrderDeliveryHistory::getDeliverySn, deliverySn); + } + + return queryWrapper; + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderItemBo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderItemBo.java new file mode 100644 index 000000000..b97c19ba4 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderItemBo.java @@ -0,0 +1,118 @@ +package com.wzj.soopin.order.domain.bo; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.order.domain.entity.OrderItem; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel(description="订单中所包含的商品 查询 对象") +public class OrderItemBo { + @ApiModelProperty("订单id 精确匹配") + private Long orderId; + + @ApiModelProperty("PRODUCT_ID 精确匹配") + private Long productId; + + @ApiModelProperty("商品编码 精确匹配") + private String outProductId; + + @ApiModelProperty("商品sku id 精确匹配") + private Long skuId; + + @ApiModelProperty("sku编码 精确匹配") + private String outSkuId; + + @ApiModelProperty("商品快照id 精确匹配") + private Long productSnapshotId; + + @ApiModelProperty("sku快照id 精确匹配") + private Long skuSnapshotId; + + @ApiModelProperty("展示图片 精确匹配") + private String pic; + + @ApiModelProperty("PRODUCT_NAME 精确匹配") + private String productNameLike; + + @ApiModelProperty("销售价格 精确匹配") + private BigDecimal salePrice; + + @ApiModelProperty("采购价 精确匹配") + private BigDecimal purchasePrice; + + @ApiModelProperty("购买数量 精确匹配") + private Integer quantity; + + @ApiModelProperty("商品分类id 精确匹配") + private Long productCategoryId; + + @ApiModelProperty("商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}] 精确匹配") + private String spData; + + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + if (orderId != null) { + queryWrapper.eq(OrderItem::getOrderId, orderId); + } + + if (productId != null) { + queryWrapper.eq(OrderItem::getProductId, productId); + } + + if (outProductId != null && !outProductId.isEmpty()) { + queryWrapper.eq(OrderItem::getOutProductId, outProductId); + } + + if (skuId != null) { + queryWrapper.eq(OrderItem::getSkuId, skuId); + } + + if (outSkuId != null && !outSkuId.isEmpty()) { + queryWrapper.eq(OrderItem::getOutSkuId, outSkuId); + } + + if (productSnapshotId != null) { + queryWrapper.eq(OrderItem::getProductSnapshotId, productSnapshotId); + } + + if (skuSnapshotId != null) { + queryWrapper.eq(OrderItem::getSkuSnapshotId, skuSnapshotId); + } + + if (pic != null && !pic.isEmpty()) { + queryWrapper.eq(OrderItem::getPic, pic); + } + + if (productNameLike != null && !productNameLike.isEmpty()) { + queryWrapper.like(OrderItem::getProductName, productNameLike); + } + + if (salePrice != null) { + queryWrapper.eq(OrderItem::getSalePrice, salePrice); + } + + if (purchasePrice != null) { + queryWrapper.eq(OrderItem::getPurchasePrice, purchasePrice); + } + + if (quantity != null) { + queryWrapper.eq(OrderItem::getQuantity, quantity); + } + + if (productCategoryId != null) { + queryWrapper.eq(OrderItem::getProductCategoryId, productCategoryId); + } + + if (spData != null && !spData.isEmpty()) { + queryWrapper.eq(OrderItem::getSpData, spData); + } + + return queryWrapper; + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderOperateHistoryBo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderOperateHistoryBo.java new file mode 100644 index 000000000..aab2140be --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/OrderOperateHistoryBo.java @@ -0,0 +1,48 @@ +package com.wzj.soopin.order.domain.bo; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.order.domain.entity.OrderOperateHistory; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(description="订单操作历史记录 查询 对象") +public class OrderOperateHistoryBo { + + @ApiModelProperty("订单号 精确匹配") + private String orderSn; + + @ApiModelProperty("操作人:用户;系统;后台管理员 精确匹配") + private String operateMan; + + @ApiModelProperty("订单状态:0->待付款;1->待发货;2->已发货;3->已完成;4->已关闭;5->无效订单 精确匹配") + private Integer orderStatus; + + @ApiModelProperty("备注 精确匹配") + private String note; + + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + if (orderSn != null && !orderSn.isEmpty()) { + queryWrapper.eq(OrderOperateHistory::getOrderSn, orderSn); + } + + if (operateMan != null && !operateMan.isEmpty()) { + queryWrapper.eq(OrderOperateHistory::getOperateMan, operateMan); + } + + if (orderStatus != null) { + queryWrapper.eq(OrderOperateHistory::getOrderStatus, orderStatus); + } + + if (note != null && !note.isEmpty()) { + queryWrapper.eq(OrderOperateHistory::getNote, note); + } + + return queryWrapper; + } + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/WechatPaymentHistoryBo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/WechatPaymentHistoryBo.java new file mode 100644 index 000000000..138d94356 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/WechatPaymentHistoryBo.java @@ -0,0 +1,98 @@ +package com.wzj.soopin.order.domain.bo; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.order.domain.entity.WechatPaymentHistory; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel(description="微信订单表 查询 对象") +public class WechatPaymentHistoryBo { + @ApiModelProperty("payment_id 精确匹配") + private String paymentId; + + @ApiModelProperty("用户 ID 精确匹配") + private Long memberId; + + @ApiModelProperty("OPENID 精确匹配") + private String openid; + + @ApiModelProperty("真实姓名,提现需要 精确匹配") + private String realNameLike; + + @ApiModelProperty("标题|商品名称 精确匹配") + private String title; + + @ApiModelProperty("订单号 支付时是payId 其他为orderId 精确匹配") + private Long orderId; + + @ApiModelProperty("金额,单位分 精确匹配") + private BigDecimal money; + + @ApiModelProperty("交易类型(1为支付 2为提现 3为退款) 精确匹配") + private Integer opType; + + @ApiModelProperty("状态(0:未完成交易 1:完成关键交易) 精确匹配") + private Integer paymentStatus; + + @ApiModelProperty("附加数据 精确匹配") + private String attach; + + @ApiModelProperty("响应内容 精确匹配") + private String responseBody; + + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + if (paymentId != null && !paymentId.isEmpty()) { + queryWrapper.eq(WechatPaymentHistory::getPaymentId, paymentId); + } + + if (memberId != null) { + queryWrapper.eq(WechatPaymentHistory::getMemberId, memberId); + } + + if (openid != null && !openid.isEmpty()) { + queryWrapper.eq(WechatPaymentHistory::getOpenid, openid); + } + + if (realNameLike != null && !realNameLike.isEmpty()) { + // 注意:字段名若为 real_name 需对应实体类属性 + queryWrapper.like(WechatPaymentHistory::getRealName, realNameLike); + } + + if (title != null && !title.isEmpty()) { + queryWrapper.eq(WechatPaymentHistory::getTitle, title); + } + + if (orderId != null) { + queryWrapper.eq(WechatPaymentHistory::getOrderId, orderId); + } + + if (money != null) { + queryWrapper.eq(WechatPaymentHistory::getMoney, money); + } + + if (opType != null) { + queryWrapper.eq(WechatPaymentHistory::getOpType, opType); + } + + if (paymentStatus != null) { + queryWrapper.eq(WechatPaymentHistory::getPaymentStatus, paymentStatus); + } + + if (attach != null && !attach.isEmpty()) { + queryWrapper.eq(WechatPaymentHistory::getAttach, attach); + } + + if (responseBody != null && !responseBody.isEmpty()) { + queryWrapper.eq(WechatPaymentHistory::getResponseBody, responseBody); + } + + return queryWrapper; + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java index f21a14c8e..f0bd40f42 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/entity/Order.java @@ -5,12 +5,17 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import jakarta.persistence.PrePersist; import lombok.Data; import org.dromara.common.core.domain.model.BaseAudit; import org.dromara.common.excel.annotation.Excel; import java.math.BigDecimal; +import java.text.SimpleDateFormat; import java.time.LocalDateTime; +import java.util.Date; +import java.util.Random; + /** * 订单表对象 oms_order * @@ -41,6 +46,10 @@ public class Order extends BaseAudit { @Excel(name = "用户帐号") private String memberUsername; + @ApiModelProperty("商家备注") + @Excel(name = "商家备注") + private String merchantNote; + @ApiModelProperty("订单总金额") @Excel(name = "订单总金额") private BigDecimal totalAmount; @@ -129,10 +138,6 @@ public class Order extends BaseAudit { @Excel(name = "订单备注") private String note; - @ApiModelProperty("商家备注") - @Excel(name = "商家备注") - private String merchantNote; - @ApiModelProperty("确认收货状态:0->未确认;1->已确认") @Excel(name = "确认收货状态:0->未确认;1->已确认") private Integer confirmStatus; @@ -159,4 +164,5 @@ public class Order extends BaseAudit { @ApiModelProperty("优惠券金额") private BigDecimal couponAmount; + } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/DeliverProductForm.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/DeliverProductForm.java index 1e4b633f1..686989bdf 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/DeliverProductForm.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/DeliverProductForm.java @@ -1,4 +1,6 @@ package com.wzj.soopin.order.domain.form; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.wzj.soopin.order.domain.entity.OrderDeliveryHistory; import io.swagger.annotations.ApiModelProperty; import jakarta.validation.constraints.NotBlank; import lombok.Getter; @@ -24,4 +26,7 @@ public class DeliverProductForm { @Excel(name = "运单号") private String expressSn; + public Wrapper toWrapper() { + return null; + } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerAftersaleOrderForm.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerAftersaleOrderForm.java index 65f638cf4..2f5272142 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerAftersaleOrderForm.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerAftersaleOrderForm.java @@ -1,6 +1,9 @@ package com.wzj.soopin.order.domain.form; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.fasterxml.jackson.annotation.JsonFormat; +import com.wzj.soopin.member.domain.po.MemberAddress; +import com.wzj.soopin.order.domain.entity.Aftersale; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -38,4 +41,32 @@ public class ManagerAftersaleOrderForm { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime endTime; + + + public QueryWrapper toWrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (id != null) { + queryWrapper.eq("id", id); + } + if (orderSn != null) { + queryWrapper.eq("order_sn", orderSn); + } + if (userPhone != null) { + queryWrapper.eq("user_phone", userPhone); + } + if (status != null) { + queryWrapper.eq("status", status); + } + if (type != null) { + queryWrapper.eq("type", type); + } + if (startTime != null) { + queryWrapper.ge("create_time", startTime); + } + if (endTime != null) { + queryWrapper.le("create_time", endTime); + } + queryWrapper.orderByDesc("id"); + return queryWrapper; + } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerOrderQueryForm.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerOrderQueryForm.java index 2663832b7..d69ec4cc0 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerOrderQueryForm.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/form/ManagerOrderQueryForm.java @@ -1,6 +1,8 @@ package com.wzj.soopin.order.domain.form; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fasterxml.jackson.annotation.JsonFormat; +import com.wzj.soopin.order.domain.vo.ManagerOrderVO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -51,4 +53,46 @@ public class ManagerOrderQueryForm { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime endTime; + + public LambdaQueryWrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + if (orderSn != null &&!orderSn.isEmpty()) { + queryWrapper.eq(ManagerOrderVO::getOrderSn, orderSn); + } + if (productId != null) { + queryWrapper.eq(ManagerOrderVO::getProductId, productId); + } + if (productName != null &&!productName.isEmpty()) { + queryWrapper.like(ManagerOrderVO::getProductName, productName); + } + if (userPhone != null &&!userPhone.isEmpty()) { + queryWrapper.eq(ManagerOrderVO::getUserPhone, userPhone); + } + if (payType != null) { + queryWrapper.eq(ManagerOrderVO::getPayType, payType); + } + if (status != null) { + queryWrapper.eq(ManagerOrderVO::getStatus, status); + } + if (receiverProvince != null &&!receiverProvince.isEmpty()) { + queryWrapper.eq(ManagerOrderVO::getReceiverProvince, receiverProvince); + } + if (receiverCity != null &&!receiverCity.isEmpty()) { + queryWrapper.eq(ManagerOrderVO::getReceiverCity, receiverCity); + } + if (receiverDistrict != null &&!receiverDistrict.isEmpty()) { + queryWrapper.eq(ManagerOrderVO::getReceiverDistrict, receiverDistrict); + } + if (startTime != null && endTime != null) { + // 假设使用createTime作为时间查询字段,可根据实际情况修改 + queryWrapper.between(ManagerOrderVO::getCreateTime, startTime, endTime); + } else if (startTime != null) { + queryWrapper.ge(ManagerOrderVO::getCreateTime, startTime); + } else if (endTime != null) { + queryWrapper.le(ManagerOrderVO::getCreateTime, endTime); + } + + return queryWrapper; + } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleItemQuery.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleItemQuery.java index ff3a77318..b2c9f14ea 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleItemQuery.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleItemQuery.java @@ -1,5 +1,8 @@ package com.wzj.soopin.order.domain.query; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.order.domain.entity.AftersaleItem; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -29,4 +32,29 @@ public class AftersaleItemQuery { @ApiModelProperty("退货数量 精确匹配") private Integer quantity; + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + if (memberId != null) { + queryWrapper.eq(AftersaleItem::getMemberId, memberId); + } + + if (orderId != null) { + queryWrapper.eq(AftersaleItem::getOrderId, orderId); + } + + if (orderItemId != null) { + queryWrapper.eq(AftersaleItem::getOrderItemId, orderItemId); + } + + if (returnAmount != null) { + queryWrapper.eq(AftersaleItem::getReturnAmount, returnAmount); + } + + if (quantity != null) { + queryWrapper.eq(AftersaleItem::getQuantity, quantity); + } + + return queryWrapper; + } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleQuery.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleQuery.java index ef85f9e2c..a1dab90bf 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleQuery.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/AftersaleQuery.java @@ -3,6 +3,7 @@ package com.wzj.soopin.order.domain.query; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.dromara.common.core.domain.BaseBO; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -14,7 +15,7 @@ import java.time.LocalDateTime; */ @ApiModel(description="订单售后 查询 对象") @Data -public class AftersaleQuery { +public class AftersaleQuery extends BaseBO { @ApiModelProperty("MEMBER_ID 精确匹配") private Long memberId; diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderDeliveryHistoryQuery.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderDeliveryHistoryQuery.java index ca101e948..960e7044b 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderDeliveryHistoryQuery.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderDeliveryHistoryQuery.java @@ -1,5 +1,8 @@ package com.wzj.soopin.order.domain.query; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.order.domain.entity.OrderDeliveryHistory; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -21,4 +24,21 @@ public class OrderDeliveryHistoryQuery { @ApiModelProperty("物流单号 精确匹配") private String deliverySn; + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + if (orderId != null) { + queryWrapper.eq(OrderDeliveryHistory::getOrderId, orderId); + } + + if (deliveryCompany != null && !deliveryCompany.isEmpty()) { + queryWrapper.eq(OrderDeliveryHistory::getDeliveryCompany, deliveryCompany); + } + + if (deliverySn != null && !deliverySn.isEmpty()) { + queryWrapper.eq(OrderDeliveryHistory::getDeliverySn, deliverySn); + } + + return queryWrapper; + } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderItemQuery.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderItemQuery.java index 4e737ffdb..4063e0083 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderItemQuery.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderItemQuery.java @@ -1,5 +1,8 @@ package com.wzj.soopin.order.domain.query; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.order.domain.entity.OrderItem; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -56,4 +59,65 @@ public class OrderItemQuery { @ApiModelProperty("商品sku属性:[{\"key\":\"颜色\",\"value\":\"颜色\"},{\"key\":\"容量\",\"value\":\"4G\"}] 精确匹配") private String spData; + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + if (orderId != null) { + queryWrapper.eq(OrderItem::getOrderId, orderId); + } + + if (productId != null) { + queryWrapper.eq(OrderItem::getProductId, productId); + } + + if (outProductId != null && !outProductId.isEmpty()) { + queryWrapper.eq(OrderItem::getOutProductId, outProductId); + } + + if (skuId != null) { + queryWrapper.eq(OrderItem::getSkuId, skuId); + } + + if (outSkuId != null && !outSkuId.isEmpty()) { + queryWrapper.eq(OrderItem::getOutSkuId, outSkuId); + } + + if (productSnapshotId != null) { + queryWrapper.eq(OrderItem::getProductSnapshotId, productSnapshotId); + } + + if (skuSnapshotId != null) { + queryWrapper.eq(OrderItem::getSkuSnapshotId, skuSnapshotId); + } + + if (pic != null && !pic.isEmpty()) { + queryWrapper.eq(OrderItem::getPic, pic); + } + + if (productNameLike != null && !productNameLike.isEmpty()) { + queryWrapper.like(OrderItem::getProductName, productNameLike); + } + + if (salePrice != null) { + queryWrapper.eq(OrderItem::getSalePrice, salePrice); + } + + if (purchasePrice != null) { + queryWrapper.eq(OrderItem::getPurchasePrice, purchasePrice); + } + + if (quantity != null) { + queryWrapper.eq(OrderItem::getQuantity, quantity); + } + + if (productCategoryId != null) { + queryWrapper.eq(OrderItem::getProductCategoryId, productCategoryId); + } + + if (spData != null && !spData.isEmpty()) { + queryWrapper.eq(OrderItem::getSpData, spData); + } + + return queryWrapper; + } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderOperateHistoryQuery.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderOperateHistoryQuery.java index e4a6f034b..c0519460d 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderOperateHistoryQuery.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderOperateHistoryQuery.java @@ -1,5 +1,8 @@ package com.wzj.soopin.order.domain.query; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.order.domain.entity.OrderOperateHistory; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -24,4 +27,25 @@ public class OrderOperateHistoryQuery { @ApiModelProperty("备注 精确匹配") private String note; + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + if (orderSn != null && !orderSn.isEmpty()) { + queryWrapper.eq(OrderOperateHistory::getOrderSn, orderSn); + } + + if (operateMan != null && !operateMan.isEmpty()) { + queryWrapper.eq(OrderOperateHistory::getOperateMan, operateMan); + } + + if (orderStatus != null) { + queryWrapper.eq(OrderOperateHistory::getOrderStatus, orderStatus); + } + + if (note != null && !note.isEmpty()) { + queryWrapper.eq(OrderOperateHistory::getNote, note); + } + + return queryWrapper; + } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderQuery.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderQuery.java index 4c90cd574..319048047 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderQuery.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/OrderQuery.java @@ -104,4 +104,8 @@ public class OrderQuery { @ApiModelProperty("创建订单结束时间") private LocalDateTime endTime; + + public Object toWrapper() { + return null; + } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/WechatPaymentHistoryQuery.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/WechatPaymentHistoryQuery.java index 36a18fe90..938cdeb84 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/WechatPaymentHistoryQuery.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/query/WechatPaymentHistoryQuery.java @@ -1,5 +1,8 @@ package com.wzj.soopin.order.domain.query; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.order.domain.entity.WechatPaymentHistory; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -47,4 +50,54 @@ public class WechatPaymentHistoryQuery { @ApiModelProperty("响应内容 精确匹配") private String responseBody; + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + if (paymentId != null && !paymentId.isEmpty()) { + queryWrapper.eq(WechatPaymentHistory::getPaymentId, paymentId); + } + + if (memberId != null) { + queryWrapper.eq(WechatPaymentHistory::getMemberId, memberId); + } + + if (openid != null && !openid.isEmpty()) { + queryWrapper.eq(WechatPaymentHistory::getOpenid, openid); + } + + if (realNameLike != null && !realNameLike.isEmpty()) { + // 注意:字段名若为 real_name 需对应实体类属性 + queryWrapper.like(WechatPaymentHistory::getRealName, realNameLike); + } + + if (title != null && !title.isEmpty()) { + queryWrapper.eq(WechatPaymentHistory::getTitle, title); + } + + if (orderId != null) { + queryWrapper.eq(WechatPaymentHistory::getOrderId, orderId); + } + + if (money != null) { + queryWrapper.eq(WechatPaymentHistory::getMoney, money); + } + + if (opType != null) { + queryWrapper.eq(WechatPaymentHistory::getOpType, opType); + } + + if (paymentStatus != null) { + queryWrapper.eq(WechatPaymentHistory::getPaymentStatus, paymentStatus); + } + + if (attach != null && !attach.isEmpty()) { + queryWrapper.eq(WechatPaymentHistory::getAttach, attach); + } + + if (responseBody != null && !responseBody.isEmpty()) { + queryWrapper.eq(WechatPaymentHistory::getResponseBody, responseBody); + } + + return queryWrapper; + } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderProductVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderProductVO.java index d259f41f8..c67f1b960 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderProductVO.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderProductVO.java @@ -1,5 +1,6 @@ package com.wzj.soopin.order.domain.vo; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -8,6 +9,7 @@ import java.math.BigDecimal; @Data @ApiModel("订单") +@InterceptorIgnore(tenantLine = "true") public class ManagerOrderProductVO { @ApiModelProperty("商品id") private Long productId; diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderVO.java index 0e82b5ef9..7be769ff4 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderVO.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/ManagerOrderVO.java @@ -1,6 +1,9 @@ package com.wzj.soopin.order.domain.vo; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fasterxml.jackson.annotation.JsonFormat; +import com.wzj.soopin.order.domain.entity.Order; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -101,4 +104,73 @@ public class ManagerOrderVO { private String mark; private BigDecimal couponAmount; + + public Wrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + if (id != null) { + queryWrapper.eq(Order::getId, id); + } + if (orderSn != null &&!orderSn.isEmpty()) { + queryWrapper.eq(Order::getOrderSn, orderSn); + } + + if (status != null) { + queryWrapper.eq(Order::getStatus, status); + } + if (aftersaleStatus != null) { + queryWrapper.eq(Order::getAftersaleStatus, aftersaleStatus); + } + if (totalAmount != null) { + queryWrapper.eq(Order::getTotalAmount, totalAmount); + } + if (payAmount != null) { + queryWrapper.eq(Order::getPayAmount, payAmount); + } + if (createTime != null) { + queryWrapper.eq(Order::getCreateTime, createTime); + } + + if (payType != null) { + queryWrapper.eq(Order::getPayType, payType); + } + if (receiveTime != null) { + queryWrapper.eq(Order::getReceiveTime, receiveTime); + } + if (note != null &&!note.isEmpty()) { + queryWrapper.like(Order::getNote, note); + } + if (merchantNote != null &&!merchantNote.isEmpty()) { + queryWrapper.like(Order::getMerchantNote, merchantNote); + } + if (deliveryTime != null) { + queryWrapper.eq(Order::getDeliveryTime, deliveryTime); + } + if (deliverySn != null &&!deliverySn.isEmpty()) { + queryWrapper.eq(Order::getDeliverySn, deliverySn); + } + if (receiverName != null &&!receiverName.isEmpty()) { + queryWrapper.like(Order::getReceiverName, receiverName); + } + if (receiverPhone != null &&!receiverPhone.isEmpty()) { + queryWrapper.eq(Order::getReceiverPhone, receiverPhone); + } + if (receiverProvince != null &&!receiverProvince.isEmpty()) { + queryWrapper.eq(Order::getReceiverProvince, receiverProvince); + } + if (receiverCity != null &&!receiverCity.isEmpty()) { + queryWrapper.eq(Order::getReceiverCity, receiverCity); + } + if (receiverDistrict != null &&!receiverDistrict.isEmpty()) { + queryWrapper.eq(Order::getReceiverDistrict, receiverDistrict); + } + if (receiverDetailAddress != null &&!receiverDetailAddress.isEmpty()) { + queryWrapper.like(Order::getReceiverDetailAddress, receiverDetailAddress); + } + if (couponAmount != null) { + queryWrapper.eq(Order::getCouponAmount, couponAmount); + } + + return queryWrapper; + } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java index 5dcdf6e43..63d70b516 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/OrderVO.java @@ -1,7 +1,10 @@ package com.wzj.soopin.order.domain.vo; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.wzj.soopin.order.domain.entity.OrderItem; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.dromara.common.core.domain.model.BaseAudit; import org.dromara.common.excel.annotation.Excel; @@ -28,7 +31,11 @@ public class OrderVO extends BaseAudit { /** 用户帐号 */ @Excel(name = "用户帐号") private String memberUsername; - /** 订单总金额 */ + /** 商家备注 */ + @Excel(name = "商家备注") + private String merchantNote; + + /** 订单总金额 */ @Excel(name = "订单总金额") private BigDecimal totalAmount; /** 采购价 */ diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/PageVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/PageVO.java new file mode 100644 index 000000000..06d5f6dbc --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/PageVO.java @@ -0,0 +1,46 @@ +package com.wzj.soopin.order.domain.vo; + +import cn.hutool.core.text.CharSequenceUtil; +import com.wzj.soopin.order.utils.StringUtils; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * 查询参数 + * + * @author Chopper + */ +@Data +public class PageVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "页号") + private Integer page = 1; + + @ApiModelProperty(value = "页面大小") + private Integer size = 10; + + @ApiModelProperty(value = "排序字段") + private String sort; + + @ApiModelProperty(value = "排序方式 asc/desc") + private String order; + + @ApiModelProperty(value = "需要驼峰转换蛇形", notes = "一般不做处理,如果数据库中就是蛇形,则这块需要处理。") + private Boolean notConvert; + + public String getSort() { + if (CharSequenceUtil.isNotEmpty(sort)) { + if (notConvert == null || Boolean.FALSE.equals(notConvert)) { + return StringUtils.camel2Underline(sort); + } else { + return sort; + } + } + return sort; + } + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/SearchVO.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/SearchVO.java new file mode 100644 index 000000000..19836d995 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/vo/SearchVO.java @@ -0,0 +1,49 @@ +package com.wzj.soopin.order.domain.vo; + +import com.wzj.soopin.order.utils.DateUtil; +import com.wzj.soopin.order.utils.StringUtils; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Calendar; +import java.util.Date; + +/** + * 日期搜索参数 + * + * @author Chopper + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SearchVO implements Serializable { + + @ApiModelProperty(value = "起始日期") + private String startDate; + + @ApiModelProperty(value = "结束日期") + private String endDate; + + public Date getConvertStartDate() { + if (StringUtils.isEmpty(startDate)) { + return null; + } + return DateUtil.toDate(startDate, DateUtil.STANDARD_DATE_FORMAT); + } + + public Date getConvertEndDate() { + if (StringUtils.isEmpty(endDate)) { + return null; + } + //结束时间等于结束日期+1天 -1秒, + Date date = DateUtil.toDate(endDate, DateUtil.STANDARD_DATE_FORMAT); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) + 1); + calendar.set(Calendar.SECOND, -1); + return calendar.getTime(); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleItemMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleItemMapper.java index 25f4eba50..f94d7b71c 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleItemMapper.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleItemMapper.java @@ -1,7 +1,10 @@ package com.wzj.soopin.order.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.wzj.soopin.order.domain.entity.AftersaleItem; +import com.wzj.soopin.order.domain.query.AftersaleItemQuery; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -22,4 +25,5 @@ public interface AftersaleItemMapper extends BaseMapper { Integer insertBatch(@Param("list") List list); + IPage selectAftersale(@Param("query") AftersaleItemQuery query, IPage pageParam); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleMapper.java index 03412a708..858c87d30 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleMapper.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/AftersaleMapper.java @@ -1,10 +1,13 @@ package com.wzj.soopin.order.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.wzj.soopin.order.domain.entity.Aftersale; import com.wzj.soopin.order.domain.form.ManagerAftersaleOrderForm; import com.wzj.soopin.order.domain.vo.ManagerRefundOrderVO; import com.wzj.soopin.order.domain.vo.OrderAndAftersaleStatisticsVO; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -27,4 +30,5 @@ public interface AftersaleMapper extends BaseMapper { int countByMemberId(Long memberId); OrderAndAftersaleStatisticsVO statPendingAndProcessing(); + } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderDeliveryHistoryMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderDeliveryHistoryMapper.java index 4b27dac31..cec7500f6 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderDeliveryHistoryMapper.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderDeliveryHistoryMapper.java @@ -1,7 +1,16 @@ package com.wzj.soopin.order.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wzj.soopin.order.domain.entity.OrderDeliveryHistory; +import com.wzj.soopin.order.domain.query.OrderDeliveryHistoryQuery; +import com.wzj.soopin.order.domain.vo.OrderDeliveryHistoryVO; +import org.apache.ibatis.annotations.Param; +import org.springframework.data.domain.Pageable; import java.util.List; @@ -11,6 +20,10 @@ import java.util.List; * @author zcc */ public interface OrderDeliveryHistoryMapper extends BaseMapper { + + + IPage selectOderDeliveryHistory(@Param("query")OrderDeliveryHistoryQuery query, IPage pageParam); + /** * 查询订单发货记录列表 * @@ -18,4 +31,6 @@ public interface OrderDeliveryHistoryMapper extends BaseMapper selectByEntity(OrderDeliveryHistory orderDeliveryHistory); + +// IPage selectByEntity(OrderDeliveryHistoryQuery query ,Page objectPage); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderItemMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderItemMapper.java index aac8835e8..b2a6600e3 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderItemMapper.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderItemMapper.java @@ -1,7 +1,11 @@ package com.wzj.soopin.order.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.wzj.soopin.order.domain.entity.OrderItem; +import com.wzj.soopin.order.domain.query.OrderItemQuery; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -11,6 +15,8 @@ import java.util.List; * @author zcc */ public interface OrderItemMapper extends BaseMapper { + + IPage selectOrderItem(@Param("query") OrderItemQuery query, IPage pageParam); /** * 查询订单中所包含的商品列表 * diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java index 174f7a964..7003af7a7 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderMapper.java @@ -1,5 +1,6 @@ package com.wzj.soopin.order.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.wzj.soopin.order.domain.entity.Order; @@ -25,6 +26,7 @@ public interface OrderMapper extends BaseMapper { */ List selectByEntity(Order order); + List selectManagerOrderPage(ManagerOrderQueryForm request); List orderPage(@Param("status") Integer status, @Param("memberId")Long memberId); diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderOperateHistoryMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderOperateHistoryMapper.java index 84d8255c2..ae80c318b 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderOperateHistoryMapper.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/OrderOperateHistoryMapper.java @@ -1,7 +1,12 @@ package com.wzj.soopin.order.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.wzj.soopin.order.domain.entity.OrderItem; import com.wzj.soopin.order.domain.entity.OrderOperateHistory; +import com.wzj.soopin.order.domain.query.OrderOperateHistoryQuery; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -11,6 +16,7 @@ import java.util.List; * @author zcc */ public interface OrderOperateHistoryMapper extends BaseMapper { + /** * 查询订单操作历史记录列表 * @@ -18,4 +24,6 @@ public interface OrderOperateHistoryMapper extends BaseMapper selectByEntity(OrderOperateHistory orderOperateHistory); + + IPage selectOrderOperateHistory(@Param("query") OrderOperateHistoryQuery query, IPage pageParam); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/WechatPaymentHistoryMapper.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/WechatPaymentHistoryMapper.java index e74fce17b..4c377f402 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/WechatPaymentHistoryMapper.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/mapper/WechatPaymentHistoryMapper.java @@ -1,7 +1,11 @@ package com.wzj.soopin.order.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.wzj.soopin.order.domain.entity.WechatPaymentHistory; +import com.wzj.soopin.order.domain.query.WechatPaymentHistoryQuery; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -11,6 +15,9 @@ import java.util.List; * @author zcc */ public interface WechatPaymentHistoryMapper extends BaseMapper { + + + IPage selectWechatPaymentHistory(@Param("query") WechatPaymentHistoryQuery query, IPage pageParam); /** * 查询微信订单表列表 * diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleItemService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleItemService.java index ce62e79a3..416eb1ed0 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleItemService.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleItemService.java @@ -1,101 +1,7 @@ package com.wzj.soopin.order.service; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; import com.wzj.soopin.order.domain.entity.AftersaleItem; -import com.wzj.soopin.order.domain.query.AftersaleItemQuery; -import com.wzj.soopin.order.mapper.AftersaleItemMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 订单售后Service业务层处理 - * - * - * @author zcc - */ -@Service -public class AftersaleItemService { - @Autowired - private AftersaleItemMapper aftersaleItemMapper; - - /** - * 查询订单售后 - * - * @param id 订单售后主键 - * @return 订单售后 - */ - public AftersaleItem selectById(Long id) { - return aftersaleItemMapper.selectById(id); - } - - /** - * 查询订单售后列表 - * - * @param query 查询条件 - * @param page 分页条件 - * @return 订单售后 - */ - public List selectList(AftersaleItemQuery query, Pageable page) { -// if (page != null) { -// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); -// } - QueryWrapper qw = new QueryWrapper<>(); - Long memberId = query.getMemberId(); - if (memberId != null) { - qw.eq("member_id", memberId); - } - Long orderId = query.getOrderId(); - if (orderId != null) { - qw.eq("order_id", orderId); - } - Long orderItemId = query.getOrderItemId(); - if (orderItemId != null) { - qw.eq("order_item_id", orderItemId); - } - BigDecimal returnAmount = query.getReturnAmount(); - if (returnAmount != null) { - qw.eq("return_amount", returnAmount); - } - Integer quantity = query.getQuantity(); - if (quantity != null) { - qw.eq("quantity", quantity); - } - return aftersaleItemMapper.selectList(qw); - } - - /** - * 新增订单售后 - * - * @param aftersaleItem 订单售后 - * @return 结果 - */ - public int insert(AftersaleItem aftersaleItem) { - aftersaleItem.setCreateTime(LocalDateTime.now()); - return aftersaleItemMapper.insert(aftersaleItem); - } - - /** - * 修改订单售后 - * - * @param aftersaleItem 订单售后 - * @return 结果 - */ - public int update(AftersaleItem aftersaleItem) { - return aftersaleItemMapper.updateById(aftersaleItem); - } - - /** - * 删除订单售后信息 - * - * @param id 订单售后主键 - * @return 结果 - */ - public int deleteById(Long id) { - return aftersaleItemMapper.deleteById(id); - } +public interface AftersaleItemService extends IService { } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleService.java index 5cfed0299..08f53a61b 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleService.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/AftersaleService.java @@ -1,469 +1,7 @@ package com.wzj.soopin.order.service; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.wechat.pay.java.service.refund.model.Refund; -import com.wechat.pay.java.service.refund.model.RefundNotification; -import com.wzj.soopin.goods.mapper.SkuMapper; -import com.wzj.soopin.member.domain.po.Member; -import com.wzj.soopin.member.domain.po.MemberWechat; -import com.wzj.soopin.member.mapper.MemberMapper; -import com.wzj.soopin.member.mapper.MemberWechatMapper; -import com.wzj.soopin.order.convert.OrderOperateHistoryConvert; -import com.wzj.soopin.order.domain.entity.*; -import com.wzj.soopin.order.domain.form.DealWithAftersaleForm; -import com.wzj.soopin.order.domain.form.ManagerAftersaleOrderForm; -import com.wzj.soopin.order.domain.vo.*; -import com.wzj.soopin.order.mapper.*; -import com.wzj.soopin.order.wechat.WechatPayService; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.event.Constants; -import org.dromara.common.core.enums.AftersaleStatus; -import org.dromara.common.core.enums.OrderRefundStatus; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +import com.baomidou.mybatisplus.extension.service.IService; +import com.wzj.soopin.order.domain.entity.Aftersale; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.*; -import java.util.stream.Collectors; - -/** - * 订单售后Service业务层处理 - * - * @author zcc - */ -@Service -@Slf4j -public class AftersaleService { - @Autowired - private AftersaleMapper aftersaleMapper; - - @Autowired - private OrderMapper orderMapper; - - @Autowired - private OrderItemMapper orderItemMapper; - - @Autowired - private OrderOperateHistoryMapper orderOperateHistoryMapper; - - @Autowired - private MemberMapper memberMapper; - - @Autowired - private OrderOperateHistoryConvert historyConvert; - @Autowired - private SkuMapper skuMapper; -// @Autowired -// private MemberCouponService memberCouponService; - @Autowired - private WechatPaymentHistoryMapper wechatPaymentHistoryMapper; - @Autowired - private MemberWechatMapper memberWechatMapper; - @Autowired(required = false) - private WechatPayService wechatPayService; - @Autowired - private OrderOperateHistoryMapper operateHistoryMapper; - - /** - * 查询订单售后 - * - * @param id 订单售后主键 - * @return 订单售后 - */ - public ManagerRefundOrderDetailVO selectById(Long id) { - Order order = orderMapper.selectById(id); - if (order == null) { - throw new RuntimeException("无该订单信息"); - } - ManagerRefundOrderDetailVO result = new ManagerRefundOrderDetailVO(); - //订单基本信息 - result.setOrderId(order.getId()); - result.setOrderSn(order.getOrderSn()); - result.setCreateTime(order.getCreateTime()); - result.setPayType(order.getPayType()); - result.setPayTime(order.getPaymentTime()); - result.setStatus(order.getStatus()); - result.setExpressName(order.getDeliveryCompany()); - result.setDeliveryTime(order.getDeliveryTime()); - result.setExpressNo(order.getDeliverySn()); - result.setTotalAmount(order.getTotalAmount()); - result.setPayAmount(order.getPayAmount()); - //用户信息 - Member member = memberMapper.selectById(order.getMemberId()); - result.setNickName(member.getNickname()); - result.setPhone(member.getPhoneHidden()); - //收货信息 - OrderAddressVO orderAddressVO = new OrderAddressVO(); - orderAddressVO.setAddress(order.getReceiverDetailAddress()); - orderAddressVO.setName(order.getReceiverName()); - orderAddressVO.setUserPhone(order.getReceiverPhone()); - orderAddressVO.setArea(order.getReceiverProvince() + order.getReceiverCity() + order.getReceiverDistrict()); - result.setAddressInfo(orderAddressVO); - //orderItem - QueryWrapper orderItemQw = new QueryWrapper<>(); - orderItemQw.eq("order_id", id); - List orderItemList = orderItemMapper.selectList(orderItemQw); - List productList = new ArrayList<>(); - orderItemList.forEach(orderItem -> { - ManagerOrderProductVO productVO = new ManagerOrderProductVO(); - productVO.setPic(orderItem.getPic()); - productVO.setSpData(orderItem.getSpData()); - productVO.setProductName(orderItem.getProductName()); - productVO.setSalePrice(orderItem.getSalePrice()); - productVO.setBuyNum(orderItem.getQuantity()); - productVO.setProductId(orderItem.getProductId()); - productList.add(productVO); - }); - result.setProductList(productList); - //售后信息 - QueryWrapper aftersaleQw = new QueryWrapper<>(); - aftersaleQw.eq("order_id", order.getId()); - aftersaleQw.orderByDesc("create_time"); - List aftersaleList = aftersaleMapper.selectList(aftersaleQw); - List refundInfoList = new ArrayList<>(); - aftersaleList.forEach(aftersale -> { - RefundInfoVO refundInfo = new RefundInfoVO(); - refundInfo.setId(aftersale.getId()); - refundInfo.setApplyRefundType(aftersale.getType()); - refundInfo.setApplyRefundTime(aftersale.getCreateTime()); - refundInfo.setRefundAmount(aftersale.getReturnAmount()); - refundInfo.setReason(aftersale.getReason()); - refundInfo.setDescription(aftersale.getDescription()); - refundInfo.setProofPics(aftersale.getProofPics()); - refundInfo.setRefundStatus(aftersale.getStatus()); - refundInfo.setRefundWpCode(aftersale.getRefundWpCode()); - refundInfo.setRefundWaybillCode(aftersale.getRefundWaybillCode()); - refundInfo.setRefundStatus(aftersale.getStatus()); - refundInfo.setRemark(aftersale.getHandleNote()); - refundInfoList.add(refundInfo); - }); - result.setRefundInfoList(refundInfoList); - return result; - } - - /** - * 查询订单售后列表 - * - * @param query 查询条件 - * @param page 分页条件 - * @return 订单售后 - */ - public List selectList(ManagerAftersaleOrderForm query, Pageable page) { - if (page != null) { -// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); - } - if (StrUtil.isNotBlank(query.getOrderSn()) && query.getOrderSn().length() > 7) { - query.setOrderSn(query.getOrderSn().substring(7)); - } - List managerRefundOrderVOS = aftersaleMapper.selectManagerRefundOrder(query); - if (CollectionUtil.isEmpty(managerRefundOrderVOS)) { - return managerRefundOrderVOS; - } - Set idSet = managerRefundOrderVOS.stream().map(ManagerRefundOrderVO::getOrderId).collect(Collectors.toSet()); - //查一下orderSn集合 - QueryWrapper orderQw = new QueryWrapper<>(); - orderQw.in("id", idSet); - Map orderMap = orderMapper.selectList(orderQw).stream().collect(Collectors.toMap(Order::getId, it -> it)); - //封装售后单商品数据 - QueryWrapper orderItemQw = new QueryWrapper<>(); - orderItemQw.in("order_id", idSet); - Map> orderItemMap = orderItemMapper.selectList(orderItemQw).stream().collect(Collectors.groupingBy(OrderItem::getOrderId)); - managerRefundOrderVOS.forEach(vo -> { - Order order = orderMap.get(vo.getOrderId()); - vo.setOrderSn(order.getOrderSn()); - List orderItemList = orderItemMap.get(vo.getOrderId()); - List productList = new ArrayList<>(); - orderItemList.forEach(item -> { - ManagerOrderProductVO productVO = new ManagerOrderProductVO(); - productVO.setProductName(item.getProductName()); - productVO.setSalePrice(item.getSalePrice()); - productVO.setPic(item.getPic()); - productVO.setBuyNum(item.getQuantity()); - productVO.setProductId(item.getProductId()); - productVO.setSpData(item.getSpData()); - productList.add(productVO); - }); - vo.setProductList(productList); - }); - return managerRefundOrderVOS; - } - - /** - * 新增订单售后 - * - * @param aftersale 订单售后 - * @return 结果 - */ - public int insert(Aftersale aftersale) { - aftersale.setCreateTime(LocalDateTime.now()); - return aftersaleMapper.insert(aftersale); - } - - /** - * 修改订单售后 - * - * @param aftersale 订单售后 - * @return 结果 - */ - public int update(Aftersale aftersale) { - return aftersaleMapper.updateById(aftersale); - } - - /** - * 删除订单售后信息 - * - * @param id 订单售后主键 - * @return 结果 - */ - public int deleteById(Long id) { - return aftersaleMapper.deleteById(id); - } - - /** - * 售后处理 - * - * @param request 请求体 - * @param - * @return - */ - @Transactional(rollbackFor = Exception.class) - public void dealWith(DealWithAftersaleForm request, Long userId, String optUserName) { - Order order = orderMapper.selectById(request.getOrderId()); - if (order == null) { - throw new RuntimeException("无该订单"); - } - QueryWrapper aftersaleQw = new QueryWrapper<>(); - aftersaleQw.eq("order_id", request.getOrderId()); - if (request.getOptType() == 3) { - aftersaleQw.eq("status", 1); - } else { - aftersaleQw.eq("status", 0); - } - Aftersale aftersale = aftersaleMapper.selectOne(aftersaleQw); - if (aftersale == null) { - throw new RuntimeException("没有售后单"); - } - //售后状态与售后类型是否对应 - if (Constants.OptType.AGREE.equals(request.getOptType()) || Constants.OptType.REFUSE.equals(request.getOptType())) { - if (!AftersaleStatus.APPLY.getType().equals(aftersale.getStatus())) { - throw new RuntimeException("订单状态错误,请刷新页面后重试!"); - } - } else { - if (!AftersaleStatus.WAIT.getType().equals(aftersale.getStatus())) { - throw new RuntimeException("订单状态错误,请刷新页面后重试!"); - } - } - //拒绝则理由必填 - if (Constants.OptType.REFUSE.equals(request.getOptType()) && StrUtil.isBlank(request.getRemark())) { - throw new RuntimeException("请填写拒绝理由"); - } - LocalDateTime optDate = LocalDateTime.now(); - //要创建的订单操作记录,status后续判断再设置 - OrderOperateHistory optHistory = new OrderOperateHistory(); - optHistory.setOrderId(order.getId()); - optHistory.setOrderSn(order.getOrderSn()); - optHistory.setOperateMan("后台管理员"); - optHistory.setCreateTime(optDate); - optHistory.setCreateBy(userId); - optHistory.setUpdateBy(userId); - optHistory.setUpdateTime(optDate); - //封装售后wrapper - UpdateWrapper aftersaleWrapper = new UpdateWrapper<>(); - aftersaleWrapper.eq("order_id", request.getOrderId()); - aftersaleWrapper.eq("status", AftersaleStatus.APPLY.getType()); - aftersaleWrapper.set("handle_man", optUserName); - aftersaleWrapper.set("update_time", optDate); - aftersaleWrapper.set("handle_time", optDate); - aftersaleWrapper.set("update_by", userId); - //封装订单wrapper - UpdateWrapper orderWrapper = new UpdateWrapper<>(); - orderWrapper.eq("id", request.getOrderId()); - orderWrapper.set("update_time", optDate); - orderWrapper.set("update_by", userId); - //更新订单、售后单,创建操作记录 - if (request.getOptType().equals(Constants.OptType.REFUSE)) { - aftersaleWrapper.set("status", AftersaleStatus.REJECT.getType()); - aftersaleWrapper.set("handle_note", request.getRemark()); - orderWrapper.set("aftersale_status", OrderRefundStatus.NO_REFUND.getType()); - optHistory.setOrderStatus(14); - } else if (request.getOptType().equals(Constants.OptType.AGREE)) { - aftersaleWrapper.set("status", AftersaleStatus.WAIT.getType()); - orderWrapper.set("aftersale_status", Objects.equals(aftersale.getType(), 1) ? 3 : 2); - optHistory.setOrderStatus(12); - } else { - //如果是退货退款 order身上的售后状态应该是保持不变的 仅退款的话就进入退款了 - orderWrapper.set("aftersale_status", 3); - int row = orderMapper.update(null, orderWrapper); - if (row != 1) { - throw new RuntimeException("修改订单状态失败"); - } - } - int rows = aftersaleMapper.update(null, aftersaleWrapper); -// if (rows < 1) { -// throw new RuntimeException("更新售后单失败"); -// } - rows = orderMapper.update(null, orderWrapper); - if (rows < 1) { - throw new RuntimeException("更新订单失败"); - } - rows = orderOperateHistoryMapper.insert(optHistory); - if (rows < 1) { - throw new RuntimeException("创建订单操作记录失败"); - } - // 是否需要发起退款 - if ((request.getOptType() == Constants.OptType.GIVING || (request.getOptType() == Constants.OptType.AGREE && aftersale.getType() == 1))) { - tradeRefund(aftersale, order, optDate, userId); - } - } - - public void tradeRefund(Aftersale returnApply, Order order, LocalDateTime optDate, Long userId) { - //查一下微信订单 - QueryWrapper qw = new QueryWrapper<>(); - qw.eq("order_id", order.getPayId()).eq("op_type", 1); - WechatPaymentHistory history = wechatPaymentHistoryMapper.selectOne(qw); - //查用户的微信信息 - QueryWrapper wechatQw = new QueryWrapper<>(); - wechatQw.eq("member_id", order.getMemberId()); - MemberWechat memberWechat = memberWechatMapper.selectOne(wechatQw); - //查订单item - QueryWrapper itemQw = new QueryWrapper<>(); - itemQw.eq("order_id", order.getId()); - OrderItem orderItem = orderItemMapper.selectList(itemQw).get(0); - //开始退款 - Refund wechatResponse = wechatPayService.refundPay(returnApply.getId() + "", - order.getPayId() + "", - "https://mall.ichengle.top/api/no-auth/wechat/weChatRefundNotify", - returnApply.getReturnAmount().multiply(new BigDecimal("100")).longValue(), - history.getMoney().multiply(new BigDecimal("100")).longValue(), returnApply.getReason()); - log.info("发起微信退款返回信息,tradeRefund:{}", JSONObject.toJSONString(wechatResponse == null ? "" : wechatResponse)); - - if (wechatResponse != null && Arrays.asList("PROCESSING", "SUCCESS").contains(wechatResponse.getStatus().name())) { - qw = new QueryWrapper<>(); - qw.eq("order_id", order.getId()).eq("op_type", 3); - WechatPaymentHistory refundHistory = wechatPaymentHistoryMapper.selectOne(qw); - if (refundHistory == null) { - WechatPaymentHistory wechatPaymentHistory = new WechatPaymentHistory(); - wechatPaymentHistory.setPaymentId(wechatResponse.getRefundId()); - wechatPaymentHistory.setMemberId(order.getMemberId()); - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); - queryWrapper.eq(WechatPaymentHistory::getOrderId, order.getPayId()); - queryWrapper.eq(WechatPaymentHistory::getOpType, Constants.PaymentOpType.PAY); - WechatPaymentHistory payHistory = wechatPaymentHistoryMapper.selectOne(queryWrapper); - wechatPaymentHistory.setOpenid(payHistory.getOpenid()); - wechatPaymentHistory.setTitle(orderItem.getProductName()); - wechatPaymentHistory.setOrderId(order.getId()); - wechatPaymentHistory.setMoney(returnApply.getReturnAmount().multiply(new BigDecimal("100"))); - wechatPaymentHistory.setOpType(3); - wechatPaymentHistory.setPaymentStatus(0); - wechatPaymentHistory.setResponseBody(JSON.toJSONString(wechatResponse)); - wechatPaymentHistory.setCreateTime(optDate); - wechatPaymentHistory.setUpdateTime(optDate); - wechatPaymentHistory.setCreateBy(userId); - wechatPaymentHistory.setUpdateBy(userId); - wechatPaymentHistoryMapper.insert(wechatPaymentHistory); - } else { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.eq("id", refundHistory.getId()) - .set("payment_id", wechatResponse.getRefundId()).set("update_time", optDate); - wechatPaymentHistoryMapper.update(null, updateWrapper); - } - } - } - - /** - * 订单退款回调MQ - * - * @param weChatRefundNotify - */ - @Transactional - public void refundOrderExc(RefundNotification weChatRefundNotify) { - log.info("收到订单回调MQ:" + JSONObject.toJSONString(weChatRefundNotify)); - if ("PROCESSING".equals(weChatRefundNotify.getRefundStatus().name())) { - return; - } - //查一下微信订单 - QueryWrapper qw = new QueryWrapper<>(); - qw.eq("payment_id", weChatRefundNotify.getRefundId()).eq("op_type", 3); - WechatPaymentHistory history = wechatPaymentHistoryMapper.selectOne(qw); - if (history == null) { - log.info("未找到退款单"); - throw new RuntimeException(); - } - LocalDateTime optDate = LocalDateTime.now(); - QueryWrapper orderQw = new QueryWrapper<>(); - orderQw.eq("id", history.getOrderId()); - Order order = orderMapper.selectOne(orderQw); - if (order.getStatus() == OrderRefundStatus.SUCCESS.getType()) { - log.info("订单已经是退款成功状态"); - throw new RuntimeException(); - } - QueryWrapper aftersaleQw = new QueryWrapper<>(); - aftersaleQw.eq("order_id", history.getOrderId()).eq("status", AftersaleStatus.WAIT.getType()); - if ("SUCCESS".equals(weChatRefundNotify.getRefundStatus().name())) { - //更改订单表 - UpdateWrapper orderUpdateWrapper = new UpdateWrapper<>(); - orderUpdateWrapper.eq("id", history.getOrderId()) - .set("aftersale_status", OrderRefundStatus.SUCCESS.getType()); - orderMapper.update(null, orderUpdateWrapper); - - //更改 售后表 - UpdateWrapper aftersaleWrapper = new UpdateWrapper<>(); - aftersaleWrapper.eq("order_id", history.getOrderId()).set("status", AftersaleStatus.SUCCESS.getType()); - aftersaleMapper.update(null, aftersaleWrapper); - - //更改 微信表 - UpdateWrapper paymentWrapper = new UpdateWrapper<>(); - paymentWrapper.eq("payment_id", weChatRefundNotify.getRefundId()).eq("op_type", 3) - .set("payment_status", 1); - wechatPaymentHistoryMapper.update(null, paymentWrapper); - OrderOperateHistory optHistory = new OrderOperateHistory(); - optHistory.setOrderId(order.getId()); - optHistory.setOperateMan("系统"); - optHistory.setCreateTime(optDate); - optHistory.setCreateBy(order.getMemberId()); - optHistory.setUpdateBy(order.getMemberId()); - optHistory.setUpdateTime(optDate); - optHistory.setOrderStatus(13); - operateHistoryMapper.insert(optHistory); - // 回滚商品和sku销量 - OrderItem orderItem = orderItemMapper.selectOne(new QueryWrapper().eq("order_id", order.getId())); - skuMapper.updateStockById(orderItem.getSkuId(), LocalDateTime.now(), -1 * orderItem.getQuantity()); - //退还优惠券 -// if (order.getMemberCouponId() != null) { -// memberCouponService.backCoupon(Arrays.asList(order.getMemberCouponId())); -// } - } else { - //更改订单表 - UpdateWrapper orderUpdateWrapper = new UpdateWrapper<>(); - orderUpdateWrapper.eq("id", history.getOrderId()) - .set("aftersale_status", OrderRefundStatus.FAIL.getType()); - orderMapper.update(null, orderUpdateWrapper); - } - } - - public List log(Long orderId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(OrderOperateHistory::getOrderId, orderId); - wrapper.in(OrderOperateHistory::getOrderStatus, Arrays.asList(11, 12, 13, 14)); - wrapper.orderByDesc(OrderOperateHistory::getCreateTime); - List historyList = orderOperateHistoryMapper.selectList(wrapper); - return historyConvert.dos2vos(historyList); - } - - public Aftersale queryAfterSale(Long orderId) { - QueryWrapper itemQw = new QueryWrapper<>(); - itemQw.eq("order_id",orderId); - itemQw.in("status",Arrays.asList(AftersaleStatus.APPLY.getType(),AftersaleStatus.WAIT.getType())); - return aftersaleMapper.selectOne(itemQw); - } +public interface AftersaleService extends IService { } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderDeliveryHistoryService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderDeliveryHistoryService.java index 48d880e1a..c4dcfd28c 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderDeliveryHistoryService.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderDeliveryHistoryService.java @@ -1,93 +1,7 @@ package com.wzj.soopin.order.service; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; import com.wzj.soopin.order.domain.entity.OrderDeliveryHistory; -import com.wzj.soopin.order.domain.query.OrderDeliveryHistoryQuery; -import com.wzj.soopin.order.mapper.OrderDeliveryHistoryMapper; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 订单发货记录Service业务层处理 - * - * - * @author zcc - */ -@Service -public class OrderDeliveryHistoryService { - @Autowired - private OrderDeliveryHistoryMapper orderDeliveryHistoryMapper; - - /** - * 查询订单发货记录 - * - * @param id 订单发货记录主键 - * @return 订单发货记录 - */ - public OrderDeliveryHistory selectById(Long id) { - return orderDeliveryHistoryMapper.selectById(id); - } - - /** - * 查询订单发货记录列表 - * - * @param query 查询条件 - * @param page 分页条件 - * @return 订单发货记录 - */ - public List selectList(OrderDeliveryHistoryQuery query, Pageable page) { - if (page != null) { -// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); - } - QueryWrapper qw = new QueryWrapper<>(); - Long orderId = query.getOrderId(); - if (orderId != null) { - qw.eq("order_id", orderId); - } - String deliveryCompany = query.getDeliveryCompany(); - if (!StringUtils.isEmpty(deliveryCompany)) { - qw.eq("delivery_company", deliveryCompany); - } - String deliverySn = query.getDeliverySn(); - if (!StringUtils.isEmpty(deliverySn)) { - qw.eq("delivery_sn", deliverySn); - } - return orderDeliveryHistoryMapper.selectList(qw); - } - - /** - * 新增订单发货记录 - * - * @param orderDeliveryHistory 订单发货记录 - * @return 结果 - */ - public int insert(OrderDeliveryHistory orderDeliveryHistory) { - orderDeliveryHistory.setCreateTime(LocalDateTime.now()); - return orderDeliveryHistoryMapper.insert(orderDeliveryHistory); - } - - /** - * 修改订单发货记录 - * - * @param orderDeliveryHistory 订单发货记录 - * @return 结果 - */ - public int update(OrderDeliveryHistory orderDeliveryHistory) { - return orderDeliveryHistoryMapper.updateById(orderDeliveryHistory); - } - - /** - * 删除订单发货记录信息 - * - * @param id 订单发货记录主键 - * @return 结果 - */ - public int deleteById(Long id) { - return orderDeliveryHistoryMapper.deleteById(id); - } +public interface OrderDeliveryHistoryService extends IService { } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderItemService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderItemService.java index 82b5bebcb..c7eafdb07 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderItemService.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderItemService.java @@ -1,172 +1,7 @@ package com.wzj.soopin.order.service; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.wzj.soopin.member.domain.po.Member; -import com.wzj.soopin.order.domain.dto.OrderProductListDTO; +import com.baomidou.mybatisplus.extension.service.IService; import com.wzj.soopin.order.domain.entity.OrderItem; -import com.wzj.soopin.order.domain.query.OrderItemQuery; -import com.wzj.soopin.order.mapper.OrderItemMapper; -import org.apache.commons.lang3.StringUtils; -import org.dromara.common.core.utils.IDGenerator; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -/** - * 订单中所包含的商品Service业务层处理 - * - * - * @author zcc - */ -@Service -public class OrderItemService extends ServiceImpl { - @Autowired - private OrderItemMapper orderItemMapper; - - /** - * 查询订单中所包含的商品 - * - * @param id 订单中所包含的商品主键 - * @return 订单中所包含的商品 - */ - public OrderItem selectById(Long id) { - return orderItemMapper.selectById(id); - } - - /** - * 查询订单中所包含的商品列表 - * - * @param query 查询条件 - * @param page 分页条件 - * @return 订单中所包含的商品 - */ - public List selectList(OrderItemQuery query, Pageable page) { - if (page != null) { -// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); - } - QueryWrapper qw = new QueryWrapper<>(); - Long orderId = query.getOrderId(); - if (orderId != null) { - qw.eq("order_id", orderId); - } - Long productId = query.getProductId(); - if (productId != null) { - qw.eq("product_id", productId); - } - String outProductId = query.getOutProductId(); - if (!StringUtils.isEmpty(outProductId)) { - qw.eq("out_product_id", outProductId); - } - Long skuId = query.getSkuId(); - if (skuId != null) { - qw.eq("sku_id", skuId); - } - String outSkuId = query.getOutSkuId(); - if (!StringUtils.isEmpty(outSkuId)) { - qw.eq("out_sku_id", outSkuId); - } - Long productSnapshotId = query.getProductSnapshotId(); - if (productSnapshotId != null) { - qw.eq("product_snapshot_id", productSnapshotId); - } - Long skuSnapshotId = query.getSkuSnapshotId(); - if (skuSnapshotId != null) { - qw.eq("sku_snapshot_id", skuSnapshotId); - } - String pic = query.getPic(); - if (!StringUtils.isEmpty(pic)) { - qw.eq("pic", pic); - } - String productNameLike = query.getProductNameLike(); - if (!StringUtils.isEmpty(productNameLike)) { - qw.like("product_name", productNameLike); - } - BigDecimal salePrice = query.getSalePrice(); - if (salePrice != null) { - qw.eq("sale_price", salePrice); - } - BigDecimal purchasePrice = query.getPurchasePrice(); - if (purchasePrice != null) { - qw.eq("purchase_price", purchasePrice); - } - Integer quantity = query.getQuantity(); - if (quantity != null) { - qw.eq("quantity", quantity); - } - Long productCategoryId = query.getProductCategoryId(); - if (productCategoryId != null) { - qw.eq("product_category_id", productCategoryId); - } - String spData = query.getSpData(); - if (!StringUtils.isEmpty(spData)) { - qw.eq("sp_data", spData); - } - return orderItemMapper.selectList(qw); - } - - /** - * 新增订单中所包含的商品 - * - * @param orderItem 订单中所包含的商品 - * @return 结果 - */ - public int insert(OrderItem orderItem) { - orderItem.setCreateTime(LocalDateTime.now()); - return orderItemMapper.insert(orderItem); - } - - /** - * 修改订单中所包含的商品 - * - * @param orderItem 订单中所包含的商品 - * @return 结果 - */ - public int update(OrderItem orderItem) { - return orderItemMapper.updateById(orderItem); - } - - /** - * 删除订单中所包含的商品信息 - * - * @param id 订单中所包含的商品主键 - * @return 结果 - */ - public int deleteById(Long id) { - return orderItemMapper.deleteById(id); - } - - @Transactional - public void saveOrderItem(Member member, LocalDateTime optTime, - Long orderId, List list){ - List addOrderItemList = new ArrayList<>(); - list.forEach(item -> { - OrderItem orderItem = new OrderItem(); - orderItem.setId(IDGenerator.generateId()); - orderItem.setOrderId(orderId); - orderItem.setProductId(item.getProduct().getId()); - orderItem.setOutProductId(item.getProduct().getOutProductId()); - orderItem.setSkuId(item.getSku().getId()); - orderItem.setOutSkuId(item.getSku().getOutSkuId()); - orderItem.setPic(item.getSku().getPic()); - orderItem.setProductName(item.getProduct().getName()); - orderItem.setSalePrice(item.getSku().getPrice()); - orderItem.setQuantity(item.getQuantity()); - orderItem.setProductCategoryId(item.getProduct().getCategoryId()); - orderItem.setSpData(item.getSku().getSpData()); - orderItem.setCreateBy(member.getId()); - orderItem.setCreateTime(optTime); - addOrderItemList.add(orderItem); - }); - boolean flag = saveBatch(addOrderItemList); - if (!flag){ - throw new RuntimeException("新增订单item失败"); - } - } +public interface OrderItemService extends IService { } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderOperateHistoryService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderOperateHistoryService.java index 20c67134d..0c6d4003e 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderOperateHistoryService.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderOperateHistoryService.java @@ -1,100 +1,7 @@ package com.wzj.soopin.order.service; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.baomidou.mybatisplus.extension.service.IService; import com.wzj.soopin.order.domain.entity.OrderOperateHistory; -import com.wzj.soopin.order.domain.query.OrderOperateHistoryQuery; -import com.wzj.soopin.order.mapper.OrderOperateHistoryMapper; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 订单操作历史记录Service业务层处理 - * - * - * @author zcc - */ -@Service -public class OrderOperateHistoryService extends ServiceImpl { - @Autowired - private OrderOperateHistoryMapper orderOperateHistoryMapper; - - /** - * 查询订单操作历史记录 - * - * @param id 订单操作历史记录主键 - * @return 订单操作历史记录 - */ - public OrderOperateHistory selectById(Long id) { - return orderOperateHistoryMapper.selectById(id); - } - - /** - * 查询订单操作历史记录列表 - * - * @param query 查询条件 - * @param page 分页条件 - * @return 订单操作历史记录 - */ - public List selectList(OrderOperateHistoryQuery query, Pageable page) { - if (page != null) { -// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); - } - QueryWrapper qw = new QueryWrapper<>(); - String orderSn = query.getOrderSn(); - if (StrUtil.isNotBlank(orderSn)) { - qw.eq("order_sn", orderSn); - } - String operateMan = query.getOperateMan(); - if (!StringUtils.isEmpty(operateMan)) { - qw.eq("operate_man", operateMan); - } - Integer orderStatus = query.getOrderStatus(); - if (orderStatus != null) { - qw.eq("order_status", orderStatus); - } - String note = query.getNote(); - if (!StringUtils.isEmpty(note)) { - qw.eq("note", note); - } - qw.orderByDesc("create_time"); - return orderOperateHistoryMapper.selectList(qw); - } - - /** - * 新增订单操作历史记录 - * - * @param orderOperateHistory 订单操作历史记录 - * @return 结果 - */ - public int insert(OrderOperateHistory orderOperateHistory) { - orderOperateHistory.setCreateTime(LocalDateTime.now()); - return orderOperateHistoryMapper.insert(orderOperateHistory); - } - - /** - * 修改订单操作历史记录 - * - * @param orderOperateHistory 订单操作历史记录 - * @return 结果 - */ - public int update(OrderOperateHistory orderOperateHistory) { - return orderOperateHistoryMapper.updateById(orderOperateHistory); - } - - /** - * 删除订单操作历史记录信息 - * - * @param id 订单操作历史记录主键 - * @return 结果 - */ - public int deleteById(Long id) { - return orderOperateHistoryMapper.deleteById(id); - } +public interface OrderOperateHistoryService extends IService { } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java index 2442bf02e..9e068c49f 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/OrderService.java @@ -1,402 +1,7 @@ package com.wzj.soopin.order.service; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.CollectionUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.wzj.soopin.goods.convert.SkuConvert; -import com.wzj.soopin.goods.mapper.ProductMapper; -import com.wzj.soopin.goods.mapper.SkuMapper; -import com.wzj.soopin.member.domain.po.Member; -import com.wzj.soopin.order.convert.OrderConvert; -import com.wzj.soopin.order.convert.OrderOperateHistoryConvert; +import com.baomidou.mybatisplus.extension.service.IService; import com.wzj.soopin.order.domain.entity.Order; -import com.wzj.soopin.order.domain.entity.OrderDeliveryHistory; -import com.wzj.soopin.order.domain.entity.OrderItem; -import com.wzj.soopin.order.domain.entity.OrderOperateHistory; -import com.wzj.soopin.order.domain.form.DeliverProductForm; -import com.wzj.soopin.order.domain.form.ManagerOrderQueryForm; -import com.wzj.soopin.order.domain.query.OrderH5Query; -import com.wzj.soopin.order.domain.vo.*; -import com.wzj.soopin.order.mapper.OrderDeliveryHistoryMapper; -import com.wzj.soopin.order.mapper.OrderItemMapper; -import com.wzj.soopin.order.mapper.OrderMapper; -import com.wzj.soopin.order.mapper.OrderOperateHistoryMapper; -import com.wzj.soopin.order.utils.AesCryptoUtils; -import com.wzj.soopin.order.utils.SecurityUtils; -import org.apache.commons.lang3.StringUtils; -import org.dromara.common.core.domain.event.Constants; -import org.dromara.common.core.utils.PhoneUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import com.wzj.soopin.member.mapper.MemberAddressMapper; -import com.wzj.soopin.member.mapper.MemberCartMapper; -import com.wzj.soopin.member.mapper.MemberMapper; -import java.time.LocalDateTime; -import java.util.*; -import java.util.stream.Collectors; - -/** - * 订单表Service业务层处理 - * - * - * @author zcc - */ -@Service -public class OrderService { - @Autowired - private OrderMapper orderMapper; - @Autowired - private OrderConvert orderConvert; - @Autowired - private OrderItemMapper orderItemMapper; - @Autowired - private MemberAddressMapper memberAddressMapper; - @Autowired - private SkuMapper skuMapper; - @Autowired - private ProductMapper productMapper; - @Autowired - private SkuConvert skuConvert; - @Autowired - private OrderItemService orderItemService; - @Autowired - private OrderOperateHistoryMapper orderOperateHistoryMapper; - @Autowired - private MemberCartMapper memberCartMapper; - @Autowired - private MemberMapper memberMapper; - - @Autowired - private OrderDeliveryHistoryMapper orderDeliveryHistoryMapper; - @Autowired - private OrderOperateHistoryConvert historyConvert; - - /** - * 查询订单表 - * - * @param id 订单表主键 - * @return 订单表 - */ - public ManagerOrderDetailVO selectById(Long id) { - Order order = orderMapper.selectById(id); - if (order == null){ - throw new RuntimeException("查不到订单信息"); - } - ManagerOrderDetailVO managerOrderDetailVO = new ManagerOrderDetailVO(); - //封装订单信息 - managerOrderDetailVO.setOrderId(id); - managerOrderDetailVO.setCouponAmount(order.getCouponAmount()); - managerOrderDetailVO.setOrderSn(order.getOrderSn()); - managerOrderDetailVO.setOrderStatus(order.getStatus()); - managerOrderDetailVO.setCreateTime(order.getCreateTime()); - managerOrderDetailVO.setDeliveryTime(order.getDeliveryTime()); - managerOrderDetailVO.setExpressName(order.getDeliveryCompany()); - managerOrderDetailVO.setExpressNo(order.getDeliverySn()); - managerOrderDetailVO.setPayAmount(order.getPayAmount()); - managerOrderDetailVO.setPayTime(order.getPaymentTime()); - managerOrderDetailVO.setPayType(order.getPayType()); - managerOrderDetailVO.setTotalAmount(order.getTotalAmount()); - managerOrderDetailVO.setPayAmount(order.getPayAmount()); - managerOrderDetailVO.setReceiveTime(order.getReceiveTime()); - //封装订单地址信息 - ManagerOrderAddressVo managerOrderAddressVo = new ManagerOrderAddressVo(); - managerOrderAddressVo.setUserPhone(order.getReceiverPhone()); - managerOrderAddressVo.setAddress(order.getReceiverDetailAddress()); - managerOrderAddressVo.setArea( - order.getReceiverProvince() + - order.getReceiverCity() + - order.getReceiverDistrict()); - managerOrderAddressVo.setName(order.getReceiverName()); - managerOrderDetailVO.setAddressInfo(managerOrderAddressVo); - //查询会员信息 - Member member = memberMapper.selectById(order.getMemberId()); - managerOrderDetailVO.setUserName(member.getNickname()); - managerOrderDetailVO.setUserPhone(member.getPhoneHidden()); - //查询购买商品信息 - QueryWrapper qw = new QueryWrapper<>(); - qw.eq("order_id", order.getId()); - List orderItemList = orderItemMapper.selectList(qw); - List productList = new ArrayList<>(); - orderItemList.forEach(item -> { - ManagerOrderProductVO productVO = new ManagerOrderProductVO(); - productVO.setProductId(item.getProductId()); - productVO.setBuyNum(item.getQuantity()); - productVO.setPic(item.getPic()); - productVO.setProductName(item.getProductName()); - productVO.setSalePrice(item.getSalePrice()); - productVO.setSpData(item.getSpData()); - productList.add(productVO); - }); - managerOrderDetailVO.setProductInfo(productList); - return managerOrderDetailVO; - } - - /** - * 查询订单表列表 - * - * @param query 查询条件 - * @param page 分页条件 - * @return 订单表 - */ - public PageImpl selectList(ManagerOrderQueryForm query, Pageable page) { - if (page != null) { -// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); - } - if (!StringUtils.isEmpty(query.getUserPhone())){ -// query.setUserPhone(AesCryptoUtils.encrypt(aesKey, query.getUserPhone())); - } - List managerOrderVOList = orderMapper.selectManagerOrderPage(query); - if (CollectionUtil.isEmpty(managerOrderVOList)){ - return new PageImpl<>(managerOrderVOList, page, 0); - } - long total = managerOrderVOList.size(); - Map orderMap = managerOrderVOList.stream().collect(Collectors.toMap(ManagerOrderVO::getId, it -> it, (v1,v2) -> v2, LinkedHashMap::new)); - //查orderItem - QueryWrapper qw = new QueryWrapper<>(); - qw.in("order_id", orderMap.keySet()); - Map> groupedOrderItemMap = orderItemMapper.selectList(qw) - .stream().collect(Collectors.groupingBy(OrderItem::getOrderId)); - groupedOrderItemMap.keySet().forEach(key -> { - ManagerOrderVO managerOrderVO = orderMap.get(key); - managerOrderVO.setBuyNum(0); - List orderItemList = groupedOrderItemMap.get(key); - List addProductList = new ArrayList<>(); - orderItemList.forEach(item -> { - ManagerOrderProductVO vo = new ManagerOrderProductVO(); - vo.setProductName(item.getProductName()); - vo.setSalePrice(item.getSalePrice()); - vo.setPic(item.getPic()); - vo.setBuyNum(item.getQuantity()); - vo.setProductId(item.getProductId()); - vo.setSpData(item.getSpData()); - addProductList.add(vo); - managerOrderVO.setBuyNum(managerOrderVO.getBuyNum() + item.getQuantity()); - }); - managerOrderVO.setProductList(addProductList); - }); - return new PageImpl<>(new ArrayList<>(orderMap.values()), page, total); - } - - /** - * 新增订单表 - * - * @param order 订单表 - * @return 结果 - */ - public int insert(Order order) { - order.setCreateTime(LocalDateTime.now()); - return orderMapper.insert(order); - } - - /** - * 修改订单表 - * - * @param order 订单表 - * @return 结果 - */ - public int update(Order order) { - return orderMapper.updateById(order); - } - - /** - * 删除订单表信息 - * - * @param id 订单表主键 - * @return 结果 - */ - public int deleteById(Long id) { - return orderMapper.deleteById(id); - } - - public Page queryOrderPage(OrderH5Query query, Pageable pageReq) { - QueryWrapper qw = new QueryWrapper<>(); - qw.eq("member_id", SecurityUtils.getUserId()); - IPage page = new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(); - page.setCurrent(pageReq.getPageNumber()) - .setSize(pageReq.getPageSize()); - if (CollUtil.isEmpty(pageReq.getSort())) { - pageReq.getSort().forEach(it -> { - qw.orderBy(true, it.getDirection().isAscending(), it.getProperty()); - }); - } - Integer tab = query.getTab(); - if (tab != null) { - qw.eq("delete_status", 0); - if (tab == 1) { - qw.eq("status", 0); - } else if (tab == 2) { - qw.eq("status", 1); - qw.eq("aftersale_status", 1); - } else if (tab == 3) { - qw.eq("status", 2); - qw.eq("confirm_status", 0); - } else if (tab == 4) { - qw.eq("status", 2); - qw.eq("confirm_status", 1); - } - } - orderMapper.selectPage(page, qw); - List orders = page.getRecords(); - long total = page.getPages(); - if (CollUtil.isEmpty(orders)) { - return new PageImpl<>(Collections.emptyList(), pageReq, total); - } - LambdaQueryWrapper qw1 = new LambdaQueryWrapper<>(); - qw1.in(OrderItem::getOrderId, orders.stream().map(Order::getId).collect(Collectors.toList())); - Map> oid2items = orderItemMapper.selectList(qw1) - .stream().collect(Collectors.groupingBy(OrderItem::getOrderId)); - List res = orderConvert.dos2vos(orders); - res.forEach(it -> { - it.setItems(oid2items.get(it.getId())); - }); - return new PageImpl<>(res, pageReq, total); - } - - - public Integer saveMerchantNote(Order order) { - Order orderInDb = orderMapper.selectById(order.getId()); - if (orderInDb == null){ - throw new RuntimeException("订单不存在"); - } - UpdateWrapper qw = new UpdateWrapper<>(); - qw.eq("id", order.getId()); - qw.set("merchant_note", order.getMerchantNote()); - return orderMapper.update(null, qw); - } - - /** - * 管理后台发货 - * 目前发货是这样的:待发货、已发货、已完成都能执行发货,每次都会创建一条新的发货记录且修改订单发货信息 - * @param request 发货请求 - * @param userId 操作人 - * @return 结果 - */ - @Transactional - public String deliverProduct(DeliverProductForm request, Long userId) { - //查询订单 - Order order = orderMapper.selectById(request.getOrderId()); - QueryWrapper qw = new QueryWrapper<>(); - qw.eq("order_id", request.getOrderId()); - List orderItemList = orderItemMapper.selectList(qw); - if (order == null || CollectionUtil.isEmpty(orderItemList)){ - throw new RuntimeException("未找到该订单信息"); - } - // 是否为待发货、已发货 、已完成 - if (!(Constants.OrderStatus.SEND.equals(order.getStatus()) - || Constants.OrderStatus.GET.equals(order.getStatus()) - || Constants.OrderStatus.CONFIRM.equals(order.getStatus()))){ - throw new RuntimeException("订单状态错误"); - } - Integer orderStatus = - Constants.OrderStatus.SEND.equals(order.getStatus()) ? Constants.OrderStatus.GET : order.getStatus(); - //更新订单 - LocalDateTime optDate = LocalDateTime.now(); - order.setUpdateBy(null); - order.setStatus(orderStatus); - order.setDeliveryTime(optDate); - order.setUpdateTime(optDate); - order.setDeliveryCompany(request.getExpressName()); - order.setDeliverySn(request.getExpressSn()); - orderMapper.updateById(order); - //创建新的发货记录 - this.createDeliveryHistory(request, userId, optDate); - //创建订单操作记录 - this.createOrderOptHistory(order.getId(), order.getOrderSn(), orderStatus, userId, optDate); - return "发货成功"; - } - - /** - * 创建发货记录 - * @param request 发货请求 - * @param userId 操作人 - * @param optDate 操作时间 - */ - private void createDeliveryHistory(DeliverProductForm request, Long userId, LocalDateTime optDate){ - OrderDeliveryHistory orderDeliveryHistory = new OrderDeliveryHistory(); - orderDeliveryHistory.setOrderId(request.getOrderId()); - orderDeliveryHistory.setDeliveryCompany(request.getExpressName()); - orderDeliveryHistory.setDeliverySn(request.getExpressSn()); - orderDeliveryHistory.setCreateTime(optDate); - orderDeliveryHistory.setCreateBy(userId); - int rows = orderDeliveryHistoryMapper.insert(orderDeliveryHistory); - if (rows < 1) { - throw new RuntimeException("新增订单发货记录失败"); - } - } - - /** - * 创建订单操作历史 - * @param orderId 订单id - * @param orderStatus 订单状态 - * @param userId 操作人 - * @param optDate 操作时间 - */ - private void createOrderOptHistory(Long orderId, String orderSn, Integer orderStatus, Long userId, LocalDateTime optDate){ - OrderOperateHistory optHistory = new OrderOperateHistory(); - optHistory.setOrderId(orderId); - optHistory.setOrderSn(orderSn); - optHistory.setOperateMan(SecurityUtils.getUsername()); - optHistory.setOrderStatus(orderStatus); - optHistory.setCreateTime(optDate); - optHistory.setCreateBy(userId); - optHistory.setUpdateBy(userId); - optHistory.setUpdateTime(optDate); - int rows = orderOperateHistoryMapper.insert(optHistory); - if (rows < 1) { - throw new RuntimeException("新增订单操作记录失败"); - } - } - - /** - * 根据订单id查询订单操作日志 - * @param orderId 订单id - * @return 结果 - */ - public List log(Long orderId) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(OrderOperateHistory::getOrderId, orderId); - wrapper.in(OrderOperateHistory::getOrderStatus, Arrays.asList(0, 1, 2, 3, 4)); - wrapper.orderByDesc(OrderOperateHistory::getCreateTime); - List historyList = orderOperateHistoryMapper.selectList(wrapper); - return historyConvert.dos2vos(historyList); - } - - public String decryptPhone(Long orderId) { - Order order = orderMapper.selectById(orderId); - String receiverPhoneEncrypted = order.getReceiverPhoneEncrypted(); - if(receiverPhoneEncrypted!=null){ -// return AesCryptoUtils.decrypt(aesKey,receiverPhoneEncrypted); - return null; - }else { - return null; - } - } - - public Boolean updateReceiver(Order order) { - Order dbOrder = orderMapper.selectById(order.getId()); - if (dbOrder == null) { - return false; - } - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("receiver_name",order.getReceiverName()) - .set("receiver_phone", PhoneUtils.hidePhone(order.getReceiverPhone())) - .set("receiver_city",order.getReceiverCity()) - .set("receiver_district",order.getReceiverDistrict()) - .set("receiver_province",order.getReceiverProvince()) - .set("receiver_detail_address",order.getReceiverDetailAddress()) -// .set("receiver_phone_encrypted", AesCryptoUtils.encrypt(aesKey, order.getReceiverPhone())) - .set("update_time",LocalDateTime.now()); - updateWrapper.eq("id",order.getId()); - int update = orderMapper.update(null, updateWrapper); - return update == 1; - } +public interface OrderService extends IService { } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/WechatPaymentHistoryService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/WechatPaymentHistoryService.java index 1577a6999..1de048ed5 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/WechatPaymentHistoryService.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/WechatPaymentHistoryService.java @@ -1,126 +1,7 @@ package com.wzj.soopin.order.service; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; import com.wzj.soopin.order.domain.entity.WechatPaymentHistory; -import com.wzj.soopin.order.domain.query.WechatPaymentHistoryQuery; -import com.wzj.soopin.order.mapper.WechatPaymentHistoryMapper; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 微信订单表Service业务层处理 - * - * - * @author zcc - */ -@Service -public class WechatPaymentHistoryService { - @Autowired - private WechatPaymentHistoryMapper wechatPaymentHistoryMapper; - - /** - * 查询微信订单表 - * - * @param id 微信订单表主键 - * @return 微信订单表 - */ - public WechatPaymentHistory selectById(Long id) { - return wechatPaymentHistoryMapper.selectById(id); - } - - /** - * 查询微信订单表列表 - * - * @param query 查询条件 - * @param page 分页条件 - * @return 微信订单表 - */ - public List selectList(WechatPaymentHistoryQuery query, Pageable page) { - if (page != null) { -// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); - } - QueryWrapper qw = new QueryWrapper<>(); - String paymentId = query.getPaymentId(); - if (!StringUtils.isEmpty(paymentId)) { - qw.eq("payment_id", paymentId); - } - Long memberId = query.getMemberId(); - if (memberId != null) { - qw.eq("member_id", memberId); - } - String openid = query.getOpenid(); - if (!StringUtils.isEmpty(openid)) { - qw.eq("openid", openid); - } - String realNameLike = query.getRealNameLike(); - if (!StringUtils.isEmpty(realNameLike)) { - qw.like("real_name", realNameLike); - } - String title = query.getTitle(); - if (!StringUtils.isEmpty(title)) { - qw.eq("title", title); - } - Long orderId = query.getOrderId(); - if (orderId != null) { - qw.eq("order_id", orderId); - } - BigDecimal money = query.getMoney(); - if (money != null) { - qw.eq("money", money); - } - Integer opType = query.getOpType(); - if (opType != null) { - qw.eq("op_type", opType); - } - Integer paymentStatus = query.getPaymentStatus(); - if (paymentStatus != null) { - qw.eq("payment_status", paymentStatus); - } - String attach = query.getAttach(); - if (!StringUtils.isEmpty(attach)) { - qw.eq("attach", attach); - } - String responseBody = query.getResponseBody(); - if (!StringUtils.isEmpty(responseBody)) { - qw.eq("response_body", responseBody); - } - return wechatPaymentHistoryMapper.selectList(qw); - } - - /** - * 新增微信订单表 - * - * @param wechatPaymentHistory 微信订单表 - * @return 结果 - */ - public int insert(WechatPaymentHistory wechatPaymentHistory) { - wechatPaymentHistory.setCreateTime(LocalDateTime.now()); - return wechatPaymentHistoryMapper.insert(wechatPaymentHistory); - } - - /** - * 修改微信订单表 - * - * @param wechatPaymentHistory 微信订单表 - * @return 结果 - */ - public int update(WechatPaymentHistory wechatPaymentHistory) { - return wechatPaymentHistoryMapper.updateById(wechatPaymentHistory); - } - - /** - * 删除微信订单表信息 - * - * @param id 微信订单表主键 - * @return 结果 - */ - public int deleteById(Long id) { - return wechatPaymentHistoryMapper.deleteById(id); - } +public interface WechatPaymentHistoryService extends IService { } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/AftersaleItemServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/AftersaleItemServiceImpl.java new file mode 100644 index 000000000..90613ed6c --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/AftersaleItemServiceImpl.java @@ -0,0 +1,111 @@ +package com.wzj.soopin.order.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.order.domain.entity.AftersaleItem; +import com.wzj.soopin.order.domain.query.AftersaleItemQuery; +import com.wzj.soopin.order.domain.vo.PageVO; +import com.wzj.soopin.order.mapper.AftersaleItemMapper; +import com.wzj.soopin.order.service.AftersaleItemService; +import com.wzj.soopin.order.utils.PageUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 订单售后Service业务层处理 + * + * + * @author zcc + */ +@Service +public class AftersaleItemServiceImpl extends ServiceImpl implements AftersaleItemService { + @Autowired + private AftersaleItemMapper aftersaleItemMapper; + + /** + * 查询订单售后 + * + * @param id 订单售后主键 + * @return 订单售后 + */ + public AftersaleItem selectById(Long id) { + return aftersaleItemMapper.selectById(id); + } + + /** + * 查询订单售后列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 订单售后 + */ + public List selectList(AftersaleItemQuery query, Pageable page) { +// if (page != null) { +// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); +// } + QueryWrapper qw = new QueryWrapper<>(); + Long memberId = query.getMemberId(); + if (memberId != null) { + qw.eq("member_id", memberId); + } + Long orderId = query.getOrderId(); + if (orderId != null) { + qw.eq("order_id", orderId); + } + Long orderItemId = query.getOrderItemId(); + if (orderItemId != null) { + qw.eq("order_item_id", orderItemId); + } + BigDecimal returnAmount = query.getReturnAmount(); + if (returnAmount != null) { + qw.eq("return_amount", returnAmount); + } + Integer quantity = query.getQuantity(); + if (quantity != null) { + qw.eq("quantity", quantity); + } + return aftersaleItemMapper.selectList(qw); + } + + /** + * 新增订单售后 + * + * @param aftersaleItem 订单售后 + * @return 结果 + */ + public int insert(AftersaleItem aftersaleItem) { + aftersaleItem.setCreateTime(LocalDateTime.now()); + return aftersaleItemMapper.insert(aftersaleItem); + } + + /** + * 修改订单售后 + * + * @param aftersaleItem 订单售后 + * @return 结果 + */ + public int update(AftersaleItem aftersaleItem) { + return aftersaleItemMapper.updateById(aftersaleItem); + } + + /** + * 删除订单售后信息 + * + * @param id 订单售后主键 + * @return 结果 + */ + public int deleteById(Long id) { + return aftersaleItemMapper.deleteById(id); + } + + public IPage pagelist(AftersaleItemQuery query, PageVO page) { + IPage pageParam = PageUtil.initPage(page); + return aftersaleItemMapper.selectAftersale(query, pageParam); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/AftersaleServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/AftersaleServiceImpl.java new file mode 100644 index 000000000..ffefd630c --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/AftersaleServiceImpl.java @@ -0,0 +1,472 @@ +package com.wzj.soopin.order.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wechat.pay.java.service.refund.model.Refund; +import com.wechat.pay.java.service.refund.model.RefundNotification; +import com.wzj.soopin.goods.mapper.SkuMapper; +import com.wzj.soopin.member.domain.po.Member; +import com.wzj.soopin.member.domain.po.MemberWechat; +import com.wzj.soopin.member.mapper.MemberMapper; +import com.wzj.soopin.member.mapper.MemberWechatMapper; +import com.wzj.soopin.order.service.AftersaleService; +import com.wzj.soopin.order.convert.OrderOperateHistoryConvert; +import com.wzj.soopin.order.domain.entity.*; +import com.wzj.soopin.order.domain.form.DealWithAftersaleForm; +import com.wzj.soopin.order.domain.form.ManagerAftersaleOrderForm; +import com.wzj.soopin.order.domain.vo.*; +import com.wzj.soopin.order.mapper.*; +import com.wzj.soopin.order.wechat.WechatPayService; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.event.Constants; +import org.dromara.common.core.enums.AftersaleStatus; +import org.dromara.common.core.enums.OrderRefundStatus; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单售后Service业务层处理 + * + * @author zcc + */ +@Service +@Slf4j +public class AftersaleServiceImpl extends ServiceImpl implements AftersaleService { + @Autowired + private AftersaleMapper aftersaleMapper; + + @Autowired + private OrderMapper orderMapper; + + @Autowired + private OrderItemMapper orderItemMapper; + + @Autowired + private OrderOperateHistoryMapper orderOperateHistoryMapper; + + @Autowired + private MemberMapper memberMapper; + + @Autowired + private OrderOperateHistoryConvert historyConvert; + @Autowired + private SkuMapper skuMapper; +// @Autowired +// private MemberCouponService memberCouponService; + @Autowired + private WechatPaymentHistoryMapper wechatPaymentHistoryMapper; + @Autowired + private MemberWechatMapper memberWechatMapper; + @Autowired(required = false) + private WechatPayService wechatPayService; + @Autowired + private OrderOperateHistoryMapper operateHistoryMapper; + + /** + * 查询订单售后 + * + * @param id 订单售后主键 + * @return 订单售后 + */ + public ManagerRefundOrderDetailVO selectById(Long id) { + Order order = orderMapper.selectById(id); + if (order == null) { + throw new RuntimeException("无该订单信息"); + } + ManagerRefundOrderDetailVO result = new ManagerRefundOrderDetailVO(); + //订单基本信息 + result.setOrderId(order.getId()); + result.setOrderSn(order.getOrderSn()); + result.setCreateTime(order.getCreateTime()); + result.setPayType(order.getPayType()); + result.setPayTime(order.getPaymentTime()); + result.setStatus(order.getStatus()); + result.setExpressName(order.getDeliveryCompany()); + result.setDeliveryTime(order.getDeliveryTime()); + result.setExpressNo(order.getDeliverySn()); + result.setTotalAmount(order.getTotalAmount()); + result.setPayAmount(order.getPayAmount()); + //用户信息 + Member member = memberMapper.selectById(order.getMemberId()); + result.setNickName(member.getNickname()); + result.setPhone(member.getPhoneHidden()); + //收货信息 + OrderAddressVO orderAddressVO = new OrderAddressVO(); + orderAddressVO.setAddress(order.getReceiverDetailAddress()); + orderAddressVO.setName(order.getReceiverName()); + orderAddressVO.setUserPhone(order.getReceiverPhone()); + orderAddressVO.setArea(order.getReceiverProvince() + order.getReceiverCity() + order.getReceiverDistrict()); + result.setAddressInfo(orderAddressVO); + //orderItem + QueryWrapper orderItemQw = new QueryWrapper<>(); + orderItemQw.eq("order_id", id); + List orderItemList = orderItemMapper.selectList(orderItemQw); + List productList = new ArrayList<>(); + orderItemList.forEach(orderItem -> { + ManagerOrderProductVO productVO = new ManagerOrderProductVO(); + productVO.setPic(orderItem.getPic()); + productVO.setSpData(orderItem.getSpData()); + productVO.setProductName(orderItem.getProductName()); + productVO.setSalePrice(orderItem.getSalePrice()); + productVO.setBuyNum(orderItem.getQuantity()); + productVO.setProductId(orderItem.getProductId()); + productList.add(productVO); + }); + result.setProductList(productList); + //售后信息 + QueryWrapper aftersaleQw = new QueryWrapper<>(); + aftersaleQw.eq("order_id", order.getId()); + aftersaleQw.orderByDesc("create_time"); + List aftersaleList = aftersaleMapper.selectList(aftersaleQw); + List refundInfoList = new ArrayList<>(); + aftersaleList.forEach(aftersale -> { + RefundInfoVO refundInfo = new RefundInfoVO(); + refundInfo.setId(aftersale.getId()); + refundInfo.setApplyRefundType(aftersale.getType()); + refundInfo.setApplyRefundTime(aftersale.getCreateTime()); + refundInfo.setRefundAmount(aftersale.getReturnAmount()); + refundInfo.setReason(aftersale.getReason()); + refundInfo.setDescription(aftersale.getDescription()); + refundInfo.setProofPics(aftersale.getProofPics()); + refundInfo.setRefundStatus(aftersale.getStatus()); + refundInfo.setRefundWpCode(aftersale.getRefundWpCode()); + refundInfo.setRefundWaybillCode(aftersale.getRefundWaybillCode()); + refundInfo.setRefundStatus(aftersale.getStatus()); + refundInfo.setRemark(aftersale.getHandleNote()); + refundInfoList.add(refundInfo); + }); + result.setRefundInfoList(refundInfoList); + return result; + } + + /** + * 查询订单售后列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 订单售后 + */ + public List selectList(ManagerAftersaleOrderForm query, Pageable page) { + if (page != null) { +// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + if (StrUtil.isNotBlank(query.getOrderSn()) && query.getOrderSn().length() > 7) { + query.setOrderSn(query.getOrderSn().substring(7)); + } + List managerRefundOrderVOS = aftersaleMapper.selectManagerRefundOrder(query); + if (CollectionUtil.isEmpty(managerRefundOrderVOS)) { + return managerRefundOrderVOS; + } + Set idSet = managerRefundOrderVOS.stream().map(ManagerRefundOrderVO::getOrderId).collect(Collectors.toSet()); + //查一下orderSn集合 + QueryWrapper orderQw = new QueryWrapper<>(); + orderQw.in("id", idSet); + Map orderMap = orderMapper.selectList(orderQw).stream().collect(Collectors.toMap(Order::getId, it -> it)); + //封装售后单商品数据 + QueryWrapper orderItemQw = new QueryWrapper<>(); + orderItemQw.in("order_id", idSet); + Map> orderItemMap = orderItemMapper.selectList(orderItemQw).stream().collect(Collectors.groupingBy(OrderItem::getOrderId)); + managerRefundOrderVOS.forEach(vo -> { + Order order = orderMap.get(vo.getOrderId()); + vo.setOrderSn(order.getOrderSn()); + List orderItemList = orderItemMap.get(vo.getOrderId()); + List productList = new ArrayList<>(); + orderItemList.forEach(item -> { + ManagerOrderProductVO productVO = new ManagerOrderProductVO(); + productVO.setProductName(item.getProductName()); + productVO.setSalePrice(item.getSalePrice()); + productVO.setPic(item.getPic()); + productVO.setBuyNum(item.getQuantity()); + productVO.setProductId(item.getProductId()); + productVO.setSpData(item.getSpData()); + productList.add(productVO); + }); + vo.setProductList(productList); + }); + return managerRefundOrderVOS; + } + + /** + * 新增订单售后 + * + * @param aftersale 订单售后 + * @return 结果 + */ + public int insert(Aftersale aftersale) { + aftersale.setCreateTime(LocalDateTime.now()); + return aftersaleMapper.insert(aftersale); + } + + /** + * 修改订单售后 + * + * @param aftersale 订单售后 + * @return 结果 + */ + public int update(Aftersale aftersale) { + return aftersaleMapper.updateById(aftersale); + } + + /** + * 删除订单售后信息 + * + * @param id 订单售后主键 + * @return 结果 + */ + public int deleteById(Long id) { + return aftersaleMapper.deleteById(id); + } + + /** + * 售后处理 + * + * @param request 请求体 + * @param + * @return + */ + @Transactional(rollbackFor = Exception.class) + public void dealWith(DealWithAftersaleForm request, Long userId, String optUserName) { + Order order = orderMapper.selectById(request.getOrderId()); + if (order == null) { + throw new RuntimeException("无该订单"); + } + QueryWrapper aftersaleQw = new QueryWrapper<>(); + aftersaleQw.eq("order_id", request.getOrderId()); + if (request.getOptType() == 3) { + aftersaleQw.eq("status", 1); + } else { + aftersaleQw.eq("status", 0); + } + Aftersale aftersale = aftersaleMapper.selectOne(aftersaleQw); + if (aftersale == null) { + throw new RuntimeException("没有售后单"); + } + //售后状态与售后类型是否对应 + if (Constants.OptType.AGREE.equals(request.getOptType()) || Constants.OptType.REFUSE.equals(request.getOptType())) { + if (!AftersaleStatus.APPLY.getType().equals(aftersale.getStatus())) { + throw new RuntimeException("订单状态错误,请刷新页面后重试!"); + } + } else { + if (!AftersaleStatus.WAIT.getType().equals(aftersale.getStatus())) { + throw new RuntimeException("订单状态错误,请刷新页面后重试!"); + } + } + //拒绝则理由必填 + if (Constants.OptType.REFUSE.equals(request.getOptType()) && StrUtil.isBlank(request.getRemark())) { + throw new RuntimeException("请填写拒绝理由"); + } + LocalDateTime optDate = LocalDateTime.now(); + //要创建的订单操作记录,status后续判断再设置 + OrderOperateHistory optHistory = new OrderOperateHistory(); + optHistory.setOrderId(order.getId()); + optHistory.setOrderSn(order.getOrderSn()); + optHistory.setOperateMan("后台管理员"); + optHistory.setCreateTime(optDate); + optHistory.setCreateBy(userId); + optHistory.setUpdateBy(userId); + optHistory.setUpdateTime(optDate); + //封装售后wrapper + UpdateWrapper aftersaleWrapper = new UpdateWrapper<>(); + aftersaleWrapper.eq("order_id", request.getOrderId()); + aftersaleWrapper.eq("status", AftersaleStatus.APPLY.getType()); + aftersaleWrapper.set("handle_man", optUserName); + aftersaleWrapper.set("update_time", optDate); + aftersaleWrapper.set("handle_time", optDate); + aftersaleWrapper.set("update_by", userId); + //封装订单wrapper + UpdateWrapper orderWrapper = new UpdateWrapper<>(); + orderWrapper.eq("id", request.getOrderId()); + orderWrapper.set("update_time", optDate); + orderWrapper.set("update_by", userId); + //更新订单、售后单,创建操作记录 + if (request.getOptType().equals(Constants.OptType.REFUSE)) { + aftersaleWrapper.set("status", AftersaleStatus.REJECT.getType()); + aftersaleWrapper.set("handle_note", request.getRemark()); + orderWrapper.set("aftersale_status", OrderRefundStatus.NO_REFUND.getType()); + optHistory.setOrderStatus(14); + } else if (request.getOptType().equals(Constants.OptType.AGREE)) { + aftersaleWrapper.set("status", AftersaleStatus.WAIT.getType()); + orderWrapper.set("aftersale_status", Objects.equals(aftersale.getType(), 1) ? 3 : 2); + optHistory.setOrderStatus(12); + } else { + //如果是退货退款 order身上的售后状态应该是保持不变的 仅退款的话就进入退款了 + orderWrapper.set("aftersale_status", 3); + int row = orderMapper.update(null, orderWrapper); + if (row != 1) { + throw new RuntimeException("修改订单状态失败"); + } + } + int rows = aftersaleMapper.update(null, aftersaleWrapper); +// if (rows < 1) { +// throw new RuntimeException("更新售后单失败"); +// } + rows = orderMapper.update(null, orderWrapper); + if (rows < 1) { + throw new RuntimeException("更新订单失败"); + } + rows = orderOperateHistoryMapper.insert(optHistory); + if (rows < 1) { + throw new RuntimeException("创建订单操作记录失败"); + } + // 是否需要发起退款 + if ((request.getOptType() == Constants.OptType.GIVING || (request.getOptType() == Constants.OptType.AGREE && aftersale.getType() == 1))) { + tradeRefund(aftersale, order, optDate, userId); + } + } + + public void tradeRefund(Aftersale returnApply, Order order, LocalDateTime optDate, Long userId) { + //查一下微信订单 + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("order_id", order.getPayId()).eq("op_type", 1); + WechatPaymentHistory history = wechatPaymentHistoryMapper.selectOne(qw); + //查用户的微信信息 + QueryWrapper wechatQw = new QueryWrapper<>(); + wechatQw.eq("member_id", order.getMemberId()); + MemberWechat memberWechat = memberWechatMapper.selectOne(wechatQw); + //查订单item + QueryWrapper itemQw = new QueryWrapper<>(); + itemQw.eq("order_id", order.getId()); + OrderItem orderItem = orderItemMapper.selectList(itemQw).get(0); + //开始退款 + Refund wechatResponse = wechatPayService.refundPay(returnApply.getId() + "", + order.getPayId() + "", + "https://mall.ichengle.top/api/no-auth/wechat/weChatRefundNotify", + returnApply.getReturnAmount().multiply(new BigDecimal("100")).longValue(), + history.getMoney().multiply(new BigDecimal("100")).longValue(), returnApply.getReason()); + log.info("发起微信退款返回信息,tradeRefund:{}", JSONObject.toJSONString(wechatResponse == null ? "" : wechatResponse)); + + if (wechatResponse != null && Arrays.asList("PROCESSING", "SUCCESS").contains(wechatResponse.getStatus().name())) { + qw = new QueryWrapper<>(); + qw.eq("order_id", order.getId()).eq("op_type", 3); + WechatPaymentHistory refundHistory = wechatPaymentHistoryMapper.selectOne(qw); + if (refundHistory == null) { + WechatPaymentHistory wechatPaymentHistory = new WechatPaymentHistory(); + wechatPaymentHistory.setPaymentId(wechatResponse.getRefundId()); + wechatPaymentHistory.setMemberId(order.getMemberId()); + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); + queryWrapper.eq(WechatPaymentHistory::getOrderId, order.getPayId()); + queryWrapper.eq(WechatPaymentHistory::getOpType, Constants.PaymentOpType.PAY); + WechatPaymentHistory payHistory = wechatPaymentHistoryMapper.selectOne(queryWrapper); + wechatPaymentHistory.setOpenid(payHistory.getOpenid()); + wechatPaymentHistory.setTitle(orderItem.getProductName()); + wechatPaymentHistory.setOrderId(order.getId()); + wechatPaymentHistory.setMoney(returnApply.getReturnAmount().multiply(new BigDecimal("100"))); + wechatPaymentHistory.setOpType(3); + wechatPaymentHistory.setPaymentStatus(0); + wechatPaymentHistory.setResponseBody(JSON.toJSONString(wechatResponse)); + wechatPaymentHistory.setCreateTime(optDate); + wechatPaymentHistory.setUpdateTime(optDate); + wechatPaymentHistory.setCreateBy(userId); + wechatPaymentHistory.setUpdateBy(userId); + wechatPaymentHistoryMapper.insert(wechatPaymentHistory); + } else { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("id", refundHistory.getId()) + .set("payment_id", wechatResponse.getRefundId()).set("update_time", optDate); + wechatPaymentHistoryMapper.update(null, updateWrapper); + } + } + } + + /** + * 订单退款回调MQ + * + * @param weChatRefundNotify + */ + @Transactional + public void refundOrderExc(RefundNotification weChatRefundNotify) { + log.info("收到订单回调MQ:" + JSONObject.toJSONString(weChatRefundNotify)); + if ("PROCESSING".equals(weChatRefundNotify.getRefundStatus().name())) { + return; + } + //查一下微信订单 + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("payment_id", weChatRefundNotify.getRefundId()).eq("op_type", 3); + WechatPaymentHistory history = wechatPaymentHistoryMapper.selectOne(qw); + if (history == null) { + log.info("未找到退款单"); + throw new RuntimeException(); + } + LocalDateTime optDate = LocalDateTime.now(); + QueryWrapper orderQw = new QueryWrapper<>(); + orderQw.eq("id", history.getOrderId()); + Order order = orderMapper.selectOne(orderQw); + if (order.getStatus() == OrderRefundStatus.SUCCESS.getType()) { + log.info("订单已经是退款成功状态"); + throw new RuntimeException(); + } + QueryWrapper aftersaleQw = new QueryWrapper<>(); + aftersaleQw.eq("order_id", history.getOrderId()).eq("status", AftersaleStatus.WAIT.getType()); + if ("SUCCESS".equals(weChatRefundNotify.getRefundStatus().name())) { + //更改订单表 + UpdateWrapper orderUpdateWrapper = new UpdateWrapper<>(); + orderUpdateWrapper.eq("id", history.getOrderId()) + .set("aftersale_status", OrderRefundStatus.SUCCESS.getType()); + orderMapper.update(null, orderUpdateWrapper); + + //更改 售后表 + UpdateWrapper aftersaleWrapper = new UpdateWrapper<>(); + aftersaleWrapper.eq("order_id", history.getOrderId()).set("status", AftersaleStatus.SUCCESS.getType()); + aftersaleMapper.update(null, aftersaleWrapper); + + //更改 微信表 + UpdateWrapper paymentWrapper = new UpdateWrapper<>(); + paymentWrapper.eq("payment_id", weChatRefundNotify.getRefundId()).eq("op_type", 3) + .set("payment_status", 1); + wechatPaymentHistoryMapper.update(null, paymentWrapper); + OrderOperateHistory optHistory = new OrderOperateHistory(); + optHistory.setOrderId(order.getId()); + optHistory.setOperateMan("系统"); + optHistory.setCreateTime(optDate); + optHistory.setCreateBy(order.getMemberId()); + optHistory.setUpdateBy(order.getMemberId()); + optHistory.setUpdateTime(optDate); + optHistory.setOrderStatus(13); + operateHistoryMapper.insert(optHistory); + // 回滚商品和sku销量 + OrderItem orderItem = orderItemMapper.selectOne(new QueryWrapper().eq("order_id", order.getId())); + skuMapper.updateStockById(orderItem.getSkuId(), LocalDateTime.now(), -1 * orderItem.getQuantity()); + //退还优惠券 +// if (order.getMemberCouponId() != null) { +// memberCouponService.backCoupon(Arrays.asList(order.getMemberCouponId())); +// } + } else { + //更改订单表 + UpdateWrapper orderUpdateWrapper = new UpdateWrapper<>(); + orderUpdateWrapper.eq("id", history.getOrderId()) + .set("aftersale_status", OrderRefundStatus.FAIL.getType()); + orderMapper.update(null, orderUpdateWrapper); + } + } + + public R log(Long orderId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(OrderOperateHistory::getOrderId, orderId); + wrapper.in(OrderOperateHistory::getOrderStatus, Arrays.asList(11, 12, 13, 14)); + wrapper.orderByDesc(OrderOperateHistory::getCreateTime); + List historyList = orderOperateHistoryMapper.selectList(wrapper); + return R.ok(historyList); + } + + public Aftersale queryAfterSale(Long orderId) { + QueryWrapper itemQw = new QueryWrapper<>(); + itemQw.eq("order_id",orderId); + itemQw.in("status",Arrays.asList(AftersaleStatus.APPLY.getType(),AftersaleStatus.WAIT.getType())); + return aftersaleMapper.selectOne(itemQw); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderDeliveryHistoryServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderDeliveryHistoryServiceImpl.java new file mode 100644 index 000000000..e05517ce7 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderDeliveryHistoryServiceImpl.java @@ -0,0 +1,104 @@ +package com.wzj.soopin.order.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.order.domain.entity.OrderDeliveryHistory; +import com.wzj.soopin.order.domain.query.OrderDeliveryHistoryQuery; +import com.wzj.soopin.order.domain.vo.OrderDeliveryHistoryVO; +import com.wzj.soopin.order.domain.vo.PageVO; +import com.wzj.soopin.order.mapper.OrderDeliveryHistoryMapper; +import com.wzj.soopin.order.service.OrderDeliveryHistoryService; +import com.wzj.soopin.order.utils.PageUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 订单发货记录Service业务层处理 + * + * + * @author zcc + */ +@Service +public class OrderDeliveryHistoryServiceImpl extends ServiceImpl implements OrderDeliveryHistoryService { + @Autowired + private OrderDeliveryHistoryMapper orderDeliveryHistoryMapper; + + /** + * 查询订单发货记录 + * + * @param id 订单发货记录主键 + * @return 订单发货记录 + */ + public OrderDeliveryHistory selectById(Long id) { + return orderDeliveryHistoryMapper.selectById(id); + } + + /** + * 查询订单发货记录列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 订单发货记录 + */ + public List selectList(OrderDeliveryHistoryQuery query, Pageable page) { + if (page != null) { +// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + Long orderId = query.getOrderId(); + if (orderId != null) { + qw.eq("order_id", orderId); + } + String deliveryCompany = query.getDeliveryCompany(); + if (!StringUtils.isEmpty(deliveryCompany)) { + qw.eq("delivery_company", deliveryCompany); + } + String deliverySn = query.getDeliverySn(); + if (!StringUtils.isEmpty(deliverySn)) { + qw.eq("delivery_sn", deliverySn); + } + return orderDeliveryHistoryMapper.selectList(qw); + } + + /** + * 新增订单发货记录 + * + * @param orderDeliveryHistory 订单发货记录 + * @return 结果 + */ + public int insert(OrderDeliveryHistory orderDeliveryHistory) { + orderDeliveryHistory.setCreateTime(LocalDateTime.now()); + return orderDeliveryHistoryMapper.insert(orderDeliveryHistory); + } + + /** + * 修改订单发货记录 + * + * @param orderDeliveryHistory 订单发货记录 + * @return 结果 + */ + public int update(OrderDeliveryHistory orderDeliveryHistory) { + return orderDeliveryHistoryMapper.updateById(orderDeliveryHistory); + } + + /** + * 删除订单发货记录信息 + * + * @param id 订单发货记录主键 + * @return 结果 + */ + public int deleteById(Long id) { + return orderDeliveryHistoryMapper.deleteById(id); + } + + public IPage pagelist(OrderDeliveryHistoryQuery query, PageVO page) { + IPage pageParam = PageUtil.initPage(page); + return orderDeliveryHistoryMapper.selectOderDeliveryHistory(query, pageParam); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderItemServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderItemServiceImpl.java new file mode 100644 index 000000000..9dcdf167b --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderItemServiceImpl.java @@ -0,0 +1,181 @@ +package com.wzj.soopin.order.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.member.domain.po.Member; +import com.wzj.soopin.order.domain.dto.OrderProductListDTO; +import com.wzj.soopin.order.domain.entity.OrderItem; +import com.wzj.soopin.order.domain.query.OrderItemQuery; +import com.wzj.soopin.order.domain.vo.PageVO; +import com.wzj.soopin.order.mapper.OrderItemMapper; +import com.wzj.soopin.order.service.OrderItemService; +import com.wzj.soopin.order.utils.PageUtil; +import org.apache.commons.lang3.StringUtils; +import org.dromara.common.core.utils.IDGenerator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +/** + * 订单中所包含的商品Service业务层处理 + * + * + * @author zcc + */ +@Service +public class OrderItemServiceImpl extends ServiceImpl implements OrderItemService { + @Autowired + private OrderItemMapper orderItemMapper; + + /** + * 查询订单中所包含的商品 + * + * @param id 订单中所包含的商品主键 + * @return 订单中所包含的商品 + */ + public OrderItem selectById(Long id) { + return orderItemMapper.selectById(id); + } + + /** + * 查询订单中所包含的商品列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 订单中所包含的商品 + */ + public List selectList(OrderItemQuery query, Pageable page) { + if (page != null) { +// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + Long orderId = query.getOrderId(); + if (orderId != null) { + qw.eq("order_id", orderId); + } + Long productId = query.getProductId(); + if (productId != null) { + qw.eq("product_id", productId); + } + String outProductId = query.getOutProductId(); + if (!StringUtils.isEmpty(outProductId)) { + qw.eq("out_product_id", outProductId); + } + Long skuId = query.getSkuId(); + if (skuId != null) { + qw.eq("sku_id", skuId); + } + String outSkuId = query.getOutSkuId(); + if (!StringUtils.isEmpty(outSkuId)) { + qw.eq("out_sku_id", outSkuId); + } + Long productSnapshotId = query.getProductSnapshotId(); + if (productSnapshotId != null) { + qw.eq("product_snapshot_id", productSnapshotId); + } + Long skuSnapshotId = query.getSkuSnapshotId(); + if (skuSnapshotId != null) { + qw.eq("sku_snapshot_id", skuSnapshotId); + } + String pic = query.getPic(); + if (!StringUtils.isEmpty(pic)) { + qw.eq("pic", pic); + } + String productNameLike = query.getProductNameLike(); + if (!StringUtils.isEmpty(productNameLike)) { + qw.like("product_name", productNameLike); + } + BigDecimal salePrice = query.getSalePrice(); + if (salePrice != null) { + qw.eq("sale_price", salePrice); + } + BigDecimal purchasePrice = query.getPurchasePrice(); + if (purchasePrice != null) { + qw.eq("purchase_price", purchasePrice); + } + Integer quantity = query.getQuantity(); + if (quantity != null) { + qw.eq("quantity", quantity); + } + Long productCategoryId = query.getProductCategoryId(); + if (productCategoryId != null) { + qw.eq("product_category_id", productCategoryId); + } + String spData = query.getSpData(); + if (!StringUtils.isEmpty(spData)) { + qw.eq("sp_data", spData); + } + return orderItemMapper.selectList(qw); + } + + /** + * 新增订单中所包含的商品 + * + * @param orderItem 订单中所包含的商品 + * @return 结果 + */ + public int insert(OrderItem orderItem) { + orderItem.setCreateTime(LocalDateTime.now()); + return orderItemMapper.insert(orderItem); + } + + /** + * 修改订单中所包含的商品 + * + * @param orderItem 订单中所包含的商品 + * @return 结果 + */ + public int update(OrderItem orderItem) { + return orderItemMapper.updateById(orderItem); + } + + /** + * 删除订单中所包含的商品信息 + * + * @param id 订单中所包含的商品主键 + * @return 结果 + */ + public int deleteById(Long id) { + return orderItemMapper.deleteById(id); + } + + @Transactional + public void saveOrderItem(Member member, LocalDateTime optTime, + Long orderId, List list){ + List addOrderItemList = new ArrayList<>(); + list.forEach(item -> { + OrderItem orderItem = new OrderItem(); + orderItem.setId(IDGenerator.generateId()); + orderItem.setOrderId(orderId); + orderItem.setProductId(item.getProduct().getId()); + orderItem.setOutProductId(item.getProduct().getOutProductId()); + orderItem.setSkuId(item.getSku().getId()); + orderItem.setOutSkuId(item.getSku().getOutSkuId()); + orderItem.setPic(item.getSku().getPic()); + orderItem.setProductName(item.getProduct().getName()); + orderItem.setSalePrice(item.getSku().getPrice()); + orderItem.setQuantity(item.getQuantity()); + orderItem.setProductCategoryId(item.getProduct().getCategoryId()); + orderItem.setSpData(item.getSku().getSpData()); + orderItem.setCreateBy(member.getId()); + orderItem.setCreateTime(optTime); + addOrderItemList.add(orderItem); + }); + boolean flag = saveBatch(addOrderItemList); + if (!flag){ + throw new RuntimeException("新增订单item失败"); + } + } + + public IPage pagelist(OrderItemQuery query, PageVO page) { + IPage pageParam = PageUtil.initPage(page); + return orderItemMapper.selectOrderItem(query, pageParam); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderOperateHistoryServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderOperateHistoryServiceImpl.java new file mode 100644 index 000000000..81e2e3d98 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderOperateHistoryServiceImpl.java @@ -0,0 +1,110 @@ +package com.wzj.soopin.order.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.order.domain.entity.OrderItem; +import com.wzj.soopin.order.domain.entity.OrderOperateHistory; +import com.wzj.soopin.order.domain.query.OrderOperateHistoryQuery; +import com.wzj.soopin.order.domain.vo.PageVO; +import com.wzj.soopin.order.mapper.OrderOperateHistoryMapper; +import com.wzj.soopin.order.service.OrderOperateHistoryService; +import com.wzj.soopin.order.utils.PageUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; + +/** + * 订单操作历史记录Service业务层处理 + * + * + * @author zcc + */ +@Service +public class OrderOperateHistoryServiceImpl extends ServiceImpl implements OrderOperateHistoryService { + @Autowired + private OrderOperateHistoryMapper orderOperateHistoryMapper; + + /** + * 查询订单操作历史记录 + * + * @param id 订单操作历史记录主键 + * @return 订单操作历史记录 + */ + public OrderOperateHistory selectById(Long id) { + return orderOperateHistoryMapper.selectById(id); + } + + /** + * 查询订单操作历史记录列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 订单操作历史记录 + */ + public List selectList(OrderOperateHistoryQuery query, Pageable page) { + if (page != null) { +// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + String orderSn = query.getOrderSn(); + if (StrUtil.isNotBlank(orderSn)) { + qw.eq("order_sn", orderSn); + } + String operateMan = query.getOperateMan(); + if (!StringUtils.isEmpty(operateMan)) { + qw.eq("operate_man", operateMan); + } + Integer orderStatus = query.getOrderStatus(); + if (orderStatus != null) { + qw.eq("order_status", orderStatus); + } + String note = query.getNote(); + if (!StringUtils.isEmpty(note)) { + qw.eq("note", note); + } + qw.orderByDesc("create_time"); + return orderOperateHistoryMapper.selectList(qw); + } + + /** + * 新增订单操作历史记录 + * + * @param orderOperateHistory 订单操作历史记录 + * @return 结果 + */ + public int insert(OrderOperateHistory orderOperateHistory) { + orderOperateHistory.setCreateTime(LocalDateTime.now()); + return orderOperateHistoryMapper.insert(orderOperateHistory); + } + + /** + * 修改订单操作历史记录 + * + * @param orderOperateHistory 订单操作历史记录 + * @return 结果 + */ + public int update(OrderOperateHistory orderOperateHistory) { + return orderOperateHistoryMapper.updateById(orderOperateHistory); + } + + /** + * 删除订单操作历史记录信息 + * + * @param id 订单操作历史记录主键 + * @return 结果 + */ + public int deleteById(Long id) { + return orderOperateHistoryMapper.deleteById(id); + } + + public IPage pagelist(OrderOperateHistoryQuery query, PageVO page) { + IPage pageParam = PageUtil.initPage(page); + return orderOperateHistoryMapper.selectOrderOperateHistory(query, pageParam); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java new file mode 100644 index 000000000..d0230fb18 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java @@ -0,0 +1,433 @@ +package com.wzj.soopin.order.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.goods.convert.SkuConvert; +import com.wzj.soopin.goods.mapper.ProductMapper; +import com.wzj.soopin.goods.mapper.SkuMapper; +import com.wzj.soopin.member.domain.po.Member; +import com.wzj.soopin.order.convert.OrderConvert; +import com.wzj.soopin.order.convert.OrderOperateHistoryConvert; +import com.wzj.soopin.order.domain.entity.Order; +import com.wzj.soopin.order.domain.entity.OrderDeliveryHistory; +import com.wzj.soopin.order.domain.entity.OrderItem; +import com.wzj.soopin.order.domain.entity.OrderOperateHistory; +import com.wzj.soopin.order.domain.form.DeliverProductForm; +import com.wzj.soopin.order.domain.form.ManagerOrderQueryForm; +import com.wzj.soopin.order.domain.query.OrderH5Query; +import com.wzj.soopin.order.domain.vo.*; +import com.wzj.soopin.order.mapper.OrderDeliveryHistoryMapper; +import com.wzj.soopin.order.mapper.OrderItemMapper; +import com.wzj.soopin.order.mapper.OrderMapper; +import com.wzj.soopin.order.mapper.OrderOperateHistoryMapper; +import com.wzj.soopin.order.service.OrderService; +import com.wzj.soopin.order.utils.SecurityUtils; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.event.Constants; +import org.dromara.common.core.utils.PhoneUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.wzj.soopin.member.mapper.MemberAddressMapper; +import com.wzj.soopin.member.mapper.MemberCartMapper; +import com.wzj.soopin.member.mapper.MemberMapper; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 订单表Service业务层处理 + * + * + * @author zcc + */ +@Service +public class OrderServiceImpl extends ServiceImpl implements OrderService { + @Autowired + private OrderMapper orderMapper; + @Autowired + private OrderConvert orderConvert; + @Autowired + private OrderItemMapper orderItemMapper; + @Autowired + private MemberAddressMapper memberAddressMapper; + @Autowired + private SkuMapper skuMapper; + @Autowired + private ProductMapper productMapper; + @Autowired + private SkuConvert skuConvert; + @Autowired + private OrderItemServiceImpl orderItemService; + @Autowired + private OrderOperateHistoryMapper orderOperateHistoryMapper; + @Autowired + private MemberCartMapper memberCartMapper; + @Autowired + private MemberMapper memberMapper; + + @Autowired + private OrderDeliveryHistoryMapper orderDeliveryHistoryMapper; + @Autowired + private OrderOperateHistoryConvert historyConvert; + + /** + * 查询订单表 + * + * @param id 订单表主键 + * @return 订单表 + */ + public ManagerOrderDetailVO selectById(Long id) { + Order order = orderMapper.selectById(id); + if (order == null){ + throw new RuntimeException("查不到订单信息"); + } + ManagerOrderDetailVO managerOrderDetailVO = new ManagerOrderDetailVO(); + //封装订单信息 + managerOrderDetailVO.setOrderId(id); + managerOrderDetailVO.setCouponAmount(order.getCouponAmount()); + managerOrderDetailVO.setOrderSn(order.getOrderSn()); + managerOrderDetailVO.setOrderStatus(order.getStatus()); + managerOrderDetailVO.setCreateTime(order.getCreateTime()); + managerOrderDetailVO.setDeliveryTime(order.getDeliveryTime()); + managerOrderDetailVO.setExpressName(order.getDeliveryCompany()); + managerOrderDetailVO.setExpressNo(order.getDeliverySn()); + managerOrderDetailVO.setPayAmount(order.getPayAmount()); + managerOrderDetailVO.setPayTime(order.getPaymentTime()); + managerOrderDetailVO.setPayType(order.getPayType()); + managerOrderDetailVO.setTotalAmount(order.getTotalAmount()); + managerOrderDetailVO.setPayAmount(order.getPayAmount()); + managerOrderDetailVO.setReceiveTime(order.getReceiveTime()); + //封装订单地址信息 + ManagerOrderAddressVo managerOrderAddressVo = new ManagerOrderAddressVo(); + managerOrderAddressVo.setUserPhone(order.getReceiverPhone()); + managerOrderAddressVo.setAddress(order.getReceiverDetailAddress()); + managerOrderAddressVo.setArea( + order.getReceiverProvince() + + order.getReceiverCity() + + order.getReceiverDistrict()); + managerOrderAddressVo.setName(order.getReceiverName()); + managerOrderDetailVO.setAddressInfo(managerOrderAddressVo); + //查询会员信息 + Member member = memberMapper.selectById(order.getMemberId()); + managerOrderDetailVO.setUserName(member.getNickname()); + managerOrderDetailVO.setUserPhone(member.getPhoneHidden()); + //查询购买商品信息 + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("order_id", order.getId()); + List orderItemList = orderItemMapper.selectList(qw); + List productList = new ArrayList<>(); + orderItemList.forEach(item -> { + ManagerOrderProductVO productVO = new ManagerOrderProductVO(); + productVO.setProductId(item.getProductId()); + productVO.setBuyNum(item.getQuantity()); + productVO.setPic(item.getPic()); + productVO.setProductName(item.getProductName()); + productVO.setSalePrice(item.getSalePrice()); + productVO.setSpData(item.getSpData()); + productList.add(productVO); + }); + managerOrderDetailVO.setProductInfo(productList); + return managerOrderDetailVO; + } + + /** + * 查询订单表列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 订单表 + */ + public PageImpl selectList(ManagerOrderQueryForm query, Pageable page) { +// if (page != null) { +//// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); +// } +// if (!StringUtils.isEmpty(query.getUserPhone())){ +//// query.setUserPhone(AesCryptoUtils.encrypt(aesKey, query.getUserPhone())); +// } + List managerOrderVOList = orderMapper.selectManagerOrderPage(query); + if (CollectionUtil.isEmpty(managerOrderVOList)){ + return new PageImpl<>(managerOrderVOList, page, 0); + } + long total = managerOrderVOList.size(); + Map orderMap = managerOrderVOList.stream().collect(Collectors.toMap(ManagerOrderVO::getId, it -> it, (v1,v2) -> v2, LinkedHashMap::new)); + //查orderItem + QueryWrapper qw = new QueryWrapper<>(); + qw.in("order_id", orderMap.keySet()); + Map> groupedOrderItemMap = orderItemMapper.selectList(qw) + .stream().collect(Collectors.groupingBy(OrderItem::getOrderId)); + groupedOrderItemMap.keySet().forEach(key -> { + ManagerOrderVO managerOrderVO = orderMap.get(key); + managerOrderVO.setBuyNum(0); + List orderItemList = groupedOrderItemMap.get(key); + List addProductList = new ArrayList<>(); + orderItemList.forEach(item -> { + ManagerOrderProductVO vo = new ManagerOrderProductVO(); + vo.setProductName(item.getProductName()); + vo.setSalePrice(item.getSalePrice()); + vo.setPic(item.getPic()); + vo.setBuyNum(item.getQuantity()); + vo.setProductId(item.getProductId()); + vo.setSpData(item.getSpData()); + addProductList.add(vo); + managerOrderVO.setBuyNum(managerOrderVO.getBuyNum() + item.getQuantity()); + }); + managerOrderVO.setProductList(addProductList); + }); + return new PageImpl<>(new ArrayList<>(orderMap.values()), page, total); + } + + /** + * 新增订单表 + * + * @param order 订单表 + * @return 结果 + */ + public R insert(Order order) { + order.setCreateTime(LocalDateTime.now()); + int insert = orderMapper.insert(order); + if (insert>1){ + return R.fail("订单创建失败"); + }else { + return R.ok(order); + } + } + + /** + * 修改订单表 + * + * @param order 订单表 + * @return 结果 + */ + public R update(Order order) { + int update = orderMapper.updateById(order); + if (update>1){ + return R.fail("订单修改失败"); + }else { + return R.ok(order); + } + } + + /** + * 删除订单表信息 + * + * @param id 订单表主键 + * @return 结果 + */ + public R deleteById(Long id) { + Order order = orderMapper.selectById(id); + + if (order == null) { + return R.fail("订单不存在"); + } + int affectedRows = orderMapper.deleteById(id); + + return affectedRows > 0 ? R.ok(order) : R.fail("删除失败"); + } + + public Page queryOrderPage(OrderH5Query query, Pageable pageReq) { + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("member_id", SecurityUtils.getUserId()); + IPage page = new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(); + page.setCurrent(pageReq.getPageNumber()) + .setSize(pageReq.getPageSize()); + if (CollUtil.isEmpty(pageReq.getSort())) { + pageReq.getSort().forEach(it -> { + qw.orderBy(true, it.getDirection().isAscending(), it.getProperty()); + }); + } + Integer tab = query.getTab(); + if (tab != null) { + qw.eq("delete_status", 0); + if (tab == 1) { + qw.eq("status", 0); + } else if (tab == 2) { + qw.eq("status", 1); + qw.eq("aftersale_status", 1); + } else if (tab == 3) { + qw.eq("status", 2); + qw.eq("confirm_status", 0); + } else if (tab == 4) { + qw.eq("status", 2); + qw.eq("confirm_status", 1); + } + } + orderMapper.selectPage(page, qw); + List orders = page.getRecords(); + long total = page.getPages(); + if (CollUtil.isEmpty(orders)) { + return new PageImpl<>(Collections.emptyList(), pageReq, total); + } + LambdaQueryWrapper qw1 = new LambdaQueryWrapper<>(); + qw1.in(OrderItem::getOrderId, orders.stream().map(Order::getId).collect(Collectors.toList())); + Map> oid2items = orderItemMapper.selectList(qw1) + .stream().collect(Collectors.groupingBy(OrderItem::getOrderId)); +// List res = orderConvert.dos2vos(orders); +// res.forEach(it -> { +// it.setItems(oid2items.get(it.getId())); +// }); +// return new PageImpl<>(res, pageReq, total); + return null; + } + + + public R saveMerchantNote(Order order) { + // 1. 查询现有订单 + Order orderInDb = orderMapper.selectById(order.getId()); + if (orderInDb == null) { + return R.fail("订单不存在"); + } + + // 2. 更新商家备注 + UpdateWrapper qw = new UpdateWrapper<>(); + qw.eq("id", order.getId()); + qw.set("merchant_note", order.getMerchantNote()); + int affectedRows = orderMapper.update(null, qw); + + if (affectedRows > 0) { + orderMapper.selectById(order.getId()); + return R.ok(); + } + return R.fail("更新失败"); + } + + /** + * 管理后台发货 + * 目前发货是这样的:待发货、已发货、已完成都能执行发货,每次都会创建一条新的发货记录且修改订单发货信息 + * @param request 发货请求 + * @param userId 操作人 + * @return 结果 + */ + @Transactional + public String deliverProduct(DeliverProductForm request, Long userId) { + //查询订单 + Order order = orderMapper.selectById(request.getOrderId()); + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("order_id", request.getOrderId()); + List orderItemList = orderItemMapper.selectList(qw); + if (order == null || CollectionUtil.isEmpty(orderItemList)){ + throw new RuntimeException("未找到该订单信息"); + } + // 是否为待发货、已发货 、已完成 + if (!(Constants.OrderStatus.SEND.equals(order.getStatus()) + || Constants.OrderStatus.GET.equals(order.getStatus()) + || Constants.OrderStatus.CONFIRM.equals(order.getStatus()))){ + throw new RuntimeException("订单状态错误"); + } + Integer orderStatus = + Constants.OrderStatus.SEND.equals(order.getStatus()) ? Constants.OrderStatus.GET : order.getStatus(); + //更新订单 + LocalDateTime optDate = LocalDateTime.now(); + order.setUpdateBy(null); + order.setStatus(orderStatus); + order.setDeliveryTime(optDate); + order.setUpdateTime(optDate); + order.setDeliveryCompany(request.getExpressName()); + order.setDeliverySn(request.getExpressSn()); + orderMapper.updateById(order); + //创建新的发货记录 + this.createDeliveryHistory(request, userId, optDate); + //创建订单操作记录 + this.createOrderOptHistory(order.getId(), order.getOrderSn(), orderStatus, userId, optDate); + return "发货成功"; + } + + /** + * 创建发货记录 + * @param request 发货请求 + * @param userId 操作人 + * @param optDate 操作时间 + */ + private void createDeliveryHistory(DeliverProductForm request, Long userId, LocalDateTime optDate){ + OrderDeliveryHistory orderDeliveryHistory = new OrderDeliveryHistory(); + orderDeliveryHistory.setOrderId(request.getOrderId()); + orderDeliveryHistory.setDeliveryCompany(request.getExpressName()); + orderDeliveryHistory.setDeliverySn(request.getExpressSn()); + orderDeliveryHistory.setCreateTime(optDate); + orderDeliveryHistory.setCreateBy(userId); + int rows = orderDeliveryHistoryMapper.insert(orderDeliveryHistory); + if (rows < 1) { + throw new RuntimeException("新增订单发货记录失败"); + } + } + + /** + * 创建订单操作历史 + * @param orderId 订单id + * @param orderStatus 订单状态 + * @param userId 操作人 + * @param optDate 操作时间 + */ + private void createOrderOptHistory(Long orderId, String orderSn, Integer orderStatus, Long userId, LocalDateTime optDate){ + OrderOperateHistory optHistory = new OrderOperateHistory(); + optHistory.setOrderId(orderId); + optHistory.setOrderSn(orderSn); + optHistory.setOperateMan(SecurityUtils.getUsername()); + optHistory.setOrderStatus(orderStatus); + optHistory.setCreateTime(optDate); + optHistory.setCreateBy(userId); + optHistory.setUpdateBy(userId); + optHistory.setUpdateTime(optDate); + int rows = orderOperateHistoryMapper.insert(optHistory); + if (rows < 1) { + throw new RuntimeException("新增订单操作记录失败"); + } + } + + /** + * 根据订单id查询订单操作日志 + * @param orderId 订单id + * @return 结果 + */ + public List log(Long orderId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(OrderOperateHistory::getOrderId, orderId); + wrapper.in(OrderOperateHistory::getOrderStatus, Arrays.asList(0, 1, 2, 3, 4)); + wrapper.orderByDesc(OrderOperateHistory::getCreateTime); + List historyList = orderOperateHistoryMapper.selectList(wrapper); + return historyList; + } + + public R decryptPhone(Long orderId) { + Order order = orderMapper.selectById(orderId); + String receiverPhoneEncrypted = order.getReceiverPhoneEncrypted(); + if (receiverPhoneEncrypted != null) { + return R.ok("操作成功", receiverPhoneEncrypted); + } else { + return R.fail("获取的电话号码加密字段为空"); + } + } + + public R updateReceiver(Order order) { + Order dbOrder = orderMapper.selectById(order.getId()); + if (dbOrder == null) { + return R.fail("无该订单信息"); + } + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("receiver_name",order.getReceiverName()) + .set("receiver_phone", PhoneUtils.hidePhone(order.getReceiverPhone())) + .set("receiver_city",order.getReceiverCity()) + .set("receiver_district",order.getReceiverDistrict()) + .set("receiver_province",order.getReceiverProvince()) + .set("receiver_detail_address",order.getReceiverDetailAddress()) +// .set("receiver_phone_encrypted", AesCryptoUtils.encrypt(aesKey, order.getReceiverPhone())) + .set("update_time",LocalDateTime.now()); + updateWrapper.eq("id",order.getId()); + int update = orderMapper.update(null, updateWrapper); + if (update>0){ + return R.ok(order); + }else { + return R.fail("修改失败"); + } + } + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/WechatPaymentHistoryServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/WechatPaymentHistoryServiceImpl.java new file mode 100644 index 000000000..55d3c83f7 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/WechatPaymentHistoryServiceImpl.java @@ -0,0 +1,136 @@ +package com.wzj.soopin.order.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.order.domain.entity.WechatPaymentHistory; +import com.wzj.soopin.order.domain.query.WechatPaymentHistoryQuery; +import com.wzj.soopin.order.domain.vo.PageVO; +import com.wzj.soopin.order.mapper.WechatPaymentHistoryMapper; +import com.wzj.soopin.order.service.WechatPaymentHistoryService; +import com.wzj.soopin.order.utils.PageUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * 微信订单表Service业务层处理 + * + * + * @author zcc + */ +@Service +public class WechatPaymentHistoryServiceImpl extends ServiceImpl implements WechatPaymentHistoryService { + @Autowired + private WechatPaymentHistoryMapper wechatPaymentHistoryMapper; + + /** + * 查询微信订单表 + * + * @param id 微信订单表主键 + * @return 微信订单表 + */ + public WechatPaymentHistory selectById(Long id) { + return wechatPaymentHistoryMapper.selectById(id); + } + + /** + * 查询微信订单表列表 + * + * @param query 查询条件 + * @param page 分页条件 + * @return 微信订单表 + */ + public List selectList(WechatPaymentHistoryQuery query, Pageable page) { + if (page != null) { +// PageHelper.startPage(page.getPageNumber() + 1, page.getPageSize()); + } + QueryWrapper qw = new QueryWrapper<>(); + String paymentId = query.getPaymentId(); + if (!StringUtils.isEmpty(paymentId)) { + qw.eq("payment_id", paymentId); + } + Long memberId = query.getMemberId(); + if (memberId != null) { + qw.eq("member_id", memberId); + } + String openid = query.getOpenid(); + if (!StringUtils.isEmpty(openid)) { + qw.eq("openid", openid); + } + String realNameLike = query.getRealNameLike(); + if (!StringUtils.isEmpty(realNameLike)) { + qw.like("real_name", realNameLike); + } + String title = query.getTitle(); + if (!StringUtils.isEmpty(title)) { + qw.eq("title", title); + } + Long orderId = query.getOrderId(); + if (orderId != null) { + qw.eq("order_id", orderId); + } + BigDecimal money = query.getMoney(); + if (money != null) { + qw.eq("money", money); + } + Integer opType = query.getOpType(); + if (opType != null) { + qw.eq("op_type", opType); + } + Integer paymentStatus = query.getPaymentStatus(); + if (paymentStatus != null) { + qw.eq("payment_status", paymentStatus); + } + String attach = query.getAttach(); + if (!StringUtils.isEmpty(attach)) { + qw.eq("attach", attach); + } + String responseBody = query.getResponseBody(); + if (!StringUtils.isEmpty(responseBody)) { + qw.eq("response_body", responseBody); + } + return wechatPaymentHistoryMapper.selectList(qw); + } + + /** + * 新增微信订单表 + * + * @param wechatPaymentHistory 微信订单表 + * @return 结果 + */ + public int insert(WechatPaymentHistory wechatPaymentHistory) { + wechatPaymentHistory.setCreateTime(LocalDateTime.now()); + return wechatPaymentHistoryMapper.insert(wechatPaymentHistory); + } + + /** + * 修改微信订单表 + * + * @param wechatPaymentHistory 微信订单表 + * @return 结果 + */ + public int update(WechatPaymentHistory wechatPaymentHistory) { + return wechatPaymentHistoryMapper.updateById(wechatPaymentHistory); + } + + /** + * 删除微信订单表信息 + * + * @param id 微信订单表主键 + * @return 结果 + */ + public int deleteById(Long id) { + return wechatPaymentHistoryMapper.deleteById(id); + } + + public IPage pagelist(WechatPaymentHistoryQuery query, PageVO page) { + IPage pageParam = PageUtil.initPage(page); + return wechatPaymentHistoryMapper.selectWechatPaymentHistory(query, pageParam); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/BeanUtil.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/BeanUtil.java new file mode 100644 index 000000000..be3f213d7 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/BeanUtil.java @@ -0,0 +1,137 @@ +package com.wzj.soopin.order.utils; + +import org.springframework.beans.BeanUtils; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +/** + * 对象属性复制 + * + * @author Chopper + */ +public class BeanUtil { + + /** + * 复制属性 + * + * @param objectFrom 源自对象 + * @param objectTo 复制给对象 + */ + public static void copyProperties(Object objectFrom, Object objectTo) { + BeanUtils.copyProperties(objectFrom, objectTo); + } + + + /** + * 获取属性名数组 + * + * @param o 获取字段的对象 + * @return 返回各个字段 + */ + public static String[] getFiledName(Object o) { + Field[] fields = o.getClass().getDeclaredFields(); + Field[] superFields = o.getClass().getSuperclass().getDeclaredFields(); + String[] fieldNames = new String[fields.length + superFields.length]; + int index = 0; + for (int i = 0; i < fields.length; i++) { + fieldNames[index] = fields[i].getName(); + index++; + } + for (int i = 0; i < superFields.length; i++) { + if ("id".equals(superFields[i].getName())) { + continue; + } + fieldNames[index] = superFields[i].getName(); + index++; + } + return fieldNames; + } + + /** + * 根据属性名获取属性值 + * + * @param fieldName 属性名 + * @param o 对象 + * @return 属性值 + */ + public static Object getFieldValueByName(String fieldName, Object o) { + try { + String firstLetter = fieldName.substring(0, 1).toUpperCase(); + String getter = "get" + firstLetter + fieldName.substring(1); + Method method = o.getClass().getMethod(getter, new Class[]{}); + Object value = method.invoke(o, new Object[]{}); + return value; + } catch (Exception e) { + return null; + } + } + + + /** + * 将对象转换为key value + * A=a&B=b&C=c 格式 + * + * @param object 对象 + * @return 格式化结果 + */ + public static String formatKeyValuePair(Object object) { + //准备接受的字符串 + StringBuilder stringBuffer = new StringBuilder(); + //获取对象字段 + String[] fieldNames = BeanUtil.getFiledName(object); + //遍历所有属性 + for (int j = 0; j < fieldNames.length; j++) { + //不是第一个并且不是最后一个,拼接& + if (j != 0) { + stringBuffer.append("&"); + } + //获取属性的名字 + String key = fieldNames[j]; + //获取值 + Object value = BeanUtil.getFieldValueByName(key, object); + assert value != null; + stringBuffer.append(key).append("=").append(value.toString()); + } + return stringBuffer.toString(); + } + + /** + * key value键值对 转换为 对象 + * A=a&B=b&C=c 格式 转换为对象 + * + * @param str 对象字符串 + * @param t 范型 + * @param 范型 + * @return 格式化结果 + */ + public static T formatKeyValuePair(String str, T t) { + //填写对参数键值对 + String[] params = str.split("&"); + + //获取对象字段 + String[] fieldNames = BeanUtil.getFiledName(t); + + try { + //循环每个参数 + for (String param : params) { + String[] keyValues = param.split("="); + for (int i = 0; i < fieldNames.length; i++) { + if (fieldNames[i].equals(keyValues[0])) { + Field f = t.getClass().getDeclaredField(fieldNames[i]); + f.setAccessible(true); + //长度为2 才转换,否则不转 + if (keyValues.length == 2) { + f.set(t, keyValues[1]); + } + } + } + + } + } catch (Exception e) { + e.printStackTrace(); + } + return t; + } + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/DateUtil.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/DateUtil.java new file mode 100644 index 000000000..0f0f69b86 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/DateUtil.java @@ -0,0 +1,398 @@ +package com.wzj.soopin.order.utils; + +import java.text.SimpleDateFormat; +import java.time.*; +import java.util.*; + +/** + * 日期相关的操作 + * + * @author Chopper + */ +public class DateUtil { + + public static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss"; + + public static final String STANDARD_DATE_FORMAT = "yyyy-MM-dd"; + + public static final String STANDARD_DATE_NO_UNDERLINE_FORMAT = "yyyyMMdd"; + + public static final String FULL_DATE = "yyyyMMddHHmmss"; + + + /** + * 当天的开始时间 + * + * @return 今天开始时间 + */ + public static Date startOfTodDayTime() { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } + + /** + * 当天的开始时间 + * + * @param date 时间 + * @return 根据传入的时间获取开始时间 + */ + public static Date startOfTodDayTime(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } + + /** + * 当天的开始时间 + * + * @return 今天开始时间 + */ + public static long startOfTodDay() { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + Date date = calendar.getTime(); + return date.getTime() / 1000; + } + + /** + * 当天的结束时间 + * + * @return 今天结束时间 + */ + public static Date endOfDate() { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + calendar.set(Calendar.MILLISECOND, 999); + return calendar.getTime(); + } + + /** + * 当天的结束时间 + * + * @param date 传入日期 + * @return 获得传入日期当天结束时间 + */ + public static Date endOfDate(Date date) { + if (date == null) { + date = new Date(); + } + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + calendar.set(Calendar.MILLISECOND, 999); + return calendar.getTime(); + } + + /** + * 某天的年月日 + * + * @param dayUntilNow 距今多少天以前 + * @return 年月日map key为 year month day + */ + public static Map getYearMonthAndDay(int dayUntilNow) { + + Map map = new HashMap(3); + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + calendar.add(Calendar.DATE, -dayUntilNow); + map.put("year", calendar.get(Calendar.YEAR)); + map.put("month", calendar.get(Calendar.MONTH) + 1); + map.put("day", calendar.get(Calendar.DAY_OF_MONTH)); + return map; + } + + /** + * 将一个字符串转换成日期格式 + * + * @param date 字符串日期 + * @param pattern 日期格式 + * @return date + */ + public static Date toDate(String date, String pattern) { + if ("".equals("" + date)) { + return null; + } + if (pattern == null) { + pattern = STANDARD_DATE_FORMAT; + } + SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.ENGLISH); + Date newDate = new Date(); + try { + newDate = sdf.parse(date); + + } catch (Exception ex) { + ex.printStackTrace(); + } + return newDate; + } + + /** + * 获取上个月的开始结束时间 + * + * @return 上个月的开始结束时间 + */ + public static Long[] getLastMonth() { + //取得系统当前时间 + Calendar cal = Calendar.getInstance(); + int year = cal.get(Calendar.YEAR); + int month = cal.get(Calendar.MONTH) + 1; + + //取得系统当前时间所在月第一天时间对象 + cal.set(Calendar.DAY_OF_MONTH, 1); + + //日期减一,取得上月最后一天时间对象 + cal.add(Calendar.DAY_OF_MONTH, -1); + + //输出上月最后一天日期 + int day = cal.get(Calendar.DAY_OF_MONTH); + + String months = ""; + String days = ""; + + if (month > 1) { + month--; + } else { + year--; + month = 12; + } + if (String.valueOf(month).length() <= 1) { + months = "0" + month; + } else { + months = String.valueOf(month); + } + if (String.valueOf(day).length() <= 1) { + days = "0" + day; + } else { + days = String.valueOf(day); + } + String firstDay = "" + year + "-" + months + "-01"; + String lastDay = "" + year + "-" + months + "-" + days + " 23:59:59"; + + Long[] lastMonth = new Long[2]; + lastMonth[0] = DateUtil.getDateline(firstDay); + lastMonth[1] = DateUtil.getDateline(lastDay, STANDARD_FORMAT); + + return lastMonth; + } + + /** + * 把日期转换成字符串型 + * + * @param date 日期 + * @return 字符串时间 + */ + public static String toString(Date date) { + return toString(date, STANDARD_FORMAT); + } + + /** + * 把日期转换成字符串型 + * + * @param date 日期 + * @return 字符串时间 + */ + public static String toString(Long date) { + return toString(date, STANDARD_FORMAT); + } + + /** + * 把日期转换成字符串型 + * + * @param date 日期 + * @param pattern 类型 + * @return 字符串时间 + */ + public static String toString(Date date, String pattern) { + if (date == null) { + return ""; + } + if (pattern == null) { + pattern = STANDARD_DATE_FORMAT; + } + String dateString = ""; + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + try { + dateString = sdf.format(date); + } catch (Exception ex) { + ex.printStackTrace(); + } + return dateString; + } + + /** + * 时间戳转换成时间类型 + * + * @param time 时间戳 + * @param pattern 格式 + * @return 字符串时间 + */ + public static String toString(Long time, String pattern) { + if (time > 0) { + if (time.toString().length() == 10) { + time = time * 1000; + } + Date date = new Date(time); + return DateUtil.toString(date, pattern); + } + return ""; + } + + /** + * 判断当前时间是否在某个时间范围 + * + * @param start 开始时间,以秒为单位的时间戳 + * @param end 结束时间,以秒为单位的时间戳 + * @return 是否在范围内 + */ + public static boolean inRangeOf(long start, long end) { + long now = getDateline(); + return start <= now && end >= now; + } + + /** + * 获取指定日期的时间戳 + * + * @param date 指定日期 + * @return 时间戳 + */ + public static long getDateline(String date) { + return Objects.requireNonNull(toDate(date, STANDARD_DATE_FORMAT)).getTime() / 1000; + } + + /** + * 获取当前时间的时间戳 + * + * @return 时间戳 + */ + public static long getDateline() { + return System.currentTimeMillis() / 1000; + } + + /** + * 获取当前时间格式化字符串 + * + * @return 时间戳 + */ + public static String getCurrentDateStr(String format) { + return toString(new Date(), format); + } + + /** + * 获取当前时间格式化字符串 + * + * @return 格式化的时间 + */ + public static String getCurrentDateStr() { + return toString(new Date(), FULL_DATE); + } + + /** + * 根据日期格式及日期获取时间戳 + * + * @param date 日期 + * @param pattern 日期格式 + * @return 时间戳 + */ + public static long getDateline(String date, String pattern) { + return Objects.requireNonNull(toDate(date, pattern)).getTime() / 1000; + } + + /** + * 获取几个月之前的日期时间戳 + * + * @param beforeMonth 几个月之前 + * @return 时间戳 + */ + public static long getBeforeMonthDateline(int beforeMonth) { + SimpleDateFormat format = new SimpleDateFormat(STANDARD_FORMAT); + Calendar c = Calendar.getInstance(); + + //过去一月 + c.setTime(new Date()); + c.add(Calendar.MONTH, (0 - beforeMonth)); + Date m = c.getTime(); + String mon = format.format(m); + return getDateline(mon, STANDARD_FORMAT); + } + + /** + * 获取当前天的结束时间 + * + * @return 当前天的结束时间 + */ + public static Date getCurrentDayEndTime() { + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + cal.set(Calendar.DATE, cal.get(Calendar.DATE) + 1); + cal.set(Calendar.SECOND, cal.get(Calendar.SECOND) - 1); + return cal.getTime(); + } + + /** + * 获取延时时间(秒) + * + * @param startTime 开始时间 + * @return 延时时间(秒) + */ + public static Integer getDelayTime(Long startTime) { + int time = Math.toIntExact((startTime - System.currentTimeMillis()) / 1000); + //如果时间为负数则改为一秒后执行 + if (time <= 0) { + time = 1; + } + return time; + } + + /** + * 获取某年某月开始时间 + * + * @param year 年 + * @param month 月 + * @return 开始时间 + */ + public static Date getBeginTime(int year, int month) { + YearMonth yearMonth = YearMonth.of(year, month); + LocalDate localDate = yearMonth.atDay(1); + LocalDateTime startOfDay = localDate.atStartOfDay(); + ZonedDateTime zonedDateTime = startOfDay.atZone(ZoneId.of("Asia/Shanghai")); + + return Date.from(zonedDateTime.toInstant()); + + } + + /** + * 获取某年某月结束时间 + * + * @param year 年 + * @param month 月 + * @return 结束时间 + */ + public static Date getEndTime(int year, int month) { + YearMonth yearMonth = YearMonth.of(year, month); + LocalDate endOfMonth = yearMonth.atEndOfMonth(); + LocalDateTime localDateTime = endOfMonth.atTime(23, 59, 59, 999); + ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("Asia/Shanghai")); + return Date.from(zonedDateTime.toInstant()); + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/PageUtil.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/PageUtil.java new file mode 100644 index 000000000..fb68e8285 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/PageUtil.java @@ -0,0 +1,173 @@ +package com.wzj.soopin.order.utils; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.wzj.soopin.order.domain.vo.PageVO; +import com.wzj.soopin.order.domain.vo.SearchVO; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 分页工具 + * + * @author Chopper + * @version v4.0 + * @since 2020/11/26 15:23 + */ +public class PageUtil { + + + /** + * Mybatis-Plus分页封装 + * + * @param page 分页VO + * @param 范型 + * @return 分页响应 + */ + public static Page initPage(PageVO page) { + + Page p; + int pageNumber = page.getPage(); + int pageSize = page.getSize(); + String sort = page.getSort(); + String order = page.getOrder(); + + if (pageNumber < 1) { + pageNumber = 1; + } + if (pageSize < 1) { + pageSize = 10; + } + if (pageSize > 100) { + pageSize = 100; + } + if (StrUtil.isNotBlank(sort)) { + Boolean isAsc = false; + if (StrUtil.isBlank(order)) { + isAsc = false; + } else { + if ("desc".equals(order.toLowerCase())) { + isAsc = false; + } else if ("asc".equals(order.toLowerCase())) { + isAsc = true; + } + } + p = new Page<>(pageNumber, pageSize); + if (isAsc) { + p.addOrder(OrderItem.asc(sort)); + } else { + p.addOrder(OrderItem.desc(sort)); + } + + } else { + p = new Page<>(pageNumber, pageSize); + } + return p; + } + + /** + * 生成条件搜索 全对象对比 equals + * 如果需要like 需要另行处理 + * + * @param object 对象(根据对象构建查询条件) + * @return 查询wrapper + */ + public static QueryWrapper initWrapper(Object object) { + return initWrapper(object, null); + } + + /** + * 生成条件搜索 全对象对比 + * + * @param object 对象 + * @param searchVo 查询条件 + * @return 查询wrapper + */ + public static QueryWrapper initWrapper(Object object, SearchVO searchVo) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + //创建时间区间判定 + if (searchVo != null && StrUtil.isNotBlank(searchVo.getStartDate()) && StrUtil.isNotBlank(searchVo.getEndDate())) { + Date start = DateUtil.parse(searchVo.getStartDate()); + Date end = DateUtil.parse(searchVo.getEndDate()); + queryWrapper.between("create_time", start, DateUtil.endOfDay(end)); + } + if (object != null) { + String[] fieldNames = BeanUtil.getFiledName(object); + //遍历所有属性 + for (int j = 0; j < fieldNames.length; j++) { + //获取属性的名字 + String key = fieldNames[j]; + //获取值 + Object value = BeanUtil.getFieldValueByName(key, object); + //如果值不为空才做查询处理 + if (value != null && !"".equals(value)) { + //字段数据库中,驼峰转下划线 + queryWrapper.eq(StringUtils.camel2Underline(key), value); + } + } + } + return queryWrapper; + } + + + /** + * List 手动分页 + * + * @param page 分页对象 + * @param list 分页集合 + * @return 范型结果 + */ + public static List listToPage(PageVO page, List list) { + + int pageNumber = page.getPage() - 1; + int pageSize = page.getSize(); + + if (pageNumber < 0) { + pageNumber = 0; + } + if (pageSize < 1) { + pageSize = 10; + } + if (pageSize > 100) { + pageSize = 100; + } + + int fromIndex = pageNumber * pageSize; + int toIndex = pageNumber * pageSize + pageSize; + + if (fromIndex > list.size()) { + return new ArrayList<>(); + } else if (toIndex >= list.size()) { + return list.subList(fromIndex, list.size()); + } else { + return list.subList(fromIndex, toIndex); + } + } + + /** + * 转换分页类型 + * + * @param originPage 原分页 + * @param records 新分页数据 + * @param 新类型 + * @return 新类型分页 + */ + public static IPage convertPage(IPage originPage, List records) { + IPage resultPage = new Page<>(); + if (originPage != null) { + resultPage.setCurrent(originPage.getCurrent()); + resultPage.setPages(originPage.getPages()); + resultPage.setTotal(originPage.getTotal()); + resultPage.setSize(originPage.getSize()); + resultPage.setRecords(records); + } + return resultPage; + } + +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/StringUtils.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/StringUtils.java new file mode 100644 index 000000000..c7f939811 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/utils/StringUtils.java @@ -0,0 +1,181 @@ +package com.wzj.soopin.order.utils; + +import cn.hutool.core.util.StrUtil; + +import java.beans.BeanInfo; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Method; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 字串工具类 + * + * @author pikachu + */ +public class StringUtils extends StrUtil { + + /** + * MD5加密方法 + * + * @param str String + * @return String + */ + public static String md5(String str) { + MessageDigest messageDigest = null; + try { + messageDigest = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException ex) { + ex.printStackTrace(); + return null; + } + byte[] resultByte = messageDigest.digest(str.getBytes()); + StringBuffer result = new StringBuffer(); + for (int i = 0; i < resultByte.length; ++i) { + int v = 0xFF & resultByte[i]; + if (v < 16) { + result.append("0"); + } + result.append(Integer.toHexString(v)); + } + return result.toString(); + } + + /** + * 获取随机数 + * + * @param n 随机次数 + * @return + */ + public static String getRandStr(int n) { + Random random = new Random(); + String sRand = ""; + for (int i = 0; i < n; i++) { + String rand = String.valueOf(random.nextInt(10)); + sRand += rand; + } + return sRand; + } + + /** + * 切个字符串,如果超出长度则切割 + * + * @param var + * @param size + * @return + */ + public static String subStringLength(String var, Integer size) { + if (var.length() > size) { + return var.substring(0, (size - 4)).toString() + "..."; + } + return var; + } + + /** + * 对象转map + * + * @param obj + * @return + * @throws Exception + */ + public static Map objectToMap(Object obj) throws Exception { + if (obj == null) { + return null; + } + Map map = new HashMap(16); + + BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); + PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); + for (PropertyDescriptor property : propertyDescriptors) { + String key = property.getName(); + if (key.compareToIgnoreCase("class") == 0) { + continue; + } + Method getter = property.getReadMethod(); + Object value = getter != null ? getter.invoke(obj) : null; + map.put(key, value); + } + + return map; + } + + + /** + * 驼峰法转下划线 + */ + public static String camel2Underline(String str) { + + if (StrUtil.isBlank(str)) { + return ""; + } + if (str.length() == 1) { + return str.toLowerCase(); + } + StringBuffer sb = new StringBuffer(); + for (int i = 1; i < str.length(); i++) { + if (Character.isUpperCase(str.charAt(i))) { + sb.append("_" + Character.toLowerCase(str.charAt(i))); + } else { + sb.append(str.charAt(i)); + } + } + return (str.charAt(0) + sb.toString()).toLowerCase(); + } + + /** + * 如果给定字符串{@code str}中不包含{@code appendStr},则在{@code str}后追加{@code appendStr}; + * 如果已包含{@code appendStr},则在{@code str}后追加{@code otherwise} + * + * @param str 给定的字符串 + * @param appendStr 需要追加的内容 + * @param otherwise 当{@code appendStr}不满足时追加到{@code str}后的内容 + * @return 追加后的字符串 + */ + public static String appendIfNotContain(String str, String appendStr, String otherwise) { + if (isEmpty(str) || isEmpty(appendStr)) { + return str; + } + if (str.contains(appendStr)) { + return str.concat(otherwise); + } + return str.concat(appendStr); + } + + /** + * 过滤特殊字符串 + * + * @param str + * @return + */ + public static String filterSpecialChart(String str) { + String regEx = "[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]"; + Pattern p = Pattern.compile(regEx); + Matcher m = p.matcher(str); + return m.replaceAll("").trim(); + } + + /** + * double 转价格字符串 + * + * @return + */ + public static String toFen(Double doubleValue) { + String str = doubleValue.toString(); + + if (!str.contains(".")) { + str = str + ".00"; + } else if (str.substring(str.indexOf(".")).length() == 2) { + str = str + "0"; + } + return str; + } + +} + + diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/AftersaleItemMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/AftersaleItemMapper.xml index b3a7770af..592d79d39 100644 --- a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/AftersaleItemMapper.xml +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/AftersaleItemMapper.xml @@ -55,4 +55,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and quantity = #{quantity} + + diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderDeliveryHistoryMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderDeliveryHistoryMapper.xml index 12b83b5c2..386a22a09 100644 --- a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderDeliveryHistoryMapper.xml +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderDeliveryHistoryMapper.xml @@ -31,4 +31,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and delivery_sn = #{deliverySn} + + + diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderItemMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderItemMapper.xml index cebf42db6..be4f1f14a 100644 --- a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderItemMapper.xml +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderItemMapper.xml @@ -53,4 +53,52 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and sp_data = #{spData} + + diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml index 260b72b79..84d63b148 100644 --- a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/OrderMapper.xml @@ -91,6 +91,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and receive_time = #{receiveTime} + + + diff --git a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/WechatPaymentHistoryMapper.xml b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/WechatPaymentHistoryMapper.xml index 235cc782e..bf08655e4 100644 --- a/ruoyi-modules/ruoyi-order/src/main/resources/mapper/WechatPaymentHistoryMapper.xml +++ b/ruoyi-modules/ruoyi-order/src/main/resources/mapper/WechatPaymentHistoryMapper.xml @@ -48,4 +48,43 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and response_body = #{responseBody} + + diff --git a/ruoyi-modules/ruoyi-system/pom.xml b/ruoyi-modules/ruoyi-system/pom.xml index 0fc6d5513..7fdea9248 100644 --- a/ruoyi-modules/ruoyi-system/pom.xml +++ b/ruoyi-modules/ruoyi-system/pom.xml @@ -99,6 +99,19 @@ org.dromara ruoyi-common-sse + + org.dromara + ruoyi-member + + + org.apache.tomcat.embed + tomcat-embed-core + + + com.alibaba + fastjson + + diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/config/AjaxResult.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/config/AjaxResult.java new file mode 100644 index 000000000..6cdcdd5b4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/config/AjaxResult.java @@ -0,0 +1,167 @@ +package org.dromara.system.config; + +import org.dromara.common.core.constant.HttpStatus; +import org.dromara.common.core.utils.StringUtils; + +import java.util.HashMap; + +/** + * 操作消息提醒 + * + * @author ruoyi + */ +public class AjaxResult extends HashMap +{ + private static final long serialVersionUID = 1L; + + /** 状态码 */ + public static final String CODE_TAG = "code"; + + /** 返回内容 */ + public static final String MSG_TAG = "msg"; + + /** 数据对象 */ + public static final String DATA_TAG = "data"; + + /** + * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 + */ + public AjaxResult() + { + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + */ + public AjaxResult(int code, String msg) + { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + * @param data 数据对象 + */ + public AjaxResult(int code, String msg, Object data) + { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + if (StringUtils.isNotNull(data)) + { + super.put(DATA_TAG, data); + } + } + + /** + * 返回成功消息 + * + * @return 成功消息 + */ + public static AjaxResult success() + { + return AjaxResult.success("操作成功"); + } + + /** + * 返回成功数据 + * + * @return 成功消息 + */ + public static AjaxResult success(Object data) + { + return AjaxResult.success("操作成功", data); + } + public static AjaxResult successData(Object data) + { + return AjaxResult.success("操作成功", data); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @return 成功消息 + */ + public static AjaxResult success(String msg) + { + return AjaxResult.success(msg, null); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 成功消息 + */ + public static AjaxResult success(String msg, Object data) + { + return new AjaxResult(HttpStatus.SUCCESS, msg, data); + } + + /** + * 返回错误消息 + * + * @return + */ + public static AjaxResult error() + { + return AjaxResult.error("操作失败"); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult error(String msg) + { + return AjaxResult.error(msg, null); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 警告消息 + */ + public static AjaxResult error(String msg, Object data) + { + return new AjaxResult(HttpStatus.ERROR, msg, data); + } + + /** + * 返回错误消息 + * + * @param code 状态码 + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult error(int code, String msg) + { + return new AjaxResult(code, msg, null); + } + + /** + * 方便链式调用 + * + * @param key 键 + * @param value 值 + * @return 数据对象 + */ + @Override + public AjaxResult put(String key, Object value) + { + super.put(key, value); + return this; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/config/ServerConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/config/ServerConfig.java new file mode 100644 index 000000000..f03506f82 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/config/ServerConfig.java @@ -0,0 +1,33 @@ +package org.dromara.system.config; + +import jakarta.servlet.http.HttpServletRequest; +import org.dromara.common.core.utils.ServletUtils; +import org.springframework.stereotype.Component; + + +/** + * 服务相关配置 + * + * @author ruoyi + */ +@Component +public class ServerConfig +{ + /** + * 获取完整的请求路径,包括:域名,端口,上下文访问路径 + * + * @return 服务地址 + */ + public String getUrl() + { + HttpServletRequest request = ServletUtils.getRequest(); + return getDomain(request); + } + + public static String getDomain(HttpServletRequest request) + { + StringBuffer url = request.getRequestURL(); + String contextPath = request.getServletContext().getContextPath(); + return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/common/CommonController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/common/CommonController.java new file mode 100644 index 000000000..28e051a0d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/common/CommonController.java @@ -0,0 +1,184 @@ +package org.dromara.system.controller.common; + +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.wzj.soopin.member.domain.po.Address; +import com.wzj.soopin.member.mapper.AddressMapper; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.common.core.config.RuoYiConfig; +import org.dromara.common.core.domain.event.Constants; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.MimeTypeUtils; +import org.dromara.common.redis.redis.RedisService; +import org.dromara.system.config.AjaxResult; +import org.dromara.system.config.ServerConfig; +import org.dromara.system.domain.dto.AddressDTO; +import org.dromara.system.utils.FileUploadUtils; +import org.dromara.system.utils.FileUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import java.util.*; +import java.util.stream.Collectors; + + +/** + * 通用请求处理 + * + * @author ruoyi + */ +@RestController +public class CommonController +{ + private static final Logger log = LoggerFactory.getLogger(CommonController.class); + + @Autowired + private ServerConfig serverConfig; + + @Autowired + private RedisService redisService; + + @Autowired + private AddressMapper addressMapper; + + /** + * 通用下载请求 + * + * @param fileName 文件名称 + * @param delete 是否删除 + */ + @GetMapping("common/download") + public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) + { + try + { + if (!FileUtils.checkAllowDownload(fileName)) + { + throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName)); + } + String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); + String filePath = RuoYiConfig.getDownloadPath() + fileName; + + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, realFileName); + FileUtils.writeBytes(filePath, response.getOutputStream()); + if (delete) + { + FileUtils.deleteFile(filePath); + } + } + catch (Exception e) + { + log.error("下载文件失败", e); + } + } + + /** + * 通用上传请求 + */ + @PostMapping("/common/upload") + public AjaxResult uploadFile(MultipartFile file) throws Exception + { + try + { + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file, MimeTypeUtils.isImg(file.getContentType())); + String url = serverConfig.getUrl() + fileName; + AjaxResult ajax = AjaxResult.success(); + ajax.put("fileName", fileName); + ajax.put("url", url); + return ajax; + } + catch (Exception e) + { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 本地资源通用下载 + */ + @GetMapping("/common/download/resource") + public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response) + throws Exception + { + try + { + if (!FileUtils.checkAllowDownload(resource)) + { + throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource)); + } + // 本地资源路径 + String localPath = RuoYiConfig.getProfile(); + // 数据库资源地址 + String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); + // 下载名称 + String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + FileUtils.setAttachmentResponseHeader(response, downloadName); + FileUtils.writeBytes(downloadPath, response.getOutputStream()); + } + catch (Exception e) + { + log.error("下载文件失败", e); + } + } + + @GetMapping("/common/area") + public AjaxResult getAddressList() { + String addresses = redisService.getAddressList(); + if (org.apache.commons.lang3.StringUtils.isNotEmpty(addresses)) { + List addressDTOList = JSON.parseArray(addresses, AddressDTO.class); + if(addressDTOList.size()>0){ + return AjaxResult.success(addressDTOList); + } + } + QueryWrapper
addressQueryWrapper = new QueryWrapper<>(); + addressQueryWrapper.in("level", Arrays.asList(0,1,2)); + List
addressList = addressMapper.selectList(addressQueryWrapper); + Map> cityMap = addressList.stream().filter(it -> it.getLevel() == 1).collect(Collectors.groupingBy(it -> it.getParentCode())); + Map> districtMap = addressList.stream().filter(it -> it.getLevel() == 2).collect(Collectors.groupingBy(it -> it.getParentCode())); + List result = new ArrayList<>(); + addressList.stream().filter(it -> it.getLevel() == 0).forEach(it -> { + AddressDTO dto = new AddressDTO(); + dto.setId(it.getCode()); + dto.setLevel("province"); + dto.setName(it.getName()); + dto.setPid(0L); + //获取城市列表 + List child = new ArrayList<>(); + if (cityMap.containsKey(it.getCode())) { + cityMap.get(it.getCode()).forEach(city -> { + AddressDTO cityDto = new AddressDTO(); + cityDto.setId(city.getCode()); + cityDto.setLevel("city"); + cityDto.setName(city.getName()); + cityDto.setPid(city.getParentCode()); + cityDto.setChildren(districtMap.containsKey(city.getCode()) ? + districtMap.get(city.getCode()).stream().map(district -> { + AddressDTO districtDto = new AddressDTO(); + districtDto.setId(district.getCode()); + districtDto.setLevel("district"); + districtDto.setName(district.getName()); + districtDto.setPid(district.getParentCode()); + return districtDto; + }).collect(Collectors.toList()) : Collections.EMPTY_LIST); + child.add(cityDto); + }); + } + dto.setChildren(child); + result.add(dto); + }); + redisService.setAddressList(JSON.toJSONString(result)); + return AjaxResult.success(result); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/AddressDTO.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/AddressDTO.java new file mode 100644 index 000000000..7af251332 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/AddressDTO.java @@ -0,0 +1,19 @@ +package org.dromara.system.domain.dto; + +import lombok.Data; + +import java.util.List; + +/** + * 【请填写功能名称】 DTO 对象 + * + * @author sjm + */ +@Data +public class AddressDTO { + private Long id; + private Long pid; + private String name; + private String level; + private List children; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/FileUploadUtils.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/FileUploadUtils.java new file mode 100644 index 000000000..5c1668142 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/FileUploadUtils.java @@ -0,0 +1,255 @@ +package org.dromara.system.utils; + +import cn.hutool.core.img.Img; +import org.apache.commons.io.FilenameUtils; +import org.dromara.common.core.config.RuoYiConfig; +import org.dromara.common.core.domain.event.Constants; +import org.dromara.common.core.exception.file.FileNameLengthLimitExceededException; +import org.dromara.common.core.exception.file.FileSizeLimitExceededException; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.MimeTypeUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; + +/** + * 文件上传工具类 + * + * @author ruoyi + */ +public class FileUploadUtils +{ + /** + * 默认大小 50M + */ + public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024; + public static final long ONE_M = 1024 * 1024; + + /** + * 默认的文件名最大长度 100 + */ + public static final int DEFAULT_FILE_NAME_LENGTH = 100; + + /** + * 默认上传的地址 + */ + private static String defaultBaseDir = RuoYiConfig.getProfile(); + + public static void setDefaultBaseDir(String defaultBaseDir) + { + FileUploadUtils.defaultBaseDir = defaultBaseDir; + } + + public static String getDefaultBaseDir() + { + return defaultBaseDir; + } + + /** + * 以默认配置进行文件上传 + * + * @param file 上传的文件 + * @return 文件名称 + * @throws Exception + */ + public static final String upload(MultipartFile file) throws IOException + { + try + { + return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, false); + } + catch (Exception e) + { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 根据文件路径上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @return 文件名称 + * @throws IOException + */ + public static final String upload(String baseDir, MultipartFile file) throws IOException { + try { + return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, false); + } catch (Exception e) { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 根据文件路径上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @return 文件名称 + * @throws IOException + */ + public static final String upload(String baseDir, MultipartFile file, boolean scale) throws IOException { + try { + return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, scale); + } catch (Exception e) { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 文件上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @param allowedExtension 上传文件类型 + * @param scale 是否缩放 + * @return 返回上传成功的文件名 + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws FileNameLengthLimitExceededException 文件名太长 + * @throws IOException 比如读写文件出错时 + * @throws InvalidExtensionException 文件校验异常 + */ + public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension, boolean scale) + throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, + InvalidExtensionException { + int fileNamelength = file.getOriginalFilename().length(); + if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) { + throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); + } + + assertAllowed(file, allowedExtension); + + String fileName = extractFilename(file); + + File desc = getAbsoluteFile(baseDir, fileName); + long size = file.getSize(); + if (scale && size > ONE_M) { + Img.from(file.getInputStream()) + //压缩比率 + .setQuality(ONE_M * 1.0 / size) + .write(desc); + } else { + file.transferTo(desc); + } + return getPathFileName(baseDir, fileName); + } + + /** + * 编码文件名 + */ + public static final String extractFilename(MultipartFile file) + { + String fileName = file.getOriginalFilename(); + String extension = getExtension(file); + fileName = DateUtils.datePath() + "/" + IdUtils.simpleUUID() + "." + extension; + return fileName; + } + + public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException + { + File desc = new File(uploadDir + File.separator + fileName); + + if (!desc.exists()) + { + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + } + return desc; + } + + public static final String getPathFileName(String uploadDir, String fileName) throws IOException + { + int dirLastIndex = RuoYiConfig.getProfile().length() + 1; + String currentDir = StringUtils.substring(uploadDir, dirLastIndex); + String pathFileName = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; + return pathFileName; + } + + /** + * 文件大小校验 + * + * @param file 上传的文件 + * @return + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws InvalidExtensionException + */ + public static final void assertAllowed(MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, InvalidExtensionException + { + long size = file.getSize(); + if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE) + { + throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); + } + + String fileName = file.getOriginalFilename(); + String extension = getExtension(file); + if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) + { + if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) + { + throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) + { + throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) + { + throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, + fileName); + } + else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) + { + throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, + fileName); + } + else + { + throw new InvalidExtensionException(allowedExtension, extension, fileName); + } + } + + } + + /** + * 判断MIME类型是否是允许的MIME类型 + * + * @param extension + * @param allowedExtension + * @return + */ + public static final boolean isAllowedExtension(String extension, String[] allowedExtension) + { + for (String str : allowedExtension) + { + if (str.equalsIgnoreCase(extension)) + { + return true; + } + } + return false; + } + + /** + * 获取文件名的后缀 + * + * @param file 表单文件 + * @return 后缀名 + */ + public static final String getExtension(MultipartFile file) + { + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + if (StringUtils.isEmpty(extension)) + { + extension = MimeTypeUtils.getExtension(file.getContentType()); + } + return extension; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/FileUtils.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/FileUtils.java new file mode 100644 index 000000000..edb3b9978 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/FileUtils.java @@ -0,0 +1,255 @@ +package org.dromara.system.utils; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.ArrayUtils; +import org.dromara.common.core.config.RuoYiConfig; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.FileTypeUtils; +import org.dromara.common.core.utils.file.MimeTypeUtils; + +import java.io.*; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + +/** + * 文件处理工具类 + * + * @author ruoyi + */ +public class FileUtils +{ + public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; + + /** + * 输出指定文件的byte数组 + * + * @param filePath 文件路径 + * @param os 输出流 + * @return + */ + public static void writeBytes(String filePath, OutputStream os) throws IOException + { + FileInputStream fis = null; + try + { + File file = new File(filePath); + if (!file.exists()) + { + throw new FileNotFoundException(filePath); + } + fis = new FileInputStream(file); + byte[] b = new byte[1024]; + int length; + while ((length = fis.read(b)) > 0) + { + os.write(b, 0, length); + } + } + catch (IOException e) + { + throw e; + } + finally + { + IOUtils.close(os); + IOUtils.close(fis); + } + } + + /** + * 写数据到文件中 + * + * @param data 数据 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeImportBytes(byte[] data) throws IOException + { + return writeBytes(data, RuoYiConfig.getImportPath()); + } + + /** + * 写数据到文件中 + * + * @param data 数据 + * @param uploadDir 目标文件 + * @return 目标文件 + * @throws IOException IO异常 + */ + public static String writeBytes(byte[] data, String uploadDir) throws IOException + { + FileOutputStream fos = null; + String pathName = ""; + try + { + String extension = getFileExtendName(data); + pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension; + File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName); + fos = new FileOutputStream(file); + fos.write(data); + } + finally + { + IOUtils.close(fos); + } + return FileUploadUtils.getPathFileName(uploadDir, pathName); + } + + /** + * 删除文件 + * + * @param filePath 文件 + * @return + */ + public static boolean deleteFile(String filePath) + { + boolean flag = false; + File file = new File(filePath); + // 路径为文件且不为空则进行删除 + if (file.isFile() && file.exists()) + { + file.delete(); + flag = true; + } + return flag; + } + + /** + * 文件名称验证 + * + * @param filename 文件名称 + * @return true 正常 false 非法 + */ + public static boolean isValidFilename(String filename) + { + return filename.matches(FILENAME_PATTERN); + } + + /** + * 检查文件是否可下载 + * + * @param resource 需要下载的文件 + * @return true 正常 false 非法 + */ + public static boolean checkAllowDownload(String resource) + { + // 禁止目录上跳级别 + if (StringUtils.contains(resource, "..")) + { + return false; + } + + // 检查允许下载的文件规则 + if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) + { + return true; + } + + // 不在允许下载的文件规则 + return false; + } + + /** + * 下载文件名重新编码 + * + * @param request 请求对象 + * @param fileName 文件名 + * @return 编码后的文件名 + */ + public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException + { + final String agent = request.getHeader("USER-AGENT"); + String filename = fileName; + if (agent.contains("MSIE")) + { + // IE浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + filename = filename.replace("+", " "); + } + else if (agent.contains("Firefox")) + { + // 火狐浏览器 + filename = new String(fileName.getBytes(), "ISO8859-1"); + } + else if (agent.contains("Chrome")) + { + // google浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } + else + { + // 其它浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } + return filename; + } + + /** + * 下载文件名重新编码 + * + * @param response 响应对象 + * @param realFileName 真实文件名 + * @return + */ + public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException + { + String percentEncodedFileName = percentEncode(realFileName); + + StringBuilder contentDispositionValue = new StringBuilder(); + contentDispositionValue.append("attachment; filename=") + .append(percentEncodedFileName) + .append(";") + .append("filename*=") + .append("utf-8''") + .append(percentEncodedFileName); + + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename"); + response.setHeader("Content-disposition", contentDispositionValue.toString()); + response.setHeader("download-filename", percentEncodedFileName); + } + + /** + * 百分号编码工具方法 + * + * @param s 需要百分号编码的字符串 + * @return 百分号编码后的字符串 + */ + public static String percentEncode(String s) throws UnsupportedEncodingException + { + String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); + return encode.replaceAll("\\+", "%20"); + } + + /** + * 获取图像后缀 + * + * @param photoByte 图像数据 + * @return 后缀名 + */ + public static String getFileExtendName(byte[] photoByte) + { + String strFileExtendName = "jpg"; + if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56) + && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) + { + strFileExtendName = "gif"; + } + else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) + { + strFileExtendName = "jpg"; + } + else if ((photoByte[0] == 66) && (photoByte[1] == 77)) + { + strFileExtendName = "bmp"; + } + else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) + { + strFileExtendName = "png"; + } + return strFileExtendName; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/IdUtils.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/IdUtils.java new file mode 100644 index 000000000..93f294137 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/IdUtils.java @@ -0,0 +1,50 @@ +package org.dromara.system.utils; + + +/** + * ID生成器工具类 + * + * @author ruoyi + */ +public class IdUtils +{ + /** + * 获取随机UUID + * + * @return 随机UUID + */ + public static String randomUUID() + { + return UUID.randomUUID().toString(); + } + + /** + * 简化的UUID,去掉了横线 + * + * @return 简化的UUID,去掉了横线 + */ + public static String simpleUUID() + { + return UUID.randomUUID().toString(true); + } + + /** + * 获取随机UUID,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 随机UUID + */ + public static String fastUUID() + { + return UUID.fastUUID().toString(); + } + + /** + * 简化的UUID,去掉了横线,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 简化的UUID,去掉了横线 + */ + public static String fastSimpleUUID() + { + return UUID.fastUUID().toString(true); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/InvalidExtensionException.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/InvalidExtensionException.java new file mode 100644 index 000000000..1b83728c7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/InvalidExtensionException.java @@ -0,0 +1,82 @@ +package org.dromara.system.utils; + +import org.apache.tomcat.util.http.fileupload.FileUploadException; + +import java.util.Arrays; + +/** + * 文件上传 误异常类 + * + * @author ruoyi + */ +public class InvalidExtensionException extends FileUploadException +{ + private static final long serialVersionUID = 1L; + + private String[] allowedExtension; + private String extension; + private String filename; + + public InvalidExtensionException(String[] allowedExtension, String extension, String filename) + { + super("filename : [" + filename + "], extension : [" + extension + "], allowed extension : [" + Arrays.toString(allowedExtension) + "]"); + this.allowedExtension = allowedExtension; + this.extension = extension; + this.filename = filename; + } + + public String[] getAllowedExtension() + { + return allowedExtension; + } + + public String getExtension() + { + return extension; + } + + public String getFilename() + { + return filename; + } + + public static class InvalidImageExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidFlashExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidMediaExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidVideoExtensionException extends InvalidExtensionException + { + private static final long serialVersionUID = 1L; + + public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename) + { + super(allowedExtension, extension, filename); + } + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/UUID.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/UUID.java new file mode 100644 index 000000000..92d79dbca --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/utils/UUID.java @@ -0,0 +1,485 @@ +package org.dromara.system.utils; + +import cn.hutool.core.exceptions.UtilException; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +/** + * 提供通用唯一识别码(universally unique identifier)(UUID)实现 + * + * @author ruoyi + */ +public final class UUID implements java.io.Serializable, Comparable +{ + private static final long serialVersionUID = -1185015143654744140L; + + /** + * SecureRandom 的单例 + * + */ + private static class Holder + { + static final SecureRandom numberGenerator = getSecureRandom(); + } + + /** 此UUID的最高64有效位 */ + private final long mostSigBits; + + /** 此UUID的最低64有效位 */ + private final long leastSigBits; + + /** + * 私有构造 + * + * @param data 数据 + */ + private UUID(byte[] data) + { + long msb = 0; + long lsb = 0; + assert data.length == 16 : "data must be 16 bytes in length"; + for (int i = 0; i < 8; i++) + { + msb = (msb << 8) | (data[i] & 0xff); + } + for (int i = 8; i < 16; i++) + { + lsb = (lsb << 8) | (data[i] & 0xff); + } + this.mostSigBits = msb; + this.leastSigBits = lsb; + } + + /** + * 使用指定的数据构造新的 UUID。 + * + * @param mostSigBits 用于 {@code UUID} 的最高有效 64 位 + * @param leastSigBits 用于 {@code UUID} 的最低有效 64 位 + */ + public UUID(long mostSigBits, long leastSigBits) + { + this.mostSigBits = mostSigBits; + this.leastSigBits = leastSigBits; + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的本地线程伪随机数生成器生成该 UUID。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID fastUUID() + { + return randomUUID(false); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID() + { + return randomUUID(true); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能 + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID(boolean isSecure) + { + final Random ng = isSecure ? Holder.numberGenerator : getRandom(); + + byte[] randomBytes = new byte[16]; + ng.nextBytes(randomBytes); + randomBytes[6] &= 0x0f; /* clear version */ + randomBytes[6] |= 0x40; /* set to version 4 */ + randomBytes[8] &= 0x3f; /* clear variant */ + randomBytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(randomBytes); + } + + /** + * 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。 + * + * @param name 用于构造 UUID 的字节数组。 + * + * @return 根据指定数组生成的 {@code UUID} + */ + public static UUID nameUUIDFromBytes(byte[] name) + { + MessageDigest md; + try + { + md = MessageDigest.getInstance("MD5"); + } + catch (NoSuchAlgorithmException nsae) + { + throw new InternalError("MD5 not supported"); + } + byte[] md5Bytes = md.digest(name); + md5Bytes[6] &= 0x0f; /* clear version */ + md5Bytes[6] |= 0x30; /* set to version 3 */ + md5Bytes[8] &= 0x3f; /* clear variant */ + md5Bytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(md5Bytes); + } + + /** + * 根据 {@link #toString()} 方法中描述的字符串标准表示形式创建{@code UUID}。 + * + * @param name 指定 {@code UUID} 字符串 + * @return 具有指定值的 {@code UUID} + * @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常 + * + */ + public static UUID fromString(String name) + { + String[] components = name.split("-"); + if (components.length != 5) + { + throw new IllegalArgumentException("Invalid UUID string: " + name); + } + for (int i = 0; i < 5; i++) + { + components[i] = "0x" + components[i]; + } + + long mostSigBits = Long.decode(components[0]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[1]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[2]).longValue(); + + long leastSigBits = Long.decode(components[3]).longValue(); + leastSigBits <<= 48; + leastSigBits |= Long.decode(components[4]).longValue(); + + return new UUID(mostSigBits, leastSigBits); + } + + /** + * 返回此 UUID 的 128 位值中的最低有效 64 位。 + * + * @return 此 UUID 的 128 位值中的最低有效 64 位。 + */ + public long getLeastSignificantBits() + { + return leastSigBits; + } + + /** + * 返回此 UUID 的 128 位值中的最高有效 64 位。 + * + * @return 此 UUID 的 128 位值中最高有效 64 位。 + */ + public long getMostSignificantBits() + { + return mostSigBits; + } + + /** + * 与此 {@code UUID} 相关联的版本号. 版本号描述此 {@code UUID} 是如何生成的。 + *

+ * 版本号具有以下含意: + *

    + *
  • 1 基于时间的 UUID + *
  • 2 DCE 安全 UUID + *
  • 3 基于名称的 UUID + *
  • 4 随机生成的 UUID + *
+ * + * @return 此 {@code UUID} 的版本号 + */ + public int version() + { + // Version is bits masked by 0x000000000000F000 in MS long + return (int) ((mostSigBits >> 12) & 0x0f); + } + + /** + * 与此 {@code UUID} 相关联的变体号。变体号描述 {@code UUID} 的布局。 + *

+ * 变体号具有以下含意: + *

    + *
  • 0 为 NCS 向后兼容保留 + *
  • 2 IETF RFC 4122(Leach-Salz), 用于此类 + *
  • 6 保留,微软向后兼容 + *
  • 7 保留供以后定义使用 + *
+ * + * @return 此 {@code UUID} 相关联的变体号 + */ + public int variant() + { + // This field is composed of a varying number of bits. + // 0 - - Reserved for NCS backward compatibility + // 1 0 - The IETF aka Leach-Salz variant (used by this class) + // 1 1 0 Reserved, Microsoft backward compatibility + // 1 1 1 Reserved for future definition. + return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63)); + } + + /** + * 与此 UUID 相关联的时间戳值。 + * + *

+ * 60 位的时间戳值根据此 {@code UUID} 的 time_low、time_mid 和 time_hi 字段构造。
+ * 所得到的时间戳以 100 毫微秒为单位,从 UTC(通用协调时间) 1582 年 10 月 15 日零时开始。 + * + *

+ * 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。
+ * 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。 + */ + public long timestamp() throws UnsupportedOperationException + { + checkTimeBase(); + return (mostSigBits & 0x0FFFL) << 48// + | ((mostSigBits >> 16) & 0x0FFFFL) << 32// + | mostSigBits >>> 32; + } + + /** + * 与此 UUID 相关联的时钟序列值。 + * + *

+ * 14 位的时钟序列值根据此 UUID 的 clock_seq 字段构造。clock_seq 字段用于保证在基于时间的 UUID 中的时间唯一性。 + *

+ * {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出 + * UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的时钟序列 + * + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public int clockSequence() throws UnsupportedOperationException + { + checkTimeBase(); + return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48); + } + + /** + * 与此 UUID 相关的节点值。 + * + *

+ * 48 位的节点值根据此 UUID 的 node 字段构造。此字段旨在用于保存机器的 IEEE 802 地址,该地址用于生成此 UUID 以保证空间唯一性。 + *

+ * 节点值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。
+ * 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的节点值 + * + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public long node() throws UnsupportedOperationException + { + checkTimeBase(); + return leastSigBits & 0x0000FFFFFFFFFFFFL; + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + *

+ * UUID 的字符串表示形式由此 BNF 描述: + * + *

+     * {@code
+     * UUID                   = ----
+     * time_low               = 4*
+     * time_mid               = 2*
+     * time_high_and_version  = 2*
+     * variant_and_sequence   = 2*
+     * node                   = 6*
+     * hexOctet               = 
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * 
+ * + * + * + * @return 此{@code UUID} 的字符串表现形式 + * @see #toString(boolean) + */ + @Override + public String toString() + { + return toString(false); + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + *

+ * UUID 的字符串表示形式由此 BNF 描述: + * + *

+     * {@code
+     * UUID                   = ----
+     * time_low               = 4*
+     * time_mid               = 2*
+     * time_high_and_version  = 2*
+     * variant_and_sequence   = 2*
+     * node                   = 6*
+     * hexOctet               = 
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * 
+ * + * + * + * @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串 + * @return 此{@code UUID} 的字符串表现形式 + */ + public String toString(boolean isSimple) + { + final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36); + // time_low + builder.append(digits(mostSigBits >> 32, 8)); + if (false == isSimple) + { + builder.append('-'); + } + // time_mid + builder.append(digits(mostSigBits >> 16, 4)); + if (false == isSimple) + { + builder.append('-'); + } + // time_high_and_version + builder.append(digits(mostSigBits, 4)); + if (false == isSimple) + { + builder.append('-'); + } + // variant_and_sequence + builder.append(digits(leastSigBits >> 48, 4)); + if (false == isSimple) + { + builder.append('-'); + } + // node + builder.append(digits(leastSigBits, 12)); + + return builder.toString(); + } + + /** + * 返回此 UUID 的哈希码。 + * + * @return UUID 的哈希码值。 + */ + @Override + public int hashCode() + { + long hilo = mostSigBits ^ leastSigBits; + return ((int) (hilo >> 32)) ^ (int) hilo; + } + + /** + * 将此对象与指定对象比较。 + *

+ * 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。 + * + * @param obj 要与之比较的对象 + * + * @return 如果对象相同,则返回 {@code true};否则返回 {@code false} + */ + @Override + public boolean equals(Object obj) + { + if ((null == obj) || (obj.getClass() != UUID.class)) + { + return false; + } + UUID id = (UUID) obj; + return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits); + } + + // Comparison Operations + + /** + * 将此 UUID 与指定的 UUID 比较。 + * + *

+ * 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。 + * + * @param val 与此 UUID 比较的 UUID + * + * @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。 + * + */ + @Override + public int compareTo(UUID val) + { + // The ordering is intentionally set up so that the UUIDs + // can simply be numerically compared as two numbers + return (this.mostSigBits < val.mostSigBits ? -1 : // + (this.mostSigBits > val.mostSigBits ? 1 : // + (this.leastSigBits < val.leastSigBits ? -1 : // + (this.leastSigBits > val.leastSigBits ? 1 : // + 0)))); + } + + // ------------------------------------------------------------------------------------------------------------------- + // Private method start + /** + * 返回指定数字对应的hex值 + * + * @param val 值 + * @param digits 位 + * @return 值 + */ + private static String digits(long val, int digits) + { + long hi = 1L << (digits * 4); + return Long.toHexString(hi | (val & (hi - 1))).substring(1); + } + + /** + * 检查是否为time-based版本UUID + */ + private void checkTimeBase() + { + if (version() != 1) + { + throw new UnsupportedOperationException("Not a time-based UUID"); + } + } + + /** + * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG) + * + * @return {@link SecureRandom} + */ + public static SecureRandom getSecureRandom() + { + try + { + return SecureRandom.getInstance("SHA1PRNG"); + } + catch (NoSuchAlgorithmException e) + { + throw new UtilException(e); + } + } + + /** + * 获取随机数生成器对象
+ * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。 + * + * @return {@link ThreadLocalRandom} + */ + public static ThreadLocalRandom getRandom() + { + return ThreadLocalRandom.current(); + } +}