feat: There is no way the,buss
This commit is contained in:
@@ -165,6 +165,38 @@
|
||||
<artifactId>spring-boot-devtools</artifactId>
|
||||
<optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
|
||||
</dependency>
|
||||
<!-- poi -->
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi</artifactId>
|
||||
<version>4.1.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi-ooxml</artifactId>
|
||||
<version>4.1.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi-ooxml-schemas</artifactId>
|
||||
<version>4.1.2</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>xerces</groupId>
|
||||
<artifactId>xercesImpl</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.poi</groupId>
|
||||
<artifactId>poi-scratchpad</artifactId>
|
||||
<version>4.1.2</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.deepoove</groupId>
|
||||
<artifactId>poi-tl</artifactId>
|
||||
<version>1.9.1</version>
|
||||
</dependency>
|
||||
<!-- Test -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ import java.util.Map;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* OA日志表 前端控制器
|
||||
* 流程评分历史表 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author super_liu
|
||||
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
package com.ydw.bat.wkflow.business_main.datas.controller;
|
||||
|
||||
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessEvaluationHis;
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessModelHis;
|
||||
import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessEvaluationHisService;
|
||||
import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessModelHisService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 流程模块历史表 前端控制器
|
||||
* </p>
|
||||
*
|
||||
* @author super_liu
|
||||
* @since 2021-09-17
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/busProcessModel")
|
||||
public class BusProcessModelHisController {
|
||||
|
||||
@Autowired
|
||||
private IBusProcessModelHisService busProcessModelHisService;
|
||||
|
||||
@GetMapping("/processModelHisOne")
|
||||
public BusProcessModelHis modelHisOne(String pid,String taskId) {
|
||||
BusProcessModelHis modelHisOne = busProcessModelHisService.modelHisOne(pid,taskId);
|
||||
return modelHisOne;
|
||||
}
|
||||
|
||||
@GetMapping("/processModelHisList")
|
||||
public List<BusProcessModelHis> evaluationHisList(String pid) {
|
||||
List<BusProcessModelHis> processModelHisList = busProcessModelHisService.modelHisList(pid);
|
||||
return processModelHisList;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -14,7 +14,7 @@ import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* OA日志表
|
||||
* 流程评分历史表
|
||||
* </p>
|
||||
*
|
||||
* @author super_liu
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
package com.ydw.bat.wkflow.business_main.datas.entity;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 流程模块历史表
|
||||
* </p>
|
||||
*
|
||||
* @author super_liu
|
||||
* @since 2021-09-17
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = false)
|
||||
@Accessors(chain = true)
|
||||
@ApiModel(value="BusProcessModelHis对象", description="流程模块历史表")
|
||||
public class BusProcessModelHis implements Serializable {
|
||||
|
||||
private static final long serialVersionUID=1L;
|
||||
|
||||
@ApiModelProperty(value = "主键")
|
||||
@TableId(value = "ID", type = IdType.UUID)
|
||||
private String id;
|
||||
|
||||
@ApiModelProperty(value = "标准id")
|
||||
@TableField("STAND_ID")
|
||||
private String standId;
|
||||
|
||||
@ApiModelProperty(value = "处理人")
|
||||
@TableField("USER_ID")
|
||||
private String userId;
|
||||
|
||||
@ApiModelProperty(value = "信息")
|
||||
@TableField("MESG")
|
||||
private String mesg;
|
||||
|
||||
@ApiModelProperty(value = "节点信息")
|
||||
@TableField("TASK_INFO")
|
||||
private String taskInfo;
|
||||
|
||||
@ApiModelProperty(value = "任务id")
|
||||
@TableField("TASK_ID")
|
||||
private String taskId;
|
||||
|
||||
@ApiModelProperty(value = "流程实例id")
|
||||
@TableField("P_ID")
|
||||
private String pId;
|
||||
|
||||
@ApiModelProperty(value = "流程名称")
|
||||
@TableField("PRC_NAME")
|
||||
private String prcName;
|
||||
|
||||
@ApiModelProperty(value = "创建时间")
|
||||
@TableField("CREATE_TIME")
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private String createTime;
|
||||
|
||||
@ApiModelProperty(value = "更新时间")
|
||||
@TableField("UPDATE_TIME")
|
||||
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private String updateTime;
|
||||
|
||||
@ApiModelProperty(value = "onlyOffice 是否编辑 0 未编辑 1 已编辑")
|
||||
@TableField("EDIT_STATUS")
|
||||
private String editStatus;
|
||||
|
||||
@ApiModelProperty(value = "onlyOffice 编辑文件存储路径")
|
||||
@TableField("EDIT_FILE_PATH")
|
||||
private String editFilePath;
|
||||
|
||||
@ApiModelProperty(value = "onlyOffice 编辑类型 node 节点编辑 count 汇总编辑")
|
||||
@TableField("EDIT_TYPE")
|
||||
private String editType;
|
||||
|
||||
@ApiModelProperty(value = "逻辑状态")
|
||||
@TableField("FLAG")
|
||||
private String flag;
|
||||
|
||||
@ApiModelProperty(value = "onlyOffice 访问编辑文件全路径")
|
||||
@TableField(exist = false)
|
||||
private String downLoadUrl;
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
package com.ydw.bat.wkflow.business_main.datas.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessEvaluationHis;
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessModelHis;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 流程模块历史表 Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author super_liu
|
||||
* @since 2021-09-17
|
||||
*/
|
||||
@Repository
|
||||
public interface BusProcessModelHisMapper extends BaseMapper<BusProcessModelHis> {
|
||||
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
package com.ydw.bat.wkflow.business_main.datas.service;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessEvaluationHis;
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessModelHis;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 流程模块历史表 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author super_liu
|
||||
* @since 2021-09-17
|
||||
*/
|
||||
public interface IBusProcessModelHisService extends IService<BusProcessModelHis> {
|
||||
|
||||
BusProcessModelHis modelHisOne(String pid,String taskId);
|
||||
|
||||
List<BusProcessModelHis> modelHisList(String pid);
|
||||
|
||||
String saveBussModelFile(String pid, String taskId);
|
||||
|
||||
String mergeModelFile(String pid, String taskId,String fileSuffix);
|
||||
|
||||
void saveBussTemplateFile(JSONObject object, String pid);
|
||||
}
|
||||
+155
@@ -0,0 +1,155 @@
|
||||
package com.ydw.bat.wkflow.business_main.datas.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessEvaluationHis;
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessModelHis;
|
||||
import com.ydw.bat.wkflow.business_main.datas.mapper.BusProcessEvaluationHisMapper;
|
||||
import com.ydw.bat.wkflow.business_main.datas.mapper.BusProcessModelHisMapper;
|
||||
import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessEvaluationHisService;
|
||||
import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessModelHisService;
|
||||
import com.ydw.bat.wkflow.listener.bussLibrary.Utils.PoiUtil;
|
||||
import com.ydw.bat.wkflow.listener.bussLibrary.Utils.PoiWord;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 流程模块历史表 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author super_liu
|
||||
* @since 2021-09-17
|
||||
*/
|
||||
@Service
|
||||
public class BusProcessModelHisServiceImpl extends ServiceImpl<BusProcessModelHisMapper, BusProcessModelHis> implements IBusProcessModelHisService {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(BusProcessModelHisServiceImpl.class);
|
||||
|
||||
|
||||
@Value("${buss.edit.file.path}")
|
||||
private String filePath;//文件存储路径
|
||||
|
||||
/**
|
||||
* 文件下载路径
|
||||
*/
|
||||
@Value("${buss.down.file.path}")
|
||||
private String downloadUrl;
|
||||
|
||||
@Override
|
||||
public String mergeModelFile(String pid, String taskId,String fileSuffix){
|
||||
|
||||
String fileSavePath = filePath +"bussEdit"+ getUUIDPath(pid,taskId);
|
||||
|
||||
StringBuilder builder=new StringBuilder();
|
||||
builder.append(filePath);
|
||||
builder.append("buss").append("/");
|
||||
builder.append(pid).append("/");
|
||||
String saveFileUrl = builder.toString();
|
||||
String modelPath = saveFileUrl+"model.docx";
|
||||
|
||||
QueryWrapper wrapper = new QueryWrapper();
|
||||
wrapper.eq("P_ID",pid);
|
||||
wrapper.eq("EDIT_TYPE","node");
|
||||
List<BusProcessModelHis> hisList = this.baseMapper.selectList(wrapper);
|
||||
String newFileName = "";
|
||||
try {
|
||||
if(!hisList.isEmpty()){
|
||||
newFileName = fileSavePath+taskId + "_" + pid + "_count." + fileSuffix;
|
||||
|
||||
for (int i = 0; i < hisList.size(); i++) {
|
||||
if(i == 0){
|
||||
PoiWord.wordRedDocument(modelPath,null,newFileName,hisList.get(i).getEditFilePath());
|
||||
}else {
|
||||
PoiWord.wordRedDocument(newFileName,null,newFileName,hisList.get(i).getEditFilePath());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}catch (Exception e){
|
||||
logger.error(e.getMessage());
|
||||
}
|
||||
|
||||
return newFileName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String saveBussModelFile(String pid, String taskId){
|
||||
return saveProcessFile(filePath,pid,taskId,"docx");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void saveBussTemplateFile(JSONObject object,String pid){
|
||||
PoiWord.writeWordModel(filePath, object, pid);
|
||||
}
|
||||
|
||||
/**
|
||||
* 企标流程文件存储
|
||||
* @param pid
|
||||
* @param taskId
|
||||
* @param fileSuffix
|
||||
* @param filePath 文件存储路径
|
||||
* @throws IOException
|
||||
*/
|
||||
public String saveProcessFile(String filePath,String pid,String taskId,String fileSuffix){
|
||||
|
||||
String fileSavePath = filePath +"bussEdit"+ getUUIDPath(pid,taskId);
|
||||
String newFileName = "";
|
||||
try {
|
||||
|
||||
File dir = new File(fileSavePath);
|
||||
if (!dir.exists()) {
|
||||
dir.mkdirs();
|
||||
}
|
||||
|
||||
newFileName = taskId + "_" + pid + "_node." + fileSuffix;
|
||||
File saveFile = new File(fileSavePath + newFileName);
|
||||
FileUtils.write(saveFile, "","UTF-8");
|
||||
|
||||
|
||||
}catch (Exception e){
|
||||
logger.error(e.getMessage(),e);
|
||||
}
|
||||
return fileSavePath+newFileName;
|
||||
}
|
||||
|
||||
public static String getUUIDPath(String pid,String taskId){
|
||||
StringBuilder builder=new StringBuilder();
|
||||
builder.append("/");
|
||||
builder.append(pid).append("/");
|
||||
// builder.append(taskId).append("/");
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public BusProcessModelHis modelHisOne(String pid,String taskId){
|
||||
BusProcessModelHis modelHis = new BusProcessModelHis();
|
||||
QueryWrapper wrapper = new QueryWrapper();
|
||||
wrapper.eq("P_ID",pid);
|
||||
wrapper.eq("TASK_ID",taskId);
|
||||
List<BusProcessModelHis> hisList = this.baseMapper.selectList(wrapper);
|
||||
if(!hisList.isEmpty()){
|
||||
modelHis = hisList.get(0);
|
||||
StringBuffer downloadFileUrl = new StringBuffer();
|
||||
downloadFileUrl.append(downloadUrl).append(modelHis.getEditFilePath() == null ? "" : modelHis.getEditFilePath());
|
||||
modelHis.setDownLoadUrl(downloadFileUrl.toString());
|
||||
}
|
||||
return modelHis;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BusProcessModelHis> modelHisList(String pid){
|
||||
QueryWrapper wrapper = new QueryWrapper();
|
||||
wrapper.eq("P_ID",pid);
|
||||
return this.baseMapper.selectList(wrapper);
|
||||
}
|
||||
}
|
||||
@@ -1,24 +1,27 @@
|
||||
package com.ydw.bat.wkflow.listener.bussLibrary;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessModelHis;
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName;
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew;
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.Datas;
|
||||
import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessModelHisService;
|
||||
import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService;
|
||||
import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService;
|
||||
import com.ydw.bat.wkflow.business_main.datas.service.IDatasService;
|
||||
import com.ydw.bat.wkflow.listener.bussLibrary.Utils.PoiWord;
|
||||
import com.ydw.bat.wkflow.util.SpringContextUtil;
|
||||
import com.ydw.bat.wkflow.util.Utils;
|
||||
import org.activiti.engine.ActivitiException;
|
||||
import org.activiti.engine.delegate.DelegateTask;
|
||||
import org.activiti.engine.delegate.TaskListener;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 发起企标制修订流程后
|
||||
@@ -30,6 +33,7 @@ public class BLApplicantAfter implements TaskListener{
|
||||
IDatasService datasService = SpringContextUtil.getBean(IDatasService.class);
|
||||
IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class);
|
||||
IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class);
|
||||
IBusProcessModelHisService busProcessModelHisService = SpringContextUtil.getBean(IBusProcessModelHisService.class);
|
||||
|
||||
QueryWrapper<Datas> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId());
|
||||
@@ -38,23 +42,6 @@ public class BLApplicantAfter implements TaskListener{
|
||||
JSONObject object = JSONObject.parseObject(datas.getFormValsJson());
|
||||
delegateTask.setVariable("objectJson",object);
|
||||
|
||||
List<String> nextUserList = new ArrayList();
|
||||
|
||||
if(StringUtils.isNotBlank(object.getString("qcUserId"))){
|
||||
|
||||
if(object.getString("qcUserId").contains(",")){
|
||||
nextUserList = Arrays.asList(object.getString("qcUserId").split(","));
|
||||
}else {
|
||||
nextUserList.add(object.getString("qcUserId"));
|
||||
}
|
||||
// 配置多实例
|
||||
delegateTask.setVariable("qcUserList",nextUserList);
|
||||
delegateTask.addCandidateUsers(nextUserList);
|
||||
}else {
|
||||
throw new ActivitiException("1#2其他起草人参数不存在,请配置相关用户");
|
||||
}
|
||||
|
||||
|
||||
//截止时间 流程描述 创建人
|
||||
String OVERTIME = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
|
||||
String user = object.getString("prcCreateUser");
|
||||
@@ -62,6 +49,43 @@ public class BLApplicantAfter implements TaskListener{
|
||||
// object.getString("standName")
|
||||
String standName = "";
|
||||
String prcName = "企标制修订流程及企业标准库流程";
|
||||
|
||||
// 下个节点执行人处理逻辑
|
||||
List<String> nextUserList = new ArrayList();
|
||||
List<BusProcessModelHis> busProcessModelHisList = new ArrayList<>();
|
||||
if(StringUtils.isNotBlank(object.getString("modelData"))){
|
||||
List<JSONObject> valueArr = JSONArray.parseArray(object.getString("modelData"),JSONObject.class);
|
||||
Map<String, List<JSONObject>> listMap = valueArr.stream().collect(
|
||||
Collectors.groupingBy(a -> Utils.format("{0}", a.getString("userId"))));
|
||||
List<String> finalNextUserList = nextUserList;
|
||||
listMap.forEach((s, jsonObjects) -> {
|
||||
String json = JSONArray.toJSONString(jsonObjects);
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
|
||||
BusProcessModelHis modelHis = new BusProcessModelHis();
|
||||
modelHis.setPId(delegateTask.getProcessInstanceId());
|
||||
modelHis.setMesg(json);
|
||||
modelHis.setTaskInfo(delegateTask.getName());
|
||||
modelHis.setUserId(s);
|
||||
modelHis.setPrcName(prcName);
|
||||
modelHis.setEditType("node");
|
||||
modelHis.setCreateTime(sdf.format(new Date()));
|
||||
modelHis.setUpdateTime(sdf.format(new Date()));
|
||||
busProcessModelHisList.add(modelHis);
|
||||
finalNextUserList.add(s);
|
||||
});
|
||||
nextUserList.addAll(finalNextUserList);
|
||||
// if(object.getString("qcUserId").contains(",")){
|
||||
// nextUserList = Arrays.asList(object.getString("qcUserId").split(","));
|
||||
// }else {
|
||||
// nextUserList.add(object.getString("qcUserId"));
|
||||
// }
|
||||
// 配置多实例
|
||||
delegateTask.setVariable("qcUserList",nextUserList);
|
||||
delegateTask.addCandidateUsers(nextUserList);
|
||||
}else {
|
||||
throw new ActivitiException("1#2其他起草人参数不存在,请配置相关用户");
|
||||
}
|
||||
|
||||
QueryWrapper queryWrapper2 = new QueryWrapper();
|
||||
queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId());
|
||||
BusProcessName one1 = busProcessNameService.getOne(queryWrapper2);
|
||||
@@ -100,6 +124,12 @@ public class BLApplicantAfter implements TaskListener{
|
||||
busBean.save(busProcessNewNext);
|
||||
}
|
||||
}
|
||||
if(!busProcessModelHisList.isEmpty()){
|
||||
busProcessModelHisService.saveBatch(busProcessModelHisList);
|
||||
}
|
||||
|
||||
// 生成 模板
|
||||
busProcessModelHisService.saveBussTemplateFile(object,delegateTask.getProcessInstanceId());
|
||||
}
|
||||
|
||||
private String verifyObj(String str){
|
||||
|
||||
@@ -21,7 +21,7 @@ import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 企标协同编写后
|
||||
* 企标编写后
|
||||
*/
|
||||
public class BussLibrary2After implements TaskListener{
|
||||
@Override
|
||||
|
||||
@@ -1,17 +1,21 @@
|
||||
package com.ydw.bat.wkflow.listener.bussLibrary;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessModelHis;
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew;
|
||||
import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessModelHisService;
|
||||
import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService;
|
||||
import com.ydw.bat.wkflow.business_mq.service.CreateMQService;
|
||||
import com.ydw.bat.wkflow.util.SpringContextUtil;
|
||||
import org.activiti.engine.delegate.DelegateTask;
|
||||
import org.activiti.engine.delegate.TaskListener;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 企标协同编写前
|
||||
* 企标编写前
|
||||
*/
|
||||
public class BussLibrary2Before implements TaskListener{
|
||||
@Override
|
||||
@@ -33,5 +37,24 @@ public class BussLibrary2Before implements TaskListener{
|
||||
one1.setTaskInfo(delegateTask.getName());
|
||||
oaService.sendTodoMq(one1);
|
||||
}
|
||||
|
||||
// 创建当前节点文件 - 暂时为空文件
|
||||
IBusProcessModelHisService hisService = SpringContextUtil.getBean(IBusProcessModelHisService.class);
|
||||
|
||||
QueryWrapper wrapperModel = new QueryWrapper();
|
||||
wrapperModel.eq("P_ID",delegateTask.getProcessInstanceId());
|
||||
wrapperModel.eq("USER_ID",delegateTask.getAssignee());
|
||||
wrapperModel.isNull("TASK_ID");
|
||||
List<BusProcessModelHis> hisList = hisService.list(wrapperModel);
|
||||
if(!hisList.isEmpty()){
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
|
||||
BusProcessModelHis modelHis = hisList.get(0);
|
||||
modelHis.setTaskId(delegateTask.getId());
|
||||
String filePath = hisService.saveBussModelFile(delegateTask.getProcessInstanceId(),delegateTask.getId());
|
||||
modelHis.setEditFilePath(filePath);
|
||||
modelHis.setUpdateTime(sdf.format(new Date()));
|
||||
hisService.saveOrUpdate(modelHis);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,13 +1,17 @@
|
||||
package com.ydw.bat.wkflow.listener.bussLibrary;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessModelHis;
|
||||
import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew;
|
||||
import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessModelHisService;
|
||||
import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService;
|
||||
import com.ydw.bat.wkflow.business_mq.service.CreateMQService;
|
||||
import com.ydw.bat.wkflow.util.SpringContextUtil;
|
||||
import org.activiti.engine.delegate.DelegateTask;
|
||||
import org.activiti.engine.delegate.TaskListener;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -32,6 +36,25 @@ public class BussLibrary3Before implements TaskListener{
|
||||
one1.setLink("bussLibrary3?prcType=buss1");
|
||||
one1.setTaskInfo(delegateTask.getName());
|
||||
oaService.sendTodoMq(one1);
|
||||
|
||||
// 创建汇总文件 --- 合并子节点在线编辑文件
|
||||
IBusProcessModelHisService hisService = SpringContextUtil.getBean(IBusProcessModelHisService.class);
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
|
||||
|
||||
BusProcessModelHis modelHis = new BusProcessModelHis();
|
||||
modelHis.setPId(delegateTask.getProcessInstanceId());
|
||||
modelHis.setMesg(one1.getMesg());
|
||||
modelHis.setTaskInfo(delegateTask.getName());
|
||||
modelHis.setUserId(one1.getUserId());
|
||||
modelHis.setPrcName(one1.getPrcName());
|
||||
modelHis.setTaskId(delegateTask.getId());
|
||||
modelHis.setEditType("count");
|
||||
modelHis.setCreateTime(sdf.format(new Date()));
|
||||
modelHis.setUpdateTime(sdf.format(new Date()));
|
||||
// 合并子节点在线编辑文件后 返回 汇总文件路径
|
||||
String fileUrl = hisService.mergeModelFile(delegateTask.getProcessInstanceId(),delegateTask.getId(),"docx");
|
||||
modelHis.setEditFilePath(fileUrl);
|
||||
hisService.save(modelHis);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.ydw.bat.wkflow.listener.bussLibrary.Utils;
|
||||
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* @Description: TODO
|
||||
* @author: super_liu
|
||||
* @date: 2021年12月13日 11:26
|
||||
*/
|
||||
public class PoiUtil {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,649 @@
|
||||
package com.ydw.bat.wkflow.listener.bussLibrary.Utils;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.deepoove.poi.XWPFTemplate;
|
||||
import com.deepoove.poi.xwpf.NiceXWPFDocument;
|
||||
import com.ydw.bat.wkflow.business_main.datas.service.impl.BusProcessModelHisServiceImpl;
|
||||
import org.apache.poi.hpsf.DocumentSummaryInformation;
|
||||
import org.apache.poi.hpsf.SummaryInformation;
|
||||
import org.apache.poi.hwpf.extractor.WordExtractor;
|
||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||
import org.apache.poi.poifs.filesystem.FileMagic;
|
||||
import org.apache.poi.poifs.nio.DataSource;
|
||||
import org.apache.poi.util.LocaleUtil;
|
||||
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
|
||||
import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
|
||||
import org.apache.poi.xwpf.usermodel.*;
|
||||
import org.apache.xmlbeans.XmlOptions;
|
||||
import org.apache.xmlbeans.impl.xb.xmlschema.SpaceAttribute;
|
||||
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
|
||||
import java.io.*;
|
||||
import java.math.BigInteger;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @Description: TODO
|
||||
* @author: super_liu
|
||||
* @date: 2021年12月10日 15:38
|
||||
*/
|
||||
public class PoiWord {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(BusProcessModelHisServiceImpl.class);
|
||||
|
||||
|
||||
/**
|
||||
* 输出SummaryInfomation
|
||||
* @param info
|
||||
*/
|
||||
private static void printInfo(SummaryInformation info) {
|
||||
//作者
|
||||
System.out.println(info.getAuthor());
|
||||
//字符统计
|
||||
System.out.println(info.getCharCount());
|
||||
//页数
|
||||
System.out.println(info.getPageCount());
|
||||
//标题
|
||||
System.out.println(info.getTitle());
|
||||
//主题
|
||||
System.out.println(info.getSubject());
|
||||
}
|
||||
|
||||
/**
|
||||
* 输出DocumentSummaryInfomation
|
||||
* @param info
|
||||
*/
|
||||
private static void printInfo(DocumentSummaryInformation info) {
|
||||
//分类
|
||||
System.out.println(info.getCategory());
|
||||
//公司
|
||||
System.out.println(info.getCompany());
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭输入流
|
||||
* @param is
|
||||
*/
|
||||
private static void closeStream(InputStream is) {
|
||||
if (is != null) {
|
||||
try {
|
||||
is.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static String read(InputStream is) throws Exception {
|
||||
System.out.println(FileMagic.valueOf(is));
|
||||
String text = "";
|
||||
|
||||
return text;
|
||||
}
|
||||
|
||||
public static void writeToDocx()throws Exception{
|
||||
XWPFDocument document= new XWPFDocument();
|
||||
|
||||
//Write the Document in file system
|
||||
FileOutputStream out = new FileOutputStream(new File("E:\\Software\\rtpro\\Foton\\File\\doc\\create_table2.docx"));
|
||||
|
||||
//添加标题
|
||||
XWPFParagraph titleParagraph = document.createParagraph();
|
||||
//设置段落居中
|
||||
titleParagraph.setAlignment(ParagraphAlignment.CENTER);
|
||||
|
||||
XWPFRun titleParagraphRun = titleParagraph.createRun();
|
||||
|
||||
titleParagraphRun.setText("Java PoI");
|
||||
titleParagraphRun.setColor("000000");
|
||||
titleParagraphRun.setFontSize(20);
|
||||
|
||||
//段落
|
||||
XWPFParagraph firstParagraph = document.createParagraph();
|
||||
XWPFRun run = firstParagraph.createRun();
|
||||
run.setText("Java POI 生成word文件。");
|
||||
run.setColor("696969");
|
||||
run.setFontSize(16);
|
||||
|
||||
//设置段落背景颜色
|
||||
CTShd cTShd = run.getCTR().addNewRPr().addNewShd();
|
||||
cTShd.setVal(STShd.CLEAR);
|
||||
cTShd.setFill("97FFFF");
|
||||
|
||||
//换行
|
||||
XWPFParagraph paragraph1 = document.createParagraph();
|
||||
XWPFRun paragraphRun1 = paragraph1.createRun();
|
||||
paragraphRun1.setText("\r");
|
||||
|
||||
//基本信息表格
|
||||
XWPFTable infoTable = document.createTable();
|
||||
//去表格边框
|
||||
infoTable.getCTTbl().getTblPr().unsetTblBorders();
|
||||
|
||||
//列宽自动分割
|
||||
CTTblWidth infoTableWidth = infoTable.getCTTbl().addNewTblPr().addNewTblW();
|
||||
infoTableWidth.setType(STTblWidth.DXA);
|
||||
infoTableWidth.setW(BigInteger.valueOf(9072));
|
||||
|
||||
//表格第一行
|
||||
XWPFTableRow infoTableRowOne = infoTable.getRow(0);
|
||||
infoTableRowOne.getCell(0).setText("职位");
|
||||
infoTableRowOne.addNewTableCell().setText(": Java 开发工程师");
|
||||
|
||||
//表格第二行
|
||||
XWPFTableRow infoTableRowTwo = infoTable.createRow();
|
||||
infoTableRowTwo.getCell(0).setText("姓名");
|
||||
infoTableRowTwo.getCell(1).setText(": seawater");
|
||||
|
||||
//表格第三行
|
||||
XWPFTableRow infoTableRowThree = infoTable.createRow();
|
||||
infoTableRowThree.getCell(0).setText("生日");
|
||||
infoTableRowThree.getCell(1).setText(": xxx-xx-xx");
|
||||
|
||||
//表格第四行
|
||||
XWPFTableRow infoTableRowFour = infoTable.createRow();
|
||||
infoTableRowFour.getCell(0).setText("性别");
|
||||
infoTableRowFour.getCell(1).setText(": 男");
|
||||
|
||||
//表格第五行
|
||||
XWPFTableRow infoTableRowFive = infoTable.createRow();
|
||||
infoTableRowFive.getCell(0).setText("现居地");
|
||||
infoTableRowFive.getCell(1).setText(": xx");
|
||||
CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
|
||||
XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(document, sectPr);
|
||||
|
||||
//添加页眉
|
||||
CTP ctpHeader = CTP.Factory.newInstance();
|
||||
CTR ctrHeader = ctpHeader.addNewR();
|
||||
CTText ctHeader = ctrHeader.addNewT();
|
||||
String headerText = "ctpHeader";
|
||||
ctHeader.setStringValue(headerText);
|
||||
XWPFParagraph headerParagraph = new XWPFParagraph(ctpHeader, document);
|
||||
//设置为右对齐
|
||||
headerParagraph.setAlignment(ParagraphAlignment.RIGHT);
|
||||
XWPFParagraph[] parsHeader = new XWPFParagraph[1];
|
||||
parsHeader[0] = headerParagraph;
|
||||
policy.createHeader(XWPFHeaderFooterPolicy.DEFAULT, parsHeader);
|
||||
|
||||
//添加页脚
|
||||
CTP ctpFooter = CTP.Factory.newInstance();
|
||||
CTR ctrFooter = ctpFooter.addNewR();
|
||||
CTText ctFooter = ctrFooter.addNewT();
|
||||
String footerText = "ctpFooter";
|
||||
ctFooter.setStringValue(footerText);
|
||||
XWPFParagraph footerParagraph = new XWPFParagraph(ctpFooter, document);
|
||||
headerParagraph.setAlignment(ParagraphAlignment.CENTER);
|
||||
XWPFParagraph[] parsFooter = new XWPFParagraph[1];
|
||||
parsFooter[0] = footerParagraph;
|
||||
policy.createFooter(XWPFHeaderFooterPolicy.DEFAULT, parsFooter);
|
||||
|
||||
document.write(out);
|
||||
out.close();
|
||||
}
|
||||
|
||||
public static void CustomTOC(CTSdtBlock block) {
|
||||
CTSdtPr sdtPr = block.addNewSdtPr();
|
||||
CTDecimalNumber id = sdtPr.addNewId();
|
||||
id.setVal(new BigInteger("4844945"));
|
||||
sdtPr.addNewDocPartObj().addNewDocPartGallery().setVal("Table of contents");
|
||||
CTSdtEndPr sdtEndPr = block.addNewSdtEndPr();
|
||||
CTRPr rPr = sdtEndPr.addNewRPr();
|
||||
CTFonts fonts = rPr.addNewRFonts();
|
||||
fonts.setAsciiTheme(STTheme.MINOR_H_ANSI);
|
||||
fonts.setEastAsiaTheme(STTheme.MINOR_H_ANSI);
|
||||
fonts.setHAnsiTheme(STTheme.MINOR_H_ANSI);
|
||||
fonts.setCstheme(STTheme.MINOR_BIDI);
|
||||
rPr.addNewB().setVal(STOnOff.OFF);
|
||||
rPr.addNewBCs().setVal(STOnOff.OFF);
|
||||
rPr.addNewColor().setVal("auto");
|
||||
rPr.addNewSz().setVal(new BigInteger("24"));
|
||||
rPr.addNewSzCs().setVal(new BigInteger("24"));
|
||||
CTSdtContentBlock content = block.addNewSdtContent();
|
||||
CTP p = content.addNewP();
|
||||
p.setRsidR("00EF7E24".getBytes(LocaleUtil.CHARSET_1252));
|
||||
p.setRsidRDefault("00EF7E24".getBytes(LocaleUtil.CHARSET_1252));
|
||||
p.addNewPPr().addNewPStyle().setVal("TOCHeading");
|
||||
p.addNewR().addNewT().setStringValue("目 录");//源码中为"Table of contents"
|
||||
//设置段落对齐方式,即将“目录”二字居中
|
||||
CTPPr pr = p.getPPr();
|
||||
CTJc jc = pr.isSetJc() ? pr.getJc() : pr.addNewJc();
|
||||
STJc.Enum en = STJc.Enum.forInt(ParagraphAlignment.CENTER.getValue());
|
||||
jc.setVal(en);
|
||||
//"目录"二字的字体
|
||||
CTRPr pRpr = p.getRArray(0).addNewRPr();
|
||||
fonts = pRpr.isSetRFonts() ? pRpr.getRFonts() : pRpr.addNewRFonts();
|
||||
fonts.setAscii("Times New Roman");
|
||||
fonts.setEastAsia("华文中宋");
|
||||
fonts.setHAnsi("华文中宋");
|
||||
//"目录"二字加粗
|
||||
CTOnOff bold = pRpr.isSetB() ? pRpr.getB() : pRpr.addNewB();
|
||||
bold.setVal(STOnOff.TRUE);
|
||||
// 设置“目录”二字字体大小为24号
|
||||
CTHpsMeasure sz = pRpr.isSetSz() ? pRpr.getSz() : pRpr.addNewSz();
|
||||
sz.setVal(new BigInteger("36"));
|
||||
}
|
||||
|
||||
public static void addRowOnlyTitle(int level, String title,CTSdtBlock block) {
|
||||
CTSdtContentBlock contentBlock = block.getSdtContent();
|
||||
CTP p = contentBlock.addNewP();
|
||||
p.setRsidR("00EF7E24".getBytes(LocaleUtil.CHARSET_1252));
|
||||
p.setRsidRDefault("00EF7E24".getBytes(LocaleUtil.CHARSET_1252));
|
||||
CTPPr pPr = p.addNewPPr();
|
||||
pPr.addNewPStyle().setVal("TOC" + level);
|
||||
CTTabs tabs = pPr.addNewTabs();//Set of Custom Tab Stops自定义制表符集合
|
||||
CTTabStop tab = tabs.addNewTab();//Custom Tab Stop自定义制表符
|
||||
tab.setVal(STTabJc.RIGHT);
|
||||
tab.setLeader(STTabTlc.DOT);
|
||||
tab.setPos(new BigInteger("9190"));//默认为8290,因为调整过页边距,所有需要调整,手动设置找出最佳值
|
||||
pPr.addNewRPr().addNewNoProof();//不检查语法
|
||||
CTR run = p.addNewR();
|
||||
run.addNewRPr().addNewNoProof();
|
||||
run.addNewT().setStringValue(title);
|
||||
//设置行间距
|
||||
CTSpacing pSpacing = pPr.getSpacing() != null ? pPr.getSpacing(): pPr.addNewSpacing();
|
||||
pSpacing.setLineRule(STLineSpacingRule.AUTO);//行间距类型:多倍
|
||||
pSpacing.setLine(new BigInteger("360"));//此处1.5倍行间距
|
||||
pSpacing.setBeforeLines(new BigInteger("20"));//段前0.2
|
||||
pSpacing.setAfterLines(new BigInteger("10"));//段后0.1
|
||||
//设置字体
|
||||
CTRPr pRpr = run.getRPr();
|
||||
CTFonts fonts = pRpr.isSetRFonts() ? pRpr.getRFonts() : pRpr.addNewRFonts();
|
||||
fonts.setAscii("Times New Roman");
|
||||
fonts.setEastAsia("黑体");
|
||||
fonts.setHAnsi("黑体");
|
||||
// 设置字体大小
|
||||
CTHpsMeasure sz = pRpr.isSetSz() ? pRpr.getSz() : pRpr.addNewSz();
|
||||
sz.setVal(new BigInteger("24"));
|
||||
|
||||
CTHpsMeasure szCs = pRpr.isSetSzCs() ? pRpr.getSzCs() : pRpr.addNewSzCs();
|
||||
szCs.setVal(new BigInteger("24"));
|
||||
}
|
||||
|
||||
public static void addRow(int level, String title, int page, String bookmarkRef,CTSdtBlock block) {
|
||||
CTSdtContentBlock contentBlock = block.getSdtContent();
|
||||
CTP p = contentBlock.addNewP();
|
||||
p.setRsidR("00EF7E24".getBytes(LocaleUtil.CHARSET_1252));
|
||||
p.setRsidRDefault("00EF7E24".getBytes(LocaleUtil.CHARSET_1252));
|
||||
CTPPr pPr = p.addNewPPr();
|
||||
pPr.addNewPStyle().setVal("TOC" + level);
|
||||
CTTabs tabs = pPr.addNewTabs();//Set of Custom Tab Stops自定义制表符集合
|
||||
CTTabStop tab = tabs.addNewTab();//Custom Tab Stop自定义制表符
|
||||
tab.setVal(STTabJc.RIGHT);
|
||||
tab.setLeader(STTabTlc.DOT);
|
||||
tab.setPos(new BigInteger("9100"));//默认为8290,因为调整过页边距,所有需要调整,手动设置找出最佳值
|
||||
pPr.addNewRPr().addNewNoProof();//不检查语法
|
||||
CTR run = p.addNewR();
|
||||
run.addNewRPr().addNewNoProof();
|
||||
run.addNewT().setStringValue(title);//添加标题文字
|
||||
//设置标题字体
|
||||
CTRPr pRpr = run.getRPr();
|
||||
CTFonts fonts = pRpr.isSetRFonts() ? pRpr.getRFonts() : pRpr.addNewRFonts();
|
||||
fonts.setAscii("Times New Roman");
|
||||
fonts.setEastAsia("楷体");
|
||||
fonts.setHAnsi("楷体");
|
||||
// 设置标题字体大小
|
||||
CTHpsMeasure sz = pRpr.isSetSz() ? pRpr.getSz() : pRpr.addNewSz();
|
||||
sz.setVal(new BigInteger("21"));
|
||||
CTHpsMeasure szCs = pRpr.isSetSzCs() ? pRpr.getSzCs() : pRpr.addNewSzCs();
|
||||
szCs.setVal(new BigInteger("21"));
|
||||
//添加制表符
|
||||
run = p.addNewR();
|
||||
run.addNewRPr().addNewNoProof();
|
||||
run.addNewTab();
|
||||
//添加页码左括号
|
||||
p.addNewR().addNewT().setStringValue("(");
|
||||
//STFldCharType.BEGIN标识与结尾处STFldCharType.END相对应
|
||||
run = p.addNewR();
|
||||
run.addNewRPr().addNewNoProof();
|
||||
run.addNewFldChar().setFldCharType(STFldCharType.BEGIN);//Field Character Type
|
||||
// pageref run
|
||||
run = p.addNewR();
|
||||
run.addNewRPr().addNewNoProof();
|
||||
CTText text = run.addNewInstrText();//Field Code 添加域代码文本控件
|
||||
text.setSpace(SpaceAttribute.Space.PRESERVE);
|
||||
// bookmark reference
|
||||
//源码的域名为" PAGEREF _Toc","\h"含义为在目录内建立目录项与页码的超链接
|
||||
text.setStringValue(" PAGEREF "+bookmarkRef + " \\h ");
|
||||
p.addNewR().addNewRPr().addNewNoProof();
|
||||
run = p.addNewR();
|
||||
run.addNewRPr().addNewNoProof();
|
||||
run.addNewFldChar().setFldCharType(STFldCharType.SEPARATE);
|
||||
// page number run
|
||||
run = p.addNewR();
|
||||
run.addNewRPr().addNewNoProof();
|
||||
run.addNewT().setStringValue(Integer.toString(page));
|
||||
run = p.addNewR();
|
||||
run.addNewRPr().addNewNoProof();
|
||||
//STFldCharType.END标识与上面STFldCharType.BEGIN相对应
|
||||
run.addNewFldChar().setFldCharType(STFldCharType.END);
|
||||
//添加页码右括号
|
||||
p.addNewR().addNewT().setStringValue(")");
|
||||
//设置行间距
|
||||
CTSpacing pSpacing = pPr.getSpacing() != null ? pPr.getSpacing(): pPr.addNewSpacing();
|
||||
pSpacing.setLineRule(STLineSpacingRule.AUTO);//行间距类型:多倍
|
||||
pSpacing.setLine(new BigInteger("360"));//此处1.5倍行间距
|
||||
}
|
||||
|
||||
/**
|
||||
* @param content 旧文件地址
|
||||
* @param data 需要填写的参数
|
||||
* @param destDocx 保存的文件地址
|
||||
* @param newFile 新文件地址
|
||||
*/
|
||||
public static void wordRedDocument(String content, Map<String, String> data, String destDocx,String newFile) throws Exception {
|
||||
//模板文件地址 固定模板
|
||||
// String model = "模板.docx";
|
||||
//模板文件 参数填写 render(data)
|
||||
XWPFTemplate template = XWPFTemplate.compile(newFile);
|
||||
//获取模板文件 公文
|
||||
NiceXWPFDocument main = template.getXWPFDocument();
|
||||
NiceXWPFDocument sub = new NiceXWPFDocument(new FileInputStream(content));
|
||||
// 合并两个文档
|
||||
NiceXWPFDocument newDoc = main.merge(sub);
|
||||
// 生成新文档
|
||||
FileOutputStream out = new FileOutputStream(destDocx);
|
||||
newDoc.write(out);
|
||||
newDoc.close();
|
||||
out.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* 合并两个文档到新的文件
|
||||
* @param outfile 输出文件
|
||||
* @param file1 要合并的文件1
|
||||
* @param file2 要合并的文件2
|
||||
* @throws Exception
|
||||
*/
|
||||
private void appenddoc(String outfile,String file1,String file2) throws Exception {
|
||||
InputStream in1 = null;
|
||||
InputStream in2 = null;
|
||||
|
||||
OPCPackage src1Package = null;
|
||||
OPCPackage src2Package = null;
|
||||
|
||||
OutputStream dest = new FileOutputStream(outfile);
|
||||
try {
|
||||
in1 = new FileInputStream(file1);
|
||||
in2 = new FileInputStream(file2);
|
||||
src1Package = OPCPackage.open(in1);
|
||||
src2Package = OPCPackage.open(in2);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
XWPFDocument src1Document = new XWPFDocument(src1Package);
|
||||
CTBody src1Body = src1Document.getDocument().getBody();
|
||||
XWPFParagraph p = src1Document.createParagraph();
|
||||
//设置分页符
|
||||
p.setPageBreak(true);
|
||||
XWPFDocument src2Document = new XWPFDocument(src2Package);
|
||||
CTBody src2Body = src2Document.getDocument().getBody();
|
||||
appendBody(src1Body, src2Body);
|
||||
src1Document.write(dest);
|
||||
src1Document.close();
|
||||
src2Document.close();
|
||||
in1.close();
|
||||
in2.close();
|
||||
dest.close();
|
||||
}
|
||||
private void appendBody(CTBody src, CTBody append) throws Exception {
|
||||
XmlOptions optionsOuter = new XmlOptions();
|
||||
optionsOuter.setSaveOuter();
|
||||
String appendString = append.xmlText(optionsOuter);
|
||||
String srcString = src.xmlText();
|
||||
String prefix = srcString.substring(0,srcString.indexOf(">")+1);
|
||||
String mainPart = srcString.substring(srcString.indexOf(">")+1,srcString.lastIndexOf("<"));
|
||||
String sufix = srcString.substring( srcString.lastIndexOf("<") );
|
||||
String addPart = appendString.substring(appendString.indexOf(">") + 1, appendString.lastIndexOf("<"));
|
||||
CTBody makeBody = CTBody.Factory.parse(prefix+mainPart+addPart+sufix);
|
||||
src.set(makeBody);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 生成企标模板
|
||||
*/
|
||||
public static void writeWordModel(String filePath, JSONObject object, String pid) {
|
||||
try {
|
||||
XWPFDocument doc = new XWPFDocument();
|
||||
StringBuilder builder=new StringBuilder();
|
||||
builder.append(filePath);
|
||||
builder.append("buss").append("/");
|
||||
builder.append(pid).append("/");
|
||||
String saveFileUrl = builder.toString();
|
||||
File dir = new File(saveFileUrl);
|
||||
if (!dir.exists()) {
|
||||
dir.mkdirs();
|
||||
}
|
||||
FileOutputStream out = new FileOutputStream(new File(saveFileUrl+"model.docx"));
|
||||
//设置文档一级主题居右
|
||||
XWPFParagraph titleParagraph1 = doc.createParagraph();
|
||||
|
||||
titleParagraph1.setAlignment(ParagraphAlignment.RIGHT);
|
||||
|
||||
XWPFRun titleParagraphRun = titleParagraph1.createRun();
|
||||
titleParagraphRun.setText(object.getString("standSort"));
|
||||
titleParagraphRun.setColor("000000");
|
||||
titleParagraphRun.setFontSize(48);
|
||||
titleParagraphRun.setFontFamily("Times New Roman");
|
||||
titleParagraphRun.setBold(true);
|
||||
titleParagraphRun.addCarriageReturn();
|
||||
|
||||
//设置文档二级主题居中
|
||||
XWPFParagraph titleParagraph2 = doc.createParagraph();
|
||||
|
||||
titleParagraph2.setAlignment(ParagraphAlignment.CENTER);
|
||||
|
||||
XWPFRun titleParagraphRun2 = titleParagraph2.createRun();
|
||||
titleParagraphRun2.setText("北汽福田汽车股份有限公司企业标准");
|
||||
titleParagraphRun2.setColor("000000");
|
||||
titleParagraphRun2.setFontSize(24);
|
||||
titleParagraphRun2.setFontFamily("黑体");
|
||||
titleParagraphRun2.addCarriageReturn();
|
||||
titleParagraphRun2.addCarriageReturn();
|
||||
|
||||
//设置文档三级级主题居右
|
||||
XWPFParagraph titleParagraph3 = doc.createParagraph();
|
||||
|
||||
titleParagraph3.setAlignment(ParagraphAlignment.RIGHT);
|
||||
|
||||
XWPFRun titleParagraphRun3 = titleParagraph3.createRun();
|
||||
titleParagraphRun3.setText(object.getString("standCode"));
|
||||
titleParagraphRun3.setColor("000000");
|
||||
titleParagraphRun3.setFontSize(14);
|
||||
titleParagraphRun3.setFontFamily("Times New Roman");
|
||||
titleParagraphRun3.addCarriageReturn();
|
||||
titleParagraphRun3.addCarriageReturn();
|
||||
titleParagraphRun3.addCarriageReturn();
|
||||
|
||||
//设置文档三级级主题居右
|
||||
// XWPFParagraph titleParagraph4 = doc.createParagraph();
|
||||
//
|
||||
// titleParagraph4.setAlignment(ParagraphAlignment.RIGHT);
|
||||
//
|
||||
// XWPFRun titleParagraphRun4 = titleParagraph4.createRun();
|
||||
// titleParagraphRun4.setText("代替 Q/FT XXXX—XXX X");
|
||||
// titleParagraphRun4.setColor("000000");
|
||||
// titleParagraphRun4.setFontSize(10);
|
||||
// titleParagraphRun4.setFontFamily("Times New Roman");
|
||||
// titleParagraphRun4.addCarriageReturn();
|
||||
// titleParagraphRun4.addCarriageReturn();
|
||||
// titleParagraphRun4.addCarriageReturn();
|
||||
// titleParagraphRun4.addCarriageReturn();
|
||||
// titleParagraphRun4.addCarriageReturn();
|
||||
|
||||
//设置背景名称一级级主题居中
|
||||
XWPFParagraph breakParagraph1 = doc.createParagraph();
|
||||
|
||||
breakParagraph1.setAlignment(ParagraphAlignment.CENTER);
|
||||
|
||||
XWPFRun breakParagraphRun1 = breakParagraph1.createRun();
|
||||
breakParagraphRun1.setText(object.getString("standName"));
|
||||
breakParagraphRun1.setColor("000000");
|
||||
breakParagraphRun1.setFontSize(26);
|
||||
breakParagraphRun1.setFontFamily("黑体");
|
||||
breakParagraphRun1.addCarriageReturn();
|
||||
|
||||
//设置背景名称二级级主题居中
|
||||
XWPFParagraph breakParagraph2 = doc.createParagraph();
|
||||
|
||||
breakParagraph2.setAlignment(ParagraphAlignment.CENTER);
|
||||
|
||||
XWPFRun breakParagraphRun2 = breakParagraph2.createRun();
|
||||
breakParagraphRun1.setText(object.getString("standEnName") == null ? "" : object.getString("standEnName"));
|
||||
breakParagraphRun2.setColor("000000");
|
||||
breakParagraphRun2.setFontSize(14);
|
||||
breakParagraphRun2.setFontFamily("Times New Roman");
|
||||
breakParagraphRun2.addCarriageReturn();
|
||||
|
||||
// 创建目录主题
|
||||
// createCustomTOC(doc);
|
||||
|
||||
XWPFParagraph contentParagraph1 = doc.createParagraph();
|
||||
|
||||
contentParagraph1.setAlignment(ParagraphAlignment.CENTER);
|
||||
|
||||
XWPFRun contentParagraphRun1 = contentParagraph1.createRun();
|
||||
breakParagraphRun1.setText(object.getString("standName"));
|
||||
contentParagraphRun1.setColor("000000");
|
||||
contentParagraphRun1.setFontSize(16);
|
||||
contentParagraphRun1.setFontFamily("黑体");
|
||||
contentParagraphRun1.addCarriageReturn();
|
||||
contentParagraph1.setPageBreak(true);
|
||||
|
||||
doc.write(out);
|
||||
out.close();
|
||||
}catch (Exception e){
|
||||
logger.error(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public static CTSdtBlock createCustomTOC(XWPFDocument doc) {
|
||||
CTSdtBlock block = doc.getDocument().getBody().addNewSdt();
|
||||
|
||||
|
||||
// 生成目录方法 先在顶部占位,然后等文档的标题和内容等信息全部写完之后,在写目录剩下的部分
|
||||
doc.createTOC();
|
||||
|
||||
CustomTOC(block);
|
||||
|
||||
addItem2TOC(doc,block);
|
||||
|
||||
return block;
|
||||
}
|
||||
|
||||
public static void writeTOC() throws IOException {
|
||||
XWPFDocument document= new XWPFDocument();
|
||||
|
||||
//Write the Document in file system
|
||||
FileOutputStream out = new FileOutputStream(new File("E:\\Software\\rtpro\\Foton\\File\\doc\\create_toc.docx"));
|
||||
|
||||
//添加标题
|
||||
XWPFParagraph titleParagraph = document.createParagraph();
|
||||
|
||||
//设置段落居中
|
||||
titleParagraph.setAlignment(ParagraphAlignment.CENTER);
|
||||
|
||||
XWPFRun titleParagraphRun = titleParagraph.createRun();
|
||||
titleParagraphRun.setText("Java PoI");
|
||||
titleParagraphRun.setColor("000000");
|
||||
titleParagraphRun.setFontSize(20);
|
||||
|
||||
//段落
|
||||
XWPFParagraph firstParagraph = document.createParagraph();
|
||||
firstParagraph.setStyle("Heading1");
|
||||
XWPFRun run = firstParagraph.createRun();
|
||||
run.setText("段落1。");
|
||||
run.setColor("696969");
|
||||
run.setFontSize(18);
|
||||
|
||||
|
||||
//段落
|
||||
XWPFParagraph firstParagraph1 = document.createParagraph();
|
||||
firstParagraph1.setStyle("Heading1");
|
||||
XWPFRun run1 = firstParagraph1.createRun();
|
||||
run1.setText("段落2");
|
||||
run1.setColor("696969");
|
||||
run1.setFontSize(16);
|
||||
|
||||
document.createTOC();
|
||||
|
||||
document.write(out);
|
||||
out.close();
|
||||
}
|
||||
|
||||
public static void addItem2TOC(XWPFDocument doc,CTSdtBlock block) {
|
||||
List<XWPFParagraph> paragraphs = doc.getParagraphs();
|
||||
for (XWPFParagraph par : paragraphs) {
|
||||
String parStyle = par.getStyle();
|
||||
if (parStyle != null && parStyle.startsWith("Heading")) {
|
||||
List<CTBookmark> bookmarkList=par.getCTP().getBookmarkStartList();
|
||||
try {
|
||||
int level = Integer.parseInt(parStyle.substring("Heading".length()));
|
||||
if(level==1){
|
||||
//添加栏目
|
||||
addRowOnlyTitle(level, par.getText(),block);
|
||||
}else{
|
||||
//添加标题
|
||||
addRow(level, par.getText(), 1, bookmarkList.get(0).getName(),block);
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
wordRedDocument("E:\\Software\\rtpro\\Foton\\File\\doc\\create_toc-1.docx",null,"E:\\Software\\rtpro\\Foton\\File\\doc\\create_toc3.docx","E:\\Software\\rtpro\\Foton\\File\\doc\\create_toc-2.docx");
|
||||
// writeWordBanch();
|
||||
// writeToDocx();
|
||||
// writeTOC();
|
||||
// InputStream is = new BufferedInputStream(new FileInputStream("E:\\Software\\rtpro\\Foton\\File\\doc\\北汽福田资料\\资料\\提供材料2021.04\\10、标准复审单及修订计划表.doc")); //really a OOXML Word file
|
||||
InputStream is = new BufferedInputStream(new FileInputStream("E:\\Software\\rtpro\\Foton\\File\\doc\\企业技术标准通用模板12.3.docx")); //really a OOXML Word file
|
||||
if (FileMagic.valueOf(is) == FileMagic.OLE2) {
|
||||
WordExtractor ex = new WordExtractor(is);
|
||||
printWord(ex);
|
||||
ex.close();
|
||||
} else if (FileMagic.valueOf(is) == FileMagic.OOXML) {
|
||||
XWPFDocument doc = new XWPFDocument(is);
|
||||
System.out.println(doc.getStyles());
|
||||
XWPFWordExtractor extractor = new XWPFWordExtractor(doc);
|
||||
// printWordHWPF(extractor);
|
||||
extractor.close();
|
||||
}
|
||||
closeStream(is);
|
||||
}
|
||||
|
||||
private static void printWord(WordExtractor extractor) {
|
||||
//输出word文档所有的文本
|
||||
System.out.println(extractor.getText());
|
||||
System.out.println(extractor.getTextFromPieces());
|
||||
//输出页眉的内容
|
||||
System.out.println("页眉:" + extractor.getHeaderText());
|
||||
//输出页脚的内容
|
||||
System.out.println("页脚:" + extractor.getFooterText());
|
||||
//输出当前word文档的元数据信息,包括作者、文档的修改时间等。
|
||||
System.out.println(extractor.getMetadataTextExtractor().getText());
|
||||
//获取各个段落的文本
|
||||
String paraTexts[] = extractor.getParagraphText();
|
||||
for (int i=0; i<paraTexts.length; i++) {
|
||||
System.out.println("Paragraph " + (i+1) + " : " + paraTexts[i]);
|
||||
}
|
||||
//输出当前word的一些信息
|
||||
printInfo(extractor.getSummaryInformation());
|
||||
//输出当前word的一些信息
|
||||
printInfo(extractor.getDocSummaryInformation());
|
||||
}
|
||||
|
||||
private static void printWordHWPF(XWPFWordExtractor xwpfWordExtractor) {
|
||||
//输出word文档所有的文本
|
||||
System.out.println(xwpfWordExtractor.getText());
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.LocalDate;
|
||||
@@ -20,6 +21,10 @@ import java.util.*;
|
||||
*/
|
||||
public class Utils {
|
||||
|
||||
public static String format(String value, Object... paras) {
|
||||
return MessageFormat.format(value, paras);
|
||||
}
|
||||
|
||||
public static int subDayNum(String endTime){
|
||||
if (endTime.length() >= 10) {
|
||||
endTime = endTime.substring(0, 10);
|
||||
|
||||
@@ -31,9 +31,12 @@ spring:
|
||||
datasource:
|
||||
type: com.alibaba.druid.pool.DruidDataSource
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://39.100.23.127:3306/foton-bat-wkflow?nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=utf-8
|
||||
url: jdbc:mysql://123.56.177.15:3306/foton-bat-wkflow?nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=utf-8
|
||||
username: root
|
||||
password: root
|
||||
password: RsLDRj3dXtSwYjBI
|
||||
# url: jdbc:mysql://127.0.0.1:3306/foton-bat-wkflow?nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=utf-8
|
||||
# username: root
|
||||
# password: root
|
||||
activiti:
|
||||
database-schema-update: true
|
||||
# 自动部署验证设置:true-开启(默认)、false-关闭
|
||||
@@ -108,3 +111,12 @@ webUrl: http://62.234.136.153:8038/#/
|
||||
# OA 接受任务定时器是否启用
|
||||
isNotScheduled: false
|
||||
|
||||
buss:
|
||||
edit:
|
||||
file:
|
||||
path: /data/slrs/file/
|
||||
down:
|
||||
file:
|
||||
# path: https://srms.foton.com.cn/file/
|
||||
path: http://foton.natapp1.cc/file/
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.ydw.bat.wkflow.business_main.datas.mapper.BusProcessModelHisMapper">
|
||||
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user