Merge remote-tracking branch 'origin/main'

This commit is contained in:
attiya 2025-05-14 11:07:45 +08:00
commit b7c5049584
12 changed files with 316 additions and 8 deletions

View File

@ -2,6 +2,7 @@ package com.ebike.feign.clients;
import com.cdzy.common.model.EbikeTracking;
import com.cdzy.common.model.JsonResult;
import com.ebike.feign.model.res.ReqUserOperateDto;
import com.ebike.feign.model.res.ResFeignEbikeSysRcostsetDto;
import com.ebike.feign.model.rsp.FeignEbikeRegionDto;
import org.springframework.cloud.openfeign.FeignClient;
@ -83,4 +84,22 @@ public interface OperateFeignClient {
*/
@GetMapping("ebikesysrcostset/getRegionFeeConfigById")
JsonResult<ResFeignEbikeSysRcostsetDto> getRegionFeeConfigById(@RequestParam(name = "operationRegionId") Long operationRegionId);
/**
* 设置用户所属运营区
*
* @param reqUserOperateDto
* @return
*/
@PostMapping("ebikeRegion/setUserOperate")
JsonResult<?> setUserOperate(@RequestBody ReqUserOperateDto reqUserOperateDto);
/**
* 删除用户所属运营区
*
* @param staffId
* @return
*/
@PostMapping("ebikeRegion/delUserOperate")
JsonResult<?> delUserOperate(@RequestParam("staffId") Long staffId);
}

View File

@ -0,0 +1,24 @@
package com.ebike.feign.model.res;
import com.alibaba.fastjson2.JSONArray;
import lombok.Data;
import java.util.List;
/**
* @author:Ding
* @ClassName:ReqUserOperateDto
* @Package:com.cdzy.ebikeoperate.model.dto.request.ReqUserOperateDto
* @Description:
* @CreateDate:2025年05月14日
* @Version:
**/
@Data
public class ReqUserOperateDto {
private Long staffId;
private List<Long> zoneId;
private Long orgId;
}

View File

