瀏覽代碼

Merge remote-tracking branch 'origin/dev' into dev

wangming 1 周之前
父節點
當前提交
31bab0cdb2
共有 36 個文件被更改,包括 564 次插入225 次删除
  1. 0 1
      yami-shop-api/src/main/java/com/yami/shop/api/controller/UserRegisterController.java
  2. 2 2
      yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java
  3. 7 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopHeadInfoDto.java
  4. 6 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/ShopDetail.java
  5. 1 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/SysDictData.java
  6. 1 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/SysDictType.java
  7. 6 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/User.java
  8. 6 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/param/BackendOrderParam.java
  9. 10 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/po/EnterpriseUserExcelInfo.java
  10. 12 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/po/EnterpriseUserPo.java
  11. 6 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/vo/EnterpriseUserVo.java
  12. 13 29
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/OrderController.java
  13. 11 14
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/UserEnterpriseController.java
  14. 8 0
      yami-shop-service/src/main/java/com/yami/shop/dao/SysDictDataMapper.java
  15. 1 1
      yami-shop-service/src/main/java/com/yami/shop/dao/UserMapper.java
  16. 6 0
      yami-shop-service/src/main/java/com/yami/shop/service/ISysDictDataService.java
  17. 0 13
      yami-shop-service/src/main/java/com/yami/shop/service/ISysDictTypeService.java
  18. 1 0
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBOrderService.java
  19. 1 1
      yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderRefundServiceImpl.java
  20. 1 1
      yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java
  21. 1 1
      yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsRechargeServiceImpl.java
  22. 2 0
      yami-shop-service/src/main/java/com/yami/shop/service/impl/ShopDetailServiceImpl.java
  23. 25 17
      yami-shop-service/src/main/java/com/yami/shop/service/impl/SysDictDataServiceImpl.java
  24. 22 62
      yami-shop-service/src/main/java/com/yami/shop/service/impl/SysDictTypeServiceImpl.java
  25. 90 14
      yami-shop-service/src/main/java/com/yami/shop/service/impl/UserServiceImpl.java
  26. 3 3
      yami-shop-service/src/main/java/com/yami/shop/utils/ExportUtils.java
  27. 16 0
      yami-shop-service/src/main/resources/mapper/OrderMapper.xml
  28. 3 3
      yami-shop-service/src/main/resources/mapper/OrderRefundMapper.xml
  29. 36 32
      yami-shop-service/src/main/resources/mapper/ProductMapper.xml
  30. 10 5
      yami-shop-service/src/main/resources/mapper/ShopDetailMapper.xml
  31. 2 2
      yami-shop-service/src/main/resources/mapper/ShopSkuMapper.xml
  32. 36 2
      yami-shop-service/src/main/resources/mapper/SysDictDataMapper.xml
  33. 9 3
      yami-shop-service/src/main/resources/mapper/UserMapper.xml
  34. 111 0
      yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysDictDataController.java
  35. 97 0
      yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysDictTypeController.java
  36. 2 17
      yami-shop-user/yami-shop-user-api/src/main/java/com/yami/shop/user/api/controller/UserScoreController.java

+ 0 - 1
yami-shop-api/src/main/java/com/yami/shop/api/controller/UserRegisterController.java

