|
|
@@ -1038,25 +1038,68 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 商户入住信息
|
|
|
+ * 根据微信openid查询商户信息和入驻资料。
|
|
|
*
|
|
|
- * @param userId
|
|
|
- * @return
|
|
|
+ * @param openid 微信openid
|
|
|
+ * @return MerchantAuditFile
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public MerchantAuditFile getTechnicianInfo(String openid) {
|
|
|
+ if (StringUtils.isBlank(openid)) {
|
|
|
+ throw new IllegalArgumentException("openid不能为空");
|
|
|
+ }
|
|
|
+ return buildMerchantAuditFile(findMerchantByOpenid(openid));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 商户入驻信息
|
|
|
+ *
|
|
|
+ * @param userId 商户ID
|
|
|
+ * @return MerchantAuditFile
|
|
|
*/
|
|
|
@Override
|
|
|
- public MerchantAuditFile getTechnicianList(Long userId) {
|
|
|
+ public MerchantAuditFile getTechnicianList(Integer userId) {
|
|
|
+ if (userId == null) {
|
|
|
+ throw new IllegalArgumentException("商户ID不能为空");
|
|
|
+ }
|
|
|
+ return buildMerchantAuditFile(findMerchantById(userId));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据微信openid查询商户信息
|
|
|
+ *
|
|
|
+ * @param openid
|
|
|
+ * @return MaTechnician
|
|
|
+ */
|
|
|
+ private MaTechnician findMerchantByOpenid(String openid) {
|
|
|
+ LambdaQueryWrapper<MaTechnician> query = new LambdaQueryWrapper<>();
|
|
|
+ query.eq(MaTechnician::getCOpenid, openid);
|
|
|
+ return maTechnicianMapper.selectOne(query);
|
|
|
+ }
|
|
|
+
|
|
|
+ private MaTechnician findMerchantById(Integer userId) {
|
|
|
LambdaQueryWrapper<MaTechnician> query = new LambdaQueryWrapper<>();
|
|
|
query.eq(MaTechnician::getId, userId);
|
|
|
- MaTechnician merchant = maTechnicianMapper.selectOne(query);
|
|
|
- LambdaQueryWrapper<MerchantApplyFile> query1 = new LambdaQueryWrapper<>();
|
|
|
- query1.eq(MerchantApplyFile::getMerchantId, userId);
|
|
|
- List<MerchantApplyFile> merchantApplyFile = merchantApplyFileMapper.selectList(query1);
|
|
|
+ return maTechnicianMapper.selectOne(query);
|
|
|
+ }
|
|
|
+
|
|
|
+ private MerchantAuditFile buildMerchantAuditFile(MaTechnician merchant) {
|
|
|
MerchantAuditFile merchantAuditFile = new MerchantAuditFile();
|
|
|
merchantAuditFile.setMerchant(merchant);
|
|
|
- merchantAuditFile.setMerchantAuditFile(merchantApplyFile);
|
|
|
+ if (merchant != null && merchant.getId() != null) {
|
|
|
+ merchantAuditFile.setMerchantAuditFile(listMerchantApplyFiles(merchant.getId()));
|
|
|
+ } else {
|
|
|
+ merchantAuditFile.setMerchantAuditFile(Collections.emptyList());
|
|
|
+ }
|
|
|
return merchantAuditFile;
|
|
|
}
|
|
|
|
|
|
+ private List<MerchantApplyFile> listMerchantApplyFiles(Integer userId) {
|
|
|
+ LambdaQueryWrapper<MerchantApplyFile> query1 = new LambdaQueryWrapper<>();
|
|
|
+ query1.eq(MerchantApplyFile::getMerchantId, userId);
|
|
|
+ return merchantApplyFileMapper.selectList(query1);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 查询商户合同记录信息
|
|
|
*
|
|
|
@@ -1178,7 +1221,7 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
|
|
|
*
|
|
|
* @param userId
|
|
|
* @param forceConfirm
|
|
|
- * @return
|
|
|
+ * @return Result
|
|
|
*/
|
|
|
@Override
|
|
|
public Result switchToOffline(Long userId, Boolean forceConfirm) {
|
|
|
@@ -1192,6 +1235,7 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
|
|
|
// 这里通常会触发前端弹窗要求添加地址,或者直接阻断
|
|
|
throw new RuntimeException("请完善家庭地址");
|
|
|
}
|
|
|
+ // 服务标签:按摩推拿
|
|
|
if (ProjectCategoryEnum.MASSAGE.getCode().equals(technician.getServiceTag())) {
|
|
|
// 2. 状态判断逻辑 (对应流程图中间的菱形判断)
|
|
|
// 只有处于“在线接单”状态才需要检查疲劳度/时长限制
|
|
|
@@ -1204,9 +1248,7 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
|
|
|
|
|
|
long minutesOnline = 0;
|
|
|
if (attendance != null && attendance.getAttendanceStartTime() != null) {
|
|
|
- LocalDateTime localDateTime = attendance.getAttendanceStartTime().toInstant()
|
|
|
- .atZone(ZoneId.systemDefault())
|
|
|
- .toLocalDateTime();
|
|
|
+ LocalDateTime localDateTime = attendance.getAttendanceStartTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
|
|
|
//计算截止现在的时长,单位为分钟
|
|
|
minutesOnline = Duration.between(localDateTime, LocalDateTime.now()).toMinutes();
|
|
|
// 计算今日的累加在线时长
|
|
|
@@ -1220,14 +1262,16 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
|
|
|
long requiredMinutes = minutes.longValueExact();
|
|
|
// 判断是否超过了平台规定的在线时间 (X小时)
|
|
|
if (minutesOnline < requiredMinutes) {
|
|
|
- // 情况 A: 超时了,且用户还没有点击“确认下线”(forceConfirm=false)
|
|
|
+ // 情况: 未满足在线时间,且用户还没有点击“确认下线”(forceConfirm=false)
|
|
|
if (!forceConfirm) {
|
|
|
// 返回特定错误码或数据结构,告诉前端弹出“我在想想/确认下线”的模态框
|
|
|
return Result.ok("平台对您的在线时间做了约定,每日在线需满足"
|
|
|
- + (requiredMinutes / 60) + "小时,距离您下线时间还剩余" + ((requiredMinutes / 60) - minutesOnline) + "小时"
|
|
|
+ + (requiredMinutes / 60) + "小时,距离您下线时间还剩余" + ((requiredMinutes / 60) - minutesOnline/60) + "小时"
|
|
|
+ "不满足在线时间将收到平台处罚,是否确认下线?");
|
|
|
}
|
|
|
- // 情况 B: 超时了,但用户已经点击了“确认下线”,允许通过
|
|
|
+ }else{
|
|
|
+ // 情况: 已满足在线时间,且用户点击点击了“确认下线”,允许通过
|
|
|
+ return Result.ok("状态已切换成功");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -1256,8 +1300,6 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
|
|
|
.set(MerchantDailyAttendance::getUpdateTime, DateUtils.getNowDate());
|
|
|
merchantDailyAttendanceMapper.update(update, updateWrapper);
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
} else {
|
|
|
//更新状态为在线接单
|
|
|
@@ -1279,7 +1321,7 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
|
|
|
* 获取今天商户的考勤记录
|
|
|
*
|
|
|
* @param userId 技师ID
|
|
|
- * @return 考勤记录
|
|
|
+ * @return MerchantDailyAttendance 考勤记录
|
|
|
*/
|
|
|
private MerchantDailyAttendance getTodayAttendance(Long userId) {
|
|
|
LambdaQueryWrapper<MerchantDailyAttendance> wrapper = new LambdaQueryWrapper<>();
|
|
|
@@ -1287,7 +1329,6 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
|
|
|
.eq(MerchantDailyAttendance::getAttendanceDate, DateUtils.getNowDate())
|
|
|
.orderByDesc(MerchantDailyAttendance::getCreateTime)
|
|
|
.last("LIMIT 1");
|
|
|
-
|
|
|
return merchantDailyAttendanceMapper.selectOne(wrapper);
|
|
|
}
|
|
|
|
|
|
@@ -1325,14 +1366,13 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 判断用户是否有生效中的技能
|
|
|
+ * 判断商户是否有开通的技能
|
|
|
*
|
|
|
- * @param userId 技师ID
|
|
|
- * @return true: 有可用技能, false: 无
|
|
|
+ * @param userId 商户ID
|
|
|
+ * @return boolean true: 有可用技能, false: 无
|
|
|
*/
|
|
|
public boolean hasActiveSkills(Long userId) {
|
|
|
if (userId == null) return false;
|
|
|
-
|
|
|
// 构建查询条件:用户ID匹配 AND 状态为已发布/生效中
|
|
|
LambdaQueryWrapper<MaProject> wrapper = new LambdaQueryWrapper<>();
|
|
|
wrapper.eq(MaProject::getMerchantId, userId)
|
|
|
@@ -1345,11 +1385,10 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
|
|
|
* 判断用户是否有家庭地址(通常指设置为默认的地址)
|
|
|
*
|
|
|
* @param userId 技师ID
|
|
|
- * @return true: 有地址, false: 无
|
|
|
+ * @return boolean true: 有地址, false: 无
|
|
|
*/
|
|
|
public boolean hasHomeAddress(Long userId) {
|
|
|
if (userId == null) return false;
|
|
|
-
|
|
|
// 构建查询条件:用户ID匹配 AND 是默认地址(可选) AND 未删除
|
|
|
LambdaQueryWrapper<TAddress> wrapper = new LambdaQueryWrapper<>();
|
|
|
wrapper.eq(TAddress::getMerchantId, userId)
|
|
|
@@ -1361,22 +1400,28 @@ public class MaTechnicianServiceImpl extends ServiceImpl<MaTechnicianMapper, MaT
|
|
|
return count > 0;
|
|
|
}
|
|
|
|
|
|
- // 辅助方法:模拟获取用户
|
|
|
+ /**
|
|
|
+ * 获取商户信息
|
|
|
+ * @param userId 商户ID
|
|
|
+ * @return MaTechnician 商户信息
|
|
|
+ */
|
|
|
private MaTechnician getTechnician(Long userId) {
|
|
|
- // ... DB查询逻辑
|
|
|
LambdaQueryWrapper<MaTechnician> query = new LambdaQueryWrapper<>();
|
|
|
query.eq(MaTechnician::getId, userId);
|
|
|
return maTechnicianMapper.selectOne(query);
|
|
|
}
|
|
|
|
|
|
- // 辅助方法:更新状态
|
|
|
+ /**
|
|
|
+ * 更新商户接单状态
|
|
|
+ *
|
|
|
+ * @param userId 商户ID
|
|
|
+ * @param status 商户接单状态枚举
|
|
|
+ */
|
|
|
private void updateStatus(Long userId, TechnicianStatusEnum status) {
|
|
|
LambdaUpdateWrapper<MaTechnician> update = new LambdaUpdateWrapper<>();
|
|
|
update.eq(MaTechnician::getId, userId);
|
|
|
update.set(MaTechnician::getPostState, status.getCode());
|
|
|
- // ... DB Update逻辑,同时记录上线/下线时间
|
|
|
maTechnicianMapper.update(null, update);
|
|
|
-
|
|
|
}
|
|
|
|
|
|
/**
|