@ -9,10 +9,8 @@ import com.cdzy.ebikeoperate.enums.RegionLevelType;
import com.cdzy.ebikeoperate.mapper.EbikeRegionLevelMapper;
import com.cdzy.ebikeoperate.mapper.EbikeRegionoperationMapper;
import com.cdzy.ebikeoperate.mapper.EbikeSiteTypeMapper;
import com.cdzy.ebikeoperate.model.dto.request.ReqAuthorizeOperationDto;
import com.cdzy.ebikeoperate.model.dto.request.ReqBatchRegionDto;
import com.cdzy.ebikeoperate.model.dto.request.ReqEbikeOperationRegionDto;
import com.cdzy.ebikeoperate.model.dto.request.ReqSiteRegionDto;
import com.cdzy.ebikeoperate.mapper.EbikeStaffRegionMapper;
import com.cdzy.ebikeoperate.model.dto.request.*;
import com.cdzy.ebikeoperate.model.dto.response.*;
import com.cdzy.ebikeoperate.model.pojo.*;
import com.cdzy.ebikeoperate.service.EbikeAdministrationZoneService;
@ -31,12 +29,14 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import static com.cdzy.ebikeoperate.model.pojo.table.EbikeAdministrationZoneTableDef.EBIKE_ADMINISTRATION_ZONE;
import static com.cdzy.ebikeoperate.model.pojo.table.EbikeOperationRegionTableDef.EBIKE_OPERATION_REGION;
import static com.cdzy.ebikeoperate.model.pojo.table.EbikeRegionLevelTableDef.EBIKE_REGION_LEVEL;
import static com.cdzy.ebikeoperate.model.pojo.table.EbikeStaffRegionTableDef.EBIKE_STAFF_REGION;
/**
* 区域控制层
@ -70,6 +70,8 @@ public class EbikeRegionController {
@Resource
private EbikeRegionLevelMapper levelMapper;
@Resource
private EbikeStaffRegionMapper staffRegionMapper;
/**
* 添加运营区
@ -394,4 +396,54 @@ public class EbikeRegionController {
Long imageId = siteRegionService.saveImages(multipartFile);
return JsonResult.success(imageId);
}
/**
* 设置用户所属运营区
*
* @param reqUserOperateDto
* @return
*/
@PostMapping("setUserOperate")
public JsonResult<?> setUserOperate(@RequestBody ReqUserOperateDto reqUserOperateDto) {
try {
QueryWrapper queryWrapper = QueryWrapper.create()
.in(EBIKE_OPERATION_REGION.ZONE_ID.getName(), reqUserOperateDto.getZoneId())
.and(EBIKE_OPERATION_REGION.ORG_ID.eq(reqUserOperateDto.getOrgId()));
List<EbikeOperationRegion> list = operationRegionService.list(queryWrapper);
queryWrapper.clear();
queryWrapper.eq(EBIKE_STAFF_REGION.STAFF_ID.getName(), reqUserOperateDto.getStaffId());
staffRegionMapper.deleteByQuery(queryWrapper);
List<EbikeStaffRegion> staffRegions = new ArrayList<>();
for (EbikeOperationRegion ebikeOperationRegion : list) {
EbikeStaffRegion region = new EbikeStaffRegion();
region.setRegionId(ebikeOperationRegion.getOperationRegionId());
region.setStaffId(reqUserOperateDto.getStaffId());
staffRegions.add(region);
}
staffRegionMapper.insertBatch(staffRegions);
return JsonResult.success("");
} catch (Exception e) {
return JsonResult.failed("");
}
}
/**
* 删除用户所属运营区
*
* @param staffId
* @return
*/
@PostMapping("delUserOperate")
public JsonResult<?> delUserOperate(@RequestParam("staffId") Long staffId) {
try {
QueryWrapper queryWrapper = QueryWrapper.create()
.eq(EBIKE_STAFF_REGION.STAFF_ID.getName(), staffId);
staffRegionMapper.deleteByQuery(queryWrapper);
return JsonResult.success("");
} catch (Exception e) {
return JsonResult.failed("");
}
}
}

View File

@ -0,0 +1,24 @@
package com.cdzy.ebikeoperate.model.dto.request;
import com.alibaba.fastjson2.JSONArray;
import lombok.Data;
import java.util.List;
/**
* @author:Ding
* @ClassName:ReqUserOperateDto
* @Package:com.cdzy.ebikeoperate.model.dto.request.ReqUserOperateDto
* @Description:
* @CreateDate:2025年05月14日
* @Version:
**/
@Data
public class ReqUserOperateDto {
private Long staffId;
private List<Long> zoneId;
private Long orgId;
}

View File

@ -5,6 +5,7 @@ import com.cdzy.common.model.PageParam;
import com.cdzy.orders.model.dto.req.ReqBikeDto;
import com.cdzy.orders.model.dto.req.ReqOrderDto;
import com.cdzy.orders.model.dto.res.RspOrderDetailsInfo;
import com.cdzy.orders.model.dto.res.RspOrderDetailsUserList;
import com.ebike.feign.model.res.ResFeignOrderPaymentDto;
import com.cdzy.orders.model.dto.res.RspBikeDto;
import com.cdzy.orders.model.entity.EbikeUserOrders;
@ -19,6 +20,7 @@ import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import static com.cdzy.orders.model.entity.table.EbikeUserOrdersTableDef.EBIKE_USER_ORDERS;
@ -236,5 +238,15 @@ public class EbikeUserOrdersController {
Page<EbikeUserOrders> page = userOrdersService.page(pageParam.getPage(), queryWrapper);
return JsonResult.success(page);
}
/**
* 根据用户ID获取订单详情列表带分页
*
* @param params 用户Id 和分页信息
* @ 用户订单表详情
*/
@PostMapping("orderDetailsUserList")
public JsonResult<?> orderDetailsUserList(@RequestBody Map<String,Object> params) {
List<RspOrderDetailsUserList> info = userOrdersService.orderDetailsUserList(params);
return JsonResult.success(info);
}
}

