commit 2e054b096674f1c66f2f2a4b8b23e10938cf3742 Author: wangxulei <727869402@qq.com> Date: Fri Dec 6 22:42:03 2024 +0800 第一次提交 diff --git a/07e05adbd0ad444c94dbff007c286782.png b/07e05adbd0ad444c94dbff007c286782.png new file mode 100644 index 0000000..2eca169 Binary files /dev/null and b/07e05adbd0ad444c94dbff007c286782.png differ diff --git a/132ecc5b910049c5a970a32c42d9d069.png b/132ecc5b910049c5a970a32c42d9d069.png new file mode 100644 index 0000000..380e5ec Binary files /dev/null and b/132ecc5b910049c5a970a32c42d9d069.png differ diff --git a/3281c7e277534f11b7fb431afcf4b8b1.png b/3281c7e277534f11b7fb431afcf4b8b1.png new file mode 100644 index 0000000..a53e850 Binary files /dev/null and b/3281c7e277534f11b7fb431afcf4b8b1.png differ diff --git a/7107613a141f4739ad385773b0199aa9.png b/7107613a141f4739ad385773b0199aa9.png new file mode 100644 index 0000000..dbab412 Binary files /dev/null and b/7107613a141f4739ad385773b0199aa9.png differ diff --git a/9ab46710e8134feda151c12b282a931f.png b/9ab46710e8134feda151c12b282a931f.png new file mode 100644 index 0000000..ac649f7 Binary files /dev/null and b/9ab46710e8134feda151c12b282a931f.png differ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/README.md b/README.md new file mode 100644 index 0000000..6d50007 --- /dev/null +++ b/README.md @@ -0,0 +1,74 @@ + +**线上预览:** [http://120.26.95.195:8889/](http://120.26.95.195:8889/) + +**欢迎页** +![欢迎页](preview/2021204%20(2).png) +**收银台** +![收银台](preview/2021204%20(5).png) +![收银台-开卡](preview/2021204%20(4).png) +**会员管理** +![会员管理](preview/2021204%20(6).png) +**库存管理** +![入库](preview/2021204%20(1).png) +![选择商品](preview/2021204%20(8).png) +**订单管理** +![订单管理](preview/2021204%20(3).png) + +## 简单版思维导图 +![思维导图](whiteboard_exported_image.png) +## springboot_vue + +正式开发前我们都需要一个完整的 可拓展性基础框架用于后续项目进行 这里我就把自己用的一套整合出来供大家学习使用 + +## 首先你要掌握的技能 + +在这里我不再对整合进行赘述 技能从来都是从实战中积累的: + 1. springboot框架的基本使用; + 2. jwt security的基本整合; + 3. mybatisplus 的使用 (基于瓷完成了前后端代码生成); + 4. rabc框架的基本理解; + 5. vue环境的基本搭建 npm命令使用; + 6. element框架的整合; + 7. linux简单部署(这个后续我会结合脚本来进行); + +## 我们将要做的系统的一个展示 + +![系统演示](a5ce34cbfe774c9fbad8be527b869f3b.png) + + 1. 动态路由 有了这个功能 前端就不用进行硬代码的配置 后台编辑即可 也可以快速的进行路由的改名和删除 + 2. 多角色 基础动态路由 多角色就变的简单了 同时也更方便管理系统 + 3. 多tab客户还是习惯像打开浏览器那也操作我们的系统 所以这个必不可少 + +## 包结构说名 +后端 + + - 目前后端功能基本能满足我们需求 + - 后续开发建立和system同级目录 进行功能开发即可 +![后台包目录](07e05adbd0ad444c94dbff007c286782.png) +前端 +![前台包目录](7107613a141f4739ad385773b0199aa9.png) + +## 程序的运行 +**后端** + 1. 导入pom文件进行依赖下载 + 2. 修改yml数据源和缓存配置 + 3. 运行AdminApplication 启动 + +**前端** +1. 执行npm install 下载依赖(下载慢可以执行) `npm conf set registry https://registry.npm.taobao.org` +2. npm run dev进行系统的启动 + +## 启动后截图 +**登陆** +![登陆](b41683ee6b144da7afed88e485882213.png) +**工作台** +![工作台](9ab46710e8134feda151c12b282a931f.png) +**菜单权限管理** +![输入图片说明](3281c7e277534f11b7fb431afcf4b8b1.png) +![输入图片说明](132ecc5b910049c5a970a32c42d9d069.png) + + +## 写到最后 +**代码地址** [https://gitee.com/ddeatrr/springboot_vue](https://gitee.com/xay12/springboot_vue) +**问题反馈** qq: 727869402 wx: MAMBA_4EVER24 + diff --git a/a5ce34cbfe774c9fbad8be527b869f3b.png b/a5ce34cbfe774c9fbad8be527b869f3b.png new file mode 100644 index 0000000..4479275 Binary files /dev/null and b/a5ce34cbfe774c9fbad8be527b869f3b.png differ diff --git a/b41683ee6b144da7afed88e485882213.png b/b41683ee6b144da7afed88e485882213.png new file mode 100644 index 0000000..12aaade Binary files /dev/null and b/b41683ee6b144da7afed88e485882213.png differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..9c500ec --- /dev/null +++ b/pom.xml @@ -0,0 +1,160 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.5.12 + + + com.dd + member + 0.1 + admin + Demo project for Spring Boot + + 1.8 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.security + spring-security-test + test + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + org.springframework.boot + spring-boot-starter-aop + + + + mysql + mysql-connector-java + runtime + + + + org.projectlombok + lombok + true + + + + com.baomidou + mybatis-plus-boot-starter + 3.4.3 + + + + com.baomidou + mybatis-plus-generator + 3.4.1 + + + + org.springframework.boot + spring-boot-starter-freemarker + + + + + com.github.xiaoymin + knife4j-spring-boot-starter + 2.0.7 + + + + + + cn.hutool + hutool-all + 5.7.2 + + + + com.alibaba + fastjson + 1.2.73 + + + + + io.jsonwebtoken + jjwt + 0.9.1 + + + + + p6spy + p6spy + 3.8.5 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + src/main/java + + **/*.properties + **/*.xml + + false + + + src/main/resources + + + + + diff --git a/preview/2021204 (1).png b/preview/2021204 (1).png new file mode 100644 index 0000000..c6b43a3 Binary files /dev/null and b/preview/2021204 (1).png differ diff --git a/preview/2021204 (2).png b/preview/2021204 (2).png new file mode 100644 index 0000000..f9a783f Binary files /dev/null and b/preview/2021204 (2).png differ diff --git a/preview/2021204 (3).png b/preview/2021204 (3).png new file mode 100644 index 0000000..74571da Binary files /dev/null and b/preview/2021204 (3).png differ diff --git a/preview/2021204 (4).png b/preview/2021204 (4).png new file mode 100644 index 0000000..fcfee31 Binary files /dev/null and b/preview/2021204 (4).png differ diff --git a/preview/2021204 (5).png b/preview/2021204 (5).png new file mode 100644 index 0000000..5e9527f Binary files /dev/null and b/preview/2021204 (5).png differ diff --git a/preview/2021204 (6).png b/preview/2021204 (6).png new file mode 100644 index 0000000..650b12d Binary files /dev/null and b/preview/2021204 (6).png differ diff --git a/preview/2021204 (7).png b/preview/2021204 (7).png new file mode 100644 index 0000000..2ff7907 Binary files /dev/null and b/preview/2021204 (7).png differ diff --git a/preview/2021204 (8).png b/preview/2021204 (8).png new file mode 100644 index 0000000..2b8d691 Binary files /dev/null and b/preview/2021204 (8).png differ diff --git a/src/main/java/com/dd/admin/AdminApplication.java b/src/main/java/com/dd/admin/AdminApplication.java new file mode 100644 index 0000000..07d2945 --- /dev/null +++ b/src/main/java/com/dd/admin/AdminApplication.java @@ -0,0 +1,13 @@ +package com.dd.admin; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AdminApplication { + + public static void main(String[] args) { + SpringApplication.run(AdminApplication.class, args); + } + +} diff --git a/src/main/java/com/dd/admin/business/card/controller/CardController.java b/src/main/java/com/dd/admin/business/card/controller/CardController.java new file mode 100644 index 0000000..9dc1e57 --- /dev/null +++ b/src/main/java/com/dd/admin/business/card/controller/CardController.java @@ -0,0 +1,95 @@ +package com.dd.admin.business.card.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.dd.admin.common.aop.operationLog.aop.OperLog; +import com.dd.admin.common.aop.operationLog.aop.OperType; +import com.dd.admin.common.security.SecurityUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.business.card.entity.Card; +import com.dd.admin.business.card.domain.CardVo; +import com.dd.admin.business.card.domain.CardDto; +import com.dd.admin.business.card.service.CardService; + +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-17 + */ +@Api(tags = "") +@RestController +public class CardController { + + @Autowired + CardService cardService; + + @ApiOperation(value = "-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/card/page") + @OperLog(operModule = "获取卡项列表",operType = OperType.QUERY,operDesc = "获取卡项列表") + public ResultBean> page(CardDto cardDto) { + cardDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + IPage pageInfo = cardService.selectCardPage(cardDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/card/list") + public ResultBean> list(CardDto cardDto) { + cardDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + List list = cardService.selectCardList(cardDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/card/add") + @OperLog(operModule = "添加卡项",operType = OperType.ADD,operDesc = "添加卡项") + public ResultBean add(@RequestBody @Validated CardDto cardDto) { + Card card = BeanUtil.copyProperties(cardDto, Card.class); + cardService.save(card); + return ResultBean.success(card); + } + + @ApiOperation(value = "-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/card/{cardId}") + public ResultBean get(@PathVariable @NotBlank String cardId) { + Card card = cardService.getById(cardId); + CardVo cardVo = BeanUtil.copyProperties(card,CardVo.class); + return ResultBean.success(cardVo); + } + + @ApiOperation(value = "-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/card/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) CardDto cardDto) { + Card card = BeanUtil.copyProperties(cardDto, Card.class); + cardService.updateById(card); + return ResultBean.success(card); + } + + @ApiOperation(value = "-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/card/delete/{cardId}") + public ResultBean delete(@PathVariable @NotBlank String cardId) { + Boolean b = cardService.removeById(cardId); + return ResultBean.success(b); + } +} diff --git a/src/main/java/com/dd/admin/business/card/domain/CardDto.java b/src/main/java/com/dd/admin/business/card/domain/CardDto.java new file mode 100644 index 0000000..bc47bc7 --- /dev/null +++ b/src/main/java/com/dd/admin/business/card/domain/CardDto.java @@ -0,0 +1,94 @@ +package com.dd.admin.business.card.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-17 + */ +@Data +@ApiModel(value="接收对象") +public class CardDto { + + + @ApiModelProperty(value = "会员卡id") + @NotBlank(message = "id不能为空",groups = UpdateGroup.class) + private String cardId; + + @ApiModelProperty(value = "会员卡名") + private String cardName; + + @ApiModelProperty(value = "卡编号") + private BigDecimal cardNo; + + @ApiModelProperty(value = "预设开卡金") + private BigDecimal cardAmount; + + @ApiModelProperty(value = "预设赠送金") + private BigDecimal giveAmount; + + @ApiModelProperty(value = "最低开卡金额") + private BigDecimal buildCardAmount; + + @ApiModelProperty(value = "卡折扣") + private BigDecimal cardDiscount; + + @ApiModelProperty(value = "卡提成") + private BigDecimal cardPushPercent; + + @ApiModelProperty(value = "工本费用") + private String todos; + + @ApiModelProperty(value = "0正常 1下架") + private Integer cardStatus; + + @ApiModelProperty(value = "0正常 1删除") + private Integer deleted; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "搜索关键字") + private String keyword; +} diff --git a/src/main/java/com/dd/admin/business/card/domain/CardVo.java b/src/main/java/com/dd/admin/business/card/domain/CardVo.java new file mode 100644 index 0000000..2940e5c --- /dev/null +++ b/src/main/java/com/dd/admin/business/card/domain/CardVo.java @@ -0,0 +1,89 @@ +package com.dd.admin.business.card.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-17 + */ +@Data +@ApiModel(value="返回对象") +public class CardVo { + + + @ApiModelProperty(value = "会员卡id") + private String cardId; + + @ApiModelProperty(value = "会员卡名") + private String cardName; + + @ApiModelProperty(value = "卡编号") + private String cardNo; + + @ApiModelProperty(value = "预设开卡金") + private BigDecimal cardAmount; + + @ApiModelProperty(value = "预设赠送金") + private BigDecimal giveAmount; + + @ApiModelProperty(value = "最低开卡金额") + private BigDecimal buildCardAmount; + + @ApiModelProperty(value = "卡折扣") + private BigDecimal cardDiscount; + + @ApiModelProperty(value = "卡提成") + private BigDecimal cardPushPercent; + + @ApiModelProperty(value = "工本费用") + private BigDecimal todos; + + @ApiModelProperty(value = "0正常 1下架") + private Integer cardStatus; + + @ApiModelProperty(value = "0正常 1删除") + private Integer deleted; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + +} diff --git a/src/main/java/com/dd/admin/business/card/entity/Card.java b/src/main/java/com/dd/admin/business/card/entity/Card.java new file mode 100644 index 0000000..c4082c9 --- /dev/null +++ b/src/main/java/com/dd/admin/business/card/entity/Card.java @@ -0,0 +1,112 @@ +package com.dd.admin.business.card.entity; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * + *

+ * + * @author 727869402@qq.com + * @since 2024-06-17 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_card") +@ApiModel(value="Card对象", description="") +public class Card implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "会员卡id") + @TableId(value = "CARD_ID", type = IdType.ASSIGN_UUID) + private String cardId; + + @ApiModelProperty(value = "会员卡名") + @TableField("CARD_NAME") + private String cardName; + + @ApiModelProperty(value = "卡编号") + @TableField("CARD_NO") + private String cardNo; + + @ApiModelProperty(value = "预设开卡金") + @TableField("CARD_AMOUNT") + private BigDecimal cardAmount; + + @ApiModelProperty(value = "预设赠送金") + @TableField("GIVE_AMOUNT") + private BigDecimal giveAmount; + + @ApiModelProperty(value = "最低开卡金额") + @TableField("BUILD_CARD_AMOUNT") + private BigDecimal buildCardAmount; + + @ApiModelProperty(value = "卡折扣") + @TableField("CARD_DISCOUNT") + private BigDecimal cardDiscount; + + @ApiModelProperty(value = "卡提成") + @TableField("CARD_PUSH_PERCENT") + private BigDecimal cardPushPercent; + + @ApiModelProperty(value = "工本费用") + @TableField("TODOS") + private BigDecimal todos; + + @ApiModelProperty(value = "0正常 1下架") + @TableField("CARD_STATUS") + private Integer cardStatus; + + @ApiModelProperty(value = "0正常 1删除") + @TableField("DELETED") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "门店id") + @TableField(value = "SHOP_ID", fill = FieldFill.INSERT) + private String shopId; + + @ApiModelProperty(value = "门店名") + @TableField(value = "SHOP_NAME", fill = FieldFill.INSERT) + private String shopName; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "修改人") + @TableField(value = "UPDATE_NAME", fill = FieldFill.UPDATE) + private String updateName; + + @ApiModelProperty(value = "修改人id") + @TableField(value = "UPDATE_ID", fill = FieldFill.UPDATE) + private String updateId; + + +} diff --git a/src/main/java/com/dd/admin/business/card/mapper/CardMapper.java b/src/main/java/com/dd/admin/business/card/mapper/CardMapper.java new file mode 100644 index 0000000..2acc653 --- /dev/null +++ b/src/main/java/com/dd/admin/business/card/mapper/CardMapper.java @@ -0,0 +1,28 @@ +package com.dd.admin.business.card.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.card.entity.Card; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.business.card.domain.CardVo; +import com.dd.admin.business.card.domain.CardDto; + +import java.util.List; + +/** + *

+ * Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-17 + */ +@Mapper +public interface CardMapper extends BaseMapper { + + IPage selectCardPage(Page page, @Param("cardDto") CardDto cardDto); + + List selectCardList(@Param("cardDto") CardDto cardDto); +} diff --git a/src/main/java/com/dd/admin/business/card/mapper/xml/CardMapper.xml b/src/main/java/com/dd/admin/business/card/mapper/xml/CardMapper.xml new file mode 100644 index 0000000..7f5c718 --- /dev/null +++ b/src/main/java/com/dd/admin/business/card/mapper/xml/CardMapper.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CARD_ID, CARD_NAME, CARD_NO, CARD_AMOUNT, GIVE_AMOUNT, BUILD_CARD_AMOUNT, CARD_DISCOUNT, CARD_PUSH_PERCENT, TODOS, CARD_STATUS, DELETED, SHOP_ID, SHOP_NAME, CREATE_NAME, CREATE_TIME, CREATE_ID, UPDATE_TIME, UPDATE_NAME, UPDATE_ID + + + + + + diff --git a/src/main/java/com/dd/admin/business/card/service/CardService.java b/src/main/java/com/dd/admin/business/card/service/CardService.java new file mode 100644 index 0000000..2308b90 --- /dev/null +++ b/src/main/java/com/dd/admin/business/card/service/CardService.java @@ -0,0 +1,26 @@ +package com.dd.admin.business.card.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.business.card.entity.Card; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.business.card.domain.CardVo; +import com.dd.admin.business.card.domain.CardDto; +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-17 + */ +public interface CardService extends IService { + + //-分页列表 + IPage selectCardPage(CardDto cardDto); + + //-列表 + List selectCardList(CardDto cardDto); + +} diff --git a/src/main/java/com/dd/admin/business/card/service/impl/CardServiceImpl.java b/src/main/java/com/dd/admin/business/card/service/impl/CardServiceImpl.java new file mode 100644 index 0000000..45a1c17 --- /dev/null +++ b/src/main/java/com/dd/admin/business/card/service/impl/CardServiceImpl.java @@ -0,0 +1,36 @@ +package com.dd.admin.business.card.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.business.card.entity.Card; +import com.dd.admin.business.card.mapper.CardMapper; +import com.dd.admin.business.card.service.CardService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.dd.admin.business.card.domain.CardVo; +import com.dd.admin.business.card.domain.CardDto; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-17 + */ +@Service +public class CardServiceImpl extends ServiceImpl implements CardService { + + @Override + public IPage selectCardPage(CardDto cardDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectCardPage(page,cardDto); + } + + @Override + public List selectCardList(CardDto cardDto) { + return baseMapper.selectCardList(cardDto); + } +} diff --git a/src/main/java/com/dd/admin/business/category/controller/CategoryController.java b/src/main/java/com/dd/admin/business/category/controller/CategoryController.java new file mode 100644 index 0000000..b10d0a1 --- /dev/null +++ b/src/main/java/com/dd/admin/business/category/controller/CategoryController.java @@ -0,0 +1,95 @@ +package com.dd.admin.business.category.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.dd.admin.common.aop.operationLog.aop.OperLog; +import com.dd.admin.common.aop.operationLog.aop.OperType; +import com.dd.admin.common.security.SecurityUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.business.category.entity.Category; +import com.dd.admin.business.category.domain.CategoryVo; +import com.dd.admin.business.category.domain.CategoryDto; +import com.dd.admin.business.category.service.CategoryService; + +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 分类 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-22 + */ +@Api(tags = "分类") +@RestController +public class CategoryController { + + @Autowired + CategoryService categoryService; + + @ApiOperation(value = "分类-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/category/page") + @OperLog(operModule = "获取分页列表",operType = OperType.QUERY,operDesc = "获取分页列表") + public ResultBean> page(CategoryDto categoryDto) { + categoryDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + IPage pageInfo = categoryService.selectCategoryPage(categoryDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "分类-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/category/list") + public ResultBean> list(CategoryDto categoryDto) { + categoryDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + List list = categoryService.selectCategoryList(categoryDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "分类-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/category/add") + @OperLog(operModule = "添加分类",operType = OperType.ADD,operDesc = "添加分类") + public ResultBean add(@RequestBody @Validated CategoryDto categoryDto) { + Category category = BeanUtil.copyProperties(categoryDto, Category.class); + categoryService.save(category); + return ResultBean.success(category); + } + + @ApiOperation(value = "分类-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/category/{categoryId}") + public ResultBean get(@PathVariable @NotBlank String categoryId) { + Category category = categoryService.getById(categoryId); + CategoryVo categoryVo = BeanUtil.copyProperties(category,CategoryVo.class); + return ResultBean.success(categoryVo); + } + + @ApiOperation(value = "分类-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/category/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) CategoryDto categoryDto) { + Category category = BeanUtil.copyProperties(categoryDto, Category.class); + categoryService.updateById(category); + return ResultBean.success(category); + } + + @ApiOperation(value = "分类-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/category/delete/{categoryId}") + public ResultBean delete(@PathVariable @NotBlank String categoryId) { + Boolean b = categoryService.removeById(categoryId); + return ResultBean.success(b); + } +} diff --git a/src/main/java/com/dd/admin/business/category/domain/CategoryDto.java b/src/main/java/com/dd/admin/business/category/domain/CategoryDto.java new file mode 100644 index 0000000..a8ec96d --- /dev/null +++ b/src/main/java/com/dd/admin/business/category/domain/CategoryDto.java @@ -0,0 +1,68 @@ +package com.dd.admin.business.category.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 分类返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-22 + */ +@Data +@ApiModel(value="分类接收对象") +public class CategoryDto { + + + @ApiModelProperty(value = "分类id") + @NotBlank(message = "分类id不能为空",groups = UpdateGroup.class) + private String categoryId; + + @ApiModelProperty(value = "分类名") + private String categoryName; + + @ApiModelProperty(value = "0正常 1禁用") + private Integer categoryStatus; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "搜索关键字") + private String keyword; +} diff --git a/src/main/java/com/dd/admin/business/category/domain/CategoryVo.java b/src/main/java/com/dd/admin/business/category/domain/CategoryVo.java new file mode 100644 index 0000000..204e947 --- /dev/null +++ b/src/main/java/com/dd/admin/business/category/domain/CategoryVo.java @@ -0,0 +1,63 @@ +package com.dd.admin.business.category.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 分类返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-22 + */ +@Data +@ApiModel(value="分类返回对象") +public class CategoryVo { + + + @ApiModelProperty(value = "分类id") + private String categoryId; + + @ApiModelProperty(value = "分类名") + private String categoryName; + + @ApiModelProperty(value = "0正常 1禁用") + private Integer categoryStatus; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + +} diff --git a/src/main/java/com/dd/admin/business/category/entity/Category.java b/src/main/java/com/dd/admin/business/category/entity/Category.java new file mode 100644 index 0000000..99c55f2 --- /dev/null +++ b/src/main/java/com/dd/admin/business/category/entity/Category.java @@ -0,0 +1,77 @@ +package com.dd.admin.business.category.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 分类 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-22 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_category") +@ApiModel(value="Category对象", description="分类") +public class Category implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "分类id") + @TableId(value = "CATEGORY_ID", type = IdType.ASSIGN_UUID) + private String categoryId; + + @ApiModelProperty(value = "分类名") + @TableField("CATEGORY_NAME") + private String categoryName; + + @ApiModelProperty(value = "0正常 1禁用") + @TableField("CATEGORY_STATUS") + private Integer categoryStatus; + + @ApiModelProperty(value = "门店id") + @TableField(value = "SHOP_ID", fill = FieldFill.INSERT) + private String shopId; + + @ApiModelProperty(value = "门店名") + @TableField(value = "SHOP_NAME", fill = FieldFill.INSERT) + private String shopName; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "修改人") + @TableField(value = "UPDATE_NAME", fill = FieldFill.UPDATE) + private String updateName; + + @ApiModelProperty(value = "修改人id") + @TableField(value = "UPDATE_ID", fill = FieldFill.UPDATE) + private String updateId; + + +} diff --git a/src/main/java/com/dd/admin/business/category/mapper/CategoryMapper.java b/src/main/java/com/dd/admin/business/category/mapper/CategoryMapper.java new file mode 100644 index 0000000..a739667 --- /dev/null +++ b/src/main/java/com/dd/admin/business/category/mapper/CategoryMapper.java @@ -0,0 +1,28 @@ +package com.dd.admin.business.category.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.category.entity.Category; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.business.category.domain.CategoryVo; +import com.dd.admin.business.category.domain.CategoryDto; + +import java.util.List; + +/** + *

+ * 分类 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-22 + */ +@Mapper +public interface CategoryMapper extends BaseMapper { + + IPage selectCategoryPage(Page page, @Param("categoryDto") CategoryDto categoryDto); + + List selectCategoryList(@Param("categoryDto") CategoryDto categoryDto); +} diff --git a/src/main/java/com/dd/admin/business/category/mapper/xml/CategoryMapper.xml b/src/main/java/com/dd/admin/business/category/mapper/xml/CategoryMapper.xml new file mode 100644 index 0000000..26bcfa1 --- /dev/null +++ b/src/main/java/com/dd/admin/business/category/mapper/xml/CategoryMapper.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + CATEGORY_ID, CATEGORY_NAME, CATEGORY_STATUS, SHOP_ID, SHOP_NAME, CREATE_NAME, CREATE_TIME, CREATE_ID, UPDATE_TIME, UPDATE_NAME, UPDATE_ID + + + + + + diff --git a/src/main/java/com/dd/admin/business/category/service/CategoryService.java b/src/main/java/com/dd/admin/business/category/service/CategoryService.java new file mode 100644 index 0000000..03cc5b3 --- /dev/null +++ b/src/main/java/com/dd/admin/business/category/service/CategoryService.java @@ -0,0 +1,26 @@ +package com.dd.admin.business.category.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.business.category.entity.Category; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.business.category.domain.CategoryVo; +import com.dd.admin.business.category.domain.CategoryDto; +import java.util.List; + +/** + *

+ * 分类 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-22 + */ +public interface CategoryService extends IService { + + //分类-分页列表 + IPage selectCategoryPage(CategoryDto categoryDto); + + //分类-列表 + List selectCategoryList(CategoryDto categoryDto); + +} diff --git a/src/main/java/com/dd/admin/business/category/service/impl/CategoryServiceImpl.java b/src/main/java/com/dd/admin/business/category/service/impl/CategoryServiceImpl.java new file mode 100644 index 0000000..b2c3414 --- /dev/null +++ b/src/main/java/com/dd/admin/business/category/service/impl/CategoryServiceImpl.java @@ -0,0 +1,36 @@ +package com.dd.admin.business.category.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.business.category.entity.Category; +import com.dd.admin.business.category.mapper.CategoryMapper; +import com.dd.admin.business.category.service.CategoryService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.dd.admin.business.category.domain.CategoryVo; +import com.dd.admin.business.category.domain.CategoryDto; +import java.util.List; + +/** + *

+ * 分类 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-22 + */ +@Service +public class CategoryServiceImpl extends ServiceImpl implements CategoryService { + + @Override + public IPage selectCategoryPage(CategoryDto categoryDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectCategoryPage(page,categoryDto); + } + + @Override + public List selectCategoryList(CategoryDto categoryDto) { + return baseMapper.selectCategoryList(categoryDto); + } +} diff --git a/src/main/java/com/dd/admin/business/detailServer/controller/SellDetailServerController.java b/src/main/java/com/dd/admin/business/detailServer/controller/SellDetailServerController.java new file mode 100644 index 0000000..fb42339 --- /dev/null +++ b/src/main/java/com/dd/admin/business/detailServer/controller/SellDetailServerController.java @@ -0,0 +1,88 @@ +package com.dd.admin.business.detailServer.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.business.detailServer.entity.SellDetailServer; +import com.dd.admin.business.detailServer.domain.SellDetailServerVo; +import com.dd.admin.business.detailServer.domain.SellDetailServerDto; +import com.dd.admin.business.detailServer.service.SellDetailServerService; + +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 订单详单服务人员 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2024-11-28 + */ +@Api(tags = "订单详单服务人员") +@RestController +public class SellDetailServerController { + + @Autowired + SellDetailServerService detailServerService; + + @ApiOperation(value = "订单详单服务人员-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/detailServer/page") + public ResultBean> page(SellDetailServerDto detailServerDto) { + IPage pageInfo = detailServerService.selectSellDetailServerPage(detailServerDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "订单详单服务人员-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/detailServer/list") + public ResultBean> list(SellDetailServerDto detailServerDto) { + List list = detailServerService.selectSellDetailServerList(detailServerDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "订单详单服务人员-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/detailServer/add") + public ResultBean add(@RequestBody @Validated SellDetailServerDto detailServerDto) { + SellDetailServer detailServer = BeanUtil.copyProperties(detailServerDto, SellDetailServer.class); + detailServerService.save(detailServer); + return ResultBean.success(detailServer); + } + + @ApiOperation(value = "订单详单服务人员-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/detailServer/{detailServerId}") + public ResultBean get(@PathVariable @NotBlank String detailServerId) { + SellDetailServer detailServer = detailServerService.getById(detailServerId); + SellDetailServerVo detailServerVo = BeanUtil.copyProperties(detailServer,SellDetailServerVo.class); + return ResultBean.success(detailServerVo); + } + + @ApiOperation(value = "订单详单服务人员-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/detailServer/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) SellDetailServerDto detailServerDto) { + SellDetailServer detailServer = BeanUtil.copyProperties(detailServerDto, SellDetailServer.class); + detailServerService.updateById(detailServer); + return ResultBean.success(detailServer); + } + + @ApiOperation(value = "订单详单服务人员-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/detailServer/delete/{detailServerId}") + public ResultBean delete(@PathVariable @NotBlank String detailServerId) { + Boolean b = detailServerService.removeById(detailServerId); + return ResultBean.success(b); + } +} diff --git a/src/main/java/com/dd/admin/business/detailServer/domain/SellDetailServerDto.java b/src/main/java/com/dd/admin/business/detailServer/domain/SellDetailServerDto.java new file mode 100644 index 0000000..2a2c14a --- /dev/null +++ b/src/main/java/com/dd/admin/business/detailServer/domain/SellDetailServerDto.java @@ -0,0 +1,83 @@ +package com.dd.admin.business.detailServer.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 订单详单服务人员返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-11-28 + */ +@Data +@ApiModel(value="订单详单服务人员接收对象") +public class SellDetailServerDto { + + + @ApiModelProperty(value = "详单对应服务人员记录id") + @NotBlank(message = "订单详单服务人员id不能为空",groups = UpdateGroup.class) + private String detailServerId; + + @ApiModelProperty(value = "订单id") + private String sellId; + + @ApiModelProperty(value = "详单id") + private String sellDetailId; + + @ApiModelProperty(value = "服务人员") + private String serverId; + + @ApiModelProperty(value = "服务人员") + private String serverName; + + @ApiModelProperty(value = "提成") + private BigDecimal serverPushMoney; + + @ApiModelProperty(value = "业绩") + private BigDecimal serverGrade; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "备注") + private String remark; + + +} diff --git a/src/main/java/com/dd/admin/business/detailServer/domain/SellDetailServerVo.java b/src/main/java/com/dd/admin/business/detailServer/domain/SellDetailServerVo.java new file mode 100644 index 0000000..57b006a --- /dev/null +++ b/src/main/java/com/dd/admin/business/detailServer/domain/SellDetailServerVo.java @@ -0,0 +1,79 @@ +package com.dd.admin.business.detailServer.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 订单详单服务人员返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-11-28 + */ +@Data +@ApiModel(value="订单详单服务人员返回对象") +public class SellDetailServerVo { + + + @ApiModelProperty(value = "详单对应服务人员记录id") + private String detailServerId; + + @ApiModelProperty(value = "订单id") + private String sellId; + + @ApiModelProperty(value = "详单id") + private String sellDetailId; + + @ApiModelProperty(value = "服务人员") + private String serverId; + + @ApiModelProperty(value = "服务人员") + private String serverName; + + @ApiModelProperty(value = "提成") + private BigDecimal serverPushMoney; + + @ApiModelProperty(value = "业绩") + private BigDecimal serverGrade; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "备注") + private String remark; + + +} diff --git a/src/main/java/com/dd/admin/business/detailServer/entity/SellDetailServer.java b/src/main/java/com/dd/admin/business/detailServer/entity/SellDetailServer.java new file mode 100644 index 0000000..58b8dc7 --- /dev/null +++ b/src/main/java/com/dd/admin/business/detailServer/entity/SellDetailServer.java @@ -0,0 +1,98 @@ +package com.dd.admin.business.detailServer.entity; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 订单详单服务人员 + *

+ * + * @author 727869402@qq.com + * @since 2024-11-28 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_sell_detail_server") +@ApiModel(value="SellDetailServer对象", description="订单详单服务人员") +public class SellDetailServer implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "详单对应服务人员记录id") + @TableId(value = "DETAIL_SERVER_ID", type = IdType.ASSIGN_UUID) + private String detailServerId; + + @ApiModelProperty(value = "订单id") + @TableField("SELL_ID") + private String sellId; + + @ApiModelProperty(value = "详单id") + @TableField("SELL_DETAIL_ID") + private String sellDetailId; + + @ApiModelProperty(value = "服务人员") + @TableField("SERVER_ID") + private String serverId; + + @ApiModelProperty(value = "服务人员") + @TableField("SERVER_NAME") + private String serverName; + + @ApiModelProperty(value = "提成") + @TableField("SERVER_PUSH_MONEY") + private BigDecimal serverPushMoney; + + @ApiModelProperty(value = "业绩") + @TableField("SERVER_GRADE") + private BigDecimal serverGrade; + + @ApiModelProperty(value = "门店id") + @TableField(value = "SHOP_ID", fill = FieldFill.INSERT) + private String shopId; + + @ApiModelProperty(value = "门店名") + @TableField(value = "SHOP_NAME", fill = FieldFill.INSERT) + private String shopName; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "修改人") + @TableField(value = "UPDATE_NAME", fill = FieldFill.UPDATE) + private String updateName; + + @ApiModelProperty(value = "修改人id") + @TableField(value = "UPDATE_ID", fill = FieldFill.UPDATE) + private String updateId; + + @ApiModelProperty(value = "备注") + @TableField("REMARK") + private String remark; + + +} diff --git a/src/main/java/com/dd/admin/business/detailServer/mapper/SellDetailServerMapper.java b/src/main/java/com/dd/admin/business/detailServer/mapper/SellDetailServerMapper.java new file mode 100644 index 0000000..433c1b4 --- /dev/null +++ b/src/main/java/com/dd/admin/business/detailServer/mapper/SellDetailServerMapper.java @@ -0,0 +1,28 @@ +package com.dd.admin.business.detailServer.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.detailServer.entity.SellDetailServer; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.business.detailServer.domain.SellDetailServerVo; +import com.dd.admin.business.detailServer.domain.SellDetailServerDto; + +import java.util.List; + +/** + *

+ * 订单详单服务人员 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2024-11-28 + */ +@Mapper +public interface SellDetailServerMapper extends BaseMapper { + + IPage selectSellDetailServerPage(Page page, @Param("detailServerDto") SellDetailServerDto detailServerDto); + + List selectSellDetailServerList(@Param("detailServerDto") SellDetailServerDto detailServerDto); +} diff --git a/src/main/java/com/dd/admin/business/detailServer/mapper/xml/SellDetailServerMapper.xml b/src/main/java/com/dd/admin/business/detailServer/mapper/xml/SellDetailServerMapper.xml new file mode 100644 index 0000000..2bf3045 --- /dev/null +++ b/src/main/java/com/dd/admin/business/detailServer/mapper/xml/SellDetailServerMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + DETAIL_SERVER_ID, SELL_ID, SELL_DETAIL_ID, SERVER_ID, SERVER_NAME, SERVER_PUSH_MONEY, SERVER_GRADE, SHOP_ID, SHOP_NAME, CREATE_NAME, CREATE_TIME, CREATE_ID, UPDATE_TIME, UPDATE_NAME, UPDATE_ID, REMARK + + + + + + diff --git a/src/main/java/com/dd/admin/business/detailServer/service/SellDetailServerService.java b/src/main/java/com/dd/admin/business/detailServer/service/SellDetailServerService.java new file mode 100644 index 0000000..a117d01 --- /dev/null +++ b/src/main/java/com/dd/admin/business/detailServer/service/SellDetailServerService.java @@ -0,0 +1,31 @@ +package com.dd.admin.business.detailServer.service; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.business.detailServer.entity.SellDetailServer; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.business.detailServer.domain.SellDetailServerVo; +import com.dd.admin.business.detailServer.domain.SellDetailServerDto; +import com.dd.admin.business.sellDetail.entity.SellDetail; + +import java.util.List; + +/** + *

+ * 订单详单服务人员 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2024-11-28 + */ +public interface SellDetailServerService extends IService { + + //订单详单服务人员-分页列表 + IPage selectSellDetailServerPage(SellDetailServerDto detailServerDto); + + //订单详单服务人员-列表 + List selectSellDetailServerList(SellDetailServerDto detailServerDto); + + List selectSellDetailServerListBySellDetailIds(List sellDetailIds); +} diff --git a/src/main/java/com/dd/admin/business/detailServer/service/impl/SellDetailServerServiceImpl.java b/src/main/java/com/dd/admin/business/detailServer/service/impl/SellDetailServerServiceImpl.java new file mode 100644 index 0000000..2a2457a --- /dev/null +++ b/src/main/java/com/dd/admin/business/detailServer/service/impl/SellDetailServerServiceImpl.java @@ -0,0 +1,49 @@ +package com.dd.admin.business.detailServer.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.sellDetail.entity.SellDetail; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.business.detailServer.entity.SellDetailServer; +import com.dd.admin.business.detailServer.mapper.SellDetailServerMapper; +import com.dd.admin.business.detailServer.service.SellDetailServerService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.dd.admin.business.detailServer.domain.SellDetailServerVo; +import com.dd.admin.business.detailServer.domain.SellDetailServerDto; +import java.util.List; + +/** + *

+ * 订单详单服务人员 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2024-11-28 + */ +@Service +public class SellDetailServerServiceImpl extends ServiceImpl implements SellDetailServerService { + + @Override + public IPage selectSellDetailServerPage(SellDetailServerDto detailServerDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectSellDetailServerPage(page,detailServerDto); + } + + @Override + public List selectSellDetailServerList(SellDetailServerDto detailServerDto) { + return baseMapper.selectSellDetailServerList(detailServerDto); + } + + @Override + public List selectSellDetailServerListBySellDetailIds(List sellDetailIds) { + LambdaQueryWrapper selldetailQueryWrapper = new LambdaQueryWrapper<>(); + if(CollectionUtil.isNotEmpty(sellDetailIds)){ + selldetailQueryWrapper.in(SellDetailServer::getSellDetailId, sellDetailIds); + } + List sellDetailList = this.list(selldetailQueryWrapper); + return sellDetailList; + } +} diff --git a/src/main/java/com/dd/admin/business/file/controller/FileController.java b/src/main/java/com/dd/admin/business/file/controller/FileController.java new file mode 100644 index 0000000..3613802 --- /dev/null +++ b/src/main/java/com/dd/admin/business/file/controller/FileController.java @@ -0,0 +1,104 @@ +package com.dd.admin.business.file.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.business.file.entity.File; +import com.dd.admin.business.file.domain.FileVo; +import com.dd.admin.business.file.domain.FileDto; +import com.dd.admin.business.file.service.FileService; + +import java.util.HashMap; +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +/** + *

+ * 文件 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-23 + */ +@Api(tags = "文件") +@RestController +public class FileController { + + @Autowired + FileService fileService; + + @ApiOperation(value = "文件-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/file/page") + public ResultBean> page(FileDto fileDto) { + IPage pageInfo = fileService.selectFilePage(fileDto); + + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "文件-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/file/list") + public ResultBean> list(FileDto fileDto) { + List list = fileService.selectFileList(fileDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "文件-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/file/add") + public ResultBean add(@RequestBody @Validated FileDto fileDto) { + File file = BeanUtil.copyProperties(fileDto, File.class); + fileService.save(file); + return ResultBean.success(file); + } + + @ApiOperation(value = "文件-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/file/{fileId}") + public ResultBean get(@PathVariable @NotBlank String fileId) { + File file = fileService.getById(fileId); + FileVo fileVo = BeanUtil.copyProperties(file,FileVo.class); + return ResultBean.success(fileVo); + } + + @ApiOperation(value = "文件-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/file/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) FileDto fileDto) { + File file = BeanUtil.copyProperties(fileDto, File.class); + fileService.updateById(file); + return ResultBean.success(file); + } + + @ApiOperation(value = "文件-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/file/delete/{fileId}") + public ResultBean delete(@PathVariable @NotBlank String fileId) { + Boolean b = fileService.removeById(fileId); + return ResultBean.success(b); + } + + @ApiOperation(value = "文件-上传") + @PostMapping("/upload") + @ResponseBody + public ResultBean layuiUpload(@RequestPart("file") MultipartFile file, String fileSavePath) { + FileVo uploadResult = fileService.uploadFile(file,fileSavePath); + String fileId = uploadResult.getFileId(); + String filePath = uploadResult.getFileSavePath(); + HashMap map = new HashMap<>(); + map.put("fileId", fileId); + map.put("filePath",filePath); + return ResultBean.success(map); + } +} diff --git a/src/main/java/com/dd/admin/business/file/domain/FileDto.java b/src/main/java/com/dd/admin/business/file/domain/FileDto.java new file mode 100644 index 0000000..3267cfe --- /dev/null +++ b/src/main/java/com/dd/admin/business/file/domain/FileDto.java @@ -0,0 +1,67 @@ +package com.dd.admin.business.file.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 文件返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-23 + */ +@Data +@ApiModel(value="文件接收对象") +public class FileDto { + + + @ApiModelProperty(value = "文件id") + @NotBlank(message = "文件id不能为空",groups = UpdateGroup.class) + private String fileId; + + @ApiModelProperty(value = "上级id") + private String parentId; + + @ApiModelProperty(value = "文件仓库(oss仓库)") + private String fileBucket; + + @ApiModelProperty(value = "文件名称") + private String fileName; + + @ApiModelProperty(value = "文件后缀") + private String fileSuffix; + + @ApiModelProperty(value = "文件大小kb") + private Long fileSizeKb; + + @ApiModelProperty(value = "文件唯一标识id") + private String finalName; + + @ApiModelProperty(value = "存储路径") + private String filePath; + + @ApiModelProperty(value = "0文件夹 1文件") + private Integer fileType; + + @ApiModelProperty(value = "存放的系统路径") + private String fileSysPath; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + +} diff --git a/src/main/java/com/dd/admin/business/file/domain/FileVo.java b/src/main/java/com/dd/admin/business/file/domain/FileVo.java new file mode 100644 index 0000000..ccd10f1 --- /dev/null +++ b/src/main/java/com/dd/admin/business/file/domain/FileVo.java @@ -0,0 +1,64 @@ +package com.dd.admin.business.file.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 文件返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-23 + */ +@Data +@ApiModel(value="文件返回对象") +public class FileVo { + + + @ApiModelProperty(value = "文件id") + private String fileId; + + @ApiModelProperty(value = "上级id") + private String parentId; + + @ApiModelProperty(value = "文件仓库(oss仓库)") + private String fileBucket; + + @ApiModelProperty(value = "文件名称") + private String fileName; + + @ApiModelProperty(value = "文件后缀") + private String fileSuffix; + + @ApiModelProperty(value = "文件大小kb") + private Long fileSizeKb; + + @ApiModelProperty(value = "文件唯一标识id") + private String finalName; + + @ApiModelProperty(value = "存储路径") + private String filePath; + + @ApiModelProperty(value = "0文件夹 1文件") + private Integer fileType; + + @ApiModelProperty(value = "存放的系统路径") + private String fileSysPath; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + private String originalFilename; + private String fileSavePath; +} diff --git a/src/main/java/com/dd/admin/business/file/entity/File.java b/src/main/java/com/dd/admin/business/file/entity/File.java new file mode 100644 index 0000000..499a6d6 --- /dev/null +++ b/src/main/java/com/dd/admin/business/file/entity/File.java @@ -0,0 +1,77 @@ +package com.dd.admin.business.file.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 文件 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_file") +@ApiModel(value="File对象", description="文件") +public class File implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "文件id") + @TableId(value = "FILE_ID", type = IdType.ASSIGN_UUID) + private String fileId; + + @ApiModelProperty(value = "上级id") + @TableField("PARENT_ID") + private String parentId; + + @ApiModelProperty(value = "文件仓库(oss仓库)") + @TableField("FILE_BUCKET") + private String fileBucket; + + @ApiModelProperty(value = "文件名称") + @TableField("FILE_NAME") + private String fileName; + + @ApiModelProperty(value = "文件后缀") + @TableField("FILE_SUFFIX") + private String fileSuffix; + + @ApiModelProperty(value = "文件大小kb") + @TableField("FILE_SIZE_KB") + private Long fileSizeKb; + + @ApiModelProperty(value = "文件唯一标识id") + @TableField("FINAL_NAME") + private String finalName; + + @ApiModelProperty(value = "存储路径") + @TableField("FILE_PATH") + private String filePath; + + @ApiModelProperty(value = "0文件夹 1文件") + @TableField("FILE_TYPE") + private Integer fileType; + + @ApiModelProperty(value = "存放的系统路径") + @TableField("FILE_SYS_PATH") + private String fileSysPath; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME") + private Date createTime; + + +} diff --git a/src/main/java/com/dd/admin/business/file/mapper/FileMapper.java b/src/main/java/com/dd/admin/business/file/mapper/FileMapper.java new file mode 100644 index 0000000..5083922 --- /dev/null +++ b/src/main/java/com/dd/admin/business/file/mapper/FileMapper.java @@ -0,0 +1,28 @@ +package com.dd.admin.business.file.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.file.entity.File; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.business.file.domain.FileVo; +import com.dd.admin.business.file.domain.FileDto; + +import java.util.List; + +/** + *

+ * 文件 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-23 + */ +@Mapper +public interface FileMapper extends BaseMapper { + + IPage selectFilePage(Page page, @Param("fileDto") FileDto fileDto); + + List selectFileList(@Param("fileDto") FileDto fileDto); +} diff --git a/src/main/java/com/dd/admin/business/file/mapper/xml/FileMapper.xml b/src/main/java/com/dd/admin/business/file/mapper/xml/FileMapper.xml new file mode 100644 index 0000000..c6b1cde --- /dev/null +++ b/src/main/java/com/dd/admin/business/file/mapper/xml/FileMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + FILE_ID, PARENT_ID, FILE_BUCKET, FILE_NAME, FILE_SUFFIX, FILE_SIZE_KB, FINAL_NAME, FILE_PATH, FILE_TYPE, FILE_SYS_PATH, CREATE_TIME + + + + + + diff --git a/src/main/java/com/dd/admin/business/file/service/FileService.java b/src/main/java/com/dd/admin/business/file/service/FileService.java new file mode 100644 index 0000000..75d83a8 --- /dev/null +++ b/src/main/java/com/dd/admin/business/file/service/FileService.java @@ -0,0 +1,33 @@ +package com.dd.admin.business.file.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.business.file.entity.File; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.business.file.domain.FileVo; +import com.dd.admin.business.file.domain.FileDto; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + *

+ * 文件 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-23 + */ +public interface FileService extends IService { + + //文件-分页列表 + IPage selectFilePage(FileDto fileDto); + + //文件-列表 + List selectFileList(FileDto fileDto); + + //文件-上传 + public FileVo uploadFile(MultipartFile file, String fileSavePath); + + //传入文件id获取文件真实地址 + public String getFileAuthUrl(String fileId); +} diff --git a/src/main/java/com/dd/admin/business/file/service/impl/FileServiceImpl.java b/src/main/java/com/dd/admin/business/file/service/impl/FileServiceImpl.java new file mode 100644 index 0000000..4ec544b --- /dev/null +++ b/src/main/java/com/dd/admin/business/file/service/impl/FileServiceImpl.java @@ -0,0 +1,139 @@ +package com.dd.admin.business.file.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.exception.ApiException; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.business.file.entity.File; +import com.dd.admin.business.file.mapper.FileMapper; +import com.dd.admin.business.file.service.FileService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dd.admin.common.utils.ToolUtil; +import org.apache.tomcat.jni.FileInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import com.dd.admin.business.file.domain.FileVo; +import com.dd.admin.business.file.domain.FileDto; +import org.springframework.web.multipart.MultipartFile; + +import java.math.BigDecimal; +import java.util.List; + +/** + *

+ * 文件 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-23 + */ +@Service +public class FileServiceImpl extends ServiceImpl implements FileService { + + @Value("${dd.uploadPath}") + private String uploadPath; + + @Override + public IPage selectFilePage(FileDto fileDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectFilePage(page,fileDto); + } + + @Override + public List selectFileList(FileDto fileDto) { + return baseMapper.selectFileList(fileDto); + } + + public String getSysUploadPath(){ + java.io.File filepath = new java.io.File(uploadPath); + //该目录不存在 则创建 + if (!filepath.exists()) { + boolean mkdirs = filepath.mkdirs(); + } + return uploadPath; + } + + + @Override + public FileVo uploadFile(MultipartFile file, String fileSavePath) { + //需要返回的对象 + FileVo fileVo = new FileVo(); + + //生成文件的唯一id + String fileId = IdWorker.get32UUID(); + fileVo.setFileId(fileId); + + //获取文件后缀 + String fileSuffix = ToolUtil.getFileSuffix(file.getOriginalFilename()); + fileVo.setFileSuffix(fileSuffix); + + //获取文件原始名称 + String originalFilename = file.getOriginalFilename(); + fileVo.setOriginalFilename(originalFilename); + + //生成文件的最终名称 + String finalName = fileId + "." + ToolUtil.getFileSuffix(originalFilename); + fileVo.setFinalName(finalName); + fileVo.setFileSavePath(fileSavePath + finalName); + + String sysUploadPath = getSysUploadPath(); + + String newFileSavePath = ""; + + //判断有没有结尾符,没有得加上 + if (!fileSavePath.endsWith(java.io.File.separator)) { + newFileSavePath = fileSavePath + java.io.File.separator; + } + + try { + java.io.File filepath = new java.io.File(sysUploadPath + newFileSavePath ); + //该目录不存在 则创建 + if (!filepath.exists()) { + boolean mkdirs = filepath.mkdirs(); + } + System.out.println(filepath.getAbsolutePath()); + System.out.println(filepath.getPath()); + + //保存文件到指定目录 + java.io.File newFile = new java.io.File(sysUploadPath + newFileSavePath + finalName); + file.transferTo(newFile); + + File fileInfo = new File(); + //保存文件信息 + fileInfo.setFileId(fileId); + fileInfo.setFileName(originalFilename); + fileInfo.setFileSuffix(fileSuffix); + + fileInfo.setFilePath("/upload/" + fileSavePath + "/" + finalName); + + fileVo.setFileSavePath(fileInfo.getFilePath()); + fileInfo.setFinalName(finalName); + + //计算文件大小kb + long kb = new BigDecimal(file.getSize()) + .divide(BigDecimal.valueOf(1024)) + .setScale(0, BigDecimal.ROUND_HALF_UP).longValue(); + fileInfo.setFileSizeKb(kb); + fileInfo.setFileSysPath(newFile.getAbsolutePath()); + + save(fileInfo); + } catch (Exception e) { + log.error("上传文件错误!", e); + throw new ApiException("上传文件错误!"); + } + return fileVo; + } + + @Override + public String getFileAuthUrl(String fileId) { + File file = getById(fileId); + if(file!=null){ + return file.getFilePath(); + } + return ""; + } + + +} diff --git a/src/main/java/com/dd/admin/business/member/controller/MemberController.java b/src/main/java/com/dd/admin/business/member/controller/MemberController.java new file mode 100644 index 0000000..1f4b362 --- /dev/null +++ b/src/main/java/com/dd/admin/business/member/controller/MemberController.java @@ -0,0 +1,118 @@ +package com.dd.admin.business.member.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.dd.admin.common.aop.operationLog.aop.OperLog; +import com.dd.admin.common.aop.operationLog.aop.OperType; +import com.dd.admin.common.exception.ApiException; +import com.dd.admin.common.security.SecurityUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.business.member.entity.Member; +import com.dd.admin.business.member.domain.MemberVo; +import com.dd.admin.business.member.domain.MemberDto; +import com.dd.admin.business.member.service.MemberService; + +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; + +import static com.dd.admin.business.pay.enmus.CashierExceptionEnum.MEMBER_ALREADY_BUILD; + +/** + *

+ * 会员 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-21 + */ +@Api(tags = "会员") +@RestController +public class MemberController { + + @Autowired + MemberService memberService; + + @ApiOperation(value = "会员-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/member/page") + public ResultBean> page(MemberDto memberDto) { + memberDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + IPage pageInfo = memberService.selectMemberPage(memberDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "会员-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/member/list") + public ResultBean> list(MemberDto memberDto) { + memberDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + List list = memberService.selectMemberList(memberDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "会员-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/member/searchList") + @OperLog(operModule = "会员查询",operType = OperType.QUERY,operDesc = "会员查询") + public ResultBean> searchList(MemberDto memberDto) { + memberDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + memberDto.setLimit(10); + List list = memberService.selectMemberList(memberDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "会员-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/member/add") + @OperLog(operModule = "添加会员",operType = OperType.ADD,operDesc = "添加会员") + public ResultBean add(@RequestBody @Validated MemberDto memberDto) { + // 先根据手机号查询是否已存在会员 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Member::getMemberPhone, memberDto.getMemberPhone()); + Member existingMembers = memberService.getOne(queryWrapper); + if (existingMembers != null) { + // 如果存在,则返回错误信息,表示手机号已被注册 + throw new ApiException(MEMBER_ALREADY_BUILD); + } + Member member = BeanUtil.copyProperties(memberDto, Member.class); + memberService.save(member); + return ResultBean.success(member); + } + + @ApiOperation(value = "会员-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/member/{memberId}") + public ResultBean get(@PathVariable @NotBlank String memberId) { + Member member = memberService.getById(memberId); + MemberVo memberVo = BeanUtil.copyProperties(member,MemberVo.class); + return ResultBean.success(memberVo); + } + + @ApiOperation(value = "会员-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/member/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) MemberDto memberDto) { + Member member = BeanUtil.copyProperties(memberDto, Member.class); + memberService.updateById(member); + return ResultBean.success(member); + } + + @ApiOperation(value = "会员-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/member/delete/{memberId}") + public ResultBean delete(@PathVariable @NotBlank String memberId) { + Boolean b = memberService.removeById(memberId); + return ResultBean.success(b); + } +} diff --git a/src/main/java/com/dd/admin/business/member/domain/MemberDto.java b/src/main/java/com/dd/admin/business/member/domain/MemberDto.java new file mode 100644 index 0000000..f9c1df4 --- /dev/null +++ b/src/main/java/com/dd/admin/business/member/domain/MemberDto.java @@ -0,0 +1,67 @@ +package com.dd.admin.business.member.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 会员返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-21 + */ +@Data +@ApiModel(value="会员接收对象") +public class MemberDto { + + + @ApiModelProperty(value = "会员表id") + @NotBlank(message = "会员id不能为空",groups = UpdateGroup.class) + private String memberId; + + @ApiModelProperty(value = "会员姓名") + private String memberName; + + @ApiModelProperty(value = "手机号") + private String memberPhone; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "消费密码") + private String payPassword; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "会员姓名") + private String querySearch; + + @ApiModelProperty(value = "条数") + private Integer limit; + + @ApiModelProperty(value = "搜索会员关键字") + private String keyword; +} diff --git a/src/main/java/com/dd/admin/business/member/domain/MemberVo.java b/src/main/java/com/dd/admin/business/member/domain/MemberVo.java new file mode 100644 index 0000000..5d3158f --- /dev/null +++ b/src/main/java/com/dd/admin/business/member/domain/MemberVo.java @@ -0,0 +1,56 @@ +package com.dd.admin.business.member.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 会员返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-21 + */ +@Data +@ApiModel(value="会员返回对象") +public class MemberVo { + + + @ApiModelProperty(value = "会员表id") + private String memberId; + + @ApiModelProperty(value = "会员姓名") + private String memberName; + + @ApiModelProperty(value = "手机号") + private String memberPhone; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "消费密码") + private String payPassword; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + +} diff --git a/src/main/java/com/dd/admin/business/member/entity/Member.java b/src/main/java/com/dd/admin/business/member/entity/Member.java new file mode 100644 index 0000000..9f96829 --- /dev/null +++ b/src/main/java/com/dd/admin/business/member/entity/Member.java @@ -0,0 +1,67 @@ +package com.dd.admin.business.member.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 会员 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-21 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_member") +@ApiModel(value="Member对象", description="会员") +public class Member implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "会员表id") + @TableId(value = "MEMBER_ID", type = IdType.ASSIGN_UUID) + private String memberId; + + @ApiModelProperty(value = "会员姓名") + @TableField("MEMBER_NAME") + private String memberName; + + @ApiModelProperty(value = "手机号") + @TableField("MEMBER_PHONE") + private String memberPhone; + + @ApiModelProperty(value = "备注") + @TableField("REMARK") + private String remark; + + @ApiModelProperty(value = "消费密码") + @TableField("PAY_PASSWORD") + private String payPassword; + + @ApiModelProperty(value = "门店名") + @TableField(value = "SHOP_NAME", fill = FieldFill.INSERT) + private String shopName; + + @ApiModelProperty(value = "门店id") + @TableField(value = "SHOP_ID", fill = FieldFill.INSERT) + private String shopId; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + +} diff --git a/src/main/java/com/dd/admin/business/member/mapper/MemberMapper.java b/src/main/java/com/dd/admin/business/member/mapper/MemberMapper.java new file mode 100644 index 0000000..d82d2ea --- /dev/null +++ b/src/main/java/com/dd/admin/business/member/mapper/MemberMapper.java @@ -0,0 +1,28 @@ +package com.dd.admin.business.member.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.member.entity.Member; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.business.member.domain.MemberVo; +import com.dd.admin.business.member.domain.MemberDto; + +import java.util.List; + +/** + *

+ * 会员 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-21 + */ +@Mapper +public interface MemberMapper extends BaseMapper { + + IPage selectMemberPage(Page page, @Param("memberDto") MemberDto memberDto); + + List selectMemberList(@Param("memberDto") MemberDto memberDto); +} diff --git a/src/main/java/com/dd/admin/business/member/mapper/xml/MemberMapper.xml b/src/main/java/com/dd/admin/business/member/mapper/xml/MemberMapper.xml new file mode 100644 index 0000000..c45ca60 --- /dev/null +++ b/src/main/java/com/dd/admin/business/member/mapper/xml/MemberMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + MEMBER_ID, MEMBER_NAME, MEMBER_PHONE, REMARK, PAY_PASSWORD, SHOP_NAME, SHOP_ID, CREATE_TIME + + + + + + diff --git a/src/main/java/com/dd/admin/business/member/service/MemberService.java b/src/main/java/com/dd/admin/business/member/service/MemberService.java new file mode 100644 index 0000000..e107c90 --- /dev/null +++ b/src/main/java/com/dd/admin/business/member/service/MemberService.java @@ -0,0 +1,27 @@ +package com.dd.admin.business.member.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.business.member.entity.Member; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.business.member.domain.MemberVo; +import com.dd.admin.business.member.domain.MemberDto; +import java.util.List; + +/** + *

+ * 会员 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-21 + */ +public interface MemberService extends IService { + + //会员-分页列表 + IPage selectMemberPage(MemberDto memberDto); + + //会员-列表 + List selectMemberList(MemberDto memberDto); + + Integer selectMemberCount(String shopId); +} diff --git a/src/main/java/com/dd/admin/business/member/service/impl/MemberServiceImpl.java b/src/main/java/com/dd/admin/business/member/service/impl/MemberServiceImpl.java new file mode 100644 index 0000000..3ef8623 --- /dev/null +++ b/src/main/java/com/dd/admin/business/member/service/impl/MemberServiceImpl.java @@ -0,0 +1,45 @@ +package com.dd.admin.business.member.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.business.member.entity.Member; +import com.dd.admin.business.member.mapper.MemberMapper; +import com.dd.admin.business.member.service.MemberService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.dd.admin.business.member.domain.MemberVo; +import com.dd.admin.business.member.domain.MemberDto; +import java.util.List; + +/** + *

+ * 会员 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-21 + */ +@Service +public class MemberServiceImpl extends ServiceImpl implements MemberService { + + @Override + public IPage selectMemberPage(MemberDto memberDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectMemberPage(page,memberDto); + } + + @Override + public List selectMemberList(MemberDto memberDto) { + return baseMapper.selectMemberList(memberDto); + } + + @Override + public Integer selectMemberCount(String shopId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Member::getShopId, shopId); + return baseMapper.selectCount(queryWrapper); + } +} diff --git a/src/main/java/com/dd/admin/business/memberCard/controller/MemberCardController.java b/src/main/java/com/dd/admin/business/memberCard/controller/MemberCardController.java new file mode 100644 index 0000000..6f3cd92 --- /dev/null +++ b/src/main/java/com/dd/admin/business/memberCard/controller/MemberCardController.java @@ -0,0 +1,112 @@ +package com.dd.admin.business.memberCard.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.dd.admin.business.member.domain.MemberVo; +import com.dd.admin.business.member.entity.Member; +import com.dd.admin.business.member.service.MemberService; +import com.dd.admin.common.security.SecurityUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.business.memberCard.entity.MemberCard; +import com.dd.admin.business.memberCard.domain.MemberCardVo; +import com.dd.admin.business.memberCard.domain.MemberCardDto; +import com.dd.admin.business.memberCard.service.MemberCardService; + +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 会员卡 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Api(tags = "会员卡") +@RestController +public class MemberCardController { + + @Autowired + MemberCardService memberCardService; + + @Autowired + MemberService memberService; + + @ApiOperation(value = "会员卡-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/memberCard/page") + public ResultBean> page(MemberCardDto memberCardDto) { + memberCardDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + IPage pageInfo = memberCardService.selectMemberCardPage(memberCardDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "会员卡-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/memberCard/list") + public ResultBean> list(MemberCardDto memberCardDto) { + memberCardDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + List list = memberCardService.selectMemberCardList(memberCardDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "会员卡-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/memberCard/searchList") + public ResultBean> searchList(MemberCardDto memberCardDto) { + memberCardDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + memberCardDto.setLimit(10); + List list = memberCardService.selectMemberCardList(memberCardDto); + list.stream().forEach(memberCardVo -> { + Member member = memberService.getById(memberCardVo.getMemberId()); + MemberVo memberVo = BeanUtil.copyProperties(member, MemberVo.class); + memberCardVo.setMember(memberVo); + }); + return ResultBean.success(list); + } + + @ApiOperation(value = "会员卡-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/memberCard/add") + public ResultBean add(@RequestBody @Validated MemberCardDto memberCardDto) { + MemberCard memberCard = BeanUtil.copyProperties(memberCardDto, MemberCard.class); + memberCardService.save(memberCard); + return ResultBean.success(memberCard); + } + + @ApiOperation(value = "会员卡-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/memberCard/{memberCardId}") + public ResultBean get(@PathVariable @NotBlank String memberCardId) { + MemberCard memberCard = memberCardService.getById(memberCardId); + MemberCardVo memberCardVo = BeanUtil.copyProperties(memberCard,MemberCardVo.class); + return ResultBean.success(memberCardVo); + } + + @ApiOperation(value = "会员卡-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/memberCard/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) MemberCardDto memberCardDto) { + MemberCard memberCard = BeanUtil.copyProperties(memberCardDto, MemberCard.class); + memberCardService.updateById(memberCard); + return ResultBean.success(memberCard); + } + + @ApiOperation(value = "会员卡-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/memberCard/delete/{memberCardId}") + public ResultBean delete(@PathVariable @NotBlank String memberCardId) { + Boolean b = memberCardService.removeById(memberCardId); + return ResultBean.success(b); + } +} diff --git a/src/main/java/com/dd/admin/business/memberCard/domain/MemberCardDto.java b/src/main/java/com/dd/admin/business/memberCard/domain/MemberCardDto.java new file mode 100644 index 0000000..b676a46 --- /dev/null +++ b/src/main/java/com/dd/admin/business/memberCard/domain/MemberCardDto.java @@ -0,0 +1,103 @@ +package com.dd.admin.business.memberCard.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 会员卡返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Data +@ApiModel(value="会员卡接收对象") +public class MemberCardDto { + + + @ApiModelProperty(value = "会员卡id") + @NotBlank(message = "会员卡id不能为空",groups = UpdateGroup.class) + private String memberCardId; + + @ApiModelProperty(value = "会员id") + private String memberId; + + @ApiModelProperty(value = "卡项ID") + private String cardId; + + @ApiModelProperty(value = "卡号") + private String cardNo; + + @ApiModelProperty(value = "卡名称") + private String cardName; + + @ApiModelProperty(value = "余额") + private BigDecimal amount; + + @ApiModelProperty(value = "赠送金额") + private BigDecimal giveAmount; + + @ApiModelProperty(value = "商品折扣") + private BigDecimal discount; + + @ApiModelProperty(value = "开卡金额") + private BigDecimal buildCardAmount; + + @ApiModelProperty(value = "提成比例") + private BigDecimal pushMoney; + + @ApiModelProperty(value = "0正常 1取消") + private Integer cardStatus; + + @ApiModelProperty(value = "0正常 1删除") + private Integer deleted; + + @ApiModelProperty(value = "乐观锁字段") + private Long version; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "搜索会员卡关键字") + private String querySearch; + + @ApiModelProperty(value = "搜索会员卡关键字") + private Integer limit; +} diff --git a/src/main/java/com/dd/admin/business/memberCard/domain/MemberCardVo.java b/src/main/java/com/dd/admin/business/memberCard/domain/MemberCardVo.java new file mode 100644 index 0000000..840b7c1 --- /dev/null +++ b/src/main/java/com/dd/admin/business/memberCard/domain/MemberCardVo.java @@ -0,0 +1,100 @@ +package com.dd.admin.business.memberCard.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; + +import com.dd.admin.business.member.domain.MemberVo; +import com.dd.admin.business.memberCard.entity.MemberCard; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 会员卡返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Data +@ApiModel(value="会员卡返回对象") +public class MemberCardVo { + + + @ApiModelProperty(value = "会员卡id") + private String memberCardId; + + @ApiModelProperty(value = "会员id") + private String memberId; + + @ApiModelProperty(value = "卡项ID") + private String cardId; + + @ApiModelProperty(value = "卡号") + private String cardNo; + + @ApiModelProperty(value = "卡名称") + private String cardName; + + @ApiModelProperty(value = "余额") + private BigDecimal amount; + + @ApiModelProperty(value = "赠送金额") + private BigDecimal giveAmount; + + @ApiModelProperty(value = "商品折扣") + private BigDecimal discount; + + @ApiModelProperty(value = "开卡金额") + private BigDecimal buildCardAmount; + + @ApiModelProperty(value = "提成比例") + private BigDecimal pushMoney; + + @ApiModelProperty(value = "0正常 1取消") + private Integer cardStatus; + + @ApiModelProperty(value = "0正常 1删除") + private Integer deleted; + + @ApiModelProperty(value = "乐观锁字段") + private Long version; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "会员信息") + private MemberVo member; + +} diff --git a/src/main/java/com/dd/admin/business/memberCard/entity/MemberCard.java b/src/main/java/com/dd/admin/business/memberCard/entity/MemberCard.java new file mode 100644 index 0000000..83dcac3 --- /dev/null +++ b/src/main/java/com/dd/admin/business/memberCard/entity/MemberCard.java @@ -0,0 +1,121 @@ +package com.dd.admin.business.memberCard.entity; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 会员卡 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_member_card") +@ApiModel(value="MemberCard对象", description="会员卡") +public class MemberCard implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "会员卡id") + @TableId(value = "MEMBER_CARD_ID", type = IdType.ASSIGN_UUID) + private String memberCardId; + + @ApiModelProperty(value = "会员id") + @TableField("MEMBER_ID") + private String memberId; + + @ApiModelProperty(value = "卡项ID") + @TableField("CARD_ID") + private String cardId; + + @ApiModelProperty(value = "卡号") + @TableField("CARD_NO") + private String cardNo; + + @ApiModelProperty(value = "卡名称") + @TableField("CARD_NAME") + private String cardName; + + @ApiModelProperty(value = "余额") + @TableField("AMOUNT") + private BigDecimal amount; + + @ApiModelProperty(value = "赠送金额") + @TableField("GIVE_AMOUNT") + private BigDecimal giveAmount; + + @ApiModelProperty(value = "商品折扣") + @TableField("DISCOUNT") + private BigDecimal discount; + + @ApiModelProperty(value = "开卡金额") + @TableField("BUILD_CARD_AMOUNT") + private BigDecimal buildCardAmount; + + @ApiModelProperty(value = "提成比例") + @TableField("PUSH_MONEY") + private BigDecimal pushMoney; + + @ApiModelProperty(value = "0正常 1取消") + @TableField("CARD_STATUS") + private Integer cardStatus; + + @ApiModelProperty(value = "0正常 1删除") + @TableField("DELETED") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "乐观锁字段") + @TableField("VERSION") + @Version + private Long version; + + @ApiModelProperty(value = "门店id") + @TableField(value = "SHOP_ID", fill = FieldFill.INSERT) + private String shopId; + + @ApiModelProperty(value = "门店名") + @TableField(value = "SHOP_NAME", fill = FieldFill.INSERT) + private String shopName; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "修改人") + @TableField(value = "UPDATE_NAME", fill = FieldFill.UPDATE) + private String updateName; + + @ApiModelProperty(value = "修改人id") + @TableField(value = "UPDATE_ID", fill = FieldFill.UPDATE) + private String updateId; + + +} diff --git a/src/main/java/com/dd/admin/business/memberCard/mapper/MemberCardMapper.java b/src/main/java/com/dd/admin/business/memberCard/mapper/MemberCardMapper.java new file mode 100644 index 0000000..2fa7fed --- /dev/null +++ b/src/main/java/com/dd/admin/business/memberCard/mapper/MemberCardMapper.java @@ -0,0 +1,31 @@ +package com.dd.admin.business.memberCard.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.memberCard.entity.MemberCard; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.business.memberCard.domain.MemberCardVo; +import com.dd.admin.business.memberCard.domain.MemberCardDto; + +import java.util.List; + +/** + *

+ * 会员卡 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Mapper +public interface MemberCardMapper extends BaseMapper { + + IPage selectMemberCardPage(Page page, @Param("memberCardDto") MemberCardDto memberCardDto); + + List selectMemberCardList(@Param("memberCardDto") MemberCardDto memberCardDto); + + MemberCardVo selectOneByCardNo(@Param("cardNo")String cardNo,@Param("shopId")String shopId); + +} diff --git a/src/main/java/com/dd/admin/business/memberCard/mapper/xml/MemberCardMapper.xml b/src/main/java/com/dd/admin/business/memberCard/mapper/xml/MemberCardMapper.xml new file mode 100644 index 0000000..74f228e --- /dev/null +++ b/src/main/java/com/dd/admin/business/memberCard/mapper/xml/MemberCardMapper.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MEMBER_CARD_ID, MEMBER_ID, CARD_ID, CARD_NO, CARD_NAME, AMOUNT, GIVE_AMOUNT, DISCOUNT, BUILD_CARD_AMOUNT, PUSH_MONEY, CARD_STATUS, DELETED, VERSION, SHOP_ID, SHOP_NAME, CREATE_NAME, CREATE_TIME, CREATE_ID, UPDATE_TIME, UPDATE_NAME, UPDATE_ID + + + + + + + diff --git a/src/main/java/com/dd/admin/business/memberCard/service/MemberCardService.java b/src/main/java/com/dd/admin/business/memberCard/service/MemberCardService.java new file mode 100644 index 0000000..f0cb29f --- /dev/null +++ b/src/main/java/com/dd/admin/business/memberCard/service/MemberCardService.java @@ -0,0 +1,31 @@ +package com.dd.admin.business.memberCard.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.business.memberCard.entity.MemberCard; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.business.memberCard.domain.MemberCardVo; +import com.dd.admin.business.memberCard.domain.MemberCardDto; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 会员卡 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +public interface MemberCardService extends IService { + + //会员卡-分页列表 + IPage selectMemberCardPage(MemberCardDto memberCardDto); + + //会员卡-列表 + List selectMemberCardList(MemberCardDto memberCardDto); + + MemberCardVo selectOneByCardNo(String cardNo); + + Integer selectMemberCardCount(String shopId); +} diff --git a/src/main/java/com/dd/admin/business/memberCard/service/impl/MemberCardServiceImpl.java b/src/main/java/com/dd/admin/business/memberCard/service/impl/MemberCardServiceImpl.java new file mode 100644 index 0000000..8f29970 --- /dev/null +++ b/src/main/java/com/dd/admin/business/memberCard/service/impl/MemberCardServiceImpl.java @@ -0,0 +1,53 @@ +package com.dd.admin.business.memberCard.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.member.entity.Member; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.business.memberCard.entity.MemberCard; +import com.dd.admin.business.memberCard.mapper.MemberCardMapper; +import com.dd.admin.business.memberCard.service.MemberCardService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dd.admin.common.security.SecurityUtil; +import org.springframework.stereotype.Service; +import com.dd.admin.business.memberCard.domain.MemberCardVo; +import com.dd.admin.business.memberCard.domain.MemberCardDto; +import java.util.List; + +/** + *

+ * 会员卡 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Service +public class MemberCardServiceImpl extends ServiceImpl implements MemberCardService { + + @Override + public IPage selectMemberCardPage(MemberCardDto memberCardDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectMemberCardPage(page,memberCardDto); + } + + @Override + public List selectMemberCardList(MemberCardDto memberCardDto) { + return baseMapper.selectMemberCardList(memberCardDto); + } + + @Override + public MemberCardVo selectOneByCardNo(String cardNo) { + String deptId = SecurityUtil.getLoginUser().getDeptId(); + return baseMapper.selectOneByCardNo(cardNo,deptId); + } + + @Override + public Integer selectMemberCardCount(String shopId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(MemberCard::getShopId, shopId); + return baseMapper.selectCount(queryWrapper); + } +} + diff --git a/src/main/java/com/dd/admin/business/operationLog/controller/OperationLogController.java b/src/main/java/com/dd/admin/business/operationLog/controller/OperationLogController.java new file mode 100644 index 0000000..035867c --- /dev/null +++ b/src/main/java/com/dd/admin/business/operationLog/controller/OperationLogController.java @@ -0,0 +1,88 @@ +package com.dd.admin.business.operationLog.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.business.operationLog.entity.OperationLog; +import com.dd.admin.business.operationLog.domain.OperationLogVo; +import com.dd.admin.business.operationLog.domain.OperationLogDto; +import com.dd.admin.business.operationLog.service.OperationLogService; + +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 操作日志 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-07 + */ +@Api(tags = "操作日志") +@RestController +public class OperationLogController { + + @Autowired + OperationLogService operationLogService; + + @ApiOperation(value = "操作日志-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/operationLog/page") + public ResultBean> page(OperationLogDto operationLogDto) { + IPage pageInfo = operationLogService.selectOperationLogPage(operationLogDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "操作日志-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/operationLog/list") + public ResultBean> list(OperationLogDto operationLogDto) { + List list = operationLogService.selectOperationLogList(operationLogDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "操作日志-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/operationLog/add") + public ResultBean add(@RequestBody @Validated OperationLogDto operationLogDto) { + OperationLog operationLog = BeanUtil.copyProperties(operationLogDto, OperationLog.class); + operationLogService.save(operationLog); + return ResultBean.success(operationLog); + } + + @ApiOperation(value = "操作日志-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/operationLog/{operationLogId}") + public ResultBean get(@PathVariable @NotBlank String operationLogId) { + OperationLog operationLog = operationLogService.getById(operationLogId); + OperationLogVo operationLogVo = BeanUtil.copyProperties(operationLog,OperationLogVo.class); + return ResultBean.success(operationLogVo); + } + + @ApiOperation(value = "操作日志-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/operationLog/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) OperationLogDto operationLogDto) { + OperationLog operationLog = BeanUtil.copyProperties(operationLogDto, OperationLog.class); + operationLogService.updateById(operationLog); + return ResultBean.success(operationLog); + } + + @ApiOperation(value = "操作日志-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/operationLog/delete/{operationLogId}") + public ResultBean delete(@PathVariable @NotBlank String operationLogId) { + Boolean b = operationLogService.removeById(operationLogId); + return ResultBean.success(b); + } +} diff --git a/src/main/java/com/dd/admin/business/operationLog/domain/OperationLogDto.java b/src/main/java/com/dd/admin/business/operationLog/domain/OperationLogDto.java new file mode 100644 index 0000000..9fcc56f --- /dev/null +++ b/src/main/java/com/dd/admin/business/operationLog/domain/OperationLogDto.java @@ -0,0 +1,78 @@ +package com.dd.admin.business.operationLog.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 操作日志返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-07 + */ +@Data +@ApiModel(value="操作日志接收对象") +public class OperationLogDto { + + + @ApiModelProperty(value = "日志id") + private String operId; + + @ApiModelProperty(value = "请求模块") + private String operModule; + + @ApiModelProperty(value = "操作类型") + private String operType; + + @ApiModelProperty(value = "操作描述") + private String operDesc; + + @ApiModelProperty(value = "操作方法") + private String operMethod; + + @ApiModelProperty(value = "请求参数") + private String oprrRequestParam; + + @ApiModelProperty(value = "响应参数") + private String operResponseParam; + + @ApiModelProperty(value = "操作人姓名") + private String operUserId; + + @ApiModelProperty(value = "操作人ID") + private String operUserName; + + @ApiModelProperty(value = "操作ip") + private String operIp; + + @ApiModelProperty(value = "请求url") + private String operUrl; + + @ApiModelProperty(value = "操作机构id") + private String operDeptId; + + @ApiModelProperty(value = "机构名") + private String operDeptName; + + private Date createTime; + + @ApiModelProperty(value = "会员id") + private String memberId; + + @ApiModelProperty(value = "会员名") + private String memberName; + + +} diff --git a/src/main/java/com/dd/admin/business/operationLog/domain/OperationLogVo.java b/src/main/java/com/dd/admin/business/operationLog/domain/OperationLogVo.java new file mode 100644 index 0000000..d6d4546 --- /dev/null +++ b/src/main/java/com/dd/admin/business/operationLog/domain/OperationLogVo.java @@ -0,0 +1,75 @@ +package com.dd.admin.business.operationLog.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 操作日志返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-07 + */ +@Data +@ApiModel(value="操作日志返回对象") +public class OperationLogVo { + + + @ApiModelProperty(value = "日志id") + private String operId; + + @ApiModelProperty(value = "请求模块") + private String operModule; + + @ApiModelProperty(value = "操作类型") + private String operType; + + @ApiModelProperty(value = "操作描述") + private String operDesc; + + @ApiModelProperty(value = "操作方法") + private String operMethod; + + @ApiModelProperty(value = "请求参数") + private String oprrRequestParam; + + @ApiModelProperty(value = "响应参数") + private String operResponseParam; + + @ApiModelProperty(value = "操作人姓名") + private String operUserId; + + @ApiModelProperty(value = "操作人ID") + private String operUserName; + + @ApiModelProperty(value = "操作ip") + private String operIp; + + @ApiModelProperty(value = "请求url") + private String operUrl; + + @ApiModelProperty(value = "操作机构id") + private String operDeptId; + + @ApiModelProperty(value = "机构名") + private String operDeptName; + + private Date createTime; + + @ApiModelProperty(value = "会员id") + private String memberId; + + @ApiModelProperty(value = "会员名") + private String memberName; + + +} diff --git a/src/main/java/com/dd/admin/business/operationLog/entity/OperationLog.java b/src/main/java/com/dd/admin/business/operationLog/entity/OperationLog.java new file mode 100644 index 0000000..60bdca2 --- /dev/null +++ b/src/main/java/com/dd/admin/business/operationLog/entity/OperationLog.java @@ -0,0 +1,92 @@ +package com.dd.admin.business.operationLog.entity; + +import com.baomidou.mybatisplus.annotation.*; + +import java.util.Date; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 操作日志 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-07 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_operation_log") +@ApiModel(value="OperationLog对象", description="操作日志") +public class OperationLog implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "日志id") + @TableId(value = "OPER_ID", type = IdType.ASSIGN_UUID) + private String operId; + + @ApiModelProperty(value = "请求模块") + @TableField("OPER_MODULE") + private String operModule; + + @ApiModelProperty(value = "操作类型") + @TableField("OPER_TYPE") + private String operType; + + @ApiModelProperty(value = "操作描述") + @TableField("OPER_DESC") + private String operDesc; + + @ApiModelProperty(value = "操作方法") + @TableField("OPER_METHOD") + private String operMethod; + + @ApiModelProperty(value = "请求参数") + @TableField("OPRR_REQUEST_PARAM") + private String oprrRequestParam; + + @ApiModelProperty(value = "响应参数") + @TableField("OPER_RESPONSE_PARAM") + private String operResponseParam; + + @ApiModelProperty(value = "操作人姓名") + @TableField("OPER_USER_ID") + private String operUserId; + + @ApiModelProperty(value = "操作人ID") + @TableField("OPER_USER_NAME") + private String operUserName; + + @ApiModelProperty(value = "操作ip") + @TableField("OPER_IP") + private String operIp; + + @ApiModelProperty(value = "请求url") + @TableField("OPER_URL") + private String operUrl; + + @ApiModelProperty(value = "操作机构id") + @TableField("OPER_DEPT_ID") + private String operDeptId; + + @ApiModelProperty(value = "机构名") + @TableField("OPER_DEPT_NAME") + private String operDeptName; + + @TableField(value = "CREATE_TIME") + private Date createTime; + + @ApiModelProperty(value = "会员id") + @TableField("MEMBER_ID") + private String memberId; + + @ApiModelProperty(value = "会员名") + @TableField("MEMBER_NAME") + private String memberName; + + +} diff --git a/src/main/java/com/dd/admin/business/operationLog/mapper/OperationLogMapper.java b/src/main/java/com/dd/admin/business/operationLog/mapper/OperationLogMapper.java new file mode 100644 index 0000000..f687494 --- /dev/null +++ b/src/main/java/com/dd/admin/business/operationLog/mapper/OperationLogMapper.java @@ -0,0 +1,28 @@ +package com.dd.admin.business.operationLog.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.operationLog.entity.OperationLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.business.operationLog.domain.OperationLogVo; +import com.dd.admin.business.operationLog.domain.OperationLogDto; + +import java.util.List; + +/** + *

+ * 操作日志 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-07 + */ +@Mapper +public interface OperationLogMapper extends BaseMapper { + + IPage selectOperationLogPage(Page page, @Param("operationLogDto") OperationLogDto operationLogDto); + + List selectOperationLogList(@Param("operationLogDto") OperationLogDto operationLogDto); +} diff --git a/src/main/java/com/dd/admin/business/operationLog/mapper/xml/OperationLogMapper.xml b/src/main/java/com/dd/admin/business/operationLog/mapper/xml/OperationLogMapper.xml new file mode 100644 index 0000000..8ca6e9f --- /dev/null +++ b/src/main/java/com/dd/admin/business/operationLog/mapper/xml/OperationLogMapper.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + OPER_ID, OPER_MODULE, OPER_TYPE, OPER_DESC, OPER_METHOD, OPRR_REQUEST_PARAM, OPER_RESPONSE_PARAM, OPER_USER_ID, OPER_USER_NAME, OPER_IP, OPER_URL, OPER_DEPT_ID, OPER_DEPT_NAME, CREATE_TIME, MEMBER_ID, MEMBER_NAME + + + + + + diff --git a/src/main/java/com/dd/admin/business/operationLog/service/OperationLogService.java b/src/main/java/com/dd/admin/business/operationLog/service/OperationLogService.java new file mode 100644 index 0000000..c44e905 --- /dev/null +++ b/src/main/java/com/dd/admin/business/operationLog/service/OperationLogService.java @@ -0,0 +1,26 @@ +package com.dd.admin.business.operationLog.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.business.operationLog.entity.OperationLog; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.business.operationLog.domain.OperationLogVo; +import com.dd.admin.business.operationLog.domain.OperationLogDto; +import java.util.List; + +/** + *

+ * 操作日志 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-07 + */ +public interface OperationLogService extends IService { + + //操作日志-分页列表 + IPage selectOperationLogPage(OperationLogDto operationLogDto); + + //操作日志-列表 + List selectOperationLogList(OperationLogDto operationLogDto); + +} diff --git a/src/main/java/com/dd/admin/business/operationLog/service/impl/OperationLogServiceImpl.java b/src/main/java/com/dd/admin/business/operationLog/service/impl/OperationLogServiceImpl.java new file mode 100644 index 0000000..964f849 --- /dev/null +++ b/src/main/java/com/dd/admin/business/operationLog/service/impl/OperationLogServiceImpl.java @@ -0,0 +1,36 @@ +package com.dd.admin.business.operationLog.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.business.operationLog.entity.OperationLog; +import com.dd.admin.business.operationLog.mapper.OperationLogMapper; +import com.dd.admin.business.operationLog.service.OperationLogService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.dd.admin.business.operationLog.domain.OperationLogVo; +import com.dd.admin.business.operationLog.domain.OperationLogDto; +import java.util.List; + +/** + *

+ * 操作日志 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-07 + */ +@Service +public class OperationLogServiceImpl extends ServiceImpl implements OperationLogService { + + @Override + public IPage selectOperationLogPage(OperationLogDto operationLogDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectOperationLogPage(page,operationLogDto); + } + + @Override + public List selectOperationLogList(OperationLogDto operationLogDto) { + return baseMapper.selectOperationLogList(operationLogDto); + } +} diff --git a/src/main/java/com/dd/admin/business/pay/PayController.java b/src/main/java/com/dd/admin/business/pay/PayController.java new file mode 100644 index 0000000..b34d09a --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/PayController.java @@ -0,0 +1,64 @@ +package com.dd.admin.business.pay; + +import cn.hutool.core.bean.BeanUtil; +import com.dd.admin.business.member.domain.MemberDto; +import com.dd.admin.business.member.entity.Member; +import com.dd.admin.business.pay.domain.BuildCardSell; +import com.dd.admin.business.pay.domain.ChargedCardSell; +import com.dd.admin.business.pay.domain.MemberProductSell; +import com.dd.admin.business.pay.service.PayService; +import com.dd.admin.business.sell.entity.Sell; +import com.dd.admin.common.aop.operationLog.aop.OperLog; +import com.dd.admin.common.aop.operationLog.aop.OperType; +import com.dd.admin.common.model.result.ResultBean; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@Api(tags = "结算控制器") +@RestController +public class PayController { + + @Autowired + PayService payService; + + @ApiOperation(value = "开卡结算") + @ApiOperationSupport(order = 3) + @PostMapping("/pay/buildCard") + @Transactional + @OperLog(operModule = "开卡结算",operType = OperType.ADD,operDesc = "开卡结算") + public ResultBean buildCard(@RequestBody @Validated BuildCardSell buildCardSell) { + Sell sell = payService.executeBuildCard(buildCardSell); + return ResultBean.success(sell); + } + + @ApiOperation(value = "续卡结算") + @ApiOperationSupport(order = 3) + @PostMapping("/pay/chargedCard") + @Transactional + @OperLog(operModule = "续卡结算",operType = OperType.ADD,operDesc = "续卡结算") + public ResultBean chargedCard(@RequestBody @Validated ChargedCardSell chargedCardSell) { + Sell sell = payService.executeChargedCard(chargedCardSell); + return ResultBean.success(sell); + } + + @ApiOperation(value = "商品结算") + @ApiOperationSupport(order = 3) + @PostMapping("/pay/productPay") + @Transactional + @OperLog(operModule = "商品结算",operType = OperType.ADD,operDesc = "商品结算") + public ResultBean buildCard(@RequestBody @Validated MemberProductSell productSell) { + Sell sell = payService.executeProduct(productSell); + return ResultBean.success(sell); + } + + +} diff --git a/src/main/java/com/dd/admin/business/pay/domain/BaseSell.java b/src/main/java/com/dd/admin/business/pay/domain/BaseSell.java new file mode 100644 index 0000000..b03ea7f --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/domain/BaseSell.java @@ -0,0 +1,34 @@ +package com.dd.admin.business.pay.domain; + +import com.dd.admin.business.sellPay.entity.Sellpay; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; + +@Data +public class BaseSell { + @ApiModelProperty(value = "订单号 可不填 不填将自动生成") + private String sellNo; + + @ApiModelProperty(value = "支付列表") + @NotNull(message = "支付信息不能为空") + private List sellPayList; + + @ApiModelProperty(value = "订单金额") + @NotNull(message = "订单金额不能为空") + @Max(value = 1000000,message = "订单金额最大为1000000") + @Min(value = 0,message = "订单金额最小为0") + private BigDecimal sellAmount; + + @ApiModelProperty(value = "json") + private String sellJson; + + + @ApiModelProperty(value = "jsonId") + private String jsonId; +} diff --git a/src/main/java/com/dd/admin/business/pay/domain/BuildCardForm.java b/src/main/java/com/dd/admin/business/pay/domain/BuildCardForm.java new file mode 100644 index 0000000..9415ec1 --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/domain/BuildCardForm.java @@ -0,0 +1,40 @@ +package com.dd.admin.business.pay.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.dd.admin.business.server.domain.ServerVo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +public class BuildCardForm { + @ApiModelProperty(value = "会员卡id") + private String cardId; + + @ApiModelProperty(value = "会员卡名") + @TableField("CARD_NAME") + private String cardName; + + @ApiModelProperty(value = "卡编号") + @TableField("CARD_NO") + private String cardNo; + + @ApiModelProperty(value = "预设开卡金") + @TableField("CARD_AMOUNT") + private BigDecimal cardAmount = BigDecimal.ZERO; + + @ApiModelProperty(value = "预设赠送金") + @TableField("GIVE_AMOUNT") + private BigDecimal giveAmount = BigDecimal.ZERO; + + + @ApiModelProperty(value = "商品实际金额") + private BigDecimal totalRealAmount; + + @ApiModelProperty(value = "服务人员列表") + private List serverList; +} diff --git a/src/main/java/com/dd/admin/business/pay/domain/BuildCardSell.java b/src/main/java/com/dd/admin/business/pay/domain/BuildCardSell.java new file mode 100644 index 0000000..b57c22b --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/domain/BuildCardSell.java @@ -0,0 +1,18 @@ +package com.dd.admin.business.pay.domain; + +import com.dd.admin.business.card.entity.Card; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; + +@Data +@ApiModel(value="开卡接收对象") +public class BuildCardSell extends MemberBaseSell { + @ApiModelProperty(value = "开卡对象") + @NotNull(message = "开卡对象不能为空") + @Valid + BuildCardForm buildCardForm; +} diff --git a/src/main/java/com/dd/admin/business/pay/domain/ChargedCardForm.java b/src/main/java/com/dd/admin/business/pay/domain/ChargedCardForm.java new file mode 100644 index 0000000..c3df20a --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/domain/ChargedCardForm.java @@ -0,0 +1,39 @@ +package com.dd.admin.business.pay.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.dd.admin.business.server.domain.ServerVo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +public class ChargedCardForm { + @ApiModelProperty(value = "会员卡id") + private String memberCardId; + + @ApiModelProperty(value = "会员卡id") + private String cardId; + + @ApiModelProperty(value = "会员卡名") + @TableField("CARD_NAME") + private String cardName; + + @ApiModelProperty(value = "修改后卡编号") + @TableField("CARD_NO") + private String cardNo; + + @ApiModelProperty(value = "充值开卡金") + private BigDecimal chargedCardAmount = BigDecimal.ZERO; + + @ApiModelProperty(value = "充值赠送金") + private BigDecimal chargedGiveAmount = BigDecimal.ZERO; + + @ApiModelProperty(value = "商品实际金额") + private BigDecimal totalRealAmount; + + + @ApiModelProperty(value = "服务人员列表") + private List serverList; +} diff --git a/src/main/java/com/dd/admin/business/pay/domain/ChargedCardSell.java b/src/main/java/com/dd/admin/business/pay/domain/ChargedCardSell.java new file mode 100644 index 0000000..e7c6c67 --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/domain/ChargedCardSell.java @@ -0,0 +1,17 @@ +package com.dd.admin.business.pay.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; + +@Data +@ApiModel(value="续卡接收对象") +public class ChargedCardSell extends MemberBaseSell { + @ApiModelProperty(value = "续卡对象") + @NotNull(message = "续卡对象不能为空") + @Valid + ChargedCardForm chargedCardForm; +} diff --git a/src/main/java/com/dd/admin/business/pay/domain/MemberBaseSell.java b/src/main/java/com/dd/admin/business/pay/domain/MemberBaseSell.java new file mode 100644 index 0000000..5c8864b --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/domain/MemberBaseSell.java @@ -0,0 +1,24 @@ +package com.dd.admin.business.pay.domain; + +import com.dd.admin.business.sellPay.entity.Sellpay; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; + +@Data +public class MemberBaseSell extends BaseSell{ + + @ApiModelProperty(value = "会员id") + private String memberId; + + @ApiModelProperty(value = "会员卡id") + private String memberCardId; + + @ApiModelProperty(value = "会员名") + private String memberName; +} diff --git a/src/main/java/com/dd/admin/business/pay/domain/MemberProductSell.java b/src/main/java/com/dd/admin/business/pay/domain/MemberProductSell.java new file mode 100644 index 0000000..787020b --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/domain/MemberProductSell.java @@ -0,0 +1,20 @@ +package com.dd.admin.business.pay.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.util.List; + +@Data +@ApiModel(value="会员商品消费") +public class MemberProductSell extends MemberBaseSell { + + @ApiModelProperty(value = "商品对象") + @NotNull(message = "商品对不能为空") + @Valid + private List productFormList; + +} diff --git a/src/main/java/com/dd/admin/business/pay/domain/ProductForm.java b/src/main/java/com/dd/admin/business/pay/domain/ProductForm.java new file mode 100644 index 0000000..3887330 --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/domain/ProductForm.java @@ -0,0 +1,48 @@ +package com.dd.admin.business.pay.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.dd.admin.business.server.domain.ServerVo; +import com.dd.admin.common.model.UpdateGroup; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.math.BigDecimal; +import java.util.List; + +@Data +public class ProductForm { + @ApiModelProperty(value = "商品id") + @NotBlank(message = "商品id不能为空",groups = UpdateGroup.class) + private String productId; + + @ApiModelProperty(value = "分类id") + private String categoryId; + + @ApiModelProperty(value = "分类名") + private String categoryName; + + @ApiModelProperty(value = "商品名") + private String productName; + + @ApiModelProperty(value = "商品金额") + private BigDecimal productAmount; + + @ApiModelProperty(value = "商品会员金额") + private BigDecimal productMemberAmount; + + @ApiModelProperty(value = "商品折扣") + private BigDecimal discount; + + @ApiModelProperty(value = "商品数量") + private Long count; + + @ApiModelProperty(value = "商品实际金额") + private BigDecimal realAmount; + + @ApiModelProperty(value = "商品实际金额") + private BigDecimal totalRealAmount; + + @ApiModelProperty(value = "服务人员列表") + private List serverList; +} diff --git a/src/main/java/com/dd/admin/business/pay/enmus/CashierExceptionEnum.java b/src/main/java/com/dd/admin/business/pay/enmus/CashierExceptionEnum.java new file mode 100644 index 0000000..eb9498f --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/enmus/CashierExceptionEnum.java @@ -0,0 +1,59 @@ +package com.dd.admin.business.pay.enmus; + +import com.dd.admin.common.exception.enums.AbstractBaseExceptionEnum; + +public enum CashierExceptionEnum implements AbstractBaseExceptionEnum { + CARD_AMOUNT_CHANGE(500,"余额已变动,为保证数据安全,操作中断,请重试!"), + MEMBER_CARD_NOT_SUFFICIENT_FUNDS(500,"会员卡余额不足,请重新操作!"), + MEMBER_CARD_GIVE_NOT_SUFFICIENT_FUNDS(500,"会员卡赠送余额不足,请重新操作!"), + MEMBER_CARD_ALREADY_BUILD(500,"该会员已经有充值账户,禁止重复创建!"), + MEMBER_ALREADY_BUILD(500,"该手机号已注册过,禁止重复创建!"), + MEMBER_DIFFERENT(500,"会员卡与会员信息不一致,请核实~"), + DEPT_DIFFERENT(500,"结算信息与当前门店信息不一致,请刷新后重试~"), + LKLPAY_NOT_AUTHCODE(500,"没有扫描或者扫描了错误的付款码,请核实!"), + LKLPAYINFO_IS_EXIST(500,"该组织的拉卡拉拓展信息已经配置过啦!"), + LKLPAYINFO_AUTHCODE_ERROR(500,"扫描用户付款码有误!"), + SELL_TYPE_ERROR(500,"传入的支付方式有误!"), + LKLPAYINFO_UNKONW_ERROR(500,"付款码支付有误!"), + LKLPAYINFO_COMPLETE_ERROR(500,"该订单已经完成了哦!"), + PRODUCT_ALREADY_EXIST(500,"该商品号已被占用!"), + CARDNO_ALREADY_EXIST(500,"该卡号已被占用!"), + CARD_ALREADY_EXIST(500,"该卡项编号已被占用!"), + PRODUCT_CARD_ALREADY_EXIST(500,"卡级价已存在,请更换其他卡项设置!"), + AUTHCODE_PAY_NOTZREO(500,"条码支付金额不能为0!"), + COMBO_EXPIRED(500,"该套餐活动已过期!"), + COMBO_MONTH_COUNT_NONE(500,"套餐过期月数未设置!"), + MEMBER_COMBO_EXPIRED(500,"会员套餐截止期已过!"), + MEMBER_COMBO_NOT_SUFFICIENT_FUNDS(500,"套餐剩余项目次数不足!"), + MEMBER_COMBO_IS_USED(500,"该套餐已使用禁止销单!"), + MEMBER_COMBO_IS_DEL(500,"该套餐已删除!"), + PAY_MONEY_EMPTY(500,"付款码有误!"), + PAY_MONEY_ERROR(500,"付款金额有误!"), + PAY_ERROR(500,"条码付款发生了错误!"), + PAY_SELL_ERROR(500,"该订单状态已取消!"), + PAY_SELL_ALREADY(500,"该订单状态已结算!"), + PAY_SELL_CANCEL_ERROR(500,"该订单状态无法销单!"), + PAY_SELL_CARD_AMOUNT_CHANGE(500,"该卡已经生成消费记录,无法销单!"), + PAY_SELL_CARD_AMOUNT_NOT_SUFFICIENT_FUNDS(500,"销单后会员卡赠送余额不足,无法销单!"), + ; + + CashierExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + private Integer code; + + private String message; + + + @Override + public Integer getCode() { + return this.code; + } + + @Override + public String getMessage() { + return this.message; + } +} diff --git a/src/main/java/com/dd/admin/business/pay/enmus/DetailServiceEnum.java b/src/main/java/com/dd/admin/business/pay/enmus/DetailServiceEnum.java new file mode 100644 index 0000000..bca3707 --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/enmus/DetailServiceEnum.java @@ -0,0 +1,22 @@ +package com.dd.admin.business.pay.enmus; + +public enum DetailServiceEnum { + BUILD_CARD("sellDetailBuildCard"), + CHARGED_CARD("sellDetailChargedCard"), + MEMBER_PRODUCT("sellDetailMemberProduct"), + PEOPLE("sellDetailPeople"); + + private String serviceName; + + DetailServiceEnum(String serviceName) { + this.serviceName = serviceName; + } + + public String getServiceName() { + return serviceName; + } + + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } +} diff --git a/src/main/java/com/dd/admin/business/pay/enmus/PayConst.java b/src/main/java/com/dd/admin/business/pay/enmus/PayConst.java new file mode 100644 index 0000000..9a58104 --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/enmus/PayConst.java @@ -0,0 +1,60 @@ +package com.dd.admin.business.pay.enmus; + +public class PayConst { + + /** + * 订单状态销单 + */ + public static final Integer SELL_STATUS_REVOCATION = 1; + + /** + * 开卡 + */ + public static final Integer SELL_TYPE_BUILD_CARD = 2; + + /** + * 续卡 + */ + public static final Integer SELL_TYPE_CHARGED_CARD = 3; + + /** + * 商品服务 + */ + public static final Integer SELL_TYPE_PRODUCT = 1; + + /** + * 卡金支付 + */ + public static final Integer PAY_TYPE_CARD = 1; + /** + * 赠送金支付 + */ + public static final Integer PAY_TYPE_CARD_GIVE = 0; + + public static final String PAY_TYPE_CARD_GIVE_NAME = "赠送金支付"; + + /** + * 优惠 + */ + public static final Integer PAY_TYPE_DISCOUNT = 888; + + + /** + * 商品类型 + */ + public static final Integer PRODUCT_TYPE_PRODUCT = 1; + /** + * 商品类型 卡项 + */ + public static final Integer PRODUCT_TYPE_CARD = 2; + /** + * 商品类型 卡项 + */ + public static final Integer PRODUCT_TYPE_CHARGED_CARD = 3; + + /** + *待结算订单结算完毕 + */ + public static final Integer PENDING_SELL_COMPLETE = 1; + +} diff --git a/src/main/java/com/dd/admin/business/pay/service/AddSellDetailService.java b/src/main/java/com/dd/admin/business/pay/service/AddSellDetailService.java new file mode 100644 index 0000000..efa58a9 --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/service/AddSellDetailService.java @@ -0,0 +1,19 @@ +package com.dd.admin.business.pay.service; + +import com.dd.admin.business.pay.domain.BaseSell; +import com.dd.admin.business.sell.domain.SellDto; +import com.dd.admin.business.sell.entity.Sell; + +/** + + * Description:创建销售细单接口 所有细单的操作 实现此接口 + + * date: 2021/7/12 + * @author: wxl + */ + +public interface AddSellDetailService { + + void addSellDetail(Sell sell, BaseSell sellDto); + +} diff --git a/src/main/java/com/dd/admin/business/pay/service/PayService.java b/src/main/java/com/dd/admin/business/pay/service/PayService.java new file mode 100644 index 0000000..8df18f5 --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/service/PayService.java @@ -0,0 +1,22 @@ +package com.dd.admin.business.pay.service; + +import com.dd.admin.business.memberCard.entity.MemberCard; +import com.dd.admin.business.pay.domain.BuildCardSell; +import com.dd.admin.business.pay.domain.ChargedCardSell; +import com.dd.admin.business.pay.domain.MemberProductSell; +import com.dd.admin.business.sell.entity.Sell; + +import java.math.BigDecimal; + +public interface PayService { + public Sell createSell(Sell sell); + + public Sell setSellExtraInfo(String sellId, MemberCard memberCard, BigDecimal memberBeforeAmount,BigDecimal memberBeforeGiveAmount); + + public Sell executeBuildCard(BuildCardSell buildCardSell); + + public Sell executeChargedCard(ChargedCardSell chargedCardSell); + + public Sell executeProduct(MemberProductSell productSell); + +} diff --git a/src/main/java/com/dd/admin/business/pay/service/impl/PayServiceImpl.java b/src/main/java/com/dd/admin/business/pay/service/impl/PayServiceImpl.java new file mode 100644 index 0000000..4273496 --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/service/impl/PayServiceImpl.java @@ -0,0 +1,140 @@ +package com.dd.admin.business.pay.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.dd.admin.business.memberCard.entity.MemberCard; +import com.dd.admin.business.pay.domain.BuildCardSell; +import com.dd.admin.business.pay.domain.ChargedCardSell; +import com.dd.admin.business.pay.domain.MemberProductSell; +import com.dd.admin.business.pay.service.AddSellDetailService; +import com.dd.admin.business.pay.service.PayService; +import com.dd.admin.business.sell.entity.Sell; +import com.dd.admin.business.sell.service.SellService; +import com.dd.admin.business.sellJson.entity.Selljson; +import com.dd.admin.business.sellJson.service.SelljsonService; +import com.dd.admin.business.sellPay.service.SellpayService; +import com.dd.admin.common.security.SecurityUtil; +import com.dd.admin.common.utils.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Map; + +import static com.dd.admin.business.pay.enmus.DetailServiceEnum.*; +import static com.dd.admin.business.pay.enmus.PayConst.*; + +@Service +public class PayServiceImpl implements PayService { + + @Autowired + private SellService sellService; + + @Autowired + private Map detailServiceMap; + + @Autowired + private SellpayService sellpayService; + + @Autowired + private SelljsonService selljsonService; + + @Override + public Sell createSell(Sell sell) { + String shopId = SecurityUtil.getLoginUser().getDeptId(); + //直接执行save即可 + if(StringUtil.isEmpty(sell.getSellNo())){ + String sellNo = (StringUtil.getDateStringNow() + StringUtil.createCode(4)); + sell.setSellNo(sellNo); + } + + //插入时查看该门店今天数量为流水号 + Integer count = sellService.selectTodayCount(shopId); + sell.setSerialNo(String.valueOf(count + 1)); + sellService.save(sell); + return sell; + } + + @Override + public Sell setSellExtraInfo(String sellId, MemberCard memberCard, BigDecimal memberBeforeAmount, BigDecimal memberBeforeGiveAmount) { + Sell extraSellInfo = new Sell(); + extraSellInfo.setSellId(sellId); + if(memberCard!=null){ + //设置订单的卡信息 + extraSellInfo.setMemberCardId(memberCard.getMemberCardId()); + extraSellInfo.setMemberCardName(memberCard.getCardName()); + extraSellInfo.setMemberCardNo(memberCard.getCardNo()); + //设置订单的卡余额 + extraSellInfo.setMemberCardBeforeAmount(memberBeforeAmount); + extraSellInfo.setMemberCardBeforeGiveAmount(memberBeforeGiveAmount); + + extraSellInfo.setMemberCardAfterAmount(memberCard.getAmount()); + extraSellInfo.setMemberCardAfterGiveAmount(memberCard.getGiveAmount()); + } + sellService.updateById(extraSellInfo); + return extraSellInfo; + } + + @Override + public Sell executeBuildCard(BuildCardSell buildCardSell) { + if(StringUtil.isNotEmpty(buildCardSell.getJsonId())){ + selljsonService.completePendingSell(buildCardSell.getJsonId()); + } + + Integer sellType = SELL_TYPE_BUILD_CARD; + //第一步创建订单 + Sell sell = BeanUtil.copyProperties(buildCardSell,Sell.class); + sell.setSellType(sellType); + + BigDecimal realAmount = sellpayService.getRealAmount(buildCardSell.getSellPayList(), buildCardSell.getSellAmount()); + sell.setRealAmount(realAmount); + createSell(sell); +// selljsonService.save(new Selljson().setSellId(sell.getSellId()).setSellJson(buildCardSell.getSellJson())); + //创建销售细单 + detailServiceMap.get(BUILD_CARD.getServiceName()).addSellDetail(sell,buildCardSell); + return sell; + } + + @Override + public Sell executeChargedCard(ChargedCardSell chargedCardSell) { + if(StringUtil.isNotEmpty(chargedCardSell.getJsonId())){ + selljsonService.completePendingSell(chargedCardSell.getJsonId()); + } + + + + Integer sellType = SELL_TYPE_CHARGED_CARD; + //chargedCardSell + Sell sell = BeanUtil.copyProperties(chargedCardSell,Sell.class); + sell.setSellType(sellType); + + BigDecimal realAmount = sellpayService.getRealAmount(chargedCardSell.getSellPayList(), chargedCardSell.getSellAmount()); + sell.setRealAmount(realAmount); + createSell(sell); +// selljsonService.save(new Selljson().setSellId(sell.getSellId()).setSellJson(chargedCardSell.getSellJson())); + //创建销售细单 + detailServiceMap.get(CHARGED_CARD.getServiceName()).addSellDetail(sell,chargedCardSell); + return sell; + } + + @Override + public Sell executeProduct(MemberProductSell productSell) { + if(StringUtil.isNotEmpty(productSell.getJsonId())){ + selljsonService.completePendingSell(productSell.getJsonId()); + } + + + Integer sellType = SELL_TYPE_PRODUCT; + //第一步创建订单 + Sell sell = BeanUtil.copyProperties(productSell,Sell.class); + sell.setSellType(sellType); + + BigDecimal realAmount = sellpayService.getRealAmount(productSell.getSellPayList(), productSell.getSellAmount()); + sell.setRealAmount(realAmount); + createSell(sell); + //创建销售细单 + detailServiceMap.get(MEMBER_PRODUCT.getServiceName()).addSellDetail(sell,productSell); + return sell; + } + + +} diff --git a/src/main/java/com/dd/admin/business/pay/service/impl/SellDetailBuildCard.java b/src/main/java/com/dd/admin/business/pay/service/impl/SellDetailBuildCard.java new file mode 100644 index 0000000..32c5cda --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/service/impl/SellDetailBuildCard.java @@ -0,0 +1,162 @@ +package com.dd.admin.business.pay.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.dd.admin.business.card.entity.Card; +import com.dd.admin.business.card.service.CardService; +import com.dd.admin.business.detailServer.entity.SellDetailServer; +import com.dd.admin.business.detailServer.service.SellDetailServerService; +import com.dd.admin.business.memberCard.domain.MemberCardVo; +import com.dd.admin.business.memberCard.entity.MemberCard; +import com.dd.admin.business.memberCard.service.MemberCardService; +import com.dd.admin.business.pay.domain.BaseSell; +import com.dd.admin.business.pay.domain.BuildCardForm; +import com.dd.admin.business.pay.domain.BuildCardSell; +import com.dd.admin.business.pay.service.AddSellDetailService; +import com.dd.admin.business.pay.service.PayService; +import com.dd.admin.business.sell.entity.Sell; +import com.dd.admin.business.sell.service.SellService; +import com.dd.admin.business.sellDetail.entity.SellDetail; +import com.dd.admin.business.sellDetail.service.SellDetailService; +import com.dd.admin.business.sellPay.entity.Sellpay; +import com.dd.admin.business.sellPay.service.SellpayService; +import com.dd.admin.business.server.domain.ServerVo; +import com.dd.admin.common.exception.ApiException; +import com.dd.admin.common.utils.BigDecimalUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.List; + +import static com.dd.admin.business.pay.enmus.CashierExceptionEnum.CARDNO_ALREADY_EXIST; +import static com.dd.admin.business.pay.enmus.PayConst.PRODUCT_TYPE_CARD; +import static com.dd.admin.common.consts.MemberShopConst.PUSH_FIXED; +import static com.dd.admin.common.consts.MemberShopConst.PUSH_SCALE; + +@Service +public class SellDetailBuildCard implements AddSellDetailService { + + @Autowired + private CardService cardService; + @Autowired + private MemberCardService memberCardService; + @Autowired + private SellDetailService sellDetailService; + @Autowired + private SellpayService sellpayService; + @Autowired + private PayService payService; + @Autowired + private SellDetailServerService sellDetailServerService; + + @Override + public void addSellDetail(Sell sell, BaseSell sellDto) { + //转换数据 + BuildCardSell buildCardSell = (BuildCardSell) sellDto; + // 1 获取开卡金额 等信息 先开卡 + String cardId = buildCardSell.getBuildCardForm().getCardId(); + //获取需要的开卡信息 + Card card = cardService.getById(cardId); + //开卡 + MemberCard memberCard = buildMemberCard(sell, buildCardSell.getBuildCardForm(), card); + //2生成销售细单 + SellDetail sellDetail = addSellDetail(sell, buildCardSell, memberCard, card); + //添加支付方式 + sellpayService.addSellPayList(buildCardSell.getSellPayList(), sell.getSellId()); + + //4因为是开卡还要设置额外信息 + payService.setSellExtraInfo(sell.getSellId(), memberCard, BigDecimal.ZERO, BigDecimal.ZERO); + } + + MemberCard buildMemberCard(Sell sell, BuildCardForm buildCardForm, Card card) { + //设置卡的基本和余额信息 + MemberCard memberCard = new MemberCard(); + memberCard.setMemberId(sell.getMemberId()); + memberCard.setCardId(card.getCardId()); + memberCard.setCardName(card.getCardName()); + + String cardNo = buildCardForm.getCardNo(); + MemberCardVo membercardVo = memberCardService.selectOneByCardNo(cardNo); + if (membercardVo != null) { + throw new ApiException(CARDNO_ALREADY_EXIST); + } + memberCard.setCardNo(buildCardForm.getCardNo()); + memberCard.setAmount(buildCardForm.getCardAmount()); + memberCard.setBuildCardAmount(buildCardForm.getCardAmount()); + memberCard.setGiveAmount(buildCardForm.getGiveAmount()); + + //获取订单的卡折扣信息 设置进会员卡中 + memberCard.setDiscount(card.getCardDiscount()); + + //设置该卡的提成金额 + memberCard.setPushMoney(card.getCardPushPercent()); + + memberCardService.save(memberCard); + return memberCard; + } + + SellDetail addSellDetail(Sell sell, BuildCardSell buildCardSell, MemberCard membercard, Card card) { + BuildCardForm buildCardForm = buildCardSell.getBuildCardForm(); + SellDetail sellDetail = new SellDetail(); + //3设置订单id 订单类型 订单状态 + sellDetail.setSellId(sell.getSellId()); + sellDetail.setSellType(sell.getSellType()); + sellDetail.setMemberId(sell.getMemberId()); + //设置商品信息 + sellDetail.setProductType(PRODUCT_TYPE_CARD); + sellDetail.setCardId(buildCardForm.getCardId()); + sellDetail.setCardName(buildCardForm.getCardName()); + sellDetail.setAmount(buildCardForm.getCardAmount()); + sellDetail.setGiveAmount(buildCardForm.getGiveAmount()); + sellDetail.setRealAmount(sell.getRealAmount()); + sellDetail.setTotalRealAmount(buildCardForm.getTotalRealAmount()); + //设置会员信息 + sellDetail.setMemberCardId(membercard.getMemberCardId()); + + //开卡后卡金和赠送金 + sellDetail.setAmount(membercard.getAmount()); + sellDetail.setGiveAmount(membercard.getGiveAmount()); + + //保存销售细单 + sellDetailService.save(sellDetail); + + //该条目有服务人员 + List serverList = buildCardForm.getServerList(); + if (CollectionUtil.isNotEmpty(serverList)) { + //如果是固定金额 固定金额除以人数 获取固定金额 + //如果是比例 计算出比例后提成 获取固定金额 + //业绩和提成均平均分 + //总提成 + BigDecimal totalPushMoney = BigDecimal.ZERO; + //总业绩 为订单实付金额 + BigDecimal totalGradeMoney = sellDetail.getTotalRealAmount(); + //固定金额的话 + //按比例 + if (card.getCardPushPercent() != null) { + //提成额 先转换为百分数 + BigDecimal pushPercent = BigDecimalUtil.div(card.getCardPushPercent(), new BigDecimal("100")); + //折后价*百分数 + totalPushMoney = BigDecimalUtil.mul(totalGradeMoney, pushPercent); + } + + + //平均分 + BigDecimal pushMoney = BigDecimalUtil.div(totalPushMoney, new BigDecimal(serverList.size())); + BigDecimal gradeMoney = BigDecimalUtil.div(totalGradeMoney, new BigDecimal(serverList.size())); + + + //设置服务人员 + serverList.stream().forEach(server -> { + SellDetailServer sellDetailServer = new SellDetailServer(); + sellDetailServer.setSellId(sell.getSellId()); + sellDetailServer.setSellDetailId(sellDetail.getSellDetailId()); + sellDetailServer.setServerId(server.getServerId()); + sellDetailServer.setServerName(server.getServerName()); + sellDetailServer.setServerPushMoney(pushMoney); + sellDetailServer.setServerGrade(gradeMoney); + sellDetailServerService.save(sellDetailServer); + }); + } + return sellDetail; + } +} diff --git a/src/main/java/com/dd/admin/business/pay/service/impl/SellDetailChargedCard.java b/src/main/java/com/dd/admin/business/pay/service/impl/SellDetailChargedCard.java new file mode 100644 index 0000000..25a3e40 --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/service/impl/SellDetailChargedCard.java @@ -0,0 +1,192 @@ +package com.dd.admin.business.pay.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.dd.admin.business.card.entity.Card; +import com.dd.admin.business.card.service.CardService; +import com.dd.admin.business.detailServer.entity.SellDetailServer; +import com.dd.admin.business.detailServer.service.SellDetailServerService; +import com.dd.admin.business.memberCard.domain.MemberCardVo; +import com.dd.admin.business.memberCard.entity.MemberCard; +import com.dd.admin.business.memberCard.service.MemberCardService; +import com.dd.admin.business.pay.domain.*; +import com.dd.admin.business.pay.service.AddSellDetailService; +import com.dd.admin.business.pay.service.PayService; +import com.dd.admin.business.sell.entity.Sell; +import com.dd.admin.business.sell.service.SellService; +import com.dd.admin.business.sellDetail.entity.SellDetail; +import com.dd.admin.business.sellDetail.service.SellDetailService; +import com.dd.admin.business.sellPay.entity.Sellpay; +import com.dd.admin.business.sellPay.service.SellpayService; +import com.dd.admin.business.server.domain.ServerVo; +import com.dd.admin.common.exception.ApiException; +import com.dd.admin.common.utils.BigDecimalUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.List; + +import static com.dd.admin.business.pay.enmus.CashierExceptionEnum.CARD_AMOUNT_CHANGE; +import static com.dd.admin.business.pay.enmus.PayConst.PRODUCT_TYPE_CHARGED_CARD; + +/** + * MemberCardRenewServiceImpl 类,实现了 AddSellDetailService 接口,用于处理会员卡续卡的业务逻辑 + */ +@Service +public class SellDetailChargedCard implements AddSellDetailService { + + @Autowired + private MemberCardService memberCardService; // 用于操作会员卡相关业务 + @Autowired + private SellDetailService sellDetailService; // 处理销售详情的服务 + @Autowired + private PayService payService; // 支付相关的服务 + @Autowired + private SellpayService sellpayService; // 销售支付的服务 + @Autowired + private SellDetailServerService sellDetailServerService; + @Autowired + private CardService cardService; + /** + * 处理添加销售详情的方法 + * + * @param sell 销售实体 + * @param baseSell 基础销售数据 + */ + @Override + public void addSellDetail(Sell sell, BaseSell baseSell) { + // 将基础销售数据转换为 ChargedCardSell 类型 + ChargedCardSell chargedCardSell = (ChargedCardSell) baseSell; + // 通过会员卡服务根据会员卡号获取会员信息 + MemberCard memberHistoryCard = memberCardService.getById(chargedCardSell.getMemberCardId()); + // 执行会员卡续卡的核心逻辑,并获取续卡后的会员信息 + MemberCard chargedMemberCard = chargedMemberCard(chargedCardSell, memberHistoryCard); + + // 生成销售细单 + SellDetail sellDetail = createSellDetail(chargedCardSell, sell, chargedMemberCard); + + // 通过销售支付服务添加销售支付列表 + sellpayService.addSellPayList(chargedCardSell.getSellPayList(), sell.getSellId()); + + // 通过支付服务设置销售的额外信息 + payService.setSellExtraInfo(sell.getSellId(), chargedMemberCard, BigDecimal.ZERO, BigDecimal.ZERO); + } + + /** + * 执行会员卡续卡的核心逻辑 + * + * @param chargedCardSell 构建卡销售数据 + * @param memberHistoryCard 原会员卡信息 + * @return 续卡后的会员卡信息 + */ + MemberCard chargedMemberCard(ChargedCardSell chargedCardSell, MemberCard memberHistoryCard) { + // 获取原会员卡卡内金额 + BigDecimal memberBeforeAmount = memberHistoryCard.getAmount(); + // 获取原会员卡赠送金额 + BigDecimal memberBeforeGiveAmount = memberHistoryCard.getGiveAmount(); + + // 从构建卡销售数据中获取续卡表单 + ChargedCardForm chargedCardForm = chargedCardSell.getChargedCardForm(); + // 获取续卡充值金额 + BigDecimal chargedAmount = chargedCardForm.getChargedCardAmount(); + // 获取续卡赠送金额 + BigDecimal chargedGiveAmount = chargedCardForm.getChargedGiveAmount(); + + // 计算并设置续卡后的卡内金额 + memberHistoryCard.setAmount(BigDecimalUtil.add(memberBeforeAmount, chargedAmount)); + // 计算并设置续卡后的赠送金额 + memberHistoryCard.setGiveAmount(BigDecimalUtil.add(memberBeforeGiveAmount, chargedGiveAmount)); + + // 更新会员卡信息 + Boolean updated = memberCardService.updateById(memberHistoryCard); + // 如果更新失败,抛出异常 + if (!updated) { + throw new ApiException(CARD_AMOUNT_CHANGE); + } + + return memberHistoryCard; + } + + /** + * 创建销售细单 + * + * @param chargedCardSell 构建卡销售数据 + * @param sell 销售实体 + * @param memberCard 会员卡信息 + * @return 生成的销售细单 + */ + SellDetail createSellDetail(ChargedCardSell chargedCardSell, Sell sell, MemberCard memberCard) { + // 从构建卡销售数据中获取续卡表单 + ChargedCardForm chargedCardForm = chargedCardSell.getChargedCardForm(); + // 创建新的销售细单对象 + SellDetail sellDetail = new SellDetail(); + // 设置销售细单的销售 ID + sellDetail.setSellId(sell.getSellId()); + // 设置销售细单的销售类型 + sellDetail.setSellType(sell.getSellType()); + // 设置销售细单的会员 ID + sellDetail.setMemberId(sell.getMemberId()); + + // 设置销售细单的产品类型为续卡 + sellDetail.setProductType(PRODUCT_TYPE_CHARGED_CARD); + // 设置销售细单的卡 ID + sellDetail.setCardId(chargedCardForm.getCardId()); + // 设置销售细单的卡名称 + sellDetail.setCardName(chargedCardForm.getCardName()); + // 设置销售细单的续卡金额 + sellDetail.setAmount(chargedCardForm.getChargedCardAmount()); + // 设置销售细单的续卡赠送金额 + sellDetail.setGiveAmount(chargedCardForm.getChargedGiveAmount()); + // 设置销售细单的实际金额 + sellDetail.setRealAmount(chargedCardForm.getChargedCardAmount()); + sellDetail.setTotalRealAmount(chargedCardForm.getTotalRealAmount()); + // 设置销售细单的会员卡号 + sellDetail.setMemberCardId(memberCard.getMemberCardId()); + + // 保存销售细单 + sellDetailService.save(sellDetail); + + + Card card = cardService.getById(chargedCardForm.getCardId()); + + + //该条目有服务人员 + List serverList = chargedCardForm.getServerList(); + if (CollectionUtil.isNotEmpty(serverList)) { + //如果是固定金额 固定金额除以人数 获取固定金额 + //如果是比例 计算出比例后提成 获取固定金额 + //业绩和提成均平均分 + //总提成 + BigDecimal totalPushMoney = BigDecimal.ZERO; + //总业绩 为订单实付金额 + BigDecimal totalGradeMoney = sellDetail.getTotalRealAmount(); + //固定金额的话 + //按比例 + if (card.getCardPushPercent() != null) { + //提成额 先转换为百分数 + BigDecimal pushPercent = BigDecimalUtil.div(card.getCardPushPercent(), new BigDecimal("100")); + //折后价*百分数 + totalPushMoney = BigDecimalUtil.mul(totalGradeMoney, pushPercent); + } + + + //平均分 + BigDecimal pushMoney = BigDecimalUtil.div(totalPushMoney, new BigDecimal(serverList.size())); + BigDecimal gradeMoney = BigDecimalUtil.div(totalGradeMoney, new BigDecimal(serverList.size())); + + + //设置服务人员 + serverList.stream().forEach(server -> { + SellDetailServer sellDetailServer = new SellDetailServer(); + sellDetailServer.setSellId(sell.getSellId()); + sellDetailServer.setSellDetailId(sellDetail.getSellDetailId()); + sellDetailServer.setServerId(server.getServerId()); + sellDetailServer.setServerName(server.getServerName()); + sellDetailServer.setServerPushMoney(pushMoney); + sellDetailServer.setServerGrade(gradeMoney); + sellDetailServerService.save(sellDetailServer); + }); + } + return sellDetail; + } +} diff --git a/src/main/java/com/dd/admin/business/pay/service/impl/SellDetailMemberProduct.java b/src/main/java/com/dd/admin/business/pay/service/impl/SellDetailMemberProduct.java new file mode 100644 index 0000000..140393d --- /dev/null +++ b/src/main/java/com/dd/admin/business/pay/service/impl/SellDetailMemberProduct.java @@ -0,0 +1,261 @@ +package com.dd.admin.business.pay.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import com.dd.admin.business.card.entity.Card; +import com.dd.admin.business.card.service.CardService; +import com.dd.admin.business.detailServer.entity.SellDetailServer; +import com.dd.admin.business.detailServer.service.SellDetailServerService; +import com.dd.admin.business.memberCard.domain.MemberCardVo; +import com.dd.admin.business.memberCard.entity.MemberCard; +import com.dd.admin.business.memberCard.service.MemberCardService; +import com.dd.admin.business.pay.domain.*; +import com.dd.admin.business.pay.service.AddSellDetailService; +import com.dd.admin.business.pay.service.PayService; +import com.dd.admin.business.product.entity.Product; +import com.dd.admin.business.product.service.ProductService; +import com.dd.admin.business.sell.entity.Sell; +import com.dd.admin.business.sell.service.SellService; +import com.dd.admin.business.sellDetail.entity.SellDetail; +import com.dd.admin.business.sellDetail.service.SellDetailService; +import com.dd.admin.business.sellPay.entity.Sellpay; +import com.dd.admin.business.sellPay.service.SellpayService; +import com.dd.admin.business.server.domain.ServerVo; +import com.dd.admin.business.stock.entity.Stock; +import com.dd.admin.business.stock.service.StockService; +import com.dd.admin.business.stockDetail.entity.StockDetail; +import com.dd.admin.business.stockDetail.service.StockDetailService; +import com.dd.admin.common.exception.ApiException; +import com.dd.admin.common.security.SecurityUtil; +import com.dd.admin.common.utils.BigDecimalUtil; +import com.dd.admin.common.utils.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import static com.dd.admin.business.pay.enmus.CashierExceptionEnum.*; +import static com.dd.admin.business.pay.enmus.PayConst.*; +import static com.dd.admin.common.consts.MemberShopConst.*; + +@Service +public class SellDetailMemberProduct implements AddSellDetailService { + + @Autowired + private MemberCardService memberCardService; + @Autowired + private SellDetailService sellDetailService; + @Autowired + private SellpayService sellpayService; + @Autowired + private PayService payService; + @Autowired + private ProductService productService; + @Autowired + private StockService stockService; + @Autowired + private StockDetailService stockDetailService; + @Autowired + private SellDetailServerService sellDetailServerService; + @Override + public void addSellDetail(Sell sell, BaseSell sellDto) { + MemberProductSell memberProductSell = (MemberProductSell) sellDto; + String memberCardId = memberProductSell.getMemberCardId(); + MemberCard memberCard = null; + BigDecimal memberBeforeAmount = null; + BigDecimal memberBeforeGiveAmount = null; + + //如果有会员卡 + if(StringUtil.isNotEmpty(memberCardId)){ + //先获取消费前前金额 + MemberCard memberHistoryCard = memberCardService.getById(memberCardId); + memberBeforeAmount = memberHistoryCard.getAmount(); + memberBeforeGiveAmount = memberHistoryCard.getGiveAmount(); + + //扣款 + memberCard = deductMemberCard(memberHistoryCard,memberProductSell.getSellPayList()); + } + + //添加支付方式 + sellpayService.addSellPayList(memberProductSell.getSellPayList(),sell.getSellId()); + + //订单详情 + List selldetailList = new ArrayList<>(); + + //获取订单详情 + List productDetailFormList = memberProductSell.getProductFormList(); + MemberCard finalMemberCard = memberCard; + //设置细单会员余额 + BigDecimal finalMemberBeforeAmount = memberBeforeAmount; + BigDecimal finalMemberBeforeGiveAmount = memberBeforeGiveAmount; + productDetailFormList.stream().forEach(productSellDetail -> { + SellDetail selldetail = addSellDetail(productSellDetail,sell, finalMemberCard, finalMemberBeforeAmount, finalMemberBeforeGiveAmount); + selldetailList.add(selldetail); + }); + + payService.setSellExtraInfo(sell.getSellId(),memberCard,memberBeforeAmount,memberBeforeGiveAmount); + } + + //添加详情 + SellDetail addSellDetail(ProductForm productDetail , Sell sell, MemberCard memberCard,BigDecimal memberBeforeAmount,BigDecimal memberBeforeGiveAmount ){ + SellDetail sellDetail = new SellDetail(); + //3设置订单id 订单类型 订单状态 + sellDetail.setSellId(sell.getSellId()); + sellDetail.setSellType(sell.getSellType()); + sellDetail.setSellStatus(sell.getSellStatus()); + sellDetail.setMemberId(sell.getMemberId()); + + + //设置商品信息 + sellDetail.setProductType(PRODUCT_TYPE_PRODUCT); + sellDetail.setProductId(productDetail.getProductId()); + sellDetail.setProductName(productDetail.getProductName()); + sellDetail.setAmount(productDetail.getProductAmount()); + sellDetail.setDiscount(productDetail.getDiscount()); + sellDetail.setCount(productDetail.getCount()); + sellDetail.setRealAmount(productDetail.getRealAmount()); + sellDetail.setTotalRealAmount(productDetail.getTotalRealAmount()); + //设置会员信息 + if(memberCard!=null){ + sellDetail.setCardId(memberCard.getCardId()); + sellDetail.setMemberCardId(memberCard.getMemberCardId()); + } + + + Product product = productService.getById(productDetail.getProductId()); + + //减去库存信息 + if(product.getStockControl().equals(STOCK_CONTROL_YES)) { + //创建入库总单 + Stock stock = new Stock(); + stock.setStockOutType(STOCK_OUT_TYPE_USE); + stock.setStockTitle(DateUtil.formatChineseDate(new Date(), false, true) + SecurityUtil.getLoginUser().getDeptName() + "出库单"); + stock.setStockNo(StringUtil.getDateStringNow() + StringUtil.createCode(4)); + stock.setStockType(STOCK_OUT); + stockService.save(stock); + + StockDetail stockDetail = new StockDetail(); + stockDetail.setStockId(stock.getStockId()); + stockDetail.setProductId(product.getProductId()); + stockDetail.setProductName(product.getProductName()); + stockDetail.setCount(productDetail.getCount()); + + productService.subProductCount(product.getProductId(), productDetail.getCount()); + + stockDetailService.save(stockDetail); + } + + sellDetailService.save(sellDetail); + + //该条目有服务人员 + List serverList = productDetail.getServerList(); + if(CollectionUtil.isNotEmpty(serverList)) { + //如果是固定金额 固定金额除以人数 获取固定金额 + //如果是比例 计算出比例后提成 获取固定金额 + //业绩和提成均平均分 + //总提成 + BigDecimal totalPushMoney = BigDecimal.ZERO; + //总业绩 为订单实付金额 + BigDecimal totalGradeMoney = sellDetail.getTotalRealAmount(); + //固定金额的话 + if (product.getPushType().equals(PUSH_FIXED)) { + totalPushMoney = BigDecimalUtil.mul(product.getPushAmount(),new BigDecimal(sellDetail.getCount())); + + } + //按比例 + if (product.getPushType().equals(PUSH_SCALE)) { + //提成额 先转换为百分数 + BigDecimal pushPercent = BigDecimalUtil.div(product.getPushPercent(), new BigDecimal("100")); + //折后价*百分数 + totalPushMoney = BigDecimalUtil.mul(totalGradeMoney, pushPercent); + } + + + //平均分 + BigDecimal pushMoney = BigDecimalUtil.div(totalPushMoney, new BigDecimal(serverList.size())); + BigDecimal gradeMoney = BigDecimalUtil.div(totalGradeMoney, new BigDecimal(serverList.size())); + + + //设置服务人员 + serverList.stream().forEach(server -> { + SellDetailServer sellDetailServer = new SellDetailServer(); + sellDetailServer.setSellId(sell.getSellId()); + sellDetailServer.setSellDetailId(sellDetail.getSellDetailId()); + sellDetailServer.setServerId(server.getServerId()); + sellDetailServer.setServerName(server.getServerName()); + sellDetailServer.setServerPushMoney(pushMoney); + sellDetailServer.setServerGrade(gradeMoney); + sellDetailServerService.save(sellDetailServer); + }); + + } + return sellDetail; + } + + + + //减去卡金 + MemberCard deductMemberCard(MemberCard memberHistoryCard, List sellPayList){ + //消费前会员卡余额 + BigDecimal memberBeforeAmount = memberHistoryCard.getAmount(); + BigDecimal memberBeforeGiveAmount = memberHistoryCard.getGiveAmount(); + BigDecimal memberBeforeTotalAmount = BigDecimalUtil.add(memberBeforeAmount,memberBeforeGiveAmount); + //订单需要支付的卡金 + BigDecimal memberCardCost = sellPayList.stream() + .filter(p -> p.getPayType().equals(PAY_TYPE_CARD)) + .map(Sellpay::getAmount) + .findFirst().orElse(BigDecimal.ZERO); + //订单需要支付的金额 先扣卡金 退款仅退卡金 + //如果卡金足够支付 + try { + if(memberBeforeAmount.compareTo(memberCardCost) > -1){ + BigDecimal memberAfterAmount = BigDecimalUtil.sub(memberBeforeAmount, memberCardCost); + memberHistoryCard.setAmount(memberAfterAmount); + //卡总金额是否够支付 + }else if(memberBeforeTotalAmount.compareTo(memberCardCost) > -1){ + //这里已经出现了卡金不够支付的情况了 所以置为0 减去的金额是赠送金需要支付的 + BigDecimal memberCardGiveCost = BigDecimalUtil.sub(memberCardCost, memberBeforeAmount); + + sellPayList.stream().forEach(sellpay -> { + if(sellpay.getPayType().equals(PAY_TYPE_CARD)){ + sellpay.setAmount(memberBeforeAmount); + } + }); + + memberHistoryCard.setAmount(BigDecimal.ZERO); + + if(memberBeforeGiveAmount.compareTo(memberCardGiveCost) > -1){ + Sellpay sellpay = new Sellpay(); + sellpay.setPayType(PAY_TYPE_CARD_GIVE); + sellpay.setAmount(memberCardGiveCost); + sellpay.setPayName(PAY_TYPE_CARD_GIVE_NAME); + sellPayList.add(sellpay); + + BigDecimal memAfterGiveAmount = BigDecimalUtil.sub(memberBeforeGiveAmount, memberCardGiveCost); + memberHistoryCard.setGiveAmount(memAfterGiveAmount); + } + }else{ + throw new ApiException(MEMBER_CARD_NOT_SUFFICIENT_FUNDS); + } + + Boolean b = memberCardService.updateById(memberHistoryCard); + //监听数据 乐观锁改变 + if(!b){ + throw new ApiException(CARD_AMOUNT_CHANGE); + } + }catch (ArithmeticException e) { + // 处理数值计算异常,并提供更详细的错误信息 + throw new RuntimeException("数值计算出现异常:" + e.getMessage(), e); + } + + return memberHistoryCard; + } +} diff --git a/src/main/java/com/dd/admin/business/product/controller/ProductController.java b/src/main/java/com/dd/admin/business/product/controller/ProductController.java new file mode 100644 index 0000000..1006ae8 --- /dev/null +++ b/src/main/java/com/dd/admin/business/product/controller/ProductController.java @@ -0,0 +1,107 @@ +package com.dd.admin.business.product.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.dd.admin.business.file.service.FileService; +import com.dd.admin.common.aop.operationLog.aop.OperLog; +import com.dd.admin.common.aop.operationLog.aop.OperType; +import com.dd.admin.common.security.SecurityUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.business.product.entity.Product; +import com.dd.admin.business.product.domain.ProductVo; +import com.dd.admin.business.product.domain.ProductDto; +import com.dd.admin.business.product.service.ProductService; + +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 商品 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-23 + */ +@Api(tags = "商品") +@RestController +public class ProductController { + + @Autowired + ProductService productService; + + @Autowired + FileService fileService; + + @ApiOperation(value = "商品-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/product/page") + @OperLog(operModule = "获取商品列表",operType = OperType.QUERY,operDesc = "获取商品列表") + public ResultBean> page(ProductDto productDto) { + productDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + IPage pageInfo = productService.selectProductPage(productDto); + pageInfo.getRecords().stream().forEach(productVo -> { + String fileAuthUrl = fileService.getFileAuthUrl(productVo.getProductImage()); + productVo.setProductImageUrl(fileAuthUrl); + }); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "商品-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/product/list") + public ResultBean> list(ProductDto productDto) { + productDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + List list = productService.selectProductList(productDto); + list.stream().forEach(productVo -> { + String fileAuthUrl = fileService.getFileAuthUrl(productVo.getProductImage()); + productVo.setProductImageUrl(fileAuthUrl); + }); + return ResultBean.success(list); + } + + @ApiOperation(value = "商品-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/product/add") + @OperLog(operModule = "商品-添加",operType = OperType.ADD,operDesc = "商品-添加") + public ResultBean add(@RequestBody @Validated ProductDto productDto) { + Product product = BeanUtil.copyProperties(productDto, Product.class); + productService.save(product); + return ResultBean.success(product); + } + + @ApiOperation(value = "商品-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/product/{productId}") + public ResultBean get(@PathVariable @NotBlank String productId) { + Product product = productService.getById(productId); + ProductVo productVo = BeanUtil.copyProperties(product,ProductVo.class); + return ResultBean.success(productVo); + } + + @ApiOperation(value = "商品-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/product/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) ProductDto productDto) { + Product product = BeanUtil.copyProperties(productDto, Product.class); + productService.updateById(product); + return ResultBean.success(product); + } + + @ApiOperation(value = "商品-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/product/delete/{productId}") + public ResultBean delete(@PathVariable @NotBlank String productId) { + Boolean b = productService.removeById(productId); + return ResultBean.success(b); + } +} diff --git a/src/main/java/com/dd/admin/business/product/domain/ProductDto.java b/src/main/java/com/dd/admin/business/product/domain/ProductDto.java new file mode 100644 index 0000000..d99a1a4 --- /dev/null +++ b/src/main/java/com/dd/admin/business/product/domain/ProductDto.java @@ -0,0 +1,114 @@ +package com.dd.admin.business.product.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 商品返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-23 + */ +@Data +@ApiModel(value="商品接收对象") +public class ProductDto { + + + @ApiModelProperty(value = "商品id") + @NotBlank(message = "商品id不能为空",groups = UpdateGroup.class) + private String productId; + + @ApiModelProperty(value = "分类id") + @NotBlank(message = "分类不能为空") + private String categoryId; + + @ApiModelProperty(value = "分类名") + @NotBlank(message = "分类不能为空") + private String categoryName; + + @ApiModelProperty(value = "商品名") + @NotBlank(message = "商品名不能为空") + private String productName; + + @ApiModelProperty(value = "商品金额") + private BigDecimal productAmount; + + @ApiModelProperty(value = "商品会员金额") + private BigDecimal productMemberAmount; + + @ApiModelProperty(value = "商品图片") + private String productImage; + + @ApiModelProperty(value = "库存数量") + private Long productCount; + + + @ApiModelProperty(value = "提成金额") + private BigDecimal pushAmount; + + @ApiModelProperty(value = "提成比例") + private BigDecimal pushPercent; + + @ApiModelProperty(value = "0正常 1下架") + private Integer productStatus; + + @ApiModelProperty(value = "乐观锁字段") + private Long version; + + @ApiModelProperty(value = "0正常 1删除") + private Integer deleted; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "0不开启 1开启") + @NotNull(message = "库存管理不能为空") + private Integer stockControl; + + @ApiModelProperty(value = "0固定金额 1比例") + @NotNull(message = "提成规则不能为空") + private Integer pushType; + + @ApiModelProperty(value = "搜索关键字") + private String keyword; +} diff --git a/src/main/java/com/dd/admin/business/product/domain/ProductVo.java b/src/main/java/com/dd/admin/business/product/domain/ProductVo.java new file mode 100644 index 0000000..738a294 --- /dev/null +++ b/src/main/java/com/dd/admin/business/product/domain/ProductVo.java @@ -0,0 +1,105 @@ +package com.dd.admin.business.product.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; + +/** + *

+ * 商品返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-23 + */ +@Data +@ApiModel(value="商品返回对象") +public class ProductVo { + + + @ApiModelProperty(value = "商品id") + private String productId; + + @ApiModelProperty(value = "分类id") + private String categoryId; + + @ApiModelProperty(value = "分类名") + private String categoryName; + + @ApiModelProperty(value = "商品名") + private String productName; + + @ApiModelProperty(value = "商品金额") + private BigDecimal productAmount; + + @ApiModelProperty(value = "商品会员金额") + private BigDecimal productMemberAmount; + + @ApiModelProperty(value = "商品图片") + private String productImage; + + @ApiModelProperty(value = "商品图片") + private String productImageUrl; + + @ApiModelProperty(value = "库存数量") + private Long productCount; + + @ApiModelProperty(value = "提成金额") + private BigDecimal pushAmount; + + @ApiModelProperty(value = "提成比例") + private BigDecimal pushPercent; + + @ApiModelProperty(value = "0正常 1下架") + private Integer productStatus; + + @ApiModelProperty(value = "乐观锁字段") + private Long version; + + @ApiModelProperty(value = "0正常 1删除") + private Integer deleted; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "0不开启 1开启") + private Integer stockControl; + + @ApiModelProperty(value = "0固定金额 1比例") + private Integer pushType; + +} diff --git a/src/main/java/com/dd/admin/business/product/entity/Product.java b/src/main/java/com/dd/admin/business/product/entity/Product.java new file mode 100644 index 0000000..f36d189 --- /dev/null +++ b/src/main/java/com/dd/admin/business/product/entity/Product.java @@ -0,0 +1,132 @@ +package com.dd.admin.business.product.entity; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 商品 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_product") +@ApiModel(value="Product对象", description="商品") +public class Product implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "商品id") + @TableId(value = "PRODUCT_ID", type = IdType.ASSIGN_UUID) + private String productId; + + @ApiModelProperty(value = "分类id") + @TableField("CATEGORY_ID") + private String categoryId; + + @ApiModelProperty(value = "分类名") + @TableField("CATEGORY_NAME") + private String categoryName; + + @ApiModelProperty(value = "商品名") + @TableField("PRODUCT_NAME") + private String productName; + + @ApiModelProperty(value = "商品金额") + @TableField("PRODUCT_AMOUNT") + private BigDecimal productAmount; + + @ApiModelProperty(value = "商品会员金额") + @TableField("PRODUCT_MEMBER_AMOUNT") + private BigDecimal productMemberAmount; + + @ApiModelProperty(value = "商品图片") + @TableField("PRODUCT_IMAGE") + private String productImage; + + @ApiModelProperty(value = "库存数量") + @TableField("PRODUCT_COUNT") + private Long productCount; + + @ApiModelProperty(value = "库存数量") + @TableField(exist = false) + private Long count; + + + @ApiModelProperty(value = "提成金额") + @TableField("PUSH_AMOUNT") + private BigDecimal pushAmount; + + @ApiModelProperty(value = "提成比例") + @TableField("PUSH_PERCENT") + private BigDecimal pushPercent; + + @ApiModelProperty(value = "0正常 1下架") + @TableField("PRODUCT_STATUS") + private Integer productStatus; + + @ApiModelProperty(value = "乐观锁字段") + @TableField("VERSION") + @Version + private Long version; + + @ApiModelProperty(value = "0正常 1删除") + @TableField("DELETED") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "门店id") + @TableField(value = "SHOP_ID", fill = FieldFill.INSERT) + private String shopId; + + @ApiModelProperty(value = "门店名") + @TableField(value = "SHOP_NAME", fill = FieldFill.INSERT) + private String shopName; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "修改人") + @TableField(value = "UPDATE_NAME", fill = FieldFill.UPDATE) + private String updateName; + + @ApiModelProperty(value = "修改人id") + @TableField(value = "UPDATE_ID", fill = FieldFill.UPDATE) + private String updateId; + + @ApiModelProperty(value = "0不开启 1开启") + @TableField("STOCK_CONTROL") + private Integer stockControl; + + @ApiModelProperty(value = "0固定金额 1比例") + @TableField("PUSH_TYPE") + private Integer pushType; +} diff --git a/src/main/java/com/dd/admin/business/product/mapper/ProductMapper.java b/src/main/java/com/dd/admin/business/product/mapper/ProductMapper.java new file mode 100644 index 0000000..f130a83 --- /dev/null +++ b/src/main/java/com/dd/admin/business/product/mapper/ProductMapper.java @@ -0,0 +1,28 @@ +package com.dd.admin.business.product.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.product.entity.Product; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.business.product.domain.ProductVo; +import com.dd.admin.business.product.domain.ProductDto; + +import java.util.List; + +/** + *

+ * 商品 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-23 + */ +@Mapper +public interface ProductMapper extends BaseMapper { + + IPage selectProductPage(Page page, @Param("productDto") ProductDto productDto); + + List selectProductList(@Param("productDto") ProductDto productDto); +} diff --git a/src/main/java/com/dd/admin/business/product/mapper/xml/ProductMapper.xml b/src/main/java/com/dd/admin/business/product/mapper/xml/ProductMapper.xml new file mode 100644 index 0000000..78bb9d7 --- /dev/null +++ b/src/main/java/com/dd/admin/business/product/mapper/xml/ProductMapper.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PRODUCT_ID, CATEGORY_ID, CATEGORY_NAME, PRODUCT_NAME, PRODUCT_AMOUNT, PRODUCT_MEMBER_AMOUNT, PRODUCT_IMAGE, PRODUCT_COUNT, PUSH_AMOUNT, PUSH_PERCENT, PRODUCT_STATUS, VERSION, DELETED, SHOP_ID, SHOP_NAME, CREATE_NAME, CREATE_TIME, CREATE_ID, UPDATE_TIME, UPDATE_NAME, UPDATE_ID + + + + + + diff --git a/src/main/java/com/dd/admin/business/product/service/ProductService.java b/src/main/java/com/dd/admin/business/product/service/ProductService.java new file mode 100644 index 0000000..15b4361 --- /dev/null +++ b/src/main/java/com/dd/admin/business/product/service/ProductService.java @@ -0,0 +1,34 @@ +package com.dd.admin.business.product.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.business.product.entity.Product; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.business.product.domain.ProductVo; +import com.dd.admin.business.product.domain.ProductDto; +import java.util.List; + +/** + *

+ * 商品 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-23 + */ +public interface ProductService extends IService { + + //商品-分页列表 + IPage selectProductPage(ProductDto productDto); + + //商品-列表 + List selectProductList(ProductDto productDto); + + Product addProductCount(String productId,Long count); + + Product subProductCount(String productId,Long count); + + //根据机构shopId查询商品库存数量排行(可指定返回数量) + List getProductStockRankByShopId(String shopId, Integer limit); + + Integer selectProductCount(String shopId); +} diff --git a/src/main/java/com/dd/admin/business/product/service/impl/ProductServiceImpl.java b/src/main/java/com/dd/admin/business/product/service/impl/ProductServiceImpl.java new file mode 100644 index 0000000..f6c55f9 --- /dev/null +++ b/src/main/java/com/dd/admin/business/product/service/impl/ProductServiceImpl.java @@ -0,0 +1,89 @@ +package com.dd.admin.business.product.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.exception.ApiException; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.business.product.entity.Product; +import com.dd.admin.business.product.mapper.ProductMapper; +import com.dd.admin.business.product.service.ProductService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.dd.admin.business.product.domain.ProductVo; +import com.dd.admin.business.product.domain.ProductDto; +import java.util.List; + +/** + *

+ * 商品 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2024-05-23 + */ +@Service +public class ProductServiceImpl extends ServiceImpl implements ProductService { + + @Override + public IPage selectProductPage(ProductDto productDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectProductPage(page,productDto); + } + + @Override + public List selectProductList(ProductDto productDto) { + return baseMapper.selectProductList(productDto); + } + + @Override + public Product addProductCount(String productId, Long count) { + Product product = this.getById(productId); + product.setProductCount(product.getProductCount() + count); + updateById(product); + return product; + } + + @Override + public Product subProductCount(String productId, Long count) { + Product product = this.getById(productId); + product.setProductCount(product.getProductCount() - count); + if(product.getProductCount() < 0){ + throw new ApiException("商品库存不足"); + } + updateById(product); + return product; + } + + + /** + * 根据机构shopId查询商品库存数量排行(可指定返回数量) + * + * @param shopId 机构id + * @param limit 返回的排行数量限制(例如取前几名),如果为null则查询全部符合条件的商品排行 + * @return 按库存数量排序后的商品列表(库存数量从大到小排序) + */ + @Override + public List getProductStockRankByShopId(String shopId, Integer limit) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + // 根据shopId添加筛选条件,只查询指定机构下的商品 + queryWrapper.eq(Product::getShopId, shopId); + // 按照库存数量字段(PRODUCT_COUNT)进行降序排序(从大到小) + queryWrapper.orderByDesc(Product::getProductCount); + + if (limit!= null) { + // 如果传入了数量限制,则添加限制条件,只取前limit条记录 + queryWrapper.last("LIMIT " + limit); + } + + return baseMapper.selectList(queryWrapper); + } + + @Override + public Integer selectProductCount(String shopId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Product::getShopId, shopId); + return baseMapper.selectCount(queryWrapper); + } +} diff --git a/src/main/java/com/dd/admin/business/sell/controller/SellController.java b/src/main/java/com/dd/admin/business/sell/controller/SellController.java new file mode 100644 index 0000000..62e5de5 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sell/controller/SellController.java @@ -0,0 +1,132 @@ +package com.dd.admin.business.sell.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.dd.admin.business.sell.domain.CancelSellDto; +import com.dd.admin.business.sell.enums.CancelSellServiceEnum; +import com.dd.admin.business.sell.service.CancelSellService; +import com.dd.admin.business.sellDetail.service.SellDetailService; +import com.dd.admin.common.aop.operationLog.aop.OperLog; +import com.dd.admin.common.aop.operationLog.aop.OperType; +import com.dd.admin.common.exception.ApiException; +import com.dd.admin.common.security.SecurityUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.business.sell.entity.Sell; +import com.dd.admin.business.sell.domain.SellVo; +import com.dd.admin.business.sell.domain.SellDto; +import com.dd.admin.business.sell.service.SellService; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.springframework.web.bind.annotation.RestController; + +import static com.dd.admin.business.pay.enmus.CashierExceptionEnum.PAY_SELL_CANCEL_ERROR; +import static com.dd.admin.business.pay.enmus.PayConst.SELL_STATUS_REVOCATION; +import static com.dd.admin.common.consts.MemberShopConst.SELL_STATUS_CANCEL; + +/** + *

+ * 订单 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Api(tags = "订单") +@RestController +public class SellController { + + @Autowired + SellService sellService; + + @Autowired + Map cancelSellServiceMap; + + @Autowired + SellDetailService sellDetailService; + + @ApiOperation(value = "订单-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/sell/page") + @OperLog(operModule = "获取订单列表",operType = OperType.QUERY,operDesc = "获取订单列表") + public ResultBean> page(SellDto sellDto) { + sellDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + IPage pageInfo = sellService.selectSellPage(sellDto); + sellService.setSellDetail(pageInfo.getRecords()); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "订单-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/sell/list") + public ResultBean> list(SellDto sellDto) { + sellDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + List list = sellService.selectSellList(sellDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "订单-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/sell/add") + public ResultBean add(@RequestBody @Validated SellDto sellDto) { + Sell sell = BeanUtil.copyProperties(sellDto, Sell.class); + sellService.save(sell); + return ResultBean.success(sell); + } + + @ApiOperation(value = "订单-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/sell/{sellId}") + public ResultBean get(@PathVariable @NotBlank String sellId) { + Sell sell = sellService.getById(sellId); + SellVo sellVo = BeanUtil.copyProperties(sell,SellVo.class); + return ResultBean.success(sellVo); + } + + @ApiOperation(value = "订单-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/sell/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) SellDto sellDto) { + Sell sell = BeanUtil.copyProperties(sellDto, Sell.class); + sellService.updateById(sell); + return ResultBean.success(sell); + } + + @ApiOperation(value = "订单-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/sell/delete/{sellId}") + public ResultBean delete(@PathVariable @NotBlank String sellId) { + Boolean b = sellService.removeById(sellId); + return ResultBean.success(b); + } + + @ApiOperation(value = "订单-销单") + @ApiOperationSupport(order = 6) + @PostMapping("/admin/sell/cancel") + @Transactional + public ResultBean cancel(@RequestBody @Validated CancelSellDto cancelSellDto) { + Sell sell = sellService.getById(cancelSellDto.getSellId()); + if(sell.getSellStatus().equals(SELL_STATUS_CANCEL)){ + throw new ApiException(PAY_SELL_CANCEL_ERROR); + } + //销单 + cancelSellServiceMap.get(CancelSellServiceEnum.getEnumBySellType(sell.getSellType()).getServiceName()).cancel(sell); + sell.setSellStatus(SELL_STATUS_REVOCATION); + sell.setRemark(cancelSellDto.getRemark()); + sellService.updateById(sell); + sellDetailService.updateSellDetailStatus(sell.getSellId()); + return ResultBean.success(); + } + +} diff --git a/src/main/java/com/dd/admin/business/sell/domain/CancelSellDto.java b/src/main/java/com/dd/admin/business/sell/domain/CancelSellDto.java new file mode 100644 index 0000000..c86402e --- /dev/null +++ b/src/main/java/com/dd/admin/business/sell/domain/CancelSellDto.java @@ -0,0 +1,17 @@ +package com.dd.admin.business.sell.domain; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@ApiModel(value="销售表接收对象") +public class CancelSellDto { + @NotBlank(message = "订单id不能为空") + private String sellId; + + @NotBlank(message = "撤销原因不能为空") + private String remark; +} diff --git a/src/main/java/com/dd/admin/business/sell/domain/SellDto.java b/src/main/java/com/dd/admin/business/sell/domain/SellDto.java new file mode 100644 index 0000000..9dfb0e5 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sell/domain/SellDto.java @@ -0,0 +1,117 @@ +package com.dd.admin.business.sell.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 订单返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Data +@ApiModel(value="订单接收对象") +public class SellDto { + + + @ApiModelProperty(value = "订单id") + @NotBlank(message = "订单id不能为空",groups = UpdateGroup.class) + private String sellId; + + @ApiModelProperty(value = "订单号") + private String sellNo; + + @ApiModelProperty(value = "流水号") + private String serialNo; + + @ApiModelProperty(value = "会员ID") + private String memberId; + + @ApiModelProperty(value = "会员卡ID") + private String memberCardId; + + @ApiModelProperty(value = "会员卡名") + private String memberCardName; + + @ApiModelProperty(value = "会员卡编号") + private String memberCardNo; + + @ApiModelProperty(value = "会员名称") + private String memberName; + + @ApiModelProperty(value = "消费金额") + private BigDecimal sellAmount; + + @ApiModelProperty(value = "实际入账") + private BigDecimal realAmount; + + @ApiModelProperty(value = "1商品 2开卡 ") + @TableField("SELL_TYPE") + private Integer sellType; + + @ApiModelProperty(value = "0正常 1取消") + private Integer sellStatus; + + @ApiModelProperty(value = "0正常 1删除") + private Integer deleted; + + @ApiModelProperty(value = "乐观锁字段") + private Long version; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "消费后金额") + private BigDecimal memberCardAfterAmount; + + private BigDecimal memberCardBeforeAmount; + + @ApiModelProperty(value = "消费后金额") + private BigDecimal memberCardAfterGiveAmount; + + private BigDecimal memberCardBeforeGiveAmount; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "搜索关键字") + private String keyword; +} diff --git a/src/main/java/com/dd/admin/business/sell/domain/SellVo.java b/src/main/java/com/dd/admin/business/sell/domain/SellVo.java new file mode 100644 index 0000000..4af4121 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sell/domain/SellVo.java @@ -0,0 +1,122 @@ +package com.dd.admin.business.sell.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import java.util.List; + +import com.dd.admin.business.sellDetail.domain.SellDetailVo; +import com.dd.admin.business.sellDetail.entity.SellDetail; +import com.dd.admin.business.sellPay.domain.SellpayVo; +import com.dd.admin.business.sellPay.entity.Sellpay; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 订单返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Data +@ApiModel(value="订单返回对象") +public class SellVo { + + + @ApiModelProperty(value = "订单id") + private String sellId; + + @ApiModelProperty(value = "订单号") + private String sellNo; + + @ApiModelProperty(value = "流水号") + private String serialNo; + + @ApiModelProperty(value = "会员ID") + private String memberId; + + @ApiModelProperty(value = "会员卡ID") + private String memberCardId; + + @ApiModelProperty(value = "会员卡名") + private String memberCardName; + + @ApiModelProperty(value = "会员卡编号") + private String memberCardNo; + + @ApiModelProperty(value = "会员名称") + private String memberName; + + @ApiModelProperty(value = "消费金额") + private BigDecimal sellAmount; + + @ApiModelProperty(value = "实际入账") + private BigDecimal realAmount; + + @ApiModelProperty(value = "1商品 2开卡 ") + @TableField("SELL_TYPE") + private Integer sellType; + + @ApiModelProperty(value = "0正常 1取消") + private Integer sellStatus; + + @ApiModelProperty(value = "0正常 1删除") + private Integer deleted; + + @ApiModelProperty(value = "乐观锁字段") + private Long version; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "消费后金额") + private BigDecimal memberCardAfterAmount; + + private BigDecimal memberCardBeforeAmount; + + @ApiModelProperty(value = "消费后金额") + private BigDecimal memberCardAfterGiveAmount; + + private BigDecimal memberCardBeforeGiveAmount; + + @ApiModelProperty("订单详情") + private List sellDetailList; + + @ApiModelProperty("支付方式") + private List sellPayList; + + @ApiModelProperty(value = "备注") + private String remark; +} diff --git a/src/main/java/com/dd/admin/business/sell/entity/Sell.java b/src/main/java/com/dd/admin/business/sell/entity/Sell.java new file mode 100644 index 0000000..8035ddd --- /dev/null +++ b/src/main/java/com/dd/admin/business/sell/entity/Sell.java @@ -0,0 +1,140 @@ +package com.dd.admin.business.sell.entity; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 订单 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_sell") +@ApiModel(value="Sell对象", description="订单") +public class Sell implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "订单id") + @TableId(value = "SELL_ID", type = IdType.ASSIGN_UUID) + private String sellId; + + @ApiModelProperty(value = "订单号") + @TableField("SELL_NO") + private String sellNo; + + @ApiModelProperty(value = "流水号") + @TableField("SERIAL_NO") + private String serialNo; + + @ApiModelProperty(value = "会员ID") + @TableField("MEMBER_ID") + private String memberId; + + @ApiModelProperty(value = "会员卡ID") + @TableField("MEMBER_CARD_ID") + private String memberCardId; + + @ApiModelProperty(value = "会员卡名") + @TableField("MEMBER_CARD_NAME") + private String memberCardName; + + @ApiModelProperty(value = "会员卡编号") + @TableField("MEMBER_CARD_NO") + private String memberCardNo; + + @ApiModelProperty(value = "会员名称") + @TableField("MEMBER_NAME") + private String memberName; + + @ApiModelProperty(value = "消费金额") + @TableField("SELL_AMOUNT") + private BigDecimal sellAmount; + + @ApiModelProperty(value = "实际入账") + @TableField("REAL_AMOUNT") + private BigDecimal realAmount; + + @ApiModelProperty(value = "1商品 2开卡 ") + @TableField("SELL_TYPE") + private Integer sellType; + + @ApiModelProperty(value = "0正常 1取消") + @TableField("SELL_STATUS") + private Integer sellStatus; + + @ApiModelProperty(value = "0正常 1删除") + @TableField("DELETED") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "乐观锁字段") + @TableField("VERSION") + @Version + private Long version; + + @ApiModelProperty(value = "门店id") + @TableField(value = "SHOP_ID", fill = FieldFill.INSERT) + private String shopId; + + @ApiModelProperty(value = "门店名") + @TableField(value = "SHOP_NAME", fill = FieldFill.INSERT) + private String shopName; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "修改人") + @TableField(value = "UPDATE_NAME", fill = FieldFill.UPDATE) + private String updateName; + + @ApiModelProperty(value = "修改人id") + @TableField(value = "UPDATE_ID", fill = FieldFill.UPDATE) + private String updateId; + + @ApiModelProperty(value = "消费后金额") + @TableField("MEMBER_CARD_AFTER_AMOUNT") + private BigDecimal memberCardAfterAmount; + + @TableField("MEMBER_CARD_BEFORE_AMOUNT") + private BigDecimal memberCardBeforeAmount; + + @ApiModelProperty(value = "消费后金额") + @TableField("MEMBER_CARD_AFTER_GIVE_AMOUNT") + private BigDecimal memberCardAfterGiveAmount; + + @TableField("MEMBER_CARD_BEFORE_GIVE_AMOUNT") + private BigDecimal memberCardBeforeGiveAmount; + + @ApiModelProperty(value = "备注") + private String remark; +} diff --git a/src/main/java/com/dd/admin/business/sell/enums/CancelSellServiceEnum.java b/src/main/java/com/dd/admin/business/sell/enums/CancelSellServiceEnum.java new file mode 100644 index 0000000..8996af8 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sell/enums/CancelSellServiceEnum.java @@ -0,0 +1,48 @@ +package com.dd.admin.business.sell.enums; + + +import com.dd.admin.common.exception.ApiException; + +import java.util.Arrays; + +import static com.dd.admin.business.pay.enmus.CashierExceptionEnum.PAY_SELL_CANCEL_ERROR; +import static com.dd.admin.business.pay.enmus.PayConst.*; + + +public enum CancelSellServiceEnum { + CANCEL_MEMBER_BUILD_CARD(SELL_TYPE_BUILD_CARD,"cancelMemberBuildCard"), + CANCEL_MEMBER_CHARGED_CARD(SELL_TYPE_CHARGED_CARD,"cancelMemberChargedCard"), + CANCEL_MEMBER_PRODUCT(SELL_TYPE_PRODUCT,"cancelMemberProduct"), + ; + + private Integer sellType; + private String serviceName; + + CancelSellServiceEnum(Integer sellType, String serviceName) { + this.sellType = sellType; + this.serviceName = serviceName; + } + + public Integer getSellType() { + return sellType; + } + + public void setSellType(Integer sellType) { + this.sellType = sellType; + } + + public String getServiceName() { + return serviceName; + } + + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } + + public static CancelSellServiceEnum getEnumBySellType(Integer sellType) { + CancelSellServiceEnum[] cancelSellServiceEnums = CancelSellServiceEnum.values(); + return Arrays.stream(cancelSellServiceEnums) + .filter(cancelSellServiceEnum -> cancelSellServiceEnum.getSellType().equals(sellType)) + .findFirst().orElseThrow(() -> new ApiException(PAY_SELL_CANCEL_ERROR)); + } +} diff --git a/src/main/java/com/dd/admin/business/sell/mapper/SellMapper.java b/src/main/java/com/dd/admin/business/sell/mapper/SellMapper.java new file mode 100644 index 0000000..6c3eb43 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sell/mapper/SellMapper.java @@ -0,0 +1,30 @@ +package com.dd.admin.business.sell.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.sell.entity.Sell; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.business.sell.domain.SellVo; +import com.dd.admin.business.sell.domain.SellDto; + +import java.util.List; + +/** + *

+ * 订单 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Mapper +public interface SellMapper extends BaseMapper { + + IPage selectSellPage(Page page, @Param("sellDto") SellDto sellDto); + + List selectSellList(@Param("sellDto") SellDto sellDto); + + Integer selectTodayCount(@Param("shopId") String shopId); +} diff --git a/src/main/java/com/dd/admin/business/sell/mapper/xml/SellMapper.xml b/src/main/java/com/dd/admin/business/sell/mapper/xml/SellMapper.xml new file mode 100644 index 0000000..045ae07 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sell/mapper/xml/SellMapper.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELL_ID, SELL_NO, SERIAL_NO, MEMBER_ID, MEMBER_CARD_ID,MEMBER_NAME, SELL_AMOUNT, REAL_AMOUNT, SELL_TYPE, SELL_STATUS, DELETED, VERSION, SHOP_ID, SHOP_NAME, CREATE_NAME, CREATE_TIME, CREATE_ID, UPDATE_TIME, UPDATE_NAME, UPDATE_ID, MEMBER_CARD_AFTER_AMOUNT, MEMBER_CARD_BEFORE_AMOUNT,MEMBER_CARD_AFTER_GIVE_AMOUNT, MEMBER_CARD_BEFORE_GIVE_AMOUNT + + + + + + + diff --git a/src/main/java/com/dd/admin/business/sell/service/CancelSellService.java b/src/main/java/com/dd/admin/business/sell/service/CancelSellService.java new file mode 100644 index 0000000..531dc5b --- /dev/null +++ b/src/main/java/com/dd/admin/business/sell/service/CancelSellService.java @@ -0,0 +1,9 @@ +package com.dd.admin.business.sell.service; + + +import com.dd.admin.business.sell.entity.Sell; + +public interface CancelSellService { + + void cancel(Sell sell); +} diff --git a/src/main/java/com/dd/admin/business/sell/service/SellService.java b/src/main/java/com/dd/admin/business/sell/service/SellService.java new file mode 100644 index 0000000..0cb9e27 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sell/service/SellService.java @@ -0,0 +1,32 @@ +package com.dd.admin.business.sell.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.business.sell.entity.Sell; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.business.sell.domain.SellVo; +import com.dd.admin.business.sell.domain.SellDto; +import java.util.List; + +/** + *

+ * 订单 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +public interface SellService extends IService { + + //订单-分页列表 + IPage selectSellPage(SellDto sellDto); + + //订单-列表 + List selectSellList(SellDto sellDto); + + Integer selectTodayCount(String shopId); + + //填充销售详情 + public void setSellDetail(List sellVoList); + + Integer selectSellCount(String shopId); +} diff --git a/src/main/java/com/dd/admin/business/sell/service/impl/CancelMemberBuildCard.java b/src/main/java/com/dd/admin/business/sell/service/impl/CancelMemberBuildCard.java new file mode 100644 index 0000000..9906cac --- /dev/null +++ b/src/main/java/com/dd/admin/business/sell/service/impl/CancelMemberBuildCard.java @@ -0,0 +1,48 @@ +package com.dd.admin.business.sell.service.impl; + + +import com.dd.admin.business.memberCard.entity.MemberCard; +import com.dd.admin.business.memberCard.service.MemberCardService; +import com.dd.admin.business.sell.entity.Sell; +import com.dd.admin.business.sell.service.CancelSellService; +import com.dd.admin.business.sell.service.SellService; +import com.dd.admin.business.sellDetail.service.SellDetailService; +import com.dd.admin.common.exception.ApiException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; + +import static com.dd.admin.business.pay.enmus.CashierExceptionEnum.PAY_SELL_CARD_AMOUNT_CHANGE; + + +@Service +@Slf4j +public class CancelMemberBuildCard implements CancelSellService { + @Autowired + MemberCardService memberCardService; + @Autowired + SellDetailService sellDetailService; + @Autowired + SellService sellService; + @Override + public void cancel(Sell sell) { + Sell extraSellInfo = sellService.getById(sell.getSellId()); + + //消费时用的哪张会员卡 + MemberCard membercard = memberCardService.getById(extraSellInfo.getMemberCardId()); + BigDecimal sellCardAmount = extraSellInfo.getMemberCardAfterAmount(); + BigDecimal sellCardGiveAmount = extraSellInfo.getMemberCardAfterGiveAmount(); + log.info("订单显示的卡余额:"+sellCardAmount); + BigDecimal cardAmount = membercard.getAmount(); + BigDecimal cardGiveAmount = membercard.getGiveAmount(); + log.info("当前卡余额:"+cardAmount); + //当前余额和订单充值余额比较 + if(sellCardAmount.compareTo(cardAmount) != 0 || cardGiveAmount.compareTo(sellCardGiveAmount) != 0){ + throw new ApiException(PAY_SELL_CARD_AMOUNT_CHANGE); + } + //删除卡 + memberCardService.removeById(membercard); + } +} diff --git a/src/main/java/com/dd/admin/business/sell/service/impl/CancelMemberChargedCard.java b/src/main/java/com/dd/admin/business/sell/service/impl/CancelMemberChargedCard.java new file mode 100644 index 0000000..9a73d68 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sell/service/impl/CancelMemberChargedCard.java @@ -0,0 +1,65 @@ +package com.dd.admin.business.sell.service.impl; + +import com.dd.admin.business.memberCard.entity.MemberCard; +import com.dd.admin.business.memberCard.service.MemberCardService; +import com.dd.admin.business.sell.entity.Sell; +import com.dd.admin.business.sell.service.CancelSellService; +import com.dd.admin.business.sell.service.SellService; +import com.dd.admin.business.sellDetail.entity.SellDetail; +import com.dd.admin.business.sellDetail.service.SellDetailService; +import com.dd.admin.common.exception.ApiException; +import com.dd.admin.common.utils.BigDecimalUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.List; + +import static com.dd.admin.business.pay.enmus.CashierExceptionEnum.CARD_AMOUNT_CHANGE; +import static com.dd.admin.business.pay.enmus.CashierExceptionEnum.PAY_SELL_CARD_AMOUNT_NOT_SUFFICIENT_FUNDS; + + +@Service +@Slf4j +public class CancelMemberChargedCard implements CancelSellService { + @Autowired + MemberCardService memberCardService; + @Autowired + SellDetailService sellDetailService; + @Autowired + SellService sellService; + @Override + public void cancel(Sell sell) { + Sell extraSellInfo = sellService.getById(sell.getSellId()); + //消费时用的哪张会员卡 + MemberCard memberCard = memberCardService.getById(extraSellInfo.getMemberCardId()); + + List sellDetailList = sellDetailService.selectSellDetailList(sell.getSellId()); + SellDetail sellDetail = sellDetailList.get(0); + + BigDecimal sellCardAmount = sellDetail.getAmount(); + BigDecimal sellCardGiveAmount = sellDetail.getGiveAmount(); + + BigDecimal cardAmount = memberCard.getAmount(); + log.info("当前卡余额:"+cardAmount); + BigDecimal cardGiveAmount = memberCard.getGiveAmount(); + log.info("当前卡余额:"+cardAmount); + + //消费后余额 + BigDecimal nowCardAmount = BigDecimalUtil.sub(cardAmount,sellCardAmount); + BigDecimal nowGiveAmount = BigDecimalUtil.sub(cardGiveAmount,sellCardGiveAmount); + + if (nowCardAmount.signum() == -1|nowGiveAmount.signum() == -1) { + throw new ApiException(PAY_SELL_CARD_AMOUNT_NOT_SUFFICIENT_FUNDS); + } + + //修改当前卡金赠送金 + memberCard.setAmount(nowCardAmount); + memberCard.setGiveAmount(nowGiveAmount); + Boolean b = memberCardService.updateById(memberCard); + if(!b){ + throw new ApiException(CARD_AMOUNT_CHANGE); + } + } +} diff --git a/src/main/java/com/dd/admin/business/sell/service/impl/CancelMemberProduct.java b/src/main/java/com/dd/admin/business/sell/service/impl/CancelMemberProduct.java new file mode 100644 index 0000000..1e2b68d --- /dev/null +++ b/src/main/java/com/dd/admin/business/sell/service/impl/CancelMemberProduct.java @@ -0,0 +1,131 @@ +package com.dd.admin.business.sell.service.impl; + + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import com.dd.admin.business.memberCard.entity.MemberCard; +import com.dd.admin.business.memberCard.service.MemberCardService; +import com.dd.admin.business.product.entity.Product; +import com.dd.admin.business.product.service.ProductService; +import com.dd.admin.business.sell.entity.Sell; +import com.dd.admin.business.sell.service.CancelSellService; +import com.dd.admin.business.sellDetail.domain.SellDetailDto; +import com.dd.admin.business.sellDetail.domain.SellDetailVo; +import com.dd.admin.business.sellDetail.entity.SellDetail; +import com.dd.admin.business.sellDetail.service.SellDetailService; +import com.dd.admin.business.sellPay.domain.SellpayVo; +import com.dd.admin.business.sellPay.entity.Sellpay; +import com.dd.admin.business.sellPay.service.SellpayService; +import com.dd.admin.business.stock.entity.Stock; +import com.dd.admin.business.stock.service.StockService; +import com.dd.admin.business.stockDetail.domain.StockDetailDto; +import com.dd.admin.business.stockDetail.entity.StockDetail; +import com.dd.admin.business.stockDetail.service.StockDetailService; +import com.dd.admin.common.exception.ApiException; +import com.dd.admin.common.security.SecurityUtil; +import com.dd.admin.common.utils.BigDecimalUtil; +import com.dd.admin.common.utils.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +import static com.dd.admin.business.pay.enmus.CashierExceptionEnum.CARD_AMOUNT_CHANGE; +import static com.dd.admin.business.pay.enmus.PayConst.PAY_TYPE_CARD; +import static com.dd.admin.business.pay.enmus.PayConst.PAY_TYPE_CARD_GIVE; +import static com.dd.admin.common.consts.MemberShopConst.*; + +@Service +@Slf4j +public class CancelMemberProduct implements CancelSellService { + + @Autowired + MemberCardService memberCardService; + @Autowired + SellDetailService sellDetailService; + @Autowired + ProductService productService; + @Autowired + StockService stockService; + @Autowired + StockDetailService stockDetailService; + @Autowired + SellpayService sellpayService; + + @Override + public void cancel(Sell sell) { + List sellDetailList = sellDetailService.selectSellDetailList(sell.getSellId()); + //增加库存 + addInventory(sellDetailList); + + MemberCard memberCard = memberCardService.getById(sell.getMemberCardId()); + + if(memberCard!=null){ + BigDecimal cardAmount = memberCard.getAmount(); + log.info("当前卡余额:"+cardAmount); + BigDecimal cardGiveAmount = memberCard.getGiveAmount(); + log.info("当前卡赠送金余额:"+cardAmount); + + + List sellPayVoList = sellpayService.selectSellPayList(sell.getSellId()); + + //计算订单卡金支付的金额 + Sellpay memberCardPay = sellPayVoList.stream().filter(p-> + p.getPayType().equals(PAY_TYPE_CARD) + ).findFirst().orElse(null); + Sellpay memberGivePay= sellPayVoList.stream().filter(p-> + p.getPayType().equals(PAY_TYPE_CARD_GIVE) + ).findFirst().orElse(null); + + if(memberCardPay!=null){ + memberCard.setAmount(BigDecimalUtil.add(cardAmount,memberCardPay.getAmount())); + } + if(memberGivePay!=null){ + memberCard.setGiveAmount(BigDecimalUtil.add(cardGiveAmount,memberGivePay.getAmount())); + } + Boolean b = memberCardService.updateById(memberCard); + if(!b){ + throw new ApiException(CARD_AMOUNT_CHANGE); + } + } + } + + + void addInventory(List productDetailList){ + + List stockDetailList = new ArrayList<>(); + //模拟入库 + productDetailList.stream().forEach(sellDetail -> { + String productId = sellDetail.getProductId(); + Product product = productService.getById(productId); + if(product.getStockControl().equals(STOCK_CONTROL_YES)){ + StockDetail stockDetail = new StockDetail(); + stockDetail.setProductId(product.getProductId()); + stockDetail.setProductName(product.getProductName()); + stockDetail.setCount(sellDetail.getCount()); + productService.addProductCount(product.getProductId(),sellDetail.getCount()); + stockDetailList.add(stockDetail); + } + }); + + + if(CollectionUtil.isNotEmpty(stockDetailList)){ + //创建入库总单 + Stock stock = new Stock(); + stock.setStockInType(STOCK_IN_TYPE_CANCEL); + stock.setStockTitle(DateUtil.formatChineseDate(new Date(),false,true) + SecurityUtil.getLoginUser().getDeptName() + "入库单"); + stock.setStockNo(StringUtil.getDateStringNow() + StringUtil.createCode(4)); + stock.setStockType(STOCK_IN); + stockService.save(stock); + + stockDetailList.stream().forEach(stockDetail -> {stockDetail.setStockId(stock.getStockId());}); + stockDetailService.saveBatch(stockDetailList); + } + } +} diff --git a/src/main/java/com/dd/admin/business/sell/service/impl/SellServiceImpl.java b/src/main/java/com/dd/admin/business/sell/service/impl/SellServiceImpl.java new file mode 100644 index 0000000..d33eaa9 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sell/service/impl/SellServiceImpl.java @@ -0,0 +1,97 @@ +package com.dd.admin.business.sell.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.detailServer.entity.SellDetailServer; +import com.dd.admin.business.detailServer.service.SellDetailServerService; +import com.dd.admin.business.sellDetail.entity.SellDetail; +import com.dd.admin.business.sellDetail.service.SellDetailService; +import com.dd.admin.business.sellPay.domain.SellpayVo; +import com.dd.admin.business.sellPay.entity.Sellpay; +import com.dd.admin.business.sellPay.service.SellpayService; +import com.dd.admin.business.sellPay.service.impl.SellpayServiceImpl; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.business.sell.entity.Sell; +import com.dd.admin.business.sell.mapper.SellMapper; +import com.dd.admin.business.sell.service.SellService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dd.admin.common.utils.ColumnUtil; +import com.dd.admin.common.utils.CommonUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.dd.admin.business.sell.domain.SellVo; +import com.dd.admin.business.sell.domain.SellDto; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + *

+ * 订单 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Service +public class SellServiceImpl extends ServiceImpl implements SellService { + + @Autowired + private SellDetailService sellDetailService; + @Autowired + private SellpayService sellpayService; + @Autowired + private SellDetailServerService sellDetailServerService; + + @Override + public IPage selectSellPage(SellDto sellDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectSellPage(page,sellDto); + } + + @Override + public List selectSellList(SellDto sellDto) { + return baseMapper.selectSellList(sellDto); + } + + @Override + public Integer selectTodayCount(String shopId) { + return baseMapper.selectTodayCount(shopId); + } + + @Override//TODO + public void setSellDetail(List sellVoList) { + List sellIds = sellVoList.stream().map(SellVo::getSellId).collect(Collectors.toList()); + // 使用 MyBatis Plus 的条件构造器查询 SelldetailVo 列表 + + List sellDetailList = sellDetailService.selectSellDetailList(sellIds); + List sellpayList = sellpayService.selectSellPayList(sellIds); + + List sellDetailIds = sellDetailList.stream().map(sellDetail -> sellDetail.getSellDetailId()).collect(Collectors.toList()); + List sellDetailServers = sellDetailServerService.selectSellDetailServerListBySellDetailIds(sellDetailIds); + // 获得所有的消费总单 + sellVoList.forEach(sellVo -> { + List selldetails = sellDetailList.stream() + .filter(selldetail -> sellVo.getSellId().equals(selldetail.getSellId())) + .collect(Collectors.toList()); + selldetails.stream().forEach(sellDetail -> { + List detailServerList = sellDetailServers.stream().filter(sellDetailServer -> sellDetail.getSellDetailId().equals(sellDetailServer.getSellDetailId())).collect(Collectors.toList()); + sellDetail.setDetailServerList(detailServerList); + }); + sellVo.setSellDetailList(selldetails); + + List sellpays = sellpayList.stream() + .filter(sellpay -> sellVo.getSellId().equals(sellpay.getSellId())) + .collect(Collectors.toList()); + sellVo.setSellPayList(sellpays); + }); + } + + @Override + public Integer selectSellCount(String shopId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Sell::getShopId, shopId); + return baseMapper.selectCount(queryWrapper); + } +} diff --git a/src/main/java/com/dd/admin/business/sellDetail/controller/SellDetailController.java b/src/main/java/com/dd/admin/business/sellDetail/controller/SellDetailController.java new file mode 100644 index 0000000..ce9832b --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellDetail/controller/SellDetailController.java @@ -0,0 +1,88 @@ +package com.dd.admin.business.sellDetail.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.business.sellDetail.entity.SellDetail; +import com.dd.admin.business.sellDetail.domain.SellDetailVo; +import com.dd.admin.business.sellDetail.domain.SellDetailDto; +import com.dd.admin.business.sellDetail.service.SellDetailService; + +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 订单详情 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Api(tags = "订单详情") +@RestController +public class SellDetailController { + + @Autowired + SellDetailService sellDetailService; + + @ApiOperation(value = "订单详情-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/sellDetail/page") + public ResultBean> page(SellDetailDto sellDetailDto) { + IPage pageInfo = sellDetailService.selectSellDetailPage(sellDetailDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "订单详情-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/sellDetail/list") + public ResultBean> list(SellDetailDto sellDetailDto) { + List list = sellDetailService.selectSellDetailList(sellDetailDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "订单详情-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/sellDetail/add") + public ResultBean add(@RequestBody @Validated SellDetailDto sellDetailDto) { + SellDetail sellDetail = BeanUtil.copyProperties(sellDetailDto, SellDetail.class); + sellDetailService.save(sellDetail); + return ResultBean.success(sellDetail); + } + + @ApiOperation(value = "订单详情-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/sellDetail/{sellDetailId}") + public ResultBean get(@PathVariable @NotBlank String sellDetailId) { + SellDetail sellDetail = sellDetailService.getById(sellDetailId); + SellDetailVo sellDetailVo = BeanUtil.copyProperties(sellDetail,SellDetailVo.class); + return ResultBean.success(sellDetailVo); + } + + @ApiOperation(value = "订单详情-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/sellDetail/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) SellDetailDto sellDetailDto) { + SellDetail sellDetail = BeanUtil.copyProperties(sellDetailDto, SellDetail.class); + sellDetailService.updateById(sellDetail); + return ResultBean.success(sellDetail); + } + + @ApiOperation(value = "订单详情-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/sellDetail/delete/{sellDetailId}") + public ResultBean delete(@PathVariable @NotBlank String sellDetailId) { + Boolean b = sellDetailService.removeById(sellDetailId); + return ResultBean.success(b); + } +} diff --git a/src/main/java/com/dd/admin/business/sellDetail/domain/SellDetailDto.java b/src/main/java/com/dd/admin/business/sellDetail/domain/SellDetailDto.java new file mode 100644 index 0000000..6b883fc --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellDetail/domain/SellDetailDto.java @@ -0,0 +1,107 @@ +package com.dd.admin.business.sellDetail.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 订单详情返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Data +@ApiModel(value="订单详情接收对象") +public class SellDetailDto { + + + @ApiModelProperty(value = "销售细单id") + @NotBlank(message = "订单详情id不能为空",groups = UpdateGroup.class) + private String sellDetailId; + + @ApiModelProperty(value = "会员id") + private String memberId; + + @ApiModelProperty(value = "订单id") + private String sellId; + + @ApiModelProperty(value = "1开卡 2续卡 3项目 4商品") + private Integer sellType; + + @ApiModelProperty(value = "商品类型") + private Integer productType; + + @ApiModelProperty(value = "会员卡id") + private String memberCardId; + + @ApiModelProperty(value = "商品ID") + private String productId; + + @ApiModelProperty(value = "商品名") + private String productName; + + @ApiModelProperty(value = "商品数量") + private Long count; + + @ApiModelProperty(value = "折扣") + private BigDecimal discount; + + @ApiModelProperty(value = "金额") + private BigDecimal amount; + + @ApiModelProperty(value = "实际金额") + private BigDecimal realAmount; + + @ApiModelProperty(value = "卡项ID") + private String cardId; + + @ApiModelProperty(value = "卡名") + private String cardName; + + @ApiModelProperty(value = "赠送金额") + private BigDecimal giveAmount; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "0正常 1取消") + private Integer sellStatus; + + +} diff --git a/src/main/java/com/dd/admin/business/sellDetail/domain/SellDetailVo.java b/src/main/java/com/dd/admin/business/sellDetail/domain/SellDetailVo.java new file mode 100644 index 0000000..8731233 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellDetail/domain/SellDetailVo.java @@ -0,0 +1,105 @@ +package com.dd.admin.business.sellDetail.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 订单详情返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Data +@ApiModel(value="订单详情返回对象") +public class SellDetailVo { + + + @ApiModelProperty(value = "销售细单id") + private String sellDetailId; + + @ApiModelProperty(value = "会员id") + private String memberId; + + @ApiModelProperty(value = "订单id") + private String sellId; + + @ApiModelProperty(value = "1开卡 2续卡 3项目 4商品") + private Integer sellType; + + @ApiModelProperty(value = "商品类型") + private Integer productType; + + @ApiModelProperty(value = "会员卡id") + private String memberCardId; + + @ApiModelProperty(value = "商品ID") + private String productId; + + @ApiModelProperty(value = "商品名") + private String productName; + + @ApiModelProperty(value = "商品数量") + private Long count; + + @ApiModelProperty(value = "折扣") + private BigDecimal discount; + + @ApiModelProperty(value = "金额") + private BigDecimal amount; + + @ApiModelProperty(value = "实际金额") + private BigDecimal realAmount; + + @ApiModelProperty(value = "卡项ID") + private String cardId; + + @ApiModelProperty(value = "卡名") + private String cardName; + + @ApiModelProperty(value = "赠送金额") + private BigDecimal giveAmount; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "0正常 1取消") + private Integer sellStatus; + + @ApiModelProperty(value = "百份比值") + private String percentage; + +} diff --git a/src/main/java/com/dd/admin/business/sellDetail/entity/SellDetail.java b/src/main/java/com/dd/admin/business/sellDetail/entity/SellDetail.java new file mode 100644 index 0000000..dd3cc6c --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellDetail/entity/SellDetail.java @@ -0,0 +1,141 @@ +package com.dd.admin.business.sellDetail.entity; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; + +import java.util.ArrayList; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import java.util.List; + +import com.dd.admin.business.detailServer.entity.SellDetailServer; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 订单详情 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_sell_detail") +@ApiModel(value="SellDetail对象", description="订单详情") +public class SellDetail implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "销售细单id") + @TableId(value = "SELL_DETAIL_ID", type = IdType.ASSIGN_UUID) + private String sellDetailId; + + @ApiModelProperty(value = "会员id") + @TableField("MEMBER_ID") + private String memberId; + + @ApiModelProperty(value = "订单id") + @TableField("SELL_ID") + private String sellId; + + @ApiModelProperty(value = "1开卡 2续卡 3项目 4商品") + @TableField("SELL_TYPE") + private Integer sellType; + + @ApiModelProperty(value = "商品类型") + @TableField("PRODUCT_TYPE") + private Integer productType; + + @ApiModelProperty(value = "会员卡id") + @TableField("MEMBER_CARD_ID") + private String memberCardId; + + @ApiModelProperty(value = "商品ID") + @TableField("PRODUCT_ID") + private String productId; + + @ApiModelProperty(value = "商品名") + @TableField("PRODUCT_NAME") + private String productName; + + @ApiModelProperty(value = "商品数量") + @TableField("COUNT") + private Long count; + + @ApiModelProperty(value = "折扣") + @TableField("DISCOUNT") + private BigDecimal discount; + + @ApiModelProperty(value = "金额") + @TableField("AMOUNT") + private BigDecimal amount; + + @ApiModelProperty(value = "实际金额") + @TableField("REAL_AMOUNT") + private BigDecimal realAmount; + + @ApiModelProperty(value = "商品实际金额") + @TableField("TOTAL_REAL_AMOUNT") + private BigDecimal totalRealAmount; + + @ApiModelProperty(value = "卡项ID") + @TableField("CARD_ID") + private String cardId; + + @ApiModelProperty(value = "卡名") + @TableField("CARD_NAME") + private String cardName; + + @ApiModelProperty(value = "赠送金额") + @TableField("GIVE_AMOUNT") + private BigDecimal giveAmount; + + @ApiModelProperty(value = "门店id") + @TableField(value = "SHOP_ID", fill = FieldFill.INSERT) + private String shopId; + + @ApiModelProperty(value = "门店名") + @TableField(value = "SHOP_NAME", fill = FieldFill.INSERT) + private String shopName; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "修改人") + @TableField(value = "UPDATE_NAME", fill = FieldFill.UPDATE) + private String updateName; + + @ApiModelProperty(value = "修改人id") + @TableField(value = "UPDATE_ID", fill = FieldFill.UPDATE) + private String updateId; + + @ApiModelProperty(value = "0正常 1取消") + @TableField("SELL_STATUS") + private Integer sellStatus; + + @TableField(exist = false) + List detailServerList = new ArrayList<>(); + +} diff --git a/src/main/java/com/dd/admin/business/sellDetail/mapper/SellDetailMapper.java b/src/main/java/com/dd/admin/business/sellDetail/mapper/SellDetailMapper.java new file mode 100644 index 0000000..d174385 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellDetail/mapper/SellDetailMapper.java @@ -0,0 +1,32 @@ +package com.dd.admin.business.sellDetail.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.sellDetail.entity.SellDetail; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.business.sellDetail.domain.SellDetailVo; +import com.dd.admin.business.sellDetail.domain.SellDetailDto; + +import java.util.List; + +/** + *

+ * 订单详情 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Mapper +public interface SellDetailMapper extends BaseMapper { + + IPage selectSellDetailPage(Page page, @Param("sellDetailDto") SellDetailDto sellDetailDto); + + List selectSellDetailList(@Param("sellDetailDto") SellDetailDto sellDetailDto); + + Integer updateSellDetailStatus(@Param("SellId")String SellId); + + List productProportion(@Param("shopId") String shopId, @Param("limit") Integer limit); +} diff --git a/src/main/java/com/dd/admin/business/sellDetail/mapper/xml/SellDetailMapper.xml b/src/main/java/com/dd/admin/business/sellDetail/mapper/xml/SellDetailMapper.xml new file mode 100644 index 0000000..de3e79b --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellDetail/mapper/xml/SellDetailMapper.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SELL_DETAIL_ID, MEMBER_ID, SELL_ID, SELL_TYPE, MEMBER_CARD_ID, PRODUCT_ID, PRODUCT_NAME, COUNT, DISCOUNT, AMOUNT, REAL_AMOUNT, CARD_ID, CARD_NAME, GIVE_AMOUNT, SHOP_ID, SHOP_NAME, CREATE_NAME, CREATE_TIME, CREATE_ID, UPDATE_TIME, UPDATE_NAME, UPDATE_ID, SELL_STATUS + + + update business_sell_detail set sell_status = 1 where sell_id = #{sellId} + + + + + + + diff --git a/src/main/java/com/dd/admin/business/sellDetail/service/SellDetailService.java b/src/main/java/com/dd/admin/business/sellDetail/service/SellDetailService.java new file mode 100644 index 0000000..40506fb --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellDetail/service/SellDetailService.java @@ -0,0 +1,38 @@ +package com.dd.admin.business.sellDetail.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.business.sellDetail.entity.SellDetail; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.business.sellDetail.domain.SellDetailVo; +import com.dd.admin.business.sellDetail.domain.SellDetailDto; +import java.util.List; + +/** + *

+ * 订单详情 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +public interface SellDetailService extends IService { + + //订单详情-分页列表 + IPage selectSellDetailPage(SellDetailDto sellDetailDto); + + //订单详情-列表 + List selectSellDetailList(SellDetailDto sellDetailDto); + + //订单详情-列表 + List selectSellDetailList(List sellIds); + + //订单详情-列表 + List selectSellDetailList(String sellId); + + + void updateSellDetailStatus(String sellId); + + List productProportion(String shopId, Integer limit); + +} diff --git a/src/main/java/com/dd/admin/business/sellDetail/service/impl/SellDetailServiceImpl.java b/src/main/java/com/dd/admin/business/sellDetail/service/impl/SellDetailServiceImpl.java new file mode 100644 index 0000000..216260a --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellDetail/service/impl/SellDetailServiceImpl.java @@ -0,0 +1,70 @@ +package com.dd.admin.business.sellDetail.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.consts.MemberShopConst; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.business.sellDetail.entity.SellDetail; +import com.dd.admin.business.sellDetail.mapper.SellDetailMapper; +import com.dd.admin.business.sellDetail.service.SellDetailService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.dd.admin.business.sellDetail.domain.SellDetailVo; +import com.dd.admin.business.sellDetail.domain.SellDetailDto; +import java.util.List; + +/** + *

+ * 订单详情 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Service +public class SellDetailServiceImpl extends ServiceImpl implements SellDetailService { + + @Override + public IPage selectSellDetailPage(SellDetailDto sellDetailDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectSellDetailPage(page,sellDetailDto); + } + + @Override + public List selectSellDetailList(SellDetailDto sellDetailDto) { + return baseMapper.selectSellDetailList(sellDetailDto); + } + + @Override + public List selectSellDetailList(List sellIds) { + LambdaQueryWrapper selldetailQueryWrapper = new LambdaQueryWrapper<>(); + if(CollectionUtil.isNotEmpty(sellIds)){ + selldetailQueryWrapper.in(SellDetail::getSellId, sellIds); + } + List sellDetailList = this.list(selldetailQueryWrapper); + return sellDetailList; + } + + @Override + public List selectSellDetailList(String sellId) { + LambdaQueryWrapper selldetailQueryWrapper = new LambdaQueryWrapper<>(); + selldetailQueryWrapper.eq(SellDetail::getSellId, sellId); + List sellDetailList = this.list(selldetailQueryWrapper); + return sellDetailList; + } + + @Override + public void updateSellDetailStatus(String sellId) { + baseMapper.updateSellDetailStatus(sellId); + } + + @Override + public List productProportion(String shopId, Integer limit) { + return baseMapper.productProportion(shopId,limit); + } + + + +} diff --git a/src/main/java/com/dd/admin/business/sellJson/controller/SelljsonController.java b/src/main/java/com/dd/admin/business/sellJson/controller/SelljsonController.java new file mode 100644 index 0000000..113e6bc --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellJson/controller/SelljsonController.java @@ -0,0 +1,101 @@ +package com.dd.admin.business.sellJson.controller; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.json.JSONUtil; +import com.dd.admin.common.security.SecurityUtil; +import com.dd.admin.common.utils.StringUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.business.sellJson.entity.Selljson; +import com.dd.admin.business.sellJson.domain.SelljsonVo; +import com.dd.admin.business.sellJson.domain.SelljsonDto; +import com.dd.admin.business.sellJson.service.SelljsonService; + +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 订单json 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Api(tags = "订单json") +@RestController +public class SelljsonController { + + @Autowired + SelljsonService sellJsonService; + + @ApiOperation(value = "订单json-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/sellJson/page") + public ResultBean> page(SelljsonDto sellJsonDto) { + sellJsonDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + IPage pageInfo = sellJsonService.selectSelljsonPage(sellJsonDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "订单json-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/sellJson/list") + public ResultBean> list(SelljsonDto sellJsonDto) { + sellJsonDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + List list = sellJsonService.selectSelljsonList(sellJsonDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "订单json-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/sellJson/add") + public ResultBean add(@RequestBody @Validated SelljsonDto sellJsonDto) { + Selljson sellJson = BeanUtil.copyProperties(sellJsonDto, Selljson.class); + if(StringUtil.isNotEmpty(sellJson.getJsonId())){ + Boolean b = sellJsonService.updateById(sellJson); + if(!b){ + //证明该订单已经删除 或者计算 重新添加挂单即可 + sellJsonService.save(sellJson); + } + }else{ + sellJsonService.save(sellJson); + } + return ResultBean.success(sellJson); + } + + @ApiOperation(value = "订单json-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/sellJson/{sellJsonId}") + public ResultBean get(@PathVariable @NotBlank String sellJsonId) { + Selljson sellJson = sellJsonService.getById(sellJsonId); + SelljsonVo sellJsonVo = BeanUtil.copyProperties(sellJson,SelljsonVo.class); + return ResultBean.success(sellJsonVo); + } + + @ApiOperation(value = "订单json-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/sellJson/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) SelljsonDto sellJsonDto) { + Selljson sellJson = BeanUtil.copyProperties(sellJsonDto, Selljson.class); + sellJsonService.updateById(sellJson); + return ResultBean.success(sellJson); + } + + @ApiOperation(value = "订单json-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/sellJson/delete/{sellJsonId}") + public ResultBean delete(@PathVariable @NotBlank String sellJsonId) { + Boolean b = sellJsonService.removeById(sellJsonId); + return ResultBean.success(b); + } +} diff --git a/src/main/java/com/dd/admin/business/sellJson/domain/SelljsonDto.java b/src/main/java/com/dd/admin/business/sellJson/domain/SelljsonDto.java new file mode 100644 index 0000000..665efe1 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellJson/domain/SelljsonDto.java @@ -0,0 +1,70 @@ +package com.dd.admin.business.sellJson.domain; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 订单json返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Data +@ApiModel(value="订单json接收对象") +public class SelljsonDto { + + + @NotBlank(message = "订单jsonid不能为空",groups = UpdateGroup.class) + private String jsonId; + + @ApiModelProperty(value = "订单id") + private String sellId; + + @ApiModelProperty(value = "获得下订单时的JSON") + private String sellJson; + + @ApiModelProperty(value = "门店id") + @TableField(value = "SHOP_ID", fill = FieldFill.INSERT) + private String shopId; + + @ApiModelProperty(value = "门店名") + @TableField(value = "SHOP_NAME", fill = FieldFill.INSERT) + private String shopName; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "0挂单 1结算完成") + @TableField("PENDING_STATUS") + private Integer pendingStatus; + + @ApiModelProperty(value = "会员姓名") + @TableField("MEMBER_NAME") + private String memberName; + + @ApiModelProperty(value = "手机号") + @TableField("MEMBER_PHONE") + private String memberPhone; + +} diff --git a/src/main/java/com/dd/admin/business/sellJson/domain/SelljsonVo.java b/src/main/java/com/dd/admin/business/sellJson/domain/SelljsonVo.java new file mode 100644 index 0000000..e4dfd63 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellJson/domain/SelljsonVo.java @@ -0,0 +1,66 @@ +package com.dd.admin.business.sellJson.domain; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 订单json返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Data +@ApiModel(value="订单json返回对象") +public class SelljsonVo { + + + private String jsonId; + + @ApiModelProperty(value = "订单id") + private String sellId; + + @ApiModelProperty(value = "获得下订单时的JSON") + private String sellJson; + + + @ApiModelProperty(value = "门店id") + @TableField(value = "SHOP_ID", fill = FieldFill.INSERT) + private String shopId; + + @ApiModelProperty(value = "门店名") + @TableField(value = "SHOP_NAME", fill = FieldFill.INSERT) + private String shopName; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "0挂单 1结算完成") + @TableField("PENDING_STATUS") + private Integer pendingStatus; + + @ApiModelProperty(value = "会员姓名") + @TableField("MEMBER_NAME") + private String memberName; + + @ApiModelProperty(value = "手机号") + @TableField("MEMBER_PHONE") + private String memberPhone; +} diff --git a/src/main/java/com/dd/admin/business/sellJson/entity/Selljson.java b/src/main/java/com/dd/admin/business/sellJson/entity/Selljson.java new file mode 100644 index 0000000..a5be161 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellJson/entity/Selljson.java @@ -0,0 +1,73 @@ +package com.dd.admin.business.sellJson.entity; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 订单json + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_selljson") +@ApiModel(value="Selljson对象", description="订单json") +@Accessors(chain = true) +public class Selljson implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "JSON_ID", type = IdType.ASSIGN_UUID) + private String jsonId; + + @ApiModelProperty(value = "订单id") + @TableField("SELL_ID") + private String sellId; + + @ApiModelProperty(value = "获得下订单时的JSON") + @TableField("SELL_JSON") + private String sellJson; + + @ApiModelProperty(value = "门店id") + @TableField(value = "SHOP_ID", fill = FieldFill.INSERT) + private String shopId; + + @ApiModelProperty(value = "门店名") + @TableField(value = "SHOP_NAME", fill = FieldFill.INSERT) + private String shopName; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "0挂单 1结算完成") + @TableField("PENDING_STATUS") + private Integer pendingStatus; + + @ApiModelProperty(value = "会员姓名") + @TableField("MEMBER_NAME") + private String memberName; + + @ApiModelProperty(value = "手机号") + @TableField("MEMBER_PHONE") + private String memberPhone; +} diff --git a/src/main/java/com/dd/admin/business/sellJson/mapper/SelljsonMapper.java b/src/main/java/com/dd/admin/business/sellJson/mapper/SelljsonMapper.java new file mode 100644 index 0000000..bf1a3a1 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellJson/mapper/SelljsonMapper.java @@ -0,0 +1,28 @@ +package com.dd.admin.business.sellJson.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.sellJson.entity.Selljson; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.business.sellJson.domain.SelljsonVo; +import com.dd.admin.business.sellJson.domain.SelljsonDto; + +import java.util.List; + +/** + *

+ * 订单json Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Mapper +public interface SelljsonMapper extends BaseMapper { + + IPage selectSelljsonPage(Page page, @Param("sellJsonDto") SelljsonDto sellJsonDto); + + List selectSelljsonList(@Param("sellJsonDto") SelljsonDto sellJsonDto); +} diff --git a/src/main/java/com/dd/admin/business/sellJson/mapper/xml/SelljsonMapper.xml b/src/main/java/com/dd/admin/business/sellJson/mapper/xml/SelljsonMapper.xml new file mode 100644 index 0000000..9e003db --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellJson/mapper/xml/SelljsonMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + JSON_ID, SELL_ID, SELL_JSON + + + + + + diff --git a/src/main/java/com/dd/admin/business/sellJson/service/SelljsonService.java b/src/main/java/com/dd/admin/business/sellJson/service/SelljsonService.java new file mode 100644 index 0000000..0aed7b7 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellJson/service/SelljsonService.java @@ -0,0 +1,28 @@ +package com.dd.admin.business.sellJson.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.business.sellJson.entity.Selljson; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.business.sellJson.domain.SelljsonVo; +import com.dd.admin.business.sellJson.domain.SelljsonDto; +import java.util.List; + +/** + *

+ * 订单json 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +public interface SelljsonService extends IService { + + //订单json-分页列表 + IPage selectSelljsonPage(SelljsonDto sellJsonDto); + + //订单json-列表 + List selectSelljsonList(SelljsonDto sellJsonDto); + + void completePendingSell(String jsonId); + +} diff --git a/src/main/java/com/dd/admin/business/sellJson/service/impl/SelljsonServiceImpl.java b/src/main/java/com/dd/admin/business/sellJson/service/impl/SelljsonServiceImpl.java new file mode 100644 index 0000000..631bf90 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellJson/service/impl/SelljsonServiceImpl.java @@ -0,0 +1,46 @@ +package com.dd.admin.business.sellJson.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.business.sellJson.entity.Selljson; +import com.dd.admin.business.sellJson.mapper.SelljsonMapper; +import com.dd.admin.business.sellJson.service.SelljsonService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.dd.admin.business.sellJson.domain.SelljsonVo; +import com.dd.admin.business.sellJson.domain.SelljsonDto; +import java.util.List; + +import static com.dd.admin.business.pay.enmus.PayConst.PENDING_SELL_COMPLETE; + +/** + *

+ * 订单json 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Service +public class SelljsonServiceImpl extends ServiceImpl implements SelljsonService { + + @Override + public IPage selectSelljsonPage(SelljsonDto sellJsonDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectSelljsonPage(page,sellJsonDto); + } + + @Override + public List selectSelljsonList(SelljsonDto sellJsonDto) { + return baseMapper.selectSelljsonList(sellJsonDto); + } + + @Override + public void completePendingSell(String jsonId) { + Selljson selljson = new Selljson(); + selljson.setJsonId(jsonId); + selljson.setPendingStatus(PENDING_SELL_COMPLETE); + this.updateById(selljson); + } +} diff --git a/src/main/java/com/dd/admin/business/sellPay/controller/SellpayController.java b/src/main/java/com/dd/admin/business/sellPay/controller/SellpayController.java new file mode 100644 index 0000000..d7b3a0d --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellPay/controller/SellpayController.java @@ -0,0 +1,88 @@ +package com.dd.admin.business.sellPay.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.business.sellPay.entity.Sellpay; +import com.dd.admin.business.sellPay.domain.SellpayVo; +import com.dd.admin.business.sellPay.domain.SellpayDto; +import com.dd.admin.business.sellPay.service.SellpayService; + +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 订单支付 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Api(tags = "订单支付") +@RestController +public class SellpayController { + + @Autowired + SellpayService sellPayService; + + @ApiOperation(value = "订单支付-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/sellPay/page") + public ResultBean> page(SellpayDto sellPayDto) { + IPage pageInfo = sellPayService.selectSellpayPage(sellPayDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "订单支付-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/sellPay/list") + public ResultBean> list(SellpayDto sellPayDto) { + List list = sellPayService.selectSellpayList(sellPayDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "订单支付-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/sellPay/add") + public ResultBean add(@RequestBody @Validated SellpayDto sellPayDto) { + Sellpay sellPay = BeanUtil.copyProperties(sellPayDto, Sellpay.class); + sellPayService.save(sellPay); + return ResultBean.success(sellPay); + } + + @ApiOperation(value = "订单支付-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/sellPay/{sellPayId}") + public ResultBean get(@PathVariable @NotBlank String sellPayId) { + Sellpay sellPay = sellPayService.getById(sellPayId); + SellpayVo sellPayVo = BeanUtil.copyProperties(sellPay,SellpayVo.class); + return ResultBean.success(sellPayVo); + } + + @ApiOperation(value = "订单支付-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/sellPay/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) SellpayDto sellPayDto) { + Sellpay sellPay = BeanUtil.copyProperties(sellPayDto, Sellpay.class); + sellPayService.updateById(sellPay); + return ResultBean.success(sellPay); + } + + @ApiOperation(value = "订单支付-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/sellPay/delete/{sellPayId}") + public ResultBean delete(@PathVariable @NotBlank String sellPayId) { + Boolean b = sellPayService.removeById(sellPayId); + return ResultBean.success(b); + } +} diff --git a/src/main/java/com/dd/admin/business/sellPay/domain/SellpayDto.java b/src/main/java/com/dd/admin/business/sellPay/domain/SellpayDto.java new file mode 100644 index 0000000..52c7c05 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellPay/domain/SellpayDto.java @@ -0,0 +1,50 @@ +package com.dd.admin.business.sellPay.domain; + +import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 订单支付返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Data +@ApiModel(value="订单支付接收对象") +public class SellpayDto { + + + @ApiModelProperty(value = "支付id") + @NotBlank(message = "订单支付id不能为空",groups = UpdateGroup.class) + private String sellPayId; + + @ApiModelProperty(value = "销售单id") + private String sellId; + + @ApiModelProperty(value = "支付方式名称") + private String payName; + + @ApiModelProperty(value = "1.卡金 2.扫码 3.现金 888.优惠 ") + private Integer payType; + + @ApiModelProperty(value = "金额") + private BigDecimal amount; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; +} diff --git a/src/main/java/com/dd/admin/business/sellPay/domain/SellpayVo.java b/src/main/java/com/dd/admin/business/sellPay/domain/SellpayVo.java new file mode 100644 index 0000000..2dd0911 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellPay/domain/SellpayVo.java @@ -0,0 +1,46 @@ +package com.dd.admin.business.sellPay.domain; + +import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 订单支付返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Data +@ApiModel(value="订单支付返回对象") +public class SellpayVo { + + + @ApiModelProperty(value = "支付id") + private String sellPayId; + + @ApiModelProperty(value = "销售单id") + private String sellId; + + @ApiModelProperty(value = "支付方式名称") + private String payName; + + @ApiModelProperty(value = "1.卡金 2.扫码 3.现金 888.优惠 ") + private Integer payType; + + @ApiModelProperty(value = "金额") + private BigDecimal amount; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; +} diff --git a/src/main/java/com/dd/admin/business/sellPay/entity/Sellpay.java b/src/main/java/com/dd/admin/business/sellPay/entity/Sellpay.java new file mode 100644 index 0000000..d69ca1b --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellPay/entity/Sellpay.java @@ -0,0 +1,54 @@ +package com.dd.admin.business.sellPay.entity; + +import java.math.BigDecimal; + +import com.baomidou.mybatisplus.annotation.*; + +import java.io.Serializable; +import java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 订单支付 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_sellpay") +@ApiModel(value="Sellpay对象", description="订单支付") +public class Sellpay implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "支付id") + @TableId(value = "SELL_PAY_ID", type = IdType.ASSIGN_UUID) + private String sellPayId; + + @ApiModelProperty(value = "销售单id") + @TableField("SELL_ID") + private String sellId; + + @ApiModelProperty(value = "支付方式名称") + @TableField("PAY_NAME") + private String payName; + + @ApiModelProperty(value = "1.卡金 2.扫码 3.现金 888.优惠 ") + @TableField("PAY_TYPE") + private Integer payType; + + @ApiModelProperty(value = "金额") + @TableField("AMOUNT") + private BigDecimal amount; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; +} diff --git a/src/main/java/com/dd/admin/business/sellPay/mapper/SellpayMapper.java b/src/main/java/com/dd/admin/business/sellPay/mapper/SellpayMapper.java new file mode 100644 index 0000000..f52b0cf --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellPay/mapper/SellpayMapper.java @@ -0,0 +1,28 @@ +package com.dd.admin.business.sellPay.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.sellPay.entity.Sellpay; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.business.sellPay.domain.SellpayVo; +import com.dd.admin.business.sellPay.domain.SellpayDto; + +import java.util.List; + +/** + *

+ * 订单支付 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Mapper +public interface SellpayMapper extends BaseMapper { + + IPage selectSellpayPage(Page page, @Param("sellPayDto") SellpayDto sellPayDto); + + List selectSellpayList(@Param("sellPayDto") SellpayDto sellPayDto); +} diff --git a/src/main/java/com/dd/admin/business/sellPay/mapper/xml/SellpayMapper.xml b/src/main/java/com/dd/admin/business/sellPay/mapper/xml/SellpayMapper.xml new file mode 100644 index 0000000..23d3040 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellPay/mapper/xml/SellpayMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + SELL_PAY_ID, SELL_ID, PAY_NAME, PAY_TYPE, AMOUNT,CREATE_TIME + + + + + + diff --git a/src/main/java/com/dd/admin/business/sellPay/service/SellpayService.java b/src/main/java/com/dd/admin/business/sellPay/service/SellpayService.java new file mode 100644 index 0000000..8259cd7 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellPay/service/SellpayService.java @@ -0,0 +1,37 @@ +package com.dd.admin.business.sellPay.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.business.sell.entity.Sell; +import com.dd.admin.business.sellPay.entity.Sellpay; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.business.sellPay.domain.SellpayVo; +import com.dd.admin.business.sellPay.domain.SellpayDto; + +import java.math.BigDecimal; +import java.util.List; + +/** + *

+ * 订单支付 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +public interface SellpayService extends IService { + + //订单支付-分页列表 + IPage selectSellpayPage(SellpayDto sellPayDto); + + //订单支付-列表 + List selectSellpayList(SellpayDto sellPayDto); + + void addSellPayList(List sellPayList,String sellId); + + BigDecimal getRealAmount(List sellPayList, BigDecimal totalAmount); + + List selectSellPayList(List sellIds); + + List selectSellPayList(String sellId); + +} diff --git a/src/main/java/com/dd/admin/business/sellPay/service/impl/SellpayServiceImpl.java b/src/main/java/com/dd/admin/business/sellPay/service/impl/SellpayServiceImpl.java new file mode 100644 index 0000000..aa566d1 --- /dev/null +++ b/src/main/java/com/dd/admin/business/sellPay/service/impl/SellpayServiceImpl.java @@ -0,0 +1,89 @@ +package com.dd.admin.business.sellPay.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.sell.entity.Sell; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.business.sellPay.entity.Sellpay; +import com.dd.admin.business.sellPay.mapper.SellpayMapper; +import com.dd.admin.business.sellPay.service.SellpayService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dd.admin.common.security.SecurityUtil; +import com.dd.admin.common.utils.BigDecimalUtil; +import org.springframework.stereotype.Service; +import com.dd.admin.business.sellPay.domain.SellpayVo; +import com.dd.admin.business.sellPay.domain.SellpayDto; + +import java.math.BigDecimal; +import java.util.List; +import java.util.stream.Collectors; + +import static com.dd.admin.business.pay.enmus.PayConst.PAY_TYPE_DISCOUNT; + +/** + *

+ * 订单支付 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-19 + */ +@Service +public class SellpayServiceImpl extends ServiceImpl implements SellpayService { + + @Override + public IPage selectSellpayPage(SellpayDto sellPayDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectSellpayPage(page,sellPayDto); + } + + @Override + public List selectSellpayList(SellpayDto sellPayDto) { + return baseMapper.selectSellpayList(sellPayDto); + } + + @Override + public void addSellPayList(List sellPayList, String sellId) { + // 使用stream的filter操作进行过滤,只保留amount大于0的元素 + List filteredList = sellPayList.stream() + .filter(sellpay -> sellpay.getAmount().compareTo(BigDecimal.ZERO) > 0) + .collect(Collectors.toList()); + + // 对过滤后的列表进行操作,设置sellId + filteredList.stream().forEach(sellpay -> sellpay.setSellId(sellId)); + + saveBatch(filteredList); + } + + @Override + public BigDecimal getRealAmount(List sellPayList, BigDecimal totalAmount) { + BigDecimal discountAmount = sellPayList.stream() + .filter(sellpay -> sellpay.getPayType().equals(PAY_TYPE_DISCOUNT)) + .findFirst() + .map(Sellpay::getAmount) + .orElse(BigDecimal.ZERO); + return BigDecimalUtil.sub(totalAmount,discountAmount); + } + + @Override + public List selectSellPayList(List sellIds) { + // 使用 MyBatis Plus 的条件构造器查询 SellpayVo 列表 + LambdaQueryWrapper sellpayQueryWrapper = new LambdaQueryWrapper<>(); + if(CollectionUtil.isNotEmpty(sellIds)){ + sellpayQueryWrapper.in(Sellpay::getSellId, sellIds); + } + sellpayQueryWrapper.orderByAsc(Sellpay::getPayType); + List sellpayList = list(sellpayQueryWrapper); + return sellpayList; + } + + @Override + public List selectSellPayList(String sellId) { + LambdaQueryWrapper sellpayQueryWrapper = new LambdaQueryWrapper<>(); + sellpayQueryWrapper.eq(Sellpay::getSellId, sellId); + List sellpayList = list(sellpayQueryWrapper); + return sellpayList; + } +} diff --git a/src/main/java/com/dd/admin/business/server/controller/ServerController.java b/src/main/java/com/dd/admin/business/server/controller/ServerController.java new file mode 100644 index 0000000..33cd544 --- /dev/null +++ b/src/main/java/com/dd/admin/business/server/controller/ServerController.java @@ -0,0 +1,90 @@ +package com.dd.admin.business.server.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.dd.admin.common.security.SecurityUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.business.server.entity.Server; +import com.dd.admin.business.server.domain.ServerVo; +import com.dd.admin.business.server.domain.ServerDto; +import com.dd.admin.business.server.service.ServerService; + +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 服务人员表 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2024-11-28 + */ +@Api(tags = "服务人员表") +@RestController +public class ServerController { + + @Autowired + ServerService serverService; + + @ApiOperation(value = "服务人员表-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/server/page") + public ResultBean> page(ServerDto serverDto) { + serverDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + IPage pageInfo = serverService.selectServerPage(serverDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "服务人员表-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/server/list") + public ResultBean> list(ServerDto serverDto) { + List list = serverService.selectServerList(serverDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "服务人员表-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/server/add") + public ResultBean add(@RequestBody @Validated ServerDto serverDto) { + Server server = BeanUtil.copyProperties(serverDto, Server.class); + serverService.save(server); + return ResultBean.success(server); + } + + @ApiOperation(value = "服务人员表-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/server/{serverId}") + public ResultBean get(@PathVariable @NotBlank String serverId) { + Server server = serverService.getById(serverId); + ServerVo serverVo = BeanUtil.copyProperties(server,ServerVo.class); + return ResultBean.success(serverVo); + } + + @ApiOperation(value = "服务人员表-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/server/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) ServerDto serverDto) { + Server server = BeanUtil.copyProperties(serverDto, Server.class); + serverService.updateById(server); + return ResultBean.success(server); + } + + @ApiOperation(value = "服务人员表-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/server/delete/{serverId}") + public ResultBean delete(@PathVariable @NotBlank String serverId) { + Boolean b = serverService.removeById(serverId); + return ResultBean.success(b); + } +} diff --git a/src/main/java/com/dd/admin/business/server/domain/ServerDto.java b/src/main/java/com/dd/admin/business/server/domain/ServerDto.java new file mode 100644 index 0000000..44f238e --- /dev/null +++ b/src/main/java/com/dd/admin/business/server/domain/ServerDto.java @@ -0,0 +1,80 @@ +package com.dd.admin.business.server.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 服务人员表返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-11-28 + */ +@Data +@ApiModel(value="服务人员表接收对象") +public class ServerDto { + + + @NotBlank(message = "服务人员表id不能为空",groups = UpdateGroup.class) + private String serverId; + + @ApiModelProperty(value = "工号") + private String serverNo; + + @ApiModelProperty(value = "服务人员名称") + private String serverName; + + @ApiModelProperty(value = "服务人员手机号") + private String serverPhone; + + @ApiModelProperty(value = "入职时间") + private Date joinTime; + + @ApiModelProperty(value = "小程序密码-") + private String miniappPassword; + + @ApiModelProperty(value = "0正常 1删除") + private Integer deleted; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "搜索关键字") + private String keyword; +} diff --git a/src/main/java/com/dd/admin/business/server/domain/ServerVo.java b/src/main/java/com/dd/admin/business/server/domain/ServerVo.java new file mode 100644 index 0000000..c605ea5 --- /dev/null +++ b/src/main/java/com/dd/admin/business/server/domain/ServerVo.java @@ -0,0 +1,75 @@ +package com.dd.admin.business.server.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 服务人员表返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-11-28 + */ +@Data +@ApiModel(value="服务人员表返回对象") +public class ServerVo { + + + private String serverId; + + @ApiModelProperty(value = "工号") + private String serverNo; + + @ApiModelProperty(value = "服务人员名称") + private String serverName; + + @ApiModelProperty(value = "服务人员手机号") + private String serverPhone; + + @ApiModelProperty(value = "入职时间") + private Date joinTime; + + @ApiModelProperty(value = "小程序密码-") + private String miniappPassword; + + @ApiModelProperty(value = "0正常 1删除") + private Integer deleted; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + +} diff --git a/src/main/java/com/dd/admin/business/server/entity/Server.java b/src/main/java/com/dd/admin/business/server/entity/Server.java new file mode 100644 index 0000000..0f1866a --- /dev/null +++ b/src/main/java/com/dd/admin/business/server/entity/Server.java @@ -0,0 +1,96 @@ +package com.dd.admin.business.server.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 服务人员表 + *

+ * + * @author 727869402@qq.com + * @since 2024-11-28 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_server") +@ApiModel(value="Server对象", description="服务人员表") +public class Server implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "SERVER_ID", type = IdType.ASSIGN_UUID) + private String serverId; + + @ApiModelProperty(value = "工号") + @TableField("SERVER_NO") + private String serverNo; + + @ApiModelProperty(value = "服务人员名称") + @TableField("SERVER_NAME") + private String serverName; + + @ApiModelProperty(value = "服务人员手机号") + @TableField("SERVER_PHONE") + private String serverPhone; + + @ApiModelProperty(value = "入职时间") + @TableField("JOIN_TIME") + private Date joinTime; + + @ApiModelProperty(value = "小程序密码-") + @TableField("MINIAPP_PASSWORD") + private String miniappPassword; + + @ApiModelProperty(value = "0正常 1删除") + @TableField("DELETED") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "门店id") + @TableField(value = "SHOP_ID", fill = FieldFill.INSERT) + private String shopId; + + @ApiModelProperty(value = "门店名") + @TableField("SHOP_NAME") + private String shopName; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "修改人") + @TableField(value = "UPDATE_NAME", fill = FieldFill.UPDATE) + private String updateName; + + @ApiModelProperty(value = "修改人id") + @TableField(value = "UPDATE_ID", fill = FieldFill.UPDATE) + private String updateId; + + + @ApiModelProperty(value = "搜索关键字") + private String keyword; +} diff --git a/src/main/java/com/dd/admin/business/server/mapper/ServerMapper.java b/src/main/java/com/dd/admin/business/server/mapper/ServerMapper.java new file mode 100644 index 0000000..ceb3aef --- /dev/null +++ b/src/main/java/com/dd/admin/business/server/mapper/ServerMapper.java @@ -0,0 +1,28 @@ +package com.dd.admin.business.server.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.server.entity.Server; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.business.server.domain.ServerVo; +import com.dd.admin.business.server.domain.ServerDto; + +import java.util.List; + +/** + *

+ * 服务人员表 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2024-11-28 + */ +@Mapper +public interface ServerMapper extends BaseMapper { + + IPage selectServerPage(Page page, @Param("serverDto") ServerDto serverDto); + + List selectServerList(@Param("serverDto") ServerDto serverDto); +} diff --git a/src/main/java/com/dd/admin/business/server/mapper/xml/ServerMapper.xml b/src/main/java/com/dd/admin/business/server/mapper/xml/ServerMapper.xml new file mode 100644 index 0000000..d327301 --- /dev/null +++ b/src/main/java/com/dd/admin/business/server/mapper/xml/ServerMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + SERVER_ID, SERVER_NO, SERVER_NAME, SERVER_PHONE, JOIN_TIME, MINIAPP_PASSWORD, DELETED, SHOP_ID, SHOP_NAME, CREATE_NAME, CREATE_TIME, CREATE_ID, UPDATE_TIME, UPDATE_NAME, UPDATE_ID + + + + + + diff --git a/src/main/java/com/dd/admin/business/server/service/ServerService.java b/src/main/java/com/dd/admin/business/server/service/ServerService.java new file mode 100644 index 0000000..62eb422 --- /dev/null +++ b/src/main/java/com/dd/admin/business/server/service/ServerService.java @@ -0,0 +1,26 @@ +package com.dd.admin.business.server.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.business.server.entity.Server; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.business.server.domain.ServerVo; +import com.dd.admin.business.server.domain.ServerDto; +import java.util.List; + +/** + *

+ * 服务人员表 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2024-11-28 + */ +public interface ServerService extends IService { + + //服务人员表-分页列表 + IPage selectServerPage(ServerDto serverDto); + + //服务人员表-列表 + List selectServerList(ServerDto serverDto); + +} diff --git a/src/main/java/com/dd/admin/business/server/service/impl/ServerServiceImpl.java b/src/main/java/com/dd/admin/business/server/service/impl/ServerServiceImpl.java new file mode 100644 index 0000000..838030d --- /dev/null +++ b/src/main/java/com/dd/admin/business/server/service/impl/ServerServiceImpl.java @@ -0,0 +1,36 @@ +package com.dd.admin.business.server.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.business.server.entity.Server; +import com.dd.admin.business.server.mapper.ServerMapper; +import com.dd.admin.business.server.service.ServerService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.dd.admin.business.server.domain.ServerVo; +import com.dd.admin.business.server.domain.ServerDto; +import java.util.List; + +/** + *

+ * 服务人员表 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2024-11-28 + */ +@Service +public class ServerServiceImpl extends ServiceImpl implements ServerService { + + @Override + public IPage selectServerPage(ServerDto serverDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectServerPage(page,serverDto); + } + + @Override + public List selectServerList(ServerDto serverDto) { + return baseMapper.selectServerList(serverDto); + } +} diff --git a/src/main/java/com/dd/admin/business/stats/StatsController.java b/src/main/java/com/dd/admin/business/stats/StatsController.java new file mode 100644 index 0000000..6539d16 --- /dev/null +++ b/src/main/java/com/dd/admin/business/stats/StatsController.java @@ -0,0 +1,59 @@ +package com.dd.admin.business.stats; + +import com.dd.admin.business.member.service.MemberService; +import com.dd.admin.business.memberCard.entity.MemberCard; +import com.dd.admin.business.memberCard.service.MemberCardService; +import com.dd.admin.business.product.entity.Product; +import com.dd.admin.business.product.service.ProductService; +import com.dd.admin.business.sell.service.SellService; +import com.dd.admin.business.sellDetail.domain.SellDetailVo; +import com.dd.admin.business.sellDetail.entity.SellDetail; +import com.dd.admin.business.sellDetail.service.SellDetailService; +import com.dd.admin.business.stats.domain.DashboardInfo; +import com.dd.admin.common.model.result.ResultBean; +import com.dd.admin.common.security.SecurityUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Api(tags = "统计相关") +@RestController +public class StatsController { + + @Autowired + SellDetailService sellDetailService; + @Autowired + ProductService productService; + @Autowired + MemberService memberService; + @Autowired + MemberCardService memberCardService; + @Autowired + SellService sellService; + + @ApiOperationSupport(order = 1) + @GetMapping("/admin/stats/getDashboardInfo") + public ResultBean getDashboardInfo() { + DashboardInfo dashboardInfo = new DashboardInfo(); + String deptId = SecurityUtil.getLoginUser().getDeptId(); + Integer memberCount = memberService.selectMemberCount(deptId); + dashboardInfo.setMemberCount(String.valueOf(memberCount)); + Integer memberCardCount = memberCardService.selectMemberCardCount(deptId); + dashboardInfo.setMemberCardCount(String.valueOf(memberCardCount)); + Integer productCount = productService.selectProductCount(deptId); + dashboardInfo.setProductCount(String.valueOf(productCount)); + Integer sellCount = sellService.selectSellCount(deptId); + dashboardInfo.setSellCount(String.valueOf(sellCount)); + List productProportion = sellDetailService.productProportion(SecurityUtil.getLoginUser().getDeptId(), 5); + dashboardInfo.setProductSellProportion(productProportion); + List productStockRank = productService.getProductStockRankByShopId(SecurityUtil.getLoginUser().getDeptId(), 5); + dashboardInfo.setProductStockRank(productStockRank); + return ResultBean.success(dashboardInfo); + } +} diff --git a/src/main/java/com/dd/admin/business/stats/domain/DashboardInfo.java b/src/main/java/com/dd/admin/business/stats/domain/DashboardInfo.java new file mode 100644 index 0000000..c5ee4b5 --- /dev/null +++ b/src/main/java/com/dd/admin/business/stats/domain/DashboardInfo.java @@ -0,0 +1,19 @@ +package com.dd.admin.business.stats.domain; + +import com.dd.admin.business.product.entity.Product; +import com.dd.admin.business.sellDetail.domain.SellDetailVo; +import com.dd.admin.business.sellDetail.entity.SellDetail; +import lombok.Data; + +import java.util.List; + +@Data +public class DashboardInfo { + private String memberCount; + private String memberCardCount; + private String productCount; + private String sellCount; + + List productStockRank; + List productSellProportion; +} diff --git a/src/main/java/com/dd/admin/business/stock/controller/StockController.java b/src/main/java/com/dd/admin/business/stock/controller/StockController.java new file mode 100644 index 0000000..0badc1c --- /dev/null +++ b/src/main/java/com/dd/admin/business/stock/controller/StockController.java @@ -0,0 +1,110 @@ +package com.dd.admin.business.stock.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.dd.admin.business.stockDetail.domain.StockDetailDto; +import com.dd.admin.business.stockDetail.domain.StockDetailVo; +import com.dd.admin.business.stockDetail.entity.StockDetail; +import com.dd.admin.business.stockDetail.service.StockDetailService; +import com.dd.admin.common.security.SecurityUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.business.stock.entity.Stock; +import com.dd.admin.business.stock.domain.StockVo; +import com.dd.admin.business.stock.domain.StockDto; +import com.dd.admin.business.stock.service.StockService; + +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 库存单 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-27 + */ +@Api(tags = "库存单") +@RestController +public class StockController { + + @Autowired + StockService stockService; + @Autowired + StockDetailService stockDetailService; + + @ApiOperation(value = "库存单-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/stock/page") + public ResultBean> page(StockDto stockDto) { + stockDto.setShopId(SecurityUtil.getLoginUser().getDeptId()); + IPage pageInfo = stockService.selectStockPage(stockDto); + List list = pageInfo.getRecords(); + list.stream().forEach(stockVo -> { + StockDetailDto stockDetailDto = new StockDetailDto(); + stockDetailDto.setStockId(stockVo.getStockId()); + List stockDetailVos = stockDetailService.selectStockDetailList(stockDetailDto); + stockVo.setStockDetailVos(stockDetailVos); + }); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "库存单-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/stock/list") + public ResultBean> list(StockDto stockDto) { + List list = stockService.selectStockList(stockDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "库存单-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/stock/add") + public ResultBean add(@RequestBody @Validated StockDto stockDto) { + stockService.addStockIn(stockDto); + return ResultBean.success(); + } + + @ApiOperation(value = "库存单-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/stock/addStockOut") + public ResultBean addStockOut(@RequestBody @Validated StockDto stockDto) { + stockService.addStockOut(stockDto); + return ResultBean.success(); + } + + @ApiOperation(value = "库存单-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/stock/{stockId}") + public ResultBean get(@PathVariable @NotBlank String stockId) { + Stock stock = stockService.getById(stockId); + StockVo stockVo = BeanUtil.copyProperties(stock,StockVo.class); + return ResultBean.success(stockVo); + } + + @ApiOperation(value = "库存单-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/stock/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) StockDto stockDto) { + Stock stock = BeanUtil.copyProperties(stockDto, Stock.class); + stockService.updateById(stock); + return ResultBean.success(stock); + } + + @ApiOperation(value = "库存单-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/stock/delete/{stockId}") + public ResultBean delete(@PathVariable @NotBlank String stockId) { + Boolean b = stockService.removeById(stockId); + return ResultBean.success(b); + } +} diff --git a/src/main/java/com/dd/admin/business/stock/domain/StockDto.java b/src/main/java/com/dd/admin/business/stock/domain/StockDto.java new file mode 100644 index 0000000..1dd1a5a --- /dev/null +++ b/src/main/java/com/dd/admin/business/stock/domain/StockDto.java @@ -0,0 +1,82 @@ +package com.dd.admin.business.stock.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import java.util.List; + +import com.dd.admin.business.product.entity.Product; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 库存单返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-27 + */ +@Data +@ApiModel(value="库存单接收对象") +public class StockDto { + + + @ApiModelProperty(value = "库存单id") + @NotBlank(message = "库存单id不能为空",groups = UpdateGroup.class) + private String stockId; + + @ApiModelProperty(value = "库存单表头") + private String stockTitle; + + @ApiModelProperty(value = "库存单编号") + private String stockNo; + + @ApiModelProperty(value = "0正常 1审核完毕 2取消") + private Integer stockStatus; + + @ApiModelProperty(value = "审核人ID") + private String checkId; + + @ApiModelProperty(value = "审核人姓名") + private String checkName; + + @ApiModelProperty(value = "审核时间") + private Date checkTime; + + @ApiModelProperty(value = "类型 1入库 2出库") + private Integer stockType; + + @ApiModelProperty(value = "金额") + private BigDecimal stockMoney; + + @ApiModelProperty(value = "入库类型") + private Integer stockInType; + + @ApiModelProperty(value = "出库类型") + private Integer stockOutType; + + @ApiModelProperty(value = "入库商品") + private List productList; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "搜索关键字") + private String keyword; +} diff --git a/src/main/java/com/dd/admin/business/stock/domain/StockVo.java b/src/main/java/com/dd/admin/business/stock/domain/StockVo.java new file mode 100644 index 0000000..644f3fc --- /dev/null +++ b/src/main/java/com/dd/admin/business/stock/domain/StockVo.java @@ -0,0 +1,102 @@ +package com.dd.admin.business.stock.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import java.util.List; + +import com.dd.admin.business.stockDetail.domain.StockDetailVo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 库存单返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-27 + */ +@Data +@ApiModel(value="库存单返回对象") +public class StockVo { + + + @ApiModelProperty(value = "库存单id") + private String stockId; + + @ApiModelProperty(value = "库存单表头") + private String stockTitle; + + @ApiModelProperty(value = "库存单编号") + private String stockNo; + + @ApiModelProperty(value = "0正常 1审核完毕 2取消") + private Integer stockStatus; + + @ApiModelProperty(value = "门店id") + private String shopId; + + @ApiModelProperty(value = "门店名") + private String shopName; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "审核人ID") + private String checkId; + + @ApiModelProperty(value = "审核人姓名") + private String checkName; + + @ApiModelProperty(value = "审核时间") + private Date checkTime; + + @ApiModelProperty(value = "类型 1入库 2出库") + private Integer stockType; + + @ApiModelProperty(value = "金额") + private BigDecimal stockMoney; + + @ApiModelProperty(value = "入库类型") + private Integer stockInType; + + @ApiModelProperty(value = "出库类型") + private Integer stockOutType; + + @ApiModelProperty(value = "乐观锁字段") + private Long version; + + @ApiModelProperty(value = "0正常 1删除") + private Integer deleted; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "库存单详情") + List stockDetailVos; +} diff --git a/src/main/java/com/dd/admin/business/stock/entity/Stock.java b/src/main/java/com/dd/admin/business/stock/entity/Stock.java new file mode 100644 index 0000000..f872400 --- /dev/null +++ b/src/main/java/com/dd/admin/business/stock/entity/Stock.java @@ -0,0 +1,122 @@ +package com.dd.admin.business.stock.entity; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 库存单 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-27 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_stock") +@ApiModel(value="Stock对象", description="库存单") +public class Stock implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "库存单id") + @TableId(value = "STOCK_ID", type = IdType.ASSIGN_UUID) + private String stockId; + + @ApiModelProperty(value = "库存单表头") + @TableField("STOCK_TITLE") + private String stockTitle; + + @ApiModelProperty(value = "库存单编号") + @TableField("STOCK_NO") + private String stockNo; + + @ApiModelProperty(value = "0正常 1审核完毕 2取消") + @TableField("STOCK_STATUS") + private Integer stockStatus; + + @ApiModelProperty(value = "门店id") + @TableField(value = "SHOP_ID", fill = FieldFill.INSERT) + private String shopId; + + @ApiModelProperty(value = "门店名") + @TableField(value = "SHOP_NAME", fill = FieldFill.INSERT) + private String shopName; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "修改人") + @TableField(value = "UPDATE_NAME", fill = FieldFill.UPDATE) + private String updateName; + + @ApiModelProperty(value = "修改人id") + @TableField(value = "UPDATE_ID", fill = FieldFill.UPDATE) + private String updateId; + + @ApiModelProperty(value = "审核人ID") + @TableField("CHECK_ID") + private String checkId; + + @ApiModelProperty(value = "审核人姓名") + @TableField("CHECK_NAME") + private String checkName; + + @ApiModelProperty(value = "审核时间") + @TableField("CHECK_TIME") + private Date checkTime; + + @ApiModelProperty(value = "类型 1入库 2出库") + @TableField("STOCK_TYPE") + private Integer stockType; + + @ApiModelProperty(value = "金额") + @TableField("STOCK_MONEY") + private BigDecimal stockMoney; + + @ApiModelProperty(value = "入库类型") + @TableField("STOCK_IN_TYPE") + private Integer stockInType; + + @ApiModelProperty(value = "出库类型") + @TableField("STOCK_OUT_TYPE") + private Integer stockOutType; + + @ApiModelProperty(value = "乐观锁字段") + @TableField("VERSION") + @Version + private Long version; + + @ApiModelProperty(value = "0正常 1删除") + @TableField("DELETED") + @TableLogic + private Integer deleted; + + @ApiModelProperty(value = "备注") + private String remark; +} diff --git a/src/main/java/com/dd/admin/business/stock/mapper/StockMapper.java b/src/main/java/com/dd/admin/business/stock/mapper/StockMapper.java new file mode 100644 index 0000000..bec19fc --- /dev/null +++ b/src/main/java/com/dd/admin/business/stock/mapper/StockMapper.java @@ -0,0 +1,28 @@ +package com.dd.admin.business.stock.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.stock.entity.Stock; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.business.stock.domain.StockVo; +import com.dd.admin.business.stock.domain.StockDto; + +import java.util.List; + +/** + *

+ * 库存单 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-27 + */ +@Mapper +public interface StockMapper extends BaseMapper { + + IPage selectStockPage(Page page, @Param("stockDto") StockDto stockDto); + + List selectStockList(@Param("stockDto") StockDto stockDto); +} diff --git a/src/main/java/com/dd/admin/business/stock/mapper/xml/StockMapper.xml b/src/main/java/com/dd/admin/business/stock/mapper/xml/StockMapper.xml new file mode 100644 index 0000000..4029a35 --- /dev/null +++ b/src/main/java/com/dd/admin/business/stock/mapper/xml/StockMapper.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + STOCK_ID, STOCK_TITLE, STOCK_NO, STOCK_STATUS, SHOP_ID, SHOP_NAME, CREATE_NAME, CREATE_TIME, CREATE_ID, UPDATE_TIME, UPDATE_NAME, UPDATE_ID, CHECK_ID, CHECK_NAME, CHECK_TIME, STOCK_TYPE, STOCK_MONEY, STOCK_IN_TYPE, STOCK_OUT_TYPE, VERSION, DELETED + + + + + + diff --git a/src/main/java/com/dd/admin/business/stock/service/StockService.java b/src/main/java/com/dd/admin/business/stock/service/StockService.java new file mode 100644 index 0000000..85f37d2 --- /dev/null +++ b/src/main/java/com/dd/admin/business/stock/service/StockService.java @@ -0,0 +1,29 @@ +package com.dd.admin.business.stock.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.business.stock.entity.Stock; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.business.stock.domain.StockVo; +import com.dd.admin.business.stock.domain.StockDto; +import java.util.List; + +/** + *

+ * 库存单 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-27 + */ +public interface StockService extends IService { + + //库存单-分页列表 + IPage selectStockPage(StockDto stockDto); + + //库存单-列表 + List selectStockList(StockDto stockDto); + + Stock addStockIn(StockDto stockDto); + + Stock addStockOut(StockDto stockDto); +} diff --git a/src/main/java/com/dd/admin/business/stock/service/impl/StockServiceImpl.java b/src/main/java/com/dd/admin/business/stock/service/impl/StockServiceImpl.java new file mode 100644 index 0000000..899c67e --- /dev/null +++ b/src/main/java/com/dd/admin/business/stock/service/impl/StockServiceImpl.java @@ -0,0 +1,103 @@ +package com.dd.admin.business.stock.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.product.entity.Product; +import com.dd.admin.business.product.service.ProductService; +import com.dd.admin.business.stockDetail.entity.StockDetail; +import com.dd.admin.business.stockDetail.service.StockDetailService; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.business.stock.entity.Stock; +import com.dd.admin.business.stock.mapper.StockMapper; +import com.dd.admin.business.stock.service.StockService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dd.admin.common.security.SecurityUtil; +import com.dd.admin.common.security.model.JwtUser; +import com.dd.admin.common.utils.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.dd.admin.business.stock.domain.StockVo; +import com.dd.admin.business.stock.domain.StockDto; + +import java.util.Date; +import java.util.List; + +import static com.dd.admin.common.consts.MemberShopConst.STOCK_IN; +import static com.dd.admin.common.consts.MemberShopConst.STOCK_OUT; + +/** + *

+ * 库存单 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-27 + */ +@Service +public class StockServiceImpl extends ServiceImpl implements StockService { + + @Autowired + private ProductService productService; + + @Autowired + private StockDetailService stockDetailService; + + @Override + public IPage selectStockPage(StockDto stockDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectStockPage(page,stockDto); + } + + @Override + public List selectStockList(StockDto stockDto) { + return baseMapper.selectStockList(stockDto); + } + + @Override + public Stock addStockIn(StockDto stockDto) { + //创建入库总单 + Stock stock = BeanUtil.copyProperties(stockDto, Stock.class); + stock.setStockTitle(DateUtil.formatChineseDate(new Date(),false,true) + SecurityUtil.getLoginUser().getDeptName() + "入库单"); + stock.setStockNo(StringUtil.getDateStringNow()); + stock.setStockType(STOCK_IN); + this.save(stock); + + List productList = stockDto.getProductList(); + productList.stream().forEach(product -> { + StockDetail stockDetail = new StockDetail(); + stockDetail.setStockId(stock.getStockId()); + stockDetail.setProductId(product.getProductId()); + stockDetail.setProductName(product.getProductName()); + stockDetail.setCount(product.getCount()); + + productService.addProductCount(product.getProductId(),stockDetail.getCount()); + stockDetailService.save(stockDetail); + }); + return stock; + } + + @Override + public Stock addStockOut(StockDto stockDto) { + //创建入库总单 + Stock stock = BeanUtil.copyProperties(stockDto, Stock.class); + stock.setStockTitle(DateUtil.formatChineseDate(new Date(),false,true) + SecurityUtil.getLoginUser().getDeptName() + "出库单"); + stock.setStockNo(StringUtil.getDateStringNow()); + stock.setStockType(STOCK_OUT); + this.save(stock); + + List productList = stockDto.getProductList(); + productList.stream().forEach(product -> { + StockDetail stockDetail = new StockDetail(); + stockDetail.setStockId(stock.getStockId()); + stockDetail.setProductId(product.getProductId()); + stockDetail.setProductName(product.getProductName()); + stockDetail.setCount(product.getCount()); + + productService.subProductCount(product.getProductId(),stockDetail.getCount()); + stockDetailService.save(stockDetail); + }); + return stock; + } +} diff --git a/src/main/java/com/dd/admin/business/stockDetail/controller/StockDetailController.java b/src/main/java/com/dd/admin/business/stockDetail/controller/StockDetailController.java new file mode 100644 index 0000000..b601e27 --- /dev/null +++ b/src/main/java/com/dd/admin/business/stockDetail/controller/StockDetailController.java @@ -0,0 +1,88 @@ +package com.dd.admin.business.stockDetail.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.business.stockDetail.entity.StockDetail; +import com.dd.admin.business.stockDetail.domain.StockDetailVo; +import com.dd.admin.business.stockDetail.domain.StockDetailDto; +import com.dd.admin.business.stockDetail.service.StockDetailService; + +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-27 + */ +@Api(tags = "") +@RestController +public class StockDetailController { + + @Autowired + StockDetailService stockDetailService; + + @ApiOperation(value = "-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/stockDetail/page") + public ResultBean> page(StockDetailDto stockDetailDto) { + IPage pageInfo = stockDetailService.selectStockDetailPage(stockDetailDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/stockDetail/list") + public ResultBean> list(StockDetailDto stockDetailDto) { + List list = stockDetailService.selectStockDetailList(stockDetailDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/stockDetail/add") + public ResultBean add(@RequestBody @Validated StockDetailDto stockDetailDto) { + StockDetail stockDetail = BeanUtil.copyProperties(stockDetailDto, StockDetail.class); + stockDetailService.save(stockDetail); + return ResultBean.success(stockDetail); + } + + @ApiOperation(value = "-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/stockDetail/{stockDetailId}") + public ResultBean get(@PathVariable @NotBlank String stockDetailId) { + StockDetail stockDetail = stockDetailService.getById(stockDetailId); + StockDetailVo stockDetailVo = BeanUtil.copyProperties(stockDetail,StockDetailVo.class); + return ResultBean.success(stockDetailVo); + } + + @ApiOperation(value = "-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/stockDetail/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) StockDetailDto stockDetailDto) { + StockDetail stockDetail = BeanUtil.copyProperties(stockDetailDto, StockDetail.class); + stockDetailService.updateById(stockDetail); + return ResultBean.success(stockDetail); + } + + @ApiOperation(value = "-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/stockDetail/delete/{stockDetailId}") + public ResultBean delete(@PathVariable @NotBlank String stockDetailId) { + Boolean b = stockDetailService.removeById(stockDetailId); + return ResultBean.success(b); + } +} diff --git a/src/main/java/com/dd/admin/business/stockDetail/domain/StockDetailDto.java b/src/main/java/com/dd/admin/business/stockDetail/domain/StockDetailDto.java new file mode 100644 index 0000000..a6dc6b2 --- /dev/null +++ b/src/main/java/com/dd/admin/business/stockDetail/domain/StockDetailDto.java @@ -0,0 +1,62 @@ +package com.dd.admin.business.stockDetail.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-27 + */ +@Data +@ApiModel(value="接收对象") +public class StockDetailDto { + + + @ApiModelProperty(value = "库存详情id") + @NotBlank(message = "id不能为空",groups = UpdateGroup.class) + private String stockDetailId; + + @ApiModelProperty(value = "库存单id") + private String stockId; + + @ApiModelProperty(value = "商品") + private String productId; + + @ApiModelProperty(value = "商品名 ") + private String productName; + + @ApiModelProperty(value = "库存数量") + private Long count; + + @ApiModelProperty(value = "0正常 1审核完毕 2取消") + private Integer stockStatus; + + @ApiModelProperty(value = "类型 1入库 2出库") + private Integer stockType; + + @ApiModelProperty(value = "金额") + private BigDecimal amount; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + +} diff --git a/src/main/java/com/dd/admin/business/stockDetail/domain/StockDetailVo.java b/src/main/java/com/dd/admin/business/stockDetail/domain/StockDetailVo.java new file mode 100644 index 0000000..cb9a372 --- /dev/null +++ b/src/main/java/com/dd/admin/business/stockDetail/domain/StockDetailVo.java @@ -0,0 +1,58 @@ +package com.dd.admin.business.stockDetail.domain; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-27 + */ +@Data +@ApiModel(value="返回对象") +public class StockDetailVo { + + + @ApiModelProperty(value = "库存详情id") + private String stockDetailId; + + @ApiModelProperty(value = "库存单id") + private String stockId; + + @ApiModelProperty(value = "商品") + private String productId; + + @ApiModelProperty(value = "商品名 ") + private String productName; + + @ApiModelProperty(value = "库存数量") + private Long count; + + @ApiModelProperty(value = "0正常 1审核完毕 2取消") + private Integer stockStatus; + + @ApiModelProperty(value = "类型 1入库 2出库") + private Integer stockType; + + @ApiModelProperty(value = "金额") + private BigDecimal amount; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + +} diff --git a/src/main/java/com/dd/admin/business/stockDetail/entity/StockDetail.java b/src/main/java/com/dd/admin/business/stockDetail/entity/StockDetail.java new file mode 100644 index 0000000..4791174 --- /dev/null +++ b/src/main/java/com/dd/admin/business/stockDetail/entity/StockDetail.java @@ -0,0 +1,70 @@ +package com.dd.admin.business.stockDetail.entity; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * + *

+ * + * @author 727869402@qq.com + * @since 2024-06-27 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("business_stock_detail") +@ApiModel(value="StockDetail对象", description="") +public class StockDetail implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "库存详情id") + @TableId(value = "STOCK_DETAIL_ID", type = IdType.ASSIGN_UUID) + private String stockDetailId; + + @ApiModelProperty(value = "库存单id") + @TableField("STOCK_ID") + private String stockId; + + @ApiModelProperty(value = "商品") + @TableField("PRODUCT_ID") + private String productId; + + @ApiModelProperty(value = "商品名 ") + @TableField("PRODUCT_NAME") + private String productName; + + @ApiModelProperty(value = "库存数量") + @TableField("COUNT") + private Long count; + + @ApiModelProperty(value = "0正常 1审核完毕 2取消") + @TableField("STOCK_STATUS") + private Integer stockStatus; + + @ApiModelProperty(value = "类型 1入库 2出库") + @TableField("STOCK_TYPE") + private Integer stockType; + + @ApiModelProperty(value = "金额") + @TableField("AMOUNT") + private BigDecimal amount; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + +} diff --git a/src/main/java/com/dd/admin/business/stockDetail/mapper/StockDetailMapper.java b/src/main/java/com/dd/admin/business/stockDetail/mapper/StockDetailMapper.java new file mode 100644 index 0000000..5db5e0f --- /dev/null +++ b/src/main/java/com/dd/admin/business/stockDetail/mapper/StockDetailMapper.java @@ -0,0 +1,28 @@ +package com.dd.admin.business.stockDetail.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.business.stockDetail.entity.StockDetail; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.business.stockDetail.domain.StockDetailVo; +import com.dd.admin.business.stockDetail.domain.StockDetailDto; + +import java.util.List; + +/** + *

+ * Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-27 + */ +@Mapper +public interface StockDetailMapper extends BaseMapper { + + IPage selectStockDetailPage(Page page, @Param("stockDetailDto") StockDetailDto stockDetailDto); + + List selectStockDetailList(@Param("stockDetailDto") StockDetailDto stockDetailDto); +} diff --git a/src/main/java/com/dd/admin/business/stockDetail/mapper/xml/StockDetailMapper.xml b/src/main/java/com/dd/admin/business/stockDetail/mapper/xml/StockDetailMapper.xml new file mode 100644 index 0000000..16b208e --- /dev/null +++ b/src/main/java/com/dd/admin/business/stockDetail/mapper/xml/StockDetailMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + STOCK_DETAIL_ID, STOCK_ID, PRODUCT_ID, PRODUCT_NAME, COUNT, STOCK_STATUS, STOCK_TYPE, AMOUNT, CREATE_TIME + + + + + + diff --git a/src/main/java/com/dd/admin/business/stockDetail/service/StockDetailService.java b/src/main/java/com/dd/admin/business/stockDetail/service/StockDetailService.java new file mode 100644 index 0000000..e6efc79 --- /dev/null +++ b/src/main/java/com/dd/admin/business/stockDetail/service/StockDetailService.java @@ -0,0 +1,26 @@ +package com.dd.admin.business.stockDetail.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.business.stockDetail.entity.StockDetail; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.business.stockDetail.domain.StockDetailVo; +import com.dd.admin.business.stockDetail.domain.StockDetailDto; +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-27 + */ +public interface StockDetailService extends IService { + + //-分页列表 + IPage selectStockDetailPage(StockDetailDto stockDetailDto); + + //-列表 + List selectStockDetailList(StockDetailDto stockDetailDto); + +} diff --git a/src/main/java/com/dd/admin/business/stockDetail/service/impl/StockDetailServiceImpl.java b/src/main/java/com/dd/admin/business/stockDetail/service/impl/StockDetailServiceImpl.java new file mode 100644 index 0000000..902351a --- /dev/null +++ b/src/main/java/com/dd/admin/business/stockDetail/service/impl/StockDetailServiceImpl.java @@ -0,0 +1,36 @@ +package com.dd.admin.business.stockDetail.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.business.stockDetail.entity.StockDetail; +import com.dd.admin.business.stockDetail.mapper.StockDetailMapper; +import com.dd.admin.business.stockDetail.service.StockDetailService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.dd.admin.business.stockDetail.domain.StockDetailVo; +import com.dd.admin.business.stockDetail.domain.StockDetailDto; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2024-06-27 + */ +@Service +public class StockDetailServiceImpl extends ServiceImpl implements StockDetailService { + + @Override + public IPage selectStockDetailPage(StockDetailDto stockDetailDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectStockDetailPage(page,stockDetailDto); + } + + @Override + public List selectStockDetailList(StockDetailDto stockDetailDto) { + return baseMapper.selectStockDetailList(stockDetailDto); + } +} diff --git a/src/main/java/com/dd/admin/common/aop/operationLog/aop/OperLog.java b/src/main/java/com/dd/admin/common/aop/operationLog/aop/OperLog.java new file mode 100644 index 0000000..c7d3339 --- /dev/null +++ b/src/main/java/com/dd/admin/common/aop/operationLog/aop/OperLog.java @@ -0,0 +1,16 @@ +package com.dd.admin.common.aop.operationLog.aop; + +import java.lang.annotation.*; + +/** + * 自定义操作日志注解 + * @author wu + */ +@Target(ElementType.METHOD) //注解放置的目标位置,METHOD是可注解在方法级别上 +@Retention(RetentionPolicy.RUNTIME) //注解在哪个阶段执行 +@Documented +public @interface OperLog { + String operModule() default ""; // 操作模块 + OperType operType() default OperType.QUERY; // 操作类型 + String operDesc() default ""; // 操作说明 +} diff --git a/src/main/java/com/dd/admin/common/aop/operationLog/aop/OperLogAspect.java b/src/main/java/com/dd/admin/common/aop/operationLog/aop/OperLogAspect.java new file mode 100644 index 0000000..bc562b9 --- /dev/null +++ b/src/main/java/com/dd/admin/common/aop/operationLog/aop/OperLogAspect.java @@ -0,0 +1,189 @@ +package com.dd.admin.common.aop.operationLog.aop; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.dd.admin.business.member.entity.Member; +import com.dd.admin.business.member.service.MemberService; +import com.dd.admin.business.operationLog.entity.OperationLog; +import com.dd.admin.business.operationLog.service.OperationLogService; +import com.dd.admin.common.model.result.ResultBean; +import com.dd.admin.common.security.SecurityUtil; +import com.dd.admin.common.security.model.JwtUser; +import com.dd.admin.common.utils.IPUtils; +import com.dd.admin.common.utils.StringUtil; +import com.dd.admin.system.user.domain.UserVo; +import com.dd.admin.system.user.service.UserService; +import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; + +import javax.servlet.http.HttpServletRequest; +import java.awt.*; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + + +/** + * 切面处理类,操作日志异常日志记录处理 + * + * @author wu + * @date 2019/03/21 + */ +@Aspect +@Component +public class OperLogAspect { + + @Autowired + private OperationLogService operationLogService; + + @Autowired + private MemberService memberService; + + @Autowired + private UserService userService; + + /** + * 设置操作日志切入点 记录操作日志 在注解的位置切入代码 + */ + @Pointcut("@annotation(com.dd.admin.common.aop.operationLog.aop.OperLog)") + public void operLogPoinCut() { + } + + /** + * 设置操作异常切入点记录异常日志 扫描所有controller包下操作 + */ + @Pointcut("execution(* com.dd.admin.business.*.controller..*.*(..))") + public void operExceptionLogPoinCut() { + } + @Pointcut("execution(* com.dd.admin.system.*.controller..*.*(..))") + public void operExceptionLogPoinCut1() { + } + + /** + * 正常返回通知,拦截用户操作日志,连接点正常执行完成后执行, 如果连接点抛出异常,则不会执行 + * + * @param joinPoint 切入点 + * @param keys 返回结果 + */ + @AfterReturning(value = "operLogPoinCut()", returning = "keys") + public void saveOperLog(JoinPoint joinPoint, Object keys) throws IOException { + // 获取RequestAttributes + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + // 从获取RequestAttributes中获取HttpServletRequest的信息 + HttpServletRequest request = (HttpServletRequest) requestAttributes + .resolveReference(RequestAttributes.REFERENCE_REQUEST); + + OperationLog operlog = new OperationLog(); + try { + // 从切面织入点处通过反射机制获取织入点处的方法 + MethodSignature signature = (MethodSignature) joinPoint.getSignature(); + // 获取切入点所在的方法 + Method method = signature.getMethod(); + // 获取操作 + OperLog opLog = method.getAnnotation(OperLog.class); + if (opLog != null) { + String operModule = opLog.operModule(); + OperType operType = opLog.operType(); + String operDesc = opLog.operDesc(); + operlog.setOperModule(operModule); // 操作模块 + operlog.setOperType(String.valueOf(operType)); // 操作类型 + operlog.setOperDesc(operDesc); // 操作描述 + } + // 获取请求的类名 + String className = joinPoint.getTarget().getClass().getName(); + // 获取请求的方法名 + String methodName = method.getName(); + methodName = className + "." + methodName; + + operlog.setOperMethod(methodName); // 请求方法 + + + // 请求的参数 + Map rtnMap = converMap(request.getParameterMap()); + String rtnJson = JSON.toJSONString(rtnMap); + + String json = JSON.toJSONString(joinPoint.getArgs()); + JSONArray jsonArray = JSONUtil.parseArray(json); + if(StringUtil.isNotEmpty(rtnJson)&&!rtnMap.isEmpty()){ + operlog.setOprrRequestParam(rtnJson); // 请求参数 + }else if(StringUtil.isNotEmpty(json)&& !CollectionUtil.isEmpty(jsonArray)){ + operlog.setOprrRequestParam(json); // 请求参数 + } + + + + //设置会员信息 + ResultBean resultBean = (ResultBean) keys; + String memberId = ""; + try { + memberId = String.valueOf(BeanUtil.beanToMap(resultBean.getData()).get("memberId")); + }catch (Exception e){ + memberId = ""; + } + if(StringUtil.isNotEmpty(memberId)) { + Member member = memberService.getById(memberId); + operlog.setMemberId(memberId); + operlog.setMemberName(member.getMemberName()); + } + + operlog.setOperResponseParam(JSON.toJSONString(keys)); // 返回结果 + operlog.setOperIp(IPUtils.getIpAddr(request)); // 请求IP + operlog.setOperUrl(request.getRequestURI()); // 请求URI + + try { + JwtUser user = SecurityUtil.getLoginUser(); + if(user!=null){ + operlog.setOperUserId(user.getUserId()); // 请求用户ID + operlog.setOperUserName(user.getUsername()); // 请求用户名称 + operlog.setOperDeptId(user.getDeptId()); + operlog.setOperDeptName(user.getDeptName()); + } + }catch (Exception e){ + Object obj = jsonArray.get(0); + Map map = BeanUtil.beanToMap(obj); + String username = String.valueOf(map.get("username")); + UserVo user = userService.selectOneByUserName(username); + if(user!=null){ + operlog.setOperUserId(user.getUserId()); // 请求用户ID + operlog.setOperUserName(user.getUserName()); // 请求用户名称 + operlog.setOperDeptId(user.getDeptId()); + operlog.setOperDeptName(user.getDeptName()); + //这里是登陆操作 参数只保存 用户名 + operlog.setOprrRequestParam(user.getUserName()); // 请求参数 + } + } + operationLogService.save(operlog); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 转换request 请求参数 + * + * @param paramMap request获取的参数数组 + */ + public Map converMap(Map paramMap) { + Map rtnMap = new HashMap(); + for (String key : paramMap.keySet()) { + rtnMap.put(key, paramMap.get(key)[0]); + } + return rtnMap; + } +} diff --git a/src/main/java/com/dd/admin/common/aop/operationLog/aop/OperType.java b/src/main/java/com/dd/admin/common/aop/operationLog/aop/OperType.java new file mode 100644 index 0000000..d621a18 --- /dev/null +++ b/src/main/java/com/dd/admin/common/aop/operationLog/aop/OperType.java @@ -0,0 +1,33 @@ +package com.dd.admin.common.aop.operationLog.aop; + +public enum OperType { + /** + * 新增 + */ + ADD, + + /** + * 修改 + */ + EDIT, + + /** + * 删除 + */ + REMOVE, + + /** + * 查询 + */ + QUERY, + + /** + * 导出 + */ + EXPORT, + + /** + * 其他 + */ + OTHER; +} diff --git a/src/main/java/com/dd/admin/common/config/CorsConfig.java b/src/main/java/com/dd/admin/common/config/CorsConfig.java new file mode 100644 index 0000000..d0e261c --- /dev/null +++ b/src/main/java/com/dd/admin/common/config/CorsConfig.java @@ -0,0 +1,78 @@ +package com.dd.admin.common.config; + +import com.dd.admin.common.utils.ToolUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.MediaType; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; + + +/** + * web 配置 + * + * @author 727869402@qq.com + * @date 2021/7/6 + */ +@Configuration +public class CorsConfig implements WebMvcConfigurer { + + + @Value("${dd.uploadPath}") + private String uploadPath; + + @Override + public void addCorsMappings(CorsRegistry registry) { + //设置允许跨域的路径 + registry.addMapping("/**") + //设置允许跨域请求的域名 + .allowedOriginPatterns("*") + //是否允许证书 不再默认开启 + .allowCredentials(true) + //设置允许的方法 + .allowedMethods("GET", "POST") + //跨域允许时间 + .maxAge(3600); + } + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + if (ToolUtil.isWinOs()) { //如果是Windows系统 + registry.addResourceHandler("/upload/**") + // /upload/**表示在磁盘upload目录下的所有资源会被解析为以下的路径 + .addResourceLocations("file:" + uploadPath) //媒体资源 + .addResourceLocations("classpath:/META-INF/resources/"); + } else { //linux 和mac + registry.addResourceHandler("/upload/**") + .addResourceLocations("file:" + uploadPath) //媒体资源 + .addResourceLocations("classpath:/META-INF/resources/"); //媒体资源; + } + } + + + +// @Bean +// public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() { +// MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); +// //设置日期格式 +// ObjectMapper objectMapper = new ObjectMapper(); +// SimpleDateFormat smt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); +// objectMapper.setDateFormat(smt); +// mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper); +// //设置中文编码格式 +// List list = new ArrayList(); +// list.add(MediaType.APPLICATION_JSON_UTF8); +// mappingJackson2HttpMessageConverter.setSupportedMediaTypes(list); +// return mappingJackson2HttpMessageConverter; +// } + +} diff --git a/src/main/java/com/dd/admin/common/config/Knife4jConfig.java b/src/main/java/com/dd/admin/common/config/Knife4jConfig.java new file mode 100644 index 0000000..0737e4c --- /dev/null +++ b/src/main/java/com/dd/admin/common/config/Knife4jConfig.java @@ -0,0 +1,79 @@ +package com.dd.admin.common.config; + +import cn.hutool.core.collection.CollUtil; +import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; + +import java.util.List; + +@EnableSwagger2WebMvc +@Configuration +public class Knife4jConfig { + + private final OpenApiExtensionResolver openApiExtensionResolver; + + @Autowired + public Knife4jConfig(OpenApiExtensionResolver openApiExtensionResolver) { + this.openApiExtensionResolver = openApiExtensionResolver; + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("swagger-bootstrap-ui很棒~~~!!!") + .description("swagger-bootstrap-ui-sunflower RESTful APIs") + .termsOfServiceUrl("http://www.group.com/") + .version("1.0") + .build(); + } + + @Bean(value = "defaultApi1") + public Docket defaultApi1() { + String groupName = "系统管理"; + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + //分组名称 + .groupName(groupName) + .select() + //这里指定Controller扫描包路径 + .apis(RequestHandlerSelectors.basePackage("com.dd.admin.system")) + .paths(PathSelectors.any()) + .build() + .extensions(openApiExtensionResolver.buildExtensions(groupName)) + .securitySchemes(securitySchemes()); + } + + @Bean(value = "defaultApi2") + public Docket defaultApi2() { + String groupName = "业务管理"; + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + //分组名称 + .groupName(groupName) + .select() + //这里指定Controller扫描包路径 + .apis(RequestHandlerSelectors.basePackage("com.dd.admin.business")) + .paths(PathSelectors.any()) + .build() + .extensions(openApiExtensionResolver.buildExtensions(groupName)) + .securitySchemes(securitySchemes()); + } + + + private List securitySchemes() { + return CollUtil.newArrayList( + new ApiKey("JWT", "Authorization", "header")); + } + + +} diff --git a/src/main/java/com/dd/admin/common/config/MybatisPlusConfig.java b/src/main/java/com/dd/admin/common/config/MybatisPlusConfig.java new file mode 100644 index 0000000..423c307 --- /dev/null +++ b/src/main/java/com/dd/admin/common/config/MybatisPlusConfig.java @@ -0,0 +1,31 @@ +package com.dd.admin.common.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + +* Description: MybatisPlus配置类 + +* date: 2021/7/2 +* @author: wxl +*/ + +@Configuration +public class MybatisPlusConfig { + // 最新版 分页插件 + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + + //添加乐观锁拦截器 + interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); + + return interceptor; + } +} diff --git a/src/main/java/com/dd/admin/common/consts/MemberShopConst.java b/src/main/java/com/dd/admin/common/consts/MemberShopConst.java new file mode 100644 index 0000000..e66e7c7 --- /dev/null +++ b/src/main/java/com/dd/admin/common/consts/MemberShopConst.java @@ -0,0 +1,53 @@ +package com.dd.admin.common.consts; + +public class MemberShopConst { + /** + *入库 + */ + public final static Integer STOCK_IN = 1; + /** + *出库 + */ + public final static Integer STOCK_OUT = 2; + + /** + *入库 类型销单返回 + */ + public final static Integer STOCK_IN_TYPE_CANCEL = 3; + + /** + *出库 类型使用 + */ + public final static Integer STOCK_OUT_TYPE_USE = 3; + + /** + *开启库存管理 + */ + public final static Integer STOCK_CONTROL_YES = 1; + /** + *关闭库存管理 + */ + public final static Integer STOCK_CONTROL_NO = 0; + + /** + *订单状态 正常 + */ + public final static Integer SELL_STATUS_NORMAL = 0; + + /** + *订单状态 销单 + */ + public final static Integer SELL_STATUS_CANCEL = 1; + + + /** + *提成固定 + */ + public final static Integer PUSH_FIXED = 0; + + + /** + *订单状态 销单 + */ + public final static Integer PUSH_SCALE = 1; +} diff --git a/src/main/java/com/dd/admin/common/consts/SystemConst.java b/src/main/java/com/dd/admin/common/consts/SystemConst.java new file mode 100644 index 0000000..9d0eee3 --- /dev/null +++ b/src/main/java/com/dd/admin/common/consts/SystemConst.java @@ -0,0 +1,53 @@ +package com.dd.admin.common.consts; + +public class SystemConst { + /** + * 默认密码 + */ + public final static String DEFAULT_PASSWORD = "111111"; + /** + * 默认管理员密码 + */ + public final static String ADMIN_USER_NAME = "admin"; + /** + *系统人员 + */ + public final static Integer ADMIN_USER = 1; + /** + *工作人员 + */ + public final static Integer TECH_USER = 2; + + /** + *会员 + */ + public final static Integer MEMBER_USER = 3; + /** + * 会员正常用户 + */ + public final static Integer USER_NORMAL = 1; + /** + * 会员冻结用户 + */ + public final static Integer USER_FREEZE = 0; + + /** + * 总部ID + */ + public final static String TOP_DEPT_ID = "1"; + /** + * 菜单 + */ + public final static Integer AUTH_MENU = 1; + + /** + * 按钮 + */ + public final static Integer AUTH_BUTTON = 2; + + /** + * 按钮缓存 + */ + public final static Integer MENU_CACHE = 1; + +} diff --git a/src/main/java/com/dd/admin/common/exception/ApiException.java b/src/main/java/com/dd/admin/common/exception/ApiException.java new file mode 100644 index 0000000..2075af0 --- /dev/null +++ b/src/main/java/com/dd/admin/common/exception/ApiException.java @@ -0,0 +1,37 @@ +package com.dd.admin.common.exception; + +import com.dd.admin.common.exception.enums.AbstractBaseExceptionEnum; +import lombok.Data; + +/** + * 接口异常实现类 + */ +@Data +public class ApiException extends RuntimeException{ + + private static final long serialVersionUID = 1L; + + private Integer code; + private String msg; + + public ApiException(Integer code, String errorMessage) { + super(errorMessage); + this.code = code; + this.msg = errorMessage; + } + + public ApiException(String errorMessage) { + super(errorMessage); + this.code = 500; + this.msg = errorMessage; + } + + + public ApiException(AbstractBaseExceptionEnum exception) { + super(exception.getMessage()); + this.code = exception.getCode(); + this.msg = exception.getMessage(); + } + + +} diff --git a/src/main/java/com/dd/admin/common/exception/ControllerExceptionHandler.java b/src/main/java/com/dd/admin/common/exception/ControllerExceptionHandler.java new file mode 100644 index 0000000..9b9f151 --- /dev/null +++ b/src/main/java/com/dd/admin/common/exception/ControllerExceptionHandler.java @@ -0,0 +1,88 @@ +package com.dd.admin.common.exception; + +import com.dd.admin.common.model.result.ResultBean; +import com.dd.admin.common.model.result.ResultError; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.jdbc.BadSqlGrammarException; +import org.springframework.validation.ObjectError; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; + +import static com.dd.admin.common.exception.enums.ApiExceptionEnum.HTTP_NOT_SUPPORT; +import static com.dd.admin.common.exception.enums.ApiExceptionEnum.MESSAGE_NOT_READABLE; + +@ControllerAdvice +@Order(-1) +@Slf4j +public class ControllerExceptionHandler { + + @Autowired + HttpServletRequest request; + + @Autowired + HttpServletResponse response; + + @ExceptionHandler(ApiException.class) + @ResponseBody + public ResultError ApiException(ApiException e) throws IOException { + log.error("ApiException{}",e.getMsg()); + return ResultError.error(e.getCode(),e.getMessage()); + } + + + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + @ResponseBody + public ResultError HttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) throws IOException { + log.error("HttpRequestMethodNotSupportedException{}",e); + return ResultError.error(HTTP_NOT_SUPPORT); + } + + @ExceptionHandler(HttpMessageNotReadableException.class) + @ResponseBody + public ResultError HttpMessageNotReadableException(HttpMessageNotReadableException e) throws IOException { + log.error("HttpMessageNotReadableException{}",e); + return ResultError.error(MESSAGE_NOT_READABLE); + } + + + @ExceptionHandler(RuntimeException.class) + @ResponseBody + public ResultError RuntimeException(RuntimeException e) throws IOException { + log.error("RuntimeException{}",e); + return ResultError.error(ResultBean.DEFAULT_ERROR_CODE,e.getMessage()); + } + + @ExceptionHandler(Exception.class) + @ResponseBody + public ResultError Exception(Exception e) throws IOException { + log.error("Exception{}",e); + return ResultError.error(ResultBean.DEFAULT_ERROR_CODE,ResultBean.DEFAULT_ERROR_MESSAGE); + } + + @ExceptionHandler(BadSqlGrammarException.class) + @ResponseBody + public ResultError BadSqlGrammarException(BadSqlGrammarException e) throws IOException { + log.error("Exception{}",e); + return ResultError.error(ResultBean.DEFAULT_ERROR_CODE,"数据查询有误"); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseBody + public ResultError MethodArgumentNotValidException(MethodArgumentNotValidException e) throws IOException { + log.error("MethodArgumentNotValidException{}",e); + List list = e.getAllErrors(); + String ERROR = list.get(0).getDefaultMessage(); + return ResultError.error(ResultBean.DEFAULT_ERROR_CODE,ERROR); + } +} diff --git a/src/main/java/com/dd/admin/common/exception/enums/AbstractBaseExceptionEnum.java b/src/main/java/com/dd/admin/common/exception/enums/AbstractBaseExceptionEnum.java new file mode 100644 index 0000000..c5a30e7 --- /dev/null +++ b/src/main/java/com/dd/admin/common/exception/enums/AbstractBaseExceptionEnum.java @@ -0,0 +1,16 @@ +package com.dd.admin.common.exception.enums; + +/** + * 基础的异常枚举类 + */ +public interface AbstractBaseExceptionEnum { + /** + * 获取异常的状态码 + */ + Integer getCode(); + + /** + * 获取异常的提示信息 + */ + String getMessage(); +} diff --git a/src/main/java/com/dd/admin/common/exception/enums/ApiExceptionEnum.java b/src/main/java/com/dd/admin/common/exception/enums/ApiExceptionEnum.java new file mode 100644 index 0000000..794817a --- /dev/null +++ b/src/main/java/com/dd/admin/common/exception/enums/ApiExceptionEnum.java @@ -0,0 +1,35 @@ +package com.dd.admin.common.exception.enums; + + +public enum ApiExceptionEnum implements AbstractBaseExceptionEnum { + ACCESS_DENIED_EXCEPTION(401,"未登录"), + USERNAME_IS_NOT_NULL(5000,"用户名不能为空"), + USERNAME_OR_PASSWORD_ERROR(401,"用户名或密码错误"), + TOKEN_EXPIRED(700, "token过期"), + TOKEN_ERROR(700, "token验证失败"), + MESSAGE_NOT_READABLE(400, "参数解析失败"), + HTTP_NOT_SUPPORT(400, "请求方式不支持"), + + ; + + + ApiExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + private Integer code; + + private String message; + + + @Override + public Integer getCode() { + return this.code; + } + + @Override + public String getMessage() { + return this.message; + } +} diff --git a/src/main/java/com/dd/admin/common/exception/enums/SystemExceptionEnum.java b/src/main/java/com/dd/admin/common/exception/enums/SystemExceptionEnum.java new file mode 100644 index 0000000..4627061 --- /dev/null +++ b/src/main/java/com/dd/admin/common/exception/enums/SystemExceptionEnum.java @@ -0,0 +1,31 @@ +package com.dd.admin.common.exception.enums; + +public enum SystemExceptionEnum implements AbstractBaseExceptionEnum{ + DEPT_ALREADY_EXIST(500,"该机构已存在"), + DEPT_ALREADY_EXPIRE(500,"门店有效期已过,请及时联系管理员续费~"), + USERNAME_ALREADY_EXIST(500,"该用户名已被占用"), + TECH_LOGIN_WX(500,"服务人员请在公众号登陆~"), + USER_IS_FREEZE(500,"该用户已锁定,请联系管理员"), + USER_PASSWORD_ERROR(500,"用户历史密码错误"); + ; + + SystemExceptionEnum(Integer code, String message) { + this.code = code; + this.message = message; + } + + private Integer code; + + private String message; + + + @Override + public Integer getCode() { + return this.code; + } + + @Override + public String getMessage() { + return this.message; + } +} diff --git a/src/main/java/com/dd/admin/common/exception/enums/test.java b/src/main/java/com/dd/admin/common/exception/enums/test.java new file mode 100644 index 0000000..565868f --- /dev/null +++ b/src/main/java/com/dd/admin/common/exception/enums/test.java @@ -0,0 +1,9 @@ +package com.dd.admin.common.exception.enums; + +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; + +public class test { + public static void main(String[] args) { + System.out.println(new BCryptPasswordEncoder().encode("111111")); + } +} diff --git a/src/main/java/com/dd/admin/common/logs/P6SpyLogger.java b/src/main/java/com/dd/admin/common/logs/P6SpyLogger.java new file mode 100644 index 0000000..e099076 --- /dev/null +++ b/src/main/java/com/dd/admin/common/logs/P6SpyLogger.java @@ -0,0 +1 @@ +package com.dd.admin.common.logs; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.p6spy.engine.spy.appender.MessageFormattingStrategy; import lombok.extern.slf4j.Slf4j; @Slf4j public class P6SpyLogger implements MessageFormattingStrategy { @Override public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) { return StringUtils.isNotBlank(sql) ? now +" Execute Times:"+ elapsed + " ms " + "Execute SQL:\n"+ sql.replaceAll("[\\s]+", " ") + "\n" : ""; } } \ No newline at end of file diff --git a/src/main/java/com/dd/admin/common/model/PageFactory.java b/src/main/java/com/dd/admin/common/model/PageFactory.java new file mode 100644 index 0000000..6a6f061 --- /dev/null +++ b/src/main/java/com/dd/admin/common/model/PageFactory.java @@ -0,0 +1,36 @@ +package com.dd.admin.common.model; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.utils.HttpContext; +import com.dd.admin.common.utils.StringUtil; + +import javax.servlet.http.HttpServletRequest; + +/** + * 生成默认分页数据 + */ +public class PageFactory { + + private static final int defaultLimit = 20; + + public static Page defaultPage() { + HttpServletRequest request = HttpContext.getRequest(); + //第几页 + int page; + String pg = request.getParameter("page"); + if(StringUtil.isEmpty(pg)){ + page = 1; + }else{ + page= Integer.valueOf(pg); + } + //每页显示多少条数据 + int limit; + String lim = request.getParameter("limit"); + if(StringUtil.isEmpty(lim)){ + limit = defaultLimit; + }else{ + limit = Integer.valueOf(lim); + } + return new Page(page, limit); + } +} diff --git a/src/main/java/com/dd/admin/common/model/UpdateGroup.java b/src/main/java/com/dd/admin/common/model/UpdateGroup.java new file mode 100644 index 0000000..29deea2 --- /dev/null +++ b/src/main/java/com/dd/admin/common/model/UpdateGroup.java @@ -0,0 +1,11 @@ +package com.dd.admin.common.model; +import javax.validation.groups.Default; + +/** + * 分组校验 修改 + * + * @author pang + * @date 2021/6/28 + */ +public interface UpdateGroup extends Default { +} diff --git a/src/main/java/com/dd/admin/common/model/result/ResultBean.java b/src/main/java/com/dd/admin/common/model/result/ResultBean.java new file mode 100644 index 0000000..e3e612e --- /dev/null +++ b/src/main/java/com/dd/admin/common/model/result/ResultBean.java @@ -0,0 +1,64 @@ +package com.dd.admin.common.model.result; + + +import com.dd.admin.common.exception.enums.AbstractBaseExceptionEnum; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ResultBean implements Serializable { + + private static final long serialVersionUID = 1L; + + public static final String DEFAULT_SUCCESS_MESSAGE = "success"; + + public static final String DEFAULT_ERROR_MESSAGE = "服务器开小差了~"; + + public static final Integer DEFAULT_SUCCESS_CODE = 200; + + public static final Integer DEFAULT_ERROR_CODE = 500; + + @ApiModelProperty("返回的状态码") + private int code; + @ApiModelProperty("返回的信息") + private String message; + @ApiModelProperty("返回的数据") + private T data; + + + public ResultBean(int code, String message, T data) { + this.message = message; + this.code = code; + this.data = data; + } + + public static ResultSuccess success() { + return new ResultSuccess(); + } + + public static ResultSuccess success(Object object) { + return new ResultSuccess(object); + } + + public static ResultSuccess success(Integer code, String message, Object object) { + return new ResultSuccess(code, message, object); + } + + public static ResultError error(String message) { + return new ResultError(message); + } + + public static ResultError error(AbstractBaseExceptionEnum exception) { + return new ResultError( exception.getCode(), exception.getMessage(), null); + } + public static ResultError error(Integer code, String message, Object object) { + return new ResultError(code, message, object); + } + public static ResultError error(Integer code, String message) { + return new ResultError(code, message, null); + } + + +} diff --git a/src/main/java/com/dd/admin/common/model/result/ResultError.java b/src/main/java/com/dd/admin/common/model/result/ResultError.java new file mode 100644 index 0000000..1dd8609 --- /dev/null +++ b/src/main/java/com/dd/admin/common/model/result/ResultError.java @@ -0,0 +1,19 @@ +package com.dd.admin.common.model.result; + + +import com.dd.admin.common.exception.enums.AbstractBaseExceptionEnum; + +public class ResultError extends ResultBean { + + public ResultError(Integer code, String message, T data) { + super(code, message, data); + } + + public ResultError(AbstractBaseExceptionEnum exception) { + super(exception.getCode(), exception.getMessage(), null); + } + + public ResultError(String message) { + super(DEFAULT_ERROR_CODE, message,null); + } +} diff --git a/src/main/java/com/dd/admin/common/model/result/ResultSuccess.java b/src/main/java/com/dd/admin/common/model/result/ResultSuccess.java new file mode 100644 index 0000000..b1a943b --- /dev/null +++ b/src/main/java/com/dd/admin/common/model/result/ResultSuccess.java @@ -0,0 +1 @@ +package com.dd.admin.common.model.result; public class ResultSuccess extends ResultBean { public ResultSuccess(){ super( DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, null); } public ResultSuccess(Object object) { super( DEFAULT_SUCCESS_CODE, DEFAULT_SUCCESS_MESSAGE, object); } public ResultSuccess(Integer code, String message, Object object) { super( code, message, object); } } \ No newline at end of file diff --git a/src/main/java/com/dd/admin/common/mybatisPlus/MyMetaObjectHandler.java b/src/main/java/com/dd/admin/common/mybatisPlus/MyMetaObjectHandler.java new file mode 100644 index 0000000..8b6a2bc --- /dev/null +++ b/src/main/java/com/dd/admin/common/mybatisPlus/MyMetaObjectHandler.java @@ -0,0 +1,79 @@ +package com.dd.admin.common.mybatisPlus; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.dd.admin.common.security.SecurityUtil; +import com.dd.admin.common.security.model.JwtUser; +import com.dd.admin.common.utils.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.stereotype.Component; + +import java.util.Date; + +@Slf4j +@Component +public class MyMetaObjectHandler implements MetaObjectHandler { + + @Override + public void insertFill(MetaObject metaObject) { + + log.info("start insert fill ...."); + this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); // 起始版本 3.3.0(推荐使用) + + try { + JwtUser jwtUser = SecurityUtil.getLoginUser(); + + if(jwtUser!=null){ + String deptId = String.valueOf(getFieldValByName("deptId",metaObject)); + if(StringUtil.isEmpty(deptId)){ + setFieldValByName("deptId",jwtUser.getDeptId(), metaObject); + } + + String deptName = String.valueOf(getFieldValByName("deptName",metaObject)); + if(StringUtil.isEmpty(deptName)){ + setFieldValByName("deptName",jwtUser.getDeptName(), metaObject); + } + + String shopId = String.valueOf(getFieldValByName("shopId",metaObject)); + if(StringUtil.isEmpty(shopId)){ + setFieldValByName("shopId",jwtUser.getDeptId(), metaObject); + } + + String shopName = String.valueOf(getFieldValByName("shopName",metaObject)); + if(StringUtil.isEmpty(shopName)){ + setFieldValByName("shopName",jwtUser.getDeptName(), metaObject); + } + + String createId = String.valueOf(getFieldValByName("createId",metaObject)); + if(StringUtil.isEmpty(createId)){ + setFieldValByName("createId",jwtUser.getUserId(), metaObject); + } + + String createName = String.valueOf(getFieldValByName("createName",metaObject)); + if(StringUtil.isEmpty(createName)){ + setFieldValByName("createName",jwtUser.getUsername(), metaObject); + } + } + }catch (Exception e){ + log.error("自动填充发生错误",e); + } + } + + @Override + public void updateFill(MetaObject metaObject) { + log.info("start update fill ...."); + this.strictUpdateFill(metaObject, "updateTime",Date.class, new Date()); // 起始版本 3.3.0(推荐) + + JwtUser jwtUser = SecurityUtil.getLoginUser(); + + String updateId = String.valueOf(getFieldValByName("updateId",metaObject)); + if(StringUtil.isEmpty(updateId)){ + this.strictUpdateFill(metaObject, "updateId", String.class, jwtUser.getUserId()); // 起始版本 3.3.0(推荐使用) + } + + String updateName = String.valueOf(getFieldValByName("updateName",metaObject)); + if(StringUtil.isEmpty(updateName)){ + this.strictUpdateFill(metaObject, "updateName", String.class, jwtUser.getUsername()); // 起始版本 3.3.0(推荐使用) + } + } +} diff --git a/src/main/java/com/dd/admin/common/security/SecurityUtil.java b/src/main/java/com/dd/admin/common/security/SecurityUtil.java new file mode 100644 index 0000000..7af0e28 --- /dev/null +++ b/src/main/java/com/dd/admin/common/security/SecurityUtil.java @@ -0,0 +1,20 @@ +package com.dd.admin.common.security; + + +import com.dd.admin.common.security.model.JwtUser; +import lombok.extern.log4j.Log4j; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.context.SecurityContextHolder; + +@Slf4j +public class SecurityUtil { + public static JwtUser getLoginUser(){ + JwtUser jwtUser = null; + try { + jwtUser = (JwtUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + }catch (Exception e){ + log.error(e.getMessage()); + } + return jwtUser; + } +} diff --git a/src/main/java/com/dd/admin/common/security/jwt/JwtTokenUtil.java b/src/main/java/com/dd/admin/common/security/jwt/JwtTokenUtil.java new file mode 100644 index 0000000..cdc7f10 --- /dev/null +++ b/src/main/java/com/dd/admin/common/security/jwt/JwtTokenUtil.java @@ -0,0 +1,80 @@ +package com.dd.admin.common.security.jwt; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.stereotype.Component; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +@Component +public class JwtTokenUtil implements Serializable { + private static final long serialVersionUID = -2550185165626007488L; + public static final long JWT_TOKEN_VALIDITY = 5 * 60 * 60; + + @Value("${jwt.secret}") + private String secret; + + @Value("${jwt.expiration}") + private long expiration; + + //retrieve username from jwt token + public String getUsernameFromToken(String token) { + return getClaimFromToken(token, Claims::getSubject); + } + + //retrieve expiration date from jwt token + public Date getExpirationDateFromToken(String token) { + return getClaimFromToken(token, Claims::getExpiration); + } + public T getClaimFromToken(String token, Function claimsResolver) { + final Claims claims = getAllClaimsFromToken(token); + return claimsResolver.apply(claims); + } + //for retrieveing any information from token we will need the secret key + private Claims getAllClaimsFromToken(String token) { + return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + } + //check if the token has expired + private Boolean isTokenExpired(String token) { + final Date expiration = getExpirationDateFromToken(token); + return expiration.before(new Date()); + } + //generate token for user + public String generateToken(UserDetails userDetails) { + Map claims = new HashMap<>(); + return doGenerateToken(claims, userDetails.getUsername()); + } + + public String generateToken(UserDetails userDetails,String filterKey) { + Map claims = new HashMap<>(); + return doGenerateToken(claims, filterKey + userDetails.getUsername()); + } + + //while creating the token - +//1. Define claims of the token, like Issuer, Expiration, Subject, and the ID +//2. Sign the JWT using the HS512 algorithm and secret key. +//3. According to JWS Compact Serialization(https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#section-3.1) +// compaction of the JWT to a URL-safe string + private String doGenerateToken(Map claims, String subject) { + return Jwts.builder().setClaims(claims).setSubject(subject).setIssuedAt(new Date(System.currentTimeMillis())) + .setExpiration(new Date(System.currentTimeMillis() + expiration * 1000)) + .signWith(SignatureAlgorithm.HS512, secret).compact(); + } + //validate token + public Boolean validateToken(String token, UserDetails userDetails) { + final String username = getUsernameFromToken(token); + return (username.equals(userDetails.getUsername()) && !isTokenExpired(token)); + } + + public Boolean validateToken(String token, UserDetails userDetails,String filterKey) { + final String username = getUsernameFromToken(token); + return (username.equals(filterKey + userDetails.getUsername()) && !isTokenExpired(token)); + } +} diff --git a/src/main/java/com/dd/admin/common/security/jwt/config/IgnoreConfig.java b/src/main/java/com/dd/admin/common/security/jwt/config/IgnoreConfig.java new file mode 100644 index 0000000..7b725ef --- /dev/null +++ b/src/main/java/com/dd/admin/common/security/jwt/config/IgnoreConfig.java @@ -0,0 +1,30 @@ +package com.dd.admin.common.security.jwt.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Data +@ConfigurationProperties(prefix = "jwt.ignores") +@Component +public class IgnoreConfig { + /** + * 需要忽略的 GET 请求 + */ + private List get = new ArrayList<>(); + + /** + * 需要忽略的 POST 请求 + */ + private List post = new ArrayList<>(); + + /** + * 需要忽略的 URL 格式,不考虑请求方法 + */ + private List pattern = new ArrayList<>(); + + +} diff --git a/src/main/java/com/dd/admin/common/security/jwt/config/SecurityConfig.java b/src/main/java/com/dd/admin/common/security/jwt/config/SecurityConfig.java new file mode 100644 index 0000000..65ef2cb --- /dev/null +++ b/src/main/java/com/dd/admin/common/security/jwt/config/SecurityConfig.java @@ -0,0 +1,78 @@ +package com.dd.admin.common.security.jwt.config; + +import com.dd.admin.common.security.jwt.service.JwtUserDetailsService; +import com.dd.admin.common.security.jwt.filter.JwtRequestFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +/** + * SecurityConfig 配置类 + */ +@Configuration +@EnableWebSecurity //开启注解 +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + JwtUserDetailsService jwtUserDetailsService; + + @Autowired + JwtRequestFilter jwtRequestFilter; + /** + * 忽略接口 + */ + @Autowired + IgnoreConfig ignoreConfig; + + @Bean + public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } + + @Override + protected void configure(HttpSecurity httpSecurity) throws Exception { + httpSecurity + // 开启跨域 + .cors() + .and() + // 禁用 CSRF + .csrf().disable() +// //异常处理 注释掉使用自定义异常 方便统一管理 +// .exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint) + // 不需要session + .sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + + .and() + .authorizeRequests() + .anyRequest().authenticated() + + // 添加自定义 JWT 过滤器 + .and() + .addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class); + + // 禁用缓存 + httpSecurity + .headers() + .frameOptions().sameOrigin() + .cacheControl(); + } + + @Override + public void configure(WebSecurity web) throws Exception { + WebSecurity and = web.ignoring().and(); + // 忽略 GET + ignoreConfig.getGet().forEach(url -> and.ignoring().antMatchers(HttpMethod.GET, url)); + // 忽略 POST + ignoreConfig.getPost().forEach(url -> and.ignoring().antMatchers(HttpMethod.POST, url)); + // 忽略 所有方法 + ignoreConfig.getPattern().forEach(url -> and.ignoring().antMatchers(url)); + } +} diff --git a/src/main/java/com/dd/admin/common/security/jwt/filter/JwtRequestFilter.java b/src/main/java/com/dd/admin/common/security/jwt/filter/JwtRequestFilter.java new file mode 100644 index 0000000..f175a95 --- /dev/null +++ b/src/main/java/com/dd/admin/common/security/jwt/filter/JwtRequestFilter.java @@ -0,0 +1,139 @@ +package com.dd.admin.common.security.jwt.filter; + + +import cn.hutool.core.collection.CollUtil; +import com.dd.admin.common.exception.ApiException; +import com.dd.admin.common.security.jwt.JwtTokenUtil; +import com.dd.admin.common.security.jwt.service.JwtUserDetailsService; +import com.dd.admin.common.security.jwt.config.IgnoreConfig; +import com.dd.admin.common.utils.StringUtil; +import io.jsonwebtoken.ExpiredJwtException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.HashSet; +import java.util.Set; + +import static com.dd.admin.common.exception.enums.ApiExceptionEnum.TOKEN_ERROR; + + +@Component +@Slf4j +public class JwtRequestFilter extends OncePerRequestFilter { + @Autowired + private JwtUserDetailsService jwtUserDetailsService; + + @Autowired + private JwtTokenUtil jwtTokenUtil; + + @Value("${jwt.header}") + private String tokenHeader; + + @Autowired + IgnoreConfig ignoreConfig; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException , ApiException { + //放开过滤url + if(checkIgnores(ignoreConfig,request)){ + chain.doFilter(request, response); + return; + } + + SecurityContext context = SecurityContextHolder.getContext(); + //从请求头拿到token + final String requestTokenHeader = request.getHeader(tokenHeader); + + String username = null; + String jwtToken = null; + + // JWT报文表头的格式是"Bearer token". 去除"Bearer ",直接获取token + if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) { + jwtToken = requestTokenHeader.substring(7); + try { + //根据token获取用户名 + username = jwtTokenUtil.getUsernameFromToken(jwtToken); + } catch (IllegalArgumentException e) { + throw new ApiException(TOKEN_ERROR); + } catch (ExpiredJwtException e) { + throw new ApiException(TOKEN_ERROR); + } + } else { + throw new ApiException(TOKEN_ERROR); + } + + + if(context.getAuthentication() == null){ + //查看是否是后台 + if(StringUtil.isNotEmpty(username)){ + UserDetails userDetails = this.jwtUserDetailsService.loadUserByUsername(username); + // 查看token是否过期 + if (jwtTokenUtil.validateToken(jwtToken, userDetails)) { + setAuthentication(request,context,userDetails); + chain.doFilter(request, response); + return; + }else{ + throw new ApiException(TOKEN_ERROR); + } + } + } + + chain.doFilter(request, response); + } + + + //将自己需要的Authentication对象放入Spring Security中 + private void setAuthentication(HttpServletRequest request, SecurityContext context, UserDetails userDetails){ + UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken( + userDetails, null, userDetails.getAuthorities()); + usernamePasswordAuthenticationToken + .setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + context.setAuthentication(usernamePasswordAuthenticationToken); + } + + + public static boolean checkIgnores(IgnoreConfig ignoreConfig, HttpServletRequest request) { + String method = request.getMethod(); + Set ignores = new HashSet<>(); + HttpMethod httpMethod = HttpMethod.resolve(method); + if (httpMethod == null) { + httpMethod = HttpMethod.GET; + } + switch (httpMethod) { + case GET: + ignores.addAll(ignoreConfig.getGet()); + break; + case POST: + ignores.addAll(ignoreConfig.getPost()); + break; + default: + break; + } + ignores.addAll(ignoreConfig.getPattern()); + if (CollUtil.isNotEmpty(ignores)) { + for (String ignore : ignores) { + AntPathRequestMatcher matcher = new AntPathRequestMatcher(ignore, method); + if (matcher.matches(request)) { + return true; + } + } + } + return false; + } +} diff --git a/src/main/java/com/dd/admin/common/security/jwt/service/JwtUserDetailsService.java b/src/main/java/com/dd/admin/common/security/jwt/service/JwtUserDetailsService.java new file mode 100644 index 0000000..68f6ceb --- /dev/null +++ b/src/main/java/com/dd/admin/common/security/jwt/service/JwtUserDetailsService.java @@ -0,0 +1,63 @@ +package com.dd.admin.common.security.jwt.service; + +import cn.hutool.core.bean.BeanUtil; +import com.dd.admin.common.exception.ApiException; +import com.dd.admin.common.security.model.JwtUser; +import com.dd.admin.common.utils.StringUtil; +import com.dd.admin.system.menu.service.MenuService; +import com.dd.admin.system.user.domain.UserVo; +import com.dd.admin.system.user.service.UserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import static com.dd.admin.common.exception.enums.ApiExceptionEnum.USERNAME_IS_NOT_NULL; + +/** + * JwtUserDetailsService + * 实现UserDetailsService,重写loadUserByUsername方法 + * 如果你自己需要定制查询user的方法,请改造这里 + * @author zhengkai.blog.csdn.net + */ +@Service +@Slf4j +public class JwtUserDetailsService implements UserDetailsService{ + @Autowired + UserService userService; + @Autowired + MenuService menuService; + @Override + public UserDetails loadUserByUsername(String username) { + if(StringUtil.isEmpty(username)){ + throw new ApiException(USERNAME_IS_NOT_NULL); + } + UserVo user = userService.selectOneByUserName(username); + if(user == null){ + throw new UsernameNotFoundException("用户名或者密码错误!"); + } + JwtUser jwtUser = BeanUtil.copyProperties(user,JwtUser.class); +// //用户拥有的权限和角色 + List authorities = new ArrayList(); +// //添加权限 从所拥有的菜单和权限中获取自定义 权限 + Set perms = menuService.selectPermsByUserId(jwtUser.getUserId()); + perms.stream().forEach(perm->{ + authorities.add(new SimpleGrantedAuthority(perm)); + }); +// //添加角色 暂时用不到 后期从数据库获取 +// if(ADMIN_USER_NAME.equals(username)){ +// authorities.add(new SimpleGrantedAuthority("ROLE_ADMIN")); +// } + jwtUser.setAuthorities(authorities); + return jwtUser; + } +} + diff --git a/src/main/java/com/dd/admin/common/security/model/JwtUser.java b/src/main/java/com/dd/admin/common/security/model/JwtUser.java new file mode 100644 index 0000000..7b4a43a --- /dev/null +++ b/src/main/java/com/dd/admin/common/security/model/JwtUser.java @@ -0,0 +1,46 @@ +package com.dd.admin.common.security.model; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.Collection; + +@Data +public class JwtUser implements UserDetails { + + private static final long serialVersionUID = 1L; + + private String userId; + private String userName; + @JsonIgnore + private String password; + private Integer userType; + private String deptId; + private String deptName; + + private Collection authorities; + private boolean enabled; + + + @Override + public String getUsername() { + return this.userName; + } + + @Override + public boolean isAccountNonExpired() { + return true; //true 没有过期 + } + + @Override + public boolean isAccountNonLocked() { + return true; //true 没有上锁 + } + + @Override + public boolean isCredentialsNonExpired() { + return true; //true 没有失效 + } +} diff --git a/src/main/java/com/dd/admin/common/service/CommonService.java b/src/main/java/com/dd/admin/common/service/CommonService.java new file mode 100644 index 0000000..a2658ee --- /dev/null +++ b/src/main/java/com/dd/admin/common/service/CommonService.java @@ -0,0 +1,26 @@ +package com.dd.admin.common.service; + +import java.util.List; + +/** + + * Description: + + * date: 2021/6/15 + + * @author: wxl + + */ +public interface CommonService { + + public List generateSubs(List list, String idkey); + + /** + * 递归构建 + * @param parent + * @param subs + */ + public void buildSubs(T parent, List subs,String idkey); + + +} diff --git a/src/main/java/com/dd/admin/common/service/impl/CommonServiceImpl.java b/src/main/java/com/dd/admin/common/service/impl/CommonServiceImpl.java new file mode 100644 index 0000000..6e082d2 --- /dev/null +++ b/src/main/java/com/dd/admin/common/service/impl/CommonServiceImpl.java @@ -0,0 +1,58 @@ +package com.dd.admin.common.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.dd.admin.common.service.CommonService; +import com.dd.admin.common.utils.PropertyUtil; +import com.dd.admin.common.utils.StringUtil; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class CommonServiceImpl implements CommonService { + private final static String PARENTID = "parentId"; + private final static String CHILDREN = "children"; + + + + @Override + public List generateSubs(List list ,String idkey) { + //JDK8的stream处理,把根分类区分出来 + List roots = list.stream() + .filter(root ->{ + String parentId = String.valueOf(PropertyUtil.getProperty(root,PARENTID)); +// ||parentId.equals("0") + return StringUtil.isEmpty(parentId); + }) + .collect(Collectors.toList()); + //把非根分类区分出来 + List subs = list.stream() + .filter(sub -> { + String parentId = String.valueOf(PropertyUtil.getProperty(sub,PARENTID)); + return StringUtil.isNotEmpty(parentId); + }) + .collect(Collectors.toList()); + + roots.forEach(root -> { + buildSubs(root,subs, idkey); + }); + + return roots; + } + + @Override + public void buildSubs( T parent, List subs, String idkey) { + List children = subs.stream() + .filter(sub -> { + String parentId = String.valueOf(PropertyUtil.getProperty(sub,PARENTID)); + String id = String.valueOf(PropertyUtil.getProperty(parent,idkey)); + return parentId.equals(id); + }).collect(Collectors.toList()); + + if (CollectionUtil.isNotEmpty(children)) {//有子分类的情况 + PropertyUtil.setProperty(parent,CHILDREN,children); + children.forEach(child -> buildSubs(child, subs, idkey));//再次递归构建 + } + } +} diff --git a/src/main/java/com/dd/admin/common/utils/BigDecimalUtil.java b/src/main/java/com/dd/admin/common/utils/BigDecimalUtil.java new file mode 100644 index 0000000..1f9c631 --- /dev/null +++ b/src/main/java/com/dd/admin/common/utils/BigDecimalUtil.java @@ -0,0 +1,175 @@ +package com.dd.admin.common.utils; + +import java.math.BigDecimal; + +public class BigDecimalUtil { + // 除法运算默认精度 + private static final int DEF_DIV_SCALE = 10; + private static final BigDecimal ZERO = new BigDecimal(0); + + public static final BigDecimal ONE_HUNDRED = new BigDecimal(100); + + + private BigDecimalUtil() { + + } + + /** + * 精确加法 + */ + public static double add(double value1, double value2) { + BigDecimal b1 = BigDecimal.valueOf(value1); + BigDecimal b2 = BigDecimal.valueOf(value2); + return b1.add(b2).doubleValue(); + } + + /** + * 精确加法 + */ + public static double add(String value1, String value2) { + BigDecimal b1 = new BigDecimal(value1); + BigDecimal b2 = new BigDecimal(value2); + return b1.add(b2).doubleValue(); + } + + /** + * 精确减法 + */ + public static double sub(double value1, double value2) { + BigDecimal b1 = BigDecimal.valueOf(value1); + BigDecimal b2 = BigDecimal.valueOf(value2); + return b1.subtract(b2).doubleValue(); + } + + /** + * 精确减法 + */ + public static double sub(String value1, String value2) { + BigDecimal b1 = new BigDecimal(value1); + BigDecimal b2 = new BigDecimal(value2); + return b1.subtract(b2).doubleValue(); + } + + /** + * 精确乘法 + */ + public static double mul(double value1, double value2) { + BigDecimal b1 = BigDecimal.valueOf(value1); + BigDecimal b2 = BigDecimal.valueOf(value2); + return b1.multiply(b2).doubleValue(); + } + + /** + * 精确乘法 + */ + public static double mul(String value1, String value2) { + BigDecimal b1 = new BigDecimal(value1); + BigDecimal b2 = new BigDecimal(value2); + return b1.multiply(b2).doubleValue(); + } + + /** + * 精确除法 使用默认精度 + */ + public static double div(double value1, double value2) throws IllegalAccessException { + return div(value1, value2, DEF_DIV_SCALE); + } + + /** + * 精确除法 使用默认精度 + */ + public static double div(String value1, String value2) throws IllegalAccessException { + return div(value1, value2, DEF_DIV_SCALE); + } + + /** + * 精确除法 + * + * @param scale + * 精度 + */ + public static double div(double value1, double value2, int scale) throws IllegalAccessException { + if (scale < 0) { + throw new IllegalAccessException("精确度不能小于0"); + } + BigDecimal b1 = BigDecimal.valueOf(value1); + BigDecimal b2 = BigDecimal.valueOf(value2); + // return b1.divide(b2, scale).doubleValue(); + return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); + } + + /** + * 精确除法 + * + * @param scale + * 精度 + */ + public static double div(String value1, String value2, int scale) throws IllegalAccessException { + if (scale < 0) { + throw new IllegalAccessException("精确度不能小于0"); + } + BigDecimal b1 = new BigDecimal(value1); + BigDecimal b2 = new BigDecimal(value2); + // return b1.divide(b2, scale).doubleValue(); + return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); + } + + /** + * 四舍五入 + * + * @param scale + * 小数点后保留几位 + */ + public static double round(double v, int scale) throws IllegalAccessException { + return div(v, 1, scale); + } + + /** + * 四舍五入 + * + * @param scale + * 小数点后保留几位 + */ + public static double round(String v, int scale) throws IllegalAccessException { + return div(v, "1", scale); + } + + /** + * 比较大小 + */ + public static boolean equalTo(BigDecimal b1, BigDecimal b2) { + if (b1 == null || b2 == null) { + return false; + } + return 0 == b1.compareTo(b2); + } + // 是否大于0 + public static boolean isBiggerThanZero(BigDecimal value){ + return value.compareTo(ZERO) > 0 ; + } + + + public static BigDecimal add(BigDecimal v1,BigDecimal v2){ + return v1.add(v2); + } + + public static BigDecimal sub(BigDecimal v1,BigDecimal v2){ + return v1.subtract(v2); + } + + + public static BigDecimal mul(BigDecimal v1,BigDecimal v2){ + return v1.multiply(v2); + } + + public static BigDecimal div(BigDecimal v1,BigDecimal v2){ + return v1.divide(v2,2,BigDecimal.ROUND_HALF_UP);//四舍五入,保留2位小数 + //除不尽的情况 + } + + + public static BigDecimal div1(BigDecimal v1,BigDecimal v2){ + return v1.divide(v2,10,BigDecimal.ROUND_HALF_UP);//四舍五入,保留2位小数 + //除不尽的情况 + } +} diff --git a/src/main/java/com/dd/admin/common/utils/ColumnUtil.java b/src/main/java/com/dd/admin/common/utils/ColumnUtil.java new file mode 100644 index 0000000..9fd7f5b --- /dev/null +++ b/src/main/java/com/dd/admin/common/utils/ColumnUtil.java @@ -0,0 +1,46 @@ +package com.dd.admin.common.utils; + + +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; + +import java.lang.invoke.SerializedLambda; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class ColumnUtil { + public static String getName(SFunction fn) { + // 从function取出序列化方法 + Method writeReplaceMethod; + try { + writeReplaceMethod = fn.getClass().getDeclaredMethod("writeReplace"); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + + // 从序列化方法取出序列化的lambda信息 + boolean isAccessible = writeReplaceMethod.isAccessible(); + writeReplaceMethod.setAccessible(true); + SerializedLambda serializedLambda; + try { + serializedLambda = (SerializedLambda) writeReplaceMethod.invoke(fn); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + writeReplaceMethod.setAccessible(isAccessible); + + // 从lambda信息取出method、field、class等 + String fieldName = serializedLambda.getImplMethodName().substring("get".length()); + fieldName = fieldName.replaceFirst(fieldName.charAt(0) + "", (fieldName.charAt(0) + "").toLowerCase()); + Field field; + try { + field = Class.forName(serializedLambda.getImplClass().replace("/", ".")).getDeclaredField(fieldName); + } catch (ClassNotFoundException | NoSuchFieldException e) { + throw new RuntimeException(e); + } + + // 从field取出字段名,可以根据实际情况调整 + + return fieldName.replaceAll("[A-Z]", "_$0").toLowerCase(); + } +} diff --git a/src/main/java/com/dd/admin/common/utils/CommonUtil.java b/src/main/java/com/dd/admin/common/utils/CommonUtil.java new file mode 100644 index 0000000..33bd438 --- /dev/null +++ b/src/main/java/com/dd/admin/common/utils/CommonUtil.java @@ -0,0 +1,40 @@ +package com.dd.admin.common.utils; + + +import java.util.List; + +public class CommonUtil { + + /** + * 获取list 中的id 通过,相连 + * @return + */ + public static String getIds(List list,String idKey){ + StringBuffer stringBuffer = new StringBuffer(); + if(list==null||list.size()==0){ + return "''"; + }else{ + for(Object obj:list){ + String val = String.valueOf(PropertyUtil.getProperty(obj,idKey)); + stringBuffer.append("'"+val+"',"); + } + } + return stringBuffer.deleteCharAt(stringBuffer.length()-1).toString(); + } + + /** + * 获取list 中的id 通过,相连 + * @return + */ + public static String coverIds(List list){ + StringBuffer stringBuffer = new StringBuffer(); + if(list==null||list.size()==0){ + return "''"; + }else{ + for(String val:list){ + stringBuffer.append("'"+val+"',"); + } + } + return stringBuffer.deleteCharAt(stringBuffer.length()-1).toString(); + } +} diff --git a/src/main/java/com/dd/admin/common/utils/HttpContext.java b/src/main/java/com/dd/admin/common/utils/HttpContext.java new file mode 100644 index 0000000..7393395 --- /dev/null +++ b/src/main/java/com/dd/admin/common/utils/HttpContext.java @@ -0,0 +1 @@ +package com.dd.admin.common.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.util.Enumeration; import java.util.HashMap; import java.util.Map; /** * 快捷获取HttpServletRequest,HttpServletResponse * * @author stylefeng * @Date 2018/1/4 21:24 */ public class HttpContext { /** * 判断是否是ajax请求 */ public static boolean isAjax(HttpServletRequest httpRequest) { return (httpRequest.getHeader("X-Requested-With") != null && "XMLHttpRequest" .equalsIgnoreCase(httpRequest.getHeader("X-Requested-With").toString())); } public static void write(Object object) throws IOException { HttpServletResponse response = getResponse(); OutputStream out = null; try { response.reset(); response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With"); response.setHeader("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS"); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json"); out = response.getOutputStream(); out.write(JSON.toJSONString(object, SerializerFeature.WriteMapNullValue).getBytes()); } catch (Exception e) { } finally { if (out != null) { out.flush(); out.close(); } } } /** * 获取请求的ip地址 * * @author fengshuonan * @Date 2018/7/23 下午3:44 */ public static String getIp() { HttpServletRequest request = getRequest(); if (request == null) { return "127.0.0.1"; } else { return request.getRemoteHost(); } } /** * 获取当前请求的Request对象 * * @author fengshuonan * @Date 2018/7/23 下午3:44 */ public static HttpServletRequest getRequest() { ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (requestAttributes == null) { return null; } else { return requestAttributes.getRequest(); } } /** * 获取当前请求的Response对象 * * @author fengshuonan * @Date 2018/7/23 下午3:44 */ public static HttpServletResponse getResponse() { ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (requestAttributes == null) { return null; } else { return requestAttributes.getResponse(); } } /** * 获取所有请求的值 * * @author fengshuonan * @Date 2018/7/23 下午3:44 */ public static Map getRequestParameters() { HashMap values = new HashMap<>(); HttpServletRequest request = getRequest(); if (request == null) { return values; } Enumeration enums = request.getParameterNames(); while (enums.hasMoreElements()) { String paramName = (String) enums.nextElement(); String paramValue = request.getParameter(paramName); values.put(paramName, paramValue); } return values; } } \ No newline at end of file diff --git a/src/main/java/com/dd/admin/common/utils/IPUtils.java b/src/main/java/com/dd/admin/common/utils/IPUtils.java new file mode 100644 index 0000000..a4403b6 --- /dev/null +++ b/src/main/java/com/dd/admin/common/utils/IPUtils.java @@ -0,0 +1 @@ +package com.dd.admin.common.utils; import javax.servlet.http.HttpServletRequest; public class IPUtils { /** * 获取IP地址 * * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址 * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址 */ public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip; } } \ No newline at end of file diff --git a/src/main/java/com/dd/admin/common/utils/PropertyUtil.java b/src/main/java/com/dd/admin/common/utils/PropertyUtil.java new file mode 100644 index 0000000..20d7dc6 --- /dev/null +++ b/src/main/java/com/dd/admin/common/utils/PropertyUtil.java @@ -0,0 +1,91 @@ +package com.dd.admin.common.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.beans.IntrospectionException; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +public class PropertyUtil { + + private static Logger logger = LoggerFactory.getLogger("PropertyUtil"); + + private static final String SET_PREFIX = "set"; + private static final String IS_PREFIX = "is"; + private static final String GET_PREFIX = "get"; + + public static PropertyDescriptor getPropertyDescriptor(Class clazz, String propertyName) {//根据需求,定制 自己的get和set方法 + Method setMethod = null; + Method getMethod = null; + PropertyDescriptor pd = null; + try { + Field field = clazz.getDeclaredField(propertyName);// 根据字段名来获取字段 + if (field != null) { + // 构建方法的后缀 + String methodEnd = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1); + setMethod = clazz.getDeclaredMethod(SET_PREFIX + methodEnd, new Class[] { field.getType() }); + // 构建get 方法 + getMethod = clazz.getDeclaredMethod(GET_PREFIX + methodEnd, new Class[] {}); + // 构建一个属性描述器 把对应属性 propertyName 的 get 和 set 方法保存到属性描述器中 + pd = new PropertyDescriptor(propertyName, getMethod, setMethod); + } + } catch (Exception ex) { + logger.error("getPropertyDescriptor error,msg:"+ex.getMessage()); + } + + return pd; + } + + public static PropertyDescriptor getPropertyDescriptor2(Class clazz, String propertyName) {//使用 PropertyDescriptor 提供的 get和set方法 + try { + return new PropertyDescriptor(propertyName, clazz); + } catch (IntrospectionException e) { + logger.error(" getPropertyDescriptor2 error,msg:"+e.getMessage()); + } + return null; + } + + public static void setProperty(Object obj, String propertyName, Object value) { + Class clazz = obj.getClass();// 获取对象的类型 + propertyName = formatProperty(propertyName);//字段中的下划线处理 + PropertyDescriptor pd = getPropertyDescriptor(clazz, propertyName);// 获取 clazz类型中的propertyName的属性描述器 + Method setMethod = pd.getWriteMethod();// 从属性描述器中获取 set 方法 + try { + setMethod.invoke(obj, new Object[] { value });// 调用 set 方法将传入的value值保存属性中去 + } catch (Exception e) { + logger.error(" setProperty error,msg:"+e.getMessage()); + } + } + + public static Object getProperty(Object obj, String propertyName) { + Class clazz = obj.getClass();// 获取对象的类型 + propertyName = formatProperty(propertyName);//字段中的下划线处理 + PropertyDescriptor pd = getPropertyDescriptor(clazz, propertyName);// 获取clazz类型中的propertyName的属性描述器 + Method getMethod = pd.getReadMethod();// 从属性描述器中获取 get 方法 + Object value = null; + try { + value = getMethod.invoke(obj, new Object[] {});// 调用方法获取方法的返回值 + } catch (Exception e) { + logger.error(" getProperty error,msg:"+e.getMessage()); + } + return value;// 返回值 + } + + public static String formatProperty(String propertyName) { + if (propertyName.contains("_")) { + String[] tmp = propertyName.split("_"); + StringBuilder sb = new StringBuilder(); + sb.append(tmp[0]); + for (int i = 1; i < tmp.length; i++) { + sb.append(tmp[i].substring(0, 1).toUpperCase()).append(tmp[i].substring(1)); + } + return sb.toString(); + }else { + return propertyName; + } + } + + +} diff --git a/src/main/java/com/dd/admin/common/utils/StringUtil.java b/src/main/java/com/dd/admin/common/utils/StringUtil.java new file mode 100644 index 0000000..186396e --- /dev/null +++ b/src/main/java/com/dd/admin/common/utils/StringUtil.java @@ -0,0 +1,75 @@ +package com.dd.admin.common.utils; + + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; + +public class StringUtil { + + public static boolean isEmpty(String str){ + if(null==str||str.trim().equals("")||"null".equals(str)){ + return true; + } + return false; + } + + public static boolean isNotEmpty(String str){ + if(null==str||str.trim().equals("")||"null".equals(str)){ + return false; + } + return true; + } + + public static String getNumberForPK(){ + String id=""; + SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmm"); + String temp = sf.format(new Date()); + id=temp; + return id; + } + + public static String getDateStringNow(){ + String id=""; + SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss"); + String temp = sf.format(new Date()); + id=temp; + return id; + } + + public static String createCode(Integer len){ + String zi = "0123456789"; + String ret = ""; + Random random = new Random(); + for (int i =0;i en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) { NetworkInterface intf = en.nextElement(); for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress() && !inetAddress.isLinkLocalAddress() && inetAddress.isSiteLocalAddress()) { IFCONFIG.append(inetAddress.getHostAddress().toString() + "\n"); } } } return IFCONFIG.toString(); } catch (SocketException ex) { ex.printStackTrace(); } try { return InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { e.printStackTrace(); } return null; } /** * 拷贝属性,为null的不拷贝 * * @author fengshuonan * @Date 2018/7/25 下午4:41 */ public static void copyProperties(Object source, Object target) { BeanUtil.copyProperties(source, target, CopyOptions.create().setIgnoreNullValue(true)); } /** * 判断是否是windows操作系统 * * @author stylefeng * @Date 2017/5/24 22:34 */ public static Boolean isWinOs() { String os = System.getProperty("os.name"); if (os.toLowerCase().startsWith("win")) { return true; } else { return false; } } /** * 获取临时目录 * * @author * @Date 2017/5/24 22:35 */ public static String getTempPath() { return System.getProperty("java.io.tmpdir"); } /** * 把一个数转化为int * * @author fengshuonan * @Date 2017/11/15 下午11:10 */ public static Integer toInt(Object val) { if (val instanceof Double) { BigDecimal bigDecimal = new BigDecimal((Double) val); return bigDecimal.intValue(); } else { return Integer.valueOf(val.toString()); } } /** * 是否为数字 * * @author fengshuonan * @Date 2017/11/15 下午11:10 */ public static boolean isNum(Object obj) { try { Integer.parseInt(obj.toString()); } catch (Exception e) { return false; } return true; } /** * 获取项目路径 * * @author fengshuonan * @Date 2017/11/15 下午11:10 */ public static String getWebRootPath(String filePath) { try { String path = ToolUtil.class.getClassLoader().getResource("").toURI().getPath(); path = path.replace("/WEB-INF/classes/", ""); path = path.replace("/target/classes/", ""); path = path.replace("file:/", ""); if (ToolUtil.isEmpty(filePath)) { return path; } else { return path + "/" + filePath; } } catch (URISyntaxException e) { throw new RuntimeException(e); } } /** * 获取文件后缀名 不包含点 * * @author fengshuonan * @Date 2017/11/15 下午11:10 */ public static String getFileSuffix(String fileWholeName) { if (ToolUtil.isEmpty(fileWholeName)) { return "none"; } int lastIndexOf = fileWholeName.lastIndexOf("."); return fileWholeName.substring(lastIndexOf + 1); } /** * 判断一个对象是否是时间类型 * * @author * @Date 2017/4/18 12:55 */ public static String dateType(Object o) { if (o instanceof Date) { return DateUtil.formatDate((Date) o); } else { return o.toString(); } } /** * 当前时间 * * @author * @Date 2017/5/7 21:56 */ public static String currentTime() { return DateUtil.formatDateTime(new Date()); } } \ No newline at end of file diff --git a/src/main/java/com/dd/admin/common/utils/ValidateUtil.java b/src/main/java/com/dd/admin/common/utils/ValidateUtil.java new file mode 100644 index 0000000..9e57e20 --- /dev/null +++ b/src/main/java/com/dd/admin/common/utils/ValidateUtil.java @@ -0,0 +1 @@ +package com.dd.admin.common.utils; import java.util.List; import java.util.Map; import java.util.Set; /** * 空参数校验工具类 * * @author * @date 2018-08-08-下午3:15 */ public class ValidateUtil { /** * 对象是否不为空(新增) * * @author * @Date 2018/3/18 21:57 */ public static boolean isNotEmpty(Object o) { return !isEmpty(o); } /** * 对象是否为空 * * @author * @Date 2018/3/18 21:57 */ public static boolean isEmpty(Object o) { if (o == null) { return true; } if (o instanceof String) { if (o.toString().trim().equals("")) { return true; } } else if (o instanceof List) { if (((List) o).size() == 0) { return true; } } else if (o instanceof Map) { if (((Map) o).size() == 0) { return true; } } else if (o instanceof Set) { if (((Set) o).size() == 0) { return true; } } else if (o instanceof Object[]) { if (((Object[]) o).length == 0) { return true; } } else if (o instanceof int[]) { if (((int[]) o).length == 0) { return true; } } else if (o instanceof long[]) { if (((long[]) o).length == 0) { return true; } } return false; } /** * 对象组中是否存在空对象 * * @author * @Date 2018/3/18 21:59 */ public static boolean isOneEmpty(Object... os) { for (Object o : os) { if (isEmpty(o)) { return true; } } return false; } /** * 对象组中是否全是空对象 * * @author * @Date 2018/3/18 21:59 */ public static boolean isAllEmpty(Object... os) { for (Object o : os) { if (!isEmpty(o)) { return false; } } return true; } } \ No newline at end of file diff --git a/src/main/java/com/dd/admin/system/dept/controller/DeptController.java b/src/main/java/com/dd/admin/system/dept/controller/DeptController.java new file mode 100644 index 0000000..526ba16 --- /dev/null +++ b/src/main/java/com/dd/admin/system/dept/controller/DeptController.java @@ -0,0 +1,105 @@ +package com.dd.admin.system.dept.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.dd.admin.common.service.CommonService; +import com.dd.admin.common.utils.ColumnUtil; +import com.dd.admin.system.dept.domain.DeptDto; +import com.dd.admin.system.dept.domain.DeptTree; +import com.dd.admin.system.dept.domain.DeptVo; +import com.dd.admin.system.dept.entity.Dept; +import com.dd.admin.system.dept.service.DeptService; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + *

+ * 机构 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Api(tags = "机构") +@RestController +public class DeptController { + + @Autowired + DeptService deptService; + + @Autowired + CommonService commonService; + + @ApiOperation(value = "机构-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/dept/page") + public ResultBean> page(DeptDto deptDto) { + IPage pageInfo = deptService.selectDeptPage(deptDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "机构-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/dept/list") + public ResultBean> list(DeptDto deptDto) { + List list = deptService.selectDeptList(deptDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "机构-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/dept/add") + public ResultBean add(@RequestBody @Validated DeptDto deptDto) { + Dept dept = BeanUtil.copyProperties(deptDto, Dept.class); + Dept parentDept = deptService.getById(deptDto.getParentId()); + dept.setParentIds(parentDept.getParentIds()+ parentDept.getDeptId()+ ","); + dept.setParentName(parentDept.getDeptName()); + deptService.save(dept); + return ResultBean.success(dept); + } + + @ApiOperation(value = "机构-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/dept/{deptId}") + public ResultBean get(@PathVariable @NotBlank String deptId) { + Dept dept = deptService.getById(deptId); + DeptVo deptVo = BeanUtil.copyProperties(dept,DeptVo.class); + return ResultBean.success(deptVo); + } + + @ApiOperation(value = "机构-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/dept/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) DeptDto deptDto) { + Dept dept = BeanUtil.copyProperties(deptDto, Dept.class); + deptService.updateById(dept); + return ResultBean.success(dept); + } + + @ApiOperation(value = "机构-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/dept/delete/{deptId}") + public ResultBean delete(@PathVariable @NotBlank String deptId) { + Boolean b = deptService.removeById(deptId); + return ResultBean.success(b); + } + + @ApiOperation(value = "机构-tree") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/dept/tree") + public ResultBean> tree() { + List deptList = deptService.list(); + List treeList = BeanUtil.copyToList(deptList,DeptTree.class); + List tree = commonService.generateSubs(treeList, ColumnUtil.getName(DeptTree::getDeptId)); + return ResultBean.success(tree); + } +} diff --git a/src/main/java/com/dd/admin/system/dept/domain/DeptDto.java b/src/main/java/com/dd/admin/system/dept/domain/DeptDto.java new file mode 100644 index 0000000..7341389 --- /dev/null +++ b/src/main/java/com/dd/admin/system/dept/domain/DeptDto.java @@ -0,0 +1,76 @@ +package com.dd.admin.system.dept.domain; + +import com.dd.admin.common.model.UpdateGroup; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.Date; + + +/** + *

+ * 机构返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Data +@ApiModel(value="机构接收对象") +public class DeptDto { + + + @ApiModelProperty(value = "机构id") + @NotBlank(message = "机构id不能为空",groups = UpdateGroup.class) + private String deptId; + + @ApiModelProperty(value = "机构名称") + private String deptName; + + @ApiModelProperty(value = "机构编号") + private String deptNo; + + @ApiModelProperty(value = "上级id") + private String parentId; + + @ApiModelProperty(value = "上级机构") + private String parentName; + + @ApiModelProperty(value = "上级id集合") + private String parentIds; + + @ApiModelProperty(value = "过期时间") + @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8") + private Date expireDate; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + + @ApiModelProperty(value = "省") + private String province; + + @ApiModelProperty(value = "市 ") + private String city; + + @ApiModelProperty(value = "区") + private String area; +} diff --git a/src/main/java/com/dd/admin/system/dept/domain/DeptTree.java b/src/main/java/com/dd/admin/system/dept/domain/DeptTree.java new file mode 100644 index 0000000..214f43c --- /dev/null +++ b/src/main/java/com/dd/admin/system/dept/domain/DeptTree.java @@ -0,0 +1,21 @@ +package com.dd.admin.system.dept.domain; + +import com.dd.admin.system.dept.entity.Dept; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel(value="机构返回对象") +public class DeptTree extends Dept { + @ApiModelProperty(value = "上级id") + private String parentId; + + @ApiModelProperty(value = "机构id") + private String deptId; + + @ApiModelProperty(value = "下级机构") + private List children; +} diff --git a/src/main/java/com/dd/admin/system/dept/domain/DeptVo.java b/src/main/java/com/dd/admin/system/dept/domain/DeptVo.java new file mode 100644 index 0000000..b34ef80 --- /dev/null +++ b/src/main/java/com/dd/admin/system/dept/domain/DeptVo.java @@ -0,0 +1,70 @@ +package com.dd.admin.system.dept.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.Date; + +/** + *

+ * 机构返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Data +@ApiModel(value="机构返回对象") +public class DeptVo { + + + @ApiModelProperty(value = "机构id") + private String deptId; + + @ApiModelProperty(value = "机构名称") + private String deptName; + + @ApiModelProperty(value = "机构编号") + private String deptNo; + + @ApiModelProperty(value = "上级id") + private String parentId; + + @ApiModelProperty(value = "上级机构") + private String parentName; + + @ApiModelProperty(value = "上级id集合") + private String parentIds; + + @ApiModelProperty(value = "过期时间") + private Date expireDate; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "省") + private String province; + + @ApiModelProperty(value = "市 ") + private String city; + + @ApiModelProperty(value = "区") + private String area; +} diff --git a/src/main/java/com/dd/admin/system/dept/entity/Dept.java b/src/main/java/com/dd/admin/system/dept/entity/Dept.java new file mode 100644 index 0000000..c3184a3 --- /dev/null +++ b/src/main/java/com/dd/admin/system/dept/entity/Dept.java @@ -0,0 +1,95 @@ +package com.dd.admin.system.dept.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 机构 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_dept") +@ApiModel(value="Dept对象", description="机构") +public class Dept implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "机构id") + @TableId(value = "DEPT_ID", type = IdType.ASSIGN_UUID) + private String deptId; + + @ApiModelProperty(value = "机构名称") + @TableField(value = "DEPT_NAME", fill = FieldFill.INSERT) + private String deptName; + + @ApiModelProperty(value = "机构编号") + @TableField("DEPT_NO") + private String deptNo; + + @ApiModelProperty(value = "上级id") + @TableField("PARENT_ID") + private String parentId; + + @ApiModelProperty(value = "上级机构") + @TableField("PARENT_NAME") + private String parentName; + + @ApiModelProperty(value = "上级id集合") + @TableField("PARENT_IDS") + private String parentIds; + + + @ApiModelProperty(value = "省") + @TableField("PROVINCE") + private String province; + + @ApiModelProperty(value = "市 ") + @TableField("PARENT_IDS") + private String CITY; + + @ApiModelProperty(value = "区") + @TableField("PARENT_IDS") + private String AREA; + + + @ApiModelProperty(value = "过期时间") + @TableField("EXPIRE_DATE") + private Date expireDate; + + @ApiModelProperty(value = "备注") + @TableField("REMARK") + private String remark; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "修改人") + @TableField(value = "UPDATE_NAME", fill = FieldFill.UPDATE) + private String updateName; + + +} diff --git a/src/main/java/com/dd/admin/system/dept/mapper/DeptMapper.java b/src/main/java/com/dd/admin/system/dept/mapper/DeptMapper.java new file mode 100644 index 0000000..532ffb8 --- /dev/null +++ b/src/main/java/com/dd/admin/system/dept/mapper/DeptMapper.java @@ -0,0 +1,28 @@ +package com.dd.admin.system.dept.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.system.dept.entity.Dept; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.system.dept.domain.DeptVo; +import com.dd.admin.system.dept.domain.DeptDto; + +import java.util.List; + +/** + *

+ * 机构 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Mapper +public interface DeptMapper extends BaseMapper { + + IPage selectDeptPage(Page page, @Param("deptDto") DeptDto deptDto); + + List selectDeptList(@Param("deptDto") DeptDto deptDto); +} diff --git a/src/main/java/com/dd/admin/system/dept/mapper/xml/DeptMapper.xml b/src/main/java/com/dd/admin/system/dept/mapper/xml/DeptMapper.xml new file mode 100644 index 0000000..2c29962 --- /dev/null +++ b/src/main/java/com/dd/admin/system/dept/mapper/xml/DeptMapper.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + DEPT_ID, DEPT_NAME, DEPT_NO, PARENT_ID, PARENT_NAME, PARENT_IDS, + PROVINCE ,CITY ,AREA + EXPIRE_DATE, REMARK, CREATE_TIME, CREATE_NAME, CREATE_ID, UPDATE_TIME, UPDATE_NAME + + + + + + diff --git a/src/main/java/com/dd/admin/system/dept/service/DeptService.java b/src/main/java/com/dd/admin/system/dept/service/DeptService.java new file mode 100644 index 0000000..f5ca3cc --- /dev/null +++ b/src/main/java/com/dd/admin/system/dept/service/DeptService.java @@ -0,0 +1,26 @@ +package com.dd.admin.system.dept.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.system.dept.entity.Dept; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.system.dept.domain.DeptVo; +import com.dd.admin.system.dept.domain.DeptDto; +import java.util.List; + +/** + *

+ * 机构 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +public interface DeptService extends IService { + + //机构-分页列表 + IPage selectDeptPage(DeptDto deptDto); + + //机构-列表 + List selectDeptList(DeptDto deptDto); + +} diff --git a/src/main/java/com/dd/admin/system/dept/service/impl/DeptServiceImpl.java b/src/main/java/com/dd/admin/system/dept/service/impl/DeptServiceImpl.java new file mode 100644 index 0000000..01b36c1 --- /dev/null +++ b/src/main/java/com/dd/admin/system/dept/service/impl/DeptServiceImpl.java @@ -0,0 +1,36 @@ +package com.dd.admin.system.dept.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.system.dept.entity.Dept; +import com.dd.admin.system.dept.mapper.DeptMapper; +import com.dd.admin.system.dept.service.DeptService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.dd.admin.system.dept.domain.DeptVo; +import com.dd.admin.system.dept.domain.DeptDto; +import java.util.List; + +/** + *

+ * 机构 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Service +public class DeptServiceImpl extends ServiceImpl implements DeptService { + + @Override + public IPage selectDeptPage(DeptDto deptDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectDeptPage(page,deptDto); + } + + @Override + public List selectDeptList(DeptDto deptDto) { + return baseMapper.selectDeptList(deptDto); + } +} diff --git a/src/main/java/com/dd/admin/system/login/LoginController.java b/src/main/java/com/dd/admin/system/login/LoginController.java new file mode 100644 index 0000000..fdbe31e --- /dev/null +++ b/src/main/java/com/dd/admin/system/login/LoginController.java @@ -0,0 +1,94 @@ +package com.dd.admin.system.login; + +import cn.hutool.core.bean.BeanUtil; +import com.dd.admin.common.aop.operationLog.aop.OperLog; +import com.dd.admin.common.aop.operationLog.aop.OperType; +import com.dd.admin.common.exception.ApiException; +import com.dd.admin.common.model.result.ResultBean; +import com.dd.admin.common.security.SecurityUtil; +import com.dd.admin.common.security.jwt.JwtTokenUtil; +import com.dd.admin.common.security.model.JwtUser; +import com.dd.admin.common.service.CommonService; +import com.dd.admin.common.utils.ColumnUtil; +import com.dd.admin.system.login.domain.LoginDto; +import com.dd.admin.system.login.domain.LoginVo; +import com.dd.admin.system.menu.domain.MenuVo; +import com.dd.admin.system.menu.domain.Meta; +import com.dd.admin.system.menu.domain.RouteVo; +import com.dd.admin.system.menu.service.MenuService; +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import static com.dd.admin.common.consts.SystemConst.AUTH_MENU; +import static com.dd.admin.common.consts.SystemConst.MENU_CACHE; +import static com.dd.admin.common.exception.enums.ApiExceptionEnum.USERNAME_OR_PASSWORD_ERROR; + +@Api(tags = "登陆") +@RestController +public class LoginController { + + @Autowired + UserDetailsService userDetailsService; + @Autowired + PasswordEncoder encoder; + @Autowired + JwtTokenUtil jwtTokenUtil; + @Autowired + MenuService menuService; + @Autowired + CommonService commonService; + + @RequestMapping("/admin/login") + @OperLog(operModule = "登陆",operType = OperType.OTHER,operDesc = "后台人员登陆操作") + public ResultBean login(@RequestBody LoginDto loginDto){ + final JwtUser userDetails = (JwtUser) userDetailsService.loadUserByUsername(loginDto.getUsername()); + String password = loginDto.getPassword(); + Boolean b = encoder.matches(password,userDetails.getPassword()); + if(!b){ + throw new ApiException(USERNAME_OR_PASSWORD_ERROR); + } + final String token = jwtTokenUtil.generateToken(userDetails); + return ResultBean.success(new LoginVo().setToken(token)); + } + + @RequestMapping("/admin/user/info") + public ResultBean info(){ + JwtUser jwtUser = SecurityUtil.getLoginUser(); + return ResultBean.success(jwtUser); + } + + @RequestMapping("/admin/user/logout") + public ResultBean logout(){ + return ResultBean.success(); + } + + @RequestMapping("/admin/user/getroutes") + public ResultBean getroutes(){ + List menuVoList = menuService.selectMenuByUserId(SecurityUtil.getLoginUser().getUserId()); + menuVoList = menuVoList.stream().filter(menuVo -> menuVo.getMenuType().equals(AUTH_MENU)).collect(Collectors.toList()); + menuVoList.add(new MenuVo().setMenuId("0").setMenuTitle("顶级")); + List list = menuVoList.stream().map(menuVo -> { + RouteVo routeVo = BeanUtil.copyProperties(menuVo, RouteVo.class); + routeVo.setName(menuVo.getMenuName()); + routeVo.setPath(menuVo.getMenuPath()); + Meta meta = new Meta(menuVo.getMenuTitle(),menuVo.getMenuIcon(),!MENU_CACHE.equals(menuVo.getMenuCache())); + routeVo.setMeta(meta); + return routeVo; + }).collect(Collectors.toList()); + + List router = commonService.generateSubs(list, ColumnUtil.getName(RouteVo::getMenuId)); + if(router.get(0).getChildren()!=null){ + return ResultBean.success(router.get(0).getChildren()); + } + return ResultBean.success(new ArrayList<>()); + } +} diff --git a/src/main/java/com/dd/admin/system/login/domain/LoginDto.java b/src/main/java/com/dd/admin/system/login/domain/LoginDto.java new file mode 100644 index 0000000..f2397db --- /dev/null +++ b/src/main/java/com/dd/admin/system/login/domain/LoginDto.java @@ -0,0 +1,10 @@ +package com.dd.admin.system.login.domain; + +import lombok.Data; +import lombok.experimental.Accessors; +@Data +@Accessors(chain = true) +public class LoginDto { + private String username; + private String password; +} diff --git a/src/main/java/com/dd/admin/system/login/domain/LoginVo.java b/src/main/java/com/dd/admin/system/login/domain/LoginVo.java new file mode 100644 index 0000000..5a1570c --- /dev/null +++ b/src/main/java/com/dd/admin/system/login/domain/LoginVo.java @@ -0,0 +1,10 @@ +package com.dd.admin.system.login.domain; + +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +public class LoginVo { + private String token; +} diff --git a/src/main/java/com/dd/admin/system/login/domain/Routes.java b/src/main/java/com/dd/admin/system/login/domain/Routes.java new file mode 100644 index 0000000..6227c9f --- /dev/null +++ b/src/main/java/com/dd/admin/system/login/domain/Routes.java @@ -0,0 +1,11 @@ +package com.dd.admin.system.login.domain; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class Routes { + private List list = new ArrayList(); +} diff --git a/src/main/java/com/dd/admin/system/menu/controller/MenuController.java b/src/main/java/com/dd/admin/system/menu/controller/MenuController.java new file mode 100644 index 0000000..32746fe --- /dev/null +++ b/src/main/java/com/dd/admin/system/menu/controller/MenuController.java @@ -0,0 +1,106 @@ +package com.dd.admin.system.menu.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.dd.admin.common.service.CommonService; +import com.dd.admin.common.utils.ColumnUtil; +import com.dd.admin.system.menu.domain.MenuDto; +import com.dd.admin.system.menu.domain.MenuTree; +import com.dd.admin.system.menu.domain.MenuVo; +import com.dd.admin.system.menu.entity.Menu; +import com.dd.admin.system.menu.service.MenuService; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotBlank; +import java.util.List; + +/** + *

+ * 菜单 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-05 + */ +@Api(tags = "菜单") +@RestController +public class MenuController { + + @Autowired + MenuService menuService; + @Autowired + CommonService commonService; + + @ApiOperation(value = "菜单-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/menu/page") + public ResultBean> page(MenuDto menuDto) { + IPage pageInfo = menuService.selectMenuPage(menuDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "菜单-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/menu/list") + public ResultBean> list(MenuDto menuDto) { + List list = menuService.selectMenuList(menuDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "菜单-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/menu/add") + public ResultBean add(@RequestBody @Validated MenuDto menuDto) { + Menu menu = BeanUtil.copyProperties(menuDto, Menu.class); + menuService.save(menu); + return ResultBean.success(menu); + } + + @ApiOperation(value = "菜单-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/menu/{menuId}") + public ResultBean get(@PathVariable @NotBlank String menuId) { + Menu menu = menuService.getById(menuId); + MenuVo menuVo = BeanUtil.copyProperties(menu,MenuVo.class); + return ResultBean.success(menuVo); + } + + @ApiOperation(value = "菜单-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/menu/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) MenuDto menuDto) { + Menu menu = BeanUtil.copyProperties(menuDto, Menu.class); + menuService.updateById(menu); + return ResultBean.success(menu); + } + + @ApiOperation(value = "菜单-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/menu/delete/{menuId}") + public ResultBean delete(@PathVariable @NotBlank String menuId) { + Boolean b = menuService.removeById(menuId); + return ResultBean.success(b); + } + + + @ApiOperation(value = "菜单-tree") + @ApiOperationSupport(order = 7) + @GetMapping("/admin/menu/tree") + public ResultBean> tree() { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.orderByAsc(Menu::getMenuSort); + List menuList = menuService.list(lambdaQueryWrapper); + List treeList = BeanUtil.copyToList(menuList, MenuTree.class); + treeList.add(new MenuTree().buildTopMenu()); + List tree = commonService.generateSubs(treeList, ColumnUtil.getName(MenuTree::getMenuId)); + return ResultBean.success(tree); + } +} diff --git a/src/main/java/com/dd/admin/system/menu/domain/MenuDto.java b/src/main/java/com/dd/admin/system/menu/domain/MenuDto.java new file mode 100644 index 0000000..c741361 --- /dev/null +++ b/src/main/java/com/dd/admin/system/menu/domain/MenuDto.java @@ -0,0 +1,76 @@ +package com.dd.admin.system.menu.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.dd.admin.common.model.UpdateGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.Date; + + +/** + *

+ * 菜单返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-05 + */ +@Data +@ApiModel(value="菜单接收对象") +public class MenuDto { + + + @NotBlank(message = "菜单id不能为空",groups = UpdateGroup.class) + private String menuId; + + @ApiModelProperty(value = "父级id") + private String parentId; + + @ApiModelProperty(value = "菜单标题") + private String menuTitle; + + @ApiModelProperty(value = "菜单名") + private String menuName; + + @ApiModelProperty(value = "菜单图标") + private String menuIcon; + + @ApiModelProperty(value = "菜单文件路径") + private String menuPath; + + @ApiModelProperty(value = "组件") + private String component; + + @ApiModelProperty(value = "权限标识") + private String perms; + + @ApiModelProperty(value = "菜单类型 1菜单 2权限") + private Integer menuType; + + @ApiModelProperty(value = "页面缓存 1开启 0关闭") + private Integer menuCache; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "组件") + private String menuSort; +} diff --git a/src/main/java/com/dd/admin/system/menu/domain/MenuTree.java b/src/main/java/com/dd/admin/system/menu/domain/MenuTree.java new file mode 100644 index 0000000..4c2f3a2 --- /dev/null +++ b/src/main/java/com/dd/admin/system/menu/domain/MenuTree.java @@ -0,0 +1,30 @@ +package com.dd.admin.system.menu.domain; + +import com.dd.admin.system.menu.entity.Menu; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel(value="菜单接收对象") +public class MenuTree extends Menu { + + @ApiModelProperty(value = "菜单id") + private String menuId; + + @ApiModelProperty(value = "父级id") + private String parentId; + + @ApiModelProperty(value = "下级菜单") + private List children; + + + public MenuTree buildTopMenu(){ + MenuTree menuTree = new MenuTree(); + menuTree.setMenuId("0"); + menuTree.setMenuTitle("顶级"); + return menuTree; + } +} diff --git a/src/main/java/com/dd/admin/system/menu/domain/MenuVo.java b/src/main/java/com/dd/admin/system/menu/domain/MenuVo.java new file mode 100644 index 0000000..ce5f78f --- /dev/null +++ b/src/main/java/com/dd/admin/system/menu/domain/MenuVo.java @@ -0,0 +1,72 @@ +package com.dd.admin.system.menu.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + *

+ * 菜单返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-05 + */ +@Data +@ApiModel(value="菜单返回对象") +@Accessors(chain = true) +public class MenuVo { + + + private String menuId; + + @ApiModelProperty(value = "父级id") + private String parentId; + + @ApiModelProperty(value = "菜单标题") + private String menuTitle; + + @ApiModelProperty(value = "菜单名") + private String menuName; + + @ApiModelProperty(value = "菜单图标") + private String menuIcon; + + @ApiModelProperty(value = "菜单文件路径") + private String menuPath; + + @ApiModelProperty(value = "组件") + private String component; + + @ApiModelProperty(value = "权限标识") + private String perms; + + @ApiModelProperty(value = "菜单类型 1菜单 2权限") + private Integer menuType; + + @ApiModelProperty(value = "页面缓存 1开启 0关闭") + private Integer menuCache; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + +} diff --git a/src/main/java/com/dd/admin/system/menu/domain/Meta.java b/src/main/java/com/dd/admin/system/menu/domain/Meta.java new file mode 100644 index 0000000..f2bda2b --- /dev/null +++ b/src/main/java/com/dd/admin/system/menu/domain/Meta.java @@ -0,0 +1,18 @@ +package com.dd.admin.system.menu.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@AllArgsConstructor //有参构造 +public class Meta { + // 设置该路由在侧边栏和面包屑中展示的名字 + private String title; + // 设置该路由的图标,支持 svg-class,也支持 el-icon-x element-ui 的 icon + private String icon; + + //不开启缓存 true不开启 false开启 + private Boolean noCache; +} diff --git a/src/main/java/com/dd/admin/system/menu/domain/RouteVo.java b/src/main/java/com/dd/admin/system/menu/domain/RouteVo.java new file mode 100644 index 0000000..ecdf645 --- /dev/null +++ b/src/main/java/com/dd/admin/system/menu/domain/RouteVo.java @@ -0,0 +1,51 @@ +package com.dd.admin.system.menu.domain; + + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; + +@Data +@Accessors(chain = true) +public class RouteVo { + + + /** + * 菜单id + */ + private String menuId; + /** + * 菜单上级id + */ + private String parentId; + + /** + * 路径 + */ + private String path; + + /** + * 名字 + */ + private String name; + /** + * 点击面包屑是否可以点击 + */ + private String redirect; + /** + * 一级页面统一为Layout + */ + private String component; + /** + * 额外信息 + */ + private Meta meta; + /** + * 子菜单 + */ + @JsonInclude(value= JsonInclude.Include.NON_NULL) + private List children; +} diff --git a/src/main/java/com/dd/admin/system/menu/entity/Menu.java b/src/main/java/com/dd/admin/system/menu/entity/Menu.java new file mode 100644 index 0000000..3b9936a --- /dev/null +++ b/src/main/java/com/dd/admin/system/menu/entity/Menu.java @@ -0,0 +1,94 @@ +package com.dd.admin.system.menu.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 菜单 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-05 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_menu") +@ApiModel(value="Menu对象", description="菜单") +public class Menu implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "MENU_ID", type = IdType.ASSIGN_UUID) + private String menuId; + + @ApiModelProperty(value = "父级id") + @TableField("PARENT_ID") + private String parentId; + + @ApiModelProperty(value = "菜单标题") + @TableField("MENU_TITLE") + private String menuTitle; + + @ApiModelProperty(value = "菜单名") + @TableField("MENU_NAME") + private String menuName; + + @ApiModelProperty(value = "菜单图标") + @TableField("MENU_ICON") + private String menuIcon; + + @ApiModelProperty(value = "菜单文件路径") + @TableField("MENU_PATH") + private String menuPath; + + @ApiModelProperty(value = "组件") + @TableField("COMPONENT") + private String component; + + @ApiModelProperty(value = "权限标识") + @TableField("PERMS") + private String perms; + + @ApiModelProperty(value = "菜单类型 1菜单 2权限") + @TableField("MENU_TYPE") + private Integer menuType; + + @ApiModelProperty(value = "页面缓存 1开启 0关闭") + @TableField("MENU_CACHE") + private Integer menuCache; + + @ApiModelProperty(value = "组件") + @TableField("MENU_SORT") + private String menuSort; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "修改人") + @TableField(value = "UPDATE_NAME", fill = FieldFill.UPDATE) + private String updateName; + + @ApiModelProperty(value = "修改人id") + @TableField(value = "UPDATE_ID", fill = FieldFill.UPDATE) + private String updateId; +} diff --git a/src/main/java/com/dd/admin/system/menu/mapper/MenuMapper.java b/src/main/java/com/dd/admin/system/menu/mapper/MenuMapper.java new file mode 100644 index 0000000..505f514 --- /dev/null +++ b/src/main/java/com/dd/admin/system/menu/mapper/MenuMapper.java @@ -0,0 +1,32 @@ +package com.dd.admin.system.menu.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.system.menu.entity.Menu; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.system.menu.domain.MenuVo; +import com.dd.admin.system.menu.domain.MenuDto; + +import java.util.List; + +/** + *

+ * 菜单 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-05 + */ +@Mapper +public interface MenuMapper extends BaseMapper { + + IPage selectMenuPage(Page page, @Param("menuDto") MenuDto menuDto); + + List selectMenuList(@Param("menuDto") MenuDto menuDto); + + //根据用户id获取菜单 + // 获取用户菜单集 + List selectMenuByUserId(@Param("userId") String userId); +} diff --git a/src/main/java/com/dd/admin/system/menu/mapper/xml/MenuMapper.xml b/src/main/java/com/dd/admin/system/menu/mapper/xml/MenuMapper.xml new file mode 100644 index 0000000..42baa38 --- /dev/null +++ b/src/main/java/com/dd/admin/system/menu/mapper/xml/MenuMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + MENU_ID, PARENT_ID, MENU_TITLE, MENU_NAME, MENU_ICON, MENU_PATH, MENU_CACHE, COMPONENT, PERMS, MENU_TYPE, CREATE_TIME, CREATE_NAME, CREATE_ID, UPDATE_TIME, UPDATE_NAME, UPDATE_ID + + + + + + + + diff --git a/src/main/java/com/dd/admin/system/menu/service/MenuService.java b/src/main/java/com/dd/admin/system/menu/service/MenuService.java new file mode 100644 index 0000000..06d4cff --- /dev/null +++ b/src/main/java/com/dd/admin/system/menu/service/MenuService.java @@ -0,0 +1,34 @@ +package com.dd.admin.system.menu.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.system.menu.domain.MenuDto; +import com.dd.admin.system.menu.domain.MenuVo; +import com.dd.admin.system.menu.entity.Menu; + +import java.util.List; +import java.util.Set; + +/** + *

+ * 菜单 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-05 + */ +public interface MenuService extends IService { + + //菜单-分页列表 + IPage selectMenuPage(MenuDto menuDto); + + //菜单-列表 + List selectMenuList(MenuDto menuDto); + + //根据用户id获取菜单 + // 获取用户菜单集 + List selectMenuByUserId(String userId); + + //查询用户权限 + Set selectPermsByUserId(String userId); +} diff --git a/src/main/java/com/dd/admin/system/menu/service/impl/MenuServiceImpl.java b/src/main/java/com/dd/admin/system/menu/service/impl/MenuServiceImpl.java new file mode 100644 index 0000000..ec5f3ba --- /dev/null +++ b/src/main/java/com/dd/admin/system/menu/service/impl/MenuServiceImpl.java @@ -0,0 +1,57 @@ +package com.dd.admin.system.menu.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.common.utils.StringUtil; +import com.dd.admin.system.menu.domain.MenuDto; +import com.dd.admin.system.menu.domain.MenuVo; +import com.dd.admin.system.menu.entity.Menu; +import com.dd.admin.system.menu.mapper.MenuMapper; +import com.dd.admin.system.menu.service.MenuService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.dd.admin.common.consts.SystemConst.AUTH_BUTTON; + +/** + *

+ * 菜单 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-05 + */ +@Service +public class MenuServiceImpl extends ServiceImpl implements MenuService { + + @Override + public IPage selectMenuPage(MenuDto menuDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectMenuPage(page,menuDto); + } + + @Override + public List selectMenuList(MenuDto menuDto) { + return baseMapper.selectMenuList(menuDto); + } + + @Override + public List selectMenuByUserId(String userId) { + return baseMapper.selectMenuByUserId(userId); + } + + @Override + public Set selectPermsByUserId(String userId) { + List list = selectMenuByUserId(userId); + Set perms = list.stream() + .filter(menu -> menu.getMenuType().equals(AUTH_BUTTON)&& StringUtil.isNotEmpty(menu.getPerms())) + .map(menu -> menu.getPerms()) + .collect(Collectors.toSet()); + return perms; + } +} diff --git a/src/main/java/com/dd/admin/system/role/controller/RoleController.java b/src/main/java/com/dd/admin/system/role/controller/RoleController.java new file mode 100644 index 0000000..d16c33b --- /dev/null +++ b/src/main/java/com/dd/admin/system/role/controller/RoleController.java @@ -0,0 +1,123 @@ +package com.dd.admin.system.role.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.dd.admin.system.role.domain.RoleDto; +import com.dd.admin.system.role.domain.RoleMenusDto; +import com.dd.admin.system.role.domain.RoleVo; +import com.dd.admin.system.role.entity.Role; +import com.dd.admin.system.role.service.RoleService; +import com.dd.admin.system.roleMenu.entity.RoleMenu; +import com.dd.admin.system.roleMenu.service.RoleMenuService; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotBlank; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 角色 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Api(tags = "角色") +@RestController +public class RoleController { + + @Autowired + RoleService roleService; + + @Autowired + RoleMenuService roleMenuService; + + @ApiOperation(value = "角色-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/role/page") + public ResultBean> page(RoleDto roleDto) { + IPage pageInfo = roleService.selectRolePage(roleDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "角色-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/role/list") + public ResultBean> list(RoleDto roleDto) { + List list = roleService.selectRoleList(roleDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "角色-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/role/add") + public ResultBean add(@RequestBody @Validated RoleDto roleDto) { + Role role = BeanUtil.copyProperties(roleDto, Role.class); + roleService.save(role); + return ResultBean.success(role); + } + + @ApiOperation(value = "角色-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/role/{roleId}") + public ResultBean get(@PathVariable @NotBlank String roleId) { + Role role = roleService.getById(roleId); + RoleVo roleVo = BeanUtil.copyProperties(role,RoleVo.class); + return ResultBean.success(roleVo); + } + + @ApiOperation(value = "角色-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/role/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) RoleDto roleDto) { + Role role = BeanUtil.copyProperties(roleDto, Role.class); + roleService.updateById(role); + return ResultBean.success(role); + } + + @ApiOperation(value = "角色-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/role/delete/{roleId}") + public ResultBean delete(@PathVariable @NotBlank String roleId) { + Boolean b = roleService.removeById(roleId); + return ResultBean.success(b); + } + + @ApiOperation(value = "获取角色相应权限") + @GetMapping("/admin/role/menu/{roleId}") + @ApiOperationSupport(order = 7) + public ResultBean> menu(@PathVariable @NotBlank String roleId) { + List list = roleMenuService.selectAllByRoleId(roleId); + return ResultBean.success(list); + } + + + @ApiOperation(value = "修改角色相应权限") + @PostMapping("/admin/role/menu/update") + @Transactional + public ResultBean updateMenu(@RequestBody @Validated RoleMenusDto roleMenusDto) { + String roleId = roleMenusDto.getRoleId(); + //删除原有的角色集合 + Integer count = roleMenuService.deleteRoleMenuByRoleId(roleId); + //获取重新添加的 + List menuIdList = roleMenusDto.getMenuIdList(); + List roleMenuList = menuIdList + .stream() + .map(menuId -> { + return new RoleMenu().setRoleId(roleId).setMenuId(menuId); + }) + .collect(Collectors.toList()); + //批量添加 + roleMenuService.saveBatch(roleMenuList); + return ResultBean.success(); + } +} diff --git a/src/main/java/com/dd/admin/system/role/domain/RoleDto.java b/src/main/java/com/dd/admin/system/role/domain/RoleDto.java new file mode 100644 index 0000000..59cee38 --- /dev/null +++ b/src/main/java/com/dd/admin/system/role/domain/RoleDto.java @@ -0,0 +1,66 @@ +package com.dd.admin.system.role.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 角色返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Data +@ApiModel(value="角色接收对象") +public class RoleDto { + + + @NotBlank(message = "角色id不能为空",groups = UpdateGroup.class) + private String roleId; + + @ApiModelProperty(value = "角色名") + private String roleName; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "机构id") + private String deptId; + + @ApiModelProperty(value = "机构名") + private String deptName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + +} diff --git a/src/main/java/com/dd/admin/system/role/domain/RoleMenusDto.java b/src/main/java/com/dd/admin/system/role/domain/RoleMenusDto.java new file mode 100644 index 0000000..676e49c --- /dev/null +++ b/src/main/java/com/dd/admin/system/role/domain/RoleMenusDto.java @@ -0,0 +1,21 @@ +package com.dd.admin.system.role.domain; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.util.List; + +/** + *

+ * 角色表返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2021-07-27 + */ +@Data +@ApiModel(value="角色表接收对象") +public class RoleMenusDto { + private String roleId; + private List menuIdList; +} diff --git a/src/main/java/com/dd/admin/system/role/domain/RoleVo.java b/src/main/java/com/dd/admin/system/role/domain/RoleVo.java new file mode 100644 index 0000000..e3a1fa1 --- /dev/null +++ b/src/main/java/com/dd/admin/system/role/domain/RoleVo.java @@ -0,0 +1,55 @@ +package com.dd.admin.system.role.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +/** + *

+ * 角色返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Data +@ApiModel(value="角色返回对象") +public class RoleVo { + + + private String roleId; + + @ApiModelProperty(value = "角色名") + private String roleName; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "机构id") + private String deptId; + + @ApiModelProperty(value = "机构名") + private String deptName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + +} diff --git a/src/main/java/com/dd/admin/system/role/entity/Role.java b/src/main/java/com/dd/admin/system/role/entity/Role.java new file mode 100644 index 0000000..b25b708 --- /dev/null +++ b/src/main/java/com/dd/admin/system/role/entity/Role.java @@ -0,0 +1,76 @@ +package com.dd.admin.system.role.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 角色 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_role") +@ApiModel(value="Role对象", description="角色") +public class Role implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ROLE_ID", type = IdType.ASSIGN_UUID) + private String roleId; + + @ApiModelProperty(value = "角色名") + @TableField("ROLE_NAME") + private String roleName; + + @ApiModelProperty(value = "备注") + @TableField("REMARK") + private String remark; + + @ApiModelProperty(value = "机构id") + @TableField(value = "DEPT_ID", fill = FieldFill.INSERT) + private String deptId; + + @ApiModelProperty(value = "机构名") + @TableField(value = "DEPT_NAME", fill = FieldFill.INSERT) + private String deptName; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "修改人") + @TableField(value = "UPDATE_NAME", fill = FieldFill.UPDATE) + private String updateName; + + @ApiModelProperty(value = "修改人id") + @TableField(value = "UPDATE_ID", fill = FieldFill.UPDATE) + private String updateId; + + +} diff --git a/src/main/java/com/dd/admin/system/role/mapper/RoleMapper.java b/src/main/java/com/dd/admin/system/role/mapper/RoleMapper.java new file mode 100644 index 0000000..941e606 --- /dev/null +++ b/src/main/java/com/dd/admin/system/role/mapper/RoleMapper.java @@ -0,0 +1,28 @@ +package com.dd.admin.system.role.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.system.role.entity.Role; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.system.role.domain.RoleVo; +import com.dd.admin.system.role.domain.RoleDto; + +import java.util.List; + +/** + *

+ * 角色 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Mapper +public interface RoleMapper extends BaseMapper { + + IPage selectRolePage(Page page, @Param("roleDto") RoleDto roleDto); + + List selectRoleList(@Param("roleDto") RoleDto roleDto); +} diff --git a/src/main/java/com/dd/admin/system/role/mapper/xml/RoleMapper.xml b/src/main/java/com/dd/admin/system/role/mapper/xml/RoleMapper.xml new file mode 100644 index 0000000..7d98111 --- /dev/null +++ b/src/main/java/com/dd/admin/system/role/mapper/xml/RoleMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + ROLE_ID, ROLE_NAME, REMARK, DEPT_ID, DEPT_NAME, CREATE_TIME, CREATE_NAME, CREATE_ID, UPDATE_TIME, UPDATE_NAME, UPDATE_ID + + + + + + diff --git a/src/main/java/com/dd/admin/system/role/service/RoleService.java b/src/main/java/com/dd/admin/system/role/service/RoleService.java new file mode 100644 index 0000000..08a525a --- /dev/null +++ b/src/main/java/com/dd/admin/system/role/service/RoleService.java @@ -0,0 +1,26 @@ +package com.dd.admin.system.role.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.system.role.entity.Role; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.system.role.domain.RoleVo; +import com.dd.admin.system.role.domain.RoleDto; +import java.util.List; + +/** + *

+ * 角色 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +public interface RoleService extends IService { + + //角色-分页列表 + IPage selectRolePage(RoleDto roleDto); + + //角色-列表 + List selectRoleList(RoleDto roleDto); + +} diff --git a/src/main/java/com/dd/admin/system/role/service/impl/RoleServiceImpl.java b/src/main/java/com/dd/admin/system/role/service/impl/RoleServiceImpl.java new file mode 100644 index 0000000..598b9a5 --- /dev/null +++ b/src/main/java/com/dd/admin/system/role/service/impl/RoleServiceImpl.java @@ -0,0 +1,36 @@ +package com.dd.admin.system.role.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.system.role.entity.Role; +import com.dd.admin.system.role.mapper.RoleMapper; +import com.dd.admin.system.role.service.RoleService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.dd.admin.system.role.domain.RoleVo; +import com.dd.admin.system.role.domain.RoleDto; +import java.util.List; + +/** + *

+ * 角色 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Service +public class RoleServiceImpl extends ServiceImpl implements RoleService { + + @Override + public IPage selectRolePage(RoleDto roleDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectRolePage(page,roleDto); + } + + @Override + public List selectRoleList(RoleDto roleDto) { + return baseMapper.selectRoleList(roleDto); + } +} diff --git a/src/main/java/com/dd/admin/system/roleMenu/controller/RoleMenuController.java b/src/main/java/com/dd/admin/system/roleMenu/controller/RoleMenuController.java new file mode 100644 index 0000000..eef5d06 --- /dev/null +++ b/src/main/java/com/dd/admin/system/roleMenu/controller/RoleMenuController.java @@ -0,0 +1,88 @@ +package com.dd.admin.system.roleMenu.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.system.roleMenu.entity.RoleMenu; +import com.dd.admin.system.roleMenu.domain.RoleMenuVo; +import com.dd.admin.system.roleMenu.domain.RoleMenuDto; +import com.dd.admin.system.roleMenu.service.RoleMenuService; + +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 角色菜单 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Api(tags = "角色菜单") +@RestController +public class RoleMenuController { + + @Autowired + RoleMenuService roleMenuService; + + @ApiOperation(value = "角色菜单-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/roleMenu/page") + public ResultBean> page(RoleMenuDto roleMenuDto) { + IPage pageInfo = roleMenuService.selectRoleMenuPage(roleMenuDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "角色菜单-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/roleMenu/list") + public ResultBean> list(RoleMenuDto roleMenuDto) { + List list = roleMenuService.selectRoleMenuList(roleMenuDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "角色菜单-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/roleMenu/add") + public ResultBean add(@RequestBody @Validated RoleMenuDto roleMenuDto) { + RoleMenu roleMenu = BeanUtil.copyProperties(roleMenuDto, RoleMenu.class); + roleMenuService.save(roleMenu); + return ResultBean.success(roleMenu); + } + + @ApiOperation(value = "角色菜单-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/roleMenu/{roleMenuId}") + public ResultBean get(@PathVariable @NotBlank String roleMenuId) { + RoleMenu roleMenu = roleMenuService.getById(roleMenuId); + RoleMenuVo roleMenuVo = BeanUtil.copyProperties(roleMenu,RoleMenuVo.class); + return ResultBean.success(roleMenuVo); + } + + @ApiOperation(value = "角色菜单-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/roleMenu/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) RoleMenuDto roleMenuDto) { + RoleMenu roleMenu = BeanUtil.copyProperties(roleMenuDto, RoleMenu.class); + roleMenuService.updateById(roleMenu); + return ResultBean.success(roleMenu); + } + + @ApiOperation(value = "角色菜单-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/roleMenu/delete/{roleMenuId}") + public ResultBean delete(@PathVariable @NotBlank String roleMenuId) { + Boolean b = roleMenuService.removeById(roleMenuId); + return ResultBean.success(b); + } +} diff --git a/src/main/java/com/dd/admin/system/roleMenu/domain/RoleMenuDto.java b/src/main/java/com/dd/admin/system/roleMenu/domain/RoleMenuDto.java new file mode 100644 index 0000000..22dc88e --- /dev/null +++ b/src/main/java/com/dd/admin/system/roleMenu/domain/RoleMenuDto.java @@ -0,0 +1,51 @@ +package com.dd.admin.system.roleMenu.domain; + +import com.dd.admin.common.model.UpdateGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.util.Date; + + +/** + *

+ * 角色菜单返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Data +@ApiModel(value="角色菜单接收对象") +public class RoleMenuDto { + + + @ApiModelProperty(value = "id") + @NotBlank(message = "角色菜单id不能为空",groups = UpdateGroup.class) + private String id; + + @ApiModelProperty(value = "角色id") + private String roleId; + + @ApiModelProperty(value = "菜单id") + private String menuId; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + +} diff --git a/src/main/java/com/dd/admin/system/roleMenu/domain/RoleMenuVo.java b/src/main/java/com/dd/admin/system/roleMenu/domain/RoleMenuVo.java new file mode 100644 index 0000000..62c7796 --- /dev/null +++ b/src/main/java/com/dd/admin/system/roleMenu/domain/RoleMenuVo.java @@ -0,0 +1,54 @@ +package com.dd.admin.system.roleMenu.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 角色菜单返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Data +@ApiModel(value="角色菜单返回对象") +public class RoleMenuVo { + + + @ApiModelProperty(value = "id") + private String id; + + @ApiModelProperty(value = "角色id") + private String roleId; + + @ApiModelProperty(value = "菜单id") + private String menuId; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + +} diff --git a/src/main/java/com/dd/admin/system/roleMenu/entity/RoleMenu.java b/src/main/java/com/dd/admin/system/roleMenu/entity/RoleMenu.java new file mode 100644 index 0000000..1d0a24a --- /dev/null +++ b/src/main/java/com/dd/admin/system/roleMenu/entity/RoleMenu.java @@ -0,0 +1,67 @@ +package com.dd.admin.system.roleMenu.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * 角色菜单 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_role_menu") +@ApiModel(value="RoleMenu对象", description="角色菜单") +@Accessors(chain = true) +public class RoleMenu implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "id") + @TableId(value = "ID", type = IdType.ASSIGN_UUID) + private String id; + + @ApiModelProperty(value = "角色id") + @TableField("ROLE_ID") + private String roleId; + + @ApiModelProperty(value = "菜单id") + @TableField("MENU_ID") + private String menuId; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "修改人") + @TableField(value = "UPDATE_NAME", fill = FieldFill.UPDATE) + private String updateName; + + +} diff --git a/src/main/java/com/dd/admin/system/roleMenu/mapper/RoleMenuMapper.java b/src/main/java/com/dd/admin/system/roleMenu/mapper/RoleMenuMapper.java new file mode 100644 index 0000000..5c6ffb5 --- /dev/null +++ b/src/main/java/com/dd/admin/system/roleMenu/mapper/RoleMenuMapper.java @@ -0,0 +1,34 @@ +package com.dd.admin.system.roleMenu.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.system.roleMenu.entity.RoleMenu; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.system.roleMenu.domain.RoleMenuVo; +import com.dd.admin.system.roleMenu.domain.RoleMenuDto; + +import java.util.List; + +/** + *

+ * 角色菜单 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Mapper +public interface RoleMenuMapper extends BaseMapper { + + IPage selectRoleMenuPage(Page page, @Param("roleMenuDto") RoleMenuDto roleMenuDto); + + List selectRoleMenuList(@Param("roleMenuDto") RoleMenuDto roleMenuDto); + + List selectAllByRoleId(@Param("roleId")String roleId); + + //根据角色id删除所有的菜单 + Integer deleteRoleMenuByRoleId(@Param("roleId") String roleId); + +} diff --git a/src/main/java/com/dd/admin/system/roleMenu/mapper/xml/RoleMenuMapper.xml b/src/main/java/com/dd/admin/system/roleMenu/mapper/xml/RoleMenuMapper.xml new file mode 100644 index 0000000..a201af1 --- /dev/null +++ b/src/main/java/com/dd/admin/system/roleMenu/mapper/xml/RoleMenuMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + ID, ROLE_ID, MENU_ID, CREATE_TIME, CREATE_NAME, CREATE_ID, UPDATE_TIME, UPDATE_NAME + + + + + + + + + + delete from sys_role_menu where role_id = #{roleId} + + diff --git a/src/main/java/com/dd/admin/system/roleMenu/service/RoleMenuService.java b/src/main/java/com/dd/admin/system/roleMenu/service/RoleMenuService.java new file mode 100644 index 0000000..7e7be01 --- /dev/null +++ b/src/main/java/com/dd/admin/system/roleMenu/service/RoleMenuService.java @@ -0,0 +1,35 @@ +package com.dd.admin.system.roleMenu.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.system.roleMenu.entity.RoleMenu; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.system.roleMenu.domain.RoleMenuVo; +import com.dd.admin.system.roleMenu.domain.RoleMenuDto; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * 角色菜单 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +public interface RoleMenuService extends IService { + + //角色菜单-分页列表 + IPage selectRoleMenuPage(RoleMenuDto roleMenuDto); + + //角色菜单-列表 + List selectRoleMenuList(RoleMenuDto roleMenuDto); + + //根据角色id查询 权限 + List selectAllByRoleId(String roleId); + + //根据角色id删除所有的菜单 + Integer deleteRoleMenuByRoleId(String roleId); + + +} diff --git a/src/main/java/com/dd/admin/system/roleMenu/service/impl/RoleMenuServiceImpl.java b/src/main/java/com/dd/admin/system/roleMenu/service/impl/RoleMenuServiceImpl.java new file mode 100644 index 0000000..0173b64 --- /dev/null +++ b/src/main/java/com/dd/admin/system/roleMenu/service/impl/RoleMenuServiceImpl.java @@ -0,0 +1,46 @@ +package com.dd.admin.system.roleMenu.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.system.roleMenu.entity.RoleMenu; +import com.dd.admin.system.roleMenu.mapper.RoleMenuMapper; +import com.dd.admin.system.roleMenu.service.RoleMenuService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.dd.admin.system.roleMenu.domain.RoleMenuVo; +import com.dd.admin.system.roleMenu.domain.RoleMenuDto; +import java.util.List; + +/** + *

+ * 角色菜单 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Service +public class RoleMenuServiceImpl extends ServiceImpl implements RoleMenuService { + + @Override + public IPage selectRoleMenuPage(RoleMenuDto roleMenuDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectRoleMenuPage(page,roleMenuDto); + } + + @Override + public List selectRoleMenuList(RoleMenuDto roleMenuDto) { + return baseMapper.selectRoleMenuList(roleMenuDto); + } + + @Override + public List selectAllByRoleId(String roleId) { + return baseMapper.selectAllByRoleId(roleId); + } + + @Override + public Integer deleteRoleMenuByRoleId(String roleId) { + return baseMapper.deleteRoleMenuByRoleId(roleId); + } +} diff --git a/src/main/java/com/dd/admin/system/user/controller/UserController.java b/src/main/java/com/dd/admin/system/user/controller/UserController.java new file mode 100644 index 0000000..260075f --- /dev/null +++ b/src/main/java/com/dd/admin/system/user/controller/UserController.java @@ -0,0 +1,145 @@ +package com.dd.admin.system.user.controller; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.dd.admin.common.exception.ApiException; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.dd.admin.common.security.SecurityUtil; +import com.dd.admin.common.utils.StringUtil; +import com.dd.admin.system.role.entity.Role; +import com.dd.admin.system.role.service.RoleService; +import com.dd.admin.system.user.domain.UpdatePasswordDto; +import com.dd.admin.system.user.domain.UserDto; +import com.dd.admin.system.user.domain.UserVo; +import com.dd.admin.system.user.entity.User; +import com.dd.admin.system.user.service.UserService; +import com.dd.admin.system.userRole.service.UserRoleService; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotBlank; +import java.util.List; +import java.util.stream.Collectors; + +import static com.dd.admin.common.exception.enums.SystemExceptionEnum.USER_PASSWORD_ERROR; + +/** + *

+ * 用户 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-05 + */ +@Api(tags = "用户") +@RestController +public class UserController { + + @Autowired + UserService userService; + + @Autowired + UserRoleService userRoleService; + + @Autowired + RoleService roleService; + + @Autowired + PasswordEncoder encoder; + + @ApiOperation(value = "用户-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/user/page") + public ResultBean> page(UserDto userDto) { + IPage pageInfo = userService.selectUserPage(userDto); + pageInfo.getRecords().stream().forEach(userVo -> { + List roles = userRoleService.selectAllByUserId(userVo.getUserId()); + List roleNames = roles.stream().map(roleId->{ + Role role = roleService.getById(roleId); + if(role!=null){ return role.getRoleName(); } + return ""; + }).collect(Collectors.toList()); + userVo.setRoleNames(roleNames); + userVo.setRoles(roles); + }); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "用户-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/user/list") + public ResultBean> list(UserDto userDto) { + List list = userService.selectUserList(userDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "用户-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/user/add") + @Transactional + public ResultBean add(@RequestBody @Validated UserDto userDto) { + User user = userService.addUser(userDto); + userService.setUserRole(userDto.getRoles(),user.getUserId()); + return ResultBean.success(user); + } + + @ApiOperation(value = "用户-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/user/{userId}") + public ResultBean get(@PathVariable @NotBlank String userId) { + User user = userService.getById(userId); + UserVo userVo = BeanUtil.copyProperties(user,UserVo.class); + return ResultBean.success(userVo); + } + + @ApiOperation(value = "用户-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/user/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) UserDto userDto) { + User user = BeanUtil.copyProperties(userDto, User.class); + userService.updateById(user); + userService.setUserRole(userDto.getRoles(),user.getUserId()); + return ResultBean.success(user); + } + + @ApiOperation(value = "用户-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/user/delete/{userId}") + public ResultBean delete(@PathVariable @NotBlank String userId) { + Boolean b = userService.removeById(userId); + return ResultBean.success(b); + } + @ApiOperation(value = "用户重置密码") + @ApiOperationSupport(order = 7) + @GetMapping("/admin/user/resetPass/{userId}") + public ResultBean resetPass(@PathVariable @NotBlank String userId) { + User user = userService.getById(userId); + user.setPassword(userService.genDefaultPassword()); + userService.updateById(user); + return ResultBean.success(); + } + + @ApiOperation(value = "用户重置密码") + @ApiOperationSupport(order = 7) + @PostMapping("/admin/user/updatePassword") + public ResultBean updatePassword(@RequestBody UpdatePasswordDto updatePasswordDto) { + User user = userService.getById(SecurityUtil.getLoginUser().getUserId()); + Boolean b = encoder.matches(updatePasswordDto.getPassword(),user.getPassword()); + if(!b){ + throw new ApiException(USER_PASSWORD_ERROR); + } + user.setPassword(new BCryptPasswordEncoder().encode(updatePasswordDto.getNewPassword())); + userService.updateById(user); + return ResultBean.success(); + } + +} diff --git a/src/main/java/com/dd/admin/system/user/domain/UpdatePasswordDto.java b/src/main/java/com/dd/admin/system/user/domain/UpdatePasswordDto.java new file mode 100644 index 0000000..2f9c599 --- /dev/null +++ b/src/main/java/com/dd/admin/system/user/domain/UpdatePasswordDto.java @@ -0,0 +1,17 @@ +package com.dd.admin.system.user.domain; + +import com.dd.admin.common.model.UpdateGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +@ApiModel(value="用户修改密码接收对象") +public class UpdatePasswordDto { + @ApiModelProperty(value = "密码") + private String password; + @ApiModelProperty(value = "密码") + private String newPassword; +} diff --git a/src/main/java/com/dd/admin/system/user/domain/UserDto.java b/src/main/java/com/dd/admin/system/user/domain/UserDto.java new file mode 100644 index 0000000..8fdab6b --- /dev/null +++ b/src/main/java/com/dd/admin/system/user/domain/UserDto.java @@ -0,0 +1,80 @@ +package com.dd.admin.system.user.domain; + +import com.dd.admin.common.model.UpdateGroup; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.util.Date; +import java.util.List; + + +/** + *

+ * 用户返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-05 + */ +@Data +@ApiModel(value="用户接收对象") +public class UserDto { + + + @ApiModelProperty(value = "用户id") + @NotBlank(message = "用户id不能为空",groups = UpdateGroup.class) + private String userId; + + @ApiModelProperty(value = "用户名") + @NotBlank(message = "用户名不能为空") + private String userName; + + @ApiModelProperty(value = "头像") + private String avatar; + + @ApiModelProperty(value = "密码") + private String password; + + @ApiModelProperty(value = "手机号") + private String phoneNumber; + + @ApiModelProperty(value = "用户类型") + private Integer userType; + + @ApiModelProperty(value = "用户状态") + private Integer userStatus; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "机构id") + private String deptId; + + @ApiModelProperty(value = "机构名") + private String deptName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "用户角色") + @NotEmpty(message = "用户角色不能为空") + private List roles; +} diff --git a/src/main/java/com/dd/admin/system/user/domain/UserVo.java b/src/main/java/com/dd/admin/system/user/domain/UserVo.java new file mode 100644 index 0000000..7e9e485 --- /dev/null +++ b/src/main/java/com/dd/admin/system/user/domain/UserVo.java @@ -0,0 +1,78 @@ +package com.dd.admin.system.user.domain; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + *

+ * 用户返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-05 + */ +@Data +@ApiModel(value="用户返回对象") +public class UserVo { + + + @ApiModelProperty(value = "用户id") + private String userId; + + @ApiModelProperty(value = "用户名") + private String userName; + + @ApiModelProperty(value = "头像") + private String avatar; + + @ApiModelProperty(value = "密码") + @JsonIgnore + private String password; + + @ApiModelProperty(value = "手机号") + private String phoneNumber; + + @ApiModelProperty(value = "用户类型") + private Integer userType; + + @ApiModelProperty(value = "用户状态") + private Integer userStatus; + + @ApiModelProperty(value = "备注") + private String remark; + + @ApiModelProperty(value = "机构id") + private String deptId; + + @ApiModelProperty(value = "机构名") + private String deptName; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + @ApiModelProperty(value = "用户角色") + private List roles; + + @ApiModelProperty(value = "用户角色") + private List roleNames; +} diff --git a/src/main/java/com/dd/admin/system/user/entity/User.java b/src/main/java/com/dd/admin/system/user/entity/User.java new file mode 100644 index 0000000..1913006 --- /dev/null +++ b/src/main/java/com/dd/admin/system/user/entity/User.java @@ -0,0 +1,93 @@ +package com.dd.admin.system.user.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 用户 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-05 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_user") +@ApiModel(value="User对象", description="用户") +public class User implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "用户id") + @TableId(value = "USER_ID", type = IdType.ASSIGN_UUID) + private String userId; + + @ApiModelProperty(value = "用户名") + @TableField("USER_NAME") + private String userName; + + @ApiModelProperty(value = "头像") + @TableField("AVATAR") + private String avatar; + + @ApiModelProperty(value = "密码") + @TableField("PASSWORD") + private String password; + + @ApiModelProperty(value = "手机号") + @TableField("PHONE_NUMBER") + private String phoneNumber; + + @ApiModelProperty(value = "用户类型") + @TableField("USER_TYPE") + private Integer userType; + + @ApiModelProperty(value = "用户状态") + @TableField("USER_STATUS") + private Integer userStatus; + + @ApiModelProperty(value = "备注") + @TableField("REMARK") + private String remark; + + @ApiModelProperty(value = "机构id") + @TableField(value = "DEPT_ID", fill = FieldFill.INSERT) + private String deptId; + + @ApiModelProperty(value = "机构名") + @TableField(value = "DEPT_NAME", fill = FieldFill.INSERT) + private String deptName; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "修改人") + @TableField(value = "UPDATE_NAME", fill = FieldFill.UPDATE) + private String updateName; + + @ApiModelProperty(value = "修改人id") + @TableField(value = "UPDATE_ID", fill = FieldFill.UPDATE) + private String updateId; + + +} diff --git a/src/main/java/com/dd/admin/system/user/mapper/UserMapper.java b/src/main/java/com/dd/admin/system/user/mapper/UserMapper.java new file mode 100644 index 0000000..d46cb38 --- /dev/null +++ b/src/main/java/com/dd/admin/system/user/mapper/UserMapper.java @@ -0,0 +1,31 @@ +package com.dd.admin.system.user.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.system.user.entity.User; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.system.user.domain.UserVo; +import com.dd.admin.system.user.domain.UserDto; + +import java.util.List; + +/** + *

+ * 用户 Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-05 + */ +@Mapper +public interface UserMapper extends BaseMapper { + + IPage selectUserPage(Page page, @Param("userDto") UserDto userDto); + + List selectUserList(@Param("userDto") UserDto userDto); + + UserVo selectOneByUserName(@Param("userName") String userName); + +} diff --git a/src/main/java/com/dd/admin/system/user/mapper/xml/UserMapper.xml b/src/main/java/com/dd/admin/system/user/mapper/xml/UserMapper.xml new file mode 100644 index 0000000..5a32ee7 --- /dev/null +++ b/src/main/java/com/dd/admin/system/user/mapper/xml/UserMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + USER_ID, USER_NAME, AVATAR, PASSWORD, PHONE_NUMBER, USER_TYPE, USER_STATUS, REMARK, DEPT_ID, DEPT_NAME, CREATE_TIME, CREATE_NAME, CREATE_ID, UPDATE_TIME, UPDATE_NAME, UPDATE_ID + + + + + + + diff --git a/src/main/java/com/dd/admin/system/user/service/UserService.java b/src/main/java/com/dd/admin/system/user/service/UserService.java new file mode 100644 index 0000000..1bec454 --- /dev/null +++ b/src/main/java/com/dd/admin/system/user/service/UserService.java @@ -0,0 +1,38 @@ +package com.dd.admin.system.user.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.system.user.domain.UserDto; +import com.dd.admin.system.user.domain.UserVo; +import com.dd.admin.system.user.entity.User; + +import java.util.List; + +/** + *

+ * 用户 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-05 + */ +public interface UserService extends IService { + + //用户-分页列表 + IPage selectUserPage(UserDto userDto); + + //用户-列表 + List selectUserList(UserDto userDto); + + //根据用户名查询 + UserVo selectOneByUserName(String userName); + + //添加用户 + User addUser(UserDto userDto); + + //根据用户id设置用户角色信息 + void setUserRole(List roleList,String userId); + + //创建默认密码 + String genDefaultPassword(); +} diff --git a/src/main/java/com/dd/admin/system/user/service/impl/UserServiceImpl.java b/src/main/java/com/dd/admin/system/user/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..332fe15 --- /dev/null +++ b/src/main/java/com/dd/admin/system/user/service/impl/UserServiceImpl.java @@ -0,0 +1,92 @@ +package com.dd.admin.system.user.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dd.admin.common.exception.ApiException; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.system.dept.entity.Dept; +import com.dd.admin.system.dept.service.DeptService; +import com.dd.admin.system.user.domain.UserDto; +import com.dd.admin.system.user.domain.UserVo; +import com.dd.admin.system.user.entity.User; +import com.dd.admin.system.user.mapper.UserMapper; +import com.dd.admin.system.user.service.UserService; +import com.dd.admin.system.userRole.entity.UserRole; +import com.dd.admin.system.userRole.service.UserRoleService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +import static com.dd.admin.common.consts.SystemConst.DEFAULT_PASSWORD; +import static com.dd.admin.common.exception.enums.SystemExceptionEnum.USERNAME_ALREADY_EXIST; + +/** + *

+ * 用户 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-05 + */ +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + + @Autowired + DeptService deptService; + + @Autowired + UserRoleService userRoleService; + + @Override + public IPage selectUserPage(UserDto userDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectUserPage(page,userDto); + } + + @Override + public List selectUserList(UserDto userDto) { + return baseMapper.selectUserList(userDto); + } + + @Override + public UserVo selectOneByUserName(String userName) { + return baseMapper.selectOneByUserName(userName); + } + + @Override + public User addUser(UserDto userDto) { + String username = userDto.getUserName(); + UserVo userVo = selectOneByUserName(username); + if(userVo!=null){ + throw new ApiException(USERNAME_ALREADY_EXIST); + } + User user = BeanUtil.copyProperties(userDto,User.class); + user.setPassword(new BCryptPasswordEncoder().encode(DEFAULT_PASSWORD)); + + Dept dept = deptService.getById(user.getDeptId()); + user.setDeptName(dept.getDeptName()); + save(user); + return user; + } + + @Override + public void setUserRole(List roleList, String userId) { + //删除用户的角色信息 + userRoleService.deleteUserRoleByUserId(userId); + //批量添加新的 + List userRoleList = roleList.stream().map(roleId -> { + return new UserRole().setRoleId(roleId).setUserId(userId); + }).collect(Collectors.toList()); + userRoleService.saveBatch(userRoleList); + } + + @Override + public String genDefaultPassword() { + return new BCryptPasswordEncoder().encode(DEFAULT_PASSWORD); + } +} diff --git a/src/main/java/com/dd/admin/system/userRole/controller/UserRoleController.java b/src/main/java/com/dd/admin/system/userRole/controller/UserRoleController.java new file mode 100644 index 0000000..dfad1e1 --- /dev/null +++ b/src/main/java/com/dd/admin/system/userRole/controller/UserRoleController.java @@ -0,0 +1,88 @@ +package com.dd.admin.system.userRole.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import com.dd.admin.system.userRole.entity.UserRole; +import com.dd.admin.system.userRole.domain.UserRoleVo; +import com.dd.admin.system.userRole.domain.UserRoleDto; +import com.dd.admin.system.userRole.service.UserRoleService; + +import java.util.List; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Api(tags = "用户角色关联") +@RestController +public class UserRoleController { + + @Autowired + UserRoleService userRoleService; + + @ApiOperation(value = "-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/userRole/page") + public ResultBean> page(UserRoleDto userRoleDto) { + IPage pageInfo = userRoleService.selectUserRolePage(userRoleDto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/userRole/list") + public ResultBean> list(UserRoleDto userRoleDto) { + List list = userRoleService.selectUserRoleList(userRoleDto); + return ResultBean.success(list); + } + + @ApiOperation(value = "-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/userRole/add") + public ResultBean add(@RequestBody @Validated UserRoleDto userRoleDto) { + UserRole userRole = BeanUtil.copyProperties(userRoleDto, UserRole.class); + userRoleService.save(userRole); + return ResultBean.success(userRole); + } + + @ApiOperation(value = "-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/userRole/{userRoleId}") + public ResultBean get(@PathVariable @NotBlank String userRoleId) { + UserRole userRole = userRoleService.getById(userRoleId); + UserRoleVo userRoleVo = BeanUtil.copyProperties(userRole,UserRoleVo.class); + return ResultBean.success(userRoleVo); + } + + @ApiOperation(value = "-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/userRole/update") + public ResultBean update(@RequestBody @Validated(UpdateGroup.class) UserRoleDto userRoleDto) { + UserRole userRole = BeanUtil.copyProperties(userRoleDto, UserRole.class); + userRoleService.updateById(userRole); + return ResultBean.success(userRole); + } + + @ApiOperation(value = "-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/userRole/delete/{userRoleId}") + public ResultBean delete(@PathVariable @NotBlank String userRoleId) { + Boolean b = userRoleService.removeById(userRoleId); + return ResultBean.success(b); + } +} diff --git a/src/main/java/com/dd/admin/system/userRole/domain/UserRoleDto.java b/src/main/java/com/dd/admin/system/userRole/domain/UserRoleDto.java new file mode 100644 index 0000000..eaedb3f --- /dev/null +++ b/src/main/java/com/dd/admin/system/userRole/domain/UserRoleDto.java @@ -0,0 +1,58 @@ +package com.dd.admin.system.userRole.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * 返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Data +@ApiModel(value="接收对象") +public class UserRoleDto { + + + @NotBlank(message = "id不能为空",groups = UpdateGroup.class) + private String id; + + private String userId; + + private String roleId; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + +} diff --git a/src/main/java/com/dd/admin/system/userRole/domain/UserRoleVo.java b/src/main/java/com/dd/admin/system/userRole/domain/UserRoleVo.java new file mode 100644 index 0000000..0ccebc3 --- /dev/null +++ b/src/main/java/com/dd/admin/system/userRole/domain/UserRoleVo.java @@ -0,0 +1,54 @@ +package com.dd.admin.system.userRole.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 返回对象 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Data +@ApiModel(value="返回对象") +public class UserRoleVo { + + + private String id; + + private String userId; + + private String roleId; + + @ApiModelProperty(value = "创建时间") + private Date createTime; + + @ApiModelProperty(value = "创建人") + private String createName; + + @ApiModelProperty(value = "创建人id") + private String createId; + + @ApiModelProperty(value = "修改时间") + private Date updateTime; + + @ApiModelProperty(value = "修改人") + private String updateName; + + @ApiModelProperty(value = "修改人id") + private String updateId; + + +} diff --git a/src/main/java/com/dd/admin/system/userRole/entity/UserRole.java b/src/main/java/com/dd/admin/system/userRole/entity/UserRole.java new file mode 100644 index 0000000..fd528a7 --- /dev/null +++ b/src/main/java/com/dd/admin/system/userRole/entity/UserRole.java @@ -0,0 +1,68 @@ +package com.dd.admin.system.userRole.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.Version; +import com.baomidou.mybatisplus.annotation.TableId; +import java.util.Date; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_user_role") +@ApiModel(value="UserRole对象", description="") +@Accessors(chain = true) +public class UserRole implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "ID", type = IdType.ASSIGN_UUID) + private String id; + + @TableField("USER_ID") + private String userId; + + @TableField("ROLE_ID") + private String roleId; + + @ApiModelProperty(value = "创建时间") + @TableField(value = "CREATE_TIME", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(value = "创建人") + @TableField(value = "CREATE_NAME", fill = FieldFill.INSERT) + private String createName; + + @ApiModelProperty(value = "创建人id") + @TableField(value = "CREATE_ID", fill = FieldFill.INSERT) + private String createId; + + @ApiModelProperty(value = "修改时间") + @TableField(value = "UPDATE_TIME", fill = FieldFill.UPDATE) + private Date updateTime; + + @ApiModelProperty(value = "修改人") + @TableField(value = "UPDATE_NAME", fill = FieldFill.UPDATE) + private String updateName; + + @ApiModelProperty(value = "修改人id") + @TableField(value = "UPDATE_ID", fill = FieldFill.UPDATE) + private String updateId; + + +} diff --git a/src/main/java/com/dd/admin/system/userRole/mapper/UserRoleMapper.java b/src/main/java/com/dd/admin/system/userRole/mapper/UserRoleMapper.java new file mode 100644 index 0000000..6195c1e --- /dev/null +++ b/src/main/java/com/dd/admin/system/userRole/mapper/UserRoleMapper.java @@ -0,0 +1,34 @@ +package com.dd.admin.system.userRole.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.system.userRole.entity.UserRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dd.admin.system.userRole.domain.UserRoleVo; +import com.dd.admin.system.userRole.domain.UserRoleDto; + +import java.util.List; + +/** + *

+ * Mapper 接口 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Mapper +public interface UserRoleMapper extends BaseMapper { + + IPage selectUserRolePage(Page page, @Param("userRoleDto") UserRoleDto userRoleDto); + + List selectUserRoleList(@Param("userRoleDto") UserRoleDto userRoleDto); + + //根据用户id删除用户角色信息 + Integer deleteUserRoleByUserId(@Param("userId")String userId); + + List selectAllByUserId(@Param("userId") String userId); + +} diff --git a/src/main/java/com/dd/admin/system/userRole/mapper/xml/UserRoleMapper.xml b/src/main/java/com/dd/admin/system/userRole/mapper/xml/UserRoleMapper.xml new file mode 100644 index 0000000..588f885 --- /dev/null +++ b/src/main/java/com/dd/admin/system/userRole/mapper/xml/UserRoleMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + ID, USER_ID, ROLE_ID, CREATE_TIME, CREATE_NAME, CREATE_ID, UPDATE_TIME, UPDATE_NAME, UPDATE_ID + + + delete from sys_user_role + where + USER_ID = #{userId} + + + + + + + diff --git a/src/main/java/com/dd/admin/system/userRole/service/UserRoleService.java b/src/main/java/com/dd/admin/system/userRole/service/UserRoleService.java new file mode 100644 index 0000000..1e16729 --- /dev/null +++ b/src/main/java/com/dd/admin/system/userRole/service/UserRoleService.java @@ -0,0 +1,31 @@ +package com.dd.admin.system.userRole.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.dd.admin.system.userRole.domain.UserRoleDto; +import com.dd.admin.system.userRole.domain.UserRoleVo; +import com.dd.admin.system.userRole.entity.UserRole; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +public interface UserRoleService extends IService { + + //-分页列表 + IPage selectUserRolePage(UserRoleDto userRoleDto); + + //-列表 + List selectUserRoleList(UserRoleDto userRoleDto); + + Integer deleteUserRoleByUserId(String userId); + + List selectAllByUserId(String userId); + +} diff --git a/src/main/java/com/dd/admin/system/userRole/service/impl/UserRoleServiceImpl.java b/src/main/java/com/dd/admin/system/userRole/service/impl/UserRoleServiceImpl.java new file mode 100644 index 0000000..c9ec90a --- /dev/null +++ b/src/main/java/com/dd/admin/system/userRole/service/impl/UserRoleServiceImpl.java @@ -0,0 +1,46 @@ +package com.dd.admin.system.userRole.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.model.PageFactory; +import com.dd.admin.system.userRole.entity.UserRole; +import com.dd.admin.system.userRole.mapper.UserRoleMapper; +import com.dd.admin.system.userRole.service.UserRoleService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.dd.admin.system.userRole.domain.UserRoleVo; +import com.dd.admin.system.userRole.domain.UserRoleDto; +import java.util.List; + +/** + *

+ * 服务实现类 + *

+ * + * @author 727869402@qq.com + * @since 2022-01-04 + */ +@Service +public class UserRoleServiceImpl extends ServiceImpl implements UserRoleService { + + @Override + public IPage selectUserRolePage(UserRoleDto userRoleDto) { + Page page = PageFactory.defaultPage(); + return baseMapper.selectUserRolePage(page,userRoleDto); + } + + @Override + public List selectUserRoleList(UserRoleDto userRoleDto) { + return baseMapper.selectUserRoleList(userRoleDto); + } + + @Override + public Integer deleteUserRoleByUserId(String userId) { + return baseMapper.deleteUserRoleByUserId(userId); + } + + @Override + public List selectAllByUserId(String userId) { + return baseMapper.selectAllByUserId(userId); + } +} diff --git a/src/main/resources/application-online.yml b/src/main/resources/application-online.yml new file mode 100644 index 0000000..dbe78ca --- /dev/null +++ b/src/main/resources/application-online.yml @@ -0,0 +1,54 @@ +spring: + servlet: + multipart: + enabled: true #默认支持文件上传 + max-file-size: 50MB #不做限制 + max-request-size: 50MB #不做限制 + + datasource: + driver-class-name: com.p6spy.engine.spy.P6SpyDriver + url: jdbc:p6spy:mysql://127.0.0.1:3306/memberShop?useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 + username: root + password: wxlwxl12 + + jackson: + #配置日期返回格式 + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 +dd: + uploadPath: /www/store/upload/ + +knife4j: + enable: true +#here is the importance configs of JWT +jwt: + header: Authorization #请求头权限标识 + expiration: 604800 #7天 604800 + secret: security + # 配置不需要认证的接口 + ignores: + # 需要过滤的 post 请求 + post: + - "/admin/login/**" + # 需要过滤的 get 请求 + get: + - "/favicon.ico" + # 需要过滤的请求,不限方法 + pattern: + - "/upload/**" + - "/doc.html" + - "/swagger-resources/**" + - "/v2/api-docs/**" + - "/webjars/**" + - "/**.txt" +#================================================= mybatis-plus start ================================================= +mybatis-plus: + #配置文件 + mapper-locations: classpath*:com/dd/admin/system/*/mapper/xml/*Mapper.xml,com/dd/admin/business/*/mapper/xml/*Mapper.xml + configuration: + log-impl: +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl +#================================================= mybatis-plus end =================================================== + +server: + port: 8888 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..42deb75 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,56 @@ +spring: + servlet: + multipart: + enabled: true #默认支持文件上传 + max-file-size: 50MB #不做限制 + max-request-size: 50MB #不做限制 + + datasource: + driver-class-name: com.p6spy.engine.spy.P6SpyDriver + url: jdbc:p6spy:mysql://127.0.0.1:3306/dd?useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 + username: root + password: admin + +# url: jdbc:p6spy:mysql://120.26.95.195:3306/memberShop?useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8 +# username: root +# password: wxlwxl12 + + jackson: + #配置日期返回格式 + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 +dd: + uploadPath: c:/ddStore/ + +knife4j: + enable: true +#here is the importance configs of JWT +jwt: + header: Authorization #请求头权限标识 + expiration: 604800 #7天 604800 + secret: security + # 配置不需要认证的接口 + ignores: + # 需要过滤的 post 请求 + post: + - "/admin/login/**" + # 需要过滤的 get 请求 + get: + - "/favicon.ico" + # 需要过滤的请求,不限方法 + pattern: + - "/upload/**" + - "/doc.html" + - "/swagger-resources/**" + - "/v2/api-docs/**" + - "/webjars/**" + - "/**.txt" +#================================================= mybatis-plus start ================================================= +mybatis-plus: + #配置文件 + mapper-locations: classpath*:com/dd/admin/system/*/mapper/xml/*Mapper.xml,com/dd/admin/business/*/mapper/xml/*Mapper.xml + configuration: + log-impl: +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl +#================================================= mybatis-plus end =================================================== + diff --git a/src/main/resources/spy.properties b/src/main/resources/spy.properties new file mode 100644 index 0000000..7a0b02c --- /dev/null +++ b/src/main/resources/spy.properties @@ -0,0 +1,29 @@ +#3.2.1ʹ +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory +# ,com.p6spy.engine.outage.P6OutageFactory +#3.2.1ʹû߲ +#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory +# Զ־ӡ +#logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +# Զ־ӡ +logMessageFormat=com.dd.admin.common.logs.P6SpyLogger +#־̨ +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# ʹ־ϵͳ¼ sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# p6spy driver +deregisterdrivers=true +# ȡJDBC URLǰ׺ +useprefix=true +# ü¼ Log ,ȥĽerror,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# ڸʽ +dateformat=yyyy-MM-dd HH:mm:ss +# ʵɶ +#driverlist=org.h2.Driver +# ǷSQL¼ +outagedetection=true +# SQL¼׼ 2 +outagedetectioninterval=2 + + diff --git a/src/main/resources/templates/BusinessController.java.ftl b/src/main/resources/templates/BusinessController.java.ftl new file mode 100644 index 0000000..652ef24 --- /dev/null +++ b/src/main/resources/templates/BusinessController.java.ftl @@ -0,0 +1,107 @@ +package ${package.Controller}; + +import cn.hutool.core.bean.BeanUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import com.dd.admin.common.model.UpdateGroup; +import com.dd.admin.common.model.result.ResultBean; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import javax.validation.constraints.NotBlank; +import ${package.Entity}.${entity}; +import ${cfg.voPath}.${entity}Vo; +import ${cfg.dtoPath}.${entity}Dto; +import ${package.Service}.${table.serviceName}; + +import java.util.List; + +<#if restControllerStyle> +import org.springframework.web.bind.annotation.RestController; +<#else> +import org.springframework.stereotype.Controller; + +<#if superControllerClassPackage??> +import ${superControllerClassPackage}; + + +/** + *

+ * ${table.comment!} 前端控制器 + *

+ * + * @author ${author} + * @since ${date} + */ +@Api(tags = "${table.comment!}") +<#if restControllerStyle> +@RestController +<#else> +@Controller + +<#if kotlin> +class ${table.controllerName}<#if superControllerClass??> : ${superControllerClass}() +<#else> +<#if superControllerClass??> +public class ${table.controllerName} extends ${superControllerClass} { +<#else> +public class ${table.controllerName} { + + + @Autowired + ${table.serviceName} ${package.ModuleName}Service; + + @ApiOperation(value = "${table.comment!}-分页列表") + @ApiOperationSupport(order = 1) + @GetMapping("/admin/${package.ModuleName}/page") + public ResultBean> page(${entity}Dto ${package.ModuleName}Dto) { + IPage<${entity}Vo> pageInfo = ${package.ModuleName}Service.select${entity}Page(${package.ModuleName}Dto); + return ResultBean.success(pageInfo); + } + + @ApiOperation(value = "${table.comment!}-列表") + @ApiOperationSupport(order = 2) + @GetMapping("/admin/${package.ModuleName}/list") + public ResultBean> list(${entity}Dto ${package.ModuleName}Dto) { + List<${entity}Vo> list = ${package.ModuleName}Service.select${entity}List(${package.ModuleName}Dto); + return ResultBean.success(list); + } + + @ApiOperation(value = "${table.comment!}-添加") + @ApiOperationSupport(order = 3) + @PostMapping("/admin/${package.ModuleName}/add") + public ResultBean<${entity}> add(@RequestBody @Validated ${entity}Dto ${package.ModuleName}Dto) { + ${entity} ${package.ModuleName} = BeanUtil.copyProperties(${package.ModuleName}Dto, ${entity}.class); + ${package.ModuleName}Service.save(${package.ModuleName}); + return ResultBean.success(${package.ModuleName}); + } + + @ApiOperation(value = "${table.comment!}-查询") + @ApiOperationSupport(order = 4) + @GetMapping("/admin/${package.ModuleName}/{${package.ModuleName}Id}") + public ResultBean<${entity}Vo> get(@PathVariable @NotBlank String ${package.ModuleName}Id) { + ${entity} ${package.ModuleName} = ${package.ModuleName}Service.getById(${package.ModuleName}Id); + ${entity}Vo ${package.ModuleName}Vo = BeanUtil.copyProperties(${package.ModuleName},${entity}Vo.class); + return ResultBean.success(${package.ModuleName}Vo); + } + + @ApiOperation(value = "${table.comment!}-修改") + @ApiOperationSupport(order = 5) + @PostMapping("/admin/${package.ModuleName}/update") + public ResultBean<${entity}> update(@RequestBody @Validated(UpdateGroup.class) ${entity}Dto ${package.ModuleName}Dto) { + ${entity} ${package.ModuleName} = BeanUtil.copyProperties(${package.ModuleName}Dto, ${entity}.class); + ${package.ModuleName}Service.updateById(${package.ModuleName}); + return ResultBean.success(${package.ModuleName}); + } + + @ApiOperation(value = "${table.comment!}-删除") + @ApiOperationSupport(order = 6) + @GetMapping("/admin/${package.ModuleName}/delete/{${package.ModuleName}Id}") + public ResultBean<${entity}> delete(@PathVariable @NotBlank String ${package.ModuleName}Id) { + Boolean b = ${package.ModuleName}Service.removeById(${package.ModuleName}Id); + return ResultBean.success(b); + } +} + diff --git a/src/main/resources/templates/BusinessMapper.java.ftl b/src/main/resources/templates/BusinessMapper.java.ftl new file mode 100644 index 0000000..c53c448 --- /dev/null +++ b/src/main/resources/templates/BusinessMapper.java.ftl @@ -0,0 +1,32 @@ +package ${package.Mapper}; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import ${package.Entity}.${entity}; +import ${superMapperClassPackage}; +import ${cfg.voPath}.${entity}Vo; +import ${cfg.dtoPath}.${entity}Dto; + +import java.util.List; + +/** + *

+ * ${table.comment!} Mapper 接口 + *

+ * + * @author ${author} + * @since ${date} + */ +<#if kotlin> +interface ${table.mapperName} : ${superMapperClass}<${entity}> +<#else> +@Mapper +public interface ${table.mapperName} extends ${superMapperClass}<${entity}> { + + IPage<${entity}Vo> select${entity}Page(Page<${entity}Vo> page, @Param("${package.ModuleName}Dto") ${entity}Dto ${package.ModuleName}Dto); + + List<${entity}Vo> select${entity}List(@Param("${package.ModuleName}Dto") ${entity}Dto ${package.ModuleName}Dto); +} + diff --git a/src/main/resources/templates/BusinessMapper.xml.ftl b/src/main/resources/templates/BusinessMapper.xml.ftl new file mode 100644 index 0000000..36ddb0a --- /dev/null +++ b/src/main/resources/templates/BusinessMapper.xml.ftl @@ -0,0 +1,50 @@ + + + + +<#if enableCache> + + + + +<#if baseResultMap> + + +<#list table.fields as field> +<#if field.keyFlag><#--生成主键排在第一位--> + + + +<#list table.commonFields as field><#--生成公共字段 --> + + +<#list table.fields as field> +<#if !field.keyFlag><#--生成普通字段 --> + + + + + + +<#if baseColumnList> + + +<#list table.commonFields as field> + ${field.columnName}, + + ${table.fieldNames} + + + + + + + diff --git a/src/main/resources/templates/BusinessService.java.ftl b/src/main/resources/templates/BusinessService.java.ftl new file mode 100644 index 0000000..da54a93 --- /dev/null +++ b/src/main/resources/templates/BusinessService.java.ftl @@ -0,0 +1,30 @@ +package ${package.Service}; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import ${package.Entity}.${entity}; +import ${superServiceClassPackage}; +import ${cfg.voPath}.${entity}Vo; +import ${cfg.dtoPath}.${entity}Dto; +import java.util.List; + +/** + *

+ * ${table.comment!} 服务类 + *

+ * + * @author ${author} + * @since ${date} + */ +<#if kotlin> +interface ${table.serviceName} : ${superServiceClass}<${entity}> +<#else> +public interface ${table.serviceName} extends ${superServiceClass}<${entity}> { + + //${table.comment!}-分页列表 + IPage<${entity}Vo> select${entity}Page(${entity}Dto ${package.ModuleName}Dto); + + //${table.comment!}-列表 + List<${entity}Vo> select${entity}List(${entity}Dto ${package.ModuleName}Dto); + +} + diff --git a/src/main/resources/templates/BusinessServiceImpl.java.ftl b/src/main/resources/templates/BusinessServiceImpl.java.ftl new file mode 100644 index 0000000..8823dab --- /dev/null +++ b/src/main/resources/templates/BusinessServiceImpl.java.ftl @@ -0,0 +1,42 @@ +package ${package.ServiceImpl}; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.dd.admin.common.model.PageFactory; +import ${package.Entity}.${entity}; +import ${package.Mapper}.${table.mapperName}; +import ${package.Service}.${table.serviceName}; +import ${superServiceImplClassPackage}; +import org.springframework.stereotype.Service; +import ${cfg.voPath}.${entity}Vo; +import ${cfg.dtoPath}.${entity}Dto; +import java.util.List; + +/** + *

+ * ${table.comment!} 服务实现类 + *

+ * + * @author ${author} + * @since ${date} + */ +@Service +<#if kotlin> +open class ${table.serviceImplName} : ${superServiceImplClass}<${table.mapperName}, ${entity}>(), ${table.serviceName} { + +} +<#else> +public class ${table.serviceImplName} extends ${superServiceImplClass}<${table.mapperName}, ${entity}> implements ${table.serviceName} { + + @Override + public IPage<${entity}Vo> select${entity}Page(${entity}Dto ${package.ModuleName}Dto) { + Page page = PageFactory.defaultPage(); + return baseMapper.select${entity}Page(page,${package.ModuleName}Dto); + } + + @Override + public List<${entity}Vo> select${entity}List(${entity}Dto ${package.ModuleName}Dto) { + return baseMapper.select${entity}List(${package.ModuleName}Dto); + } +} + diff --git a/src/main/resources/templates/Dto.java.ftl b/src/main/resources/templates/Dto.java.ftl new file mode 100644 index 0000000..658f6a5 --- /dev/null +++ b/src/main/resources/templates/Dto.java.ftl @@ -0,0 +1,117 @@ +package ${cfg.dtoPath}; + +<#list table.importPackages as pkg> +import ${pkg}; + +<#if swagger2> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +<#if entityLombokModel> +import lombok.Data; +import lombok.EqualsAndHashCode; + <#if chainModel> +import lombok.experimental.Accessors; + + +import javax.validation.constraints.NotBlank; +import com.dd.admin.common.model.UpdateGroup; + + +/** + *

+ * ${table.comment!}返回对象 + *

+ * + * @author ${author} + * @since ${date} + */ +<#if entityLombokModel> +@Data + +<#if swagger2> +@ApiModel(value="${table.comment!}接收对象") + +<#if superEntityClass??> +public class ${entity}Dto extends ${superEntityClass}<#if activeRecord><${entity}> { +<#elseif activeRecord> +public class ${entity}Dto extends Model<${entity}> { +<#else> +public class ${entity}Dto { + + +<#-- ---------- BEGIN 字段循环遍历 ----------> +<#list table.fields as field> + + <#if field.comment!?length gt 0> + <#if swagger2> + @ApiModelProperty(value = "${field.comment}") + <#else> + /** + * ${field.comment} + */ + + + <#if field.keyFlag> + @NotBlank(message = "${table.comment!}id不能为空",groups = UpdateGroup.class) + + private ${field.propertyType} ${field.propertyName}; + +<#------------ END 字段循环遍历 ----------> + +<#if !entityLombokModel> + <#list table.fields as field> + <#if field.propertyType == "boolean"> + <#assign getprefix="is"/> + <#else> + <#assign getprefix="get"/> + + public ${field.propertyType} ${getprefix}${field.capitalName}() { + return ${field.propertyName}; + } + + <#if chainModel> + public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) { + <#else> + public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) { + + this.${field.propertyName} = ${field.propertyName}; + <#if chainModel> + return this; + + } + + + +<#if entityColumnConstant> + <#list table.fields as field> + public static final String ${field.name?upper_case} = "${field.name}"; + + + +<#if activeRecord> + @Override + protected Serializable pkVal() { + <#if keyPropertyName??> + return this.${keyPropertyName}; + <#else> + return null; + + } + + +<#if !entityLombokModel> + @Override + public String toString() { + return "${entity}{" + + <#list table.fields as field> + <#if field_index==0> + "${field.propertyName}=" + ${field.propertyName} + + <#else> + ", ${field.propertyName}=" + ${field.propertyName} + + + + "}"; + } + +} diff --git a/src/main/resources/templates/Js.ftl b/src/main/resources/templates/Js.ftl new file mode 100644 index 0000000..ff8a455 --- /dev/null +++ b/src/main/resources/templates/Js.ftl @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function get${entity}Page(params) { + return request({ + url: '/admin/${package.ModuleName}/page', + method: 'get', + params + }) +} + +export function get${entity}List(params) { + return request({ + url: '/admin/${package.ModuleName}/list', + method: 'get', + params + }) +} + +export function add${entity}(data) { + return request({ + url: '/admin/${package.ModuleName}/add', + method: 'post', + data: data + }) +} + +export function edit${entity}(data) { + return request({ + url: '/admin/${package.ModuleName}/update', + method: 'post', + data: data + }) +} + +export function delete${entity}(${package.ModuleName}Id) { + return request({ + url: '/admin/${package.ModuleName}/delete/' + ${package.ModuleName}Id, + method: 'get' + }) +} + diff --git a/src/main/resources/templates/List.ftl b/src/main/resources/templates/List.ftl new file mode 100644 index 0000000..3204b79 --- /dev/null +++ b/src/main/resources/templates/List.ftl @@ -0,0 +1,196 @@ + + + + + diff --git a/src/main/resources/templates/Vo.java.ftl b/src/main/resources/templates/Vo.java.ftl new file mode 100644 index 0000000..f253a2d --- /dev/null +++ b/src/main/resources/templates/Vo.java.ftl @@ -0,0 +1,114 @@ +package ${cfg.voPath}; + +<#list table.importPackages as pkg> +import ${pkg}; + +<#if swagger2> +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +<#if entityLombokModel> +import lombok.Data; +import lombok.EqualsAndHashCode; + <#if chainModel> +import lombok.experimental.Accessors; + + + +/** + *

+ * ${table.comment!}返回对象 + *

+ * + * @author ${author} + * @since ${date} + */ +<#if entityLombokModel> +@Data + +<#if swagger2> +@ApiModel(value="${table.comment!}返回对象") + +<#if superEntityClass??> +public class ${entity}Vo extends ${superEntityClass}<#if activeRecord><${entity}> { +<#elseif activeRecord> +public class ${entity}Vo extends Model<${entity}> { +<#else> +public class ${entity}Vo { + + +<#-- ---------- BEGIN 字段循环遍历 ----------> +<#list table.fields as field> + <#if field.keyFlag> + <#assign keyPropertyName="${field.propertyName}"/> + + + <#if field.comment!?length gt 0> + <#if swagger2> + @ApiModelProperty(value = "${field.comment}") + <#else> + /** + * ${field.comment} + */ + + + private ${field.propertyType} ${field.propertyName}; + +<#------------ END 字段循环遍历 ----------> + +<#if !entityLombokModel> + <#list table.fields as field> + <#if field.propertyType == "boolean"> + <#assign getprefix="is"/> + <#else> + <#assign getprefix="get"/> + + public ${field.propertyType} ${getprefix}${field.capitalName}() { + return ${field.propertyName}; + } + + <#if chainModel> + public ${entity} set${field.capitalName}(${field.propertyType} ${field.propertyName}) { + <#else> + public void set${field.capitalName}(${field.propertyType} ${field.propertyName}) { + + this.${field.propertyName} = ${field.propertyName}; + <#if chainModel> + return this; + + } + + + +<#if entityColumnConstant> + <#list table.fields as field> + public static final String ${field.name?upper_case} = "${field.name}"; + + + +<#if activeRecord> + @Override + protected Serializable pkVal() { + <#if keyPropertyName??> + return this.${keyPropertyName}; + <#else> + return null; + + } + + +<#if !entityLombokModel> + @Override + public String toString() { + return "${entity}{" + + <#list table.fields as field> + <#if field_index==0> + "${field.propertyName}=" + ${field.propertyName} + + <#else> + ", ${field.propertyName}=" + ${field.propertyName} + + + + "}"; + } + +} diff --git a/src/main/resources/templates/addForm.ftl b/src/main/resources/templates/addForm.ftl new file mode 100644 index 0000000..782e006 --- /dev/null +++ b/src/main/resources/templates/addForm.ftl @@ -0,0 +1,86 @@ + + + + + diff --git a/src/main/resources/templates/editForm.ftl b/src/main/resources/templates/editForm.ftl new file mode 100644 index 0000000..1446b0c --- /dev/null +++ b/src/main/resources/templates/editForm.ftl @@ -0,0 +1,87 @@ + + + + + diff --git a/src/sql/dd.sql b/src/sql/dd.sql new file mode 100644 index 0000000..e69de29 diff --git a/src/test/java/com/dd/admin/AdminApplicationTests.java b/src/test/java/com/dd/admin/AdminApplicationTests.java new file mode 100644 index 0000000..84d4633 --- /dev/null +++ b/src/test/java/com/dd/admin/AdminApplicationTests.java @@ -0,0 +1,13 @@ +package com.dd.admin; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class AdminApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/src/test/java/com/dd/admin/BusinessGenerator.java b/src/test/java/com/dd/admin/BusinessGenerator.java new file mode 100644 index 0000000..51f5da0 --- /dev/null +++ b/src/test/java/com/dd/admin/BusinessGenerator.java @@ -0,0 +1,245 @@ +package com.dd.admin; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.generator.AutoGenerator; +import com.baomidou.mybatisplus.generator.InjectionConfig; +import com.baomidou.mybatisplus.generator.config.*; +import com.baomidou.mybatisplus.generator.config.po.TableFill; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.baomidou.mybatisplus.generator.config.rules.DateType; +import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; +import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; + +import java.util.*; + +/** + * Description:自动生成 自定义代码 + *

+ * date: 2021/7/6 + * + * @author: wxl + */ + +public class BusinessGenerator { + + /** + *

+ * 读取控制台内容 + *

+ */ + public static String scanner(String tip) { + Scanner scanner = new Scanner(System.in); + StringBuilder help = new StringBuilder(); + help.append("请输入").append(tip).append(":"); + System.out.println(help.toString()); + if (scanner.hasNext()) { + String ipt = scanner.next(); + if (StringUtils.isNotBlank(ipt)) { + return ipt; + } + } + throw new MybatisPlusException("请输入正确的" + tip + "!"); + } + + + public static String PACKAGE_NAME = "com.dd.admin.business"; + public static String FIRST_MODULE = "business"; + + /** + * RUN THIS + */ + public static void main(String[] args) { + // 代码生成器 + AutoGenerator mpg = new AutoGenerator(); + + // 全局配置 + GlobalConfig gc = new GlobalConfig(); + String projectPath = System.getProperty("user.dir"); + gc.setOutputDir(projectPath + "/src/main/java/"); + gc.setAuthor("727869402@qq.com"); + gc.setOpen(false); + gc.setFileOverride(true); + gc.setSwagger2(true); + gc.setBaseColumnList(true); + gc.setBaseResultMap(true); + gc.setServiceName("%sService"); + gc.setIdType(IdType.ASSIGN_UUID); + gc.setDateType(DateType.ONLY_DATE); + + + mpg.setGlobalConfig(gc); + + // 数据源配置 + DataSourceConfig dsc = new DataSourceConfig(); + dsc.setUrl("jdbc:mysql://127.0.0.1:3306/ddxhs?useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8"); + dsc.setUsername("root"); + dsc.setPassword("admin"); + + // dsc.setSchemaName("public"); + dsc.setDriverName("com.mysql.cj.jdbc.Driver"); + + mpg.setDataSource(dsc); + + // 包配置 + PackageConfig pc = new PackageConfig(); + pc.setParent(PACKAGE_NAME); + pc.setModuleName(scanner("模块名")); + mpg.setPackageInfo(pc); + + + // 自定义配置 + InjectionConfig cfg = new InjectionConfig() { + @Override + public void initMap() { + //传入自定义字符串 在模板中使用 ${cfg.xx} 调用 + // to do nothing + Map map = new HashMap(); + map.put("firstModule", FIRST_MODULE); + map.put("packageName", PACKAGE_NAME); + map.put("voPath", PACKAGE_NAME + "." + pc.getModuleName() + ".domain"); + map.put("dtoPath", PACKAGE_NAME + "." + pc.getModuleName() + ".domain"); + this.setMap(map); + } + }; + List focList = new ArrayList<>(); + + focList.add(new FileOutConfig("/templates/BusinessMapper.xml.ftl") { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输入文件名称 + return projectPath + "/src/main/java/" + + "/com/dd/admin/" + FIRST_MODULE + "/" + pc.getModuleName() + "/mapper/xml/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; + } + }); + //生成自定义Vo + focList.add(new FileOutConfig("/templates/Vo.java.ftl") { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输入文件名称 + return projectPath + "/src/main/java/\\com\\dd\\admin\\" + FIRST_MODULE + "/" + pc.getModuleName() + "/domain/" + + tableInfo.getEntityName() + "Vo.java"; + } + }); + //生成自定义Dto + focList.add(new FileOutConfig("/templates/Dto.java.ftl") { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输入文件名称 + return projectPath + "/src/main/java/\\com\\dd\\admin\\" + FIRST_MODULE + "/" + pc.getModuleName() + "/domain/" + + tableInfo.getEntityName() + "Dto.java"; + } + }); + + + //生成自定义Js + focList.add(new FileOutConfig("/templates/Js.ftl") { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输入文件名称 + return projectPath + "/web/\\src\\api\\" + FIRST_MODULE + "/" + pc.getModuleName() + "/" + + pc.getModuleName() + ".js"; + } + }); + + //生成自定义List + focList.add(new FileOutConfig("/templates/List.ftl") { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输入文件名称 + return projectPath + "/web/\\src\\views\\" + FIRST_MODULE + "/" + pc.getModuleName() + "/" + + pc.getModuleName() + "List.vue"; + } + }); + + //生成自定义add + focList.add(new FileOutConfig("/templates/addForm.ftl") { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输入文件名称 + return projectPath + "/web/\\src\\views\\" + FIRST_MODULE + "/" + pc.getModuleName() + "/" + + "add" + tableInfo.getEntityName() + ".vue"; + } + }); + + //生成自定义edit + focList.add(new FileOutConfig("/templates/editForm.ftl") { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输入文件名称 + return projectPath + "/web/\\src\\views\\" + FIRST_MODULE + "/" + pc.getModuleName() + "/" + + "edit" + tableInfo.getEntityName() + ".vue"; + } + }); + + + TemplateConfig templateConfig = new TemplateConfig(); + //自定义controller + templateConfig.setController("/templates/BusinessController.java"); + templateConfig.setService("/templates/BusinessService.java"); + templateConfig.setServiceImpl("/templates/BusinessServiceImpl.java"); + templateConfig.setMapper("/templates/BusinessMapper.java"); + // 配置自定义输出模板 + //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别 + templateConfig.setXml(null); + mpg.setTemplate(templateConfig); + + cfg.setFileOutConfigList(focList); + mpg.setCfg(cfg); + + List tableFillList = new ArrayList(); + //如 每张表都有一个创建时间、修改时间 + //而且这基本上就是通用的了,新增时,创建时间和修改时间同时修改 + //修改时,修改时间会修改, + //虽然像Mysql数据库有自动更新几只,但像ORACLE的数据库就没有了, + //使用公共字段填充功能,就可以实现,自动按场景更新了。 + //如下是配置 + TableFill createName = new TableFill("CREATE_NAME", FieldFill.INSERT); + TableFill createId = new TableFill("CREATE_ID", FieldFill.INSERT); + TableFill createTime = new TableFill("CREATE_TIME", FieldFill.INSERT); + TableFill deptId = new TableFill("DEPT_ID", FieldFill.INSERT); + TableFill shopId = new TableFill("SHOP_ID", FieldFill.INSERT); + TableFill deptName = new TableFill("DEPT_NAME", FieldFill.INSERT); + TableFill shopName = new TableFill("SHOP_NAME", FieldFill.INSERT); + tableFillList.add(createName); + tableFillList.add(createId); + tableFillList.add(createTime); + tableFillList.add(deptId); + tableFillList.add(deptName); + tableFillList.add(shopId); + tableFillList.add(deptName); + tableFillList.add(shopName); + + TableFill modifyName = new TableFill("UPDATE_NAME", FieldFill.UPDATE); + TableFill modifyId = new TableFill("UPDATE_ID", FieldFill.UPDATE); + TableFill modifyTime = new TableFill("UPDATE_TIME", FieldFill.UPDATE); + + tableFillList.add(modifyName); + tableFillList.add(modifyId); + tableFillList.add(modifyTime); + + + // 策略配置 + StrategyConfig strategy = new StrategyConfig(); + strategy.setNaming(NamingStrategy.underline_to_camel); + strategy.setColumnNaming(NamingStrategy.underline_to_camel); + strategy.setEntityLombokModel(true); + strategy.setInclude("business_" + scanner("输入系统表名business_{}")); + strategy.setControllerMappingHyphenStyle(true); + strategy.setTablePrefix("business_"); + strategy.setRestControllerStyle(true); + strategy.setTableFillList(tableFillList); + //配置逻辑删除字段 + strategy.setLogicDeleteFieldName("DELETED"); + //配置乐观锁字段 + strategy.setVersionFieldName("VERSION"); + mpg.setStrategy(strategy); + // 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有! + mpg.setTemplateEngine(new FreemarkerTemplateEngine()); + mpg.execute(); + } + +} diff --git a/src/test/java/com/dd/admin/SysGenerator.java b/src/test/java/com/dd/admin/SysGenerator.java new file mode 100644 index 0000000..02d4b29 --- /dev/null +++ b/src/test/java/com/dd/admin/SysGenerator.java @@ -0,0 +1,237 @@ +package com.dd.admin; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.generator.AutoGenerator; +import com.baomidou.mybatisplus.generator.InjectionConfig; +import com.baomidou.mybatisplus.generator.config.*; +import com.baomidou.mybatisplus.generator.config.po.TableFill; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; +import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; + +import java.util.*; + +/** + * Description:自动生成 自定义代码 + *

+ * date: 2021/7/6 + * + * @author: wxl + */ + +public class SysGenerator { + + /** + *

+ * 读取控制台内容 + *

+ */ + public static String scanner(String tip) { + Scanner scanner = new Scanner(System.in); + StringBuilder help = new StringBuilder(); + help.append("请输入").append(tip).append(":"); + System.out.println(help.toString()); + if (scanner.hasNext()) { + String ipt = scanner.next(); + if (StringUtils.isNotBlank(ipt)) { + return ipt; + } + } + throw new MybatisPlusException("请输入正确的" + tip + "!"); + } + + + public static String PACKAGE_NAME = "com.dd.admin.system"; + public static String FIRST_MODULE = "system"; + + /** + * RUN THIS + */ + public static void main(String[] args) { + // 代码生成器 + AutoGenerator mpg = new AutoGenerator(); + + // 全局配置 + GlobalConfig gc = new GlobalConfig(); + String projectPath = System.getProperty("user.dir"); + gc.setOutputDir(projectPath + "/src/main/java/"); + gc.setAuthor("727869402@qq.com"); + gc.setOpen(false); + gc.setFileOverride(true); + gc.setSwagger2(true); + gc.setBaseColumnList(true); + gc.setBaseResultMap(true); + gc.setServiceName("%sService"); + gc.setIdType(IdType.ASSIGN_UUID); + mpg.setGlobalConfig(gc); + + // 数据源配置 + DataSourceConfig dsc = new DataSourceConfig(); + dsc.setUrl("jdbc:mysql://127.0.0.1:3306/dd?useSSL=false&autoReconnect=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8"); + dsc.setUsername("root"); + dsc.setPassword("admin"); + + // dsc.setSchemaName("public"); + dsc.setDriverName("com.mysql.cj.jdbc.Driver"); + + mpg.setDataSource(dsc); + + // 包配置 + PackageConfig pc = new PackageConfig(); + pc.setParent(PACKAGE_NAME); + pc.setModuleName(scanner("模块名")); + mpg.setPackageInfo(pc); + + + // 自定义配置 + InjectionConfig cfg = new InjectionConfig() { + @Override + public void initMap() { + //传入自定义字符串 在模板中使用 ${cfg.xx} 调用 + // to do nothing + Map map = new HashMap(); + map.put("firstModule", FIRST_MODULE); + map.put("packageName", PACKAGE_NAME); + map.put("voPath", PACKAGE_NAME + "." + pc.getModuleName() + ".domain"); + map.put("dtoPath", PACKAGE_NAME + "." + pc.getModuleName() + ".domain"); + this.setMap(map); + } + }; + List focList = new ArrayList<>(); + + focList.add(new FileOutConfig("/templates/BusinessMapper.xml.ftl") { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输入文件名称 + return projectPath + "/src/main/java/" + + "/com/dd/admin/" + FIRST_MODULE + "/" + pc.getModuleName() + "/mapper/xml/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; + } + }); + //生成自定义Vo + focList.add(new FileOutConfig("/templates/Vo.java.ftl") { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输入文件名称 + return projectPath + "/src/main/java/\\com\\dd\\admin\\" + FIRST_MODULE + "/" + pc.getModuleName() + "/domain/" + + tableInfo.getEntityName() + "Vo.java"; + } + }); + //生成自定义Dto + focList.add(new FileOutConfig("/templates/Dto.java.ftl") { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输入文件名称 + return projectPath + "/src/main/java/\\com\\dd\\admin\\" + FIRST_MODULE + "/" + pc.getModuleName() + "/domain/" + + tableInfo.getEntityName() + "Dto.java"; + } + }); + + + //生成自定义Js + focList.add(new FileOutConfig("/templates/Js.ftl") { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输入文件名称 + return projectPath + "/web/\\src\\api\\" + FIRST_MODULE + "/" + pc.getModuleName() + "/" + + pc.getModuleName() + ".js"; + } + }); + + //生成自定义List + focList.add(new FileOutConfig("/templates/List.ftl") { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输入文件名称 + return projectPath + "/web/\\src\\views\\" + FIRST_MODULE + "/" + pc.getModuleName() + "/" + + pc.getModuleName() + "List.vue"; + } + }); + + //生成自定义add + focList.add(new FileOutConfig("/templates/addForm.ftl") { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输入文件名称 + return projectPath + "/web/\\src\\views\\" + FIRST_MODULE + "/" + pc.getModuleName() + "/" + + "add" + tableInfo.getEntityName() + ".vue"; + } + }); + + //生成自定义edit + focList.add(new FileOutConfig("/templates/editForm.ftl") { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输入文件名称 + return projectPath + "/web/\\src\\views\\" + FIRST_MODULE + "/" + pc.getModuleName() + "/" + + "edit" + tableInfo.getEntityName() + ".vue"; + } + }); + + + TemplateConfig templateConfig = new TemplateConfig(); + //自定义controller + templateConfig.setController("/templates/BusinessController.java"); + templateConfig.setService("/templates/BusinessService.java"); + templateConfig.setServiceImpl("/templates/BusinessServiceImpl.java"); + templateConfig.setMapper("/templates/BusinessMapper.java"); + // 配置自定义输出模板 + //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别 + templateConfig.setXml(null); + mpg.setTemplate(templateConfig); + + cfg.setFileOutConfigList(focList); + mpg.setCfg(cfg); + + List tableFillList = new ArrayList(); + //如 每张表都有一个创建时间、修改时间 + //而且这基本上就是通用的了,新增时,创建时间和修改时间同时修改 + //修改时,修改时间会修改, + //虽然像Mysql数据库有自动更新几只,但像ORACLE的数据库就没有了, + //使用公共字段填充功能,就可以实现,自动按场景更新了。 + //如下是配置 + TableFill createName = new TableFill("CREATE_NAME", FieldFill.INSERT); + TableFill createId = new TableFill("CREATE_ID", FieldFill.INSERT); + TableFill createTime = new TableFill("CREATE_TIME", FieldFill.INSERT); + TableFill deptId = new TableFill("DEPT_ID", FieldFill.INSERT); + TableFill deptName = new TableFill("DEPT_NAME", FieldFill.INSERT); + tableFillList.add(createName); + tableFillList.add(createId); + tableFillList.add(createTime); + tableFillList.add(deptId); + tableFillList.add(deptName); + + + TableFill modifyName = new TableFill("UPDATE_NAME", FieldFill.UPDATE); + TableFill modifyId = new TableFill("UPDATE_ID", FieldFill.UPDATE); + TableFill modifyTime = new TableFill("UPDATE_TIME", FieldFill.UPDATE); + + tableFillList.add(modifyName); + tableFillList.add(modifyId); + tableFillList.add(modifyTime); + + + // 策略配置 + StrategyConfig strategy = new StrategyConfig(); + strategy.setNaming(NamingStrategy.underline_to_camel); + strategy.setColumnNaming(NamingStrategy.underline_to_camel); + strategy.setEntityLombokModel(true); + strategy.setInclude("sys_" + scanner("输入系统表名sys_{}")); + strategy.setControllerMappingHyphenStyle(true); + strategy.setTablePrefix("sys_"); + strategy.setRestControllerStyle(true); + strategy.setTableFillList(tableFillList); + //配置逻辑删除字段 + strategy.setLogicDeleteFieldName("DELETED"); + //配置乐观锁字段 + strategy.setVersionFieldName("VERSION"); + mpg.setStrategy(strategy); + // 选择 freemarker 引擎需要指定如下加,注意 pom 依赖必须有! + mpg.setTemplateEngine(new FreemarkerTemplateEngine()); + mpg.execute(); + } + +} diff --git a/web/.editorconfig b/web/.editorconfig new file mode 100644 index 0000000..ea6e20f --- /dev/null +++ b/web/.editorconfig @@ -0,0 +1,14 @@ +# http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/web/.env.development b/web/.env.development new file mode 100644 index 0000000..064d934 --- /dev/null +++ b/web/.env.development @@ -0,0 +1,8 @@ +# just a flag +ENV = 'development' + +# base api +VUE_APP_BASE_API = 'http://127.0.0.1:8080' + +# system name +VUE_APP_SYSTEM_NAME = 'DD ADMIN' diff --git a/web/.env.production b/web/.env.production new file mode 100644 index 0000000..89f2b52 --- /dev/null +++ b/web/.env.production @@ -0,0 +1,10 @@ +# just a flag +ENV = 'production' + +# base api +VUE_APP_BASE_API = '/api' + +# system name +VUE_APP_SYSTEM_NAME = 'DD STORE' + + diff --git a/web/.env.staging b/web/.env.staging new file mode 100644 index 0000000..a8793a0 --- /dev/null +++ b/web/.env.staging @@ -0,0 +1,8 @@ +NODE_ENV = production + +# just a flag +ENV = 'staging' + +# base api +VUE_APP_BASE_API = '/stage-api' + diff --git a/web/.eslintignore b/web/.eslintignore new file mode 100644 index 0000000..e6529fc --- /dev/null +++ b/web/.eslintignore @@ -0,0 +1,4 @@ +build/*.js +src/assets +public +dist diff --git a/web/.eslintrc.js b/web/.eslintrc.js new file mode 100644 index 0000000..c977505 --- /dev/null +++ b/web/.eslintrc.js @@ -0,0 +1,198 @@ +module.exports = { + root: true, + parserOptions: { + parser: 'babel-eslint', + sourceType: 'module' + }, + env: { + browser: true, + node: true, + es6: true, + }, + extends: ['plugin:vue/recommended', 'eslint:recommended'], + + // add your custom rules here + //it is base on https://github.com/vuejs/eslint-config-vue + rules: { + "vue/max-attributes-per-line": [2, { + "singleline": 10, + "multiline": { + "max": 1, + "allowFirstLine": false + } + }], + "vue/singleline-html-element-content-newline": "off", + "vue/multiline-html-element-content-newline":"off", + "vue/name-property-casing": ["error", "PascalCase"], + "vue/no-v-html": "off", + 'accessor-pairs': 2, + 'arrow-spacing': [2, { + 'before': true, + 'after': true + }], + 'block-spacing': [2, 'always'], + 'brace-style': [2, '1tbs', { + 'allowSingleLine': true + }], + 'camelcase': [0, { + 'properties': 'always' + }], + 'comma-dangle': [2, 'never'], + 'comma-spacing': [2, { + 'before': false, + 'after': true + }], + 'comma-style': [2, 'last'], + 'constructor-super': 2, + 'curly': [2, 'multi-line'], + 'dot-location': [2, 'property'], + 'eol-last': 2, + 'eqeqeq': ["error", "always", {"null": "ignore"}], + 'generator-star-spacing': [2, { + 'before': true, + 'after': true + }], + 'handle-callback-err': [2, '^(err|error)$'], + 'indent': [2, 2, { + 'SwitchCase': 1 + }], + 'jsx-quotes': [2, 'prefer-single'], + 'key-spacing': [2, { + 'beforeColon': false, + 'afterColon': true + }], + 'keyword-spacing': [2, { + 'before': true, + 'after': true + }], + 'new-cap': [2, { + 'newIsCap': true, + 'capIsNew': false + }], + 'new-parens': 2, + 'no-array-constructor': 2, + 'no-caller': 2, + 'no-console': 'off', + 'no-class-assign': 2, + 'no-cond-assign': 2, + 'no-const-assign': 2, + 'no-control-regex': 0, + 'no-delete-var': 2, + 'no-dupe-args': 2, + 'no-dupe-class-members': 2, + 'no-dupe-keys': 2, + 'no-duplicate-case': 2, + 'no-empty-character-class': 2, + 'no-empty-pattern': 2, + 'no-eval': 2, + 'no-ex-assign': 2, + 'no-extend-native': 2, + 'no-extra-bind': 2, + 'no-extra-boolean-cast': 2, + 'no-extra-parens': [2, 'functions'], + 'no-fallthrough': 2, + 'no-floating-decimal': 2, + 'no-func-assign': 2, + 'no-implied-eval': 2, + 'no-inner-declarations': [2, 'functions'], + 'no-invalid-regexp': 2, + 'no-irregular-whitespace': 2, + 'no-iterator': 2, + 'no-label-var': 2, + 'no-labels': [2, { + 'allowLoop': false, + 'allowSwitch': false + }], + 'no-lone-blocks': 2, + 'no-mixed-spaces-and-tabs': 2, + 'no-multi-spaces': 2, + 'no-multi-str': 2, + 'no-multiple-empty-lines': [2, { + 'max': 1 + }], + 'no-native-reassign': 2, + 'no-negated-in-lhs': 2, + 'no-new-object': 2, + 'no-new-require': 2, + 'no-new-symbol': 2, + 'no-new-wrappers': 2, + 'no-obj-calls': 2, + 'no-octal': 2, + 'no-octal-escape': 2, + 'no-path-concat': 2, + 'no-proto': 2, + 'no-redeclare': 2, + 'no-regex-spaces': 2, + 'no-return-assign': [2, 'except-parens'], + 'no-self-assign': 2, + 'no-self-compare': 2, + 'no-sequences': 2, + 'no-shadow-restricted-names': 2, + 'no-spaced-func': 2, + 'no-sparse-arrays': 2, + 'no-this-before-super': 2, + 'no-throw-literal': 2, + 'no-trailing-spaces': 2, + 'no-undef': 2, + 'no-undef-init': 2, + 'no-unexpected-multiline': 2, + 'no-unmodified-loop-condition': 2, + 'no-unneeded-ternary': [2, { + 'defaultAssignment': false + }], + 'no-unreachable': 2, + 'no-unsafe-finally': 2, + 'no-unused-vars': [2, { + 'vars': 'all', + 'args': 'none' + }], + 'no-useless-call': 2, + 'no-useless-computed-key': 2, + 'no-useless-constructor': 2, + 'no-useless-escape': 0, + 'no-whitespace-before-property': 2, + 'no-with': 2, + 'one-var': [2, { + 'initialized': 'never' + }], + 'operator-linebreak': [2, 'after', { + 'overrides': { + '?': 'before', + ':': 'before' + } + }], + 'padded-blocks': [2, 'never'], + 'quotes': [2, 'single', { + 'avoidEscape': true, + 'allowTemplateLiterals': true + }], + 'semi': [2, 'never'], + 'semi-spacing': [2, { + 'before': false, + 'after': true + }], + 'space-before-blocks': [2, 'always'], + 'space-before-function-paren': [2, 'never'], + 'space-in-parens': [2, 'never'], + 'space-infix-ops': 2, + 'space-unary-ops': [2, { + 'words': true, + 'nonwords': false + }], + 'spaced-comment': [2, 'always', { + 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] + }], + 'template-curly-spacing': [2, 'never'], + 'use-isnan': 2, + 'valid-typeof': 2, + 'wrap-iife': [2, 'any'], + 'yield-star-spacing': [2, 'both'], + 'yoda': [2, 'never'], + 'prefer-const': 2, + 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, + 'object-curly-spacing': [2, 'always', { + objectsInObjects: false + }], + 'array-bracket-spacing': [2, 'never'] + } +} diff --git a/web/.gitignore b/web/.gitignore new file mode 100644 index 0000000..9ad28d2 --- /dev/null +++ b/web/.gitignore @@ -0,0 +1,16 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +package-lock.json +tests/**/coverage/ + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/web/.travis.yml b/web/.travis.yml new file mode 100644 index 0000000..f4be7a0 --- /dev/null +++ b/web/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: 10 +script: npm run test +notifications: + email: false diff --git a/web/LICENSE b/web/LICENSE new file mode 100644 index 0000000..711c4e6 --- /dev/null +++ b/web/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 零之小落 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/web/README.md b/web/README.md new file mode 100644 index 0000000..faea216 --- /dev/null +++ b/web/README.md @@ -0,0 +1,61 @@ +# vue-admin-template + +> 基于花裤衩的 [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template) 改造的 vue admin 管理后台。 + +## Demo + +线上预览: [http://vue-admin.findfuture.cn/](http://vue-admin.findfuture.cn/) + +## 构建 + +```bash +# 克隆项目(码云) +git clone https://gitee.com/iimeepo/vue-admin-template + +# 克隆项目(GitHub) +git clone https://github.com/iimeepo/vue-admin-template + +# 进入项目目录 +cd vue-admin-template + +# 安装依赖 +npm install + +# 解决 npm 下载速度慢的问题 +npm install --registry=https://registry.npm.taobao.org + +# 启动服务 +npm run dev +``` + +浏览器访问: [http://localhost:9529](http://localhost:9529) + +## 发布 + +```bash +# 构建测试环境 +npm run build:stage + +# 构建生产环境 +npm run build:prod +``` + +## 其它 + +```bash +# 预览发布环境效果 +npm run preview + +# 预览发布环境效果 + 静态资源分析 +npm run preview -- --report + +# 代码格式检查 +npm run lint + +# 代码格式检查并自动修复 +npm run lint -- --fix +``` + +## License + +[MIT](https://github.com/iimeepo/vue-admin-template/blob/master/LICENSE) license. diff --git a/web/babel.config.js b/web/babel.config.js new file mode 100644 index 0000000..fb82b27 --- /dev/null +++ b/web/babel.config.js @@ -0,0 +1,14 @@ +module.exports = { + presets: [ + // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app + '@vue/cli-plugin-babel/preset' + ], + 'env': { + 'development': { + // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require(). + // This plugin can significantly increase the speed of hot updates, when you have a large number of pages. + // https://panjiachen.github.io/vue-element-admin-site/guide/advanced/lazy-loading.html + 'plugins': ['dynamic-import-node'] + } + } +} diff --git a/web/build/index.js b/web/build/index.js new file mode 100644 index 0000000..0c57de2 --- /dev/null +++ b/web/build/index.js @@ -0,0 +1,35 @@ +const { run } = require('runjs') +const chalk = require('chalk') +const config = require('../vue.config.js') +const rawArgv = process.argv.slice(2) +const args = rawArgv.join(' ') + +if (process.env.npm_config_preview || rawArgv.includes('--preview')) { + const report = rawArgv.includes('--report') + + run(`vue-cli-service build ${args}`) + + const port = 9526 + const publicPath = config.publicPath + + var connect = require('connect') + var serveStatic = require('serve-static') + const app = connect() + + app.use( + publicPath, + serveStatic('./dist', { + index: ['index.html', '/'] + }) + ) + + app.listen(port, function () { + console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`)) + if (report) { + console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`)) + } + + }) +} else { + run(`vue-cli-service build ${args}`) +} diff --git a/web/jest.config.js b/web/jest.config.js new file mode 100644 index 0000000..143cdc8 --- /dev/null +++ b/web/jest.config.js @@ -0,0 +1,24 @@ +module.exports = { + moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], + transform: { + '^.+\\.vue$': 'vue-jest', + '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': + 'jest-transform-stub', + '^.+\\.jsx?$': 'babel-jest' + }, + moduleNameMapper: { + '^@/(.*)$': '/src/$1' + }, + snapshotSerializers: ['jest-serializer-vue'], + testMatch: [ + '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' + ], + collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'], + coverageDirectory: '/tests/unit/coverage', + // 'collectCoverage': true, + 'coverageReporters': [ + 'lcov', + 'text-summary' + ], + testURL: 'http://localhost/' +} diff --git a/web/jsconfig.json b/web/jsconfig.json new file mode 100644 index 0000000..ed079e2 --- /dev/null +++ b/web/jsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..e5d05b2 --- /dev/null +++ b/web/package.json @@ -0,0 +1,67 @@ +{ + "name": "vue-admin-template", + "version": "4.4.0", + "description": "A vue admin template with Element UI & axios & iconfont & permission control & lint", + "author": "Pan ", + "scripts": { + "dev": "vue-cli-service serve", + "build:prod": "vue-cli-service build", + "build:stage": "vue-cli-service build --mode staging", + "preview": "node build/index.js --preview", + "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml", + "lint": "eslint --ext .js,.vue src", + "test:unit": "jest --clearCache && vue-cli-service test:unit", + "test:ci": "npm run lint && npm run test:unit" + }, + "dependencies": { + "animate.css": "^4.1.1", + "axios": "0.18.1", + "core-js": "3.6.5", + "e-icon-picker": "^1.1.6", + "echarts": "^4.8.0", + "element-china-area-data": "^6.1.0", + "element-ui": "2.15.14", + "js-cookie": "2.2.0", + "normalize.css": "7.0.0", + "nprogress": "0.2.0", + "path-to-regexp": "2.4.0", + "vue": "2.6.14", + "vue-cropper": "^0.6.5", + "vue-router": "3.0.6", + "vuex": "3.1.0" + }, + "devDependencies": { + "@vue/cli-plugin-babel": "4.4.4", + "@vue/cli-plugin-eslint": "4.4.4", + "@vue/cli-plugin-unit-jest": "4.4.4", + "@vue/cli-service": "4.4.4", + "@vue/test-utils": "1.0.0-beta.29", + "autoprefixer": "9.5.1", + "babel-eslint": "10.1.0", + "babel-jest": "23.6.0", + "babel-plugin-dynamic-import-node": "2.3.3", + "chalk": "2.4.2", + "connect": "3.6.6", + "eslint": "6.7.2", + "eslint-plugin-vue": "6.2.2", + "html-webpack-plugin": "3.2.0", + "mockjs": "1.0.1-beta3", + "runjs": "4.3.2", + "sass": "1.26.8", + "sass-loader": "8.0.2", + "script-ext-html-webpack-plugin": "2.1.3", + "serve-static": "1.13.2", + "svg-sprite-loader": "4.1.3", + "svgo": "1.2.2", + "vue-template-compiler": "2.6.14" + }, + "browserslist": [ + "> 1%", + "last 2 versions" + ], + "engines": { + "node": ">=8.9", + "npm": ">= 3.0.0" + }, + "license": "MIT" +} diff --git a/web/postcss.config.js b/web/postcss.config.js new file mode 100644 index 0000000..10473ef --- /dev/null +++ b/web/postcss.config.js @@ -0,0 +1,8 @@ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + 'plugins': { + // to edit target browsers: use "browserslist" field in package.json + 'autoprefixer': {} + } +} diff --git a/web/public/favicon.ico b/web/public/favicon.ico new file mode 100644 index 0000000..34b63ac Binary files /dev/null and b/web/public/favicon.ico differ diff --git a/web/public/index.html b/web/public/index.html new file mode 100644 index 0000000..fa2be91 --- /dev/null +++ b/web/public/index.html @@ -0,0 +1,17 @@ + + + + + + + + <%= webpackConfig.name %> + + + +
+ + + diff --git a/web/src/App.vue b/web/src/App.vue new file mode 100644 index 0000000..ec9032c --- /dev/null +++ b/web/src/App.vue @@ -0,0 +1,11 @@ + + + diff --git a/web/src/api/article.js b/web/src/api/article.js new file mode 100644 index 0000000..389315c --- /dev/null +++ b/web/src/api/article.js @@ -0,0 +1,17 @@ +import request from '@/utils/request' + +export function getList(params) { + return request({ + url: '/vue-admin-template/article/list', + method: 'get', + params + }) +} + +export function getCategory(params) { + return request({ + url: '/vue-admin-template/article/category', + method: 'get', + params + }) +} diff --git a/web/src/api/banner.js b/web/src/api/banner.js new file mode 100644 index 0000000..a9b3b04 --- /dev/null +++ b/web/src/api/banner.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +export function getList(params) { + return request({ + url: '/vue-admin-template/banner/list', + method: 'get', + params + }) +} diff --git a/web/src/api/business/card/card.js b/web/src/api/business/card/card.js new file mode 100644 index 0000000..158e171 --- /dev/null +++ b/web/src/api/business/card/card.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function getCardPage(params) { + return request({ + url: '/admin/card/page', + method: 'get', + params + }) +} + +export function getCardList(params) { + return request({ + url: '/admin/card/list', + method: 'get', + params + }) +} + +export function addCard(data) { + return request({ + url: '/admin/card/add', + method: 'post', + data: data + }) +} + +export function editCard(data) { + return request({ + url: '/admin/card/update', + method: 'post', + data: data + }) +} + +export function deleteCard(cardId) { + return request({ + url: '/admin/card/delete/' + cardId, + method: 'get' + }) +} + diff --git a/web/src/api/business/category/category.js b/web/src/api/business/category/category.js new file mode 100644 index 0000000..c4a3f9f --- /dev/null +++ b/web/src/api/business/category/category.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function getCategoryPage(params) { + return request({ + url: '/admin/category/page', + method: 'get', + params + }) +} + +export function getCategoryList(params) { + return request({ + url: '/admin/category/list', + method: 'get', + params + }) +} + +export function addCategory(data) { + return request({ + url: '/admin/category/add', + method: 'post', + data: data + }) +} + +export function editCategory(data) { + return request({ + url: '/admin/category/update', + method: 'post', + data: data + }) +} + +export function deleteCategory(categoryId) { + return request({ + url: '/admin/category/delete/' + categoryId, + method: 'get' + }) +} + diff --git a/web/src/api/business/detailServer/detailServer.js b/web/src/api/business/detailServer/detailServer.js new file mode 100644 index 0000000..e3d9e2e --- /dev/null +++ b/web/src/api/business/detailServer/detailServer.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function getSellDetailServerPage(params) { + return request({ + url: '/admin/detailServer/page', + method: 'get', + params + }) +} + +export function getSellDetailServerList(params) { + return request({ + url: '/admin/detailServer/list', + method: 'get', + params + }) +} + +export function addSellDetailServer(data) { + return request({ + url: '/admin/detailServer/add', + method: 'post', + data: data + }) +} + +export function editSellDetailServer(data) { + return request({ + url: '/admin/detailServer/update', + method: 'post', + data: data + }) +} + +export function deleteSellDetailServer(detailServerId) { + return request({ + url: '/admin/detailServer/delete/' + detailServerId, + method: 'get' + }) +} + diff --git a/web/src/api/business/file/file.js b/web/src/api/business/file/file.js new file mode 100644 index 0000000..ccb24e9 --- /dev/null +++ b/web/src/api/business/file/file.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function getFilePage(params) { + return request({ + url: '/admin/file/page', + method: 'get', + params + }) +} + +export function getFileList(params) { + return request({ + url: '/admin/file/list', + method: 'get', + params + }) +} + +export function addFile(data) { + return request({ + url: '/admin/file/add', + method: 'post', + data: data + }) +} + +export function editFile(data) { + return request({ + url: '/admin/file/update', + method: 'post', + data: data + }) +} + +export function deleteFile(fileId) { + return request({ + url: '/admin/file/delete/' + fileId, + method: 'get' + }) +} + diff --git a/web/src/api/business/member/member.js b/web/src/api/business/member/member.js new file mode 100644 index 0000000..0eb6bb0 --- /dev/null +++ b/web/src/api/business/member/member.js @@ -0,0 +1,49 @@ +import request from '@/utils/request' + +export function getMemberPage(params) { + return request({ + url: '/admin/member/page', + method: 'get', + params + }) +} + +export function getMemberList(params) { + return request({ + url: '/admin/member/list', + method: 'get', + params + }) +} + +export function getMemberSearchList(params) { + return request({ + url: '/admin/member/searchList', + method: 'get', + params + }) +} + +export function addMember(data) { + return request({ + url: '/admin/member/add', + method: 'post', + data: data + }) +} + +export function editMember(data) { + return request({ + url: '/admin/member/update', + method: 'post', + data: data + }) +} + +export function deleteMember(memberId) { + return request({ + url: '/admin/member/delete/' + memberId, + method: 'get' + }) +} + diff --git a/web/src/api/business/memberCard/memberCard.js b/web/src/api/business/memberCard/memberCard.js new file mode 100644 index 0000000..40e6dc2 --- /dev/null +++ b/web/src/api/business/memberCard/memberCard.js @@ -0,0 +1,49 @@ +import request from '@/utils/request' + +export function getMemberCardPage(params) { + return request({ + url: '/admin/memberCard/page', + method: 'get', + params + }) +} + +export function getMemberCardList(params) { + return request({ + url: '/admin/memberCard/list', + method: 'get', + params + }) +} + +export function getMemberCardSearchList(params) { + return request({ + url: '/admin/memberCard/searchList', + method: 'get', + params + }) +} + +export function addMemberCard(data) { + return request({ + url: '/admin/memberCard/add', + method: 'post', + data: data + }) +} + +export function editMemberCard(data) { + return request({ + url: '/admin/memberCard/update', + method: 'post', + data: data + }) +} + +export function deleteMemberCard(memberCardId) { + return request({ + url: '/admin/memberCard/delete/' + memberCardId, + method: 'get' + }) +} + diff --git a/web/src/api/business/operationLog/operationLog.js b/web/src/api/business/operationLog/operationLog.js new file mode 100644 index 0000000..8cbf6c9 --- /dev/null +++ b/web/src/api/business/operationLog/operationLog.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function getOperationLogPage(params) { + return request({ + url: '/admin/operationLog/page', + method: 'get', + params + }) +} + +export function getOperationLogList(params) { + return request({ + url: '/admin/operationLog/list', + method: 'get', + params + }) +} + +export function addOperationLog(data) { + return request({ + url: '/admin/operationLog/add', + method: 'post', + data: data + }) +} + +export function editOperationLog(data) { + return request({ + url: '/admin/operationLog/update', + method: 'post', + data: data + }) +} + +export function deleteOperationLog(operationLogId) { + return request({ + url: '/admin/operationLog/delete/' + operationLogId, + method: 'get' + }) +} + diff --git a/web/src/api/business/pay/pay.js b/web/src/api/business/pay/pay.js new file mode 100644 index 0000000..a5c88b1 --- /dev/null +++ b/web/src/api/business/pay/pay.js @@ -0,0 +1,25 @@ +import request from '@/utils/request' + +export function buildCard(data) { + return request({ + url: '/pay/buildCard', + method: 'post', + data: data + }) +} + +export function chargedCard(data) { + return request({ + url: '/pay/chargedCard', + method: 'post', + data: data + }) +} + +export function productPay(data) { + return request({ + url: '/pay/productPay', + method: 'post', + data: data + }) +} diff --git a/web/src/api/business/product/product.js b/web/src/api/business/product/product.js new file mode 100644 index 0000000..5bbb1f4 --- /dev/null +++ b/web/src/api/business/product/product.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function getProductPage(params) { + return request({ + url: '/admin/product/page', + method: 'get', + params + }) +} + +export function getProductList(params) { + return request({ + url: '/admin/product/list', + method: 'get', + params + }) +} + +export function addProduct(data) { + return request({ + url: '/admin/product/add', + method: 'post', + data: data + }) +} + +export function editProduct(data) { + return request({ + url: '/admin/product/update', + method: 'post', + data: data + }) +} + +export function deleteProduct(productId) { + return request({ + url: '/admin/product/delete/' + productId, + method: 'get' + }) +} + diff --git a/web/src/api/business/sell/sell.js b/web/src/api/business/sell/sell.js new file mode 100644 index 0000000..a092f35 --- /dev/null +++ b/web/src/api/business/sell/sell.js @@ -0,0 +1,48 @@ +import request from '@/utils/request' + +export function getSellPage(params) { + return request({ + url: '/admin/sell/page', + method: 'get', + params + }) +} + +export function getSellList(params) { + return request({ + url: '/admin/sell/list', + method: 'get', + params + }) +} + +export function addSell(data) { + return request({ + url: '/admin/sell/add', + method: 'post', + data: data + }) +} + +export function editSell(data) { + return request({ + url: '/admin/sell/update', + method: 'post', + data: data + }) +} + +export function deleteSell(sellId) { + return request({ + url: '/admin/sell/delete/' + sellId, + method: 'get' + }) +} + +export function cancelSell(data) { + return request({ + url: '/admin/sell/cancel', + method: 'post', + data: data + }) +} diff --git a/web/src/api/business/sellDetail/sellDetail.js b/web/src/api/business/sellDetail/sellDetail.js new file mode 100644 index 0000000..ea9e39a --- /dev/null +++ b/web/src/api/business/sellDetail/sellDetail.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function getSellDetailPage(params) { + return request({ + url: '/admin/sellDetail/page', + method: 'get', + params + }) +} + +export function getSellDetailList(params) { + return request({ + url: '/admin/sellDetail/list', + method: 'get', + params + }) +} + +export function addSellDetail(data) { + return request({ + url: '/admin/sellDetail/add', + method: 'post', + data: data + }) +} + +export function editSellDetail(data) { + return request({ + url: '/admin/sellDetail/update', + method: 'post', + data: data + }) +} + +export function deleteSellDetail(sellDetailId) { + return request({ + url: '/admin/sellDetail/delete/' + sellDetailId, + method: 'get' + }) +} + diff --git a/web/src/api/business/sellJson/sellJson.js b/web/src/api/business/sellJson/sellJson.js new file mode 100644 index 0000000..c45d47b --- /dev/null +++ b/web/src/api/business/sellJson/sellJson.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function getSelljsonPage(params) { + return request({ + url: '/admin/sellJson/page', + method: 'get', + params + }) +} + +export function getSelljsonList(params) { + return request({ + url: '/admin/sellJson/list', + method: 'get', + params + }) +} + +export function addSelljson(data) { + return request({ + url: '/admin/sellJson/add', + method: 'post', + data: data + }) +} + +export function editSelljson(data) { + return request({ + url: '/admin/sellJson/update', + method: 'post', + data: data + }) +} + +export function deleteSelljson(sellJsonId) { + return request({ + url: '/admin/sellJson/delete/' + sellJsonId, + method: 'get' + }) +} + diff --git a/web/src/api/business/sellPay/sellPay.js b/web/src/api/business/sellPay/sellPay.js new file mode 100644 index 0000000..40489ba --- /dev/null +++ b/web/src/api/business/sellPay/sellPay.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function getSellpayPage(params) { + return request({ + url: '/admin/sellPay/page', + method: 'get', + params + }) +} + +export function getSellpayList(params) { + return request({ + url: '/admin/sellPay/list', + method: 'get', + params + }) +} + +export function addSellpay(data) { + return request({ + url: '/admin/sellPay/add', + method: 'post', + data: data + }) +} + +export function editSellpay(data) { + return request({ + url: '/admin/sellPay/update', + method: 'post', + data: data + }) +} + +export function deleteSellpay(sellPayId) { + return request({ + url: '/admin/sellPay/delete/' + sellPayId, + method: 'get' + }) +} + diff --git a/web/src/api/business/server/server.js b/web/src/api/business/server/server.js new file mode 100644 index 0000000..78cfdc8 --- /dev/null +++ b/web/src/api/business/server/server.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function getServerPage(params) { + return request({ + url: '/admin/server/page', + method: 'get', + params + }) +} + +export function getServerList(params) { + return request({ + url: '/admin/server/list', + method: 'get', + params + }) +} + +export function addServer(data) { + return request({ + url: '/admin/server/add', + method: 'post', + data: data + }) +} + +export function editServer(data) { + return request({ + url: '/admin/server/update', + method: 'post', + data: data + }) +} + +export function deleteServer(serverId) { + return request({ + url: '/admin/server/delete/' + serverId, + method: 'get' + }) +} + diff --git a/web/src/api/business/stats/stats.js b/web/src/api/business/stats/stats.js new file mode 100644 index 0000000..d19dec3 --- /dev/null +++ b/web/src/api/business/stats/stats.js @@ -0,0 +1,10 @@ +import request from '@/utils/request' + +export function getDashboardInfo(params) { + return request({ + url: '/admin/stats/getDashboardInfo', + method: 'get', + params + }) +} + diff --git a/web/src/api/business/stock/stock.js b/web/src/api/business/stock/stock.js new file mode 100644 index 0000000..d534565 --- /dev/null +++ b/web/src/api/business/stock/stock.js @@ -0,0 +1,49 @@ +import request from '@/utils/request' + +export function getStockPage(params) { + return request({ + url: '/admin/stock/page', + method: 'get', + params + }) +} + +export function getStockList(params) { + return request({ + url: '/admin/stock/list', + method: 'get', + params + }) +} + +export function addStock(data) { + return request({ + url: '/admin/stock/add', + method: 'post', + data: data + }) +} + +export function addStockOut(data) { + return request({ + url: '/admin/stock/addStockOut', + method: 'post', + data: data + }) +} + +export function editStock(data) { + return request({ + url: '/admin/stock/update', + method: 'post', + data: data + }) +} + +export function deleteStock(stockId) { + return request({ + url: '/admin/stock/delete/' + stockId, + method: 'get' + }) +} + diff --git a/web/src/api/business/stockDetail/stockDetail.js b/web/src/api/business/stockDetail/stockDetail.js new file mode 100644 index 0000000..57892a4 --- /dev/null +++ b/web/src/api/business/stockDetail/stockDetail.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function getStockDetailPage(params) { + return request({ + url: '/admin/stockDetail/page', + method: 'get', + params + }) +} + +export function getStockDetailList(params) { + return request({ + url: '/admin/stockDetail/list', + method: 'get', + params + }) +} + +export function addStockDetail(data) { + return request({ + url: '/admin/stockDetail/add', + method: 'post', + data: data + }) +} + +export function editStockDetail(data) { + return request({ + url: '/admin/stockDetail/update', + method: 'post', + data: data + }) +} + +export function deleteStockDetail(stockDetailId) { + return request({ + url: '/admin/stockDetail/delete/' + stockDetailId, + method: 'get' + }) +} + diff --git a/web/src/api/link.js b/web/src/api/link.js new file mode 100644 index 0000000..1580dff --- /dev/null +++ b/web/src/api/link.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +export function getList(params) { + return request({ + url: '/vue-admin-template/link/list', + method: 'get', + params + }) +} diff --git a/web/src/api/log.js b/web/src/api/log.js new file mode 100644 index 0000000..26c7c80 --- /dev/null +++ b/web/src/api/log.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +export function getList(params) { + return request({ + url: '/vue-admin-template/log/list', + method: 'get', + params + }) +} diff --git a/web/src/api/menu.js b/web/src/api/menu.js new file mode 100644 index 0000000..270c4ad --- /dev/null +++ b/web/src/api/menu.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +export function getList(params) { + return request({ + url: '/vue-admin-template/menu/list', + method: 'get', + params + }) +} diff --git a/web/src/api/permission.js b/web/src/api/permission.js new file mode 100644 index 0000000..0500253 --- /dev/null +++ b/web/src/api/permission.js @@ -0,0 +1,8 @@ +import request from '@/utils/request' + +export function getroutes() { + return request({ + url: '/admin/user/getroutes', + method: 'get' + }) +} diff --git a/web/src/api/role.js b/web/src/api/role.js new file mode 100644 index 0000000..fba657f --- /dev/null +++ b/web/src/api/role.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +export function getList(params) { + return request({ + url: '/vue-admin-template/role/list', + method: 'get', + params + }) +} diff --git a/web/src/api/system/dept/dept.js b/web/src/api/system/dept/dept.js new file mode 100644 index 0000000..2c4a37d --- /dev/null +++ b/web/src/api/system/dept/dept.js @@ -0,0 +1,50 @@ +import request from '@/utils/request' + +export function getDeptPage(params) { + return request({ + url: '/admin/dept/page', + method: 'get', + params + }) +} + +export function getDeptList(params) { + return request({ + url: '/admin/dept/list', + method: 'get', + params + }) +} + + +export function getDeptTree(params) { + return request({ + url: '/admin/dept/tree', + method: 'get', + params + }) +} + +export function addDept(data) { + return request({ + url: '/admin/dept/add', + method: 'post', + data: data + }) +} + +export function editDept(data) { + return request({ + url: '/admin/dept/update', + method: 'post', + data: data + }) +} + +export function deleteDept(deptId) { + return request({ + url: '/admin/dept/delete/' + deptId, + method: 'get' + }) +} + diff --git a/web/src/api/system/menu/menu.js b/web/src/api/system/menu/menu.js new file mode 100644 index 0000000..22aa79e --- /dev/null +++ b/web/src/api/system/menu/menu.js @@ -0,0 +1,57 @@ +import request from '@/utils/request' + +export function getMenuPage(params) { + return request({ + url: '/admin/menu/page', + method: 'get', + params + }) +} + +export function getMenuList(params) { + return request({ + url: '/admin/menu/list', + method: 'get', + params + }) +} + +export function getMenuTree(params) { + return request({ + url: '/admin/menu/tree', + method: 'get', + params + }) +} + +export function getMenuTreeTable(params) { + return request({ + url: '/admin/menu/treeTable', + method: 'get', + params + }) +} + +export function addMenu(data) { + return request({ + url: '/admin/menu/add', + method: 'post', + data: data + }) +} + +export function editMenu(data) { + return request({ + url: '/admin/menu/update', + method: 'post', + data: data + }) +} + +export function deleteMenu(menuId) { + return request({ + url: '/admin/menu/delete/' + menuId, + method: 'get' + }) +} + diff --git a/web/src/api/system/role/role.js b/web/src/api/system/role/role.js new file mode 100644 index 0000000..09ae12e --- /dev/null +++ b/web/src/api/system/role/role.js @@ -0,0 +1,56 @@ +import request from '@/utils/request' + +export function getRolePage(params) { + return request({ + url: '/admin/role/page', + method: 'get', + params + }) +} + +export function getRoleList(params) { + return request({ + url: '/admin/role/list', + method: 'get', + params + }) +} + +export function getRoleMenu(roleId) { + return request({ + url: '/admin/role/menu/' + roleId, + method: 'get' + }) +} + +export function editRoleMenu(data) { + return request({ + url: '/admin/role/menu/update', + method: 'post', + data: data + }) +} + +export function addRole(data) { + return request({ + url: '/admin/role/add', + method: 'post', + data: data + }) +} + +export function editRole(data) { + return request({ + url: '/admin/role/update', + method: 'post', + data: data + }) +} + +export function deleteRole(roleId) { + return request({ + url: '/admin/role/delete/' + roleId, + method: 'get' + }) +} + diff --git a/web/src/api/system/roleMenu/roleMenu.js b/web/src/api/system/roleMenu/roleMenu.js new file mode 100644 index 0000000..da5bc92 --- /dev/null +++ b/web/src/api/system/roleMenu/roleMenu.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function getRoleMenuPage(params) { + return request({ + url: '/admin/roleMenu/page', + method: 'get', + params + }) +} + +export function getRoleMenuList(params) { + return request({ + url: '/admin/roleMenu/list', + method: 'get', + params + }) +} + +export function addRoleMenu(data) { + return request({ + url: '/admin/roleMenu/add', + method: 'post', + data: data + }) +} + +export function editRoleMenu(data) { + return request({ + url: '/admin/roleMenu/update', + method: 'post', + data: data + }) +} + +export function deleteRoleMenu(roleMenuId) { + return request({ + url: '/admin/roleMenu/delete/' + roleMenuId, + method: 'get' + }) +} + diff --git a/web/src/api/system/user/user.js b/web/src/api/system/user/user.js new file mode 100644 index 0000000..210fde9 --- /dev/null +++ b/web/src/api/system/user/user.js @@ -0,0 +1,56 @@ +import request from '@/utils/request' + +export function getUserPage(params) { + return request({ + url: '/admin/user/page', + method: 'get', + params + }) +} + +export function getUserList(params) { + return request({ + url: '/admin/user/list', + method: 'get', + params + }) +} + +export function addUser(data) { + return request({ + url: '/admin/user/add', + method: 'post', + data: data + }) +} + +export function editUser(data) { + return request({ + url: '/admin/user/update', + method: 'post', + data: data + }) +} + +export function deleteUser(userId) { + return request({ + url: '/admin/user/delete/' + userId, + method: 'get' + }) +} + +export function resetPassword(userId) { + return request({ + url: '/admin/user/resetPass/' + userId, + method: 'get' + }) +} + + +export function updatePassword(data) { + return request({ + url: '/admin/user/updatePassword', + method: 'post', + data: data + }) +} diff --git a/web/src/api/system/userRole/userRole.js b/web/src/api/system/userRole/userRole.js new file mode 100644 index 0000000..6088998 --- /dev/null +++ b/web/src/api/system/userRole/userRole.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function getUserRolePage(params) { + return request({ + url: '/admin/userRole/page', + method: 'get', + params + }) +} + +export function getUserRoleList(params) { + return request({ + url: '/admin/userRole/list', + method: 'get', + params + }) +} + +export function addUserRole(data) { + return request({ + url: '/admin/userRole/add', + method: 'post', + data: data + }) +} + +export function editUserRole(data) { + return request({ + url: '/admin/userRole/update', + method: 'post', + data: data + }) +} + +export function deleteUserRole(userRoleId) { + return request({ + url: '/admin/userRole/delete/' + userRoleId, + method: 'get' + }) +} + diff --git a/web/src/api/user.js b/web/src/api/user.js new file mode 100644 index 0000000..777cf29 --- /dev/null +++ b/web/src/api/user.js @@ -0,0 +1,31 @@ +import request from '@/utils/request' + +export function login(data) { + return request({ + url: '/admin/login', + method: 'post', + data + }) +} + +export function getInfo(token) { + return request({ + url: '/admin/user/info', + method: 'get' + }) +} + +export function getList(params) { + return request({ + url: '/vue-admin-template/user/list', + method: 'get', + params + }) +} + +export function logout() { + return request({ + url: '/admin/user/logout', + method: 'post' + }) +} diff --git a/web/src/assets/404_images/404.png b/web/src/assets/404_images/404.png new file mode 100644 index 0000000..3d8e230 Binary files /dev/null and b/web/src/assets/404_images/404.png differ diff --git a/web/src/assets/404_images/404_cloud.png b/web/src/assets/404_images/404_cloud.png new file mode 100644 index 0000000..c6281d0 Binary files /dev/null and b/web/src/assets/404_images/404_cloud.png differ diff --git a/web/src/assets/logo.png b/web/src/assets/logo.png new file mode 100644 index 0000000..8bd7972 Binary files /dev/null and b/web/src/assets/logo.png differ diff --git a/web/src/assets/xiaoxin.jpeg b/web/src/assets/xiaoxin.jpeg new file mode 100644 index 0000000..28c5a0b Binary files /dev/null and b/web/src/assets/xiaoxin.jpeg differ diff --git a/web/src/components/Breadcrumb/index.vue b/web/src/components/Breadcrumb/index.vue new file mode 100644 index 0000000..f8415fd --- /dev/null +++ b/web/src/components/Breadcrumb/index.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/web/src/components/Charts/Keyboard.vue b/web/src/components/Charts/Keyboard.vue new file mode 100644 index 0000000..0b258f3 --- /dev/null +++ b/web/src/components/Charts/Keyboard.vue @@ -0,0 +1,155 @@ + + + diff --git a/web/src/components/Charts/LineMarker.vue b/web/src/components/Charts/LineMarker.vue new file mode 100644 index 0000000..3dd7436 --- /dev/null +++ b/web/src/components/Charts/LineMarker.vue @@ -0,0 +1,227 @@ + + + diff --git a/web/src/components/Charts/MixChart.vue b/web/src/components/Charts/MixChart.vue new file mode 100644 index 0000000..a3db4b7 --- /dev/null +++ b/web/src/components/Charts/MixChart.vue @@ -0,0 +1,268 @@ + + + diff --git a/web/src/components/Charts/mixins/resize.js b/web/src/components/Charts/mixins/resize.js new file mode 100644 index 0000000..b1e76e9 --- /dev/null +++ b/web/src/components/Charts/mixins/resize.js @@ -0,0 +1,56 @@ +import { debounce } from '@/utils' + +export default { + data() { + return { + $_sidebarElm: null, + $_resizeHandler: null + } + }, + mounted() { + this.initListener() + }, + activated() { + if (!this.$_resizeHandler) { + // avoid duplication init + this.initListener() + } + + // when keep-alive chart activated, auto resize + this.resize() + }, + beforeDestroy() { + this.destroyListener() + }, + deactivated() { + this.destroyListener() + }, + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_sidebarResizeHandler(e) { + if (e.propertyName === 'width') { + this.$_resizeHandler() + } + }, + initListener() { + this.$_resizeHandler = debounce(() => { + this.resize() + }, 100) + window.addEventListener('resize', this.$_resizeHandler) + + this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] + this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) + }, + destroyListener() { + window.removeEventListener('resize', this.$_resizeHandler) + this.$_resizeHandler = null + + this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) + }, + resize() { + const { chart } = this + chart && chart.resize() + } + } +} diff --git a/web/src/components/Hamburger/index.vue b/web/src/components/Hamburger/index.vue new file mode 100644 index 0000000..368b002 --- /dev/null +++ b/web/src/components/Hamburger/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/web/src/components/Pagination/index.vue b/web/src/components/Pagination/index.vue new file mode 100644 index 0000000..787c75d --- /dev/null +++ b/web/src/components/Pagination/index.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/web/src/components/SvgIcon/index.vue b/web/src/components/SvgIcon/index.vue new file mode 100644 index 0000000..b07ded2 --- /dev/null +++ b/web/src/components/SvgIcon/index.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/web/src/components/Tinymce/components/EditorImage.vue b/web/src/components/Tinymce/components/EditorImage.vue new file mode 100644 index 0000000..ec039ea --- /dev/null +++ b/web/src/components/Tinymce/components/EditorImage.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/web/src/components/Tinymce/dynamicLoadScript.js b/web/src/components/Tinymce/dynamicLoadScript.js new file mode 100644 index 0000000..185f58d --- /dev/null +++ b/web/src/components/Tinymce/dynamicLoadScript.js @@ -0,0 +1,59 @@ +let callbacks = [] + +function loadedTinymce() { + // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2144 + // check is successfully downloaded script + return window.tinymce +} + +const dynamicLoadScript = (src, callback) => { + const existingScript = document.getElementById(src) + const cb = callback || function() {} + + if (!existingScript) { + const script = document.createElement('script') + script.src = src // src url for the third-party library being loaded. + script.id = src + document.body.appendChild(script) + callbacks.push(cb) + const onEnd = 'onload' in script ? stdOnEnd : ieOnEnd + onEnd(script) + } + + if (existingScript && cb) { + if (loadedTinymce()) { + cb(null, existingScript) + } else { + callbacks.push(cb) + } + } + + function stdOnEnd(script) { + script.onload = function() { + // this.onload = null here is necessary + // because even IE9 works not like others + this.onerror = this.onload = null + for (const cb of callbacks) { + cb(null, script) + } + callbacks = null + } + script.onerror = function() { + this.onerror = this.onload = null + cb(new Error('Failed to load ' + src), script) + } + } + + function ieOnEnd(script) { + script.onreadystatechange = function() { + if (this.readyState !== 'complete' && this.readyState !== 'loaded') return + this.onreadystatechange = null + for (const cb of callbacks) { + cb(null, script) // there is no way to catch loading errors in IE8 + } + callbacks = null + } + } +} + +export default dynamicLoadScript diff --git a/web/src/components/Tinymce/index.vue b/web/src/components/Tinymce/index.vue new file mode 100644 index 0000000..cb6b91c --- /dev/null +++ b/web/src/components/Tinymce/index.vue @@ -0,0 +1,247 @@ +