haungxing
1 year ago
21 changed files with 546 additions and 77 deletions
@ -0,0 +1,45 @@
|
||||
package com.hnac.hzims.ticket.twoTicket.controller; |
||||
|
||||
import com.hnac.hzims.ticket.twoTicket.service.TicketCountService; |
||||
import lombok.RequiredArgsConstructor; |
||||
import org.springblade.core.tool.api.R; |
||||
import org.springframework.web.bind.annotation.PathVariable; |
||||
import org.springframework.web.bind.annotation.PostMapping; |
||||
import org.springframework.web.bind.annotation.RequestMapping; |
||||
import org.springframework.web.bind.annotation.RestController; |
||||
|
||||
import java.time.YearMonth; |
||||
|
||||
/** |
||||
* 两票统计分析模块 |
||||
* |
||||
* @Author WL |
||||
* @Version v1.0 |
||||
* @Serial 1.0 |
||||
* @Date 2023/7/3 13:41 |
||||
*/ |
||||
@RestController |
||||
@RequiredArgsConstructor |
||||
@RequestMapping("/ticket-count") |
||||
public class TicketCountController { |
||||
|
||||
private final TicketCountService ticketCountService; |
||||
|
||||
|
||||
/** |
||||
* 两票生成月报统计 |
||||
* @param dateTime 月份 |
||||
* @return |
||||
*/ |
||||
@PostMapping("/loadMonthReport/{dateTime}") |
||||
public R loadMonthReport(@PathVariable String dateTime) { |
||||
ticketCountService.loadMonthReport(dateTime); |
||||
return R.success("生成两票月报成功"); |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
} |
@ -0,0 +1,112 @@
|
||||
package com.hnac.hzims.ticket.twoTicket.entity; |
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField; |
||||
import com.baomidou.mybatisplus.annotation.TableLogic; |
||||
import com.baomidou.mybatisplus.annotation.TableName; |
||||
import lombok.Data; |
||||
import lombok.EqualsAndHashCode; |
||||
import lombok.experimental.Accessors; |
||||
|
||||
import java.io.Serializable; |
||||
import java.time.LocalDateTime; |
||||
import java.time.YearMonth; |
||||
|
||||
/** |
||||
* @Author WL |
||||
* @Version v1.0 |
||||
* @Serial 1.0 |
||||
* @Date 2023/7/3 11:45 |
||||
*/ |
||||
@Data |
||||
@Accessors(chain = true) |
||||
@EqualsAndHashCode |
||||
@TableName("hzims_ticket_count") |
||||
public class TicketCount implements Serializable { |
||||
|
||||
|
||||
/** |
||||
* 编号 |
||||
*/ |
||||
private Long id; |
||||
|
||||
|
||||
/** |
||||
* 站点id |
||||
*/ |
||||
private Long deptId; |
||||
|
||||
|
||||
/** |
||||
* 日期 |
||||
*/ |
||||
private String dateTime; |
||||
|
||||
|
||||
/** |
||||
* 站点名称 |
||||
*/ |
||||
private String deptName; |
||||
|
||||
|
||||
/** |
||||
* 票据类型 |
||||
*/ |
||||
private String ticketType; |
||||
|
||||
|
||||
/** |
||||
* 开票数量 |
||||
*/ |
||||
private Integer ticketNumber; |
||||
|
||||
|
||||
/** |
||||
* 完成数量 |
||||
*/ |
||||
private Integer ticketCompleteNum; |
||||
|
||||
|
||||
/** |
||||
* 延期数量 |
||||
*/ |
||||
private Integer ticketDelayNum; |
||||
|
||||
|
||||
/** |
||||
* 合格数量 |
||||
*/ |
||||
private Integer ticketProportionNum; |
||||
|
||||
|
||||
/** |
||||
* 创建时间 |
||||
*/ |
||||
private LocalDateTime createTime; |
||||
|
||||
/** |
||||
* 更新时间 |
||||
*/ |
||||
private LocalDateTime updateTime; |
||||
|
||||
|
||||
/** |
||||
* 逻辑删除 |
||||
*/ |
||||
@TableField(value = "is_deleted") |
||||
@TableLogic(value = "0", delval = "1") |
||||
private Boolean deleted; |
||||
|
||||
|
||||
/** |
||||
* 创建部门 |
||||
*/ |
||||
private String createDept; |
||||
|
||||
|
||||
/** |
||||
* 租户Id |
||||
*/ |
||||
private String tenantId; |
||||
|
||||
|
||||
} |
@ -0,0 +1,14 @@
|
||||
package com.hnac.hzims.ticket.twoTicket.mapper; |
||||
|
||||
import com.hnac.hzims.ticket.twoTicket.entity.TicketCount; |
||||
import com.hnac.hzims.ticket.workTicket.entity.SecondTicketInfoEntity; |
||||
import org.springblade.core.datascope.mapper.UserDataScopeBaseMapper; |
||||
|
||||
/** |
||||
* @Author WL |
||||
* @Version v1.0 |
||||
* @Serial 1.0 |
||||
* @Date 2023/7/3 13:36 |
||||
*/ |
||||
public interface TicketCountMapper extends UserDataScopeBaseMapper<TicketCount> { |
||||
} |
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
||||
<mapper namespace="com.hnac.hzims.ticket.twoTicket.mapper.TicketCountMapper"> |
||||
|
||||
</mapper> |
@ -0,0 +1,23 @@
|
||||
package com.hnac.hzims.ticket.twoTicket.service; |
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService; |
||||
import com.hnac.hzims.ticket.twoTicket.entity.TicketCount; |
||||
import com.hnac.hzims.ticket.twoTicket.entity.TicketInfoDanger; |
||||
|
||||
import java.time.YearMonth; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @Author WL |
||||
* @Version v1.0 |
||||
* @Serial 1.0 |
||||
* @Date 2023/7/3 13:37 |
||||
*/ |
||||
public interface TicketCountService extends IService<TicketCount> { |
||||
|
||||
/** |
||||
* 两票生成月报统计 |
||||
*/ |
||||
void loadMonthReport(String dateTime); |
||||
|
||||
} |
@ -0,0 +1,254 @@
|
||||
package com.hnac.hzims.ticket.twoTicket.service.impl; |
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||
import com.hnac.hzims.ticket.allTicket.entity.TicketInfoEvaluateEntity; |
||||
import com.hnac.hzims.ticket.allTicket.service.TicketInfoEvaluateService; |
||||
import com.hnac.hzims.ticket.standardTicket.entity.StandardTicketInfoEntity; |
||||
import com.hnac.hzims.ticket.standardTicket.service.IStandardTicketInfoService; |
||||
import com.hnac.hzims.ticket.twoTicket.entity.TicketCount; |
||||
import com.hnac.hzims.ticket.twoTicket.mapper.TicketCountMapper; |
||||
import com.hnac.hzims.ticket.twoTicket.service.TicketCountService; |
||||
import com.hnac.hzims.ticket.workTicket.entity.WorkTicketInfoEntity; |
||||
import com.hnac.hzims.ticket.workTicket.service.IWorkTicketInfoService; |
||||
import lombok.RequiredArgsConstructor; |
||||
import lombok.SneakyThrows; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
import org.apache.commons.collections4.CollectionUtils; |
||||
import org.springblade.core.mp.base.BaseEntity; |
||||
import org.springblade.core.secure.BladeUser; |
||||
import org.springblade.core.secure.utils.AuthUtil; |
||||
import org.springblade.core.tool.api.R; |
||||
import org.springblade.system.feign.ISysClient; |
||||
import org.springblade.system.user.feign.IUserClient; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
import java.util.concurrent.CompletableFuture; |
||||
import java.util.concurrent.ThreadPoolExecutor; |
||||
import java.util.stream.Collectors; |
||||
|
||||
/** |
||||
* @Author WL |
||||
* @Version v1.0 |
||||
* @Serial 1.0 |
||||
* @Date 2023/7/3 13:38 |
||||
*/ |
||||
@Slf4j |
||||
@Service |
||||
@RequiredArgsConstructor |
||||
public class TicketCountServiceImpl extends ServiceImpl<TicketCountMapper, TicketCount> implements TicketCountService { |
||||
|
||||
|
||||
private final ThreadPoolExecutor executor; |
||||
|
||||
|
||||
private final IWorkTicketInfoService workTicketInfoService; |
||||
|
||||
|
||||
private final IUserClient userClient; |
||||
|
||||
|
||||
private final ISysClient systemClient; |
||||
|
||||
|
||||
private final TicketInfoEvaluateService ticketInfoEvaluateService; |
||||
|
||||
|
||||
private final IStandardTicketInfoService standardTicketInfoService; |
||||
|
||||
/** |
||||
* 两票生成月报统计 |
||||
* |
||||
* @param dateTime |
||||
*/ |
||||
@SneakyThrows |
||||
@Override |
||||
public void loadMonthReport(String dateTime) { |
||||
//根据登录人查询所属机构及下属机构
|
||||
BladeUser user = AuthUtil.getUser(); |
||||
List<Long> createDept = userClient.getDataScope(user.getUserId()); |
||||
System.out.println("createDept = " + createDept); |
||||
//根据月份查询统计的数据
|
||||
CompletableFuture<List<TicketCount>> ticketCountsCompletableFuture = CompletableFuture.supplyAsync(() -> { |
||||
LambdaQueryWrapper<TicketCount> queryWrapper = new LambdaQueryWrapper<>(); |
||||
queryWrapper.eq(TicketCount::getDateTime, dateTime); |
||||
List<TicketCount> ticketCounts = baseMapper.selectList(queryWrapper); |
||||
return ticketCounts; |
||||
}, executor); |
||||
//第一种工作票
|
||||
CompletableFuture<Void> oneTicketCompletableFuture = ticketCountsCompletableFuture.thenAcceptAsync((items) -> { |
||||
//查询第一种工作票
|
||||
List<TicketCount> ticketCountList = getTicketCountList(createDept, items, "6", dateTime,user); |
||||
if (CollectionUtils.isNotEmpty(ticketCountList)) { |
||||
this.saveBatch(ticketCountList); |
||||
} |
||||
}, executor); |
||||
//第二种工作票
|
||||
CompletableFuture<Void> twoTicketCompletableFuture = ticketCountsCompletableFuture.thenAcceptAsync((items) -> { |
||||
//查询第一种工作票
|
||||
List<TicketCount> ticketCountList = getTicketCountList(createDept, items, "7", dateTime,user); |
||||
if (CollectionUtils.isNotEmpty(ticketCountList)) { |
||||
this.saveBatch(ticketCountList); |
||||
} |
||||
}, executor); |
||||
//水力机械工作票
|
||||
CompletableFuture<Void> threeTicketCompletableFuture = ticketCountsCompletableFuture.thenAcceptAsync((items) -> { |
||||
//查询第一种工作票
|
||||
List<TicketCount> ticketCountList = getTicketCountList(createDept, items, "8", dateTime,user); |
||||
if (CollectionUtils.isNotEmpty(ticketCountList)) { |
||||
this.saveBatch(ticketCountList); |
||||
} |
||||
}, executor); |
||||
//操作票
|
||||
CompletableFuture<Void> standardCompletableFuture = ticketCountsCompletableFuture.thenAcceptAsync((items) -> { |
||||
//操作票
|
||||
List<TicketCount> ticketCountList = getStandardTicketCountList(createDept, items, "3", dateTime,user); |
||||
if (CollectionUtils.isNotEmpty(ticketCountList)) { |
||||
this.saveBatch(ticketCountList); |
||||
} |
||||
|
||||
}, executor); |
||||
//执行线程操作
|
||||
CompletableFuture.allOf(ticketCountsCompletableFuture, |
||||
oneTicketCompletableFuture, |
||||
twoTicketCompletableFuture, |
||||
threeTicketCompletableFuture, |
||||
standardCompletableFuture) |
||||
.get(); |
||||
} |
||||
|
||||
/** |
||||
* 统计操作票功能 |
||||
* |
||||
* @param createDept 所属机构及下属机构 |
||||
* @param items 两票统计对象 |
||||
* @param ticketType 两票状态 |
||||
* @param dateTime |
||||
* @param user |
||||
* @return |
||||
*/ |
||||
private List<TicketCount> getStandardTicketCountList(List<Long> createDept, List<TicketCount> items, String ticketType, String dateTime, BladeUser user) { |
||||
List<StandardTicketInfoEntity> ticketInfoEntities = |
||||
standardTicketInfoService.selectStandardTicketByDeptIdWithTicketType(createDept, ticketType); |
||||
if (CollectionUtils.isEmpty(ticketInfoEntities)) { |
||||
return null; |
||||
} |
||||
//根据站点分组
|
||||
Map<Long, List<StandardTicketInfoEntity>> createDeptTickets = |
||||
ticketInfoEntities.stream().collect(Collectors.groupingBy(StandardTicketInfoEntity::getCreateDept)); |
||||
//获取 操作票的id,删除
|
||||
if (CollectionUtils.isNotEmpty(items)) { |
||||
List<Long> collect = items.stream().filter(item -> ticketType.equals(item.getTicketType())).map(TicketCount::getId).collect(Collectors.toList()); |
||||
if (CollectionUtils.isNotEmpty(collect)) { |
||||
baseMapper.deleteBatchIds(collect); |
||||
} |
||||
} |
||||
Set<Map.Entry<Long, List<StandardTicketInfoEntity>>> entries = createDeptTickets.entrySet(); |
||||
List<TicketCount> ticketCountList = new ArrayList<>(); |
||||
for (Map.Entry<Long, List<StandardTicketInfoEntity>> entry : entries) { |
||||
TicketCount ticketCount = new TicketCount(); |
||||
ticketCount.setDateTime(dateTime); |
||||
ticketCount.setDeptId(entry.getKey()); |
||||
ticketCount.setTenantId(user.getTenantId()); |
||||
ticketCount.setCreateDept(user.getDeptId()); |
||||
//根据id获取部门名称
|
||||
R<String> deptName = systemClient.getDeptName(entry.getKey()); |
||||
if (deptName.isSuccess()) { |
||||
ticketCount.setDeptName(deptName.getData()); |
||||
} |
||||
List<StandardTicketInfoEntity> values = entry.getValue(); |
||||
ticketCount.setTicketType(CollectionUtils.isNotEmpty(values) ? values.get(0).getTicketType() : ticketType); |
||||
//1. 开票数量
|
||||
List<StandardTicketInfoEntity> ticketNumbers = |
||||
values.stream().filter(item -> item.getFlowTaskName() != null).collect(Collectors.toList()); |
||||
ticketCount.setTicketNumber(ticketNumbers.size()); |
||||
//2. 完成数量
|
||||
List<StandardTicketInfoEntity> ticketCompleteNums = |
||||
values.stream().filter(item -> "结束".equals(item.getFlowTaskName())).collect(Collectors.toList()); |
||||
ticketCount.setTicketCompleteNum(ticketCompleteNums.size()); |
||||
//3. 延期数据量
|
||||
ticketCount.setTicketDelayNum(0); |
||||
//4. 合格数量
|
||||
List<Long> ticketIdList = values.stream().map(item -> item.getId()).collect(Collectors.toList()); |
||||
LambdaQueryWrapper<TicketInfoEvaluateEntity> evaluateEntityLambdaQueryWrapper = |
||||
new LambdaQueryWrapper<>(); |
||||
evaluateEntityLambdaQueryWrapper.in(TicketInfoEvaluateEntity::getTicketId, ticketIdList); |
||||
evaluateEntityLambdaQueryWrapper.eq(BaseEntity::getStatus, 1); |
||||
List<TicketInfoEvaluateEntity> evaluateEntities = ticketInfoEvaluateService.list(evaluateEntityLambdaQueryWrapper); |
||||
ticketCount.setTicketProportionNum(evaluateEntities.size()); |
||||
ticketCountList.add(ticketCount); |
||||
} |
||||
return ticketCountList; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 统计第一种工作票,第二种工作功能,机械工作票功能 |
||||
* |
||||
* @param createDept 所属机构及下属机构 |
||||
* @param items 两票统计对象 |
||||
* @param ticketType 两票状态 |
||||
* @param dateTime |
||||
* @param user |
||||
* @return |
||||
*/ |
||||
private List<TicketCount> getTicketCountList(List<Long> createDept, List<TicketCount> items, String ticketType, String dateTime, BladeUser user) { |
||||
List<WorkTicketInfoEntity> ticketInfoEntities = |
||||
workTicketInfoService.selectTicketByDeptIdWithTicketType(createDept, ticketType); |
||||
if (CollectionUtils.isEmpty(ticketInfoEntities)) { |
||||
return null; |
||||
} |
||||
//根据站点分组
|
||||
Map<Long, List<WorkTicketInfoEntity>> createDeptTickets = ticketInfoEntities.stream().collect(Collectors.groupingBy(BaseEntity::getCreateDept)); |
||||
if (CollectionUtils.isNotEmpty(items)) { |
||||
//获取工作票的id,删除
|
||||
List<Long> collect = items.stream().filter(item -> ticketType.equals(item.getTicketType())).map(TicketCount::getId).collect(Collectors.toList()); |
||||
if (CollectionUtils.isNotEmpty(collect)) { |
||||
baseMapper.deleteBatchIds(collect); |
||||
} |
||||
} |
||||
Set<Map.Entry<Long, List<WorkTicketInfoEntity>>> entries = createDeptTickets.entrySet(); |
||||
|
||||
List<TicketCount> ticketCountList = new ArrayList<>(); |
||||
for (Map.Entry<Long, List<WorkTicketInfoEntity>> entry : entries) { |
||||
TicketCount ticketCount = new TicketCount(); |
||||
ticketCount.setDeptId(entry.getKey()); |
||||
ticketCount.setDateTime(dateTime); |
||||
//根据id获取部门名称
|
||||
R<String> deptName = systemClient.getDeptName(entry.getKey()); |
||||
if (deptName.isSuccess()) { |
||||
ticketCount.setDeptName(deptName.getData()); |
||||
} |
||||
List<WorkTicketInfoEntity> values = entry.getValue(); |
||||
ticketCount.setTicketType(CollectionUtils.isNotEmpty(values) ? values.get(0).getType() : ticketType); |
||||
//1. 开票数量
|
||||
List<WorkTicketInfoEntity> ticketNumbers = |
||||
values.stream().filter(item -> item.getFlowTaskName() != null).collect(Collectors.toList()); |
||||
ticketCount.setTicketNumber(ticketNumbers.size()); |
||||
//2. 完成数量
|
||||
List<WorkTicketInfoEntity> ticketCompleteNums = |
||||
values.stream().filter(item -> "结束".equals(item.getFlowTaskName())).collect(Collectors.toList()); |
||||
ticketCount.setTicketCompleteNum(ticketCompleteNums.size()); |
||||
ticketCount.setTenantId(user.getTenantId()); |
||||
ticketCount.setCreateDept(user.getDeptId()); |
||||
//3. 延期数据量
|
||||
List<WorkTicketInfoEntity> ticketDelayNums = |
||||
values.stream().filter(item -> "延期".equals(item.getInput())).collect(Collectors.toList()); |
||||
ticketCount.setTicketDelayNum(ticketDelayNums.size()); |
||||
//4. 合格数量
|
||||
List<Long> ticketIdList = values.stream().map(item -> item.getId()).collect(Collectors.toList()); |
||||
LambdaQueryWrapper<TicketInfoEvaluateEntity> evaluateEntityLambdaQueryWrapper = |
||||
new LambdaQueryWrapper<>(); |
||||
evaluateEntityLambdaQueryWrapper.in(TicketInfoEvaluateEntity::getTicketId, ticketIdList); |
||||
evaluateEntityLambdaQueryWrapper.eq(BaseEntity::getStatus, 1); |
||||
List<TicketInfoEvaluateEntity> evaluateEntities = ticketInfoEvaluateService.list(evaluateEntityLambdaQueryWrapper); |
||||
ticketCount.setTicketProportionNum(evaluateEntities.size()); |
||||
ticketCountList.add(ticketCount); |
||||
} |
||||
return ticketCountList; |
||||
} |
||||
} |
@ -0,0 +1,21 @@
|
||||
-- auto-generated definition |
||||
create table hzims_ticket_count |
||||
( |
||||
id bigint auto_increment comment '主键ID' |
||||
primary key, |
||||
date_time varchar(20) null comment '日期', |
||||
dept_id bigint null comment '站点Id', |
||||
dept_name varchar(100) null comment '站点名称', |
||||
ticket_type varchar(255) null comment '票据类型', |
||||
ticket_number int null comment '开票数量', |
||||
ticket_complete_num int null comment '完成数量', |
||||
ticket_delay_num int null comment '延期数量', |
||||
ticket_proportion_num int null comment '合格数量', |
||||
create_time datetime default CURRENT_TIMESTAMP null comment '创建时间', |
||||
update_time datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间', |
||||
is_deleted tinyint(1) default 0 null comment '0', |
||||
tenant_id varchar(12) null comment '租户ID', |
||||
create_dept varchar(30) null comment '创建部门' |
||||
) |
||||
comment '两票统计分析' row_format = DYNAMIC; |
||||
|
Loading…
Reference in new issue