View File

@ -1,7 +1,15 @@
package com.cdzy.orders.mapper;
import com.cdzy.orders.model.dto.res.RspOrderDetailsInfo;
import com.cdzy.orders.model.dto.res.RspOrderDetailsUserList;
import com.mybatisflex.core.BaseMapper;
import com.cdzy.orders.model.entity.EbikeUserOrders;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* 用户订单表 映射层
@ -11,4 +19,47 @@ import com.cdzy.orders.model.entity.EbikeUserOrders;
*/
public interface UserOrdersMapper extends BaseMapper<EbikeUserOrders> {
/**
* 根据用户ID获取订单详情列表带分页并根据类型查询消费或退款
*
* @param userId 用户Id
* @param orderType 订单类型消费或退款
* @return 用户订单表详情
*/
@Select("<script>" +
"SELECT A.order_id, A.user_id, A.status, A.start_time, A.end_time, " +
"CASE WHEN A.end_time IS NULL THEN " +
"CONCAT('骑行 ', FLOOR(TIMESTAMPDIFF(SECOND, A.start_time, NOW()) / 60), '分钟', " +
"TIMESTAMPDIFF(SECOND, A.start_time, NOW()) % 60, '秒') " +
"ELSE CONCAT('骑行 ', FLOOR(TIMESTAMPDIFF(SECOND, A.start_time, A.end_time) / 60), '分钟', " +
"TIMESTAMPDIFF(SECOND, A.start_time, A.end_time) % 60, '秒') END AS riding_duration, " +
"CASE A.status WHEN 0 THEN '进行中' WHEN 1 THEN '已取消' WHEN 2 THEN '待支付' " +
"WHEN 3 THEN '已支付' WHEN 4 THEN '退款中' WHEN 5 THEN '已退款' ELSE '无' END AS status_name, " +
"created_at, total_amount, bike_code " +
"FROM ebike_user_orders AS A " +
"WHERE A.user_id = #{userId} " +
"<if test='orderType == \"consumption\"'> " +
"AND A.status IN (0, 1, 2, 3) " +
"</if>" +
"<if test='orderType == \"refund\"'> " +
"AND A.status IN (4, 5) " +
"</if>" +
"LIMIT #{pageSize} OFFSET #{offset}" +
"</script>")
@Results({
@Result(property = "orderId", column = "order_id"),
@Result(property = "userId", column = "user_id"),
@Result(property = "status", column = "status"),
@Result(property = "startTime", column = "start_time"),
@Result(property = "endTime", column = "end_time"),
@Result(property = "ridingDuration", column = "riding_duration"),
@Result(property = "statusName", column = "status_name"),
@Result(property = "createdAt", column = "created_at"),
@Result(property = "totalAmount", column = "total_amount"),
@Result(property = "bikeCode", column = "bike_code")
})
List<RspOrderDetailsUserList> getOrderDetailsUserList(@Param("userId") String userId,
@Param("orderType") String orderType,
@Param("offset") Integer offset,
@Param("pageSize") Integer pageSize);
}

View File

@ -0,0 +1,66 @@
package com.cdzy.orders.model.dto.res;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 用户订单详情响应DTO
*/
@Data
public class RspOrderDetailsUserList {
/**
* 分布式ID雪花算法或业务前缀+序列
*/
private Long orderId;
/**
* 用户ID关联用户表
*/
private Long userId;
/**
* 订单状态进行中已取消待支付已支付退款中已退款
*/
private String status;
/**
* 订单状态进行中已取消待支付已支付退款中已退款
*/
private String statusName;
/**
* 订单开始时间
*/
private Date startTime;
/**
* 订单结束时间
*/
private Date endTime;
/**
* 订单骑行时长分钟
*/
private String ridingDuration;
/**
* 订单创建时间
*/
private Date createdAt;
/**
* 订单总金额
*/
private BigDecimal totalAmount;
/**
* 订单关联的车辆编码
*/
private String bikeCode;
/**
* 其他需要返回的字段可以根据需要添加
*/
// 可根据需要添加其他字段如订单类型支付方式等
}

