Jelajahi Sumber

广誉源商户端-登录-我的技能,城市管理,状态切换,我的资料

jinwenhai 8 jam lalu
induk
melakukan
5cb8031a11

+ 3 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/MaTechnicianController.java

@@ -28,6 +28,7 @@ import com.ylx.common.enums.BusinessType;
 import com.ylx.common.exception.user.CaptchaException;
 import com.ylx.common.exception.user.CaptchaExpireException;
 import com.ylx.common.utils.MessageUtils;
+import com.ylx.common.utils.SecurityUtils;
 import com.ylx.common.utils.StringUtils;
 import com.ylx.common.utils.poi.ExcelUtil;
 import com.ylx.framework.manager.AsyncManager;
@@ -66,6 +67,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
 import java.util.List;
 import java.util.Objects;
 import java.util.Random;
@@ -766,4 +768,5 @@ public class MaTechnicianController extends BaseController {
     public Result<?> getContractRecords(@RequestParam(value = "userId") Long userId) {
         return Result.ok(maTechnicianService.getContractRecords(userId));
     }
+
 }

+ 3 - 1
nightFragrance-framework/src/main/java/com/ylx/framework/config/SecurityConfig.java

@@ -115,7 +115,9 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
                         "/area/select", "/system/dept/list", "/api/xiangmu/v1/wx/recommend", "/product/category/create","/area/code","/area/city","/product/category/list",
                         "/wx/pay/query/order/{outTradeNo}","/api/products/**","/api/user/point/**","/userCenter/userApp/queryBind","/weChat/uuidLogin","/couponReceive/getShareVolutionDetail",
                         "/userCenter/userApp/bind/update","/serviceCategory/h5List","/api/lbt/v1/select","/sq/getTechnicianToken"
-                        ,"/technician/technician/clientLogin").permitAll()
+                        ,"/technician/technician/clientLogin","/technician/technician/wait/list","/technician/technician/getServiceCategoryList"
+                ,"/technician/technician/getTechnician" ,"/technician/technician/getSkillList","/technician/technician/getTechnicianList"
+                       ).permitAll()
                 // 静态资源,可匿名访问
                 .antMatchers(HttpMethod.GET, "/", "/*.txt", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                 .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()

+ 12 - 0
nightFragrance-massage/src/main/java/com/ylx/fareSetting/controller/MaProjectFareSettingController.java

@@ -4,6 +4,8 @@ import com.ylx.common.core.domain.R;
 import com.ylx.fareSetting.domian.dto.FareCalculateDTO;
 import com.ylx.fareSetting.domian.vo.FareCalculateResultVO;
 import com.ylx.fareSetting.service.IMaProjectFareSettingService;
+import com.ylx.massage.domain.dto.DriverFeeDTO;
+import com.ylx.massage.domain.vo.Result;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -15,6 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import javax.validation.Valid;
 
 @RestController
 @RequestMapping("/project/fare/setting")
@@ -32,4 +35,13 @@ public class MaProjectFareSettingController {
         FareCalculateResultVO result = maProjectFareSettingService.calculateFare(dto);
         return R.ok(result);
     }
+    /**
+     * 保存免车费设置
+     */
+    @PostMapping("/save")
+    public R<String> save(@RequestBody @Valid DriverFeeDTO dto) {
+
+        maProjectFareSettingService.saveOrUpdateFee(dto);
+        return R.ok("设置成功");
+    }
 }

+ 10 - 0
nightFragrance-massage/src/main/java/com/ylx/fareSetting/service/IMaProjectFareSettingService.java

@@ -4,7 +4,17 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ylx.fareSetting.domian.MaProjectFareSetting;
 import com.ylx.fareSetting.domian.dto.FareCalculateDTO;
 import com.ylx.fareSetting.domian.vo.FareCalculateResultVO;
+import com.ylx.massage.domain.dto.DriverFeeDTO;
 
 public interface IMaProjectFareSettingService extends IService<MaProjectFareSetting> {
     FareCalculateResultVO calculateFare(FareCalculateDTO dto);
+
+    /**
+     * 保存免车费设置信息
+     *
+     * @param
+     * @param dto
+     * @return
+     */
+    void saveOrUpdateFee(DriverFeeDTO dto);
 }

+ 74 - 0
nightFragrance-massage/src/main/java/com/ylx/fareSetting/service/impl/MaProjectFareSettingServiceImpl.java

@@ -14,17 +14,21 @@ import com.ylx.fareSetting.domian.vo.FareCalculateResultVO;
 import com.ylx.fareSetting.mapper.MaProjectFareSettingMapper;
 import com.ylx.fareSetting.service.IMaProjectFareSettingService;
 import com.ylx.massage.domain.TAddress;
