FengChaoYu před 3 měsíci
rodič
revize
c1035c30b4
21 změnil soubory, kde provedl 1565 přidání a 0 odebrání
  1. 18 0
      src/main/java/com/gree/mall/contest/bean/Freight/FreightTemplateBean.java
  2. 17 0
      src/main/java/com/gree/mall/contest/bean/Freight/RegionTreeBean.java
  3. 31 0
      src/main/java/com/gree/mall/contest/bean/user/UserApplyBean.java
  4. 10 0
      src/main/java/com/gree/mall/contest/commonmapper/CustomMemberMapper.java
  5. 109 0
      src/main/java/com/gree/mall/contest/controller/pc/CarouselMapController.java
  6. 93 0
      src/main/java/com/gree/mall/contest/controller/pc/FreightController.java
  7. 74 0
      src/main/java/com/gree/mall/contest/controller/pc/StorageController.java
  8. 45 0
      src/main/java/com/gree/mall/contest/controller/pc/admin/AdminCompanyWechatOtherController.java
  9. 255 0
      src/main/java/com/gree/mall/contest/controller/pc/member/MemberController.java
  10. 42 0
      src/main/java/com/gree/mall/contest/controller/pc/member/MemberCouponController.java
  11. 53 0
      src/main/java/com/gree/mall/contest/controller/pc/notice/MiniNoticeController.java
  12. 59 0
      src/main/java/com/gree/mall/contest/controller/pc/notice/NoticeController.java
  13. 13 0
      src/main/java/com/gree/mall/contest/enums/RegionLevelEnum.java
  14. 125 0
      src/main/java/com/gree/mall/contest/logic/CarouselMapLogic.java
  15. 205 0
      src/main/java/com/gree/mall/contest/logic/FreightLogic.java
  16. 68 0
      src/main/java/com/gree/mall/contest/logic/admin/AdminCompanyWechatOtherLogic.java
  17. 46 0
      src/main/java/com/gree/mall/contest/logic/member/UserCouponLogic.java
  18. 74 0
      src/main/java/com/gree/mall/contest/logic/notice/MiniNoticeLogic.java
  19. 192 0
      src/main/java/com/gree/mall/contest/logic/notice/NoticeLogic.java
  20. 9 0
      src/main/java/com/gree/mall/contest/logic/user/UserLogic.java
  21. 27 0
      src/main/resources/mapper/CustomMemberMapper.xml

+ 18 - 0
src/main/java/com/gree/mall/contest/bean/Freight/FreightTemplateBean.java

@@ -0,0 +1,18 @@
+package com.gree.mall.contest.bean.Freight;
+
+import com.gree.mall.contest.plus.entity.FreightTemplate;
+import com.gree.mall.contest.plus.entity.FreightTemplateDetail;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class FreightTemplateBean extends FreightTemplate {
+
+    @Schema(description = "运费明细")
+    private List<FreightTemplateDetail> freightTemplateDetails;
+
+}

+ 17 - 0
src/main/java/com/gree/mall/contest/bean/Freight/RegionTreeBean.java

@@ -0,0 +1,17 @@
+package com.gree.mall.contest.bean.Freight;
+
+import com.gree.mall.contest.plus.entity.Region;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class RegionTreeBean extends Region {
+
+    private String parentName;
+
+    public List<RegionTreeBean> child;
+}

+ 31 - 0
src/main/java/com/gree/mall/contest/bean/user/UserApplyBean.java

@@ -0,0 +1,31 @@
+package com.gree.mall.contest.bean.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class UserApplyBean {
+
+    @Schema(description = "id")
+    private String id;
+
+    @Schema(description = "申请手机号")
+    private String mobile;
+
+    @Schema(description = "微信昵称")
+    private String nickName;
+
+    @Schema(description = "微信用户头像")
+    private String avatar;
+
+    @Schema(description = "状态 WAIT待审核 OK通过 FAIL拒绝")
+    private String status;
+
+    @Schema(description = "申请时间")
+    private Date createTime;
+
+    @Schema(description = "审核时间")
+    private Date updateTime;
+}

+ 10 - 0
src/main/java/com/gree/mall/contest/commonmapper/CustomMemberMapper.java

@@ -1,7 +1,10 @@
 package com.gree.mall.contest.commonmapper;
 
 import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.gree.mall.contest.bean.member.MemberBean;
+import com.gree.mall.contest.bean.user.UserApplyBean;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -13,4 +16,11 @@ public interface CustomMemberMapper {
     List<MemberBean> queryUser(@Param("type") String type, @Param("keyword") String keyword,
                                @Param("websitNos") List<String> websitNos, @Param("startTime") String startTime,
                                @Param("endTime") String endTime, @Param("companyWechatIds") List<String> companyWechatIds);
+
+    @InterceptorIgnore(tenantLine = "true")
+    IPage<UserApplyBean> queryServiceApplyList(Page<Object> objectPage,
+                                               @Param("companyWechatIds") List<String> companyWechatIds,
+                                               @Param("keyword") String keyword,
+                                               @Param("status") String status);
+
 }

+ 109 - 0
src/main/java/com/gree/mall/contest/controller/pc/CarouselMapController.java