View File

@ -3,6 +3,7 @@ package com.cdzy.orders.service;
import com.cdzy.orders.model.dto.req.ReqBikeDto;
import com.cdzy.orders.model.dto.req.ReqOrderDto;
import com.cdzy.orders.model.dto.res.RspOrderDetailsInfo;
import com.cdzy.orders.model.dto.res.RspOrderDetailsUserList;
import com.ebike.feign.model.res.ResFeignOrderPaymentDto;
import com.cdzy.orders.model.dto.res.RspBikeDto;
import com.ebike.feign.model.rsp.EbikePaymentDto;
@ -11,6 +12,7 @@ import com.cdzy.orders.model.entity.EbikeUserOrders;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
* 用户订单表 服务层
@ -116,4 +118,12 @@ public interface UserOrdersService extends IService<EbikeUserOrders> {
* @return 支付信息
*/
EbikePaymentDto paymentDetailsInfo(Long orderId);
/**
* 根据用户ID获取订单详情列表带分页
*
* @param params 用户Id
* @ 用户订单表详情
*/
List<RspOrderDetailsUserList> orderDetailsUserList(Map<String,Object> params);
}

View File

@ -1,5 +1,6 @@
package com.cdzy.orders.service.impl;
import cn.hutool.core.map.MapUtil;
import com.alibaba.fastjson2.JSONObject;
import com.cdzy.common.enums.Code;
import com.cdzy.common.model.JsonResult;
@ -14,6 +15,7 @@ import com.cdzy.orders.model.dto.req.ReqOrderDto;
import com.cdzy.orders.model.dto.res.RedisPoint;
import com.cdzy.orders.model.dto.res.RspBikeDto;
import com.cdzy.orders.model.dto.res.RspOrderDetailsInfo;
import com.cdzy.orders.model.dto.res.RspOrderDetailsUserList;
import com.cdzy.orders.model.entity.EbikeOrderDetails;
import com.cdzy.orders.model.entity.EbikeUser;
import com.cdzy.orders.model.entity.EbikeUserOrders;
@ -40,6 +42,7 @@ import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import static com.cdzy.orders.enums.TimeDivisionCharging.TIME_SLOT;
@ -657,4 +660,22 @@ public class UserOrdersServiceImpl extends ServiceImpl<UserOrdersMapper, EbikeUs
}
return decimal;
}
/**
* 根据用户ID获取订单详情列表带分页
*
* @param params 用户Id
* @ 用户订单表详情
*/
@Override
public List<RspOrderDetailsUserList> orderDetailsUserList(Map<String,Object> params) {
String userId = MapUtil.getStr(params,"userId");
Map<String,Object> pageParam = ( Map<String,Object>)params.get("pageParam");
Integer pageNum= MapUtil.getInt(pageParam,"pageNum");
Integer pageSize= MapUtil.getInt(pageParam,"pageSize");
String orderType = ""; //consumption 消费 refund 退款
orderType= MapUtil.getStr(pageParam,"orderType");
Integer offset = (pageNum - 1) * pageSize; // 计算OFFSET
List<RspOrderDetailsUserList> orderDetailsUserList = userOrdersMapper.getOrderDetailsUserList(userId,orderType,offset,pageSize);
return orderDetailsUserList;
}
}

View File

@ -24,6 +24,12 @@
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.cdzy</groupId>
<artifactId>ebike-feign</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-spring-boot3-starter</artifactId>
@ -129,6 +135,11 @@
<artifactId>fastjson2</artifactId>
<version>2.0.50</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
<profiles>
<!--开发环境-->

