Browse Source

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

lyx 2 tuần trước cách đây
mục cha
commit
e35b03375f

+ 7 - 3
alien-entity/src/main/java/shop/alien/entity/store/StoreMenu.java

@@ -34,15 +34,19 @@ public class StoreMenu {
     @TableField("img_id")
     private Integer imgId;
 
-    @ApiModelProperty(value = "菜品名称")
+    @ApiModelProperty(value = "菜单类型:1-菜单,2-酒水")
+    @TableField("dish_menu_type")
+    private String dishMenuType;
+
+    @ApiModelProperty(value = "名称")
     @TableField("dish_name")
     private String dishName;
 
-    @ApiModelProperty(value = "菜品价格")
+    @ApiModelProperty(value = "价格")
     @TableField("dish_price")
     private BigDecimal dishPrice;
 
-    @ApiModelProperty(value = "菜品类型, 0:菜单, 1:推荐")
+    @ApiModelProperty(value = "是否推荐, 0:非推荐, 1:推荐")
     @TableField("dish_type")
     private Integer dishType;
 

+ 75 - 0
alien-entity/src/main/java/shop/alien/entity/store/StorePersonnel.java

@@ -0,0 +1,75 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 店铺人员实体类
+ *
+ * @author system
+ * @since 2025-01-15
+ */
+@Data
+@JsonInclude
+@TableName("store_personnel")
+@ApiModel(value = "StorePersonnel对象", description = "店铺人员")
+public class StorePersonnel {
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "门店id")
+    @TableField("store_id")
+    private Integer storeId;
+
+    @ApiModelProperty(value = "人员姓名")
+    @TableField("personnel_name")
+    private String personnelName;
+
+    @ApiModelProperty(value = "角色标签,1-歌手,2-技师,3-教练,4-美发师/美容师")
+    @TableField("role_tags")
+    private String roleTags;
+
+    @ApiModelProperty(value = "图片id,关联store_img表")
+    @TableField("img_id")
+    private Integer imgId;
+
+    @ApiModelProperty(value = "人员描述")
+    @TableField("description")
+    private String description;
+
+    @ApiModelProperty(value = "排序")
+    @TableField("sort")
+    private Integer sort;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+}
+

+ 6 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/StoreMainInfoVo.java

