分账表格优化

This commit is contained in:
Jerry Yan 2025-02-24 10:31:33 +08:00
parent 84bb5727e9
commit c321b41ad7
8 changed files with 160 additions and 13 deletions

View File

@ -3,7 +3,7 @@ package com.ycwl.basic.profitsharing.controller;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ycwl.basic.profitsharing.dto.ProfitSharingRecordReqQuery;
import com.ycwl.basic.profitsharing.dto.ProfitSharingRecordRespVO;
import com.ycwl.basic.profitsharing.dto.ProfitSharingRecordTableRespVo;
import com.ycwl.basic.profitsharing.service.ProfitSharingRecordService;
import com.ycwl.basic.utils.ApiResponse;
import io.swagger.annotations.Api;
@ -11,8 +11,6 @@ import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/profitSharingRecord/v1")
@Api(tags = "利润分成记录相关接口")
@ -23,11 +21,9 @@ public class ProfitSharingRecordController {
@ApiOperation("根据景区ID查询利润分成记录支持分页按创建时间倒序")
@PostMapping("/page")
public ApiResponse<PageInfo<ProfitSharingRecordRespVO>> queryPage(@RequestBody ProfitSharingRecordReqQuery req) {
PageHelper.startPage(req.getPageNum(), req.getPageSize(), "create_time desc");
List<ProfitSharingRecordRespVO> records = profitSharingRecordService.list(req);
PageInfo<ProfitSharingRecordRespVO> pageInfo = new PageInfo<>(records);
return ApiResponse.success(pageInfo);
public ApiResponse<ProfitSharingRecordTableRespVo> queryPage(@RequestBody ProfitSharingRecordReqQuery req) {
ProfitSharingRecordTableRespVo records = profitSharingRecordService.list(req);
return ApiResponse.success(records);
}
}

View File

@ -0,0 +1,11 @@
package com.ycwl.basic.profitsharing.dto;
import lombok.Data;
import java.util.Date;
@Data
public class ProfitSharingRecordGroupVO {
private Long orderId;
private Date createTime;
}

View File

@ -0,0 +1,14 @@
package com.ycwl.basic.profitsharing.dto;
import com.github.pagehelper.PageInfo;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
public class ProfitSharingRecordTableRespVo {
private List<String> columns;
private List<ProfitSharingTableRecordVO> list;
private PageInfo page;
}

View File

@ -0,0 +1,27 @@
package com.ycwl.basic.profitsharing.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
@Data
public class ProfitSharingTableRecordVO {
@ApiModelProperty(value = "景区ID")
private Long scenicId;
private String scenicName;
@ApiModelProperty(value = "订单ID")
private Long orderId;
@ApiModelProperty(value = "订单金额")
private BigDecimal orderAmount;
@ApiModelProperty(value = "创建时间")
private Date createTime;
private Map<String, ProfitSharingRecordRespVO> records;
}

View File

@ -1,5 +1,6 @@
package com.ycwl.basic.profitsharing.mapper;
import com.ycwl.basic.profitsharing.dto.ProfitSharingRecordGroupVO;
import com.ycwl.basic.profitsharing.dto.ProfitSharingRecordReqQuery;
import com.ycwl.basic.profitsharing.dto.ProfitSharingRecordRespVO;
import com.ycwl.basic.profitsharing.entity.ProfitSharingRecord;
@ -13,6 +14,10 @@ import java.util.List;
public interface ProfitSharingRecordMapper {
List<ProfitSharingRecordRespVO> list(ProfitSharingRecordReqQuery req);
List<ProfitSharingRecordGroupVO> listGroupByOrderId(ProfitSharingRecordReqQuery req);
List<ProfitSharingRecordRespVO> listByOrderIds(List<Long> orderIds);
void batchInsert(List<ProfitSharingRecord> records);
void deleteByScenicIdAndOrderId(Long scenicId, Long orderId, String reason);

View File

@ -1,9 +1,8 @@
package com.ycwl.basic.profitsharing.service;
import com.ycwl.basic.profitsharing.dto.ProfitSharingRecordReqQuery;
import com.ycwl.basic.profitsharing.dto.ProfitSharingRecordRespVO;
import java.util.List;
import com.ycwl.basic.profitsharing.dto.ProfitSharingRecordTableRespVo;
public interface ProfitSharingRecordService {
List<ProfitSharingRecordRespVO> list(ProfitSharingRecordReqQuery req);
ProfitSharingRecordTableRespVo list(ProfitSharingRecordReqQuery req);
}

View File

@ -1,23 +1,83 @@
package com.ycwl.basic.profitsharing.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ycwl.basic.profitsharing.dto.ProfitSharingRecordGroupVO;
import com.ycwl.basic.profitsharing.dto.ProfitSharingRecordReqQuery;
import com.ycwl.basic.profitsharing.dto.ProfitSharingRecordRespVO;
import com.ycwl.basic.profitsharing.dto.ProfitSharingRecordTableRespVo;
import com.ycwl.basic.profitsharing.dto.ProfitSharingTableRecordVO;
import com.ycwl.basic.profitsharing.entity.ProfitSharingConfig;
import com.ycwl.basic.profitsharing.entity.ProfitSharingUser;
import com.ycwl.basic.profitsharing.mapper.ProfitSharingRecordMapper;
import com.ycwl.basic.profitsharing.repository.ProfitSharingRepository;
import com.ycwl.basic.profitsharing.service.ProfitSharingRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
public class ProfitSharingRecordServiceImpl implements ProfitSharingRecordService {
@Autowired
private ProfitSharingRecordMapper profitSharingRecordMapper;
@Autowired
private ProfitSharingRepository profitSharingRepository;
@Override
public List<ProfitSharingRecordRespVO> list(ProfitSharingRecordReqQuery req) {
return profitSharingRecordMapper.list(req);
public ProfitSharingRecordTableRespVo list(ProfitSharingRecordReqQuery req) {
ProfitSharingRecordTableRespVo respVo = new ProfitSharingRecordTableRespVo();
PageHelper.startPage(req.getPageNum(), req.getPageSize(), "create_time desc");
List<ProfitSharingRecordGroupVO> list = profitSharingRecordMapper.listGroupByOrderId(req);
PageInfo pageInfo = new PageInfo<>(list);
respVo.setPage(pageInfo);
if (list.isEmpty()) {
return respVo;
}
List<ProfitSharingRecordRespVO> recordList = profitSharingRecordMapper.listByOrderIds(list.stream().map(ProfitSharingRecordGroupVO::getOrderId).collect(Collectors.toList()));
List<Long> scenicList = recordList.stream().map(ProfitSharingRecordRespVO::getScenicId).distinct().collect(Collectors.toList());
List<ProfitSharingConfig> scenicConfig = scenicList.stream()
.map(scenicId -> profitSharingRepository.getScenicConfig(scenicId))
.filter(item -> !Objects.isNull(item) && !Objects.isNull(item.getUsers()))
.filter(item -> !item.getUsers().isEmpty())
.collect(Collectors.toList());
List<String> columnName = scenicConfig.stream()
.flatMap(item -> item.getUsers().stream())
.map(ProfitSharingUser::getName)
.distinct().collect(Collectors.toList());
respVo.setColumns(columnName);
List<ProfitSharingTableRecordVO> data = list.stream()
.collect(Collectors.groupingBy(ProfitSharingRecordGroupVO::getOrderId))
.keySet()
.stream()
.map(profitSharingRecordGroupVOS -> {
return recordList.stream().filter(item -> item.getOrderId().equals(profitSharingRecordGroupVOS)).collect(Collectors.toList());
})
.map(value -> {
Map<String, ProfitSharingRecordRespVO> map = new HashMap<>();
value.forEach(item -> {
map.put(item.getUserName(), item);
});
ProfitSharingTableRecordVO vo = new ProfitSharingTableRecordVO();
ProfitSharingRecordRespVO recordRespVO = value.get(0);
vo.setOrderId(recordRespVO.getOrderId());
vo.setScenicId(recordRespVO.getScenicId());
vo.setScenicName(recordRespVO.getScenicName());
vo.setCreateTime(recordRespVO.getCreateTime());
vo.setOrderAmount(recordRespVO.getOrderAmount());
vo.setRecords(map);
return vo;
})
.sorted((o1, o2) -> o2.getCreateTime().compareTo(o1.getCreateTime()))
.collect(Collectors.toList());
respVo.setList(data);
return respVo;
}
}

View File

@ -39,4 +39,39 @@
</where>
ORDER BY r.create_time desc
</select>
<select id="listGroupByOrderId" resultType="com.ycwl.basic.profitsharing.dto.ProfitSharingRecordGroupVO">
SELECT order_id, min(create_time) as create_time
FROM profit_sharing_record r
<where>
<if test="withDeleted != true">
delete_time is null
</if>
<if test="scenicId != null">
AND r.scenic_id = #{scenicId}
</if>
<if test="status != null">
AND r.status = #{status}
</if>
<if test="rateMode != null">
AND r.rate_mode = #{rateMode}
</if>
<if test="startTime != null">
AND r.create_time >= #{startTime}
</if>
<if test="endTime != null">
AND r.create_time &lt;= #{endTime}
</if>
</where>
GROUP BY order_id
</select>
<select id="listByOrderIds" resultType="com.ycwl.basic.profitsharing.dto.ProfitSharingRecordRespVO">
SELECT r.*, s.name as scenic_name
FROM profit_sharing_record r
LEFT JOIN scenic s ON s.id = r.scenic_id
WHERE r.order_id IN
<foreach collection="orderIds" item="orderId" open="(" close=")" separator=",">
#{orderId}
</foreach>
ORDER BY r.create_time desc
</select>
</mapper>