package ieven.server.webapp.api; import com.mongodb.client.MongoCursor; import ieven.server.webapp.domain.LineInput; import ieven.server.webapp.domain.ModelIdInput; import ieven.server.webapp.domain.StaticPageInput; import ieven.server.webapp.domain.alipay.TFromToFileIds; import ieven.server.webapp.domain.data.DataMap; import ieven.server.webapp.domain.data.DataService; import ieven.server.webapp.domain.data.Fields; import ieven.server.webapp.domain.data.StaticInput; import ieven.server.webapp.domain.exporter.Exporter; import ieven.server.webapp.domain.file.LogicalFile; import ieven.server.webapp.domain.model.Model; import ieven.server.webapp.infrastructure.wrapper.Mapped; import ieven.server.webapp.service.alipay.AlipayService; import ieven.server.webapp.util.excel.PublicStatic; import org.apache.commons.lang3.StringUtils; import org.bson.Document; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @RestController @RequestMapping({"/alipay"}) public class AlipayController { @Autowired private AlipayService alipayService; @Autowired private MongoTemplate mongoTemplate; @Autowired private DataService dataService; public AlipayController() { } @PostMapping({"/extractPersonInfo"}) public Mapped extractPersonInfo(@RequestBody ModelIdInput modelIdInput) throws InterruptedException { String modelId = modelIdInput.getModelId(); return modelId == null ? Mapped.ERROR("没有选择模型!") : this.alipayService.extractAll(modelId); } @PostMapping({"/viewDetailContent"}) public Mapped viewDetailContent(@RequestBody LineInput input) { String modelId = input.getModelId(); if (modelId == null) { return Mapped.ERROR("没有选择模型!"); } else { String filename = input.getFilename(); if (filename.equals("数据分析-对手透视") || filename.equals("数据分析-账户透视")) { String dateFileId = getFileId("数据分析-主体信息汇总明细", modelId, mongoTemplate); input.setFileId(dateFileId); } String fileId = input.getFileId(); String clickHeader = input.getClickHeader(); String lineId = input.getLineId(); int page = input.getPage(); int pageSize = input.getPageSize(); int skip = (page - 1) * pageSize; Criteria criteria = this.resolveDetailQuery(filename, fileId, lineId, clickHeader); if (criteria == null) { return Mapped.ERROR("未查询到明细"); } else { Long total = this.dataService.countTotalByQuery(new Query(criteria)); List dataMaps = this.mongoTemplate.find( (new Query(criteria)).skip(skip).limit(pageSize), DataMap.class); Mapped mapped = Mapped.OK(); mapped.put("result", dataMaps); mapped.put("code", 200); mapped.put("page", page); mapped.put("total", total); mapped.put("fileId", fileId); mapped.put("pageSize", pageSize); return mapped; } } } @PostMapping({"/staticDetailContent"}) public Mapped staticDetailContent(@RequestBody StaticPageInput input) { String modelId = input.getModelId(); if (modelId == null) { return Mapped.ERROR("没有选择模型!"); } else { String fileId = input.getFileId(); String jythm = input.getJythm(); String jydszh = input.getJydszh(); int page = input.getPage(); int pageSize = input.getPageSize(); int skip = (page - 1) * pageSize; Criteria criteria = Criteria.where("fileId") .is(fileId) .and("交易主体户名") .is(jythm) .and("交易对手账号") .is(jydszh); if (criteria == null) { return Mapped.ERROR("未查询到明细"); } else { Long total = this.dataService.countTotalByQuery(new Query(criteria)); List dataMaps = this.mongoTemplate.find( (new Query(criteria)).skip(skip).limit(pageSize), DataMap.class); Mapped mapped = Mapped.OK(); mapped.put("result", dataMaps); mapped.put("code", 200); mapped.put("page", page); mapped.put("total", total); mapped.put("fileId", fileId); mapped.put("pageSize", pageSize); return mapped; } } } @PostMapping({"/viewDetailHeaders"}) public Mapped viewHeaders(@RequestBody LineInput input) { String modelId = input.getModelId(); if (modelId == null) { return Mapped.ERROR("没有选择模型!"); } else { String filename = input.getFilename(); if (filename.equals("数据分析-对手透视") || filename.equals("数据分析-账户透视")) { String dateFileId = getFileId("数据分析-主体信息汇总明细", modelId, mongoTemplate); input.setFileId(dateFileId); } String fileId = input.getFileId(); TFromToFileIds oldFile = this.mongoTemplate.findOne( new Query(Criteria.where("toFileId").is(fileId)), TFromToFileIds.class); if (oldFile == null) { return Mapped.ERROR("未发现明细!"); } else { String fromFileId = oldFile.getFromFileId(); Fields fields = this.mongoTemplate.findOne(new Query(Criteria.where("fileId").is(fromFileId)), Fields.class); Mapped mapped = Mapped.OK(); mapped.put("result", fields); return mapped; } } } private List destFileId(String oriFileId) { Set destFileIds = new HashSet<>(); List oldFileList = this.mongoTemplate.find( new Query(Criteria.where("toFileId").is(oriFileId)), TFromToFileIds.class); for (TFromToFileIds t : oldFileList) { destFileIds.add(t.getFromFileId()); } return new ArrayList<>(destFileIds); } @PostMapping({"/exportViewDetailContent"}) public Mapped exportViewDetailContent(@RequestBody LineInput input) throws IOException { String modelId = input.getModelId(); if (modelId == null) { return Mapped.ERROR("没有选择模型!"); } else { String filename = input.getFilename(); String fileId = input.getFileId(); String clickHeader = input.getClickHeader(); String lineId = input.getLineId(); Criteria criteria = this.resolveDetailQuery(filename, fileId, lineId, clickHeader); if (input.getDeleteName() == 2) { criteria.andOperator(PublicStatic.getQuery()); } if (criteria == null) { return Mapped.ERROR("未查询到明细"); } else { Query query = new Query(criteria); MongoCursor cursor = this.mongoTemplate .getCollection("data") .find((query).getQueryObject()) .batchSize(1000) .noCursorTimeout(true) .cursor(); Exporter exporter = new Exporter(); List fileIds = this.destFileId(fileId); String exportFileId = exporter.export(cursor, fileIds.get(0), filename); Mapped mapped = Mapped.OK(); mapped.put("result", exportFileId); return mapped; } } } @PostMapping({"/exportAllDetail"}) public Mapped exportAllDetail(@RequestBody LineInput input) throws IOException { String modelId = input.getModelId(); if (modelId == null) { return Mapped.ERROR("没有选择模型!"); } else { String filename = input.getFilename(); String fileId = input.getFileId(); Criteria criteria = this.resolveDetailQuery(filename, fileId, null, null); if (criteria == null) { return Mapped.ERROR("未查询到明细"); } else { MongoCursor cursor = this.mongoTemplate .getCollection("data") .find((new Query(criteria)).getQueryObject()) .batchSize(1000) .noCursorTimeout(true) .cursor(); Exporter exporter = new Exporter(); List fileIds = this.destFileId(fileId); if (StringUtils.isNotBlank(modelId) && filename == null) { Model model = mongoTemplate.findOne(new Query(Criteria.where("id").is(modelId)), Model.class); filename = model.getModelName(); } String exportFileId = exporter.export(cursor, fileIds.get(0), filename); Mapped mapped = Mapped.OK(); mapped.put("result", exportFileId); return mapped; } } } @PostMapping({"/getFileIdByName"}) public Mapped getFileIdByName(@RequestBody LineInput input) { String modelId = input.getModelId(); if (modelId == null) { return Mapped.ERROR("没有选择模型!"); } else { String dateFileId = getFileId(input.getFilename(), modelId, mongoTemplate); Mapped mapped = Mapped.OK(); mapped.put("result", dateFileId); mapped.put("code", 200); return mapped; } } protected String getFileId(String filename, String modelId, MongoTemplate mongoTemplate) { Query query = new Query( Criteria.where("modelId") .is(modelId) .and("filename") .is(filename) .and("generated") .is(Boolean.TRUE)); LogicalFile oldFile = mongoTemplate.findOne(query, LogicalFile.class); if (oldFile != null) { return oldFile.getId(); } else { return ""; } } private Criteria resolveDetailQuery( String filename, String fileId, String lineId, String clickHeader) { List fileIds = this.destFileId(fileId); Criteria criteria = Criteria.where("fileId"); if (fileIds.size() == 1) { criteria.is(fileIds.get(0)); } else if (fileIds.size() > 1) { criteria.in(fileIds); } else { return null; } DataMap dataMap; String dszfbyhid; if (filename.equals("反诈治安-账户透视")) { if (lineId == null) { return criteria; } dataMap = this.mongoTemplate.findById(lineId, DataMap.class); if (dataMap == null) { return null; } dszfbyhid = (String) dataMap.get("交易主体账号"); if (!clickHeader.equals("交易总额") && !clickHeader.equals("总笔数")) { if (!clickHeader.equals("收入金额") && !clickHeader.equals("收入笔数")) { if (clickHeader.equals("支出金额") || clickHeader.equals("支出笔数")) { criteria.and("交易主体账号").is(dszfbyhid).and("交易主体的出入账标识").is("出账"); } } else { criteria.and("交易主体账号").is(dszfbyhid).and("交易主体的出入账标识").is("入账"); } } else { criteria.and("交易主体账号").is(dszfbyhid); } } else if (filename.equals("反诈治安-对手透视")) { if (lineId == null) { return criteria; } dataMap = this.mongoTemplate.findById(lineId, DataMap.class); if (dataMap == null) { return null; } dszfbyhid = (String) dataMap.get("交易对手账号"); if (!clickHeader.equals("交易总额") && !clickHeader.equals("总笔数")) { if (!clickHeader.equals("交易主体收入金额") && !clickHeader.equals("交易主体收入笔数")) { if (clickHeader.equals("交易主体支出金额") || clickHeader.equals("交易主体支出笔数")) { criteria.and("交易对手账号").is(dszfbyhid).and("交易主体的出入账标识").is("出账"); } } else { criteria.and("交易对手账号").is(dszfbyhid).and("交易主体的出入账标识").is("入账"); } } else { criteria.and("交易对手账号").is(dszfbyhid); } } else if (filename.equals("财付通-账户透视")) { if (lineId == null) { return criteria; } dataMap = this.mongoTemplate.findById(lineId, DataMap.class); if (dataMap == null) { return null; } dszfbyhid = (String) dataMap.get("交易主体账号"); if (!clickHeader.equals("交易总额") && !clickHeader.equals("总笔数")) { if (!clickHeader.equals("收入金额") && !clickHeader.equals("收入笔数")) { if (clickHeader.equals("支出金额") || clickHeader.equals("支出笔数")) { criteria.and("交易主体账号").is(dszfbyhid).and("借贷类型").is("出"); } } else { criteria.and("交易主体账号").is(dszfbyhid).and("借贷类型").is("入"); } } else { criteria.and("交易主体账号").is(dszfbyhid); } } else if (filename.equals("财付通-对手透视")) { if (lineId == null) { return criteria; } dataMap = this.mongoTemplate.findById(lineId, DataMap.class); if (dataMap == null) { return null; } dszfbyhid = (String) dataMap.get("交易对手账号"); if (!clickHeader.equals("交易总额") && !clickHeader.equals("总笔数")) { if (!clickHeader.equals("交易主体收入金额") && !clickHeader.equals("交易主体收入笔数")) { if (clickHeader.equals("交易主体支出金额") || clickHeader.equals("交易主体支出笔数")) { criteria.and("交易对手账号").is(dszfbyhid).and("借贷类型").is("出"); } } else { criteria.and("交易对手账号").is(dszfbyhid).and("借贷类型").is("入"); } } else { criteria.and("交易对手账号").is(dszfbyhid); } } else if (filename.equals("数据分析-账户透视")) { if (lineId == null) { return criteria; } dataMap = this.mongoTemplate.findById(lineId, DataMap.class); if (dataMap == null) { return null; } dszfbyhid = (String) dataMap.get("交易主体账号"); if (!clickHeader.equals("交易总额") && !clickHeader.equals("总笔数")) { if (!clickHeader.equals("收入金额") && !clickHeader.equals("收入笔数")) { if (clickHeader.equals("支出金额") || clickHeader.equals("支出笔数")) { criteria.and("交易主体账号").is(dszfbyhid).and("借贷类型").is("借"); } } else { criteria.and("交易主体账号").is(dszfbyhid).and("借贷类型").is("贷"); } } else { criteria.and("交易主体账号").is(dszfbyhid); } /* if (String.valueOf(dataMap.get("来源")).equals("财付通")) { dszfbyhid = (String) dataMap.get("交易主体账号"); if (!clickHeader.equals("交易总额") && !clickHeader.equals("总笔数")) { if (!clickHeader.equals("收入金额") && !clickHeader.equals("收入笔数")) { if (clickHeader.equals("支出金额") || clickHeader.equals("支出笔数")) { criteria.and("交易主体账号").is(dszfbyhid).and("借贷类型").is("出"); } } else { criteria.and("交易主体账号").is(dszfbyhid).and("借贷类型").is("入"); } } else { criteria.and("交易主体账号").is(dszfbyhid); } } else if (String.valueOf(dataMap.get("来源")).equals("五联单")) { dszfbyhid = (String) dataMap.get("交易主体账号"); if (!clickHeader.equals("交易总额") && !clickHeader.equals("总笔数")) { if (!clickHeader.equals("收入金额") && !clickHeader.equals("收入笔数")) { if (clickHeader.equals("支出金额") || clickHeader.equals("支出笔数")) { criteria.and("支付宝用户ID").is(dszfbyhid).and("收/支").is("支出"); } } else { criteria.and("支付宝用户ID").is(dszfbyhid).and("收/支").is("收入"); } } else { criteria.and("支付宝用户ID").is(dszfbyhid); } } else if (String.valueOf(dataMap.get("来源")).equals("反诈")) { dszfbyhid = (String) dataMap.get("交易主体账号"); if (!clickHeader.equals("交易总额") && !clickHeader.equals("总笔数")) { if (!clickHeader.equals("收入金额") && !clickHeader.equals("收入笔数")) { if (clickHeader.equals("支出金额") || clickHeader.equals("支出笔数")) { criteria.and("交易主体账号").is(dszfbyhid).and("借贷类型").is("借"); } } else { criteria.and("交易主体账号").is(dszfbyhid).and("借贷类型").is("贷"); } } else { criteria.and("交易主体账号").is(dszfbyhid); } }*/ } else if (filename.equals("数据分析-对手透视")) { if (lineId == null) { return criteria; } dataMap = this.mongoTemplate.findById(lineId, DataMap.class); if (dataMap == null) { return null; } dszfbyhid = (String) dataMap.get("交易对手账号"); if (!clickHeader.equals("交易总额") && !clickHeader.equals("总笔数")) { if (!clickHeader.equals("交易主体收入金额") && !clickHeader.equals("交易主体收入笔数")) { if (clickHeader.equals("交易主体支出金额") || clickHeader.equals("交易主体支出笔数")) { criteria.and("交易对手账号").is(dszfbyhid).and("借贷类型").is("借"); } } else { criteria.and("交易对手账号").is(dszfbyhid).and("借贷类型").is("贷"); } } else { criteria.and("交易对手账号").is(dszfbyhid); } /* if (String.valueOf(dataMap.get("来源")).equals("财付通")) { dszfbyhid = (String) dataMap.get("交易对手账号"); if (!clickHeader.equals("交易总额") && !clickHeader.equals("总笔数")) { if (!clickHeader.equals("交易主体收入金额") && !clickHeader.equals("交易主体收入笔数")) { if (clickHeader.equals("交易主体支出金额") || clickHeader.equals("交易主体支出笔数")) { criteria.and("交易对手账号").is(dszfbyhid).and("借贷类型").is("出"); } } else { criteria.and("交易对手账号").is(dszfbyhid).and("借贷类型").is("入"); } } else { criteria.and("交易对手账号").is(dszfbyhid); } } else if (String.valueOf(dataMap.get("来源")).equals("五联单")) { dszfbyhid = (String) dataMap.get("交易对手账号"); if (!clickHeader.equals("交易总额") && !clickHeader.equals("总笔数")) { if (!clickHeader.equals("主用户ID收入金额") && !clickHeader.equals("主用户ID收入笔数")) { if (clickHeader.equals("主用户ID支出金额") || clickHeader.equals("主用户ID支出笔数")) { criteria.and("对手支付宝用户ID").is(dszfbyhid).and("收/支").is("支出"); } } else { criteria.and("对手支付宝用户ID").is(dszfbyhid).and("收/支").is("收入"); } } else { criteria.and("对手支付宝用户ID").is(dszfbyhid); } } else if (String.valueOf(dataMap.get("来源")).equals("反诈")) { dszfbyhid = (String) dataMap.get("交易对手账号"); if (!clickHeader.equals("交易总额") && !clickHeader.equals("总笔数")) { if (!clickHeader.equals("交易主体收入金额") && !clickHeader.equals("交易主体收入笔数")) { if (clickHeader.equals("交易主体支出金额") || clickHeader.equals("交易主体支出笔数")) { criteria.and("交易对手账号").is(dszfbyhid).and("交易主体的出入账标识").is("出账"); } } else { criteria.and("交易对手账号").is(dszfbyhid).and("交易主体的出入账标识").is("入账"); } } else { criteria.and("交易对手账号").is(dszfbyhid); } }*/ } else if (filename.equals("五联单-转账分析")) { if (lineId == null) { criteria.and("消费名称").is("转账"); return criteria; } dataMap = this.mongoTemplate.findById(lineId, DataMap.class); if (dataMap == null) { return null; } dszfbyhid = (String) dataMap.get("支付宝用户ID"); if (!clickHeader.equals("转账总额") && !clickHeader.equals("总笔数")) { if (!clickHeader.equals("转账收入") && !clickHeader.equals("转收笔数")) { if (clickHeader.equals("转账支出") || clickHeader.equals("转支笔数")) { criteria.and("支付宝用户ID").is(dszfbyhid).and("消费名称").is("转账").and("收/支").is("支出"); } } else { criteria.and("支付宝用户ID").is(dszfbyhid).and("消费名称").is("转账").and("收/支").is("收入"); } } else { criteria.and("支付宝用户ID").is(dszfbyhid).and("消费名称").is("转账"); } } else if (filename.equals("五联单-账户透视")) { if (lineId == null) { return criteria; } dataMap = this.mongoTemplate.findById(lineId, DataMap.class); if (dataMap == null) { return null; } dszfbyhid = (String) dataMap.get("支付宝用户ID"); if (!clickHeader.equals("交易总额") && !clickHeader.equals("总笔数")) { if (!clickHeader.equals("收入金额") && !clickHeader.equals("收入笔数")) { if (clickHeader.equals("支出金额") || clickHeader.equals("支出笔数")) { criteria.and("支付宝用户ID").is(dszfbyhid).and("收/支").is("支出"); } } else { criteria.and("支付宝用户ID").is(dszfbyhid).and("收/支").is("收入"); } } else { criteria.and("支付宝用户ID").is(dszfbyhid); } } else if (filename.equals("五联单-对手透视")) { if (lineId == null) { return criteria; } dataMap = this.mongoTemplate.findById(lineId, DataMap.class); if (dataMap == null) { return null; } dszfbyhid = (String) dataMap.get("对手支付宝用户ID"); if (!clickHeader.equals("交易总额") && !clickHeader.equals("总笔数")) { if (!clickHeader.equals("主用户ID收入金额") && !clickHeader.equals("主用户ID收入笔数")) { if (clickHeader.equals("主用户ID支出金额") || clickHeader.equals("主用户ID支出笔数")) { criteria.and("对手支付宝用户ID").is(dszfbyhid).and("收/支").is("支出"); } } else { criteria.and("对手支付宝用户ID").is(dszfbyhid).and("收/支").is("收入"); } } else { criteria.and("对手支付宝用户ID").is(dszfbyhid); } } else if (filename.equals("五联单-收货地址分析")) { if (lineId == null) { return criteria; } dataMap = this.mongoTemplate.findById(lineId, DataMap.class); if (dataMap == null) { return null; } dszfbyhid = (String) dataMap.get("收货人地址"); if (clickHeader.equals("交易次数")) { criteria.and("收货人地址").is(dszfbyhid); } } else if (filename.equals("五联单-IP地址分析")) { if (lineId == null) { return criteria; } dataMap = this.mongoTemplate.findById(lineId, DataMap.class); if (dataMap == null) { return null; } dszfbyhid = (String) dataMap.get("IP地址"); if (clickHeader.equals("登录次数")) { criteria.and("客户端IP").is(dszfbyhid); } } return criteria; } }