View File

@ -6,7 +6,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients
@EnableFeignClients(basePackages = "com.ebike.feign")
@EnableDiscoveryClient
@SpringBootApplication
@MapperScan("com.cdzy.user.mapper")

View File

@ -17,7 +17,8 @@ import com.cdzy.user.model.vo.StaffIds;
import com.cdzy.user.service.StaffRolesService;
import com.cdzy.user.service.StaffService;
import com.cdzy.user.service.StaffZoneService;
import com.cdzy.user.utils.AESUtils;
import com.ebike.feign.clients.OperateFeignClient;
import com.ebike.feign.model.res.ReqUserOperateDto;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryColumn;
import com.mybatisflex.core.query.QueryMethods;
@ -30,7 +31,7 @@ import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@ -55,6 +56,8 @@ public class StaffController {
private StaffZoneService staffZoneService;
@Autowired
private StaffRolesService staffRolesService;
@Autowired
private OperateFeignClient operateFeignClient;
/**
* 添加
@ -231,17 +234,24 @@ public class StaffController {
staffRolesService.saveBatch(roleList);
}
JSONArray zoneId = staffDto.getZoneId();
List<Long> zoneIds = new ArrayList<>();
List<StaffZone> zoneList = IntStream.range(0, zoneId.size()).mapToObj(i -> {
StaffZone staffRoles = new StaffZone();
JSONObject jsonObject = zoneId.getJSONObject(i);
staffRoles.setZoneId(jsonObject.getLong("zoneId"));
staffRoles.setZoneName(jsonObject.getString("zoneName"));
staffRoles.setStaffId(staff.getStaffId());
zoneIds.add(jsonObject.getLong("zoneId"));
return staffRoles;
}).collect(Collectors.toList());
if (!zoneList.isEmpty()) {
staffZoneService.saveBatch(zoneList);
}
ReqUserOperateDto reqUserOperateDto = new ReqUserOperateDto();
reqUserOperateDto.setStaffId(staff.getStaffId());
reqUserOperateDto.setZoneId(zoneIds);
reqUserOperateDto.setOrgId(staff.getOrgId());
operateFeignClient.setUserOperate(reqUserOperateDto);
return JsonResult.success("保存成功!");
} catch (Exception e) {
e.printStackTrace();
@ -279,17 +289,24 @@ public class StaffController {
staffRolesService.saveBatch(roleList);
}
JSONArray zoneId = staffDto.getZoneId();
List<Long> zoneIds = new ArrayList<>();
List<StaffZone> zoneList = IntStream.range(0, zoneId.size()).mapToObj(i -> {
StaffZone staffRoles = new StaffZone();
JSONObject jsonObject = zoneId.getJSONObject(i);
staffRoles.setZoneId(jsonObject.getLong("zoneId"));
staffRoles.setZoneName(jsonObject.getString("zoneName"));
staffRoles.setStaffId(staff.getStaffId());
zoneIds.add(jsonObject.getLong("zoneId"));
return staffRoles;
}).collect(Collectors.toList());
if (!zoneList.isEmpty()) {
staffZoneService.saveBatch(zoneList);
}
ReqUserOperateDto reqUserOperateDto = new ReqUserOperateDto();
reqUserOperateDto.setStaffId(staff.getStaffId());
reqUserOperateDto.setZoneId(zoneIds);
reqUserOperateDto.setOrgId(staff.getOrgId());
operateFeignClient.setUserOperate(reqUserOperateDto);
return JsonResult.success("保存成功!");
} catch (Exception e) {
e.printStackTrace();
@ -315,6 +332,7 @@ public class StaffController {
queryWrapper.eq(STAFF_ZONE.STAFF_ID.getName(), staffId);
staffZoneService.remove(queryWrapper);
staffService.removeById(staffId);
operateFeignClient.delUserOperate(staffId);
return JsonResult.success("删除成功!");
} catch (Exception e) {
e.printStackTrace();