@@ -0,0 +1,109 @@
+package com.gree.mall.contest.controller.pc;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.contest.exception.RemoteServiceException;
+import com.gree.mall.contest.helper.ResponseHelper;
+import com.gree.mall.contest.logic.CarouselMapLogic;
+import com.gree.mall.contest.plus.entity.CarouselMap;
+import com.gree.mall.contest.plus.entity.Goods;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+@Slf4j
+@RestController
+@Tag(name = "轮播图管理", description = "轮播图管理")
+@RequestMapping(value = "/carouselMap", produces = "application/json; charset=utf-8")
+public class CarouselMapController {
+
+    @Resource
+    CarouselMapLogic carouselMapLogic;
+
+    @GetMapping("/list/page")
+    @Operation(summary = "轮播图列表")
+    public ResponseHelper<Page<CarouselMap>> page(
+            HttpServletRequest request,
+            @Parameter(description = "状态(true:启用 false:禁用") @RequestParam(required = false) Boolean state,
+            @Parameter(description = "页号",required = true) @RequestParam Integer pageNum,
+            @Parameter(description = "页大小",required = true) @RequestParam Integer pageSize
+    ) throws RemoteServiceException {
+        IPage<CarouselMap> page = carouselMapLogic.page(request, state,pageNum, pageSize);
+        return ResponseHelper.success(page);
+    }
+
+    @GetMapping("/detail")
+    @Operation(summary = "轮播详情")
+    public ResponseHelper<CarouselMap> detail(
+            @Parameter(description = "id",required = true) @RequestParam() String id
+    ) throws RemoteServiceException {
+        CarouselMap detail = carouselMapLogic.detail(id);
+        return ResponseHelper.success(detail);
+    }
+
+
+    @PostMapping("/add")
+    @Operation(summary = "新增轮播图")
+    public ResponseHelper add(
+            HttpServletRequest request,
+            @Parameter(description = "object",required = true) @RequestBody CarouselMap carouselMapBean) {
+        carouselMapLogic.add(request, carouselMapBean);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/update")
+    @Operation(summary = "修改轮播图")
+    public ResponseHelper update(
+            @Parameter(description = "object",required = true) @RequestBody CarouselMap carouselMapBean) {
+        carouselMapLogic.update(carouselMapBean);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/delete")
+    @Operation(summary = "删除轮播图")
+    public ResponseHelper delete(
+            @Parameter(description = "轮播图id",required = true) @RequestParam String carouselMapId
+    ) {
+        carouselMapLogic.delete(carouselMapId);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/batch/delete")
+    @Operation(summary = "删除轮播图")
+    public ResponseHelper delete(
+            @Parameter(description = "轮播图id",required = true) @RequestBody List<String> ids
+    ) {
+        carouselMapLogic.delete(ids);
+        return ResponseHelper.success();
+    }
+
+
+    @PostMapping("/state/update")
+    @Operation(summary = "禁用/正常")
+    public ResponseHelper change(
+            @Parameter(description = "轮播图id",required = true) @RequestParam String carouselMapId,
+            @Parameter(description = "状态:true上架 false下架",required = true) @RequestParam Boolean state
+    ) {
+        carouselMapLogic.updateState(carouselMapId, state);
+        return ResponseHelper.success();
+    }
+
+    @GetMapping("/list/goods")
+    @Operation(summary = "商品列表")
+    public ResponseHelper<Page<Goods>> page(
+            HttpServletRequest request,
+            @Parameter(description = "商品id") @RequestParam(required = false) String goodsId,
+            @Parameter(description = "商品名称") @RequestParam(required = false) String goodsName,
+            @Parameter(description = "页号",required = true) @RequestParam Integer pageNum,
+            @Parameter(description = "页大小",required = true) @RequestParam Integer pageSize
+    ) throws RemoteServiceException {
+        IPage<Goods> page = carouselMapLogic.getGoods(request, goodsId, goodsName,pageNum, pageSize);
+        return ResponseHelper.success(page);
+    }
+}

+ 93 - 0
src/main/java/com/gree/mall/contest/controller/pc/FreightController.java

@@ -0,0 +1,93 @@
+package com.gree.mall.contest.controller.pc;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.contest.bean.Freight.FreightTemplateBean;
+import com.gree.mall.contest.bean.Freight.RegionTreeBean;
+import com.gree.mall.contest.helper.ResponseHelper;
+import com.gree.mall.contest.logic.FreightLogic;
+import com.gree.mall.contest.plus.entity.FreightTemplate;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+@Slf4j
+@RestController
+@Tag(name = "运费管理", description = "运费管理")
+@RequestMapping(value = "/freight", produces = "application/json; charset=utf-8")
+@RequiredArgsConstructor
+public class FreightController {
+    
+    private final FreightLogic freightLogic;
+
+    @GetMapping("/list")
+    @Operation(summary = "运费模板列表")
+    public ResponseHelper<Page<FreightTemplate>> page(
+            HttpServletRequest request,
+            @Parameter(description = "名称",required = false) @RequestParam(required = false) String name,
+            @Parameter(description = "状态(true:启用 false:禁用",required = false) @RequestParam(required = false) Boolean status,
+            @Parameter(description = "开始时间",required = false) @RequestParam(required = false) String startTime,
+            @Parameter(description = "结束时间",required = false) @RequestParam(required = false) String endTime,
+            @Parameter(description = "页号",required = true) @RequestParam(required = true) Integer pageNum,
+            @Parameter(description = "页大小",required = true) @RequestParam(required = true) Integer pageSize
+    ){
+        IPage<FreightTemplate> list = freightLogic.list(request,name, status, startTime, endTime, pageNum, pageSize);
+        return ResponseHelper.success(list);
+    }
+
+    @GetMapping("/detail")
+    @Operation(summary = "运费模板详情")
+    public ResponseHelper<FreightTemplateBean> detail(
+            @Parameter(description = "模板id",required = true) @RequestParam(required = true) String freightTemplateId
+    ){
+        FreightTemplateBean detail = freightLogic.detail(freightTemplateId);
+        return ResponseHelper.success(detail);
+    }
+
+
+    @PostMapping("/delete")
+    @Operation(summary = "删除运费模板")
+    public ResponseHelper delete(
+            @Parameter(description = "模板id",required = true) @RequestParam(required = true) String freightTemplateId
+    ){
+        freightLogic.delete(freightTemplateId);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/save")
+    @Operation(summary = "新增修改运费模板")
+    public ResponseHelper delete(
+            @Parameter(description = "模板",required = true) @RequestBody(required = true) FreightTemplateBean freightTemplateBean,
+            HttpServletRequest request
+    ){
+        freightLogic.save(freightTemplateBean,request);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/status/update")
+    @Operation(summary = "修改运费模板状态")
+    public ResponseHelper updateStatus(
+            @Parameter(description = "模板id",required = true) @RequestParam(required = true) String freightTemplateId,
+            @Parameter(description = "状态:true=启用 false=禁用",required = true) @RequestParam(required = true) Boolean status
+    ){
+        freightLogic.updateStatus(freightTemplateId,status);
+        return ResponseHelper.success();
+    }
+
+
+    @GetMapping("/region/tree")
+    @Operation(summary = "获取地区树")
+    public ResponseHelper<List<RegionTreeBean>> regionTree(
+            @Parameter(description = "等级(1=省,2=市,3=区,4=街道,5=社区)(默认为区以上)",required = false) @RequestParam(required = false) Integer level
+    ){
+        List<RegionTreeBean> regionTreeBeans = freightLogic.regionTree(level);
+        return ResponseHelper.success(regionTreeBeans);
+    }
+
+}

+ 74 - 0
src/main/java/com/gree/mall/contest/controller/pc/StorageController.java

@@ -0,0 +1,74 @@
+package com.gree.mall.contest.controller.pc;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.contest.exception.RemoteServiceException;
+import com.gree.mall.contest.helper.ResponseHelper;
+import com.gree.mall.contest.logic.StorageLogic;
+import com.gree.mall.contest.plus.entity.Storage;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Slf4j
+@RestController
+@Tag(name = "仓储管理", description = "仓储管理")
+@RequestMapping(value = "/storage", produces = "application/json; charset=utf-8")
+@RequiredArgsConstructor
+public class StorageController {
+    
+    private final StorageLogic storageLogic;
+
+    @GetMapping("/list")
+    @Operation(summary = "仓储列表")
+    public ResponseHelper<Page<Storage>> page(
+            @Parameter(description = "页号",required = true) @RequestParam Integer pageNum,
+            @Parameter(description = "页大小",required = true) @RequestParam Integer pageSize,
+            HttpServletRequest request
+    ) throws RemoteServiceException {
+        IPage<Storage> page = storageLogic.page(pageNum, pageSize,request);
+        return ResponseHelper.success(page);
+    }
+
+    @GetMapping("/detail")
+    @Operation(summary = "仓储详情")
+    public ResponseHelper<Storage> detail(
+            @Parameter(description = "id",required = true) @RequestParam() String id
+    ) throws RemoteServiceException {
+        Storage detail = storageLogic.detail(id);
+        return ResponseHelper.success(detail);
+    }
+
+
+    @PostMapping("/add")
+    @Operation(summary = "新增仓储")
+    public ResponseHelper add(
+            HttpServletRequest request,
+            @Parameter(description = "object",required = true) @RequestBody Storage storage) {
+        storageLogic.add(request,storage);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/update")
+    @Operation(summary = "修改仓储")
+    public ResponseHelper update(
+            @Parameter(description = "object",required = true) @RequestBody Storage storage) {
+        storageLogic.update(storage);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/delete")
+    @Operation(summary = "删除仓储")
+    public ResponseHelper delete(
+            @Parameter(description = "仓储id",required = true) @RequestParam String storageId
+    ) {
+        storageLogic.delete(storageId);
+        return ResponseHelper.success();
+    }
+
+}

+ 45 - 0
src/main/java/com/gree/mall/contest/controller/pc/admin/AdminCompanyWechatOtherController.java

@@ -0,0 +1,45 @@
+package com.gree.mall.contest.controller.pc.admin;
+
+import com.gree.mall.contest.helper.ResponseHelper;
+import com.gree.mall.contest.logic.admin.AdminCompanyWechatOtherLogic;
+import com.gree.mall.contest.plus.entity.AdminCompanyWechatOther;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+@RestController
+@Tag(name = "小程序其他配置", description = "小程序其他配置")
+@RequestMapping(value = "/admin/company/other", produces = "application/json; charset=utf-8")
+@RequiredArgsConstructor
+public class AdminCompanyWechatOtherController {
+    
+    private final AdminCompanyWechatOtherLogic adminCompanyWechatOtherLogic;
+
+
+    @GetMapping("/getOne")
+    @Operation(summary = "获取企业其他配置")
+    public ResponseHelper<AdminCompanyWechatOther> getOne(HttpServletRequest request) {
+
+        return ResponseHelper.success(adminCompanyWechatOtherLogic.getOne(request));
+    }
+
+    @PostMapping("/init")
+    @Operation(summary = "初始化其他配置")
+    public ResponseHelper init(
+            @Parameter(description = "企业微信id", required = true) @RequestParam String companyId,
+            @Parameter(description = "企业名称", required = true) @RequestParam String companyName) {
+        adminCompanyWechatOtherLogic.init(companyId, companyName);
+        return ResponseHelper.success();
+    }
+
+    @Operation(summary = "更新其他配置")
+    @PostMapping("/update")
+    public ResponseHelper update(@RequestBody AdminCompanyWechatOther other, HttpServletRequest request) {
+        adminCompanyWechatOtherLogic.update(other,request);
+        return ResponseHelper.success();
+    }
+}

+ 255 - 0
src/main/java/com/gree/mall/contest/controller/pc/member/MemberController.java

@@ -0,0 +1,255 @@
+package com.gree.mall.contest.controller.pc.member;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.contest.bean.user.UserApplyBean;
+import com.gree.mall.contest.bean.user.UserWxBean;
+import com.gree.mall.contest.exception.RemoteServiceException;
+import com.gree.mall.contest.helper.ResponseHelper;
+import com.gree.mall.contest.logic.user.UserLogic;
+import com.gree.mall.contest.plus.entity.*;
+import com.gree.mall.contest.utils.CommonUtils;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Slf4j
+@RestController
+@Tag(name = "会员管理", description = "会员管理")
+@RequestMapping(value = "/member", produces = "application/json; charset=utf-8")
+@RequiredArgsConstructor
+public class MemberController {
+
+    private final UserLogic userLogic;
+
+
+    @GetMapping("/list/page")
+    @Operation(description = "会员列表")
+    public ResponseHelper<Page<User>> page(HttpServletRequest request,
+                                           @Parameter(description = "名称/电话") @RequestParam(required = false) String keyword,
+                                           @Parameter(description = "用户角色,GENERAL=普通用户 SERVICE=业务员") @RequestParam(required = false) String type,
+                                           @Parameter(description = "是否为团长(true=是 false=否)") @RequestParam(required = false) Boolean promotionGroupLeader,
+                                           @Parameter(description = "是否为内部人员(true=是 false=否)") @RequestParam(required = false) Boolean innerr,
+                                           @Parameter(description = "网点id", required = false) @RequestParam(required = false) String websitId,
+                                           @Parameter(description = "是否有优惠码权限") @RequestParam(required = false) Boolean isExchangeCode,
+                                           @Parameter(description = "注册开始时间") @RequestParam(required = false) String startTime,
+                                           @Parameter(description = "注册结束时间") @RequestParam(required = false) String endTime,
+                                           @Parameter(description = "排序json格式[{sortColumn: 'ID', type: true },...] " +
+                    "sortColumn:会员排序对应值 ID=编号 SEX=性别 CREATE=注册时间 STATUS=状态, " +
+                    "type: true=升序 false=倒序")
+            @RequestParam(required = false) String sortJson,
+                                           @Parameter(description = "页号", required = true) @RequestParam Integer pageNum,
+                                           @Parameter(description = "页大小", required = true) @RequestParam Integer pageSize
+    ) throws RemoteServiceException {
+        IPage<User> page = userLogic.page(request,keyword, type,promotionGroupLeader,innerr, startTime, endTime, sortJson,websitId,isExchangeCode, pageNum, pageSize);
+        return ResponseHelper.success(page);
+    }
+
+    @GetMapping("/apply/page")
+    @Operation(description = "业务员申请列表")
+    public ResponseHelper<Page<UserApplyBean>> applyPage(HttpServletRequest request,
+                                                         @Parameter(description = "名称/电话") @RequestParam(required = false) String keyword,
+                                                         @Parameter(description = "状态 WAIT待审核 OK通过 FAIL拒绝") @RequestParam(required = false) String status,
+                                                         @Parameter(description = "页号", required = true) @RequestParam Integer pageNum,
+                                                         @Parameter(description = "页大小", required = true) @RequestParam Integer pageSize
+    ) throws RemoteServiceException {
+        IPage<UserApplyBean> page = userLogic.applyPage(request, keyword, status, pageNum, pageSize);
+        return ResponseHelper.success(page);
+    }
+
+    @GetMapping("/export")
+    @Operation(description = "会员导出")
+    public void export(HttpServletRequest request, HttpServletResponse response,
+                       @Parameter(description = "名称/电话") @RequestParam(required = false) String keyword,
+                       @Parameter(description = "用户角色,GENERAL=普通用户 SERVICE=业务员") @RequestParam(required = false) String type,
+                       @Parameter(description = "是否为团长(true=是 false=否)") @RequestParam(required = false) Boolean promotionGroupLeader,
+                       @Parameter(description = "是否为内部人员(true=是 false=否)") @RequestParam(required = false) Boolean innerr,
+                       @Parameter(description = "网点id", required = false) @RequestParam(required = false) String websitId,
+                       @Parameter(description = "注册开始时间") @RequestParam(required = false) String startTime,
+                       @Parameter(description = "注册结束时间") @RequestParam(required = false) String endTime
+    ) throws Exception {
+        userLogic.export(request, response, keyword, type,websitId, startTime, endTime);
+    }
+
+
+    @PostMapping("/update")
+    @Operation(description = "修改会员")
+    public ResponseHelper update(
+            @Parameter(description = "object", required = true) @RequestBody User user)
+            throws RemoteServiceException {
+        userLogic.update(user);
+        return ResponseHelper.success();
+    }
+
+
+
+    @PostMapping("/updateUserInnerStatus")
+    @Operation(description = "修改会员内部人员状态")
+    public ResponseHelper updateUserInnerStatus(
+            @Parameter(description = "用户id", required = true) @RequestParam String userId,
+            @Parameter(description = "true:内部人员,false:非内部人员", required = true) @RequestParam Boolean inner)
+            throws RemoteServiceException {
+        userLogic.updateUserInnerStatus(userId, inner);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/change/service/user")
+    @Operation(description = "修改会员业务人员状态")
+    public ResponseHelper changeServiceUser(
+            @Parameter(description = "用户id", required = true) @RequestParam String userId,
+            @Parameter(description = "网点编号") @RequestParam(required = false) String websitId,
+            @Parameter(description = "网点名称") @RequestParam(required = false) String websitName,
+            @Parameter(description = "账号") @RequestParam(required = false) String workUserId,
+            @Parameter(description = "姓名") @RequestParam(required = false) String workName,
+            @Parameter(description = "职位") @RequestParam(required = false) String position,
+            @Parameter(description = "联系电话") @RequestParam(required = false) String mobile,
+            @Parameter(description = "true:业务员,false:非业务员", required = true) @RequestParam Boolean isService)
+            throws RemoteServiceException {
+        userLogic.changeServiceUser(userId, websitId, websitName, workUserId, workName, position, mobile, isService);
+        return ResponseHelper.success();
+    }
+
+
+    @GetMapping("/downLoadUserInnerTimplate")
+    @Operation(description = "内部人员批量设置模板")
+    public ResponseHelper downLoadUserInnerTimplate(HttpServletResponse response)
+            throws RemoteServiceException, IOException {
+        CommonUtils.downloadFile("/static/用户批量设置内部人员模板.xlsx",response);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/localUpdateInner")
+    @Operation(description = "/导入跟新内部人员状态")
+    public ResponseHelper<Void> localUpdateInner(
+            HttpServletRequest request,
+            @RequestParam("file") MultipartFile file
+    ) throws Exception {
+        userLogic.localUpdateInner(request, file);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/groupleader")
+    @Operation(description = "设置/取消团长")
+    public ResponseHelper groupleader(
+            @Parameter(description = "用户id", required = true) @RequestParam String userId,
+            @Parameter(description = "true=设置 false=取消", required = true) @RequestParam Boolean promotionGroupLeader
+    ) throws RemoteServiceException {
+        userLogic.groupleader(userId,promotionGroupLeader);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/status/update")
+    @Operation(description = "更改会员状态")
+    public ResponseHelper change(
+            @Parameter(description = "会员id", required = true) @RequestParam String userId,
+            @Parameter(description = "状态:false=正常 true=禁用", required = true) @RequestParam Boolean status
+    ) {
+        userLogic.updateState(userId, status);
+        return ResponseHelper.success();
+    }
+
+
+    @GetMapping("/detail")
+    @Operation(description = "用户详情")
+    public ResponseHelper<UserWxBean> detail(
+            @Parameter(description = "会员id", required = true) @RequestParam String userId
+    ) {
+        UserWxBean detail = userLogic.detail(userId);
+        return ResponseHelper.success(detail);
+    }
+
+    @PostMapping("/updateNickName")
+    @Operation(description = "修改会员昵称")
+    public ResponseHelper<Void> updateNickName(
+            @Parameter(description = "用户id",required = true)@RequestParam String userId,
+            @Parameter(description = "新昵称",required = true)@RequestParam String newNickName
+    ){
+        userLogic.updateUserNickName(userId,newNickName);
+        return ResponseHelper.success();
+    }
+
+    @GetMapping("/address")
+    @Operation(description = "会员地址")
+    public ResponseHelper<IPage<UserAddress>> addressList(
+            @Parameter(required = true, description = "用户id") @RequestParam(required = true) String userId,
+            @Parameter(description = "页号", required = true) @RequestParam Integer pageNum,
+            @Parameter(description = "页大小", required = true) @RequestParam Integer pageSize
+    ) {
+        IPage<UserAddress> userAddressIPage = userLogic.addressList(userId, pageNum, pageSize);
+        return ResponseHelper.success(userAddressIPage);
+    }
+
+    @GetMapping("/favorite")
+    @Operation(description = "收藏记录")
+    public ResponseHelper<IPage<Goods>> favoriteList(
+            @Parameter(required = true, description = "用户id") @RequestParam(required = true) String userId,
+            @Parameter(description = "页号", required = true) @RequestParam Integer pageNum,
+            @Parameter(description = "页大小", required = true) @RequestParam Integer pageSize
+    ) {
+        IPage<Goods> goodsFavoriteIPage = userLogic.goodsFavoriteList(userId, pageNum, pageSize);
+        return ResponseHelper.success(goodsFavoriteIPage);
+    }
+
+    @GetMapping("/goods/visit")
+    @Operation(description = "我的浏览记录")
+    public ResponseHelper<IPage<GoodsVisit>> goodsVisitList(
+            @Parameter(required = true, description = "用户id") @RequestParam(required = true) String userId,
+            @Parameter(description = "页号", required = true) @RequestParam Integer pageNum,
+            @Parameter(description = "页大小", required = true) @RequestParam Integer pageSize
+    ) {
+        IPage<GoodsVisit> goodsVisitIPage = userLogic.goodsVisitList(userId, pageNum, pageSize);
+        return ResponseHelper.success(goodsVisitIPage);
+    }
+
+    @GetMapping("/coupon")
+    @Operation(description = "我的优惠券")
+    public ResponseHelper<IPage<UserCoupon>> couponList(
+            @Parameter(required = true, description = "用户id") @RequestParam(required = true) String userId,
+            @Parameter(description = "页号", required = true) @RequestParam Integer pageNum,
+            @Parameter(description = "页大小", required = true) @RequestParam Integer pageSize
+    ) {
+        IPage<UserCoupon> userCouponIPage = userLogic.couponList(userId, pageNum, pageSize);
+        return ResponseHelper.success(userCouponIPage);
+    }
+
+    @PostMapping("/examine/apply")
+    @Operation(description = "审核申请业务员")
+    public ResponseHelper examineApply(
+            @Parameter(description = "id", required = true) @RequestParam String id,
+            @Parameter(description = "网点编号") @RequestParam(required = false) String websitId,
+            @Parameter(description = "网点名称") @RequestParam(required = false) String websitName,
+            @Parameter(description = "账号", required = true) @RequestParam String workUserId,
+            @Parameter(description = "姓名", required = true) @RequestParam String workName,
+            @Parameter(description = "职位", required = true) @RequestParam String position,
+            @Parameter(description = "手机号", required = true) @RequestParam String mobile,
+            @Parameter(description = "true:通过,false:拒绝", required = true) @RequestParam Boolean isOK)
+            throws RemoteServiceException {
+        userLogic.examineApply(id, websitId, websitName, workUserId, workName, position, mobile, isOK);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/import/member/list")
+    @Operation(description = "导入业务员列表")
+    public ResponseHelper<IPage<UserServiceWait>> importMemberList(
+            @Parameter(description = "网点编号") @RequestParam(required = false) String websitId,
+            @Parameter(description = "网点名称") @RequestParam(required = false) String websitName,
+            @Parameter(description = "账号") @RequestParam(required = false) String workUserId,
+            @Parameter(description = "姓名") @RequestParam(required = false) String workName,
+            @Parameter(description = "职位") @RequestParam(required = false) String position,
+            @Parameter(description = "手机号") @RequestParam(required = false) String mobile,
+            @Parameter(description = "页号", required = true) @RequestParam Integer pageNum,
+            @Parameter(description = "页大小", required = true) @RequestParam Integer pageSize
+    ) throws RemoteServiceException {
+        IPage<UserServiceWait> waitIPage = userLogic.importMemberList(websitId, websitName, workUserId, workName, position, mobile, pageNum, pageSize);
+        return ResponseHelper.success(waitIPage);
+    }
+
+}

+ 42 - 0
src/main/java/com/gree/mall/contest/controller/pc/member/MemberCouponController.java

@@ -0,0 +1,42 @@
+package com.gree.mall.contest.controller.pc.member;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.contest.exception.RemoteServiceException;
+import com.gree.mall.contest.helper.ResponseHelper;
+import com.gree.mall.contest.logic.member.UserCouponLogic;
+import com.gree.mall.contest.plus.entity.UserCoupon;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Slf4j
+@RestController
+@Tag(name = "券领取记录", description = "券领取记录")
+@RequestMapping(value = "/coupon/receive", produces = "application/json; charset=utf-8")
+@RequiredArgsConstructor
+public class MemberCouponController {
+
+    private final UserCouponLogic userCouponLogic;
+
+    @GetMapping("/list/page")
+    @Operation(summary = "领取记录列表")
+    public ResponseHelper<Page<UserCoupon>> page(
+            HttpServletRequest request,
+            @Parameter(description = "券名称") @RequestParam(required = false) String couponName,
+            @Parameter(description = "券类型") @RequestParam(required = false) String couponType,
+            @Parameter(description = "页号",required = true) @RequestParam Integer pageNum,
+            @Parameter(description = "页大小",required = true) @RequestParam Integer pageSize
+    ) throws RemoteServiceException {
+        IPage<UserCoupon> page = userCouponLogic.page(request,couponName, couponType, pageNum, pageSize);
+        return ResponseHelper.success(page);
+    }
+}

+ 53 - 0
src/main/java/com/gree/mall/contest/controller/pc/notice/MiniNoticeController.java

@@ -0,0 +1,53 @@
+package com.gree.mall.contest.controller.pc.notice;
+
+
+import com.gree.mall.contest.helper.ResponseHelper;
+import com.gree.mall.contest.logic.notice.MiniNoticeLogic;
+import com.gree.mall.contest.plus.entity.MiniNotice;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+@Slf4j
+@RestController
+@Tag(name = "提醒通知接口" ,description = "提醒通知接口")
+@RequestMapping(value = "/notice/mini" ,produces = "application/json; charset=utf-8")
+@RequiredArgsConstructor
+public class MiniNoticeController {
+    
+    private final MiniNoticeLogic miniNoticeLogic;
+
+    @PostMapping("/add")
+    @Operation(summary = "新增")
+    public ResponseHelper add(
+            HttpServletRequest request,
+            @Parameter(description = "notice",required = true) @RequestBody MiniNotice miniNotice) {
+        miniNoticeLogic.add(request,miniNotice);
+        return ResponseHelper.success();
+    }
+
+    @PostMapping("/update")
+    @Operation(summary = "修改")
+    public ResponseHelper update(
+            @Parameter(description = "notice",required = true) @RequestBody MiniNotice miniNotice) {
+        miniNoticeLogic.update(miniNotice);
+        return ResponseHelper.success();
+    }
+
+    @GetMapping("/select")
+    @Operation(summary = "查询")
+    public ResponseHelper<List<MiniNotice>> select(HttpServletRequest request){
+        List<MiniNotice> list = miniNoticeLogic.select(request);
+        return ResponseHelper.success(list);
+    }
+
+
+
+
+}

+ 59 - 0
src/main/java/com/gree/mall/contest/controller/pc/notice/NoticeController.java

@@ -0,0 +1,59 @@
+package com.gree.mall.contest.controller.pc.notice;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.gree.mall.contest.helper.ResponseHelper;
+import com.gree.mall.contest.logic.notice.NoticeLogic;
+import com.mysql.cj.protocol.x.Notice;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Slf4j
+@RestController
+@Tag(name = "消息通知接口", description = "消息通知接口")
+@RequestMapping(value = "/notice/", produces = "application/json; charset=utf-8")
+@RequiredArgsConstructor
+public class NoticeController {
+    
+    private final NoticeLogic noticeLogic;
+
+    @GetMapping("/list")
+    @Operation(description = "获取消息列表")
+    public ResponseHelper<IPage<Notice>> list(HttpServletRequest request,
+                                              @Parameter(description = "已读标记true:已读,false:未读,不传获取全部消息", required = false) @RequestParam(required = false) Boolean readFlag,
+                                              @Parameter(description = "页号", required = true) @RequestParam Integer pageNum,
+                                              @Parameter(description = "页大小", required = true) @RequestParam Integer pageSize
+    ) throws Exception {
+        return ResponseHelper.success(noticeLogic.page(request,readFlag, pageNum, pageSize));
+    }
+
+
+    @GetMapping("/list/count")
+    @Operation(description = "未读消息数量")
+    public ResponseHelper<Integer> unreadCount(HttpServletRequest request) throws Exception {
+        return ResponseHelper.success(noticeLogic.unreadCount(request));
+    }
+
+
+    @PostMapping("/mark/read")
+    @Operation(description = "标记已读")
+    public ResponseHelper markRead(HttpServletRequest request,@Parameter(description = "通知消息id数组", required = true) @RequestBody String[] noticeIds) throws Exception {
+        noticeLogic.markRead(noticeIds);
+        return ResponseHelper.success();
+    }
+
+
+    @PostMapping("/mark/read/all")
+    @Operation(description = "全部标记已读")
+    public ResponseHelper markReadAll(HttpServletRequest request) throws Exception {
+        noticeLogic.markReadAll(request);
+        return ResponseHelper.success();
+    }
+
+
+}

+ 13 - 0
src/main/java/com/gree/mall/contest/enums/RegionLevelEnum.java

@@ -0,0 +1,13 @@
+package com.gree.mall.contest.enums;
+
+public enum RegionLevelEnum {
+    PROVINCE(1),CITY(2),ZONE(3),TOWN(4),VILLAGE(5);
+    private Integer id;
+    RegionLevelEnum(Integer id) {
+        this.id =id;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+}

+ 125 - 0
src/main/java/com/gree/mall/contest/logic/CarouselMapLogic.java

@@ -0,0 +1,125 @@
+package com.gree.mall.contest.logic;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.contest.bean.admin.AdminUserCom;
+import com.gree.mall.contest.logic.common.CommonLogic;
+import com.gree.mall.contest.plus.entity.CarouselMap;
+import com.gree.mall.contest.plus.entity.Goods;
+import com.gree.mall.contest.plus.service.CarouselMapService;
+import com.gree.mall.contest.plus.service.GoodsService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class CarouselMapLogic {
+
+    private final CarouselMapService carouselMapService;
+    private final GoodsService goodsService;
+    private final CommonLogic commonLogic;
+
+    /**
+     * 轮播图列表分页
+     */
+    public IPage<CarouselMap> page(HttpServletRequest request, Boolean state, Integer pageNum, Integer pageSize) {
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+        List<String> companyWechatIds = adminUser.getCompanyWechatIds();
+
+        return carouselMapService.lambdaQuery()
+                .in(CollectionUtil.isNotEmpty(companyWechatIds), CarouselMap::getCompanyWechatId, companyWechatIds)
+                .eq(state != null, CarouselMap::getState, state)
+                .orderByDesc(CarouselMap::getCreateTime)
+                .page(new Page<>(pageNum, pageSize));
+    }
+    /**
+     * 轮播图详情
+     */
+    public CarouselMap detail(String id){
+        return carouselMapService.getById(id);
+    }
+
+
+
+    /**
+     * 新增轮播图
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void add(HttpServletRequest request, CarouselMap carouselMap) {
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+
+        //新增轮播
+        carouselMap.setCreateTime(new Date());
+        carouselMap.setCompanyWechatId(adminUser.getLoginCompanyWechatId());
+        carouselMap.setCompanyName(adminUser.getLoginCompanyName());
+        carouselMapService.save(carouselMap);
+    }
+
+    /**
+     * 修改轮播图
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void update(CarouselMap carouselMap) {
+        //修改轮播
+        carouselMapService.updateById(carouselMap);
+    }
+
+    /**
+     * 删除轮播图
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void delete(String carouselMapId) {
+        carouselMapService.removeById(carouselMapId);
+    }
+
+    /**
+     * 批量删除轮播图
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void delete(List<String> carouselMapIds) {
+        carouselMapService.removeByIds(carouselMapIds);
+    }
+
+
+    /**
+     * 更改轮播图状态
+     */
+    public void updateState(String carouselMapId, Boolean state) {
+        carouselMapService.lambdaUpdate().set(CarouselMap::getState, state)
+                .eq(CarouselMap::getId, carouselMapId).update();
+    }
+
+    /**
+     * 获取商品列表
+     * @param goodsId
+     * @param goodsName
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    public IPage<Goods> getGoods(HttpServletRequest request, String goodsId, String goodsName, Integer pageNum, Integer pageSize) {
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+        List<String> companyWechatIds = adminUser.getCompanyWechatIds();
+
+        if (StringUtils.isNotBlank(goodsId)) {
+            return goodsService.lambdaQuery()
+                    .eq(Goods::getGoodsId, goodsId)
+                    .in(CollectionUtil.isNotEmpty(companyWechatIds), Goods::getCompanyWechatId, companyWechatIds)
+                    .page(new Page<>(pageNum, pageSize));
+        }
+        return goodsService.lambdaQuery()
+                .in(CollectionUtil.isNotEmpty(companyWechatIds), Goods::getCompanyWechatId, companyWechatIds)
+                .eq(Goods::getStatus, true)
+                .like(StringUtils.isNotBlank(goodsName), Goods::getGoodsName, goodsName)
+                .page(new Page<>(pageNum, pageSize));
+    }
+}

+ 205 - 0
src/main/java/com/gree/mall/contest/logic/FreightLogic.java

@@ -0,0 +1,205 @@
+package com.gree.mall.contest.logic;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.aliyuncs.utils.StringUtils;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.contest.bean.Freight.FreightTemplateBean;
+import com.gree.mall.contest.bean.Freight.RegionTreeBean;
+import com.gree.mall.contest.bean.admin.AdminUserCom;
+import com.gree.mall.contest.enums.RegionLevelEnum;
+import com.gree.mall.contest.exception.RemoteServiceException;
+import com.gree.mall.contest.logic.common.CommonLogic;
+import com.gree.mall.contest.plus.entity.FreightTemplate;
+import com.gree.mall.contest.plus.entity.FreightTemplateDetail;
+import com.gree.mall.contest.plus.entity.Region;
+import com.gree.mall.contest.plus.service.FreightTemplateDetailService;
+import com.gree.mall.contest.plus.service.FreightTemplateService;
+import com.gree.mall.contest.plus.service.RegionService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class FreightLogic {
+
+    private final FreightTemplateService freightTemplateService;
+    private final FreightTemplateDetailService freightTemplateDetailService;
+    private final RegionService regionService;
+    private final CommonLogic commonLogic;
+
+    /**
+     * 运费模板列表
+     */
+    public IPage<FreightTemplate> list(HttpServletRequest request, String name, Boolean status, String startTime, String endTime, Integer pageNo, Integer pageSize) {
+
+        //获取当前登录企业微信id
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+        List<String> companyWechatIds = adminUser.getCompanyWechatIds();
+
+        return freightTemplateService.lambdaQuery()
+                .in(CollectionUtil.isNotEmpty(companyWechatIds), FreightTemplate::getCompanyWechatId, companyWechatIds)
+                .like(StringUtils.isNotEmpty(name), FreightTemplate::getName, name)
+                .eq(status != null, FreightTemplate::getStatus, status)
+                .between(StringUtils.isNotEmpty(startTime) && StringUtils.isNotEmpty(endTime), FreightTemplate::getCreateTime, startTime, endTime + " 23:59:59")
+                .page(new Page<>(pageNo, pageSize));
+    }
+
+    /**
+     * 运费模板详情
+     */
+    public FreightTemplateBean detail(String freightTemplateId) {
+        FreightTemplate freightTemplate = freightTemplateService.getById(freightTemplateId);
+        FreightTemplateBean bean = new FreightTemplateBean();
+        BeanUtils.copyProperties(freightTemplate, bean);
+        //查询列表
+        List<FreightTemplateDetail> list = freightTemplateDetailService.lambdaQuery().eq(FreightTemplateDetail::getFreightTemplateId, freightTemplateId).list();
+        bean.setFreightTemplateDetails(list);
+        return bean;
+    }
+
+    /**
+     * 删除运费模板
+     */
+    @Transactional
+    public void delete(String freightTemplateId) {
+        freightTemplateService.removeById(freightTemplateId);
+        freightTemplateDetailService.lambdaUpdate().eq(FreightTemplateDetail::getFreightTemplateId, freightTemplateId).remove();
+    }
+
+    /**
+     * 保存运费模板
+     * 带freightTemplateId则为修改,否则新增
+     */
+    @Transactional
+    public void save(FreightTemplateBean freightTemplateBean, HttpServletRequest request) {
+
+        //设置企业微信id
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+        if (StringUtils.isEmpty(adminUser.getLoginCompanyWechatId())) {
+            throw new RemoteServiceException("无效微信企业id");
+        }
+
+        freightTemplateBean.setCompanyWechatId(adminUser.getLoginCompanyWechatId());
+        freightTemplateBean.setCompanyName(adminUser.getLoginCompanyName());
+        freightTemplateBean.setCreateUserName(adminUser.getNickName());
+        freightTemplateBean.setCreateTime(new Date());
+        freightTemplateService.saveOrUpdate(freightTemplateBean);
+
+        if (freightTemplateBean.getFreightTemplateDetails() == null || freightTemplateBean.getFreightTemplateDetails().size() < 1) {
+            return;
+        }
+        //删除运费明细
+        if (StringUtils.isNotEmpty(freightTemplateBean.getFreightTemplateId())) {
+            freightTemplateDetailService.lambdaUpdate()
+                    .eq(FreightTemplateDetail::getFreightTemplateId, freightTemplateBean.getFreightTemplateId()).remove();
+        }
+        //新增运费明细
+        List<FreightTemplateDetail> freightTemplateDetails = freightTemplateBean.getFreightTemplateDetails();
+        for (FreightTemplateDetail freightTemplateDetail : freightTemplateDetails) {
+            freightTemplateDetail.setFreightTemplateId(freightTemplateBean.getFreightTemplateId());
+            freightTemplateDetail.setCompanyWechatId(adminUser.getLoginCompanyWechatId());
+            freightTemplateDetail.setCompanyName(adminUser.getLoginCompanyName());
+            freightTemplateDetail.setCreateTime(new Date());
+        }
+        freightTemplateDetailService.saveBatch(freightTemplateDetails);
+    }
+
+    /**
+     * 启用/禁用
+     */
+    @Transactional
+    public void updateStatus(String freightTemplateId, Boolean status) {
+
+        freightTemplateService.lambdaUpdate().set(FreightTemplate::getStatus, status)
+                .eq(FreightTemplate::getFreightTemplateId, freightTemplateId).update();
+
+        freightTemplateDetailService.lambdaUpdate()
+                .set(FreightTemplateDetail::getStatus, status)
+                .eq(FreightTemplateDetail::getFreightTemplateId, freightTemplateId)
+                .update();
+    }
+
+
+    /**
+     * 根据件数以及地区计算运费
+     */
+    public BigDecimal getFreightAmount(HttpServletRequest request, String province, String city, String area, Integer num) throws RemoteServiceException {
+
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+        List<String> companyWechatIds = adminUser.getCompanyWechatIds();
+
+        FreightTemplateDetail one = freightTemplateDetailService.lambdaQuery()
+                .in(CollectionUtil.isNotEmpty(companyWechatIds), FreightTemplateDetail::getCompanyWechatId, companyWechatIds)
+                .eq(FreightTemplateDetail::getProvince, province)
+                .eq(FreightTemplateDetail::getCity, city)
+//                .eq(FreightTemplateDetail::getArea, area)
+                .eq(FreightTemplateDetail::getStatus, true).one();
+        if (one == null) {
+            throw new RemoteServiceException("暂不支持该地区的配送服务");
+        }
+        Integer firstLimit = one.getFirstLimit();
+        Integer continuousLimit = one.getContinuousLimit();
+        if (num <= firstLimit) {
+            return one.getFirstAmount();
+        }
+        //续件费用
+        int xj = (num - firstLimit) / continuousLimit + ((num - firstLimit) % continuousLimit == 0 ? 0 : 1);
+        BigDecimal conAmount = one.getContinuousAmount().multiply(new BigDecimal(xj));
+
+        return one.getFirstAmount().add(conAmount);
+    }
+
+
+    /**
+     * 获取地区树
+     *
+     * @return
+     */
+    public List<RegionTreeBean> regionTree(Integer level) {
+        if (level == null) {
+            level = 3;
+        }
+        List<Region> regions = regionService.lambdaQuery()
+                .le(Region::getLevel, level)
+                .list();
+
+        List<RegionTreeBean> list = new ArrayList<>();
+        for (int i = 0; i < regions.size(); i++) {
+            RegionTreeBean regionTree = new RegionTreeBean();
+            BeanUtils.copyProperties(regions.get(i), regionTree);
+            list.add(regionTree);
+        }
+        //省
+        List<RegionTreeBean> province = list.stream().filter(v -> v.getLevel().equals(RegionLevelEnum.PROVINCE.getId())).collect(Collectors.toList());
+        for (RegionTreeBean regionTree : province) {
+            regionTree.setChild(this.regionTree(list, regionTree.getId(), regionTree.getName()));
+        }
+        return province;
+    }
+
+    private List<RegionTreeBean> regionTree(List<RegionTreeBean> list, Long parentId, String parentName) {
+        if (CollectionUtil.isEmpty(list)) {
+            return new ArrayList<>();
+        }
+        List<RegionTreeBean> childs = list.stream().filter(v -> v.getPid().equals(parentId)).collect(Collectors.toList());
+        for (RegionTreeBean regionTree : childs) {
+            regionTree.setParentName(parentName);
+            regionTree.setChild(this.regionTree(list, regionTree.getId(), regionTree.getName()));
+        }
+        return childs;
+    }
+
+
+}

+ 68 - 0
src/main/java/com/gree/mall/contest/logic/admin/AdminCompanyWechatOtherLogic.java

@@ -0,0 +1,68 @@
+package com.gree.mall.contest.logic.admin;
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.gree.mall.contest.bean.admin.AdminUserCom;
+import com.gree.mall.contest.logic.common.CommonLogic;
+import com.gree.mall.contest.plus.entity.AdminCompanyWechatOther;
+import com.gree.mall.contest.plus.service.AdminCompanyWechatOtherService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class AdminCompanyWechatOtherLogic {
+
+    private final AdminCompanyWechatOtherService adminCompanyWechatOtherService;
+    private final CommonLogic commonLogic;
+
+    /**
+     * 获取小程序配置信息
+     */
+    public AdminCompanyWechatOther getOne(HttpServletRequest request) {
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+        String loginCompanyWechatId = adminUser.getLoginCompanyWechatId();
+        if (StringUtils.isEmpty(loginCompanyWechatId)) {
+            return null;
+        }
+
+        return adminCompanyWechatOtherService.lambdaQuery()
+                .eq(AdminCompanyWechatOther::getCompanyWechatId, loginCompanyWechatId)
+                .one();
+    }
+
+    /**
+     * 初始化其他配置
+     */
+    public void init(String companyId, String companyName) {
+        adminCompanyWechatOtherService.lambdaUpdate()
+                .eq(AdminCompanyWechatOther::getCompanyWechatId, companyId)
+                .remove();
+
+
+        AdminCompanyWechatOther other = new AdminCompanyWechatOther();
+        other.setCompanyWechatId(companyId);
+        other.setCompanyName(companyName);
+        other.insert();
+    }
+
+    /**
+     * 更新其他配置
+     */
+    public void update(AdminCompanyWechatOther other,HttpServletRequest request) {
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+        adminCompanyWechatOtherService.lambdaUpdate()
+                .eq(AdminCompanyWechatOther::getCompanyWechatId, adminUser.getLoginCompanyWechatId())
+                .remove();
+        other.setCompanyWechatId(adminUser.getLoginCompanyWechatId());
+        other.setCompanyName(adminUser.getLoginCompanyName());
+        other.setCreateTime(new Date());
+        other.insert();
+    }
+
+
+}

+ 46 - 0
src/main/java/com/gree/mall/contest/logic/member/UserCouponLogic.java

@@ -0,0 +1,46 @@
+package com.gree.mall.contest.logic.member;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.contest.bean.admin.AdminUserCom;
+import com.gree.mall.contest.logic.common.CommonLogic;
+import com.gree.mall.contest.plus.entity.UserCoupon;
+import com.gree.mall.contest.plus.service.UserCouponService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class UserCouponLogic {
+
+
+    private final UserCouponService userCouponService;
+    private final CommonLogic commonLogic;
+
+    /**
+     * 领取记录列表
+     * @param couponName
+     * @param couponType
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    public IPage<UserCoupon> page(HttpServletRequest request, String couponName, String couponType, Integer pageNum, Integer pageSize) {
+        //获取当前登录企业微信id
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+        List<String> companyWechatIds = adminUser.getCompanyWechatIds();
+
+        return userCouponService.lambdaQuery()
+                .in(CollectionUtil.isNotEmpty(companyWechatIds), UserCoupon::getCompanyWechatId , companyWechatIds)
+                .like(StringUtils.isNotBlank(couponName), UserCoupon::getCouponName, couponName)
+                .eq(StringUtils.isNotBlank(couponName), UserCoupon::getCouponType, couponType)
+                .page(new Page<>(pageNum, pageSize));
+    }
+}

+ 74 - 0
src/main/java/com/gree/mall/contest/logic/notice/MiniNoticeLogic.java

@@ -0,0 +1,74 @@
+package com.gree.mall.contest.logic.notice;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.aliyuncs.utils.StringUtils;
+import com.gree.mall.contest.bean.admin.AdminUserCom;
+import com.gree.mall.contest.exception.RemoteServiceException;
+import com.gree.mall.contest.logic.common.CommonLogic;
+import com.gree.mall.contest.plus.entity.MiniNotice;
+import com.gree.mall.contest.plus.service.MiniNoticeService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class MiniNoticeLogic {
+    private final MiniNoticeService miniNoticeService;
+    private final CommonLogic commonLogic;
+
+    /**
+     * 新增
+     *
+     * @param miniNotice
+     */
+    public void add(HttpServletRequest request, MiniNotice miniNotice) {
+        //获取当前登录企业微信id
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+        if (StringUtils.isEmpty(adminUser.getLoginCompanyWechatId())) {
+            throw new RemoteServiceException("无效微信企业id");
+        }
+
+
+        Date createDate = new Date();
+        miniNotice.setCreateTime(createDate);
+        miniNotice.setCompanyWechatId(adminUser.getLoginCompanyWechatId());
+        miniNotice.setCompanyName(adminUser.getLoginCompanyName());
+        miniNoticeService.save(miniNotice);
+    }
+
+    /**
+     * 修改
+     *
+     * @param miniNotice
+     */
+    public void update(MiniNotice miniNotice) {
+        miniNoticeService.updateById(miniNotice);
+    }
+
+
+    /**
+     * 查询
+     *
+     * @return
+     */
+    public List<MiniNotice> select(HttpServletRequest request) {
+        //获取当前登录企业微信id
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+        List<String> companyWechatIds = adminUser.getCompanyWechatIds();
+
+
+        List<MiniNotice> list = miniNoticeService.lambdaQuery()
+                .in(CollectionUtil.isNotEmpty(companyWechatIds), MiniNotice::getCompanyWechatId, companyWechatIds)
+                .list();
+        return list;
+    }
+
+
+}

+ 192 - 0
src/main/java/com/gree/mall/contest/logic/notice/NoticeLogic.java

@@ -0,0 +1,192 @@
+package com.gree.mall.contest.logic.notice;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.aliyuncs.utils.StringUtils;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gree.mall.contest.bean.admin.AdminUserCom;
+import com.gree.mall.contest.exception.RemoteServiceException;
+import com.gree.mall.contest.logic.common.CommonLogic;
+import com.gree.mall.contest.plus.entity.GoodsSpec;
+import com.gree.mall.contest.plus.entity.Notice;
+import com.gree.mall.contest.plus.entity.PromotionGroupSpec;
+import com.gree.mall.contest.plus.service.GoodsSpecService;
+import com.gree.mall.contest.plus.service.NoticeService;
+import com.gree.mall.contest.plus.service.PromotionGroupSpecService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class NoticeLogic {
+
+    private final NoticeService noticeService;
+    private final GoodsSpecService goodsSpecService;
+    private final PromotionGroupSpecService promotionGroupSpecService;
+    private final CommonLogic commonLogic;
+
+    private class Node implements Map.Entry<String,String>{
+
+        String key;
+        String value;
+
+        public Node(String key,String value){
+            this.key=key;
+            this.value=value;
+        }
+
+        @Override
+        public String getKey() {
+            return key;
+        }
+
+        @Override
+        public String getValue() {
+            return value;
+        }
+
+        @Override
+        public String setValue(String value) {
+            String oldValue = this.value;
+            this.value = value;
+            return oldValue;
+        }
+    }
+    /**
+     * 商品库存提醒
+     */
+    public void stockNotice(){
+        final int stockNum = 10;
+        //基础商品
+        List<GoodsSpec> list = goodsSpecService.lambdaQuery()
+                .le(GoodsSpec::getStockNum, stockNum)
+                .list();
+
+        Map<String,Node> goodsIdMap=new HashMap<>();
+        for (GoodsSpec goodsSpec:list
+             ) {
+            Node node = new Node( goodsSpec.getCompanyWechatId() , goodsSpec.getCompanyName() );
+            goodsIdMap.put( goodsSpec.getGoodsId() , node );
+        }
+        //新增基础商品通知
+        this.addNotice(goodsIdMap,2);
+
+
+        goodsIdMap=new HashMap<>();
+
+
+        //团购商品
+        List<PromotionGroupSpec> list3 = promotionGroupSpecService.lambdaQuery()
+                .le(PromotionGroupSpec::getStock, stockNum)
+                .list();
+        goodsIdMap=new HashMap<>();
+        for (PromotionGroupSpec promotionGroupSpec:list3
+             ) {
+            Node node=new Node(promotionGroupSpec.getCompanyWechatId() , promotionGroupSpec.getCompanyName());
+            goodsIdMap.put(promotionGroupSpec.getGoodsId(),node);
+        }
+        //新增团购商品通知
+        this.addNotice(goodsIdMap,4);
+
+    }
+
+    private void addNotice(Map<String,Node> goodsIdMap,Integer type){
+        if(goodsIdMap.size() == 0){
+            return;
+        }
+        Map<String,String> map = new HashMap<>();
+        map.put("2","基础商品");
+        map.put("4","团购商品");
+
+        List<Notice> notices = new ArrayList<>();
+        Date date = new Date();
+        for(String goodsId : goodsIdMap.keySet()) {
+            Notice notice = new Notice();
+            notice.setObjId(goodsId);
+            notice.setTitle("商品库存");
+            notice.setType(type);
+            notice.setContent(map.get(type.toString())+"id:"+goodsId+",商品库存不足10,请及时补充库存");
+            notice.setCreateTime(date);
+            notice.setCompanyWechatId(goodsIdMap.get(goodsId).getKey());
+            notice.setCompanyName(goodsIdMap.get(goodsId).getValue());
+            notices.add(notice);
+        }
+        noticeService.saveBatch(notices);
+    }
+
+
+    public IPage<Notice> page(HttpServletRequest request,Boolean readFlag, Integer pageNum, Integer pageSize) {
+       /* List<String> websitNoList = new ArrayList<>();
+        AdminWebsitBean adminWebsitBean = CommonUtils.getAdminUser(request);
+        if (!adminWebsitBean.getType()) {
+            websitNoList = adminWebsitBean.getWeidsitIds().stream().map(WebsitZone::getWebsitNumber).collect(Collectors.toList());
+        }*/
+
+        //获取当前登录企业微信id
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+        List<String> companyWechatIds = adminUser.getCompanyWechatIds();
+
+        return noticeService.lambdaQuery()
+               // .in(!CollectionUtils.isEmpty(websitNoList),Notice::getWebsitNumber,websitNoList)
+                .in(CollectionUtil.isNotEmpty(companyWechatIds),Notice::getCompanyWechatId,companyWechatIds)
+                .eq(readFlag!=null,Notice::getReadFlag,readFlag)
+                .orderByDesc(Notice::getCreateTime)
+                .page(new Page(pageNum, pageSize));
+    }
+
+    public Long unreadCount(HttpServletRequest request) {
+       /* List<String> websitNoList = new ArrayList<>();
+        AdminWebsitBean adminWebsitBean = CommonUtils.getAdminUser(request);
+        if(adminWebsitBean == null){
+            return 0;
+        }
+        if (!adminWebsitBean.getType()) {
+            websitNoList = adminWebsitBean.getWeidsitIds().stream().map(WebsitZone::getWebsitNumber).collect(Collectors.toList());
+        }*/
+        //获取当前登录企业微信id
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+        List<String> companyWechatIds = adminUser.getCompanyWechatIds();
+
+        return noticeService.lambdaQuery()
+                //.in(!adminWebsitBean.getType(),Notice::getWebsitNumber,websitNoList)
+                .in(CollectionUtil.isNotEmpty(companyWechatIds) , Notice::getCompanyWechatId , companyWechatIds)
+                .eq(Notice::getReadFlag,false)
+                .count();
+    }
+
+    public void markRead(String[] noticeIds) {
+
+        for(String noticeId:noticeIds){
+            noticeService.lambdaUpdate()
+                    .eq(Notice::getNoticeId,noticeId)
+                    .set(Notice::getReadFlag,true)
+                    .update();
+        }
+    }
+
+    public void markReadAll(HttpServletRequest request) {
+        /*List<String> websitNoList = new ArrayList<>();
+        AdminWebsitBean adminWebsitBean = CommonUtils.getAdminUser(request);
+        if (!adminWebsitBean.getType()) {
+            websitNoList = adminWebsitBean.getWeidsitIds().stream().map(WebsitZone::getWebsitNumber).collect(Collectors.toList());
+        }*/
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+        String companyWechatId = adminUser.getLoginCompanyWechatId();
+        if(StringUtils.isEmpty(companyWechatId)){
+            throw new RemoteServiceException("无效微信企业id");
+        }
+
+        noticeService.lambdaUpdate()
+                //.in(!adminWebsitBean.getType(),Notice::getWebsitNumber,websitNoList)
+                .eq(Notice::getCompanyWechatId , companyWechatId)
+                .eq(Notice::getReadFlag,false)
+                .set(Notice::getReadFlag,true)
+                .update();
+    }
+
+}

+ 9 - 0
src/main/java/com/gree/mall/contest/logic/user/UserLogic.java

@@ -12,6 +12,7 @@ import com.gree.mall.contest.bean.ExcelData;
 import com.gree.mall.contest.bean.admin.AdminUserCom;
 import com.gree.mall.contest.bean.member.MemberBean;
 import com.gree.mall.contest.bean.member.MemberSortBean;
+import com.gree.mall.contest.bean.user.UserApplyBean;
 import com.gree.mall.contest.bean.user.UserWxBean;
 import com.gree.mall.contest.commonmapper.CustomGoodsMapper;
 import com.gree.mall.contest.commonmapper.CustomMemberMapper;
@@ -618,4 +619,12 @@ public class UserLogic {
                 .orderByDesc(UserServiceWait::getCreateTime)
                 .page(new Page<>(pageNum, pageSize));
     }
+
+    public IPage<UserApplyBean> applyPage(HttpServletRequest request, String keyword, String status, Integer pageNum, Integer pageSize) {
+        //获取当前登录企业微信id
+        AdminUserCom adminUser = commonLogic.getAdminUser(request);
+        List<String> companyWechatIds = adminUser.getCompanyWechatIds();
+        IPage<UserApplyBean> page = customMemberMapper.queryServiceApplyList(new Page<>(pageNum, pageSize), companyWechatIds, keyword, status);
+        return page;
+    }
 }

+ 27 - 0
src/main/resources/mapper/CustomMemberMapper.xml

@@ -26,6 +26,33 @@
         order by ur.create_time
     </select>
 
+    <select id="queryServiceApplyList" resultType="com.gree.mall.contest.bean.user.UserApplyBean">
+        SELECT
+        a.id,
+        a.mobile,
+        b.nick_name,
+        b.avatar,
+        a.status,
+        a.create_time,
+        a.update_time
+        FROM
+        user_service_apply a, user b
+        WHERE
+        a.user_id = b.user_id
+        <if test="companyWechatIds != null and companyWechatIds.size > 0">
+            AND b.company_wechat_id IN
+            <foreach item="item" index="index" collection="companyWechatIds" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+        <if test="keyword != null and keyword != ''">
+            AND (a.mobile LIKE concat('%',#{keyword,jdbcType=VARCHAR},'%') OR b.nick_name LIKE
+            concat('%',#{keyword,jdbcType=VARCHAR},'%'))
+        </if>
+        <if test="status != null and status != ''">
+            AND a.status = #{status}
+        </if>
+    </select>
 
 
 </mapper>