+import com.ylx.massage.domain.TFareFreeRule;
+import com.ylx.massage.domain.dto.DriverFeeDTO;
 import com.ylx.massage.domain.vo.TFareSettingVo;
 import com.ylx.massage.service.TAddressService;
 import com.ylx.massage.service.TFareSettingService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 
@@ -233,4 +237,74 @@ public class MaProjectFareSettingServiceImpl extends ServiceImpl<MaProjectFareSe
             return targetTime.equals(startTime);
         }
     }
+    /**
+     * 保存免车费设置信息
+     *
+     * @param
+     * @param dto
+     * @return
+     */
+    @Override
+    public void saveOrUpdateFee(DriverFeeDTO dto){
+        // 1. 基础校验:检查是否有空值 (对应UI中的“判断必填项是否为空”)
+        validateInput(dto);
+
+        if (dto.getMode() == 1) {
+            // --- 模式一:统一设置 ---
+            // 逻辑:删除该用户所有具体的项目配置,只保留一条 categoryId=null 的记录
+            baseMapper.delete(new LambdaQueryWrapper<MaProjectFareSetting>()
+                                               .eq(MaProjectFareSetting::getMerchantId, dto.getMerchantId()));
+
+            MaProjectFareSetting config = new MaProjectFareSetting();
+            config.setMerchantId(dto.getMerchantId());
+            config.setProjectId(null);
+            config.setDayFreeKm(dto.getUnifiedConfig().getDayFreeKm());
+            config.setNightFreeKm(dto.getUnifiedConfig().getNightFreeKm());
+            baseMapper.insert(config);
+
+        } else if (dto.getMode() == 2) {
+            // --- 模式二:按项目设置 ---
+            // 逻辑:先删除旧数据,再批量插入新数据
+            baseMapper.delete(new LambdaQueryWrapper<MaProjectFareSetting>()
+                                               .eq(MaProjectFareSetting::getMerchantId, dto.getMerchantId()));
+
+            List<MaProjectFareSetting> list = new ArrayList<>();
+            for (DriverFeeDTO.CategoryFeeItem item : dto.getCategoryConfigs()) {
+                MaProjectFareSetting config = new MaProjectFareSetting();
+                config.setMerchantId(dto.getMerchantId());
+                config.setIsUnified(0);
+                config.setProjectId(item.getCategoryId());
+                config.setProjectName(item.getCategoryName());
+                config.setDayFreeKm(item.getDayFreeKm());
+                config.setNightFreeKm(item.getNightFreeKm());
+                list.add(config);
+            }
+            // 批量保存
+            for (MaProjectFareSetting config : list) {
+                baseMapper.insert(config);
+            }
+        }
+
+    }
+    /**
+     * 校验输入是否合法 (对应UI中的 Toast 提示逻辑)
+     */
+    private void validateInput(DriverFeeDTO dto) {
+        if (dto.getMode() == 1) {
+            if (dto.getUnifiedConfig() == null ||
+                        dto.getUnifiedConfig().getDayFreeKm() == null ||
+                        dto.getUnifiedConfig().getNightFreeKm() == null) {
+                throw new RuntimeException("请输入完整的统一设置里程");
+            }
+        } else if (dto.getMode() == 2) {
+            if (CollectionUtils.isEmpty(dto.getCategoryConfigs())) {
+                throw new RuntimeException("请至少配置一个项目的免车费");
+            }
+            for (DriverFeeDTO.CategoryFeeItem item : dto.getCategoryConfigs()) {
+                if (item.getDayFreeKm() == null || item.getNightFreeKm() == null) {
+                    throw new RuntimeException("分类ID[" + item.getCategoryId() + "]的里程设置不完整");
+                }
+            }
+        }
+    }
 }

+ 8 - 3
nightFragrance-massage/src/main/java/com/ylx/massage/domain/MaProject.java

