提交 9e96a44c authored 作者: zjm's avatar zjm

合并分支 'dev' 到 'master'

合并 dev 至 master 查看合并请求 !13
......@@ -8,6 +8,8 @@ target/
*.log
.log
**/.log
*.gz
C:/*
### STS ###
\~*.xlsx
......
GET http://127.0.0.1:8087/actuator
Accept: application/vnd.spring-boot.actuator.v2+json
<> 2021-09-03T192754.200.json
###
GET http://127.0.0.1:8087/actuator
Accept: application/vnd.spring-boot.actuator.v2+json
<> 2021-09-03T192650.403.json
###
GET http://127.0.0.1:8087/actuator
Accept: application/vnd.spring-boot.actuator.v2+json
<> 2021-09-03T192615.403.json
###
GET http://127.0.0.1:8087/printDocuments1
<> 2021-04-27T124856.403.json
......
......@@ -27,4 +27,8 @@ public class BcHash {
* 接口返回结果
*/
private BcHashData data;
public BcHash toDate(){
return new BcHash();
}
}
......@@ -28,4 +28,7 @@ public class BcText {
*/
private BcTextData data;
public BcText toData(){
return new BcText();
}
}
......@@ -16,7 +16,7 @@ import java.util.UUID;
* 步骤:
* 1.构建请求参数
* 2.通过rest_template获取数据
*
* 测试
* @author LJJ cnljj1995@gmail.com
* on 2020-08-13
*/
......@@ -25,9 +25,6 @@ import java.util.UUID;
public class BlockChainUtilImpl implements BlockChainUtil {
private String SECRET_KEY = "3mdeM1dw2FfHrd5h6WAuhB3WYdDG6ZAgz96CcM1nzxbiYA8QaaZHW75Je9xKixTTD2rwujyb1gVUNPYm5W6FPZQ8";
private String SECRET_ID = "3yXRRiL9xsLfbt2kv7qRH2so6ChJX3rFkay7Njcsxfbp";
//测试环境
......@@ -81,43 +78,44 @@ public class BlockChainUtilImpl implements BlockChainUtil {
request.put("subCode", subCode);
request.put("apiSignature", ApiSignatureUtil.getApiSignature(request, SECRET_KEY));
switch (index){
case 1:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL + BcUrl.SEND_TEXT,
request,
BcText.class
);
case 2:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL2 + BcUrl.SEND_TEXT,
request,
BcText.class
);
case 3:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL3 + BcUrl.SEND_TEXT,
request,
BcText.class
);
case 4:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL4 + BcUrl.SEND_TEXT,
request,
BcText.class
);
case 5:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL5 + BcUrl.SEND_TEXT,
request,
BcText.class
);
}
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL + BcUrl.SEND_TEXT,
request,
BcText.class
);
// switch (index){
// case 1:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.SEND_TEXT,
// request,
// BcText.class
// );
// case 2:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL2 + BcUrl.SEND_TEXT,
// request,
// BcText.class
// );
// case 3:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL3 + BcUrl.SEND_TEXT,
// request,
// BcText.class
// );
// case 4:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL4 + BcUrl.SEND_TEXT,
// request,
// BcText.class
// );
// case 5:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL5 + BcUrl.SEND_TEXT,
// request,
// BcText.class
// );
// }
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.SEND_TEXT,
// request,
// BcText.class
// );
return new BcText().toData();
}
@Override
......@@ -126,11 +124,7 @@ public class BlockChainUtilImpl implements BlockChainUtil {
request.put("content", content);
request.put("subCode", subCode);
request.put("apiSignature", ApiSignatureUtil.getApiSignature(request, SECRET_KEY));
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL + BcUrl.SEND_TEXT,
request,
BcText.class
);
return new BcText().toData();
}
// public static void main(String[] args) {
......@@ -147,44 +141,7 @@ public class BlockChainUtilImpl implements BlockChainUtil {
log.info("apiSignature:{}",s);
request.put("apiSignature", s);
switch (index){
case 1:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL + BcUrl.SEND_HASH,
request,
BcHash.class
);
case 2:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL2 + BcUrl.SEND_HASH,
request,
BcHash.class
);
case 3:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL3 + BcUrl.SEND_HASH,
request,
BcHash.class
);
case 4:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL4 + BcUrl.SEND_HASH,
request,
BcHash.class
);
case 5:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL5 + BcUrl.SEND_HASH,
request,
BcHash.class
);
}
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL + BcUrl.SEND_HASH,
request,
BcHash.class
);
return new BcHash().toDate();
}
@Override
......@@ -197,11 +154,7 @@ public class BlockChainUtilImpl implements BlockChainUtil {
log.info("apiSignature:{}",s);
request.put("apiSignature", s);
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL + BcUrl.SEND_HASH,
request,
BcHash.class
);
return new BcHash().toDate();
// }
// else {
// return new BcHash(0, "", new BcHashData("000"));
......@@ -242,39 +195,40 @@ public class BlockChainUtilImpl implements BlockChainUtil {
request.put("apiSignature", s);
switch (index){
case 1:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL + BcUrl.APPEND_TEXT,
request,
BcText.class);
case 2:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL2 + BcUrl.APPEND_TEXT,
request,
BcText.class);
case 3:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL3 + BcUrl.APPEND_TEXT,
request,
BcText.class);
case 4:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL4 + BcUrl.APPEND_TEXT,
request,
BcText.class);
case 5:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL5 + BcUrl.APPEND_TEXT,
request,
BcText.class);
}
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL + BcUrl.APPEND_TEXT,
request,
BcText.class);
// switch (index){
// case 1:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.APPEND_TEXT,
// request,
// BcText.class);
// case 2:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL2 + BcUrl.APPEND_TEXT,
// request,
// BcText.class);
// case 3:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL3 + BcUrl.APPEND_TEXT,
// request,
// BcText.class);
// case 4:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL4 + BcUrl.APPEND_TEXT,
// request,
// BcText.class);
// case 5:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL5 + BcUrl.APPEND_TEXT,
// request,
// BcText.class);
// }
//
//
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.APPEND_TEXT,
// request,
// BcText.class);
return new BcText().toData();
}
@Override
......@@ -285,10 +239,7 @@ public class BlockChainUtilImpl implements BlockChainUtil {
String s = ApiSignatureUtil.getApiSignature(request, SECRET_KEY);
request.put("apiSignature", s);
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL + BcUrl.APPEND_TEXT,
request,
BcText.class);
return new BcText().toData();
}
@Override
......@@ -300,44 +251,45 @@ public class BlockChainUtilImpl implements BlockChainUtil {
request.put("apiSignature", s);
switch (index){
case 1:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL + BcUrl.APPEND_HASH,
request,
BcHash.class
);
case 2:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL2 + BcUrl.APPEND_HASH,
request,
BcHash.class
);
case 3:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL3 + BcUrl.APPEND_HASH,
request,
BcHash.class
);
case 4:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL4 + BcUrl.APPEND_HASH,
request,
BcHash.class
);
case 5:
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL5 + BcUrl.APPEND_HASH,
request,
BcHash.class
);
}
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL + BcUrl.APPEND_HASH,
request,
BcHash.class
);
// switch (index){
// case 1:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.APPEND_HASH,
// request,
// BcHash.class
// );
// case 2:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL2 + BcUrl.APPEND_HASH,
// request,
// BcHash.class
// );
// case 3:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL3 + BcUrl.APPEND_HASH,
// request,
// BcHash.class
// );
// case 4:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL4 + BcUrl.APPEND_HASH,
// request,
// BcHash.class
// );
// case 5:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL5 + BcUrl.APPEND_HASH,
// request,
// BcHash.class
// );
// }
//
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.APPEND_HASH,
// request,
// BcHash.class
// );
return new BcHash().toDate();
}
......@@ -349,11 +301,12 @@ public class BlockChainUtilImpl implements BlockChainUtil {
String s = ApiSignatureUtil.getApiSignature(request, SECRET_KEY);
request.put("apiSignature", s);
return new RestTemplate().postForObject(
BLOCK_CHAIN_URL + BcUrl.APPEND_HASH,
request,
BcHash.class
);
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.APPEND_HASH,
// request,
// BcHash.class
// );
return new BcHash().toDate();
}
@Override
......
//package com.tykj.dev.blockcha.subject.service.impl;
//
//import com.tykj.dev.blockcha.conf.BcUrl;
//import com.tykj.dev.blockcha.subject.entity.*;
//import com.tykj.dev.blockcha.subject.service.BlockChainUtil;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//import org.springframework.web.client.RestTemplate;
//
//import java.util.Map;
//import java.util.SortedMap;
//import java.util.TreeMap;
//import java.util.UUID;
//
///**
// * 步骤:
// * 1.构建请求参数
// * 2.通过rest_template获取数据
// *
// * @author LJJ cnljj1995@gmail.com
// * on 2020-08-13
// */
//@Slf4j
//@Component
//public class BlockChainUtilImplLocal implements BlockChainUtil {
//
//
//
//
//
// private String SECRET_KEY = "3mdeM1dw2FfHrd5h6WAuhB3WYdDG6ZAgz96CcM1nzxbiYA8QaaZHW75Je9xKixTTD2rwujyb1gVUNPYm5W6FPZQ8";
// private String SECRET_ID = "3yXRRiL9xsLfbt2kv7qRH2so6ChJX3rFkay7Njcsxfbp";
// //测试环境
//
//// public String SECRET_KEY;
//// public String SECRET_ID;
// //测试环境
//// public String SECRET_KEY = "3RJWStDCXN7mqJyZAB8rF59f87arGShdk9aKyDN3wKbzq9JnaXom1Hpe6mHT1k2yx9zfE7VFWidqwuxyT7DtPjCs";
//// public String SECRET_ID = "JAjQyTZdR8bmbHaU6iiFGvrCuUik4cG4U4ostk8KKrbS";
//
// private final static String BLOCK_CHAIN_URL = "http://10.153.4.12:8076";
// private final static String BLOCK_CHAIN_URL2 = "http://10.153.8.10:8076";
// private final static String BLOCK_CHAIN_URL3 = "http://10.153.8.11:8076";
// private final static String BLOCK_CHAIN_URL4 = "http://10.153.110.10:8076";
// private final static String BLOCK_CHAIN_URL5 = "http://10.153.6.11:8076";
//
//// @Value("${useBlockcha:fasle")
//// private String useBlockcha;
//
// @Override
// public BcStatus getStatus() {
//
// SortedMap<Object, Object> request = getRequest();
// request.put("apiSignature", ApiSignatureUtil.getApiSignature(request, SECRET_KEY));
//
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.GET_STATUS,
// request,
// BcStatus.class);
// }
//
// @Override
// public BcRegister subRegister(String subName) {
//
// SortedMap<Object, Object> request = getRequest();
// request.put("subName", subName);
// request.put("apiSignature", ApiSignatureUtil.getApiSignature(request, SECRET_KEY));
//
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.SUB_CODE_REGISTER,
// request,
// BcRegister.class
// );
// }
//
// @Override
// public BcText sendText(Integer index,Integer subCode, String content) {
//
// SortedMap<Object, Object> request = getRequest();
// request.put("content", content);
// request.put("subCode", subCode);
// request.put("apiSignature", ApiSignatureUtil.getApiSignature(request, SECRET_KEY));
//
// switch (index){
// case 1:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.SEND_TEXT,
// request,
// BcText.class
// );
// case 2:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL2 + BcUrl.SEND_TEXT,
// request,
// BcText.class
// );
// case 3:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL3 + BcUrl.SEND_TEXT,
// request,
// BcText.class
// );
// case 4:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL4 + BcUrl.SEND_TEXT,
// request,
// BcText.class
// );
// case 5:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL5 + BcUrl.SEND_TEXT,
// request,
// BcText.class
// );
// }
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.SEND_TEXT,
// request,
// BcText.class
// );
// }
//
// @Override
// public BcText sendText(Integer subCode, String content) {
// SortedMap<Object, Object> request = getRequest();
// request.put("content", content);
// request.put("subCode", subCode);
// request.put("apiSignature", ApiSignatureUtil.getApiSignature(request, SECRET_KEY));
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.SEND_TEXT,
// request,
// BcText.class
// );
// }
//
//// public static void main(String[] args) {
//// new BlockChainUtilImpl().sendHash(1,"阿斯顿好看");
//// }
//
//
// @Override
// public BcHash sendHash(Integer index,Integer subCode, String content) {
// SortedMap<Object, Object> request = getRequest();
// request.put("content", HexUtil.hex64(content));
// request.put("subCode", subCode);
// String s = ApiSignatureUtil.getApiSignature(request, SECRET_KEY);
// log.info("apiSignature:{}",s);
// request.put("apiSignature", s);
//
// switch (index){
// case 1:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.SEND_HASH,
// request,
// BcHash.class
// );
// case 2:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL2 + BcUrl.SEND_HASH,
// request,
// BcHash.class
// );
// case 3:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL3 + BcUrl.SEND_HASH,
// request,
// BcHash.class
// );
// case 4:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL4 + BcUrl.SEND_HASH,
// request,
// BcHash.class
// );
// case 5:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL5 + BcUrl.SEND_HASH,
// request,
// BcHash.class
// );
// }
//
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.SEND_HASH,
// request,
// BcHash.class
// );
// }
//
// @Override
// public BcHash sendHash(Integer subCode, String content) {
//// if ("true".equals(this.useBlockcha)) {
// SortedMap<Object, Object> request = getRequest();
// request.put("content", HexUtil.hex64(content));
// request.put("subCode", subCode);
// String s = ApiSignatureUtil.getApiSignature(request, SECRET_KEY);
// log.info("apiSignature:{}",s);
// request.put("apiSignature", s);
//
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.SEND_HASH,
// request,
// BcHash.class
// );
//// }
//// else {
//// return new BcHash(0, "", new BcHashData("000"));
//// }
// }
//
// @Override
// public BcRecord fetchRecord(String recordId) {
// SortedMap<Object, Object> request = getRequest();
// request.put("recordID", recordId);
// request.put("apiSignature", ApiSignatureUtil.getApiSignature(request, SECRET_KEY));
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.FETCH_RECORD,
// request,
// BcRecord.class
// );
// }
//
// @Override
// public BcHistory fetchHistory(Map<String, Object> map) {
//
// SortedMap<Object, Object> request = getRequest();
// map.forEach(request::put);
// request.put("apiSignature", ApiSignatureUtil.getApiSignature(request, SECRET_KEY));
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.FETCH_HISTORY,
// request,
// BcHistory.class
// );
// }
//
// @Override
// public BcText appendText(Integer index,String content, String recordId) {
// SortedMap<Object, Object> request = getRequest();
// request.put("content", content);
// request.put("recordID", recordId);
// String s = ApiSignatureUtil.getApiSignature(request, SECRET_KEY);
// request.put("apiSignature", s);
//
//
// switch (index){
// case 1:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.APPEND_TEXT,
// request,
// BcText.class);
// case 2:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL2 + BcUrl.APPEND_TEXT,
// request,
// BcText.class);
// case 3:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL3 + BcUrl.APPEND_TEXT,
// request,
// BcText.class);
// case 4:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL4 + BcUrl.APPEND_TEXT,
// request,
// BcText.class);
// case 5:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL5 + BcUrl.APPEND_TEXT,
// request,
// BcText.class);
// }
//
//
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.APPEND_TEXT,
// request,
// BcText.class);
// }
//
// @Override
// public BcText appendText(String content, String recordId) {
// SortedMap<Object, Object> request = getRequest();
// request.put("content", content);
// request.put("recordID", recordId);
// String s = ApiSignatureUtil.getApiSignature(request, SECRET_KEY);
// request.put("apiSignature", s);
//
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.APPEND_TEXT,
// request,
// BcText.class);
// }
//
// @Override
// public BcHash appendHash(Integer index,String content, String recordId) {
// SortedMap<Object, Object> request = getRequest();
// request.put("content", HexUtil.hex64(content));
// request.put("recordID", recordId);
// String s = ApiSignatureUtil.getApiSignature(request, SECRET_KEY);
// request.put("apiSignature", s);
//
//
// switch (index){
// case 1:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.APPEND_HASH,
// request,
// BcHash.class
// );
// case 2:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL2 + BcUrl.APPEND_HASH,
// request,
// BcHash.class
// );
// case 3:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL3 + BcUrl.APPEND_HASH,
// request,
// BcHash.class
// );
// case 4:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL4 + BcUrl.APPEND_HASH,
// request,
// BcHash.class
// );
// case 5:
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL5 + BcUrl.APPEND_HASH,
// request,
// BcHash.class
// );
// }
//
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.APPEND_HASH,
// request,
// BcHash.class
// );
//
// }
//
// @Override
// public BcHash appendHash(String content, String recordId) {
// SortedMap<Object, Object> request = getRequest();
// request.put("content", HexUtil.hex64(content));
// request.put("recordID", recordId);
// String s = ApiSignatureUtil.getApiSignature(request, SECRET_KEY);
// request.put("apiSignature", s);
//
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.APPEND_HASH,
// request,
// BcHash.class
// );
// }
//
// @Override
// public BcVerify verifyHash(String content, String recordId) {
// SortedMap<Object, Object> request = getRequest();
// request.put("content", HexUtil.hex64(content));
// request.put("recordID", recordId);
// String s = ApiSignatureUtil.getApiSignature(request, SECRET_KEY);
// request.put("apiSignature", s);
//
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.VERIFY_HASH,
// request,
// BcVerify.class
// );
// }
//
// @Override
// public BcVerify verifyText(String content, String recordId) {
// SortedMap<Object, Object> request = getRequest();
// request.put("content", content);
// request.put("recordID", recordId);
// String s = ApiSignatureUtil.getApiSignature(request, SECRET_KEY);
// request.put("apiSignature", s);
//
// return new RestTemplate().postForObject(
// BLOCK_CHAIN_URL + BcUrl.VERIFY_TEXT,
// request,
// BcVerify.class
// );
// }
//
// @Override
// public String verifyText1(String id, String key) {
// SECRET_KEY=key;
// SECRET_ID=id;
// return SECRET_KEY;
// }
//
// /**
// * 存储通用参数
// *
// * @return request
// */
// private SortedMap<Object, Object> getRequest() {
// long timestamp = System.currentTimeMillis() / 1000;
// String nonce = UUID.randomUUID().toString().trim().replaceAll("-", "");
// SortedMap<Object, Object> request = new TreeMap<Object, Object>();
// request.put("timestamp", timestamp);
// request.put("nonce", nonce);
// request.put("secretID", SECRET_ID);
// return request;
// }
//
//}
package com.tykj.dev.config;
import com.tykj.dev.misc.base.*;
import lombok.Data;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import java.util.Arrays;
import java.util.Map;
......@@ -10,6 +13,7 @@ import java.util.stream.Collectors;
/**
* @author dengdiyi
*/
@Slf4j
public class GlobalMap {
public static final Map<Integer, StatusEnum> statusEnumMap;
......@@ -53,6 +57,7 @@ public class GlobalMap {
.collect(Collectors.toMap(deviceSecretLevel -> deviceSecretLevel.id, Function.identity()));
businessMap = Arrays.stream(BusinessEnum.values())
.collect(Collectors.toMap(businessEnum -> businessEnum.id, businessEnum -> businessEnum.name));
log.info("[初始化] 初始map结束...");
}
public static Map<Integer, StatusEnum> getStatusEnumMap() {
......@@ -71,6 +76,10 @@ public class GlobalMap {
return deviceLifeStatusMap;
}
public static Map<Integer, MatchingRange> getMatchingRangeMap() {
return matchingRangeMap;
}
public static Map<Integer, StorageType> getStorageTypeMap() {
return storageTypeMap;
}
......@@ -79,18 +88,14 @@ public class GlobalMap {
return matchingDeviceTypeMap;
}
public static Map<Integer, MatchingRange> getMatchingRangeMap() {
return matchingRangeMap;
public static Map<Integer, DeviceInvisibleRange> getDeviceInvisibleRangeMap() {
return deviceInvisibleRangeMap;
}
public static Map<Integer, DeviceSecretLevel> getDeviceSecretLevelMap() {
return deviceSecretLevelMap;
}
public static Map<Integer, DeviceInvisibleRange> getDeviceInvisibleRangeMap() {
return deviceInvisibleRangeMap;
}
public static Map<Integer, String> getBusinessMap() {
return businessMap;
}
......
......@@ -80,7 +80,6 @@ public enum LogType {
REPAIR_SEND_4(33,REPAIR.id, WAIT_RECEIVE.id, END.id, "上传相关单据,任务结束"),//
REPAIR_SEND_5(34,REPAIR.id, WAIT_RECEIVE.id, WAIT_UPLOAD_FILE.id, "接收维修装备并发起入库(缺少单据)"),
REPAIR_SEND_6(35,REPAIR.id, WAIT_UPLOAD_FILE.id, END.id, "上传送修单据"),
......@@ -107,23 +106,19 @@ public enum LogType {
TRAIN_1(46,TRAIN.id, ORIGIN_STATUS.id, TRAIN1000.id, "发起培训"),
CONFIRM_CHECK_DETAIL_NORMAL_0(401,CONFIRM_CHECK_DETAIL.id, ORIGIN_STATUS.id, CHECK_DETAIL_0.id, "核查详情任务开始"),
CONFIRM_CHECK_DETAIL_NORMAL_1(402,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_0.id, CHECK_DETAIL_1.id, "A岗核查成功,等待专管员B操作"),
CONFIRM_CHECK_DETAIL_NORMAL_2(403,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_1.id, CHECK_DETAIL_2.id, "B岗核查成功,等待核查组成员A审核"),
CONFIRM_CHECK_DETAIL_NORMAL_0(401,CONFIRM_CHECK_DETAIL.id, ORIGIN_STATUS.id, CHECK_DETAIL_REGION_0.id, "核查详情任务开始"),
CONFIRM_CHECK_DETAIL_NORMAL_3(404,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_2.id, CHECK_DETAIL_3.id, "核查组成员A核查成功,等待核查组成员B审核"),
CONFIRM_CHECK_DETAIL_NORMAL_1(402,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_0.id, CHECK_DETAIL_REGION_1.id, "A岗核查成功,等待专管员B操作"),
CONFIRM_CHECK_DETAIL_NORMAL_4(405,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_3.id, END.id, "核查组成员B核查成功,任务结束,上传数据到统计信息"),
CONFIRM_CHECK_DETAIL_NORMAL_2(403,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_1.id, CHECK_DETAIL_REGION_2.id, "B岗核查成功,等待核查组成员A审核"),
CONFIRM_CHECK_DETAIL_OTHER_1(406,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_1.id, END.id, "B岗核查成功,该任务没有核查组成员,任务结束,上传数据到统计信息"),
CONFIRM_CHECK_DETAIL_NORMAL_3(404,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_2.id, END.id, "市专管员审核成功,该自查任务完结"),
CONFIRM_CHECK_DETAIL_OTHER_2(407,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_1.id, CHECK_DETAIL_0.id, "B岗审核失败,跳回A岗人员操作"),
CONFIRM_CHECK_DETAIL_OTHER_1(406,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_1.id, END.id, "B岗核查成功,该任务没有核查组成员,任务结束,上传数据到统计信息"),
CONFIRM_CHECK_DETAIL_OTHER_3(408,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_2.id, CHECK_DETAIL_0.id, "核查组成员A审核失败,跳回A岗人员操作"),
CONFIRM_CHECK_DETAIL_OTHER_2(407,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_1.id, CHECK_DETAIL_REGION_0.id, "B岗审核失败,跳回区A岗人员操作"),
CONFIRM_CHECK_DETAIL_OTHER_4(409,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_3.id, CHECK_DETAIL_0.id, "核查组成员B审核失败,跳回A岗人员操作"),
CONFIRM_CHECK_DETAIL_OTHER_3(408,CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_2.id, CHECK_DETAIL_REGION_0.id, "市专管员审核失败,跳回区A岗人员操作"),
CONFIRM_CHECK_DETAIL_STAT_0(410,CONFIRM_CHECK_STAT.id, ORIGIN_STATUS.id, CHECK_STAT_0.id, "核查统计任务开始"),
......@@ -137,20 +132,35 @@ public enum LogType {
CONFIRM_CHECK_EXAM_STAT_2(415, CONFIRM_CHECK_STAT.id, CHECK_EXAM_STAT_1.id, END.id, "检查统计任务数据已确认完毕,任务完结"),
CONFIRM_CHECK_EXAM_DETAIL_0(416, CONFIRM_CHECK_DETAIL.id, ORIGIN_STATUS.id, CHECK_EXAM_DETAIL_0.id, "检查详情任务开始"),
CONFIRM_CHECK_EXAM_DETAIL_0(416, CONFIRM_CHECK_DETAIL.id, ORIGIN_STATUS.id, CHECK_DETAIL_REGION_0.id, "检查详情任务开始"),
CONFIRM_CHECK_EXAM_DETAIL_1(417, CONFIRM_CHECK_DETAIL.id, CHECK_EXAM_DETAIL_0.id, CHECK_EXAM_DETAIL_1.id, "A岗核查成功,等待专管员B操作"),
CONFIRM_CHECK_EXAM_DETAIL_1(417, CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_0.id, CHECK_DETAIL_REGION_1.id, "A岗核查成功,等待专管员B操作"),
CONFIRM_CHECK_EXAM_DETAIL_2(418, CONFIRM_CHECK_DETAIL.id, CHECK_EXAM_DETAIL_1.id, END.id, "专管员B核查成功,该地区的检查任务结束了"),
CONFIRM_CHECK_EXAM_DETAIL_2(418, CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_1.id, END.id, "专管员B核查成功,该地区的检查任务结束了"),
CONFIRM_CHECK_EXAM_DETAIL_3(419, CONFIRM_CHECK_DETAIL.id, CHECK_EXAM_DETAIL_1.id, CHECK_EXAM_DETAIL_0.id, "B岗审核失败,跳回A岗人员操作"),
CONFIRM_CHECK_EXAM_DETAIL_3(419, CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_REGION_1.id, CHECK_DETAIL_REGION_0.id, "B岗审核失败,跳回A岗人员操作"),
CONFIRM_CHECK_EXAM_STAT_3(420, CONFIRM_CHECK_DETAIL.id, CHECK_EXAM_STAT_0.id, END.id, "检查统计任务数据已确认完毕,任务完结"),
CONFIRM_CHECK_SELF_ROLLBACK(421, CONFIRM_CHECK_DETAIL.id, END.id,CHECK_EXAM_DETAIL_0.id, "自查任务已退回至等待专管员A处理状态"),
CONFIRM_CHECK_SELF_ROLLBACK(421, CONFIRM_CHECK_DETAIL.id, END.id,CHECK_DETAIL_REGION_0.id, "自查任务已退回至等待专管员A处理状态"),
CONFIRM_CHECK_EXAM_ROLLBACK(422, CONFIRM_CHECK_DETAIL.id, END.id,CHECK_EXAM_STAT_1.id, "检查任务已退回至等待确认状态"),
CONFIRM_CHECK_EXAM_CITY_DETAIL_0(423, CONFIRM_CHECK_DETAIL.id, ORIGIN_STATUS.id, CHECK_DETAIL_CITY_0.id, "检查详情任务开始"),
CONFIRM_CHECK_EXAM_CITY_DETAIL_1(424, CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_CITY_0.id, CHECK_DETAIL_CITY_1.id, "专管员A操作成功,等待专管员B操作"),
CONFIRM_CHECK_EXAM_CITY_DETAIL_REDO(425, CONFIRM_CHECK_DETAIL.id, END.id, CHECK_DETAIL_CITY_0.id, "检查详情任务开始重做"),
CONFIRM_CHECK_EXAM_CITY_VERIFY_DONE(426, CONFIRM_CHECK_DETAIL.id, CONFIRM_STAT_0.id, END.id, "市统计数据确认完毕"),
CONFIRM_CHECK_EXAM_CITY_DETAIL_DONE(427, CONFIRM_CHECK_DETAIL.id, CHECK_DETAIL_CITY_1.id, END.id, "专管员B处理完毕,任务结束"),
CONFIRM_CHECK_EXAM_CITY_STAT_0(428, CONFIRM_CHECK_STAT.id, ORIGIN_STATUS.id, CHECK_STAT_1.id, "统计任务开始"),
ALLOT_BACK_1(57, ALLOT_BACK.id, ORIGIN_STATUS.id, ALLOT_BACKING.id, "发起装备退回"),
ALLOT_BACK_2(58,ALLOT_BACK.id, ALLOT_BACKING.id, END.id, "接收退回装备并上传相关单据"),
......
......@@ -34,7 +34,12 @@ public enum FileName {
/**
* 丢失单
*/
LOSS(7,"丢失单");
LOSS(7,"丢失单"),
/**
* 丢失单
*/
SelfCheck(8,"自查单");
public Integer id;
......
package com.tykj.dev.device.confirmcheck.common;
import com.tykj.dev.config.Log;
import com.tykj.dev.misc.base.StatusEnum;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Map;
import static com.tykj.dev.misc.base.StatusEnum.*;
/**
* CheckChart. 里面用于存放核查模块要用到的一些对照表Map
*
* @author Matrix <xhyrzldf@gmail.com>
* @since 2021/8/19 at 3:14 下午
*/
@Data
@Slf4j
public class CheckChart {
/**
* key = 任务状态编号 , value = 核查情况 , 用于市区自核查页面
*/
public static Map<Integer, String> taskStatus2Situation = new HashMap<>();
static {
taskStatus2Situation.put(CHECK_DETAIL_CITY_0.id, "无");
taskStatus2Situation.put(CHECK_DETAIL_CITY_1.id, "进行中");
taskStatus2Situation.put(CHECK_DETAIL_REGION_0.id, "无");
taskStatus2Situation.put(CHECK_DETAIL_REGION_1.id, "进行中");
taskStatus2Situation.put(CHECK_DETAIL_REGION_2.id, "等待市审核");
taskStatus2Situation.put(END.id, "完成");
log.info("[核查模块] 初始化taskStatus2Situation 完毕 , size = {}",CheckChart.taskStatus2Situation.size());
}
}
......@@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.tykj.dev.config.GlobalMap;
import com.tykj.dev.config.swagger.AutoDocument;
import com.tykj.dev.device.confirmcheck.common.CheckChart;
import com.tykj.dev.device.confirmcheck.common.CheckType;
import com.tykj.dev.device.confirmcheck.common.TaskPeriod;
import com.tykj.dev.device.confirmcheck.entity.domain.DeviceCheckDetail;
......@@ -18,6 +19,7 @@ import com.tykj.dev.device.confirmcheck.utils.ObjTransUtil;
import com.tykj.dev.device.file.entity.FileRet;
import com.tykj.dev.device.file.service.FilesUtil;
import com.tykj.dev.device.library.repository.DeviceLibraryDao;
import com.tykj.dev.device.library.service.DeviceLibraryCacheService;
import com.tykj.dev.device.library.subject.domin.DeviceLibrary;
import com.tykj.dev.device.selfcheck.controller.SelfCheckController;
import com.tykj.dev.device.task.repository.TaskDao;
......@@ -33,6 +35,7 @@ import com.tykj.dev.device.user.subject.entity.Units;
import com.tykj.dev.device.user.subject.entity.User;
import com.tykj.dev.device.user.subject.entity.bto.AreaUnit;
import com.tykj.dev.device.user.subject.service.AuService;
import com.tykj.dev.device.user.subject.service.UserService;
import com.tykj.dev.device.user.util.AuthenticationUtils;
import com.tykj.dev.misc.base.ResultObj;
import com.tykj.dev.misc.base.StatusEnum;
......@@ -44,11 +47,11 @@ import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDate;
......@@ -57,7 +60,6 @@ import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.Function;
import java.util.function.Predicate;
import static com.tykj.dev.misc.base.BusinessEnum.CONFIRM_CHECK_DETAIL;
import static com.tykj.dev.misc.base.BusinessEnum.CONFIRM_CHECK_STAT;
......@@ -71,7 +73,7 @@ import static java.util.stream.Collectors.*;
@RestController
@RequestMapping(value = "/check/confirm")
@AutoDocument
@Transactional(rollbackFor = Exception.class)
//@Transactional(rollbackFor = Exception.class)
@Slf4j
@Api(tags = "核查模块", description = "核查模块", position = 1)
public class DeviceCheckController {
......@@ -93,6 +95,8 @@ public class DeviceCheckController {
@Autowired
private DeviceCheckDetailDao detailRepo;
@Autowired
private DeviceLibraryCacheService dcService;
@Autowired
private ObjTransUtil transUtil;
@Autowired
private TaskDao taskRepo;
......@@ -107,7 +111,11 @@ public class DeviceCheckController {
@Autowired
private ConfirmCheckService ccService;
@Autowired
private UserService userService;
@Autowired
private MyWebSocket myWebSocket;
@Autowired
private SelfCheckController selfCheckController;
@GetMapping("/area/{fatherId}")
@ApiOperation(value = "查询指定区域下的所有区域信息")
......@@ -121,10 +129,78 @@ public class DeviceCheckController {
@GetMapping("/unit")
@ApiOperation(value = "查询默认的可以被核查单位的清单(省本直,省直属,市局)")
public ResponseEntity findDefaultUnits() {
return ResponseEntity.ok(new ResultObj<>(unitsRepo.findAllByTypeNotInAndLevelIn(Lists.newArrayList(3), Lists.newArrayList(0, 1, 2))));
}
/**
* @param id
* @return
*/
@GetMapping("/handleUsers/{id}")
@ApiOperation(value = "查询该detail经手的相关人员")
public ResponseEntity getDetailHanderUsers(@PathVariable Integer id) {
DeviceCheckDetail detail = detailRepo.findById(id).orElseThrow(() -> new ApiException("没有找到id = " + id + "的detail自查单!"));
Map<String, String> handUsers = new HashMap<>();
Integer startUserId = detail.getCreateUserId();
Integer userAId = detail.getUserAId();
Integer userBId = detail.getUserBId();
Integer userCId = detail.getUserCId();
if (Objects.nonNull(startUserId) && startUserId != 0) {
handUsers.put("startUserId", userService.findByUser(startUserId).getName());
} else {
handUsers.put("startUserId", "NoBody");
}
if (Objects.nonNull(userAId) && userAId != 0) {
handUsers.put("userA", userService.findByUser(userAId).getName());
} else {
handUsers.put("userA", "NoBody");
}
if (Objects.nonNull(userBId) && userBId != 0) {
handUsers.put("userBId", userService.findByUser(userBId).getName());
} else {
handUsers.put("userBId", "NoBody");
}
if (Objects.nonNull(userCId) && userCId != 0) {
handUsers.put("userCId", userService.findByUser(userCId).getName());
} else {
handUsers.put("userCId", "NoBody");
}
return ResponseEntity.ok(handUsers);
}
@GetMapping("/judge/{taskId}")
@ApiOperation(value = "根据taskId判断该task任务是由核查发起的还是由检查发起的")
public ResponseEntity judgeExamDetail(@PathVariable Integer taskId) {
Task task = taskRepo.findById(taskId).orElseThrow(() -> new ApiException("没有找到该Task任务,你提供的taskId = " + taskId));
Task finalTaks;
if (task.getParentTaskId() != null && task.getParentTaskId() != 0) {
Integer pId = task.getParentTaskId();
Task parentTask = taskRepo.findById(pId).get();
// 存在父任务,找到父任务,二次判断
if (parentTask.getParentTaskId() != null && parentTask.getParentTaskId() != 0) {
Integer ppId = parentTask.getParentTaskId();
Task doubleParentTask = taskRepo.findById(ppId).get();
finalTaks = doubleParentTask;
} else {
// 不存在二级父任务,那么头节点就是父任务
finalTaks = parentTask;
}
} else {
// 不存在父任务,那么头节点就是自己
finalTaks = task;
}
return ResponseEntity.ok(finalTaks.getCustomInfo());
}
@ApiOperation(value = "根据id查询核查统计数据", notes = "可以通过这个接口查询核查统计数据")
@GetMapping("/stat/{id}")
public CheckStatVo findStatById(@PathVariable Integer id) {
......@@ -135,7 +211,6 @@ public class DeviceCheckController {
return statVoList;
}
@ApiOperation(value = "根据关键字分页查询核查统计数据")
@PostMapping("/stat")
public Page<CheckStatTableVo> findStatByKeyword(
......@@ -144,6 +219,7 @@ public class DeviceCheckController {
return ccService.findAllStatTable(checkBillSelectVo);
}
@ApiOperation(value = "根据id查询核查详情数据", notes = "可以通过这个接口查询核查详情数据")
@GetMapping("/detail/{id}")
public ResponseEntity<ResultObj<CheckDetailVo>> findDetail(@PathVariable Integer id) {
......@@ -153,13 +229,27 @@ public class DeviceCheckController {
return ResponseEntity.ok(new ResultObj<>(detailVoList));
}
@ApiOperation(value = "根据id查询核查详情数据", notes = "可以通过这个接口查询核查详情数据")
@GetMapping("/detail/unit/{unitId}")
public ResponseEntity<ResultObj<List<CheckDetailVo>>> findDetailsByUnitId(@PathVariable Integer unitId) {
Units unit = unitsRepo.findById(unitId).get();
Specification<DeviceCheckDetail> pred = Specifications.<DeviceCheckDetail>and()
.eq("checkUnit", unit.getName())
.build();
List<CheckDetailVo> detailVoList = detailRepo.findAll(pred).stream()
.map(transUtil::CheckDetailDo2Vo)
.collect(toList());
return ResponseEntity.ok(new ResultObj<>(detailVoList));
}
@ApiOperation(value = "根据id 刷新 核查详情数据", notes = "可以通过这个接口 刷新 核查详情数据")
@GetMapping("/detail/refresh/{id}")
public ResponseEntity<ResultObj<CheckDetailVo>> refreshDetail(@PathVariable Integer id) {
DeviceCheckDetail detail = detailRepo.findById(id).get();
DeviceCheckDetail detail = detailRepo.findById(id)
.orElseThrow(() -> new ApiException("没有找到指定的detail数据,你提供的是 id = " + id));
String checkUnit = detail.getCheckUnit();
//查出所有装备 分为4类 A 所在是本单位 B 所属是本单位 其中
List<DeviceLibrary> allDevices = deviceRepo.findAll();
List<DeviceLibrary> allDevices = dcService.getAllDeviceLibraryList();
//在库 = A and B & not B 去除掉ls = 10 的装备 把ls = 11 的装备加入到非在库
Map<Boolean, List<DeviceLibrary>> locationMap = allDevices.stream()
.collect(partitioningBy(d -> d.getLocationUnit().equals(checkUnit)));
......@@ -191,7 +281,6 @@ public class DeviceCheckController {
return ResponseEntity.ok(new ResultObj<>(cdVo));
}
/**
* 该接口负责处理以下跳转情况
* 1 - 统计跳转
......@@ -222,16 +311,33 @@ public class DeviceCheckController {
List<LinkCheckDetail> lcdList = new ArrayList<>();
List<LinkExamDetail> ledList = new ArrayList<>();
// if else 结果 1.核查页面(市检查and省直属单位自查) 2.检查页面 (均为单位自查)
// check type = 0 核查页面 看见的是市检查与省直属自查
if (ctVo.getCheckType() == 0) {
linkVo.setType(1);
// 根据tpye和billId找到父级节点 - 默认了最顶级的省核查节点应当为一个
Task rootTask = taskRepo.findAllByBillIdAndBusinessType(billId, type).get(0);
// 先检出所有类型为7或者8的Task集合 方便后续操作
Specification<Task> pred = Specifications.<Task>and()
.in("businessType", 7, 8)
.build();
List<Task> cacheTask = taskRepo.findAll(pred)
.stream()
.filter(task -> Objects.nonNull(task.getParentTaskId()))
.collect(toList());
//key = parentId , value childList
Map<Integer, List<Task>> parentTaskMap = cacheTask.stream()
.collect(groupingBy(Task::getParentTaskId));
// 找到所有的子节点
List<Task> childTask = taskRepo.findAllByParentTaskId(rootTask.getId());
List<Task> childTask = parentTaskMap.get(rootTask.getId());
long startTime = System.currentTimeMillis();
long finalTime = System.currentTimeMillis();
for (Task child : childTask) {
// 将子节点任务中的 统计数据确认任务 给过滤掉
if (child.getTitle().contains("统计数据确认任务")) {
......@@ -251,12 +357,17 @@ public class DeviceCheckController {
DeviceCheckStat cdc = statRepo.findById(child.getBillId()).get();
CheckStatVo cdcVo = transUtil.checkStatDo2Vo(cdc);
//todo 这里更改从detail中去查看并求和
//找到chilid的子child detail 并求和
List<Task> cctask = taskRepo.findAllByParentTaskId(child.getId());
//找到chilid的子child detail 并求和 ccTask即为所有的自查任务集合
List<Task> cctask = parentTaskMap.get(child.getId());
if (Objects.isNull(cctask)) {
cctask = new ArrayList<>();
}
List<CheckAreaStatVo> totalList = new ArrayList<>();
for (Task cct : cctask) {
long start1 = System.currentTimeMillis();
Integer detailId = cct.getBillId();
DeviceCheckDetail childDetail = detailRepo.findById(detailId).get();
......@@ -265,12 +376,14 @@ public class DeviceCheckController {
.flatMap(checkAreaStatVos -> checkAreaStatVos.stream())
.collect(toList());
totalList.addAll(casList);
long end1 = System.currentTimeMillis();
log.info("[性能分析] task id = {} cost {} ms", cct.getId(), end1 - start1);
}
//
String areaName = auService.findOne(AuExample.UnitId, child.getOwnUnit()).getName();
CheckAreaStatVo cas = combineCaList(totalList, areaName);
//
LinkCheckDetail lcd = cas2lcd(totalList, child, cctask, areaName);
LinkCheckDetail lcd = rev2lcd(child, endTime, updateTime,cas.reverse());
lcd.setCheckUnit(unitName);
if (child.getTitle().contains("统计确认待办任务")) {
lcd.setCheckSituation("统计确认待办任务");
......@@ -300,16 +413,13 @@ public class DeviceCheckController {
if (casList.isEmpty()) {
cas = new CheckAreaStatVo("默认地区", 0, 0, 0, 0, 0, 0);
} else {
cas = combineCaList(casList, unitName);
// cas = combineCaList(casList, unitName);
cas = casList.get(0);
}
// CheckAreaStatVo cas = parseStatString2Vo(child.parse2Bto(), childDetail).stream()
// .map(CheckDeviceStatVo::getAreaStatList)
// .flatMap(checkAreaStatVos -> checkAreaStatVos.stream())
// .reduce(CheckAreaStatVo::combine)
// .orElse(new CheckAreaStatVo("默认地区", 0, 0, 0, 0, 0, 0));
// LinkExamDetail led = rev2led(child, endTime, updateTime, cas.reverse());
LinkExamDetail led = cas2led(cas, child, endTime, updateTime);
LinkExamDetail led = rev2led(child, endTime, updateTime,cas.reverse());
led.setCheckUnit(unitName);
ledList.add(led);
......@@ -327,7 +437,7 @@ public class DeviceCheckController {
linkVo.setType(2);
//看到的都是自查 根据tpye和billId找到父级节点 这里的根节点只能是检查节点
Task rootTask = taskRepo.findAllByBillIdAndBusinessType(billId, type).stream()
.filter(task -> task.getTitle().contains("检查"))
.filter(task -> task.getCustomInfo().contains("exam"))
.findFirst()
.orElseThrow(() -> new ApiException("[核查模块]没有找到对应billId的检查任务,您给的billId = " + billId));
// 找到所有的子节点
......@@ -356,34 +466,7 @@ public class DeviceCheckController {
int i = 0;
for (Task child : childTask) {
Integer childBusType = child.getBusinessType();
Integer childBusId = child.getBillId();
DeviceCheckDetail childDetail = detailRepo.findById(childBusId).get();
String unitName = childDetail.getCheckUnit();
List<CheckAreaStatVo> casList = parseStatString2Vo(child.parse2Bto(), childDetail).stream()
.map(CheckDeviceStatVo::getAreaStatList)
.flatMap(checkAreaStatVos -> checkAreaStatVos.stream())
.collect(toList());
//自查的areaName要从detail里找
String areaName = childDetail.getCheckUnit();
CheckAreaStatVo cas;
if (casList.isEmpty()) {
cas = new CheckAreaStatVo("默认地区", 0, 0, 0, 0, 0, 0);
} else {
cas = combineCaList(casList, areaName);
}
//
// CheckAreaStatVo cas = parseStatString2Vo(child.parse2Bto(), childDetail).stream()
// .map(CheckDeviceStatVo::getAreaStatList)
// .flatMap(checkAreaStatVos -> checkAreaStatVos.stream())
// .reduce(CheckAreaStatVo::combine)
// .get();
LinkExamDetail led = rev2led(child, endTime, updateTime,cas.reverse());
led.setCheckUnit(unitName);
LinkExamDetail led = getLed(endTime, updateTime, child);
//设置名称
led.setExamName(groupNames.get(i));
......@@ -409,132 +492,251 @@ public class DeviceCheckController {
}
//进行了更新 使用修改时间去做是否逾期判断
private LinkCheckDetail rev2lcd(Task task, LocalDateTime endTime, LocalDateTime updateTime,RevAreaStat revAreaStat) {
@NotNull
private LinkExamDetail getLed(LocalDateTime endTime, LocalDateTime updateTime, Task child) {
Integer childBusType = child.getBusinessType();
Integer childBusId = child.getBillId();
DeviceCheckDetail childDetail = detailRepo.findById(childBusId).get();
String unitName = childDetail.getCheckUnit();
List<CheckAreaStatVo> casList = parseStatString2Vo(child.parse2Bto(), childDetail).stream()
.map(CheckDeviceStatVo::getAreaStatList)
.flatMap(checkAreaStatVos -> checkAreaStatVos.stream())
.collect(toList());
//自查的areaName要从detail里找
String areaName = childDetail.getCheckUnit();
CheckAreaStatVo cas;
if (casList.isEmpty()) {
cas = new CheckAreaStatVo("默认地区", 0, 0, 0, 0, 0, 0);
} else {
cas = casList.get(0);
}
LinkExamDetail led = cas2led(cas, child, endTime, updateTime);
led.setCheckUnit(unitName);
return led;
}
/**
* lcd 里的列表都为检查,因此是集合对
*
* @return
*/
private LinkCheckDetail cas2lcd(List<CheckAreaStatVo> casList, Task task, List<Task> detailTasks, String finalCityName) {
LinkCheckDetail lcd = new LinkCheckDetail();
lcd.setId(task.getBillId());
String finalSituation = "";
//核查情况 无误/有误/逾期
if (revAreaStat.getComSituation() == -1) {
lcd.setCheckSituation("重新检查");
} else if (revAreaStat.getComSituation() == 1) {
lcd.setCheckSituation("有误");
} else if (revAreaStat.getComSituation() == 0) {
if (revAreaStat.getComProgress() == 0) {
lcd.setCheckSituation("无");
} else {
lcd.setCheckSituation("无误");
}
// 核查结果的判断具体细节可以查看 docs/confirmCheck.md文档
List<String> situationList = detailTasks.stream()
.map(this::getDetailSituation)
.collect(toList());
// 如果 size = 0 或全都是 无 ,则无
if (situationList.size() == 0) {
finalSituation = "无";
} else {
lcd.setCheckSituation("异常");
boolean allIsNothing = situationList.stream().allMatch(s -> s.equals("无"));
if (allIsNothing) {
finalSituation = "无";
}
//如果 有任意一个区状态是待审核
boolean anyIsAudit = situationList.stream().anyMatch(s -> s.equals("等待市审核"));
if (anyIsAudit) {
finalSituation = "等待市审核";
}
//如果 全都是 完成,那么是完成
boolean allIsFinish = situationList.stream().allMatch(s -> s.equals("完成"));
if (allIsFinish) {
finalSituation = "完成";
}
// 其他情况,则是进行中
if (StringUtils.isEmpty(finalSituation)) {
finalSituation = "进行中";
}
}
//核查结果
// if (endTime.isBefore(LocalDateTime.now())) {
// if (revAreaStat.getComProgress() ==1){
// lcd.setCheckResult("逾期进行中");
// }else if (task.getBillStatus() != 9999 || revAreaStat.getComProgress() != 2) {
// lcd.setCheckResult("逾期");
// } else {
// lcd.setCheckResult("逾期完成");
// }
// } else {
if (task.getBillStatus() == 9999) {
// if (endTime.isBefore(LocalDateTime.now())) {
// lcd.setCheckResult("逾期完成");
// }
if (endTime.isBefore(updateTime)) {
lcd.setCheckResult("逾期完成");
} else {
lcd.setCheckResult("完成");
lcd.setCheckSituation(finalSituation);
// 核查情况 所有子任务都是初始状态 = 无 10=未
String checkReuslt = "";
// Task 先将历史数据给过滤掉 - 方法是按照billId分组排序,跳出主键id最大的即最新的一条
detailTasks = detailTasks.stream()
.collect(groupingBy(Task::getTitle,
collectingAndThen(maxBy(Comparator.comparing(Task::getId)), Optional::get)))
.values().stream()
.collect(toList());
// 不能存在有9999的任务
boolean notExistsEnd = detailTasks.stream()
.allMatch(t -> !t.getBillStatus().equals(END.id));
if (notExistsEnd) {
checkReuslt = "无";
} else {
// 任意一个是10则是待审核
boolean waitAudit = casList.stream()
.anyMatch(cas -> cas.getComSituation() == 10);
boolean notPassed = casList.stream()
.anyMatch(cas -> cas.getComSituation() == 13);
// 需要每一个城市都有无误(即12) 才算无误
Map<String, List<CheckAreaStatVo>> map = casList.stream()
.collect(groupingBy(CheckAreaStatVo::getAreaName));
long okCount = 0;
for (List<CheckAreaStatVo> vos : map.values()) {
boolean containsOk = vos.stream()
.anyMatch(checkAreaStatVo -> checkAreaStatVo.getComSituation() == 12);
if (containsOk) {
okCount++;
}
}
} else if (revAreaStat.getComProgress() == 3) {
lcd.setCheckResult("已退回");
} else if (revAreaStat.getComProgress() == 0) {
lcd.setCheckResult("未开始");
} else if (revAreaStat.getComProgress() == 1) {
lcd.setCheckResult("进行中");
} else if (revAreaStat.getComProgress() == 2 && task.getBillStatus() % 10 == 0) {
lcd.setCheckResult("进行中");
} else if (revAreaStat.getComProgress() == 2 && task.getBillStatus() % 10 == 1) {
lcd.setCheckResult("进行中");
} else if (revAreaStat.getComProgress() == 2) {
// if (endTime.isBefore(LocalDateTime.now())) {
// lcd.setCheckResult("逾期完成");
// }
if (endTime.isBefore(updateTime)) {
lcd.setCheckResult("逾期完成");
boolean allOk = okCount >= map.size();
if (waitAudit) {
checkReuslt = "等待省审核";
} else if (allOk) {
checkReuslt = "无误";
} else if (notPassed) {
checkReuslt = "未通过";
} else {
lcd.setCheckResult("完成");
checkReuslt = "进行中";
}
}
lcd.setCheckResult(checkReuslt);
//核查单位名
lcd.setCheckUnit(revAreaStat.getAreaName() + "局");
//备注判断 新增缺失
lcd.setRemark(revAreaStat.getActualCount() - revAreaStat.getSupposeCount());
lcd.setCheckUnit(finalCityName + "局");
return lcd;
}
//修改
private LinkExamDetail rev2led(Task task, LocalDateTime endTime, LocalDateTime updateTime,RevAreaStat revAreaStat) {
LinkExamDetail led = new LinkExamDetail();
led.setId(task.getBillId());
//核查情况 重新检查/无误/有误/逾期
if (revAreaStat.getComSituation() == -1) {
led.setCheckSituation("重新检查");
} else if (revAreaStat.getComSituation() == 1) {
led.setCheckSituation("有误");
} else if (revAreaStat.getComSituation() == 0) {
if (revAreaStat.getComProgress() == 0) {
led.setCheckSituation("无");
} else {
led.setCheckSituation("无误");
@GetMapping("/test/test")
private String justForTest() {
CheckChart.taskStatus2Situation.forEach((k, v) -> System.out.println(v));
return "test";
}
/**
* 获得自查的核查情况
*/
private String getDetailSituation(Task task) {
Integer taskStatus = task.getBillStatus();
String situation = CheckChart.taskStatus2Situation.get(taskStatus);
// 无的情况要分两种 一种是初始的无 一种是重做导致的无 通过判断task的remark
String remark = task.getRemark();
if (situation.equals("无")) {
if (Objects.nonNull(remark) && remark.contains("ROLLBACK")) {
situation = "未通过";
}
} else {
led.setCheckSituation("异常");
}
//核查结果
if (task.getBillStatus() == 9999) {
// if (endTime.isBefore(LocalDateTime.now())) {
// led.setCheckResult("逾期完成");
// }
if (endTime.isBefore(updateTime)) {
led.setCheckResult("逾期完成");
return situation;
}
/**
* led 里的列表都为自查,因此都是单个对象
*
* @return
*/
private LinkExamDetail cas2led(CheckAreaStatVo cas, Task task, LocalDateTime endTime, LocalDateTime updateTime) {
LinkExamDetail led = new LinkExamDetail();
led.setId(task.getBillId());
int comProgress = cas.getComProgress();
int comSituation = cas.getComSituation();
// 核查情况依照 新的与task status来对应 详情可以查看docs/confirmcheck.md里的对应表 对照表
String situation = getDetailSituation(task);
// 逾期的处理,只在完成的那一步才判断
if (situation.equals("完成") && updateTime.isAfter(endTime)) {
situation = "逾期完成";
}
led.setCheckSituation(situation);
String checkResult = "";
String remark = task.getRemark();
// 核查结果 - 如果省的自查任务,核查情况是完成了之后,核查结果就是无误
String unitName = detailRepo.findById(task.getBillId()).get().getCheckUnit();
Integer areaType = auService.findOne(AuExample.UnitName, unitName).getType();
if (!situation.contains("完成")) {
checkResult = "无";
} else if (areaType == 1) {
checkResult = "无误";
} else if (comSituation == 10) {
// 再判断一下 是2级结构(检查统计)还是3级结构(核查统计)
Integer rootId = taskService.findByTaskId(task.getParentTaskId()).getParentTaskId();
boolean isTwoLevel = rootId == null || rootId == 0;
// 2级结构 - 检查统计 发起人单位是省,结果为等待省审核,发起人是市则是无
if (isTwoLevel) {
Integer startUnitId = userService.findById(task.getCreateUserId()).getUnitsId();
if (startUnitId != 1) {
checkResult = "无";
} else {
//根据detail userC为省且任务状态是完结状态时 变为无误 否则是等待省审核
Integer detailId = task.getBillId();
Integer userCId = detailRepo.findById(detailId).get().getUserCId();
if (task.getBillStatus().equals(END.id) && Objects.nonNull(userCId) && userIsProv(userCId)){
checkResult = "无误";
}else {
checkResult = "等待省审核";
}
}
} else {
led.setCheckResult("完成");
checkResult = "等待省审核";
}
} else if (comSituation == 12) {
checkResult = "无误";
} else if (comSituation == 13) {
int redoTime = 1;
if (Objects.nonNull(remark) && remark.contains("ROLLBACK")) {
redoTime = Integer.valueOf(remark.split("-")[1]);
}
} else if (revAreaStat.getComProgress() == 3) {
led.setCheckResult("已退回");
} else if (revAreaStat.getComProgress() == 0) {
led.setCheckResult("未开始");
} else if (revAreaStat.getComProgress() == 1) {
led.setCheckResult("进行中");
} else if (revAreaStat.getComProgress() == 2 && task.getBillStatus() % 10 == 0) {
led.setCheckResult("进行中");
} else if (revAreaStat.getComProgress() == 2 && task.getBillStatus() % 10 == 1) {
led.setCheckResult("进行中");
} else if (revAreaStat.getComProgress() == 2) {
if (endTime.isBefore(updateTime)) {
led.setCheckResult("逾期完成");
checkResult = redoTime + "次未通过";
} else if (comSituation == 0) {
if (task.getBillStatus().equals(END.id)) {
int redoTime = 1;
if (Objects.nonNull(remark) && remark.contains("ROLLBACK")) {
redoTime = Integer.valueOf(remark.split("-")[1]);
}
checkResult = redoTime + "次未通过";
} else {
led.setCheckResult("完成");
checkResult = "等待省审核";
}
} else {
checkResult = "状态异常";
}
led.setCheckResult(checkResult);
//核查单位名
led.setCheckUnit(revAreaStat.getAreaName() + "局");
//备注判断 新增缺失
led.setRemark(revAreaStat.getActualCount() - revAreaStat.getSupposeCount());
led.setCheckUnit(cas.getAreaName() + "局");
return led;
}
/**
* 判断用户是否是省级用户
*
* @return
*/
private boolean userIsProv(Integer userId) {
Integer unitsId = userService.findById(userId).getUnitsId();
Integer level = unitsRepo.findById(unitsId).get().getLevel();
return level == 1;
}
/**
* @param periodId 1-月度 2-季度 3-年度
* @return
......@@ -587,7 +789,7 @@ public class DeviceCheckController {
Integer provId = taskService.get(examJobId).getParentTaskId();
// 检查的job id 找到 father 进而找到 father的billid 进而找到title Id
Integer statId = taskService.get(provId).getBillId();
DeviceCheckStat deviceCheckStat = statRepo.getOne(statId);
DeviceCheckStat deviceCheckStat = statRepo.findById(statId).get();
String title = deviceCheckStat.getTitle();
String remark = deviceCheckStat.getRemark();
return ResponseEntity.ok(new CheckTitleAndTimeVo(title, deviceCheckStat.getEndTime(), remark));
......@@ -600,9 +802,10 @@ public class DeviceCheckController {
return new ResultObj<>(resultIds, "自动核查任务发起成功");
}
@ApiOperation(value = "根据地区ID获取下级的单位", notes = "根据地区ID获取下级的单位")
@GetMapping("/under/{areaId}")
public ResponseEntity getUnitsUnderAreaId(@PathVariable Integer areaId) {
public ResponseEntity getUnitsUnderAreaId(@PathVariable Integer areaId, @RequestParam(defaultValue = "true") boolean filter) {
//1.获取child AreaId List
List<Integer> areaIds = areaRepo.findAllByFatherId(areaId).stream()
.map(Area::getId)
......@@ -611,14 +814,20 @@ public class DeviceCheckController {
//2. 根据childId 获得对应的unit
List<Units> unitsList = unitsRepo.findAllByAreaIdIn(areaIds);
return ResponseEntity.ok(unitsList);
// 根据filter 决定是否将没有数据的装备给过滤掉
if (filter) {
unitsList = unitsList.stream()
.filter(unit -> deviceRepo.findAllByOwnUnit(unit.getName()).size() != 0)
.collect(toList());
}
return ResponseEntity.ok(unitsList);
}
@ApiOperation(value = "检查地区是否发起核查", notes = "检查地区是否发起核查")
@ApiOperation(value = "检查地区是否可以发起核查", notes = "检查地区是否可以发起核查")
@PostMapping("/checkPossible")
public ResponseEntity checkPossible(@RequestBody UnitIds uuid) {
List<String> unitNames = uuid.getIds().stream()
public ResponseEntity checkPossible(@RequestBody UnitIds unitIds) {
List<String> unitNames = unitIds.getIds().stream()
.map(id -> auService.findOne(AuExample.UnitId, id))
.map(AreaUnit::getUnitName)
.collect(toList());
......@@ -640,6 +849,11 @@ public class DeviceCheckController {
return ResponseEntity.ok(ImmutableMap.of("empty", findEmpty, "msg", alertString));
}
private String getUnitDateString(Units units, String title) {
return "[" + units.getUnitDesc() + "]" + title;
}
@ApiOperation(value = "发起核查", notes = "对指定单位发起核查任务")
@PostMapping("/startCheck")
public ResponseEntity startCheck(@RequestBody CheckCheckVo ccVO) {
......@@ -662,7 +876,7 @@ public class DeviceCheckController {
.collect(toList());
// 构建省的统计任务
TaskBto provStatTask = new Task(CHECK_STAT_1.id, "省" + CONFIRM_CHECK_STAT.name, 0, ".0.", CONFIRM_CHECK_STAT.id, statId, startUnitId)
TaskBto provStatTask = new Task(CHECK_STAT_1.id, getUnitDateString(startUnit, ccVO.getTitle()), 0, ".0.", CONFIRM_CHECK_STAT.id, statId, startUnitId)
.parse2Bto();
provStatTask.getInvolveUserIdList().add(authenticationUtils.getAuthentication().getCurrentUserInfo().getUserId());
provStatTask.getInvolveUserIdList().add(-1);
......@@ -687,7 +901,7 @@ public class DeviceCheckController {
log.info("[核查模块] {} 检查统计账单构建完毕,id 为 {}", unit.getName(), cityStatId);
// 构建市的统计任务
TaskBto cityStatTask = new TaskBto(CHECK_EXAM_STAT_0.id, unit.getName() + "检查统计任务", provStatTask.getId(), addNode(provStatTask.getNodeIdDetail(), provStatTask.getId()), CONFIRM_CHECK_STAT.id, cityStatId, unit.getUnitId(), 0);
TaskBto cityStatTask = new TaskBto(CHECK_EXAM_STAT_0.id, getUnitDateString(unit, ccVO.getTitle()), provStatTask.getId(), addNode(provStatTask.getNodeIdDetail(), provStatTask.getId()), CONFIRM_CHECK_STAT.id, cityStatId, unit.getUnitId(), 0);
cityStatTask.getInvolveUserIdList().add(0);
cityStatTask.setCurrentPoint(1);
cityStatTask.setCustomInfo("exam");
......@@ -703,13 +917,13 @@ public class DeviceCheckController {
.collect(toList());
// 获取所有在库装备 lifeStatus ==2 or 14
Map<String, List<DeviceLibrary>> devInLib = deviceRepo.findAll().stream()
Map<String, List<DeviceLibrary>> devInLib = dcService.getAllDeviceLibraryList().stream()
// .filter(device -> device.getOwnUnit().equals(device.getLocationUnit()))
.filter(d -> d.getLifeStatus() == 2 || d.getLifeStatus() == 14)
.collect(groupingBy(DeviceLibrary::getOwnUnit));
// 获取所有非在库装备 ls != 2 and != 14
Map<String, List<DeviceLibrary>> devNotInLib = deviceRepo.findAll().stream()
Map<String, List<DeviceLibrary>> devNotInLib = dcService.getAllDeviceLibraryList().stream()
// .filter(device -> !device.getOwnUnit().equals(device.getLocationUnit()))
.filter(d -> d.getLifeStatus() != 2 && d.getLifeStatus() != 14)
.collect(groupingBy(DeviceLibrary::getOwnUnit));
......@@ -720,8 +934,26 @@ public class DeviceCheckController {
for (Units unit : selfCheckUnits) {
//核查组成员名称用当前登录用户
String names = loginUser.getName();
// 如果是市level=2 的话,father Id为市的检查id
Integer fatherId = 0;
Integer initStatusId = 0;
// level = 1 或者2 市省级 否则 区级 ,市省级的自查初始状态160,区级的自查初始状态140
if (unit.getLevel() == 1 || unit.getLevel() == 2) {
fatherId = cityExamIdMap.get(unit.getUnitId());
initStatusId = CHECK_DETAIL_CITY_0.id;
if (fatherId == null) {
fatherId = provStatTask.getId();
}
} else {
fatherId = provStatTask.getId();
initStatusId = CHECK_DETAIL_REGION_0.id;
}
// 3-1 构建被查单位的 自查账单
DeviceCheckDetail unitDetailDoc = DeviceCheckDetail.EmptyWithChecker(names + "|" + "默认备注", ccVO.getRemark(), 0, 0, 0, 0, unit.getName(), devInLib.getOrDefault(unit.getName(), new ArrayList<>()), devNotInLib.getOrDefault(unit.getName(), new ArrayList<>()));
unitDetailDoc.setVar2(String.valueOf(initStatusId));
DeviceCheckDetail detail = detailRepo.save(unitDetailDoc);
// 将id放入统计中去 model -> areaName -> detailId
String areaName = auService.findOne(AuExample.UnitId, unit.getUnitId()).getName();
......@@ -735,13 +967,6 @@ public class DeviceCheckController {
}
// 3-2 构建被查单位的 自查任务 (根据被查单位的级别来区分是县级状态是市级状态) 这里的父级任务应该是省统计
// 如果是市level=2 的话,father Id为市的检查id
Integer fatherId = 0;
if (unit.getLevel() == 2) {
fatherId = cityExamIdMap.get(unit.getUnitId());
} else {
fatherId = provStatTask.getId();
}
//处理ownUnit的代码 - 用于处理没有账号的单位的可见性
Integer ownUnitId = 0;
......@@ -751,7 +976,7 @@ public class DeviceCheckController {
ownUnitId = unit.getUnitId();
}
TaskBto checkedTask = new TaskBto(CHECK_EXAM_DETAIL_0.id, unit.getName() + "自核查任务", fatherId, addNode(provStatTask.getNodeIdDetail(), provStatTask.getId()), CONFIRM_CHECK_DETAIL.id, detail.getId(), ownUnitId, 0);
TaskBto checkedTask = new TaskBto(initStatusId, getUnitDateString(unit, ccVO.getTitle()), fatherId, addNode(provStatTask.getNodeIdDetail(), provStatTask.getId()), CONFIRM_CHECK_DETAIL.id, detail.getId(), ownUnitId, 0);
checkedTask.setCustomInfo("manual");
taskService.start(checkedTask);
}
......@@ -786,12 +1011,15 @@ public class DeviceCheckController {
}
List<String> tmpString = new ArrayList<>();
// 拼接检查组和检查组成员
for (CheckExamDetailVo vo : examDetailVos) {
tmpString.add(vo.getGroupName() + "," + vo.getUserNames().stream().collect(joining(",")));
for (Integer u : vo.getUnitIds()) {
tmpString.add(vo.getGroupName() + "," + vo.getUserNames().stream().collect(joining(",")));
}
}
String groupUserString = tmpString.stream().collect(joining("|"));
List<Integer> unitIds = examDetailVos.stream().map(CheckExamDetailVo::getUnitId).collect(toList());
List<Integer> unitIds = examDetailVos.stream().flatMap(cv -> cv.getUnitIds().stream()).collect(toList());
List<Units> checkedUnits = unitsRepo.findAllById(unitIds);
List<String> checkedUnitNames = checkedUnits.stream().map(Units::getName).collect(toList());
......@@ -822,9 +1050,9 @@ public class DeviceCheckController {
Integer currentUserId = authenticationUtils.getAuthentication().getCurrentUserInfo().getUserId();
TaskBto cityStatTask;
if (ceVo.getExamStatId() == 0) {
cityStatTask = new Task(CHECK_EXAM_STAT_1.id, CHECK_EXAM_STAT_0.name, 0, ".0.", CONFIRM_CHECK_STAT.id, statId, startUnitId)
cityStatTask = new Task(CHECK_EXAM_STAT_1.id, getUnitDateString(startUnit, ceVo.getTitle()), 0, ".0.", CONFIRM_CHECK_STAT.id, statId, startUnitId)
.parse2Bto();
cityStatTask.setRemark(String.valueOf(CHECK_EXAM_STAT_1.id));
// cityStatTask.setRemark(String.valueOf(CHECK_EXAM_STAT_1.id));
cityStatTask.setCustomInfo("exam");
cityStatTask.getInvolveUserIdList().add(currentUserId);
// 检查变为待办
......@@ -836,7 +1064,7 @@ public class DeviceCheckController {
cityStatTask = taskRepo.findByBillIdAndBusinessType(ceVo.getExamStatId(), CONFIRM_CHECK_STAT.id).get().parse2Bto();
//检查变为待办
cityStatTask.getInvolveUserIdList().add(0);
cityStatTask.setRemark(String.valueOf(CHECK_EXAM_STAT_1.id));
// cityStatTask.setRemark(String.valueOf(CHECK_EXAM_STAT_1.id));
cityStatTask.setCustomInfo("exam");
cityStatTask.setCurrentPoint(cityStatTask.getCurrentPoint() + 1);
cityStatTask.setCreateUserId(currentUserId);
......@@ -846,44 +1074,69 @@ public class DeviceCheckController {
// 3 构建被查单位的 自查账单 与 自查任务
// 获取所有在库装备 ls == 2 or ls == 14
Map<String, List<DeviceLibrary>> devInLib = deviceRepo.findAll().stream()
Map<String, List<DeviceLibrary>> devInLib = dcService.getAllDeviceLibraryList().stream()
.filter(d -> d.getLifeStatus() == 2 || d.getLifeStatus() == 14)
// .filter(device -> device.getOwnUnit().equals(device.getLocationUnit()))
.collect(groupingBy(DeviceLibrary::getOwnUnit));
// 非在库装备 ls !=2 and ls !=14
Map<String, List<DeviceLibrary>> devNotInLib = deviceRepo.findAll().stream()
Map<String, List<DeviceLibrary>> devNotInLib = dcService.getAllDeviceLibraryList().stream()
.filter(d -> d.getLifeStatus() != 2 && d.getLifeStatus() != 14)
// .filter(device -> !device.getOwnUnit().equals(device.getLocationUnit()))
.collect(groupingBy(DeviceLibrary::getOwnUnit));
// 3. 构建被核查单位的详情账单与Task
// 对每个需要核查的单位构建其detail账单与task
boolean isProvUser = authenticationUtils.getAuthentication()
.getCurrentUserInfo().getUnitsId() == 1;
for (CheckExamDetailVo ed : examDetailVos) {
Units unit = unitsRepo.findById(ed.getUnitId()).get();
String names = ed.getUserNames().stream().collect(joining(","));
// 3-1 构建被查单位的 自查账单
DeviceCheckDetail unitDetailDoc = DeviceCheckDetail.EmptyWithChecker(names + "|" + ed.getRemark(), ceVo.getTitle() + "%^&" + ed.getRemark(), 0, 0, 0, 0, unit.getName(), devInLib.getOrDefault(unit.getName(), new ArrayList<>()), devNotInLib.getOrDefault(unit.getName(), new ArrayList<>()));
DeviceCheckDetail detail = detailRepo.save(unitDetailDoc);
detailIds.add(detail.getId());
// 将id放入统计中去 model -> areaName -> detailId
String areaName = auService.findOne(AuExample.UnitId, unit.getUnitId()).getName();
for (CheckDeviceStatVo statVo : deviceStatVos) {
for (CheckAreaStatVo asv : statVo.getAreaStatList()) {
if (asv.getAreaName().equals(areaName)) {
asv.setAreaStatId(statId);
asv.setAreaDetailId(detail.getId());
List<Integer> uid = ed.getUnitIds();
for (Integer u : uid) {
Units unit = unitsRepo.findById(u).get();
String names = ed.getUserNames().stream().collect(joining(","));
// 根据发起人决定初始状态id 省发起人- 160 其他发起人 被查的市160 被查的是区140
int initTaskStatusId = 0;
if (isProvUser) {
initTaskStatusId = CHECK_DETAIL_CITY_0.id;
} else {
//再根据被查单位的级别 level = 3 区140 level =2市 160
if (unit.getLevel() == 3) {
initTaskStatusId = CHECK_DETAIL_REGION_0.id;
} else {
initTaskStatusId = CHECK_DETAIL_CITY_0.id;
}
}
// 3-1 构建被查单位的 自查账单
DeviceCheckDetail unitDetailDoc = DeviceCheckDetail.EmptyWithChecker(names + "|" + ed.getRemark(), ceVo.getTitle() + "%^&" + ed.getRemark(), 0, 0, 0, 0, unit.getName(), devInLib.getOrDefault(unit.getName(), new ArrayList<>()), devNotInLib.getOrDefault(unit.getName(), new ArrayList<>()));
unitDetailDoc.setVar2(String.valueOf(initTaskStatusId));
DeviceCheckDetail detail = detailRepo.save(unitDetailDoc);
detailIds.add(detail.getId());
// 将id放入统计中去 model -> areaName -> detailId
String areaName = auService.findOne(AuExample.UnitId, unit.getUnitId()).getName();
for (CheckDeviceStatVo statVo : deviceStatVos) {
for (CheckAreaStatVo asv : statVo.getAreaStatList()) {
if (asv.getAreaName().equals(areaName)) {
asv.setAreaStatId(statId);
asv.setAreaDetailId(detail.getId());
}
}
}
// 3-2 构建被查单位的 自查任务 (根据被查单位的级别来区分是县级状态是市级状态)
TaskBto checkedTask = new TaskBto(initTaskStatusId, getUnitDateString(unit, ceVo.getTitle()), cityStatTask.getId(), addNode(cityStatTask.getNodeIdDetail(), cityStatTask.getId()), CONFIRM_CHECK_DETAIL.id, detail.getId(), unit.getUnitId(), 0);
// checkedTask.setRemark(String.valueOf(CHECK_EXAM_DETAIL_0.id));
checkedTask.setCustomInfo("manual");
checkedTask = taskService.start(checkedTask);
desBillMap.put(detail.getId(), ed.getRemark());
desMap.put(checkedTask.getId(), ed.getRemark());
}
// 3-2 构建被查单位的 自查任务 (根据被查单位的级别来区分是县级状态是市级状态)
TaskBto checkedTask = new TaskBto(CHECK_EXAM_DETAIL_0.id, "自核查任务", cityStatTask.getId(), addNode(cityStatTask.getNodeIdDetail(), cityStatTask.getId()), CONFIRM_CHECK_DETAIL.id, detail.getId(), unit.getUnitId(), 0);
checkedTask.setRemark(String.valueOf(CHECK_EXAM_DETAIL_0.id));
checkedTask.setCustomInfo("manual");
checkedTask = taskService.start(checkedTask);
desBillMap.put(detail.getId(), ed.getRemark());
desMap.put(checkedTask.getId(), ed.getRemark());
}
// 4. 重新设置并保存统计账单
......@@ -917,7 +1170,6 @@ public class DeviceCheckController {
}
/**
* 根据taskId查询Remark
*/
......@@ -928,7 +1180,6 @@ public class DeviceCheckController {
return ResponseEntity.ok(desBillMap.get(billId));
}
private TaskBto selectProvTask(Integer taskId) {
TaskBto taskBto = taskService.get(taskId);
if (taskBto.getParentTaskId() == 0) {
......@@ -937,7 +1188,6 @@ public class DeviceCheckController {
return selectProvTask(taskBto.getParentTaskId());
}
/**
* 对于专员A来说的逻辑
* 1. 修改detailString
......@@ -951,7 +1201,19 @@ public class DeviceCheckController {
public ResponseEntity<ResultObj> checkUserA(@PathVariable Integer id,
@RequestParam int assignUserId,
@RequestParam String checkResult,
@RequestBody DevLibVo devLibVo) {
@RequestParam String terminalInfo,
@RequestBody DetailVo detailVo) {
// 获取参数
DevLibVo devLibVo = detailVo.getDevLibVo();
List<FileRet> checkFiles = detailVo.getCheckFiles();
//是否上传检查单
if (checkFiles != null && checkFiles.size() > 0) {
DeviceCheckDetail deviceCheckDetail = detailRepo.findById(id).get();
deviceCheckDetail.setCheckFiles(FilesUtil.stringFileToList(checkFiles));
detailRepo.save(deviceCheckDetail);
}
//1. 更新checkDetail
log.info("[核查模块] 专管员A正在进行详情账单核查,且指定下一个审核人B id 为 {}", assignUserId);
String detailString = transUtil.devLib2String(devLibVo.getDevInLibrary(), devLibVo.getDevNotInLibrary());
......@@ -959,7 +1221,7 @@ public class DeviceCheckController {
long count = devLibVo.getDevInLibrary().stream()
.filter(deviceInLibVo -> deviceInLibVo.getProofResult() % 10 != 9)
.count();
detailRepo.updateCheckDetail(id, detailString, checkResult, currentUser.getUserId(), assignUserId, (int) count);
detailRepo.updateCheckDetailWithT(id, detailString, checkResult, currentUser.getUserId(), assignUserId, (int) count, terminalInfo);
//2. 推进TASK 状态
TaskBto currentTask = taskService.get(id, CONFIRM_CHECK_DETAIL.id);
currentTask.getInvolveUserIdList().set(0, authenticationUtils.getAuthentication().getCurrentUserInfo().getUserId());
......@@ -1049,11 +1311,12 @@ public class DeviceCheckController {
// 审核通过与不通过的逻辑不同
TaskBto currentTask = taskService.get(id, CONFIRM_CHECK_DETAIL.id);
boolean CEDStep1 = currentTask.getBillStatus().equals(CHECK_DETAIL_1.id) || currentTask.getBillStatus().equals(CHECK_EXAM_DETAIL_1.id);
boolean CEDStep1 = currentTask.getBillStatus().equals(CHECK_DETAIL_REGION_1.id) || currentTask.getBillStatus().equals(CHECK_DETAIL_CITY_1.id);
if (!CEDStep1) {
return ResponseEntity.status(400).body(new ResultObj<>(String.format("当前任务的状态异常!当前任务状态为 %s , 任务状态应该为 %s", GlobalMap.getStatusEnumMap().get(currentTask.getBillStatus()), CHECK_DETAIL_1.name)));
return ResponseEntity.status(400).body(new ResultObj<>(String.format("当前任务的状态异常!当前任务状态为 %s , 任务状态应该为 %s", GlobalMap.getStatusEnumMap().get(currentTask.getBillStatus()), CHECK_DETAIL_REGION_1.name)));
}
DeviceCheckDetail currentDetail = detailRepo.findById(id).get();
if (checkStatus == 1) {
// 只要通过了,且更新了详情结果,那么这里就进行一次更新
if (isUpdate == 1) {
......@@ -1068,7 +1331,6 @@ public class DeviceCheckController {
//依据detail账单对应的checkUserId来判断是2流程还是多流程的
DeviceCheckDetail currentDetail = detailRepo.findById(id).get();
Integer userAId = currentDetail.getCheckUserAId();
Integer userBId = currentDetail.getCheckUserBId();
......@@ -1085,14 +1347,18 @@ public class DeviceCheckController {
taskService.moveToNext(currentTask, userAId);
} else {
// 如果是2流程的,则直接结束该任务
log.info("[核查模块] 该详情任务是一个2流程任务,结束任务并统计数据...");
taskService.moveToEnd(currentTask);
log.info("[核查模块] 详情任务推进到下个阶段...");
taskService.moveToNext(currentTask);
summaryDetail(currentTask, currentDetail);
}
} else {
//不通过则回到第一阶段
StatusEnum firstStatus = getFirstStatus(currentTask.getBillStatus());
taskService.moveToSpecial(currentTask, firstStatus, currentTask.getFirstUserId());
log.info("[核查模块] 核查员B退回自查任务...");
StatusEnum firstStatus = getFirstStatus(currentTask.getBillStatus(), Integer.valueOf(currentDetail.getVar2()));
currentDetail.setCheckFiles("");
currentDetail.setCheckFileList(Lists.newArrayList());
detailRepo.save(currentDetail);
taskService.moveToSpecial(currentTask, firstStatus, 0);
}
log.info("[核查模块] 专管员B操作成功");
//完结系统自查业务
......@@ -1101,84 +1367,253 @@ public class DeviceCheckController {
}
/**
* 用于核查的回退接口
* 市人员审核区自查数据的接口
*
* @param id 办结的done接口id
* @param detailId
* @param pass 是否通过 true - 通过 ,false - 未通过
* @return
*/
@ApiOperation(value = "核查回退")
@PutMapping("/check/rollback/{id}")
@Transactional(rollbackFor = Exception.class)
public ResponseEntity checkRollback(@PathVariable Integer id) {
log.info("[核查模块] 将id = {} 的检查任务进行回退", id);
Specification<Task> donePred = Specifications.<Task>and()
.eq("billStatus", CONFIRM_STAT_0.id)
.eq("billId", id)
.eq("businessType", CONFIRM_CHECK_STAT.id)
.build();
TaskBto doneTask = taskRepo.findOne(donePred).get().parse2Bto();
@PutMapping("/city/audit/{id}")
@ApiOperation(value = "市专管人员审核区自查数据的接口")
public ResponseEntity cityAudit(
@PathVariable(name = "id") Integer detailId,
@RequestParam boolean pass) {
Specification<Task> checkPred = Specifications.<Task>and()
.eq("customInfo", "exam")
.eq("billId", id)
.eq("businessType", CONFIRM_CHECK_STAT.id)
.build();
Task checkTask = taskRepo.findOne(checkPred).get();
//1.将市检查的任务节点回退到等待办结的状态
taskService.moveToSpecial(checkTask.parse2Bto(), CHECK_EXAM_STAT_1);
TaskBto currentTask = taskService.get(detailId, CONFIRM_CHECK_DETAIL.id);
DeviceCheckDetail currentDetail = detailRepo.findById(detailId).get();
//2.删除掉省的办结任务
if (Objects.isNull(doneTask)) {
log.info("[核查模块] 没有找到对应的办结任务");
if (pass) {
// 通过的话就推进任务进度,合并数据
log.info("[核查模块] 市专管员审核通过,结束 {} 区的自查任务并汇总数据", currentDetail.getCheckUnit());
taskService.moveToNext(currentTask);
Integer userId = authenticationUtils.getAuthentication().getCurrentUserInfo().getUserId();
currentDetail.setUserCId(userId);
currentDetail = detailRepo.save(currentDetail);
summaryDetail(currentTask, currentDetail);
return ResponseEntity.ok("市专管员审核通过,结束" + currentDetail.getCheckUnit() + " 区的自查任务并汇总数据");
} else {
log.info("[核查模块] 删除id = {}的办结任务", doneTask.getId());
taskRepo.deleteById(doneTask.getId());
log.info("[核查模块] 市专管员审核未通过,回滚该任务到初始状态,任务id = {}", currentTask.getId());
// 重置Task任务本身的任务状态,使其回滚到等待专管员A处理时的状态,并在Task里添加特殊的回滚标记,用来鉴别这是一个回滚任务
StatusEnum firstStatus = getFirstStatus(currentTask.getBillStatus(), Integer.valueOf(currentDetail.getVar2()));
currentTask.setRemark("ROLLBACK-0");
taskService.moveToSpecial(currentTask, firstStatus, 0);
//重置该自查详情里的各个装备的自查详情
currentDetail = setDetailCheckNumber(currentDetail, 119);
currentDetail.setCheckFiles("");
currentDetail.setCheckFileList(Lists.newArrayList());
Integer userId = authenticationUtils.getAuthentication().getCurrentUserInfo().getUserId();
currentDetail.setUserCId(0);
currentDetail = detailRepo.save(currentDetail);
//该detail对应的stat数据里相应的数据剔除(写一个通用的剔除方法), 否则在第二次审核通过的时候会重复计算一次数据
TaskBto fatherTask = taskService.get(currentTask.getParentTaskId());
DeviceCheckStat dcs = statRepo.findById(fatherTask.getBillId()).get();
removeDetailFromDcs(currentDetail, dcs);
return ResponseEntity.ok("回退成功!回滚该任务到初始状态,id = " + currentTask.getId());
}
return ResponseEntity.ok(new ResultObj<>("核查回退操作成功!"));
}
/**
* 省专管员审核自查数据的方法
*
* @param detailId 自查主键id
* @param pass 是否通过 true - 通过 ,false - 未通过
* @return
*/
@PutMapping("/prov/audit/{id}")
@ApiOperation(value = "省专管人员审核区自查数据的接口")
public ResponseEntity provAudit(
@PathVariable(name = "id") Integer detailId,
@RequestParam boolean pass) {
if (pass) {
log.info("[核查模块] 省专管员审查detailId = {} 的自查数据-审核通过", detailId);
return provAuditPass(detailId);
} else {
log.info("[核查模块] 省专管员审查detailId = {} 的自查数据-审核未通过", detailId);
return provAuitNotPassed(detailId);
}
}
/**
* 将detail里的detailString里的检查数字该为指定数值
*
* @param detail
* @param number
*/
private DeviceCheckDetail setDetailCheckNumber(DeviceCheckDetail detail, Integer number) {
String detailString = detail.getCheckDetail();
String updatedString = Arrays.stream(detailString.split(","))
.map(s -> s.split("-")[0] + "-" + number)
.collect(joining(","));
detail.setCheckDetail(updatedString);
return detail;
}
/**
* 用于检查页面的回退接口
* 省对区审查 未通过的 逻辑
*
* @param id 自查的detail id
* @param id detail Id
* @return
*/
@ApiOperation(value = " ")
@PutMapping("/exam/rollback/{id}")
@Transactional(rollbackFor = Exception.class)
public ResponseEntity examRollback(@PathVariable Integer id) {
log.info("[核查模块] 进行检查回退操作,要回退的检查detail id为 {}", id);
//1. 回退device-detail数据 包括 detail String,checkResult,userAId,userBid,checkedCount
// 将原来的checkDetail 的检查状态统一更改为 8 - 已退回
String detail = detailRepo.getOne(id).getCheckDetail();
String updateDetail = Arrays.stream(detail.split(","))
.map(s -> s.split("-")[0] + "-" + "8")
private ResponseEntity provAuitNotPassed(Integer id) {
//1. bill单的自查将百位数变为3
DeviceCheckDetail detail = detailRepo.findById(id).get();
String detailString = detail.getCheckDetail();
String initalDetail = Arrays.stream(detailString.split(","))
.map(s -> s.split("-")[0] + "-" + 119)
.collect(joining(","));
String updateDetail = changeHunds(detailString, 3);
detailRepo.updateCheckDetail(id, updateDetail, "", 0, 0, 0);
//2. 回退任务Task
//2. 当前任务结束,开启一个新的 退回任务(连带一个新的detail)
TaskBto currentTask = taskService.get(id, CONFIRM_CHECK_DETAIL.id);
StatusEnum firstStatus = GlobalMap.getStatusEnumMap().get(Integer.valueOf(currentTask.getRemark()));
taskService.moveToSpecial(currentTask, firstStatus, currentTask.getFirstUserId());
//3.如果父级任务状态已经到确认阶段,则同样回退一个阶段
String remark = currentTask.getRemark();
if (Objects.nonNull(remark) && remark.contains("ROLLBACK")) {
Integer times = Integer.valueOf(remark.split("-")[1]);
remark = "ROLLBACK-" + ++times;
} else {
remark = "ROLLBACK-1";
}
currentTask.setRemark(remark);
TaskBto newTask = currentTask.toDo().copy().parse2Bto();
currentTask.setCustomInfo(currentTask.getCustomInfo());
taskService.moveToEnd(currentTask);
// 创建新的detail 新的detail会在B的时候加入,所以老的stat要去除掉
DeviceCheckDetail cDetail = detail.copyWithoutId();
cDetail.setId(null);
cDetail.setCheckDetail(initalDetail);
cDetail.setCheckFiles("");
cDetail.setCheckFileList(Lists.newArrayList());
cDetail = detailRepo.save(cDetail);
// 创建新的任务(被拒绝的自查单位如果是区则是140状态,否则是160状态)
String unitName = cDetail.getCheckUnit();
Integer level = unitsRepo.findByName(unitName).getLevel();
Integer initStatusId = 0;
if (level == 3) {
initStatusId = CHECK_DETAIL_REGION_0.id;
} else {
initStatusId = CHECK_DETAIL_CITY_0.id;
}
newTask.setBillStatus(initStatusId);
newTask.setBillId(cDetail.getId());
newTask.setId(0);
newTask.setCustomInfo(newTask.getCustomInfo());
newTask.getInvolveUserIdList().add(0);
newTask.setCurrentPoint(newTask.getInvolveUserIdList().size() - 1);
// 尝试从老任务中获取重做次数 - 新任务老任务都需要更新remark
newTask.setRemark(remark);
log.info("[核查模块] 省回退操作中... 任务remark = {}", remark);
newTask.setRemark(remark);
taskService.start(newTask);
//3. 在stat的remark中追加信息 - 找到currentTask在其中的顺位
TaskBto fatherTask = taskService.get(currentTask.getParentTaskId());
// log.info("[核查模块] 父级统计节点的task id = {} , bill id = {}", fatherTask.getId(), fatherTask.getBillId());
// if (fatherTask.getBillStatus().equals(CHECK_EXAM_STAT_1.id)) {
// log.info("[核查模块] 检测到父级节点已经进入确认阶段,回滚父级节点");
// taskService.moveToSpecial(fatherTask, CHECK_EXAM_STAT_0, fatherTask.getFirstUserId());
// }
//3. 回退合并上去的数据
String unitName = detailRepo.findById(id).get().getCheckUnit();
AreaUnit areaUnit = auService.findOne(AuExample.UnitName, unitName);
String cityName = areaUnit.getName();
List<Task> childTask = taskRepo.findAllByParentTaskId(fatherTask.getId());
int pos = 0;
for (int i = 0; i < childTask.size(); i++) {
if (childTask.get(i).getId().equals(currentTask.getId())) {
log.info("[核查模块] 记录remark的pos位置 = {}", i);
}
}
DeviceCheckStat dcs = statRepo.findById(fatherTask.getBillId()).get();
String[] groups = dcs.getRemark().split("\\|");
String pading = groups[pos];
dcs.setRemark(dcs.getRemark() + "|" + pading);
log.info("[核查模块] 补充remark = {}", pading);
// 老的stat要去除掉对应areaName的数据
removeDetailFromDcs(detail, dcs);
resetStatByCity(fatherTask.getBillId(), cityName);
//4.父级任务变为进行中
fatherTask.setBillStatus(CHECK_EXAM_STAT_1.id);
taskRepo.save(fatherTask.toDo());
return ResponseEntity.ok(new ResultObj<>("回退操作成功!"));
return ResponseEntity.ok(new ResultObj<>("检查回退操作成功!"));
}
/**
* 省对区审查通过的逻辑
*
* @param id detail Id
* @return
*/
private ResponseEntity provAuditPass(Integer id) {
//将自查的情况的百位数全部替换成2
DeviceCheckDetail detail = detailRepo.findById(id).get();
String updatedString = changeHunds(detail.getCheckDetail(), 2);
detail.setCheckDetail(updatedString);
log.info("[核查模块] 审核通过 - 更新后的detailString形如 {}", updatedString.split(",")[0]);
detailRepo.save(detail);
//将对应stat中地区的comProgress 改为 2 comsitution 改为12
String areaName = auService.findOne(AuExample.UnitName, detail.getCheckUnit()).getName();
TaskBto currentTask = taskService.get(id, CONFIRM_CHECK_DETAIL.id);
TaskBto fatherTask = taskService.get(currentTask.getParentTaskId());
DeviceCheckStat dcs = statRepo.findById(fatherTask.getBillId()).get();
CheckStatVo csv = transUtil.checkStatDo2Vo(dcs);
for (CheckDeviceStatVo vo : csv.getDeviceStatVoList()) {
for (CheckAreaStatVo av : vo.getAreaStatList()) {
if (av.getAreaName().equals(areaName)) {
log.info("[核查模块] 审核通过 - 地区 = {} 的统计数据在统计信息中被成功修改了", areaName);
av.auditPassed();
}
}
}
return ResponseEntity.ok(new ResultObj<>("审核通过!"));
}
private void removeDetailFromDcs(DeviceCheckDetail detail, DeviceCheckStat dcs) {
String areaName = auService.findOne(AuExample.UnitName, detail.getCheckUnit()).getName();
CheckStatVo csv = transUtil.checkStatDo2Vo(dcs);
for (CheckDeviceStatVo vo : csv.getDeviceStatVoList()) {
List<CheckAreaStatVo> filterList = vo.getAreaStatList().stream()
.filter(casv -> !casv.getAreaName().equals(areaName)).collect(toList());
if (filterList.size() != vo.getAreaStatList().size()) {
log.info("[核查模块] 回退操作-将退回的数据从统计中去除了.");
vo.setAreaStatList(filterList);
}
}
statRepo.save(csv.toDo());
}
/**
* 将detailString里的百位数改为指定数字
*
* @param detailString 要更改的自查详情字符串
* @param value 想要改成的数字
* @return
*/
private String changeHunds(String detailString, Integer value) {
String updateDetail = Arrays.stream(detailString.split(","))
.filter(s -> StringUtils.isNoneEmpty(s))
.map(s -> {
Integer number = Integer.valueOf(s.split("-")[1]);
int digit = number % 10;
int tens = number / 10 % 10;
number = value * 100 + tens * 10 + digit;
return s.split("-")[0] + "-" + number;
})
.collect(joining(","));
return updateDetail;
}
/**
* 将统计数据中指定城市的统计数据重置
*
......@@ -1199,43 +1634,6 @@ public class DeviceCheckController {
statRepo.save(statVo.toDo());
}
@ApiOperation(value = "核查组A/B确认核查详情单")
@PutMapping("/detail/C/{id}")
public ResponseEntity<ResultObj> checkUserC(@PathVariable Integer id,
@RequestParam boolean pass) {
TaskBto currentTask = taskService.get(id, CONFIRM_CHECK_DETAIL.id);
DeviceCheckDetail currentDetail = detailRepo.findById(id).get();
if (pass) {
// 如果当前是第3步(利用余数来判断),则需要指定核查组B的人来接受任务
boolean stepC = currentTask.getBillStatus() % 10 == 2;
boolean stepD = currentTask.getBillStatus() % 10 == 3;
if (stepC) {
log.info("[核查模块] C 检查组成员A正在进行核查操作,核查详情账单id为 : {}", id);
if (!currentTask.getBillStatus().equals(CHECK_DETAIL_2.id)) {
return ResponseEntity.status(400).body(new ResultObj<>(String.format("当前任务的状态异常!当前任务状态为 %s , 任务状态应该为 %s", GlobalMap.getStatusEnumMap().get(currentTask.getBillStatus()), CHECK_DETAIL_2.name)));
}
taskService.moveToNext(currentTask, currentDetail.getCheckUserBId());
log.info("[核查模块] C 操作完毕");
}
if (stepD) {
if (!currentTask.getBillStatus().equals(CHECK_DETAIL_3.id)) {
return ResponseEntity.status(400).body(new ResultObj<>(String.format("当前任务的状态异常!当前任务状态为 %s , 任务状态应该为 %s", GlobalMap.getStatusEnumMap().get(currentTask.getBillStatus()), CHECK_DETAIL_3.name)));
}
// 如果当前是第4步,则直接结束任务,并且进行结果汇总
log.info("[核查模块] D 检查组成员A正在进行核查操作,核查详情账单id为 : {}", id);
summaryDetail(currentTask, currentDetail);
currentTask = taskService.moveToEnd(currentTask);
log.info("[核查模块] D 操作完毕");
}
} else {
// 如果没通过则返回第1步
StatusEnum firstStatus = getFirstStatus(currentTask.getBillStatus());
taskService.moveToSpecial(currentTask, firstStatus, currentTask.getFirstUserId());
}
return ResponseEntity.ok(new ResultObj<>("操作成功"));
}
/**
* @param taskId 待办任务id
* @param statId 市级统计的STAT ID
......@@ -1304,8 +1702,7 @@ public class DeviceCheckController {
log.info("[核查模块] 办结统计待办操作成功");
return ResponseEntity.ok(new ResultObj<>("办结统计待办确认完毕"));
}
@Autowired
private SelfCheckController selfCheckController;
/**
* @param statId 统计账单主键id
*/
......@@ -1320,16 +1717,35 @@ public class DeviceCheckController {
Integer parentTaskId = currentTask.getParentTaskId();
boolean hasParent = parentTaskId != 0;
//尝试寻找老的市办结任务,如果有的话就删除加END
//5.需要将上一次市的确认任务给清理掉
// 父级的父级,就是省的任务,然后子child里名字包含 统计数据确认任务 的任务给 END 吧
Task verifyTask = taskRepo.findAllByParentTaskId(parentTaskId)
.stream()
.filter(task -> task.getTitle().contains("统计数据确认任务"))
.sorted(Comparator.comparing(Task::getId))
.findFirst()
.orElse(null);
if (Objects.nonNull(verifyTask)) {
log.info("[核查模块] 发现了id = {}市的统计确认任务,将其完结并剔除整个树节点", verifyTask.getId());
verifyTask.setParentTaskId(0);
taskService.moveToEnd(verifyTask.parse2Bto());
}
if (hasParent) {
//市统计的办结 -> 开启对应市 数据确认任务for 省
//市统计的办结 -> 开启对应市 数据确认任务for 省s
Units units = unitsRepo.findById(currentTask.getOwnUnit()).get();
String areaName = auService.findOne(AuExample.UnitId, currentTask.getOwnUnit()).getName();
Integer provId = areaRepo.findAreasByType(1).stream()
.min(Comparator.comparing(Area::getId))
.get()
.getId();
TaskBto cityDoneTask = new TaskBto(CONFIRM_STAT_0.id, areaName + "统计数据确认任务", parentTaskId, ".", CONFIRM_CHECK_STAT.id, statId, provId, 0);
String provTitle = taskRepo.findById(parentTaskId).get().getTitle();
TaskBto cityDoneTask = new TaskBto(CONFIRM_STAT_0.id, provTitle + "统计数据确认任务", parentTaskId, ".", CONFIRM_CHECK_STAT.id, statId, provId, 0);
cityDoneTask.getInvolveUserIdList().add(0);
cityDoneTask.setCurrentPoint(cityDoneTask.getCurrentPoint() + 1);
cityDoneTask.setCustomInfo("");
cityDoneTask = taskService.start(cityDoneTask);
log.info("[核查模块] 统计确认待办任务生成成功, id为 : {}", cityDoneTask.getId());
}
......@@ -1345,7 +1761,11 @@ public class DeviceCheckController {
* @param currentDetail 需要汇总的详情核查数据对象
*/
private void summaryDetail(TaskBto currentTask, DeviceCheckDetail currentDetail) {
log.info("[核查模块] 正在进行数据汇总");
log.info("[核查模块] 正在尝试进行Task id = {} 的自查数据汇总...", currentTask.getId());
if (!currentTask.getBillStatus().equals(END.id)) {
log.info("[核查模块] 该自查任务还未完成,结束汇总,当前任务状态id = {}", currentTask.getBillStatus());
}
// 先找到汇总地区的账单id 查询当前detail task 的 父级TASK
Integer fatherTaskId = currentTask.getParentTaskId();
int statId = taskRepo.findBillId(fatherTaskId, CONFIRM_CHECK_STAT.id);
......@@ -1412,9 +1832,14 @@ public class DeviceCheckController {
*
* @param currentStatusId 任务状态id
*/
private StatusEnum getFirstStatus(Integer currentStatusId) {
private StatusEnum getFirstStatus(Integer currentStatusId, Integer defaultStatusId) {
int remainder = currentStatusId % 10;
return GlobalMap.getStatusEnumMap().get(currentStatusId - remainder);
StatusEnum resultEnum = GlobalMap.getStatusEnumMap().get(currentStatusId - remainder);
if (Objects.isNull(resultEnum)) {
return GlobalMap.getStatusEnumMap().get(defaultStatusId);
} else {
return resultEnum;
}
}
public List<CheckDeviceStatVo> parseStatString2Vo(TaskBto task, DeviceCheckDetail detail) {
......@@ -1424,6 +1849,8 @@ public class DeviceCheckController {
String[] statArray = statString.split(",");
//将 id - status 转化为 model - count - status(只统计新增和无误的作为数量)
long start1 = System.currentTimeMillis();
// 根这里unid可以从detail里拿,根据unitId 查到 areaId 根据 areaId 查询到 areaName
String areaName = auService.findOne(AuExample.UnitName, detail.getCheckUnit()).getName();
......@@ -1433,48 +1860,75 @@ public class DeviceCheckController {
int statId = Optional.ofNullable(taskRepo.findBillId(task.getParentTaskId(), CONFIRM_CHECK_STAT.id))
.orElse(0);
long end1 = System.currentTimeMillis();
log.info("[核查TEST] 基础数据查询消耗 {} ms ", end1 - start1);
// checkDevice 批量查询做一个MAP缓存
long start = System.currentTimeMillis();
List<Integer> idList = Arrays.stream(statArray)
.filter(StringUtils::isNotEmpty)
.map(s -> s.split("-")[0])
.filter(StringUtils::isNotEmpty)
.map(Integer::parseInt)
.collect(toList());
long start = System.currentTimeMillis();
Map<Integer, DeviceLibrary> deviceMap = deviceRepo.findAllByIdIn(idList)
.stream()
List<DeviceLibrary> allDevice = dcService.getAllDeviceLibraryList();
Map<Integer, DeviceLibrary> deviceMap = allDevice.stream()
.filter(d -> idList.contains(d.getId()))
.collect(toMap(DeviceLibrary::getId, Function.identity()));
long end = System.currentTimeMillis();
log.info("[核查TEST] 批量查询id集合耗时 {} ms ", end - start);
long start2 = System.currentTimeMillis();
for (String s : statArray) {
if (StringUtils.isEmpty(s)) {
continue;
}
String[] device = s.split("-");
if (device.length < 2 || StringUtils.isEmpty(device[0])) {
continue;
}
int deviceId = Integer.parseInt(device[0]);
int proofResult = Integer.parseInt(device[1]);
DeviceLibrary checkDevice = deviceMap.get(deviceId);
if (Objects.isNull(checkDevice)) {
continue;
}
CheckAreaStatVo checkAreaStatVo;
// 百位数 0/1 待审核 2 无误 3未通过
// 十位数 1 人工 2 自动
// 0缺失1无误2新增3不在库 8已退回 9未检查
int digits = proofResult % 10;
int tens = proofResult / 10 % 10;
int huns = proofResult / 100 % 10;
if (digits == 8) {
checkAreaStatVo = new CheckAreaStatVo(areaName, 1, 1, 3, -1, statId, detailId);
} else if (digits == 9) {
checkAreaStatVo = new CheckAreaStatVo(areaName, 1, 1, 0, 0, statId, detailId);
// 个位数判断自查结果
if (digits == 9) {
checkAreaStatVo = new CheckAreaStatVo(areaName, 1, 1, 0, 10, statId, detailId);
} else if (digits == 3) {
//跳过非在库的统计
continue;
} else if (digits == 1) {
checkAreaStatVo = new CheckAreaStatVo(areaName, 1, 1, 2, 0, statId, detailId);
checkAreaStatVo = new CheckAreaStatVo(areaName, 1, 1, 2, 10, statId, detailId);
} else if (digits == 0) {
checkAreaStatVo = new CheckAreaStatVo(areaName, 0, 1, 2, 1, statId, detailId);
checkAreaStatVo = new CheckAreaStatVo(areaName, 0, 1, 2, 10, statId, detailId);
} else {
checkAreaStatVo = new CheckAreaStatVo(areaName, 1, 1, 2, 1, statId, detailId);
checkAreaStatVo = new CheckAreaStatVo(areaName, 1, 1, 2, 10, statId, detailId);
}
// 百位数判断审核情况 0,1未检查 2是无误 3是未通过
if (huns == 0 || huns == 1) {
checkAreaStatVo.setComSituation(10);
} else if (huns == 2) {
checkAreaStatVo.setComSituation(12);
} else if (huns == 3) {
checkAreaStatVo.setComSituation(13);
}
List<CheckAreaStatVo> areaStatVoList = new ArrayList<>();
......@@ -1482,6 +1936,8 @@ public class DeviceCheckController {
statVoList.add(new CheckDeviceStatVo(checkDevice.getModel(), checkDevice.getName(), 1, areaStatVoList));
}
long end2 = System.currentTimeMillis();
log.info("[核查TEST] 拼装deviceStat数据消耗了 {} ms ", end2 - start2);
return statVoList;
}
......@@ -1501,7 +1957,7 @@ public class DeviceCheckController {
.map(units -> auService.findOne(AuExample.UnitId, units.getUnitId()))
.collect(toList());
List<CheckDeviceStatVo> cdv = deviceRepo.findAll()
List<CheckDeviceStatVo> cdv = dcService.getAllDeviceLibraryList()
.stream()
.filter(dev -> unitNameList.contains(dev.getOwnUnit()))
.filter(dev -> initUnitNames.contains(dev.getOwnUnit()))
......@@ -1552,7 +2008,7 @@ public class DeviceCheckController {
.collect(toList());
Collection<CheckDeviceStatVo> statVos;
List<CheckDeviceStatVo> cds = deviceRepo.findAll()
List<CheckDeviceStatVo> cds = dcService.getAllDeviceLibraryList()
.stream()
.filter(dev -> unitNameList.contains(dev.getOwnUnit()))
// .filter(d->d.getLifeStatus() != 2 & d.getLifeStatus() != 14)
......@@ -1657,7 +2113,7 @@ public class DeviceCheckController {
return new CheckAreaStatVo(finalCityName, actualCount, supposeCount, finalProgress, finalSituation, 0, 0);
}
private void findBySystem(){
private void findBySystem() {
selfCheckController.findBySystem1();
}
......
......@@ -71,6 +71,7 @@ public class DeviceCheckDetail extends BaseEntity {
@ApiModelProperty(value = "本级经办人id(A岗)")
@Column(name = "userA_id")
private Integer userAId;
/**
* 本级审核人id(B岗)
*/
......@@ -78,10 +79,13 @@ public class DeviceCheckDetail extends BaseEntity {
@ApiModelProperty(value = "本级审核人id(B岗)")
@Column(name = "userB_id")
private Integer userBId;
@ApiModelProperty(value = "上级审核人id")
@Column(name = "userC_id")
private Integer userCId;
/**
* 核查时间
*/
@ApiModelProperty(value = "核查时间")
private Date checkTime;
/**
......@@ -128,7 +132,7 @@ public class DeviceCheckDetail extends BaseEntity {
private String remark;
/**
* 预留字段2
* 预留字段2 现在用来记录该自查任务的初始状态号
*/
@ApiModelProperty(value = "预留字段2")
private String var2;
......@@ -139,6 +143,12 @@ public class DeviceCheckDetail extends BaseEntity {
@Column(name = "check_files", columnDefinition = "TEXT")
private String checkFiles;
/**
* 手持终端信息字段
*/
@ApiModelProperty(value = "手持终端信息字段")
private String terminalInfo;
@Transient
private List<FileRet> checkFileList = new ArrayList<>();
......
......@@ -79,6 +79,12 @@ public class CheckDetailVo {
@ApiModelProperty(value = "本级审核人id(B岗)")
private Integer userBId;
/**
* 上级审核人Id
*/
@ApiModelProperty(value = "上级审核人id")
private Integer userCId;
/**
* 核查时间
*/
......@@ -108,6 +114,12 @@ public class CheckDetailVo {
@ApiModelProperty(value = "核查结果")
private String checkResult;
/**
* 手持终端信息字段
*/
@ApiModelProperty(value = "终端信息")
private String terminalInfo;
@ApiModelProperty(value = "在库装备列表")
private List<DeviceInLibVo> devInLibrary;
......
......@@ -6,6 +6,7 @@ import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Collections;
import java.util.List;
/**
......@@ -27,12 +28,12 @@ public class CheckExamDetailVo {
private List<String> userNames;
@ApiModelProperty(name = "需要被检查的区域id")
private Integer unitId;
private List<Integer> unitIds;
@ApiModelProperty(name = "备注")
private String remark;
public CheckExamDetailVo copy(Integer unitId,String remark) {
return new CheckExamDetailVo(this.groupName, this.userNames, unitId, remark);
return new CheckExamDetailVo(this.groupName, this.userNames, Collections.singletonList(unitId), remark);
}
}
......@@ -24,6 +24,10 @@ public interface DeviceCheckDetailDao extends JpaRepository<DeviceCheckDetail, I
@Query("update DeviceCheckDetail o set o.checkDetail=?2,o.checkResult = ?3,o.userAId =?4,o.userBId=?5,o.checkedCount=?6 where o.id=?1")
void updateCheckDetail(Integer id, String checkDetail, String checkResult, int userAId, int userBId, Integer checkedCount);
@Modifying
@Query("update DeviceCheckDetail o set o.checkDetail=?2,o.checkResult = ?3,o.userAId =?4,o.userBId=?5,o.checkedCount=?6,o.terminalInfo=?7 where o.id=?1")
void updateCheckDetailWithT(Integer id, String checkDetail, String checkResult, int userAId, int userBId, Integer checkedCount,String terminalInfo);
/**
* 根据id更新checkDetail 用于专管员B检查
*
......
......@@ -57,7 +57,7 @@ import java.util.stream.Collectors;
import static com.tykj.dev.misc.base.BusinessEnum.CONFIRM_CHECK_DETAIL;
import static com.tykj.dev.misc.base.BusinessEnum.CONFIRM_CHECK_STAT;
import static com.tykj.dev.misc.base.StatusEnum.CHECK_DETAIL_0;
import static com.tykj.dev.misc.base.StatusEnum.CHECK_DETAIL_REGION_0;
import static com.tykj.dev.misc.base.StatusEnum.CHECK_STAT_0;
import static java.util.stream.Collectors.*;
......@@ -210,7 +210,7 @@ public class ConfirmCheckServiceImpl implements ConfirmCheckService, CommandLine
.collect(toList());
statVoList.addAll(cityStatVoList);
// 构建市自查TASK
TaskBto cityDetailTask = new TaskBto(CHECK_DETAIL_0.id, cityUnit.getName() + "自动核查自查", cityStatTask.getId(), addNode(cityStatTask.getNodeIdDetail(), cityStatTask.getId()), CONFIRM_CHECK_DETAIL.id, cityDetail.getId(), cityUnit.getUnitId(), 0);
TaskBto cityDetailTask = new TaskBto(CHECK_DETAIL_REGION_0.id, cityUnit.getName() + "自动核查自查", cityStatTask.getId(), addNode(cityStatTask.getNodeIdDetail(), cityStatTask.getId()), CONFIRM_CHECK_DETAIL.id, cityDetail.getId(), cityUnit.getUnitId(), 0);
cityDetailTask.setCustomInfo("auto");
cityDetailTask = taskService.start(cityDetailTask);
resultIds.get("taskId").add(cityDetailTask.getId());
......@@ -236,7 +236,7 @@ public class ConfirmCheckServiceImpl implements ConfirmCheckService, CommandLine
statVoList.addAll(countyStatVoList);
//构建县自查TASK
TaskBto countyDetailTask = new TaskBto(CHECK_DETAIL_0.id, countyUnit.getName() + "自动核查自查", cityStatTask.getId(), addNode(cityStatTask.getNodeIdDetail(), cityStatTask.getId()), CONFIRM_CHECK_DETAIL.id, countyDetail.getId(), countyUnit.getUnitId(), 0);
TaskBto countyDetailTask = new TaskBto(CHECK_DETAIL_REGION_0.id, countyUnit.getName() + "自动核查自查", cityStatTask.getId(), addNode(cityStatTask.getNodeIdDetail(), cityStatTask.getId()), CONFIRM_CHECK_DETAIL.id, countyDetail.getId(), countyUnit.getUnitId(), 0);
countyDetailTask.setCustomInfo("auto");
countyDetailTask = taskService.start(countyDetailTask);
resultIds.get("taskId").add(countyDetailTask.getId());
......
......@@ -137,7 +137,6 @@ public class ObjTransUtil {
// 构建完成情况参数 未完成数量/总数
// 获得当前节点的子节点总数 = 总数 其中状态为9999的为已完成
//
TaskBto fatherTask = taskService.get(stat.getId(), BusinessEnum.CONFIRM_CHECK_STAT.id);
Integer fatherTaskId = fatherTask.getId();
......
......@@ -76,7 +76,7 @@ public class UseReportFIleServiceImpl implements UseReportFIleService {
params.put("TitleTimeStart",wrodParameter.getTitleTimeStart());
params.put("TitleUnitName",wrodParameter.getTitleUnitName());
String fileName = wrodParameter.getTitleTimeStart()+"至"+wrodParameter.getTitleTimeEnd()+"使用报告" + ".doc";
String templatePath = ResourceUtils.getURL( "classpath:").getPath()+docModel;
String templatePath = ResourceUtils.getURL( "classpath:").getPath()+"docTemplate/"+docModel;
url=url+"report/";
String uuidName=UUID.randomUUID().toString().replace("-", "") + ".doc";
String fileUrl= WordUtil.createWord(templatePath,url,uuidName,params);
......@@ -201,11 +201,10 @@ public class UseReportFIleServiceImpl implements UseReportFIleService {
} catch (FileNotFoundException e) {
log.error(file.getAbsolutePath() + "文件不存在");
e.printStackTrace();
} catch (IOException e) {
//log.error(file.getAbsolutePath() + "文件读取异常");
log.error(file.getAbsolutePath() + "文件用户终止下载");
e.printStackTrace();
} finally {
try {
bs.close();
......
......@@ -63,7 +63,7 @@ public class JavaToPdfHtmlFreeMarker {
freemarkerCfg =new Configuration();
//freemarker的模板目录
try {
freemarkerCfg.setDirectoryForTemplateLoading(new File(ResourceUtils.getURL("classpath:").getPath()));
freemarkerCfg.setDirectoryForTemplateLoading(new File(ResourceUtils.getURL("classpath:").getPath()+"htmlTemplate/"));
} catch (IOException e) {
e.printStackTrace();
}
......@@ -118,8 +118,8 @@ public class JavaToPdfHtmlFreeMarker {
renderer.setDocument(htmlFile);
// 解决中文不显示问题
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont(ResourceUtils.getURL("classpath:").getPath()+"simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
fontResolver.addFont(ResourceUtils.getURL("classpath:").getPath()+"simhei2.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
fontResolver.addFont(ResourceUtils.getURL("classpath:").getPath()+"font/simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
fontResolver.addFont(ResourceUtils.getURL("classpath:").getPath()+"font/simhei2.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
renderer.layout();
renderer.createPDF(os);
PdfReader pdfReader = new PdfReader(os.toByteArray());
......@@ -162,8 +162,8 @@ public class JavaToPdfHtmlFreeMarker {
renderer.setDocument(htmlFile);
// 解决中文不显示问题
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont(ResourceUtils.getURL("classpath:").getPath()+"simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
fontResolver.addFont(ResourceUtils.getURL("classpath:").getPath()+"simhei2.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
fontResolver.addFont(ResourceUtils.getURL("classpath:").getPath()+"font/simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
fontResolver.addFont(ResourceUtils.getURL("classpath:").getPath()+"font/simhei2.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
renderer.layout();
renderer.createPDF(os);
PdfReader pdfReader = new PdfReader(os.toByteArray());
......
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Document</title>
<style>
body{
font-family:SimHei;
}
/*@page{size:297mm 210mm;}<!-- 设置PDF页面大小,此配置只对生成PDF文件有效,不会对页面显示生效 -->*/
@page {
size:297mm 210mm;//纸张大小A4
/*margin: 0.25in;*/
/*-fs-flow-bottom: "footer";*/
/*-fs-flow-left: "left";*/
/*-fs-flow-right: "right";*/
/*border: thin solid black;*/
/*padding: 1em;*/
}
#footer {
font-size: 90%; font-style: italic;
position: absolute; top: 0; left: 0;
-fs-move-to-flow: "footer";
}
#pagenumber:before {
content: counter(page);
}
#pagecount:before {content: counter(pages);
}
.returnTablePrint{
width: 100%;
height: 100%;
overflow: hidden;
color: #000;
cursor: default;
}
.returnTablePrint .content{
width: 100%;
height: 100%;
/* background: url("../../../assets/img/detailsBg.png") no-repeat; */
/*background-size: 100% 100%;*/
/*padding: 30px;*/
/*box-sizing: border-box;*/
}
.returnTablePrint .content>div{
width: 100%;
height: 100%;
background: #fff;
/* padding: 30px; */
box-sizing: border-box;
}
.returnTablePrint .content>p{
width: 100%;
text-align: center;
font-size: 22px;
font-weight: bold;
color: #4a475d;
}
.returnTablePrint .listWrapper{
/* width: 92%; */
margin: 0 auto;
/* padding: 0px 20px 20px 20px; */
height: calc(100% - 70px);
/*padding: 10px 30px;*/
box-sizing: border-box;
}
.returnTablePrint .list{
/* width: 92%; */
margin: 0 auto;
/* padding: 0px 20px 20px 20px; */
/* height: calc(100% - 75px); */
height:calc(100% - 12px)
}
.returnTablePrint .title{
width: 100%;
font-size: 20px;
text-align: center;
position: relative;
margin: 0 0 15px;
padding:0 20px;
box-sizing: border-box;
}
.returnTablePrint .title span:nth-child(2){
font-size: 28px;
color: #000000;
}
.returnTablePrint .title span:nth-child(2) span{
font-size: 20px;
color: #141414;
}
.returnTablePrint .title .number{
font-size: 20px;
color: #646464;
}
.returnTablePrint .other{
width: 100%;
color: #141414;
font-size: 20px;
margin-top: 20px;
padding-left: 50px;
position: relative;
box-sizing: border-box;
margin-bottom: 20px;
}
.returnTablePrint .other>span span:nth-child(2){
display: inline-block;
margin:0 40px 0 10px;
}
.returnTablePrint .listCon{
height: calc(100% - 90px);
border: 1px solid #7f7f7f;
}
.returnTablePrint .line1{
width: 100%;
font-size: 20px;
box-sizing: border-box;
border-bottom: 1px solid #7f7f7f;
color:#000;
line-height: 60px;
}
.returnTablePrint .line1 .sendTo {
display: inline-block;
width: 49%;
text-indent: 20px;
box-sizing: border-box;
/*padding-left: 20px;*/
}
.returnTablePrint .line1 .sendNum {
display: inline-block;
width: 49%;
box-sizing: border-box;
/*padding-left: 20px;*/
}
.returnTablePrint .line1 .sendTo{
border-right: 1px solid #7f7f7f;
}
.returnTablePrint .line1 .sendTo span:nth-child(2),.returnTablePrint .line1 .sendNum span:nth-child(2){
color: #4a475d;
display: inline-block;
margin-left: 20px;
}
.returnTablePrint .line2{
height: 100%;
/* padding: 20px; */
border-bottom: 1px solid #7f7f7f;
}
.returnTablePrint .tableList{
height: 300px;
}
.returnTablePrint .line2>>>.el-table tbody tr:nth-child(odd) {
background-color:#fff;
}
.returnTablePrint .line2>>>.el-table tbody tr:nth-child(even) {
background-color:#fff;
}
.returnTablePrint .line3{
width: 100%;
/* box-sizing: border-box; */
/*height:150px;*/
/*display: flex;*/
/* height:170px; */
/* padding:20px 0 20px 0; */
}
.returnTablePrint .line3 .left {
display: inline-block;
width: 49%;
box-sizing: border-box;
/*padding-left: 20px;*/
position: relative;
}
.returnTablePrint .line3 .right {
display: inline-block;
width: 50%;
box-sizing: border-box;
/*padding-left: 20px;*/
position: relative;
}
.returnTablePrint .line3 .left{
border-right: 1px solid #7f7f7f;
/*padding-bottom: 40px;*/
}
.returnTablePrint .line3 .left>span {
text-indent: 10px;
}
.returnTablePrint .line3 .left>span,.returnTablePrint .line3 .right>span{
display: block;
margin: 15px 0px;
}
.returnTablePrint .line3 .right{
height: 100%;
}
.returnTablePrint .line3 .left>span>span:nth-child(2),.returnTablePrint .line3 .right>span>span:nth-child(2){
display: inline-block;
margin-left: 20px;
}
.returnTablePrint .line3 i{
display: block;
text-align: right;
position: absolute;
right: 5px;
bottom: 5px;
font-style: normal;
}
.returnTablePrint .line3 .right i{
font-style: normal;
/* right: -10px;
bottom: -60px; */
}
.returnTablePrint .line3 i>span>span{
display: block;
}
.returnTablePrint>>>.el-scrollbar__wrap {
overflow-x: hidden;
margin-bottom:0;
}
.returnTablePrint .checkName span:nth-child(2){
color: #4a475d;
display: inline-block;
margin-left: 20px;
}
.returnTablePrint>>>.el-table tbody .cell{
color: #141414;
}
.returnTablePrint .label{
color: #646464;
font-size: 20px;;
}
.returnTablePrint .value{
color: #000;
font-size: 20px;;
}
.returnTablePrint .main-title {
font-size: 28px;
color: #000000;
margin-bottom: 20px;
text-align: center;
}
.returnTablePrint .footer{
display: flex;
justify-content:flex-end;
padding:0 40px;
box-sizing: border-box;
}
.button-submit{
margin-left:50px;
}
table.altrowstable {
width: 100%;
font-size:20px;
color:#141414;
border-width: 0px;
border-color: #a9c6c9;
border-collapse: collapse;
text-align: center;
/*table-layout: fixed;*/
/*word-break:break-all;*/
}
table.altrowstable th {
border-width: 0px;
padding: 8px;
border-style: solid;
border-color: #a9c6c9;
}
table.altrowstable td {
border-width: 0px;
padding: 8px;
border-style: solid;
border-color: #a9c6c9;
/*word-break:break-all;*/
/*word-wrap : break-word;*/
}
.oddrowcolor{
background-color:#fff;
}
.evenrowcolor{
background-color:#fafafa;
}
</style>
</head>
<body>
<!--<div id="footer" style=""> Page <span id="pagenumber"/> of <span id="pagecount"/> </div>-->
<div class="returnTablePrint">
<div class="content">
<div>
<div class="listWrapper">
<div class="list">
<p class="title">
<div class="main-title">
<span>
${title}
</span>
</div>
<div style="width:100%;text-align:left">
<div style="text-align:left;display: inline-block; width: 33%" class="number">
<span class="number">${number}</span>
</div>
<div style="text-align:center;display: inline-block; width: 29%" class="number">
<span >${ul}</span>
</div>
<div style="text-align:right;display: inline-block; width: 33%" class="number">
<span>机密</span>
</div>
</div>
</p>
<div class="listCon">
<div class="line1">
<span class="sendTo">
<span>发往:</span>
<span>${receiveUnit}</span>
</span>
<span class="sendNum">
<span>批复文号:</span>
<span>${replyNum}</span>
</span>
</div>
<div class="line2 tableList">
<table class="altrowstable" id="alternatecolor">
<tr>
<th>型号</th><th>形态</th><th>密级</th><th>应用领域</th><th>数量</th><th>装备序列号</th><th>备注</th>
</tr>
<#list documentDevices as dev>
<tr>
<td>${dev.model}</td><td>${dev.parts}</td><td>${dev.securityClassification}</td><td>${dev.applicationField}</td><td>${dev.count}</td><td>${dev.deviceSerialNumber}</td><td>${dev.remark}</td>
</tr>
</#list>
</table>
</div>
<div class="line3">
<span class="left">
<span>
<span class="label">发件单位:</span>
<span class="value">${senderUnit}</span>
</span>
<span>
<span class="label">签发人:</span>
<span class="value"></span>
</span>
<span>
<span class="label">经办人:</span>
<span class="value"></span>
</span>
<i>
<span style="position: relative;color: #646464">
<span style="margin-bottom: 20px;">(公章)</span>
<span><span style="color: #fff;">1234</span><span style="color: #fff;">0121</span><span style="color: #fff;">0232</span></span>
<div style="position: absolute">
<div id="pos0" ></div>
</div>
</span>
</i>
</span>
<span class="right">
<span>
<span class="label">收件单位:</span>
<span class="value">${receiveUnit}</span>
</span>
<span>
<span class="label">经办人:</span>
<span class="value">xxxxxx</span>
</span>
<span>
<span class="label">经办人:</span>
<span class="value"></span>
</span>
<i>
<span style="color: #646464">
<span style="margin-bottom: 20px;">(公章)</span>
<span><span style="color: #fff;">1234</span><span style="color: #fff;">0121</span><span style="color: #fff;">0232</span></span>
</span>
</i>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--<script type="text/javascript">-->
<!--function altRows(id){-->
<!--if(document.getElementsByTagName){-->
<!--var table = document.getElementById(id);-->
<!--var rows = table.getElementsByTagName("tr");-->
<!--for(i = 0; i < rows.length; i++){-->
<!--if(i % 2 == 0){-->
<!--rows[i].className = "evenrowcolor";-->
<!--}else{-->
<!--rows[i].className = "oddrowcolor";-->
<!--}-->
<!--}-->
<!--}-->
<!--}-->
<!--window.onload=function(){-->
<!--altRows('alternatecolor');-->
<!--}-->
<!--</script>-->
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Document</title>
<style>
body{
font-family:SimHei;
}
/*@page{size:297mm 210mm;}<!-- 设置PDF页面大小,此配置只对生成PDF文件有效,不会对页面显示生效 -->*/
@page {
size:297mm 210mm;
/*margin: 0.25in;*/
/*-fs-flow-bottom: "footer";*/
/*-fs-flow-left: "left";*/
/*-fs-flow-right: "right";*/
/*border: thin solid black;*/
/*padding: 1em;*/
}
#footer {
font-size: 90%; font-style: italic;
position: absolute; top: 0; left: 0;
-fs-move-to-flow: "footer";
}
#pagenumber:before {
content: counter(page);
}
#pagecount:before {content: counter(pages);
}
.returnTablePrint{
width: 100%;
height: 100%;
overflow: hidden;
color: #000;
cursor: default;
}
.returnTablePrint .content{
width: 100%;
height: 100%;
/* background: url("../../../assets/img/detailsBg.png") no-repeat; */
/*background-size: 100% 100%;*/
/*padding: 30px;*/
/*box-sizing: border-box;*/
}
.returnTablePrint .content>div{
width: 100%;
height: 100%;
background: #fff;
/* padding: 30px; */
box-sizing: border-box;
}
.returnTablePrint .content>p{
width: 100%;
text-align: center;
font-size: 22px;
font-weight: bold;
color: #4a475d;
}
.returnTablePrint .listWrapper{
/* width: 92%; */
margin: 0 auto;
/* padding: 0px 20px 20px 20px; */
height: calc(100% - 70px);
/*padding: 10px 30px;*/
box-sizing: border-box;
}
.returnTablePrint .list{
/* width: 92%; */
margin: 0 auto;
/* padding: 0px 20px 20px 20px; */
/* height: calc(100% - 75px); */
height:calc(100% - 12px)
}
.returnTablePrint .title{
width: 100%;
font-size: 20px;
text-align: center;
position: relative;
margin: 0 0 15px;
padding:0 20px;
box-sizing: border-box;
}
.returnTablePrint .title span:nth-child(2){
font-size: 28px;
color: #000000;
}
.returnTablePrint .title span:nth-child(2) span{
font-size: 20px;
color: #141414;
}
.returnTablePrint .title .number{
font-size: 20px;
color: #646464;
}
.returnTablePrint .other{
width: 100%;
color: #141414;
font-size: 20px;
margin-top: 20px;
padding-left: 50px;
position: relative;
box-sizing: border-box;
margin-bottom: 20px;
}
.returnTablePrint .other>span span:nth-child(2){
display: inline-block;
margin:0 40px 0 10px;
}
.returnTablePrint .listCon{
height: calc(100% - 90px);
border: 1px solid #7f7f7f;
}
.returnTablePrint .line1{
width: 100%;
font-size: 20px;
box-sizing: border-box;
border-bottom: 1px solid #7f7f7f;
color:#000;
line-height: 60px;
}
.returnTablePrint .line1 .sendTo {
display: inline-block;
width: 33%;
text-indent: 20px;
box-sizing: border-box;
/*padding-left: 20px;*/
}
.returnTablePrint .line1 .sendNum {
display: inline-block;
width: 33%;
box-sizing: border-box;
text-indent: 20px;
border-left: 1px solid #7f7f7f;
}
.returnTablePrint .line1 .sendTo span:nth-child(2),.returnTablePrint .line1 .sendNum span:nth-child(2){
color: #4a475d;
display: inline-block;
margin-left: 20px;
}
.returnTablePrint .line2{
height: 100%;
/* padding: 20px; */
border-bottom: 1px solid #7f7f7f;
}
.returnTablePrint .tableList{
height: 300px;
}
.returnTablePrint .line2>>>.el-table tbody tr:nth-child(odd) {
background-color:#fff;
}
.returnTablePrint .line2>>>.el-table tbody tr:nth-child(even) {
background-color:#fff;
}
.returnTablePrint .line3{
width: 100%;
/* box-sizing: border-box; */
/*height:150px;*/
/*display: flex;*/
/* height:170px; */
/* padding:20px 0 20px 0; */
}
.returnTablePrint .line3 .left {
display: inline-block;
width: calc(25% - 3px);
box-sizing: border-box;
/*padding-left: 20px;*/
position: relative;
}
.returnTablePrint .line3 .left{
border-right: 1px solid #7f7f7f;
/*padding-bottom: 40px;*/
}
.returnTablePrint .line3 .left:last-child{
border-right: none;
/*padding-bottom: 40px;*/
}
.returnTablePrint .line3 .left>span {
text-indent: 10px;
}
.returnTablePrint .line3 .left>span{
display: block;
margin: 15px 0px;
}
.returnTablePrint .line3 .left>span>span:nth-child(2){
display: inline-block;
margin-left: 20px;
}
.returnTablePrint .line3 i{
display: block;
text-align: right;
position: absolute;
right: 5px;
bottom: 5px;
font-style: normal;
}
.returnTablePrint .line3 i>span>span{
display: block;
}
.returnTablePrint>>>.el-scrollbar__wrap {
overflow-x: hidden;
margin-bottom:0;
}
.returnTablePrint .checkName span:nth-child(2){
color: #4a475d;
display: inline-block;
margin-left: 20px;
}
.returnTablePrint>>>.el-table tbody .cell{
color: #141414;
}
.returnTablePrint .label{
color: #646464;
font-size: 20px;;
}
.returnTablePrint .value{
color: #000;
font-size: 20px;;
}
.returnTablePrint .main-title {
font-size: 28px;
color: #000000;
margin-bottom: 20px;
text-align: center;
}
.returnTablePrint .footer{
display: flex;
justify-content:flex-end;
padding:0 40px;
box-sizing: border-box;
}
.button-submit{
margin-left:50px;
}
table.altrowstable {
width: 100%;
font-size:20px;
color:#141414;
border-width: 0px;
border-color: #a9c6c9;
border-collapse: collapse;
text-align: center;
/*table-layout: fixed;*/
/*word-break:break-all;*/
}
table.altrowstable th {
border-width: 0px;
padding: 8px;
border-style: solid;
border-color: #a9c6c9;
}
table.altrowstable td {
border-width: 0px;
padding: 8px;
border-style: solid;
border-color: #a9c6c9;
/*word-break:break-all;*/
/*word-wrap : break-word;*/
}
.oddrowcolor{
background-color:#fff;
}
.evenrowcolor{
background-color:#fafafa;
}
tr:nth-child(odd) {
background: #fafafa;
}
</style>
</head>
<body>
<!--<div id="footer" style=""> Page <span id="pagenumber"/> of <span id="pagecount"/> </div>-->
<div class="returnTablePrint">
<div class="content">
<div>
<div class="listWrapper">
<div class="list">
<p class="title">
<div class="main-title">
<span>
${title}
</span>
</div>
<div style="width:100%;text-align:left">
<div style="text-align:left;display: inline-block; width: 33%" class="number">
<span class="number">${number}</span>
</div>
<div style="text-align:center;display: inline-block; width: 29%" class="number">
<span >${ul}</span>
</div>
<div style="text-align:right;display: inline-block; width: 33%" class="number">
<span>机密</span>
</div>
</div>
</p>
<div class="listCon">
<div class="line1">
<span class="sendTo">
<span>销毁单位:</span>
<span>${receiveUnit}</span>
</span>
<span class="sendNum">
<span>型号:</span>
<span>${replyNum}</span>
</span>
<span class="sendNum">
<span>名称:</span>
<span>${replyNum}</span>
</span>
</div>
<div class="line2 tableList">
<table class="altrowstable" id="alternatecolor">
<tr>
<th>型号</th><th>形态</th>><th>密级</th><th>应用领域</th><th>数量</th><th>装备序列号</th><th>备注</th>
</tr>
<#list documentDevices as dev>
<tr>
<td>${dev.model}</td><td>${dev.parts}</td><td>${dev.securityClassification}</td><td>${dev.applicationField}</td><td>${dev.count}</td><td>${dev.deviceSerialNumber}</td><td>${dev.remark}</td>
</tr>
</#list>
</table>
</div>
<div class="line3">
<span class="left">
<span>
<span class="label">监销人:</span>
<span class="value">${senderUnit}</span>
</span>
</span>
<span class="left">
<span>
<span class="label">主管领导:</span>
<span class="value">${senderUnit}</span>
</span>
</span>
<span class="left">
<span>
<span class="label">经办人:</span>
<span class="value">${senderUnit}</span>
</span>
</span>
<span class="left">
<span>
<span class="label">承办人:</span>
<span class="value">${senderUnit}</span>
</span>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript">
function altRows(id){
if(document.getElementsByTagName){
var table = document.getElementById(id);
var rows = table.getElementsByTagName("tr");
for(i = 0; i < rows.length; i++){
if(i % 2 == 0){
rows[i].className = "evenrowcolor";
}else{
rows[i].className = "oddrowcolor";
}
}
}
}
window.onload=function(){
altRows('alternatecolor');
}
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Document</title>
<style>
body{
font-family:SimHei;
}
/*@page{size:297mm 210mm;}<!-- 设置PDF页面大小,此配置只对生成PDF文件有效,不会对页面显示生效 -->*/
@page {
size:210mm 297mm;
/*margin: 0.25in;*/
/*-fs-flow-bottom: "footer";*/
/*-fs-flow-left: "left";*/
/*-fs-flow-right: "right";*/
/*border: thin solid black;*/
/*padding: 1em;*/
}
#footer {
font-size: 90%; font-style: italic;
position: absolute; top: 0; left: 0;
-fs-move-to-flow: "footer";
}
#pagenumber:before {
content: counter(page);
}
#pagecount:before {content: counter(pages);
}
.returnTablePrint{
width: 100%;
height: 100%;
overflow: hidden;
color: #000;
cursor: default;
}
.returnTablePrint .content{
width: 100%;
height: 100%;
/* background: url("../../../assets/img/detailsBg.png") no-repeat; */
/*background-size: 100% 100%;*/
/*padding: 30px;*/
/*box-sizing: border-box;*/
}
.returnTablePrint .content>div{
width: 100%;
height: 100%;
background: #fff;
/* padding: 30px; */
box-sizing: border-box;
}
.returnTablePrint .content>p{
width: 100%;
text-align: center;
font-size: 22px;
font-weight: bold;
color: #4a475d;
}
.returnTablePrint .listWrapper{
/* width: 92%; */
margin: 0 auto;
/* padding: 0px 20px 20px 20px; */
height: calc(100% - 70px);
/*padding: 10px 30px;*/
box-sizing: border-box;
}
.returnTablePrint .list{
/* width: 92%; */
margin: 0 auto;
/* padding: 0px 20px 20px 20px; */
/* height: calc(100% - 75px); */
height:calc(100% - 12px)
}
.returnTablePrint .title{
width: 100%;
font-size: 20px;
text-align: center;
position: relative;
margin: 0 0 15px;
padding:0 20px;
box-sizing: border-box;
}
.returnTablePrint .title span:nth-child(2){
font-size: 28px;
color: #000000;
}
.returnTablePrint .title span:nth-child(2) span{
font-size: 20px;
color: #141414;
}
.returnTablePrint .main-title {
font-size: 28px;
color: #000000;
margin-bottom: 20px;
text-align: center;
}
table.altrowstable {
width: 100%;
font-size:20px;
color:#141414;
border-width: 0px;
border-color: #a9c6c9;
border-collapse: collapse;
text-align: center;
/*table-layout: fixed;*/
/*word-break:break-all;*/
}
table.altrowstable th {
border-width: 0px;
padding: 8px;
border-style: solid;
border-color: #a9c6c9;
}
table.altrowstable td {
border-width: 0px;
padding: 8px;
border-style: solid;
border-color: #a9c6c9;
/*word-break:break-all;*/
/*word-wrap : break-word;*/
}
.oddrowcolor{
background-color:#fff;
}
.evenrowcolor{
background-color:#fafafa;
}
.person{
color: #4a475b;
text-align: right;
font-size: 18pt;
}
.person > span{
display: inline-block;
margin-right: 30pt;
}
tr:nth-child(odd) {
background: #fafafa;
}
</style>
</head>
<body>
<!--<div id="footer" style=""> Page <span id="pagenumber"/> of <span id="pagecount"/> </div>-->
<div class="returnTablePrint">
<div class="content">
<div>
<div class="listWrapper">
<div class="list">
<p class="title">
<div class="main-title">
<span>
${title}
</span>
</div>
</p>
<table class="altrowstable" id="alternatecolor">
<tr>
<th>序号</th><th>型号</th><th>形态</th><th>密级</th><th>应用领域</th><th>装备序列号</th>
</tr>
<#list documentDevices as dev>
<tr>
<td>${dev.model}</td><td>${dev.model}</td><td>${dev.parts}</td><td>${dev.category}</td><td>${dev.securityClassification}</td><td>${dev.applicationField}</td>
</tr>
</#list>
</table>
</div>
<p class="person" style="margin-top: 50px">
<span style="width: 200px;text-align: left">经办人:</span>
<span style="width: 200px;text-align: left">审核人:</span>
</p>
</div>
</div>
</div>
</div>
<!--<script type="text/javascript">-->
<!--function altRows(id){-->
<!--if(document.getElementsByTagName){-->
<!--var table = document.getElementById(id);-->
<!--var rows = table.getElementsByTagName("tr");-->
<!--for(i = 0; i < rows.length; i++){-->
<!--if(i % 2 == 0){-->
<!--rows[i].className = "evenrowcolor";-->
<!--}else{-->
<!--rows[i].className = "oddrowcolor";-->
<!--}-->
<!--}-->
<!--}-->
<!--}-->
<!--window.onload=function(){-->
<!--altRows('alternatecolor');-->
<!--}-->
<!--</script>-->
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Document</title>
<style>
body{
font-family:SimHei;
margin: 0;
padding: 0;
}
/*@page{size:297mm 210mm;}<!-- 设置PDF页面大小,此配置只对生成PDF文件有效,不会对页面显示生效 -->*/
@page {
size:297mm 210mm;
}
.bottomTxt {
text-align: center;
font-size: 10px;
color: #646464;
height: 10px;
line-height: 10px;
}
.returnTablePrint{
width: 100%;
height: 100%;
overflow: hidden;
color: #000;
cursor: default;
}
.returnTablePrint .content{
width: 100%;
height: 100%;
}
.returnTablePrint .content>div{
width: 100%;
height: 100%;
background: #fff;
/* padding: 30px; */
box-sizing: border-box;
}
/* .returnTablePrint .content>p{
width: 100%;
text-align: center;
font-size: 22px;
font-weight: bold;
color: #4a475d;
} */
.returnTablePrint .listWrapper{
/*margin: 0 auto;*/
/* height: calc(100% - 40px); */
box-sizing: border-box;
}
.returnTablePrint .list{
/*margin: 0 auto;*/
height:calc(100% - 12px)
}
.returnTablePrint .title{
width: 100%;
font-size: 22px;
text-align: center;
position: relative;
/* margin: 0 0 15px; */
padding:0 20px;
box-sizing: border-box;
}
/* .returnTablePrint .title span:nth-child(2){
font-size: 28px;
color: #000000;
}
.returnTablePrint .title span:nth-child(2) span{
font-size: 20px;
color: #141414;
} */
.returnTablePrint .title .number{
font-size: 12px;
color: #646464;
}
/* .returnTablePrint .other{
width: 100%;
color: #141414;
font-size: 20px;
margin-top: 20px;
padding-left: 50px;
position: relative;
box-sizing: border-box;
margin-bottom: 20px;
}
.returnTablePrint .other>span span:nth-child(2){
display: inline-block;
margin:0 40px 0 10px;
} */
.returnTablePrint .listCon{
height: 100%;
border: 1px solid #7f7f7f;
}
.returnTablePrint .line1{
width: 100%;
font-size: 12px;
box-sizing: border-box;
border-bottom: 1px solid #7f7f7f;
color:#000;
line-height: 20px;
}
.returnTablePrint .line1 .sendTo {
display: inline-block;
width: 49%;
text-indent: 5px;
box-sizing: border-box;
/*padding-left: 20px;*/
}
.returnTablePrint .line1 .sendNum {
display: inline-block;
width: 49%;
box-sizing: border-box;
/*padding-left: 20px;*/
}
.returnTablePrint .line1 .sendTo{
border-right: 1px solid #7f7f7f;
}
.returnTablePrint .line1 .sendTo span:nth-child(2),.returnTablePrint .line1 .sendNum span:nth-child(2){
color: #4a475d;
display: inline-block;
margin-left: 5px;
}
.returnTablePrint .line2{
height: 100%;
/* padding: 20px; */
border-bottom: 1px solid #7f7f7f;
}
.returnTablePrint .tableList{
height: 546px;
}
.returnTablePrint .line2>>>.el-table tbody tr:nth-child(odd) {
background-color:#fff;
}
.returnTablePrint .line2>>>.el-table tbody tr:nth-child(even) {
background-color:#fff;
}
.returnTablePrint .line3{
width: 100%;
height:70px;
/* box-sizing: border-box; */
/*height:150px;*/
/*display: flex;*/
/* height:170px; */
/* padding:20px 0 20px 0; */
}
.returnTablePrint .line3 .left {
display: inline-block;
width: 25%;
box-sizing: border-box;
/*padding-left: 20px;*/
position: relative;
line-height: 70px;
}
.returnTablePrint .line3 .left{
border-right: 1px solid #7f7f7f;
/*padding-bottom: 40px;*/
}
.returnTablePrint .line3 .left:last-child{
border-right: none;
/*padding-bottom: 40px;*/
}
.returnTablePrint .line3 .left>span{
display: block;
/* margin: 15px 0px; */
}
.returnTablePrint .line3 .left>span>span:nth-child(2){
display: inline-block;
margin-left: 10px;
}
.returnTablePrint>>>.el-scrollbar__wrap {
overflow-x: hidden;
margin-bottom:0;
}
.returnTablePrint .checkName span:nth-child(2){
color: #4a475d;
display: inline-block;
margin-left: 20px;
}
.returnTablePrint>>>.el-table tbody .cell{
color: #141414;
}
.returnTablePrint .label{
color: #646464;
font-size: 12px;
}
.returnTablePrint .value{
color: #000;
font-size: 12px;
}
.returnTablePrint .main-title {
font-size: 20px;
color: #000000;
line-height: 20px;
text-align: center;
}
.returnTablePrint .footer{
display: flex;
justify-content:flex-end;
padding:0 40px;
box-sizing: border-box;
}
.button-submit{
margin-left:50px;
}
table.altrowstable {
width: 100%;
font-size: 11px;
color:#141414;
border-width: 0px;
border-color: #a9c6c9;
border-collapse: collapse;
text-align: center;
table-layout: fixed;
word-break: break-all;
}
table.altrowstable th {
border-width: 0px;
padding: 5px;
border-style: solid;
border-color: #a9c6c9;
background-color: #dedede;
}
table.altrowstable td {
border-width: 0px;
padding: 5px;
/*border-style: solid;*/
/*border-color: #a9c6c9;*/
word-break: break-all;
word-wrap: break-word;
border-bottom: 1px solid #bebebe;
}
.oddrowcolor{
background-color:#fff;
}
.evenrowcolor{
background-color:#fafafa;
}
/*tr:nth-child(odd) {*/
/* background: #fafafa;*/
/*}*/
</style>
</head>
<body>
<div class="returnTablePrint">
<div class="content">
<div>
<div class="listWrapper">
<div class="list">
<div class="title">
<div class="main-title">
<span>
${title}
</span>
</div>
<div style="width:100%;text-align:left">
<div style="text-align:left;display: inline-block; width: 32%" class="number">
<span class="number">时间:${number}</span>
</div>
<div style="text-align:center;display: inline-block; width: 32%" class="number">
<span></span>
</div>
<div style="text-align:right;display: inline-block; width: 28%" class="number">
<span>机密</span>
</div>
</div>
</div>
<div class="listCon">
<!-- <div class="line1">
<span class="sendTo">
<span>发往:</span>
<span>${receiveUnit}</span>
</span>
<span class="sendNum">
<span>批复文号:</span>
<span>${replyNum}</span>
</span>
</div> -->
<div class="line2 tableList">
<table class="altrowstable" id="alternatecolor">
<tr>
<th>序号</th><th>型号</th><th>名称</th><th>在库</th><th>维修</th><th>报废</th><th>清退</th><th>其他</th><th style="width: 300px;">装备序列号</th>
</tr>
<#list documentDevices as dev>
<tr>
<td>
<#if dev.code != 0>
${dev.code}
</#if>
</td>
<td>${dev.model}</td><td>${dev.name}</td><td>${dev.inLibrary}</td><td>${dev.maintenance}</td><td>${dev.scrap}</td><td>${dev.repel}</td><td>${dev.other}</td>
<td>
<#if dev.count != 0>
${dev.count}
</#if>
</td>
<td>${dev.deviceSerialNumber}</td>
</tr>
</#list>
</table>
</div>
<div class="line3" style="position: relative;">
<span class="left">
<span>
<span style="position: absolute; top: -20px; left: 8px;" class="label">监销人:</span>
<span class="value"></span>
</span>
</span>
<span class="left">
<span>
<span style="position: absolute; top: -20px; left: 8px;" class="label" >主管领导:</span>
<span class="value"></span>
</span>
</span>
<span class="left" style="width: 23%;">
<span>
<span style="position: absolute; top: -20px; left: 8px;" class="label">经办人:</span>
<span class="value"></span>
</span>
</span>
<span class="left" style="width: 23%;">
<span>
<span style="position: absolute; top: -20px; left: 8px;" class="label" >承办人:</span>
<span class="value"></span>
</span>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
<p class="bottomTxt">第1页/共1页</p >
</div>
<!--<script type="text/javascript">-->
<!--function altRows(id){-->
<!--if(document.getElementsByTagName){-->
<!--var table = document.getElementById(id);-->
<!--var rows = table.getElementsByTagName("tr");-->
<!--for(i = 0; i < rows.length; i++){-->
<!--if(i % 2 == 0){-->
<!--rows[i].className = "evenrowcolor";-->
<!--}else{-->
<!--rows[i].className = "oddrowcolor";-->
<!--}-->
<!--}-->
<!--}-->
<!--}-->
<!--window.onload=function(){-->
<!--altRows('alternatecolor');-->
<!--}-->
<!--</script>-->
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Title</title>
<style>
body{
font-family:SimHei;
}
.blue{
color: blue;
}
</style>
</head>
<body>
<div class="blue">
你好,${name}
</div>
<div>
<#list userList as user>
用户名:${user.name}
密 码:${user.code}
年 龄: ${user.age}
</#list>
</div>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Document</title>
<style>
body{
font-family:SimHei;
}
.returnTablePrint{
width: 100%;
height: 100%;
overflow: hidden;
color: #000;
cursor: default;
}
.returnTablePrint .content{
height: calc(100% - 70px);
width: 100%;
/* background: url("../../../assets/img/detailsBg.png") no-repeat; */
background-size: 100% 100%;
padding: 30px;
box-sizing: border-box;
}
.returnTablePrint .content>div{
width: 100%;
height: 100%;
background: #fff;
/* padding: 30px; */
box-sizing: border-box;
}
.returnTablePrint .content>p{
width: 100%;
text-align: center;
font-size: 22px;
font-weight: bold;
color: #4a475d;
}
/*打印样式*/
.returnTablePrint .listWrapper{
/* width: 92%; */
margin: 0 auto;
/* padding: 0px 20px 20px 20px; */
height: calc(100% - 70px);
padding:30px;
box-sizing: border-box;
}
.returnTablePrint .list{
/* width: 92%; */
margin: 0 auto;
/* padding: 0px 20px 20px 20px; */
/* height: calc(100% - 75px); */
height:calc(100% - 12px)
}
.returnTablePrint .title{
width: 100%;
font-size: 20px;
text-align: center;
position: relative;
margin: 15px 0;
padding:0 20px;
box-sizing: border-box;
}
.returnTablePrint .title span:nth-child(2){
font-size: 28px;
color: #000000;
}
.returnTablePrint .title span:nth-child(2) span{
font-size: 20px;
color: #141414;
}
.returnTablePrint .title .number{
font-size: 20px;
color: #646464;
}
.returnTablePrint .other{
width: 100%;
color: #141414;
font-size: 20px;
margin-top: 20px;
padding-left: 50px;
position: relative;
box-sizing: border-box;
margin-bottom: 20px;
}
.returnTablePrint .other>span span:nth-child(2){
display: inline-block;
margin:0 40px 0 10px;
}
.returnTablePrint .listCon{
height: calc(100% - 90px);
border: 1px solid #7f7f7f;
}
.returnTablePrint .line1{
width: 100%;
font-size: 20px;
box-sizing: border-box;
border-bottom: 1px solid #7f7f7f;
color:#000;
line-height: 60px;
}
.returnTablePrint .line1 .sendTo {
display: inline-block;
width: 50%;
box-sizing: border-box;
padding-left: 20px;
}
.returnTablePrint .line1 .sendNum {
display: inline-block;
width: 49%;
box-sizing: border-box;
padding-left: 20px;
}
.returnTablePrint .line1 .sendTo{
border-right: 1px solid #7f7f7f;
}
.returnTablePrint .line1 .sendTo span:nth-child(2),.returnTablePrint .line1 .sendNum span:nth-child(2){
color: #4a475d;
display: inline-block;
margin-left: 20px;
}
.returnTablePrint .line2{
height: 100%;
/* padding: 20px; */
border-bottom: 1px solid #7f7f7f;
}
.returnTablePrint .tableList{
height: 300px;
}
.returnTablePrint .line2>>>.el-table tbody tr:nth-child(odd) {
background-color:#fff;
}
.returnTablePrint .line2>>>.el-table tbody tr:nth-child(even) {
background-color:#fff;
}
.returnTablePrint .line3{
width: 100%;
/* box-sizing: border-box; */
height:150px;
display: flex;
/* height:170px; */
/* padding:20px 0 20px 0; */
}
.returnTablePrint .line3 .left,.returnTablePrint .line3 .right{
display: inline-block;
width: 50%;
box-sizing: border-box;
padding-left: 20px;
position: relative;
}
.returnTablePrint .line3 .left{
border-right: 1px solid #7f7f7f;
padding-bottom: 40px;
}
.returnTablePrint .line3 .left>span,.returnTablePrint .line3 .right>span{
display: block;
margin: 15px 0px;
}
.returnTablePrint .line3 .right{
height: 100%;
}
.returnTablePrint .line3 .left>span>span:nth-child(2),.returnTablePrint .line3 .right>span>span:nth-child(2){
display: inline-block;
margin-left: 20px;
}
.returnTablePrint .line3 i{
display: block;
text-align: right;
position: absolute;
right: 20px;
bottom: 20px;
}
.returnTablePrint .line3 .right i{
/* right: -10px;
bottom: -60px; */
}
.returnTablePrint .line3 i>span>span{
display: block;
}
.returnTablePrint>>>.el-scrollbar__wrap {
overflow-x: hidden;
margin-bottom:0;
}
.returnTablePrint .checkName span:nth-child(2){
color: #4a475d;
display: inline-block;
margin-left: 20px;
}
.returnTablePrint>>>.el-table tbody .cell{
color: #141414;
}
.returnTablePrint .label{
color: #646464;
font-size: 20px;;
}
.returnTablePrint .value{
color: #000;
font-size: 20px;;
}
.returnTablePrint .main-title {
font-size: 28px;
color: #000000;
margin-bottom: 20px;
text-align: center;
}
.returnTablePrint .footer{
display: flex;
justify-content:flex-end;
padding:0 40px;
box-sizing: border-box;
}
.button-submit{
margin-left:50px;
}
table.altrowstable {
width: 100%;
font-size:20px;
color:#141414;
border-width: 0px;
border-color: #a9c6c9;
border-collapse: collapse;
text-align: center;
}
table.altrowstable th {
border-width: 0px;
padding: 8px;
border-style: solid;
border-color: #a9c6c9;
}
table.altrowstable td {
border-width: 0px;
padding: 8px;
border-style: solid;
border-color: #a9c6c9;
}
.oddrowcolor{
background-color:#fff;
}
.evenrowcolor{
background-color:#fafafa;
}
</style>
</head>
<body>
<div>
阿苏妲己卡迪拉克家啊顺利到家啦睡觉啦
</div>
<div class="returnTablePrint">
<div class="content">
<div>
<div class="listWrapper">
<div class="list">
<p class="title">
<div class="main-title">
<span>
密码装备清退单
</span>
</div>
<div style="width:100%;align-items: center;display: flex;">
<div style="text-align:left;flex: 1;" class="number">
<span class="number">No:第37463473647号</span>
</div>
<div style="text-align:center;flex: 1;" class="number">
<span >(第一联XXX单位)</span>
</div>
<div style="text-align:right;flex: 1;" class="number">
<span>机密</span>
</div>
</div>
</p>
<div class="listCon">
<div class="line1">
<span class="sendTo">
<span>发往:</span>
<span>XXXXXXX</span>
</span>
<span class="sendNum">
<span>批复文号:</span>
<span>XXXXXXX</span>
</span>
</div>
<div class="line2 tableList">
<table class="altrowstable" id="alternatecolor">
<tr>
<th>型号</th><th>部件</th><th>类型</th><th>密级</th><th>应用领域</th><th>数量</th><th>装备序列号</th><th>生产序列号</th><th>备注</th>
</tr>
<tr>
<td>占金名</td><td>占金名</td><td>占金名</td><td>占金名</td><td>占金名</td><td>1</td><td>占金名</td><td>占金名</td><td>占金名</td>
</tr>
<tr>
<td>占金名1</td><td>占金名1</td><td>占金名1</td><td>占金名1</td><td>占金名1</td><td>1</td><td>占金名1</td><td>占金名1</td><td>占金名1</td>
</tr>
<tr>
<td>占金名2</td><td>占金名2</td><td>占金名2</td><td>占金名2</td><td>占金名2</td><td>1</td><td>占金名2</td><td>占金名2</td><td>占金名2</td>
</tr>
用户名:占金名
密 码:1
年 龄: 19
用户名:占金名1
密 码:1
年 龄: 19
用户名:占金名2
密 码:1
年 龄: 19
</table>
</div>
<div class="line3">
<span class="left">
<span>
<span class="label">发件单位:</span>
<span class="value">xxx</span>
</span>
<span>
<span class="label">签发人:</span>
<span class="value">xxxxx</span>
</span>
<span>
<span class="label">经办人:</span>
<span class="value">xxxxx</span>
</span>
<i>
<span style="position: relative;color: #646464">
<span>(公章)</span>
<span>1221年01月02</span>
<div style="position: absolute">
<div id="pos0" ></div>
</div>
</span>
</i>
</span>
<span class="right">
<span>
<span class="label">收件单位:</span>
<span class="value">xxxxxxxxxx</span>
</span>
<span>
<span class="label">经办人:</span>
<span class="value"></span>
</span>
<i>
<span style="color: #646464">
<span>(公章)</span>
<span>1221年01月02</span>
</span>
</i>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--<script type="text/javascript">-->
<!--function altRows(id){-->
<!--if(document.getElementsByTagName){-->
<!--var table = document.getElementById(id);-->
<!--var rows = table.getElementsByTagName("tr");-->
<!--for(i = 0; i < rows.length; i++){-->
<!--if(i % 2 == 0){-->
<!--rows[i].className = "evenrowcolor";-->
<!--}else{-->
<!--rows[i].className = "oddrowcolor";-->
<!--}-->
<!--}-->
<!--}-->
<!--}-->
<!--window.onload=function(){-->
<!--altRows('alternatecolor');-->
<!--}-->
<!--</script>-->
</body>
</html>
\ No newline at end of file
No preview for this file type
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论