@@ -219,7 +219,6 @@ public class UserRegisterController {
         authenticationToken.setPrincipal(userDetails.getUsername());
         authenticationToken.setDetails(userDetails);
         authenticationToken.setAuthenticated(true);
-//        authenticationToken.setPlatform(user.getPlatform());
         loginAuthSuccessHandler.onAuthenticationSuccess(request, response, authenticationToken);
 
         return ResponseEntity.ok().build();

+ 2 - 2
yami-shop-api/src/main/java/com/yami/shop/api/listener/SubmitOrderListener.java

@@ -145,7 +145,7 @@ public class SubmitOrderListener {
                 //这个运费是已经算过的了
                 double actualTotal = shopCartOrderDto.getActualTotal();
                 //企业用户才进这个判断,并且该用户的积分必须大于0
-                if (1 == mergerOrder.getChannelId() && null != point && point > 0) {
+                if (null != point && point > 0) {
                     order.setOrderType(OrderType.SCORE.value());
                     // 计算商品金额和积分
                     Double mul = Arith.mul(actualTotal, 100);
@@ -199,7 +199,7 @@ public class SubmitOrderListener {
                         orderItem.setPlatformShareReduce(shopCartItem.getPlatformShareReduce());
                         Double actualItem = shopCartItem.getActualTotal();
                         //后台充值的积分
-                        if (1 == mergerOrder.getChannelId() && null != point && point > 0) {
+                        if (null != point && point > 0) {
                             Double useActualItem = actualItem;
                             if (!isUseTransfee) {//每个订单增加运费,都只扣一次
                                 Double transfee = shopCartOrderDto.getTransfee();

+ 7 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/app/dto/ShopHeadInfoDto.java

@@ -10,6 +10,7 @@
 
 package com.yami.shop.bean.app.dto;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.yami.shop.common.serializer.json.ImgJsonSerializer;
 import io.swagger.annotations.ApiModelProperty;
@@ -64,4 +65,10 @@ public class ShopHeadInfoDto {
     @ApiModelProperty(value = "店铺纬度")
     private String lon;
 
+    /**
+     * 门店是否存在商品
+     */
+    @ApiModelProperty(value = "门店是否存在商品")
+    private Boolean hasProduct;
+
 }

+ 6 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/ShopDetail.java

@@ -10,6 +10,7 @@
 
 package com.yami.shop.bean.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -208,4 +209,9 @@ public class ShopDetail implements Serializable {
      */
     private String thirdPartyCode;
 
+    /**
+     * 是否存在商品
+     */
+    @TableField(exist = false)
+    private Boolean hasProduct;
 }

+ 1 - 1
yami-shop-bean/src/main/java/com/yami/shop/bean/model/SysDictData.java

@@ -42,7 +42,7 @@ public class SysDictData{
     private String isDefault;
 
     /** 状态(0正常 1停用) */
-    private String status;
+    private Integer status;
 
     /** 搜索值 */
     @JsonIgnore

+ 1 - 1
yami-shop-bean/src/main/java/com/yami/shop/bean/model/SysDictType.java

@@ -33,7 +33,7 @@ public class SysDictType{
     private String dictType;
 
     /** 状态(0正常 1停用) */
-    private String status;
+    private Integer status;
 
     /** 搜索值 */
     @JsonIgnore

+ 6 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/User.java

@@ -156,4 +156,10 @@ public class User implements Serializable {
      * 渠道ID
      */
     private Long channelId;
+
+    /**
+     * 20251203 v1.1.3
+     * 人员属性 0-全部 1-正常人员 2-测试人员
+     */
+    private String userAttrType;
 }

+ 6 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/param/BackendOrderParam.java

@@ -15,6 +15,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import javax.print.DocFlavor;
 import java.util.Date;
 import java.util.List;
 
@@ -86,5 +87,10 @@ public class BackendOrderParam {
      * 企业ID列表
      */
     private List<Long> channelIdList;
+    /**
+     * 20251203 v1.1.3
+     * 人员属性 0-全部 1-正常人员 2-测试人员
+     */
+    private String userAttrType;
 
 }

+ 10 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/po/EnterpriseUserExcelInfo.java

@@ -17,8 +17,18 @@ public class EnterpriseUserExcelInfo {
     @ExcelProperty("员工姓名")
     private String realName;
 
+    /**
+     * 20251203 v1.1.3
+     * 人员属性 0-全部 1-正常人员 2-测试人员
+     */
+    @ApiModelProperty(value = "人员属性")
+    @ExcelProperty("人员属性")
+    private String userAttrName;
+
     @ApiModelProperty(value = "员工手机号")
     @ExcelProperty("员工手机号")
     private String phone;
 
+
+
 }

+ 12 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/po/EnterpriseUserPo.java

@@ -23,10 +23,22 @@ public class EnterpriseUserPo {
      */
     private List<Long> channelIdList;
 
+    /**
+     * 20251203 v1.1.3
+     * 人员属性 0-全部 1-正常人员 2-测试人员
+     */
+    private String userAttrType;
 
     public EnterpriseUserPo(Long channelId, String realName, String userMobile) {
         this.channelId = channelId;
         this.realName = realName;
         this.userMobile = userMobile;
     }
+
+    public EnterpriseUserPo(Long channelId, String realName, String userMobile, String userAttrType) {
+        this.channelId = channelId;
+        this.realName = realName;
+        this.userMobile = userMobile;
+        this.userAttrType = userAttrType;
+    }
 }

+ 6 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/vo/EnterpriseUserVo.java

@@ -34,4 +34,10 @@ public class EnterpriseUserVo {
     private Double expired;
 
     private Double used;
+
+    /**
+     * 20251203 v1.1.3
+     * 人员属性 0-全部 1-正常人员 2-测试人员
+     */
+    private String userAttrType;
 }

+ 13 - 29
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/OrderController.java

@@ -10,6 +10,7 @@
 
 package com.yami.shop.platform.controller;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -30,6 +31,7 @@ import com.yami.shop.utils.CullenUtils;
 import com.yami.shop.wx.service.impl.WxProviderServiceImpl;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -77,19 +79,7 @@ public class OrderController {
     @GetMapping("/deliverList")
     @ApiOperation("后管端-快递订单列表")
     public R<IPage<Order>> deliverList(BackendOrderParam orderParam, PageParam<Order> page) {
-        if (orderParam.getChannelIdList()==null||orderParam.getChannelIdList().isEmpty()){
-            return R.FAIL("请求参数-所属企业不允许为空");
-        }
-        if (orderParam.getChannelIdList().contains(0L)){
-            Long userId = SecurityUtils.getSysUser().getUserId();
-            List<Long> channelIdList =  sysUserService.findByUserIdListId(userId);
-            orderParam.setChannelIdList(channelIdList);
-            if (userId != Constant.SUPER_ADMIN_ID&&(orderParam.getChannelIdList()==null||orderParam.getChannelIdList().isEmpty())){
-                List<Long> longs = new ArrayList<>();
-                longs.add(0L);
-                orderParam.setChannelIdList(longs);
-            }
-        }
+        getBackendOrderParam(orderParam);
         IPage<Order> orderIPage = orderService.deliverList(page, orderParam);
         return R.SUCCESS(orderIPage);
     }
@@ -97,19 +87,7 @@ public class OrderController {
     @GetMapping("/deliverListStatusNum")
     @ApiOperation("后管端-快递订单列表-订单状态数量")
     public R<Map<String, Integer>> deliverListStatusNum(BackendOrderParam orderParam) {
-        if (orderParam.getChannelIdList()==null||orderParam.getChannelIdList().isEmpty()){
-            return R.FAIL("请求参数-所属企业不允许为空");
-        }
-        if (orderParam.getChannelIdList().contains(0L)){
-            Long userId = SecurityUtils.getSysUser().getUserId();
-            List<Long> channelIdList =  sysUserService.findByUserIdListId(userId);
-            orderParam.setChannelIdList(channelIdList);
-            if (userId != Constant.SUPER_ADMIN_ID&&(orderParam.getChannelIdList()==null||orderParam.getChannelIdList().isEmpty())){
-                List<Long> longs = new ArrayList<>();
-                longs.add(0L);
-                orderParam.setChannelIdList(longs);
-            }
-        }
+        getBackendOrderParam(orderParam);
         return R.SUCCESS(orderService.deliverListStatusNum(orderParam));
     }
 
@@ -260,8 +238,16 @@ public class OrderController {
     @GetMapping("/export")
     @ApiOperation("后管端-快递订单列表导出")
     public void export(BackendOrderParam orderParam, HttpServletResponse response) {
+        getBackendOrderParam(orderParam);
+         orderService.export(orderParam,response);
+    }
+
+    private void getBackendOrderParam(BackendOrderParam orderParam){
         if (orderParam.getChannelIdList()==null||orderParam.getChannelIdList().isEmpty()){
-           throw new GlobalException("请求参数-所属企业不允许为空");
+            throw new GlobalException("请求参数-所属企业不允许为空");
+        }
+        if (ObjectUtil.isEmpty(orderParam.getUserAttrType())){
+            orderParam.setUserAttrType("1");//默认查询正常人员属性
         }
         if (orderParam.getChannelIdList().contains(0L)){
             Long userId = null;
@@ -278,7 +264,5 @@ public class OrderController {
                 orderParam.setChannelIdList(longs);
             }
         }
-         orderService.export(orderParam,response);
     }
-
 }

+ 11 - 14
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/UserEnterpriseController.java

@@ -1,5 +1,6 @@
 package com.yami.shop.platform.controller;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.model.User;
 import com.yami.shop.bean.param.OrderRefundStaisticsParam;
@@ -66,19 +67,7 @@ public class UserEnterpriseController {
     @ApiOperation("员工列表")
     @GetMapping("/enterpriseUserList")
     public R<IPage<EnterpriseUserVo>> enterpriseUserList(EnterpriseUserPo po, PageParam<EnterpriseUserPo> page) {
-        if (po.getChannelIdList()==null||po.getChannelIdList().isEmpty()){
-            throw new GlobalException("请求参数-所属企业不允许为空");
-        }
-        if (po.getChannelIdList().contains(0L)){
-            Long userId = SecurityUtils.getSysUser().getUserId();
-           List<Long> channelIdList =  sysUserService.findByUserIdListId(userId);
-            po.setChannelIdList(channelIdList);
-            if (userId != Constant.SUPER_ADMIN_ID&&(po.getChannelIdList()==null||po.getChannelIdList().isEmpty())){
-                List<Long> longs = new ArrayList<>();
-                longs.add(0L);
-                po.setChannelIdList(longs);
-            }
-        }
+        getEnterpriseUserPo(po);
         IPage<EnterpriseUserVo> userPage =  userService.enterpriseUserList(page,po);
         return R.SUCCESS(userPage);
     }
@@ -119,6 +108,7 @@ public class UserEnterpriseController {
         updateUser.setChannelId(user.getChannelId());
         updateUser.setUserId(user.getUserId());
         updateUser.setStatus(user.getStatus());
+        updateUser.setUserAttrType(user.getUserAttrType());
         userService.updateById(updateUser);
         return R.SUCCESS();
     }
@@ -132,9 +122,17 @@ public class UserEnterpriseController {
     @GetMapping("/export")
     @ApiOperation("后管端-用户列表导出")
     public void export(EnterpriseUserPo po, HttpServletResponse response) {
+        getEnterpriseUserPo(po);
+        userService.export(po,response);
+    }
+
+    private void getEnterpriseUserPo(EnterpriseUserPo po){
         if (po.getChannelIdList()==null||po.getChannelIdList().isEmpty()){
             throw new GlobalException("请求参数-所属企业不允许为空");
         }
+        if (ObjectUtil.isEmpty(po.getUserAttrType())){
+            po.setUserAttrType("1");//默认查询正常人员属性
+        }
         if (po.getChannelIdList().contains(0L)){
             Long userId = null;
             try {
@@ -150,6 +148,5 @@ public class UserEnterpriseController {
                 po.setChannelIdList(longs);
             }
         }
-        userService.export(po,response);
     }
 }

+ 8 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/SysDictDataMapper.java

@@ -1,6 +1,8 @@
 package com.yami.shop.dao;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.model.SysDictData;
+import com.yami.shop.common.util.PageParam;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -93,4 +95,10 @@ public interface SysDictDataMapper
      * @return 结果
      */
     public int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType);
+
+    IPage<SysDictData> selectDictTypePage(@Param("pageQuery") PageParam<SysDictData> pageQuery,@Param("dictData")SysDictData dictData);
+
+    boolean findExist(@Param("dict")SysDictData dict);
+
+    void deleteDictDataByDictType(@Param("dictType")String dictType);
 }

+ 1 - 1
yami-shop-service/src/main/java/com/yami/shop/dao/UserMapper.java

@@ -42,7 +42,7 @@ public interface UserMapper extends BaseMapper<User> {
     IPage<EnterpriseUserVo> enterpriseUserList(@Param("page") PageParam<EnterpriseUserPo> page, @Param("po") EnterpriseUserPo po);
 
     void addUserLog(@Param("operator") String operator, @Param("batchNo") String batchNo,@Param("status") String status,
-                    @Param("channel") String channel,@Param("realName") String realName,@Param("phone") String phone);
+                    @Param("channel") String channel,@Param("realName") String realName,@Param("phone") String phone,@Param("userAttrType") String userAttrType );
 
     IPage<EnterpriseUserLogPo> enterpriseUserLogList(@Param("page") PageParam<EnterpriseUserLogPo> page);
 

+ 6 - 0
yami-shop-service/src/main/java/com/yami/shop/service/ISysDictDataService.java

@@ -1,6 +1,8 @@
 package com.yami.shop.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.model.SysDictData;
+import com.yami.shop.common.util.PageParam;
 
 import java.util.List;
 
@@ -58,4 +60,8 @@ public interface ISysDictDataService
      * @return 结果
      */
     public int updateDictData(SysDictData dictData);
+
+    boolean checkDictDataUnique(SysDictData dict);
+
+    IPage<SysDictData> selectDictTypePage(SysDictData dictData, PageParam<SysDictData> pageQuery);
 }

+ 0 - 13
yami-shop-service/src/main/java/com/yami/shop/service/ISysDictTypeService.java

@@ -58,20 +58,7 @@ public interface ISysDictTypeService
      */
     public void deleteDictTypeByIds(Long[] dictIds);
 
-    /**
-     * 加载字典缓存数据
-     */
-    public void loadingDictCache();
 
-    /**
-     * 清空字典缓存数据
-     */
-    public void clearDictCache();
-
-    /**
-     * 重置字典缓存数据
-     */
-    public void resetDictCache();
 
     /**
      * 新增保存字典类型信息

+ 1 - 0
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBOrderService.java

@@ -291,6 +291,7 @@ public class HBOrderService implements IHBOrderService {
         Integer logisticStatus = body.getInteger("logisticStatus");
         Order order = orderMapper.getOrderAndOrderItemByOrderNumber(channelOrderId);
         order.setHbLogisticStatus(logisticStatus);
+        order.setDvyFlowId(body.getString("carrierNo"));
         order.setUpdateTime(new Date(changeTime));
         orderMapper.updateById(order);
     }

+ 1 - 1
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderRefundServiceImpl.java

@@ -1353,7 +1353,7 @@ public class OrderRefundServiceImpl extends ServiceImpl<OrderRefundMapper, Order
                     "所属企业", "买家姓名", "买家电话"
             };
             // 创建合并单元格的表头
-            ExportUtils.createMergedHeader(sheet, headerStyle,"退款订单");
+            ExportUtils.createMergedHeader(sheet, headerStyle,"退款订单",19);
 
             // 创建列标题行
             ExportUtils.createColumnHeaders(sheet, headerStyle,headers);

+ 1 - 1
yami-shop-service/src/main/java/com/yami/shop/service/impl/OrderServiceImpl.java

@@ -1421,7 +1421,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
                         "实付金额", "所属企业", "买家姓名", "买家电话"
                 };
                 // 创建合并单元格的表头
-                ExportUtils.createMergedHeader(sheet, headerStyle, "正常订单");
+                ExportUtils.createMergedHeader(sheet, headerStyle, "正常订单",18);
 
                 // 创建列标题行
                 ExportUtils.createColumnHeaders(sheet, headerStyle, headers);

+ 1 - 1
yami-shop-service/src/main/java/com/yami/shop/service/impl/PointsRechargeServiceImpl.java

@@ -268,7 +268,7 @@ public class PointsRechargeServiceImpl extends ServiceImpl<PointsRechargeMapper,
                     "创建时间"
             };
             // 创建合并单元格的表头
-            ExportUtils.createMergedHeader(sheet, headerStyle,"积分列表");
+            ExportUtils.createMergedHeader(sheet, headerStyle,"积分列表",6);
 
             // 创建列标题行
             ExportUtils.createColumnHeaders(sheet, headerStyle,headers);

+ 2 - 0
yami-shop-service/src/main/java/com/yami/shop/service/impl/ShopDetailServiceImpl.java

@@ -339,6 +339,7 @@ public class ShopDetailServiceImpl extends ServiceImpl<ShopDetailMapper, ShopDet
                         .shopName(s.getShopName())
                         .lat(s.getShopLat())
                         .lon(s.getShopLng())
+                        .hasProduct(s.getHasProduct())
                         .build()).collect(Collectors.toList());
         return ResponseEntity.ok(collect);
     }
@@ -352,6 +353,7 @@ public class ShopDetailServiceImpl extends ServiceImpl<ShopDetailMapper, ShopDet
                         .shopName(s.getShopName())
                         .lat(s.getShopLat())
                         .lon(s.getShopLng())
+                        .hasProduct(s.getHasProduct())
                         .build()).collect(Collectors.toList());
         return ResponseEntity.ok(collect);
     }

+ 25 - 17
yami-shop-service/src/main/java/com/yami/shop/service/impl/SysDictDataServiceImpl.java

@@ -1,8 +1,14 @@
 package com.yami.shop.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.model.SysDictData;
+import com.yami.shop.bean.model.SysDictType;
+import com.yami.shop.common.util.PageParam;
 import com.yami.shop.dao.SysDictDataMapper;
 import com.yami.shop.service.ISysDictDataService;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -66,10 +72,7 @@ public class SysDictDataServiceImpl implements ISysDictDataService
     {
         for (Long dictCode : dictCodes)
         {
-            SysDictData data = selectDictDataById(dictCode);
             dictDataMapper.deleteDictDataById(dictCode);
-            List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(data.getDictType());
-//            DictUtils.setDictCache(data.getDictType(), dictDatas);
         }
     }
 
@@ -82,13 +85,7 @@ public class SysDictDataServiceImpl implements ISysDictDataService
     @Override
     public int insertDictData(SysDictData data)
     {
-        int row = dictDataMapper.insertDictData(data);
-        if (row > 0)
-        {
-            List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(data.getDictType());
-//            DictUtils.setDictCache(data.getDictType(), dictDatas);
-        }
-        return row;
+        return dictDataMapper.insertDictData(data);
     }
 
     /**
@@ -100,12 +97,23 @@ public class SysDictDataServiceImpl implements ISysDictDataService
     @Override
     public int updateDictData(SysDictData data)
     {
-        int row = dictDataMapper.updateDictData(data);
-        if (row > 0)
-        {
-            List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(data.getDictType());
-//            DictUtils.setDictCache(data.getDictType(), dictDatas);
-        }
-        return row;
+        return dictDataMapper.updateDictData(data);
+    }
+
+    /**
+     * 校验字典键值是否唯一
+     *
+     * @param dict 字典数据
+     * @return 结果
+     */
+    @Override
+    public boolean checkDictDataUnique(SysDictData dict) {
+        boolean exist = dictDataMapper.findExist(dict);
+        return !exist;
+    }
+
+    @Override
+    public IPage<SysDictData> selectDictTypePage(SysDictData dictData, PageParam<SysDictData> pageQuery) {
+        return dictDataMapper.selectDictTypePage(pageQuery,dictData);
     }
 }

+ 22 - 62
yami-shop-service/src/main/java/com/yami/shop/service/impl/SysDictTypeServiceImpl.java

@@ -3,6 +3,7 @@ package com.yami.shop.service.impl;
 import com.aliyun.oss.ServiceException;
 import com.yami.shop.bean.model.SysDictData;
 import com.yami.shop.bean.model.SysDictType;
+import com.yami.shop.common.exception.GlobalException;
 import com.yami.shop.dao.SysDictDataMapper;
 import com.yami.shop.dao.SysDictTypeMapper;
 import com.yami.shop.service.ISysDictTypeService;
@@ -31,14 +32,14 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService
     @Autowired
     private SysDictDataMapper dictDataMapper;
 
-    /**
-     * 项目启动时,初始化字典到缓存
-     */
-    @PostConstruct
-    public void init()
-    {
-        loadingDictCache();
-    }
+//    /**
+//     * 项目启动时,初始化字典到缓存
+//     */
+//    @PostConstruct
+//    public void init()
+//    {
+//        loadingDictCache();
+//    }
 
     /**
      * 根据条件分页查询字典类型
@@ -72,15 +73,9 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService
     @Override
     public List<SysDictData> selectDictDataByType(String dictType)
     {
-//        List<SysDictData> dictDatas = DictUtils.getDictCache(dictType);
-//        if (ObjectUtils.isNotEmpty(dictDatas))
-//        {
-//            return dictDatas;
-//        }
         List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dictType);
         if (ObjectUtils.isNotEmpty(dictDatas))
         {
-//            DictUtils.setDictCache(dictType, dictDatas);
             return dictDatas;
         }
         return null;
@@ -121,48 +116,20 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService
         for (Long dictId : dictIds)
         {
             SysDictType dictType = selectDictTypeById(dictId);
-            if (dictDataMapper.countDictDataByType(dictType.getDictType()) > 0)
-            {
-                throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName()));
+            if (dictType!=null){
+                if (0==dictType.getStatus()){
+                    if (dictDataMapper.countDictDataByType(dictType.getDictType()) > 0)
+                    {
+                        throw new GlobalException(String.format("%1$s已分配,不能删除", dictType.getDictName()));
+                    }
+                }
+                dictTypeMapper.deleteDictTypeById(dictId);
+                dictDataMapper.deleteDictDataByDictType(dictType.getDictType());
             }
-            dictTypeMapper.deleteDictTypeById(dictId);
-//            DictUtils.removeDictCache(dictType.getDictType());
-        }
-    }
 
-    /**
-     * 加载字典缓存数据
-     */
-    @Override
-    public void loadingDictCache()
-    {
-        SysDictData dictData = new SysDictData();
-        dictData.setStatus("0");
-        Map<String, List<SysDictData>> dictDataMap = dictDataMapper.selectDictDataList(dictData).stream().collect(Collectors.groupingBy(SysDictData::getDictType));
-        for (Map.Entry<String, List<SysDictData>> entry : dictDataMap.entrySet())
-        {
-//            DictUtils.setDictCache(entry.getKey(), entry.getValue().stream().sorted(Comparator.comparing(SysDictData::getDictSort)).collect(Collectors.toList()));
         }
     }
 
-    /**
-     * 清空字典缓存数据
-     */
-    @Override
-    public void clearDictCache()
-    {
-//        DictUtils.clearDictCache();
-    }
-
-    /**
-     * 重置字典缓存数据
-     */
-    @Override
-    public void resetDictCache()
-    {
-        clearDictCache();
-        loadingDictCache();
-    }
 
     /**
      * 新增保存字典类型信息
@@ -174,10 +141,6 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService
     public int insertDictType(SysDictType dict)
     {
         int row = dictTypeMapper.insertDictType(dict);
-        if (row > 0)
-        {
-//            DictUtils.setDictCache(dict.getDictType(), null);
-        }
         return row;
     }
 
@@ -192,14 +155,11 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService
     public int updateDictType(SysDictType dict)
     {
         SysDictType oldDict = dictTypeMapper.selectDictTypeById(dict.getDictId());
-        dictDataMapper.updateDictDataType(oldDict.getDictType(), dict.getDictType());
-        int row = dictTypeMapper.updateDictType(dict);
-        if (row > 0)
-        {
-            List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dict.getDictType());
-//            DictUtils.setDictCache(dict.getDictType(), dictDatas);
+        if (dict!=null&&oldDict!=null){
+            dictDataMapper.updateDictDataType(oldDict.getDictType(), dict.getDictType());
+            return dictTypeMapper.updateDictType(dict);
         }
-        return row;
+        return 0;
     }
 
     /**

+ 90 - 14
yami-shop-service/src/main/java/com/yami/shop/service/impl/UserServiceImpl.java

@@ -14,6 +14,12 @@ import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.read.listener.PageReadListener;
+import com.alibaba.excel.write.handler.CellWriteHandler;
+import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
+import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
+import com.alibaba.excel.write.metadata.style.WriteCellStyle;
+import com.alibaba.excel.write.metadata.style.WriteFont;
+import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -22,6 +28,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.yami.shop.bean.app.param.UserRegisterParam;
 import com.yami.shop.bean.model.Channel;
+import com.yami.shop.bean.model.SysDictData;
 import com.yami.shop.bean.model.User;
 import com.yami.shop.bean.po.EnterpriseUserErrExcelInfo;
 import com.yami.shop.bean.po.EnterpriseUserExcelInfo;
@@ -34,6 +41,8 @@ import com.yami.shop.common.util.IPHelper;
 import com.yami.shop.common.util.PageParam;
 import com.yami.shop.common.util.RedisUtil;
 import com.yami.shop.dao.ChannelMapper;
+import com.yami.shop.dao.SysDictDataMapper;
+import com.yami.shop.dao.SysDictTypeMapper;
 import com.yami.shop.dao.UserMapper;
 import com.yami.shop.service.UserExtensionService;
 import com.yami.shop.service.UserService;
@@ -42,21 +51,22 @@ import com.yami.shop.utils.ExportUtils;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.net.URLEncoder;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * @author lgh on 2018/09/11.
@@ -70,6 +80,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     private final ChannelMapper channelMapper;
     private final UserExtensionService userExtensionService;
 
+    @Autowired
+    private SysDictDataMapper dictDataMapper;
+
 
     @Override
     public User getUserByUserId(String userId) {
@@ -124,16 +137,55 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
 
     @Override
     public void downloadExcelGoods(HttpServletResponse response) {
+        ServletOutputStream outputStream = null;
         try {
-            List<EnterpriseUserExcelInfo> list = Lists.newArrayList();
+            // 重置响应,避免之前的数据影响
+            response.reset();
+
+            // 先设置响应头
             response.setCharacterEncoding("utf-8");
+            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
             String fileName = URLEncoder.encode("企业员工导入模板", "UTF-8").replaceAll("\\+", "%20");
             response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
-            EasyExcel.write(response.getOutputStream(), EnterpriseUserExcelInfo.class)
+
+            // 查询数据
+            List<SysDictData> userAttrTypeList = dictDataMapper.selectDictDataByType("user_attr_type");
+            String userAttrName = null;
+            if (userAttrTypeList != null && !userAttrTypeList.isEmpty()) {
+                userAttrName = userAttrTypeList.stream()
+                        .filter(data -> data.getDictCode() != 1L)
+                        .map(SysDictData::getDictLabel)
+                        .collect(Collectors.joining(";"));
+            }
+
+            // 准备数据
+            List<EnterpriseUserExcelInfo> list = Lists.newArrayList();
+            EnterpriseUserExcelInfo enterpriseUserExcelInfo = new EnterpriseUserExcelInfo();
+            enterpriseUserExcelInfo.setChannel("必填!");
+            enterpriseUserExcelInfo.setRealName("必填!");
+
+            if (StringUtils.isNotEmpty(userAttrName)) {
+                enterpriseUserExcelInfo.setUserAttrName("必填!" + userAttrName);
+            } else {
+                enterpriseUserExcelInfo.setUserAttrName("必填!且值为1");
+            }
+
+            enterpriseUserExcelInfo.setPhone("必填!必须输入真实手机号,且该手机号码有微信");
+            list.add(enterpriseUserExcelInfo);
+
+            // 获取输出流
+            outputStream = response.getOutputStream();
+
+            // 写入Excel
+            EasyExcel.write(outputStream, EnterpriseUserExcelInfo.class)
                     .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
-                    .sheet("列表").doWrite(list);
-        } catch (IOException e) {
-            throw new GlobalException("文件下载异常");
+                    .sheet("列表")
+                    .doWrite(list);
+            // 刷新流
+            outputStream.flush();
+
+        } catch (Exception e) {
+            log.error("下载Excel模板失败", e);
         }
     }
 
@@ -141,6 +193,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
     @SneakyThrows
     @Transactional(rollbackFor = Exception.class)
     public void uploadExcelGoods(MultipartFile file,String username) {
+        List<SysDictData> userAttrTypeList = dictDataMapper.selectDictDataByType("user_attr_type");//查询人员属性
         List<EnterpriseUserExcelInfo> goodsInfoList = Lists.newArrayList();
         String batchNo = String.valueOf(System.currentTimeMillis());
         EasyExcel.read(file.getInputStream(), EnterpriseUserExcelInfo.class, new PageReadListener<EnterpriseUserExcelInfo>(goodsInfoList::addAll)).sheet().doRead();
@@ -150,12 +203,14 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             CullenUtils.validateDataThrowException(c.getPhone()==null,"手机号不能为空...");
             CullenUtils.validateDataThrowException(c.getChannel()==null,"渠道不能为空...");
             CullenUtils.validateDataThrowException(c.getRealName()==null,"姓名不能为空...");
+            CullenUtils.validateDataThrowException(c.getUserAttrName()==null,"人员属性不能为空...");
+            String userAttrType = getUserAttrType(c.getUserAttrName().replaceAll("\\s+", ""), userAttrTypeList);
             String phone = c.getPhone().replaceAll("\\s+", "");
-            if (phone.length()!=11||!CullenUtils.isNumeric(phone)) {
-                userMapper.addUserLog(username,batchNo,"0",c.getChannel(),c.getRealName(),c.getPhone());
+            if (phone.length()!=11||!CullenUtils.isNumeric(phone)||"0".equals(userAttrType)) {
+                userMapper.addUserLog(username,batchNo,"0",c.getChannel(),c.getRealName(),c.getPhone(),userAttrType);
             }else {
-                addUser(new EnterpriseUserPo(getChannel(c.getChannel()), c.getRealName(), c.getPhone()));
-                userMapper.addUserLog(username,batchNo,"1",c.getChannel(),c.getRealName(),c.getPhone());
+                addUser(new EnterpriseUserPo(getChannel(c.getChannel()), c.getRealName(), c.getPhone(),userAttrType));
+                userMapper.addUserLog(username,batchNo,"1",c.getChannel(),c.getRealName(),c.getPhone(),userAttrType);
             }
         });
     }
@@ -208,6 +263,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
             user.setStatus(1);
             user.setLevel(1);
             user.setLevelType(0);
+            user.setUserAttrType(po.getUserAttrType());
             user.setChannelId(po.getChannelId());
             user.setChannelId(po.getChannelId());
             user.setUserId(IdUtil.simpleUUID());
@@ -221,6 +277,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                 user.setRealName(po.getRealName());
                 user.setChannelId(po.getChannelId());
                 user.setUserId(userInfo.getUserId());
+                user.setUserAttrType(po.getUserAttrType());
                 userMapper.updateById(user);
             }else {
                 if (userInfo.getChannelId().equals(po.getChannelId())){
@@ -232,6 +289,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     user.setRealName(po.getRealName());
                     user.setChannelId(po.getChannelId());
                     user.setUserId(userInfo.getUserId());
+                    user.setUserAttrType(po.getUserAttrType());
                     userMapper.updateById(user);
                 }
             }
@@ -325,7 +383,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     "已过期积分", "已消耗积分"
             };
             // 创建合并单元格的表头
-            ExportUtils.createMergedHeader(sheet, headerStyle,"员工列表");
+            ExportUtils.createMergedHeader(sheet, headerStyle,"员工列表",7);
 
             // 创建列标题行
             ExportUtils.createColumnHeaders(sheet, headerStyle,headers);
@@ -403,4 +461,22 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
         // 已消耗积分
         ExportUtils.createCell(sheet,row, 7,0,0, orderRefundVo.getUsed(), numberStyle);
     }
+
+    private String getUserAttrType(String userAttrName,List<SysDictData> sysDictDataList){
+        if (StringUtils.isNotEmpty(userAttrName)){
+            if (!sysDictDataList.isEmpty()){
+                for (SysDictData sysDictData : sysDictDataList) {
+                    if (sysDictData.getDictLabel().equals(userAttrName)){
+                        return sysDictData.getDictValue();
+                    }
+                }
+                return "0";
+            }else if (userAttrName.equals("1")){
+                return userAttrName;
+            }else {
+                return "0";
+            }
+        }
+        return "0";
+    }
 }

+ 3 - 3
yami-shop-service/src/main/java/com/yami/shop/utils/ExportUtils.java

@@ -21,15 +21,15 @@ public class ExportUtils {
     /**
      * 创建合并单元格的表头(模拟模板中的"正常订单"标题)
      */
-    public static void createMergedHeader(Sheet sheet, CellStyle headerStyle,String headerName) {
+    public static void createMergedHeader(Sheet sheet, CellStyle headerStyle,String headerName,int lastCol) {
         // 第一行:主标题
         Row titleRow = sheet.createRow(0);
         Cell titleCell = titleRow.createCell(0);
         titleCell.setCellValue(headerName);
         titleCell.setCellStyle(headerStyle);
 
-        // 合并A1到R1单元格
-        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 17));
+        // 合并单元格
+        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, lastCol));
 
         // 设置行高
         titleRow.setHeightInPoints(25);

+ 16 - 0
yami-shop-service/src/main/resources/mapper/OrderMapper.xml

@@ -484,6 +484,7 @@
         SELECT a.*,b.receiver,b.mobile user_mobile,c.shop_name FROM tz_order a
         LEFT JOIN tz_user_addr_order b on a.addr_order_id=b.addr_order_id
         LEFT JOIN tz_shop_detail c on a.shop_id=c.shop_id
+        left join  tz_user d on a.user_id = d.user_id
         <where>
             <if test="orderParam.orderNumber != null and orderParam.orderNumber != ''">
                 and a.order_number = #{orderParam.orderNumber}
@@ -497,6 +498,9 @@
             <if test="orderParam.dvyType != null and orderParam.dvyType != ''">
                 and a.dvy_type = #{orderParam.dvyType}
             </if>
+            <if test="orderParam.userAttrType != null and orderParam.userAttrType != '' and orderParam.userAttrType != 0">
+                AND d.user_attr_type = #{orderParam.userAttrType}
+            </if>
             <if test="orderParam.shopId != null">
                 and a.shop_id = #{orderParam.shopId}
             </if>
@@ -546,6 +550,7 @@
         SELECT count(1) FROM tz_order a
         LEFT JOIN tz_user_addr_order b on a.addr_order_id=b.addr_order_id
         LEFT JOIN tz_shop_detail c on a.shop_id=c.shop_id
+        left join  tz_user d on a.user_id = d.user_id
         <where>
             <if test="orderParam.orderNumber != null and orderParam.orderNumber != ''">
                 and a.order_number = #{orderParam.orderNumber}
@@ -559,6 +564,9 @@
             <if test="orderParam.dvyType != null and orderParam.dvyType != ''">
                 and a.dvy_type = #{orderParam.dvyType}
             </if>
+            <if test="orderParam.userAttrType != null and orderParam.userAttrType != '' and orderParam.userAttrType != 0">
+                AND d.user_attr_type = #{orderParam.userAttrType}
+            </if>
             <if test="orderParam.shopId != null">
                 and a.shop_id = #{orderParam.shopId}
             </if>
@@ -1009,6 +1017,7 @@
         SELECT count(a.order_id) FROM `tz_order` a
         LEFT JOIN tz_user_addr_order b on a.addr_order_id=b.addr_order_id
         LEFT JOIN tz_shop_detail c on a.shop_id=c.shop_id
+        left join  tz_user d on a.user_id = d.user_id
         <where>
             hb_order_status in
             <foreach collection="status" item="status" separator="," open="(" close=")">
@@ -1026,6 +1035,9 @@
             <if test="orderParam.dvyType != null and orderParam.dvyType != ''">
                 and a.dvy_type = #{orderParam.dvyType}
             </if>
+            <if test="orderParam.userAttrType != null and orderParam.userAttrType != '' and orderParam.userAttrType != 0">
+                AND d.user_attr_type = #{orderParam.userAttrType}
+            </if>
             <if test="orderParam.shopId != null">
                 and a.shop_id = #{orderParam.shopId}
             </if>
@@ -1169,6 +1181,7 @@
         LEFT JOIN tz_user_addr_order b on a.addr_order_id=b.addr_order_id
         LEFT JOIN tz_shop_detail c on a.shop_id=c.shop_id
         LEFT JOIN tz_channel d on a.channel_id=d.id
+        left join  tz_user e on a.user_id = e.user_id
         <where>
             <if test="orderParam.orderNumber != null and orderParam.orderNumber != ''">
                 and a.order_number = #{orderParam.orderNumber}
@@ -1179,6 +1192,9 @@
                     #{channelId}
                 </foreach>
             </if>
+            <if test="orderParam.userAttrType != null and orderParam.userAttrType != '' and orderParam.userAttrType != 0">
+                AND e.user_attr_type = #{orderParam.userAttrType}
+            </if>
             <if test="orderParam.dvyType != null and orderParam.dvyType != ''">
                 and a.dvy_type = #{orderParam.dvyType}
             </if>

+ 3 - 3
yami-shop-service/src/main/resources/mapper/OrderRefundMapper.xml

@@ -459,7 +459,7 @@
                 </foreach>
             </if>
             <if test="orderRefund.dvyType != null and orderRefund.dvyType != ''">
-                and o.dvy_type = #{orderParam.dvyType}
+                and o.dvy_type = #{orderRefund.dvyType}
             </if>
             <if test="orderRefund.refundSn != null">
                 and re.refund_sn = #{orderRefund.refundSn}
@@ -499,7 +499,7 @@
                 </foreach>
             </if>
             <if test="orderRefund.dvyType != null and orderRefund.dvyType != ''">
-                and o.dvy_type = #{orderParam.dvyType}
+                and o.dvy_type = #{orderRefund.dvyType}
             </if>
             <if test="orderRefund.refundSn != null">
                 and refund.refund_sn = #{orderRefund.refundSn}
@@ -561,7 +561,7 @@
                 </foreach>
             </if>
             <if test="orderRefund.dvyType != null and orderRefund.dvyType != ''">
-                and o.dvy_type = #{orderParam.dvyType}
+                and o.dvy_type = #{orderRefund.dvyType}
             </if>
             <if test="orderRefund.refundSn != null">
                 and refund.refund_sn = #{orderRefund.refundSn}

+ 36 - 32
yami-shop-service/src/main/resources/mapper/ProductMapper.xml

@@ -265,6 +265,38 @@
         ORDER BY p.`sold_num` DESC, p.`update_time` DESC
     </select>
 
+    <select id="getSearchProdDtoPageByProdName" resultType="com.yami.shop.bean.dto.SearchProdDto">
+        SELECT
+        p.prod_id,
+        p.prod_name,
+        p.pic,
+        ss.shop_id AS shop_id,
+        SUM(ss.shop_sku_stocks) AS stocks,
+        MIN(cp.channel_prod_price) AS price,
+        COALESCE(SUM(oi.prod_count), 0) -
+        COALESCE(SUM(refund.product_count), 0) AS net_sales_volume
+        FROM tz_prod p
+        LEFT JOIN tz_sku sku ON p.prod_id = sku.prod_id AND sku.is_delete = 0
+        INNER JOIN tz_shop_sku ss ON ss.sku_id = sku.sku_id AND ss.shop_id = #{searchParam.shopId} AND ss.is_delete = 0
+        INNER JOIN tz_channel_prod cp ON sku.sku_id = cp.sku_id AND cp.shop_id = #{searchParam.shopId}  AND cp.channel_id = #{searchParam.channelId}  AND cp.is_delete = 0
+        LEFT JOIN tz_order_item oi ON p.prod_id = oi.prod_id
+        LEFT JOIN tz_order o ON oi.order_number = o.order_number and  o.shop_id = #{searchParam.shopId}  and o.channel_id = #{searchParam.channelId}
+        AND o.hb_order_status in (70,80)
+        AND o.delete_status = 0
+        LEFT JOIN tz_order_refund_sku refund ON oi.order_item_id = refund.order_item_id
+        AND refund.order_refund_id IN (
+        SELECT refund_id FROM tz_order_refund
+        WHERE return_money_sts= 70
+        )
+        WHERE p.status = 1
+        <if test="searchParam.prodName != null">
+            and p.prod_name LIKE CONCAT('%',#{searchParam.prodName},'%')
+        </if>
+        AND p.is_delete = 0
+        GROUP BY p.prod_id
+        ORDER BY net_sales_volume DESC
+    </select>
+
     <select id="tagProdList" resultMap="tagProductMap">
         SELECT pt.*,
         <include refid="prodWithNoContent_SQL"/>
@@ -292,35 +324,6 @@
         WHERE p.status= 1 AND dp.discount_id = #{discountId}
     </select>
 
-    <select id="getSearchProdDtoPageByProdName" resultType="com.yami.shop.bean.dto.SearchProdDto">
-        SELECT
-            p.prod_id,
-            p.prod_name,
-            p.pic,
-            ss.shop_id AS shop_id,
-            SUM(ss.shop_sku_stocks) AS stocks,
-            MIN(cp.channel_prod_price) AS price,
-            COALESCE(SUM(oi.prod_count), 0) -
-            COALESCE(SUM(refund.product_count), 0) AS net_sales_volume
-        FROM tz_prod p
-                 LEFT JOIN tz_sku sku ON p.prod_id = sku.prod_id AND sku.is_delete = 0
-                 INNER JOIN tz_shop_sku ss ON ss.sku_id = sku.sku_id AND ss.shop_id = #{searchParam.shopId} AND ss.is_delete = 0
-                 INNER JOIN tz_channel_prod cp ON sku.sku_id = cp.sku_id AND cp.shop_id = #{searchParam.shopId}  AND cp.channel_id = #{searchParam.channelId}  AND cp.is_delete = 0
-                 LEFT JOIN tz_order_item oi ON p.prod_id = oi.prod_id
-                 LEFT JOIN tz_order o ON oi.order_number = o.order_number and  o.shop_id = #{searchParam.shopId}  and o.channel_id = #{searchParam.channelId}
-            AND o.hb_order_status in (70,80)
-            AND o.delete_status = 0
-                 LEFT JOIN tz_order_refund_sku refund ON oi.order_item_id = refund.order_item_id
-            AND refund.order_refund_id IN (
-                SELECT refund_id FROM tz_order_refund
-                WHERE return_money_sts= 70
-            )
-        WHERE p.status = 1
-          AND p.is_delete = 0
-        GROUP BY p.prod_id
-        ORDER BY net_sales_volume DESC
-    </select>
-
     <select id="listByShopId" resultType="com.yami.shop.bean.app.dto.ProductDto">
         SELECT
         <include refid="prodWithNoContent_SQL"/>
@@ -823,7 +826,7 @@
         tcp.shop_id,
         MIN(cp.channel_prod_price) AS price,
         tp.pic,
-        tss.shop_sku_stocks AS total_stocks,
+        sum(tss.shop_sku_stocks) AS total_stocks,
 
         COALESCE ((
         SELECT
@@ -844,7 +847,7 @@
         INNER JOIN tz_category_prod tcp ON tp.prod_id = tcp.prod_id
         AND tcp.is_delete = 0 AND tcp.shop_id = #{prodByCategoryIdAndShopIdDTO.shopId}
         and tcp.category_id = #{prodByCategoryIdAndShopIdDTO.categoryId}
-        LEFT JOIN tz_shop_sku tss ON tss.spu_id = tp.prod_id and tss.shop_id = 1
+        LEFT JOIN tz_shop_sku tss ON tss.spu_id = tp.prod_id and tss.shop_id =  #{prodByCategoryIdAndShopIdDTO.shopId}
         INNER JOIN tz_channel_prod cp ON cp.shop_id = tcp.shop_id
         AND cp.sku_id = tss.sku_id
         AND cp.is_delete = 0
@@ -858,7 +861,8 @@
         WHERE tp.STATUS = 1
         AND tp.`is_delete` = 0
         GROUP BY tp.prod_id
-        ORDER BY MAX(tp.create_time) DESC
+        ORDER BY
+        sales_volume DESC,  price ASC
     </select>
 
 <!--    <resultMap id="listProdByCIdAndSIdMap" type="com.yami.shop.bean.param.CategoryProductParam">-->

+ 10 - 5
yami-shop-service/src/main/resources/mapper/ShopDetailMapper.xml

@@ -116,15 +116,20 @@
         sd.shop_lat ,
         sd.shop_lng,
         ( 6371 * acos( cos( radians(#{lat}) ) * cos( radians( shop_lat ) ) * cos( radians( shop_lng ) - radians(#{lon})
-        ) + sin( radians(#{lat}) ) * sin( radians( shop_lat ) ) ) ) distance
+        ) + sin( radians(#{lat}) ) * sin( radians( shop_lat ) ) ) ) distance,
+        EXISTS(
+            SELECT 1
+            FROM tz_channel_prod cp
+            WHERE cp.shop_id = sd.shop_id
+              AND cp.is_delete = 0
+              AND cp.channel_id = #{channelId}
+        ) AS hasProduct
         from
         tz_shop_detail sd
         right join tz_transport2 tp on tp.shop_id = sd.shop_id
         right join tz_channel_shop tcs on tcs.shop_id = sd.shop_id
-        where shop_status = 1
-        <if test="null != channelId">
-         and   tcs.`channel_id`= #{channelId} and tcs.`is_delete`=0
-        </if>
+        where sd.shop_status = 1
+        and   tcs.`channel_id`= #{channelId} and tcs.`is_delete`=0
         order by
         distance
     </select>

+ 2 - 2
yami-shop-service/src/main/resources/mapper/ShopSkuMapper.xml

@@ -8,8 +8,8 @@
         <id column="id" property="id"/>
         <result column="shop_id" property="shopId"/>
         <result column="sku_id" property="skuId"/>
-        <result column="shop_prod_price" property="shopSkuPrice"/>
-        <result column="shop_prod_stocks" property="shopSkuStocks"/>
+        <result column="shop_sku_price" property="shopSkuPrice"/>
+        <result column="shop_sku_stocks" property="shopSkuStocks"/>
         <result column="is_delete" property="isDelete"/>
         <result column="update_time" property="updateTime"/>
         <result column="rec_time" property="recTime"/>

+ 36 - 2
yami-shop-service/src/main/resources/mapper/SysDictDataMapper.xml

@@ -54,7 +54,38 @@
 	</select>
 
 	<select id="countDictDataByType" resultType="Integer">
-	    select count(1) from sys_dict_data where dict_type=#{dictType}
+	    select count(1) from sys_dict_data where dict_type=#{dictType} and status =0
+	</select>
+    <select id="selectDictTypePage" resultType="com.yami.shop.bean.model.SysDictData">
+		<include refid="selectDictDataVo"/>
+		<where>
+			<if test="dictData.dictType != null and dictData.dictType != ''">
+				AND dict_type = #{dictData.dictType}
+			</if>
+			<if test="dictData.dictLabel != null and dictData.dictLabel != ''">
+				AND dict_label like concat('%', #{dictData.dictLabel}, '%')
+			</if>
+			<if test="dictData.status != null and dictData.status != ''">
+				AND status = #{dictData.status}
+			</if>
+		</where>
+		order by dict_sort asc
+	</select>
+	<select id="findExist" resultType="java.lang.Boolean">
+		SELECT CASE WHEN COUNT(1) > 0 THEN 1 ELSE 0 END
+		FROM sys_dict_data
+		<where>
+			<if test="dict.dictType != null and dict.dictType != ''">
+				AND dict_type = #{dict.dictType}
+			</if>
+			<if test="dict.dictValue != null and dict.dictValue != ''">
+				AND dict_value = #{dict.dictValue}
+			</if>
+			<if test="dict.dictCode != null">
+				AND dict_code != #{dict.dictCode}
+			</if>
+		</where>
+		LIMIT 1
 	</select>
 
 	<delete id="deleteDictDataById" parameterType="Long">
@@ -67,6 +98,9 @@
  			#{dictCode}
         </foreach>
  	</delete>
+	<delete id="deleteDictDataByDictType">
+		delete from sys_dict_data where dict_type = #{dictType}
+	</delete>
 
 	<update id="updateDictData" parameterType="com.yami.shop.bean.model.SysDictData">
  		update sys_dict_data
@@ -87,7 +121,7 @@
 	</update>
 
 	<update id="updateDictDataType" parameterType="String">
- 		update sys_dict_data set dict_type = #{newDictType} where dict_type = #{oldDictType}
+ 		update sys_dict_data set dict_type = #{newDictType}  where dict_type = #{oldDictType}
 	</update>
 
  	<insert id="insertDictData" parameterType="com.yami.shop.bean.model.SysDictData">

+ 9 - 3
yami-shop-service/src/main/resources/mapper/UserMapper.xml

@@ -105,7 +105,7 @@
 
 
     <select id="enterpriseUserList" resultType="com.yami.shop.bean.vo.EnterpriseUserVo">
-        SELECT a.user_id,a.`status`,a.real_name,a.user_mobile,a.channel_id,
+        SELECT a.user_id,a.`status`,a.real_name,a.user_mobile,a.channel_id,a.user_attr_type,
         (SELECT channel_name FROM tz_channel WHERE id= a.channel_id) channelName,
         IFNULL((SELECT SUM(points) FROM tz_points_recharge WHERE user_id=a.user_id),0) total, -- 总积分
 
@@ -144,6 +144,9 @@
                     #{channelId}
                 </foreach>
             </if>
+            <if test="po.userAttrType != null and po.userAttrType != '' and po.userAttrType != 0">
+                AND a.user_attr_type = #{po.userAttrType}
+            </if>
             <if test="po.realName != null and po.realName != ''">
                 AND a.real_name LIKE CONCAT("%",#{po.realName},"%")
             </if>
@@ -154,8 +157,8 @@
     </select>
 
     <insert id="addUserLog" parameterType="string">
-        insert into tz_user_add_log(operator, batch_no, task_name, create_time, complete_time, `status`, channel,real_name, phone)
-        values (#{operator}, #{batchNo}, "员工导入", NOW(), NOW(), #{status}, #{channel}, #{realName}, #{phone})
+        insert into tz_user_add_log(operator, batch_no, task_name, create_time, complete_time, `status`, channel,real_name, phone, user_attr_type)
+        values (#{operator}, #{batchNo}, "员工导入", NOW(), NOW(), #{status}, #{channel}, #{realName}, #{phone},#{userAttrType})
     </insert>
 
     <select id="enterpriseUserLogList" resultType="com.yami.shop.bean.po.EnterpriseUserLogPo">
@@ -237,6 +240,9 @@
                     #{channelId}
                 </foreach>
             </if>
+            <if test="po.userAttrType != null and po.userAttrType != '' and po.userAttrType != 0">
+                AND a.user_attr_type = #{po.userAttrType}
+            </if>
             <if test="po.realName != null and po.realName != ''">
                 AND a.real_name LIKE CONCAT("%",#{po.realName},"%")
             </if>

+ 111 - 0
yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysDictDataController.java

@@ -0,0 +1,111 @@
+package com.yami.shop.sys.controller;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.model.SysDictData;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.common.util.R;
+import com.yami.shop.service.ISysDictDataService;
+import com.yami.shop.service.ISysDictTypeService;
+import lombok.RequiredArgsConstructor;
+
+import lombok.extern.java.Log;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 数据字典信息
+ *
+ * @author Lion Li
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/dict/data")
+public class SysDictDataController {
+
+    private final ISysDictDataService dictDataService;
+    private final ISysDictTypeService dictTypeService;
+
+    /**
+     * 查询字典数据列表
+     */
+
+    @GetMapping("/list")
+    public R<IPage<SysDictData>> list(SysDictData dictData, PageParam<SysDictData> pageQuery) {
+        return R.SUCCESS(dictDataService.selectDictTypePage(dictData, pageQuery));
+    }
+
+
+    /**
+     * 查询字典数据详细
+     *
+     * @param dictCode 字典code
+     */
+    @GetMapping(value = "/{dictCode}")
+    public R<SysDictData> getInfo(@PathVariable Long dictCode) {
+        return R.SUCCESS(dictDataService.selectDictDataById(dictCode));
+    }
+
+    /**
+     * 根据字典类型查询字典数据信息
+     *
+     * @param dictType 字典类型
+     */
+    @GetMapping(value = "/type/{dictType}")
+    public R<List<SysDictData>> dictType(@PathVariable String dictType) {
+        List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
+        if (ObjectUtil.isNull(data)) {
+            data = new ArrayList<>();
+        }
+        return R.SUCCESS(data);
+    }
+
+    /**
+     * 新增字典类型
+     */
+    @PostMapping
+    public R<Void> add(@Validated @RequestBody SysDictData dict) {
+        if (!dictDataService.checkDictDataUnique(dict)) {
+            return R.FAIL("新增字典数据'" + dict.getDictValue() + "'失败,字典键值已存在");
+        }
+        dictDataService.insertDictData(dict);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 修改保存字典类型
+     */
+
+    @PutMapping
+    public R<Void> edit(@Validated @RequestBody SysDictData dict) {
+        if (dict.getDictCode()==1L||dict.getDictCode()==2L||dict.getDictCode()==3L){
+            return R.FAIL("修改字典数据人员属性失败,该条字典不允许修改");
+        }
+        if (!dictDataService.checkDictDataUnique(dict)) {
+            return R.FAIL("修改字典数据'" + dict.getDictValue() + "'失败,字典键值已存在");
+        }
+        dictDataService.updateDictData(dict);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 删除字典类型
+     *
+     * @param dictCodes 字典code串
+     */
+    @DeleteMapping("/{dictCodes}")
+    public R<Void> remove(@PathVariable Long[] dictCodes) {
+        if (dictCodes!=null
+                && (Arrays.asList(dictCodes).contains(1L)
+                ||Arrays.asList(dictCodes).contains(2L)
+                ||Arrays.asList(dictCodes).contains(3L))){
+            return R.FAIL("修改字典数据人员属性失败,该条字典不允许删除");
+        }
+        dictDataService.deleteDictDataByIds(dictCodes);
+        return R.SUCCESS();
+    }
+}

+ 97 - 0
yami-shop-sys/src/main/java/com/yami/shop/sys/controller/SysDictTypeController.java

@@ -0,0 +1,97 @@
+package com.yami.shop.sys.controller;
+
+import com.yami.shop.bean.model.SysDictType;
+import com.yami.shop.common.util.R;
+import com.yami.shop.service.ISysDictTypeService;
+import lombok.RequiredArgsConstructor;
+
+import lombok.extern.java.Log;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 数据字典信息
+ *
+ * @author Lion Li
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/dict/type")
+public class SysDictTypeController{
+
+    private final ISysDictTypeService dictTypeService;
+
+    /**
+     * 查询字典类型列表
+     */
+    @GetMapping("/list")
+    public R<List<SysDictType>> list(SysDictType dictType) {
+        return R.SUCCESS(dictTypeService.selectDictTypeList(dictType));
+    }
+
+    /**
+     * 查询字典类型详细
+     *
+     * @param dictId 字典ID
+     */
+    @GetMapping(value = "/{dictId}")
+    public R<SysDictType> getInfo(@PathVariable Long dictId) {
+        return R.SUCCESS(dictTypeService.selectDictTypeById(dictId));
+    }
+
+    /**
+     * 新增字典类型
+     */
+    @PostMapping
+    public R<Void> add(@Validated @RequestBody SysDictType dict) {
+        if (!dictTypeService.checkDictTypeUnique(dict)) {
+            return R.FAIL("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
+        }
+        dictTypeService.insertDictType(dict);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 修改字典类型
+     */
+    @PutMapping
+    public R<Void> edit(@Validated @RequestBody SysDictType dict) {
+        if (dict.getDictId()==1){
+            return R.FAIL("修改字典人员属性失败,字典类型人员属性不允许修改");
+        }
+        if (!dictTypeService.checkDictTypeUnique(dict)) {
+            return R.FAIL("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
+        }
+        dictTypeService.updateDictType(dict);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 删除字典类型
+     *
+     * @param dictIds 字典ID串
+     */
+    @DeleteMapping("/{dictIds}")
+    public R<Void> remove(@PathVariable Long[] dictIds) {
+        if (dictIds != null && Arrays.asList(dictIds).contains(1L)){
+            return R.FAIL("修改字典人员属性失败,字典类型人员属性不允许删除");
+        }
+        dictTypeService.deleteDictTypeByIds(dictIds);
+        return R.SUCCESS();
+    }
+
+
+    /**
+     * 获取字典选择框列表
+     */
+    @GetMapping("/optionselect")
+    public R<List<SysDictType>> optionselect() {
+        List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll();
+        return R.SUCCESS(dictTypes);
+    }
+}

+ 2 - 17
yami-shop-user/yami-shop-user-api/src/main/java/com/yami/shop/user/api/controller/UserScoreController.java

@@ -9,38 +9,23 @@ package com.yami.shop.user.api.controller;
  * 版权所有,侵权必究!
  */
 
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.yami.shop.bean.enums.ScoreLogType;
-import com.yami.shop.bean.event.UpdateUserScoreEvent;
 import com.yami.shop.bean.model.PointsRecord;
-import com.yami.shop.bean.param.ScoreExpireParam;
 import com.yami.shop.common.bean.SysConfig;
-import com.yami.shop.bean.model.UserExtension;
-import com.yami.shop.bean.param.ScoreConfigParam;
 import com.yami.shop.common.config.Constant;
 import com.yami.shop.common.util.PageParam;
 import com.yami.shop.security.api.util.SecurityUtils;
 import com.yami.shop.service.SysConfigService;
-import com.yami.shop.service.UserExtensionService;
 import com.yami.shop.bean.dto.ScoreDataDto;
-import com.yami.shop.user.comment.model.UserScoreDetail;
-import com.yami.shop.user.comment.model.UserScoreLog;
-import com.yami.shop.user.comment.service.UserLevelService;
 import com.yami.shop.user.comment.service.UserScoreDetailService;
 import com.yami.shop.user.comment.service.UserScoreLogService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.apache.commons.collections.CollectionUtils;
-import org.springframework.context.ApplicationContext;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Objects;
 
 /**
@@ -77,9 +62,9 @@ public class UserScoreController {
      */
     @GetMapping("/page")
     @ApiOperation(value = "查询积分明细", notes = "查询积分明细")
-    public ResponseEntity<IPage<PointsRecord>> getScoreLogPage(@ModelAttribute PageParam<PointsRecord> page, @RequestParam Long platform) {
+    public ResponseEntity<IPage<PointsRecord>> getScoreLogPage(@ModelAttribute PageParam<PointsRecord> page, @RequestParam Long channelId) {
         String userId = SecurityUtils.getUser().getUserId();
-        return ResponseEntity.ok(userScoreDetailService.doGetScorePage(page, userId,platform));
+        return ResponseEntity.ok(userScoreDetailService.doGetScorePage(page, userId,channelId));
     }