@@ -106,9 +106,9 @@ public class MaProject {
     /**
      * 商户类型:0-上门按摩,1-同城陪玩
      */
-    @Excel(name = "商户类型:0-上门按摩,1-同城陪玩")
-    @ApiModelProperty("商户类型:0-上门按摩,1-同城陪玩")
-    private String merchantType;
+    @Excel(name = "商户类型:1-上门按摩,2-同城陪玩")
+    @ApiModelProperty("商户类型:1-上门按摩,2-同城陪玩")
+    private String serviceTag;
 
     /**
      * 项目详情图
@@ -152,6 +152,11 @@ public class MaProject {
     @Excel(name = "申请时间")
     @ApiModelProperty("申请时间")
     private Date applyTime;
+
+    /** 审批时间 */
+    @Excel(name = "审批时间")
+    @ApiModelProperty("申请时间")
+    private Date  approveTime;
     /**
      * 修改人
      */

+ 50 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/dto/DriverFeeDTO.java

@@ -0,0 +1,50 @@
+package com.ylx.massage.domain.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class DriverFeeDTO {
+    @NotNull(message = "商户ID不能为空")
+    private Long merchantId;
+    /**
+     * 模式:1-统一设置,2-按项目设置
+     */
+    @NotNull(message = "设置模式不能为空")
+    private Integer mode;
+
+    private String openId;
+
+    /**
+     * 统一设置的值 (当 mode=1 时必填)
+     */
+    private FeeItem unifiedConfig;
+
+    /**
+     * 按项目设置的列表 (当 mode=2 时必填)
+     */
+    private List<CategoryFeeItem> categoryConfigs;
+
+    @Data
+    public static class FeeItem {
+        @NotNull(message = "白天免费里程必填")
+        private BigDecimal dayFreeKm;
+        @NotNull(message = "夜间免费里程必填")
+        private BigDecimal nightFreeKm;
+    }
+
+    @Data
+    public static class CategoryFeeItem {
+        @NotNull(message = "分类ID不能为空")
+        private Long categoryId;
+        @NotNull(message = "分类name不能为空")
+        private String categoryName;
+        @NotNull(message = "白天免费里程必填")
+        private BigDecimal dayFreeKm;
+        @NotNull(message = "夜间免费里程必填")
+        private BigDecimal nightFreeKm;
+    }
+}

+ 2 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/enums/JsStatusEnum.java

@@ -9,12 +9,12 @@ public enum JsStatusEnum {
     /**
      * 可服务
      */
-    JS_SERVICEABLE(0, "可服务"),
+    JS_SERVICEABLE(1, "可服务"),
 
     /**
      * 服务中
      */
-    JS_SERVICE(1, "服务中"),
+    JS_SERVICE(0, "服务中"),
 
     /**
      * 不可服务

+ 1 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/IMaTechnicianService.java

@@ -278,4 +278,5 @@ public interface IMaTechnicianService extends IService<MaTechnician> {
      * @return
      */
     List<ContractRecord> getContractRecords(Long userId);
+
 }

+ 10 - 5
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/MaTechnicianServiceImpl.java

@@ -27,9 +27,7 @@ import com.ylx.massage.controller.CityOperationApplicationController;
 import com.ylx.massage.domain.*;
 import com.ylx.massage.domain.dto.*;
 import com.ylx.massage.domain.vo.*;
-import com.ylx.massage.enums.OrderTipEnum;
-import com.ylx.massage.enums.ProjectCategoryEnum;
-import com.ylx.massage.enums.TechnicianStatusEnum;
+import com.ylx.massage.enums.*;
 import com.ylx.massage.mapper.*;
 import com.ylx.massage.domain.ContractRecord;
 import com.ylx.massage.domain.MaProject;
@@ -63,7 +61,6 @@ import com.ylx.massage.service.IMaTechnicianService;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
-import com.ylx.massage.enums.OrderStatusEnum;
 
 import javax.annotation.Resource;
 
@@ -105,6 +102,8 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
 
     @Autowired
     private TbFileService fileService;
+    @Resource
+    private TFareFreeRuleMapper tFareFreeRuleMapper;
 
     @Resource
     private ContractRecordMapper contractRecordMapper;
@@ -868,7 +867,7 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
     public List<Project> getNotApplyList(String userId, String typeId) {
         LambdaQueryWrapper<MaProject> query = new LambdaQueryWrapper<>();
         query.eq(MaProject::getMerchantId, userId);
-        query.eq(MaProject::getMerchantType, typeId);
+        query.eq(MaProject::getServiceTag, typeId);
         List<MaProject> maProjectList = maProjectMapper.selectList(query);
         // 获取已申请技能ID集合
         List<Long> projectIdList = maProjectList.stream().map(MaProject::getProjectId).collect(Collectors.toList());
@@ -947,6 +946,9 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
 
     }
 
+
+
+
     private void extracted(MaProjectSaveDto dto) {
         LambdaQueryWrapper<Project> query = new LambdaQueryWrapper<>();
         query.in(Project::getId, dto.getProjectIdList());
@@ -992,6 +994,9 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
             // 2. 状态判断逻辑 (对应流程图中间的菱形判断)
             // 只有处于“在线接单”状态才需要检查疲劳度/时长限制
             if (TechnicianStatusEnum.ONLINE.getCode().equals(technician.getPostState())) {
+                if (technician.getServiceState().equals(JsStatusEnum.JS_SERVICE.getCode())) {
+                    throw new ServiceException("您有服务中的订单,不能下岗");
+                }
                 // 获取今日的商户考勤记录
                 MerchantDailyAttendance attendance = getTodayAttendance(userId);