@@ -44,6 +44,12 @@ public class StoreMainInfoVo extends StoreInfo {
     @ApiModelProperty(value = "菜单")
     List<StoreMenuVo> menuUrl;
 
+    @ApiModelProperty(value = "推荐酒水")
+    List<StoreMenuVo> recommendBeverageUrl;
+
+    @ApiModelProperty(value = "酒水单")
+    List<StoreMenuVo> beverageUrl;
+
     @ApiModelProperty(value = "门店标签")
     StoreLabel storeLabel;
 

+ 34 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/StorePersonnelVo.java

@@ -0,0 +1,34 @@
+package shop.alien.entity.store.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import shop.alien.entity.store.StorePersonnel;
+
+import java.util.List;
+
+/**
+ * 店铺人员视图对象
+ *
+ * @author system
+ * @since 2025-01-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@JsonInclude
+public class StorePersonnelVo extends StorePersonnel {
+
+    @ApiModelProperty(value = "图片排序")
+    private Integer imgSort;
+
+    @ApiModelProperty(value = "图片链接")
+    private String imgUrl;
+
+    @ApiModelProperty(value = "图片描述")
+    private String imgDescription;
+
+    @ApiModelProperty(value = "人员排序列表")
+    private List<StorePersonnelVo> sortList;
+}
+

+ 4 - 2
alien-entity/src/main/java/shop/alien/mapper/StoreMenuMapper.java

@@ -28,8 +28,10 @@ public interface StoreMenuMapper extends BaseMapper<StoreMenu> {
     //"图片类型, 0:其他, 1:入口图, 2:相册, 3:菜品, 4:环境, 5:价目表, 6:推荐菜, 7:菜单, 8:用户评论, 9:商家申诉, 10:商家头像, 11:店铺轮播图"
     @Select("select a.*, b.img_url, b.img_sort, b.img_description from store_menu a " +
             "left join store_img b on a.img_id = b.id where a.delete_flag = 0 and b.delete_flag = 0 " +
-            "and a.store_id = #{storeId} AND (if(#{dishType} is null, 1 = 1, a.dish_type = #{dishType}))")
-    List<StoreMenuVo> getStoreMenuList(@Param("storeId") Integer storeId, @Param("dishType") Integer dishType);
+            "and a.store_id = #{storeId} " +
+            "and (if(#{dishType} is null, 1 = 1, a.dish_type = #{dishType})) " +
+            "and (if(#{dishMenuType} is null, 1 = 1, a.dish_menu_type = #{dishMenuType}))")
+    List<StoreMenuVo> getStoreMenuList(@Param("storeId") Integer storeId, @Param("dishType") Integer dishType, @Param("dishMenuType") Integer dishMenuType);
 
     @Select("select a.*, b.img_url, b.img_sort, b.img_description from store_menu a " +
             "left join store_img b on a.img_id = b.id where a.delete_flag = 0 and b.delete_flag = 0 " +

+ 44 - 0
alien-entity/src/main/java/shop/alien/mapper/StorePersonnelMapper.java

@@ -0,0 +1,44 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+import shop.alien.entity.store.StorePersonnel;
+import shop.alien.entity.store.vo.StorePersonnelVo;
+
+import java.util.List;
+
+/**
+ * 店铺人员 Mapper 接口
+ *
+ * @author system
+ * @since 2025-01-15
+ */
+@Mapper
+public interface StorePersonnelMapper extends BaseMapper<StorePersonnel> {
+
+    /**
+     * 获取店铺人员列表
+     *
+     * @param storeId 门店id
+     * @return List<StorePersonnelVo>
+     */
+    @Select("select a.*, b.img_url, b.img_sort, b.img_description from store_personnel a " +
+            "left join store_img b on a.img_id = b.id where a.delete_flag = 0 and b.delete_flag = 0 " +
+            "and a.store_id = #{storeId} " +
+            "order by a.sort asc")
+    List<StorePersonnelVo> getStorePersonnelList(@Param("storeId") Integer storeId);
+
+    /**
+     * 获取人员详情
+     *
+     * @param id 人员id
+     * @return StorePersonnelVo
+     */
+    @Select("select a.*, b.img_url, b.img_sort, b.img_description from store_personnel a " +
+            "left join store_img b on a.img_id = b.id where a.delete_flag = 0 and b.delete_flag = 0 " +
+            "and a.id = #{id}")
+    StorePersonnelVo getPersonnelInfo(@Param("id") Integer id);
+}
+

+ 3 - 4
alien-job/src/main/java/shop/alien/job/store/AiTagJob.java

@@ -751,16 +751,15 @@ public class AiTagJob {
                                 code = responseNode.getInteger("code");
                                 if(code==200) {
                                     JSONObject dataNode = JSONObject.from(responseNode.get("data"));
-
+                                    LifeUserDynamics dynamics = new LifeUserDynamics();
                                     if (!(boolean) dataNode.get("is_compliant")) {
                                         // 只要 AI 判定不合规,立即禁用动态并记录原因
-                                        LifeUserDynamics dynamics = new LifeUserDynamics();
                                         dynamics.setId(lifeUserDynamic.getId());
-                                        dynamics.setCheckFlag(2);
                                         dynamics.setEnableStatus(1);
                                         dynamics.setReason(String.valueOf(dataNode.get("failure_reason")));
-                                        lifeUserDynamicsMapper.updateById(dynamics);
                                     }
+                                    dynamics.setCheckFlag(2);
+                                    lifeUserDynamicsMapper.updateById(dynamics);
                                     log.info("动态审核结果获取成功,AI返回内容: {}", response.getBody());
                                     XxlJobHelper.handleSuccess("动态内容审核任务结果获取执行成功");
                                 } else {

+ 33 - 224
alien-store/src/main/java/shop/alien/store/controller/LifeUserDynamicsController.java

@@ -15,6 +15,7 @@ import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import org.springframework.http.client.ClientHttpRequestInterceptor;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
@@ -123,32 +124,32 @@ public class LifeUserDynamicsController {
             List<String> imgServicesList = Lists.newArrayList();
             imgServicesList.add(ImageReviewServiceEnum.TONALITY_IMPROVE.getService());
             imgServicesList.add(ImageReviewServiceEnum.AIGC_CHECK.getService());
-            ImageModerationResultVO response = imageModerationUtil.productPublishCheck(lifeUserDynamics.getImagePath(),imgServicesList);
+            ImageModerationResultVO response = imageModerationUtil.productPublishCheck(lifeUserDynamics.getImagePath(), imgServicesList);
             if ("high".equals(response.getRiskLevel())) {
                 return R.data(3);
             }
             lifeUserDynamics.setUpdatedTime(new Date());
             int cnt = 0;
-            if(lifeUserDynamics.getType().equals("4")){
+            if (lifeUserDynamics.getType().equals("4")) {
                 cnt = lifeUserDynamicsService.addOrUpdateStore(lifeUserDynamics);
-                if(cnt > 0){
-                        LifeUserExpertOrder lifeUserExpertOrder = lifeUserExpertOrderMapper.selectById(lifeUserDynamics.getBusinessId());
-                        if(lifeUserExpertOrder !=null){
-                            //达人发布动态 订单状态变为履约中
-                            lifeUserExpertOrder.setStatus(4);
-                            lifeUserExpertOrderMapper.updateById(lifeUserExpertOrder);
-                        }
-
-                        //达人作品同步增加一条达人动态记录
-                        LifeUserExpertWorks lifeUserExpertWorks = new LifeUserExpertWorks();
-                        lifeUserExpertWorks.setExpertId(lifeUserDynamics.getExpertId());
-                        lifeUserExpertWorks.setOrderId(lifeUserDynamics.getBusinessId());
-                        lifeUserExpertWorks.setWorksUrl(lifeUserDynamics.getImagePath());
-                        lifeUserExpertWorks.setIntroduction(lifeUserDynamics.getContext());
-                        lifeUserExpertWorks.setDynamicsId(lifeUserDynamics.getId());
-                        lifeUserExpertWorksMapper.insert(lifeUserExpertWorks);
+                if (cnt > 0) {
+                    LifeUserExpertOrder lifeUserExpertOrder = lifeUserExpertOrderMapper.selectById(lifeUserDynamics.getBusinessId());
+                    if (lifeUserExpertOrder != null) {
+                        //达人发布动态 订单状态变为履约中
+                        lifeUserExpertOrder.setStatus(4);
+                        lifeUserExpertOrderMapper.updateById(lifeUserExpertOrder);
+                    }
+
+                    //达人作品同步增加一条达人动态记录
+                    LifeUserExpertWorks lifeUserExpertWorks = new LifeUserExpertWorks();
+                    lifeUserExpertWorks.setExpertId(lifeUserDynamics.getExpertId());
+                    lifeUserExpertWorks.setOrderId(lifeUserDynamics.getBusinessId());
+                    lifeUserExpertWorks.setWorksUrl(lifeUserDynamics.getImagePath());
+                    lifeUserExpertWorks.setIntroduction(lifeUserDynamics.getContext());
+                    lifeUserExpertWorks.setDynamicsId(lifeUserDynamics.getId());
+                    lifeUserExpertWorksMapper.insert(lifeUserExpertWorks);
                 }
-            }else{
+            } else {
                 cnt = lifeUserDynamicsService.addOrUpdateStore(lifeUserDynamics);
             }
             if (cnt == 0) {
@@ -168,15 +169,15 @@ public class LifeUserDynamicsController {
         log.info("LifeUserDynamicsController.deleteDynamicsById?id={}", id);
         try {
             LifeUserDynamics lifeUserDynamics = lifeUserDynamicsService.getDynamicsById(id);
-            if(lifeUserDynamics !=null && lifeUserDynamics.getExpertId() !=null){
+            if (lifeUserDynamics != null && lifeUserDynamics.getExpertId() != null) {
                 boolean flag = lifeUserDynamicsService.deleteDynamicsById(id);
                 //同步删除达人作品表关联记录
-                if(flag){
+                if (flag) {
                     lifeUserExpertWorksMapper.delete(new LambdaQueryWrapper<LifeUserExpertWorks>()
-                            .eq(LifeUserExpertWorks :: getDynamicsId, lifeUserDynamics.getId()));
+                            .eq(LifeUserExpertWorks::getDynamicsId, lifeUserDynamics.getId()));
                 }
                 return R.success("删除成功");
-            }else{
+            } else {
                 lifeUserDynamicsService.deleteDynamicsById(id);
                 return R.success("删除成功");
             }
@@ -211,7 +212,7 @@ public class LifeUserDynamicsController {
     @PostMapping("addLiulanShu")
     public R addLiulanCount(String id) {
         log.info("LifeUserDynamicsController.addLiulanShu?id={}", id);
-        if (lifeUserDynamicsService.addLiulanCount(id) == 0){
+        if (lifeUserDynamicsService.addLiulanCount(id) == 0) {
             return R.fail("操作失败");
         }
         return R.success("操作成功");
@@ -224,8 +225,8 @@ public class LifeUserDynamicsController {
             @ApiImplicitParam(name = "phoneId", value = "用户唯一标识", dataType = "String", paramType = "query")})
     @GetMapping("/getUserDraftDynamics")
     public R<IPage<LifeUserDynamics>> getUserDraftDynamics(@RequestParam(defaultValue = "1") Integer page,
-                                                        @RequestParam(defaultValue = "10") Integer size,
-                                                        @RequestParam(required = false) String phoneId) {
+                                                           @RequestParam(defaultValue = "10") Integer size,
+                                                           @RequestParam(required = false) String phoneId) {
         log.info("LifeUserDynamicsController.getUserDraftDynamics?page={}&size={}&phoneId={}", page, size, phoneId);
         List<LifeUserDynamics> stores = lifeUserDynamicsService.getUserDraftDynamics(phoneId);
         return R.data(ListToPage.setPage(stores, page, size));
@@ -252,7 +253,7 @@ public class LifeUserDynamicsController {
                                                         @RequestParam(defaultValue = "10") Integer size,
                                                         @RequestParam(required = false) String userName,
                                                         @RequestParam(required = false) String userType,
-                                                        @RequestParam(defaultValue = "0",required = false) Integer dynamicsType,
+                                                        @RequestParam(defaultValue = "0", required = false) Integer dynamicsType,
                                                         @RequestParam(required = false) String releaseStartTime,
                                                         @RequestParam(required = false) String releaseEndTime) {
         log.info("LifeUserDynamicsController.getDynamicsList?page={}&size={}&nickName={}&userType={}&dynamicsType={}", page, size, userName, userType, dynamicsType);
@@ -266,7 +267,7 @@ public class LifeUserDynamicsController {
     @PostMapping("setTopStatus")
     public R setTopStatus(@RequestBody() LifeUserDynamicsVo lifeUserDynamicsVo) {
         log.info("LifeUserDynamicsController.setTopStatus?id={},topStatus={}", lifeUserDynamicsVo.getId(), lifeUserDynamicsVo.getTopStatus());
-        if (lifeUserDynamicsService.setTopStatus(lifeUserDynamicsVo) == 0){
+        if (lifeUserDynamicsService.setTopStatus(lifeUserDynamicsVo) == 0) {
             return R.fail("操作失败");
         }
         return R.success("操作成功");
@@ -277,7 +278,7 @@ public class LifeUserDynamicsController {
     @PostMapping("setEnableStatus")
     public R setEnableStatus(@RequestBody() LifeUserDynamicsVo lifeUserDynamicsVo) {
         log.info("LifeUserDynamicsController.setEnableStatus?id={},topStatus={}", lifeUserDynamicsVo.getId(), lifeUserDynamicsVo.getEnableStatus());
-        if (lifeUserDynamicsService.enableStatus(lifeUserDynamicsVo) == 0){
+        if (lifeUserDynamicsService.enableStatus(lifeUserDynamicsVo) == 0) {
             return R.fail("操作失败");
         }
         return R.success("操作成功");
@@ -327,12 +328,13 @@ public class LifeUserDynamicsController {
     @ApiOperationSupport(order = 8)
     @PostMapping("/addUserStoreBrowseNumber")
     public R addUserStoreBrowseNumber(@RequestBody LifeBrowseRecord lifeBrowseRecord) {
-        log.info("LifeUserDynamicsController.addUserStoreBrowseNumber?lifeBrowseRecord={}",lifeBrowseRecord.toString());
+        log.info("LifeUserDynamicsController.addUserStoreBrowseNumber?lifeBrowseRecord={}", lifeBrowseRecord.toString());
         return R.data(lifeUserDynamicsService.addUserStoreBrowseNumber(lifeBrowseRecord));
     }
 
     /**
      * 动态被转发次数+1
+     *
      * @param id 动态id
      * @return 操作结果
      */
@@ -341,202 +343,9 @@ public class LifeUserDynamicsController {
     @GetMapping("addTransferCount")
     public R addTransferCount(String id) {
         log.info("LifeUserDynamicsController.addTransferCount?id={}", id);
-        if (lifeUserDynamicsService.addTransferCount(id) == 0){
+        if (lifeUserDynamicsService.addTransferCount(id) == 0) {
             return R.fail("操作失败");
         }
         return R.success("操作成功");
     }
-
-    @GetMapping("/testAI")
-    public R testAI() {
-        List<LifeUserDynamics> lifeUserDynamics = lifeUserDynamicsMapper.selectList(new LambdaQueryWrapper<LifeUserDynamics>()
-                .eq(LifeUserDynamics::getCheckFlag, 0).eq(LifeUserDynamics::getDeleteFlag, 0));
-
-        // 常见图片后缀(可按需添加,如 .heic、.svg 等)
-        HashSet<String> IMAGE_SUFFIXES = new HashSet<>(Arrays.asList(
-                "jpg", "jpeg", "png", "gif", "bmp", "webp", "heic", "svg", "tiff"
-        ));
-        // 常见视频后缀(可按需添加,如 .avi、.flv 等)
-        HashSet<String> VIDEO_SUFFIXES = new HashSet<>(Arrays.asList(
-                "mp4", "mov", "mkv", "avi", "flv", "wmv", "mpeg", "mpg", "webm"
-        ));
-        RestTemplate restTemplate = new RestTemplate();
-
-        for (LifeUserDynamics lifeUserDynamic : lifeUserDynamics) {
-            String imagePath = lifeUserDynamic.getImagePath();
-
-            List<String> imageList = new ArrayList<>();
-            List<String> videoList = new ArrayList<>();
-            // 按分隔符拆分路径数组(处理连续分隔符如 ",," 产生的空字符串)
-            String[] allPaths = imagePath.split(",");
-            for (String path : allPaths) {
-                // 去除路径前后空格(避免 " a.jpg " 这类情况)
-                String trimmedPath = path.trim();
-                if (trimmedPath.isEmpty()) {
-                    continue; // 跳过空路径
-                }
-                // 获取文件后缀(忽略大小写)
-                // 找到最后一个 "." 的位置
-                int lastDotIndex = trimmedPath.lastIndexOf('.');
-                // 截取后缀(从 "." 后一位到结尾)
-                String suffix = trimmedPath.substring(lastDotIndex + 1);
-                // 分类添加到对应列表
-                if (IMAGE_SUFFIXES.contains(suffix)) {
-                    imageList.add(trimmedPath);
-                } else if (VIDEO_SUFFIXES.contains(suffix)) {
-                    videoList.add(trimmedPath);
-                }
-                try {
-                    log.info("登录Ai服务获取token..." + "http://192.168.2.250:9000/ai/user-auth-core/api/v1/auth/login");
-                    MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
-                    formData.add("username", "UdUser");
-                    formData.add("password", "123456");
-
-                    HttpHeaders headers = new HttpHeaders();
-                    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
-                    HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formData, headers);
-                    ResponseEntity<String> postForEntity = null;
-                    try {
-                        log.info("请求Ai服务登录接口===================>");
-                        postForEntity = restTemplate.postForEntity("http://192.168.2.250:9000/ai/user-auth-core/api/v1/auth/login", requestEntity, String.class);
-                    } catch (Exception e) {
-                        log.error("请求AI服务登录接口失败", e);
-                    }
-
-                    if (postForEntity != null && postForEntity.getStatusCodeValue() == 200) {
-                        log.info("请求Ai服务登录成功 postForEntity.getBody()\t" + postForEntity.getBody());
-                        String responseBody = postForEntity.getBody();
-                        JSONObject jsonObject = JSONObject.parseObject(responseBody);
-                        if (jsonObject != null) {
-                            JSONObject dataJson = jsonObject.getJSONObject("data");
-                            String accessToken = dataJson.getString("access_token");
-
-                            HttpHeaders aiHeaders = new HttpHeaders();
-                            aiHeaders.setContentType(MediaType.APPLICATION_JSON);
-                            aiHeaders.set("Authorization", "Bearer " + accessToken);
-
-                            Map<String, Object> jsonBody = new HashMap<>();
-                            jsonBody.put("text", lifeUserDynamic.getContext());
-                            jsonBody.put("imgUrl", imageList);
-                            jsonBody.put("video", videoList);
-
-                            HttpEntity<Map<String, Object>> request = new HttpEntity<>(jsonBody, aiHeaders);
-                            ResponseEntity<String> response = null;
-                            try {
-                                response = restTemplate.postForEntity("http://192.168.2.250:9000/ai/auto-review/api/v1/multimodal_audit_task/submit", request, String.class);
-                                if (response.getStatusCodeValue() != 200) {
-                                    log.error("AI内容审核接口调用失败 http状态:" + response.getStatusCode());
-                                }
-                                JSONObject responseNode = JSONObject.parseObject(response.getBody());
-                                if (responseNode == null) {
-                                    log.error("AI接口调用失败,响应内容为空");
-                                }
-                                Integer code = null;
-                                if (responseNode != null) {
-                                    code = responseNode.getInteger("code");
-                                    if(code==200) {
-                                        JSONObject dataNode = JSONObject.from(responseNode.get("data"));
-                                        LifeUserDynamics dynamics = new LifeUserDynamics();
-                                        dynamics.setId(lifeUserDynamic.getId());
-                                        dynamics.setCheckFlag(1);
-                                        dynamics.setAiTaskId(dataNode.get("task_id").toString());
-                                        lifeUserDynamicsMapper.updateById(dynamics);
-                                        log.info("动态审核成功,AI返回内容: {}", response.getBody());
-                                    }
-                                }else {
-                                    log.error("AI接口调用失败,错误码: " + code);
-                                }
-                            } catch (Exception e) {
-                                log.error("调用AI内容审核接口失败", e);
-                            }
-                        }
-                    }
-                } catch (RuntimeException ex) {
-                    return R.fail("动态内容审核任务执行失败:" + ex.getMessage());
-                }
-            }
-        }
-        return R.success("动态内容审核任务执行成功");
-    }
-
-    @GetMapping("/testAIGet")
-    public R testAIGet() {
-        List<LifeUserDynamics> lifeUserDynamics = lifeUserDynamicsMapper.selectList(new LambdaQueryWrapper<LifeUserDynamics>()
-                .eq(LifeUserDynamics::getCheckFlag, 1).eq(LifeUserDynamics::getDeleteFlag, 0));
-        RestTemplate restTemplate = new RestTemplate();
-        for (LifeUserDynamics lifeUserDynamic : lifeUserDynamics) {
-            try {
-                MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
-                formData.add("username", "UdUser");
-                formData.add("password", "123456");
-
-                HttpHeaders headers = new HttpHeaders();
-                headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
-                HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formData, headers);
-                ResponseEntity<String> postForEntity = null;
-                try {
-                    log.info("请求Ai服务登录接口===================>");
-                    postForEntity = restTemplate.postForEntity("http://192.168.2.250:9000/ai/user-auth-core/api/v1/auth/login", requestEntity, String.class);
-                } catch (Exception e) {
-                    log.error("请求AI服务登录接口失败", e);
-                }
-
-                if (postForEntity != null && postForEntity.getStatusCodeValue() == 200) {
-                    log.info("请求Ai服务登录成功 postForEntity.getBody()\t" + postForEntity.getBody());
-                    String responseBody = postForEntity.getBody();
-                    JSONObject jsonObject = JSONObject.parseObject(responseBody);
-                    if (jsonObject != null) {
-                        JSONObject dataJson = jsonObject.getJSONObject("data");
-                        String accessToken = dataJson.getString("access_token");
-
-                        HttpHeaders aiHeaders = new HttpHeaders();
-                        aiHeaders.setContentType(MediaType.APPLICATION_JSON);
-                        aiHeaders.set("Authorization", "Bearer " + accessToken);
-
-                        Map<String, Object> jsonBody = new HashMap<>();
-                        jsonBody.put("task_id", lifeUserDynamic.getAiTaskId());
-
-                        HttpEntity<Map<String, Object>> request = new HttpEntity<>(jsonBody, aiHeaders);
-                        ResponseEntity<String> response = null;
-                        try {
-                            response = restTemplate.getForEntity("http://192.168.2.250:9000/ai/auto-review/api/v1/multimodal_audit_task/getResult?task_id="+lifeUserDynamic.getAiTaskId(), String.class);
-                            if (response.getStatusCodeValue() != 200) {
-                                log.error("AI内容审核结果获取接口调用失败 http状态:" + response.getStatusCode());
-                            }
-                            JSONObject responseNode = JSONObject.parseObject(response.getBody());
-                            if (responseNode == null) {
-                                log.error("AI接口调用失败,响应内容为空");
-                            }
-                            Integer code = null;
-                            if (responseNode != null) {
-                                code = responseNode.getInteger("code");
-                                if(code==200) {
-                                    JSONObject dataNode = JSONObject.from(responseNode.get("data"));
-
-                                    if (!(boolean) dataNode.get("is_compliant")) {
-                                        LifeUserDynamics dynamics = new LifeUserDynamics();
-                                        dynamics.setId(lifeUserDynamic.getId());
-                                        dynamics.setCheckFlag(2);
-                                        dynamics.setEnableStatus(1);
-                                        dynamics.setReason(String.valueOf(dataNode.get("failure_reason")));
-                                        lifeUserDynamicsMapper.updateById(dynamics);
-                                    }
-                                    log.info("动态审核结果获取成功,AI返回内容: {}", response.getBody());
-//                                    XxlJobHelper.handleSuccess("动态内容审核任务结果获取执行成功");
-                                } else {
-                                    log.error("AI接口调用失败,错误码: " + code);
-                                }
-                            }
-                        } catch (Exception e) {
-                            log.error("调用AI内容审核结果获取接口失败", e);
-                        }
-                    }
-                }
-            } catch (RuntimeException ex) {
-//                XxlJobHelper.handleFail("动态内容审核任务结果获取执行失败:" + ex.getMessage());
-                return R.fail("动态内容审核任务结果获取执行失败:" + ex.getMessage());
-            }
-        }
-        return R.success("动态内容审核任务结果获取执行成功");
-    }
 }

+ 11 - 5
alien-store/src/main/java/shop/alien/store/controller/StoreMenuController.java

@@ -32,13 +32,19 @@ public class StoreMenuController {
     @ApiOperationSupport(order = 1)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true),
-            @ApiImplicitParam(name = "dishType", value = "菜品类型, 0:菜单, 1:推荐", dataType = "Integer", paramType = "query"),
-            @ApiImplicitParam(name = "phoneId", value = "消息标识", dataType = "Integer", paramType = "query")
+            @ApiImplicitParam(name = "dishType", value = "菜品类型, 0:非推荐, 1:推荐", dataType = "Integer", paramType = "query"),
+            @ApiImplicitParam(name = "phoneId", value = "用户手机号", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "dishMenuType", value = "菜单类型:1-菜单,2-酒水", dataType = "String", paramType = "query")
     })
     @GetMapping("/getMenuByStoreId")
-    public R<List<StoreMenuVo>> getMenuByStoreId(Integer storeId, Integer dishType, String phoneId) {
-        log.info("StoreRecommendController.getByStoreId?id={}&dishType={}&phoneId={}", storeId, dishType, phoneId);
-        return R.data(storeMenuService.getStoreMenu(storeId, dishType, phoneId));
+    public R<List<StoreMenuVo>> getMenuByStoreId(
+            @RequestParam(value = "storeId", required = true) Integer storeId,
+            @RequestParam(value = "dishType", required = false) Integer dishType,
+            @RequestParam(value = "phoneId", required = false) String phoneId,
+            @RequestParam(value = "dishMenuType", required = false) Integer dishMenuType) {
+        log.info("StoreMenuController.getMenuByStoreId?storeId={}&dishType={}&phoneId={}&dishMenuType={}", 
+                storeId, dishType, phoneId, dishMenuType);
+        return R.data(storeMenuService.getStoreMenu(storeId, dishType, phoneId, dishMenuType));
     }
 
     @ApiOperation("新增或修改门店菜单")

+ 87 - 0
alien-store/src/main/java/shop/alien/store/controller/StorePersonnelController.java

@@ -0,0 +1,87 @@
+package shop.alien.store.controller;
+
+import io.swagger.annotations.*;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.StorePersonnel;
+import shop.alien.entity.store.vo.StorePersonnelVo;
+import shop.alien.store.service.StorePersonnelService;
+
+import java.util.List;
+
+/**
+ * 店铺人员Controller
+ *
+ * @author system
+ * @since 2025-01-15
+ */
+@Slf4j
+@Api(tags = {"店铺人员"})
+@ApiSort(5)
+@CrossOrigin
+@RestController
+@RequestMapping("/personnel")
+@RequiredArgsConstructor
+public class StorePersonnelController {
+
+    private final StorePersonnelService storePersonnelService;
+
+    @ApiOperation("获取店铺人员列表")
+    @ApiOperationSupport(order = 1)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "storeId", value = "门店id", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/getPersonnelList")
+    public R<List<StorePersonnelVo>> getPersonnelList(
+            @RequestParam(value = "storeId", required = true) Integer storeId) {
+        log.info("StorePersonnelController.getPersonnelList?storeId={}", storeId);
+        return R.data(storePersonnelService.getStorePersonnelList(storeId));
+    }
+
+    @ApiOperation("获取人员详情")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "人员id", dataType = "Integer", paramType = "query", required = true)
+    })
+    @GetMapping("/getPersonnelInfo")
+    public R<StorePersonnelVo> getPersonnelInfo(
+            @RequestParam(value = "id", required = true) Integer id) {
+        log.info("StorePersonnelController.getPersonnelInfo?id={}", id);
+        return R.data(storePersonnelService.getPersonnelInfo(id));
+    }
+
+    @ApiOperation("新增或修改店铺人员")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/saveOrUpdate")
+    public R<String> saveOrUpdate(@RequestBody StorePersonnelVo storePersonnelVo) {
+        log.info("StorePersonnelController.saveOrUpdate?storePersonnelVo={}", storePersonnelVo);
+        return storePersonnelService.saveOrUpdatePersonnel(storePersonnelVo);
+    }
+
+    @ApiOperation("删除店铺人员")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "ids", value = "人员id列表", dataType = "List<Integer>", paramType = "query", required = true)
+    })
+    @GetMapping("/delete")
+    public R<String> delete(@RequestParam(value = "ids") List<Integer> ids) {
+        log.info("StorePersonnelController.delete?ids={}", ids);
+        return storePersonnelService.deletePersonnel(ids);
+    }
+
+    @ApiOperation("保存人员排序")
+    @ApiOperationSupport(order = 5)
+    @PostMapping("/savePersonnelSort")
+    public R<Boolean> savePersonnelSort(@RequestBody List<StorePersonnel> storePersonnelList) {
+        log.info("StorePersonnelController.savePersonnelSort?storePersonnelList={}", storePersonnelList);
+        Boolean flag = storePersonnelService.savePersonnelSort(storePersonnelList);
+        if (flag) {
+            return R.success("已更新排序");
+        } else {
+            return R.fail("排序失败");
+        }
+    }
+}
+

+ 10 - 7
alien-store/src/main/java/shop/alien/store/service/StoreMenuService.java

@@ -1,7 +1,6 @@
 package shop.alien.store.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import org.springframework.web.bind.annotation.RequestParam;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.StoreMenu;
 import shop.alien.entity.store.vo.StoreMenuVo;
@@ -19,12 +18,13 @@ public interface StoreMenuService extends IService<StoreMenu> {
     /**
      * 获取门店菜单
      *
-     * @param storeId  门店id
-     * @param dishType 菜品类型, 0:菜单, 1:推荐
-     * @param phoneId  消息标识
+     * @param storeId      门店id
+     * @param dishType     菜品类型, 0:非推荐, 1:推荐
+     * @param phoneId      用户手机号
+     * @param dishMenuType 菜单类型:1-菜单,2-酒水
      * @return list
      */
-    List<StoreMenuVo> getStoreMenu(Integer storeId, Integer dishType, String phoneId);
+    List<StoreMenuVo> getStoreMenu(Integer storeId, Integer dishType, String phoneId, Integer dishMenuType);
 
     /**
      * 获取菜品详情
@@ -59,10 +59,13 @@ public interface StoreMenuService extends IService<StoreMenu> {
     Boolean saveMenuSort(List<StoreMenu> storeMenuList);
 
     /**
-     *
      * 删除门店菜单
+     *
+     * @param ids      菜单id列表
+     * @param dishType 0:菜品 1:推荐菜
+     * @return R
      */
-    R deleteMenu(List<Integer> ids, int dishType);
+    R<String> deleteMenu(List<Integer> ids, int dishType);
 
 
 

+ 58 - 0
alien-store/src/main/java/shop/alien/store/service/StorePersonnelService.java

@@ -0,0 +1,58 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.StorePersonnel;
+import shop.alien.entity.store.vo.StorePersonnelVo;
+
+import java.util.List;
+
+/**
+ * 店铺人员服务类
+ *
+ * @author system
+ * @since 2025-01-15
+ */
+public interface StorePersonnelService extends IService<StorePersonnel> {
+
+    /**
+     * 获取店铺人员列表
+     *
+     * @param storeId 门店id
+     * @return List<StorePersonnelVo>
+     */
+    List<StorePersonnelVo> getStorePersonnelList(Integer storeId);
+
+    /**
+     * 获取人员详情
+     *
+     * @param id 人员id
+     * @return StorePersonnelVo
+     */
+    StorePersonnelVo getPersonnelInfo(Integer id);
+
+    /**
+     * 新增或修改店铺人员
+     *
+     * @param storePersonnelVo 人员信息
+     * @return R<String>
+     */
+    R<String> saveOrUpdatePersonnel(StorePersonnelVo storePersonnelVo);
+
+    /**
+     * 删除店铺人员
+     *
+     * @param ids 人员id列表
+     * @return R<String>
+     */
+    R<String> deletePersonnel(List<Integer> ids);
+
+    /**
+     * 保存人员排序
+     *
+     * @param storePersonnelList 人员列表
+     * @return Boolean
+     */
+    Boolean savePersonnelSort(List<StorePersonnel> storePersonnelList);
+}
+

+ 10 - 2
alien-store/src/main/java/shop/alien/store/service/impl/StoreInfoServiceImpl.java

@@ -208,9 +208,17 @@ public class StoreInfoServiceImpl extends ServiceImpl<StoreInfoMapper, StoreInfo
         List<StoreImg> albumUrlList = storeImgMapper.selectList(albumUrlQueryWrapper);
         storeMainInfoVo.setAlbumUrl(albumUrlList.stream().sorted(Comparator.comparing(StoreImg::getImgSort)).map(StoreImg::getImgUrl).collect(Collectors.toList()));
         //推荐菜
-        storeMainInfoVo.setRecommendUrl(storeMenuMapper.getStoreMenuList(id, 1).stream().sorted(Comparator.comparing(StoreMenuVo::getImgSort)).collect(Collectors.toList()));
+        storeMainInfoVo.setRecommendUrl(storeMenuMapper.getStoreMenuList(id, 1,1).stream().sorted(Comparator.comparing(StoreMenuVo::getImgSort)).collect(Collectors.toList()));
         //菜单
-        storeMainInfoVo.setMenuUrl(storeMenuMapper.getStoreMenuList(id, 0).stream().sorted(Comparator.comparing(StoreMenuVo::getImgSort)).collect(Collectors.toList()));
+        storeMainInfoVo.setMenuUrl(storeMenuMapper.getStoreMenuList(id, 0,1).stream().sorted(Comparator.comparing(StoreMenuVo::getImgSort)).collect(Collectors.toList()));
+
+        // todo 需要根据门店类型来判断
+        // 推荐酒水
+        storeMainInfoVo.setRecommendBeverageUrl(storeMenuMapper.getStoreMenuList(id, 1,1).stream().sorted(Comparator.comparing(StoreMenuVo::getImgSort)).collect(Collectors.toList()));
+        //酒单
+        storeMainInfoVo.setBeverageUrl(storeMenuMapper.getStoreMenuList(id, 0,1).stream().sorted(Comparator.comparing(StoreMenuVo::getImgSort)).collect(Collectors.toList()));
+
+
         //门店标签
         storeMainInfoVo.setStoreLabel(storeLabelMapper.selectOne(new LambdaQueryWrapper<StoreLabel>().eq(StoreLabel::getStoreId, id)));
         //营业时间

+ 44 - 22
alien-store/src/main/java/shop/alien/store/service/impl/StoreMenuServiceImpl.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import shop.alien.entity.result.R;
@@ -25,6 +26,7 @@ import shop.alien.store.service.StoreMenuService;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -33,6 +35,7 @@ import java.util.stream.Collectors;
  * @author ssk
  * @since 2024-12-05
  */
+@Slf4j
 @Service
 @RequiredArgsConstructor
 public class StoreMenuServiceImpl extends ServiceImpl<StoreMenuMapper, StoreMenu> implements StoreMenuService {
@@ -49,33 +52,52 @@ public class StoreMenuServiceImpl extends ServiceImpl<StoreMenuMapper, StoreMenu
     /**
      * 获取门店菜单
      *
-     * @param storeId  门店id
-     * @param dishType 菜品类型, 0:菜单, 1:推荐
-     * @param phoneId  消息标识
+     * @param storeId      门店id
+     * @param dishType     菜品类型, 0:非推荐, 1:推荐
+     * @param phoneId      消息标识
+     * @param dishMenuType 菜单类型:1-菜单,2-酒水
      * @return list
      */
     @Override
-    public List<StoreMenuVo> getStoreMenu(Integer storeId, Integer dishType, String phoneId) {
+    public List<StoreMenuVo> getStoreMenu(Integer storeId, Integer dishType, String phoneId, Integer dishMenuType) {
+        // 查询菜单列表
+        Integer queryDishType = (dishType != null && dishType == 0) ? null : dishType;
+        List<StoreMenuVo> menuList = storeMenuMapper.getStoreMenuList(storeId, queryDishType, dishMenuType);
 
-        if (dishType == 0) {
-            List<StoreMenuVo> collect = storeMenuMapper.getStoreMenuList(storeId, null);
-            return collect.stream().sorted(Comparator.comparing(StoreMenuVo::getSort)).collect(Collectors.toList());
-        } else {
-            List<StoreMenuVo> collect = storeMenuMapper.getStoreMenuList(storeId, dishType);
-            collect.forEach(item -> {
-                if (StringUtils.isNotEmpty(phoneId)) {
-                    LambdaQueryWrapper<LifeLikeRecord> query = new LambdaQueryWrapper<>();
-                    query.eq(LifeLikeRecord::getDianzanId, phoneId).eq(LifeLikeRecord::getHuifuId, item.getId());
-                    Integer i = lifeLikeRecordMapper.selectCount(query);
-                    if (i > 0) {
-                        item.setIsLike(1);
-                    } else {
-                        item.setIsLike(0);
-                    }
+        // 如果是推荐菜且有用户标识,批量查询点赞状态
+        if (dishType != null && dishType == 1 && StringUtils.isNotEmpty(phoneId) 
+                && CollectionUtils.isNotEmpty(menuList)) {
+            // 将菜单ID转换为String集合,用于查询点赞记录
+            Set<String> menuIdStrSet = menuList.stream()
+                    .map(item -> String.valueOf(item.getId()))
+                    .collect(Collectors.toSet());
+
+            // 批量查询点赞记录
+            LambdaQueryWrapper<LifeLikeRecord> likeQuery = new LambdaQueryWrapper<>();
+            likeQuery.eq(LifeLikeRecord::getDianzanId, phoneId)
+                    .in(LifeLikeRecord::getHuifuId, menuIdStrSet);
+            List<LifeLikeRecord> likeRecordList = lifeLikeRecordMapper.selectList(likeQuery);
+
+            // 构建已点赞的菜单ID集合
+            Set<String> likedMenuIdSet = likeRecordList.stream()
+                    .map(LifeLikeRecord::getHuifuId)
+                    .collect(Collectors.toSet());
+
+            // 设置点赞状态
+            menuList.forEach(item -> {
+                String menuIdStr = String.valueOf(item.getId());
+                if (likedMenuIdSet.contains(menuIdStr)) {
+                    item.setIsLike(1);
+                } else {
+                    item.setIsLike(0);
                 }
             });
-            return collect.stream().sorted(Comparator.comparing(StoreMenuVo::getSort)).collect(Collectors.toList());
         }
+
+        // 按排序字段排序
+        return menuList.stream()
+                .sorted(Comparator.comparing(StoreMenuVo::getSort))
+                .collect(Collectors.toList());
     }
 
     /**
@@ -200,7 +222,7 @@ public class StoreMenuServiceImpl extends ServiceImpl<StoreMenuMapper, StoreMenu
         boolean flag = false;
         if (CollectionUtil.isNotEmpty(storeMenuVo.getSortList())) {
             for (int i = 0; i < storeMenuVo.getSortList().size(); i++) {
-                LambdaQueryWrapper<StoreMenu> lambdaQueryWrapper = new LambdaQueryWrapper();
+                LambdaQueryWrapper<StoreMenu> lambdaQueryWrapper = new LambdaQueryWrapper<>();
                 lambdaQueryWrapper.eq(StoreMenu::getId, storeMenuVo.getSortList().get(i).getId());
                 StoreMenu storeMenu = this.getOne(lambdaQueryWrapper);
                 storeMenu.setSort(i + 1);
@@ -223,7 +245,7 @@ public class StoreMenuServiceImpl extends ServiceImpl<StoreMenuMapper, StoreMenu
      * @return
      */
     @Override
-    public R deleteMenu(List<Integer> ids, int dishType) {
+    public R<String> deleteMenu(List<Integer> ids, int dishType) {
         QueryWrapper<StoreMenu> queryWrapperMenu = new QueryWrapper<>();
         boolean flag = false;
         if (dishType == 0) {

+ 161 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StorePersonnelServiceImpl.java

@@ -0,0 +1,161 @@
+package shop.alien.store.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.StoreImg;
+import shop.alien.entity.store.StorePersonnel;
+import shop.alien.entity.store.vo.StorePersonnelVo;
+import shop.alien.mapper.StorePersonnelMapper;
+import shop.alien.store.service.StoreImgService;
+import shop.alien.store.service.StorePersonnelService;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 店铺人员服务实现类
+ *
+ * @author system
+ * @since 2025-01-15
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class StorePersonnelServiceImpl extends ServiceImpl<StorePersonnelMapper, StorePersonnel> implements StorePersonnelService {
+
+    private final StorePersonnelMapper storePersonnelMapper;
+
+    private final StoreImgService storeImgService;
+
+    /**
+     * 获取店铺人员列表
+     *
+     * @param storeId 门店id
+     * @return List<StorePersonnelVo>
+     */
+    @Override
+    public List<StorePersonnelVo> getStorePersonnelList(Integer storeId) {
+        List<StorePersonnelVo> personnelList = storePersonnelMapper.getStorePersonnelList(storeId);
+        // 按排序字段排序
+        return personnelList.stream()
+                .sorted(Comparator.comparing(StorePersonnelVo::getSort, Comparator.nullsLast(Integer::compareTo)))
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * 获取人员详情
+     *
+     * @param id 人员id
+     * @return StorePersonnelVo
+     */
+    @Override
+    public StorePersonnelVo getPersonnelInfo(Integer id) {
+        return storePersonnelMapper.getPersonnelInfo(id);
+    }
+
+    /**
+     * 新增或修改店铺人员
+     *
+     * @param storePersonnelVo 人员信息
+     * @return R<String>
+     */
+    @Override
+    public R<String> saveOrUpdatePersonnel(StorePersonnelVo storePersonnelVo) {
+        boolean flag = false;
+        LambdaQueryWrapper<StorePersonnel> queryWrapper = new LambdaQueryWrapper<>();
+        Integer imgId = 0;
+
+        // 处理图片信息
+        if (storePersonnelVo.getImgId() == null || storePersonnelVo.getImgId() == 0) {
+            if (StringUtils.isNotEmpty(storePersonnelVo.getImgUrl())) {
+                StoreImg storeImg = new StoreImg();
+                storeImg.setStoreId(storePersonnelVo.getStoreId());
+                // 图片类型:12-人员头像(根据实际业务调整)
+                storeImg.setImgType(12);
+                storeImg.setImgUrl(storePersonnelVo.getImgUrl());
+                storeImg.setImgDescription(storePersonnelVo.getPersonnelName());
+                storeImgService.saveOrUpdate(storeImg);
+                imgId = storeImg.getId();
+            }
+        } else {
+            imgId = storePersonnelVo.getImgId();
+        }
+
+        // 封装StorePersonnel参数
+        StorePersonnel storePersonnel = new StorePersonnel();
+        BeanUtils.copyProperties(storePersonnelVo, storePersonnel);
+        storePersonnel.setImgId(imgId);
+
+        // 修改人员
+        if (storePersonnel.getId() != null) {
+            flag = this.updateById(storePersonnel);
+            if (!flag) {
+                log.error("人员修改失败");
+                return R.fail("人员修改失败");
+            }
+            return R.success("人员修改成功");
+        } else {
+            // 新增人员
+            // 校验人员参数
+            if (StringUtils.isEmpty(storePersonnel.getPersonnelName())) {
+                return R.fail("请输入人员姓名");
+            }
+
+            // 计算排序值
+            queryWrapper.eq(StorePersonnel::getStoreId, storePersonnel.getStoreId());
+            List<StorePersonnel> personnelList = this.list(queryWrapper);
+            if (CollectionUtil.isNotEmpty(personnelList)) {
+                Integer maxSort = personnelList.stream()
+                        .map(StorePersonnel::getSort)
+                        .filter(sort -> sort != null)
+                        .max(Integer::compareTo)
+                        .orElse(0);
+                storePersonnel.setSort(maxSort + 1);
+            } else {
+                storePersonnel.setSort(1);
+            }
+
+            // 保存人员
+            flag = this.save(storePersonnel);
+            if (!flag) {
+                return R.fail("人员新增失败");
+            }
+        }
+        return R.success("新增人员成功");
+    }
+
+    /**
+     * 删除店铺人员
+     *
+     * @param ids 人员id列表
+     * @return R<String>
+     */
+    @Override
+    public R<String> deletePersonnel(List<Integer> ids) {
+        boolean flag = this.removeByIds(ids);
+        if (!flag) {
+            return R.fail("删除失败");
+        }
+        return R.success("删除成功");
+    }
+
+    /**
+     * 保存人员排序
+     *
+     * @param storePersonnelList 人员列表
+     * @return Boolean
+     */
+    @Override
+    public Boolean savePersonnelSort(List<StorePersonnel> storePersonnelList) {
+        return this.updateBatchById(storePersonnelList);
+    }
+}
+

+ 1 - 1
alien-store/src/main/resources/bootstrap.yml

@@ -1,3 +1,3 @@
 spring:
   profiles:
-    active: dev
+    active: test