Explorar o código

Merge remote-tracking branch 'origin/master' into master

yangyj %!s(int64=2) %!d(string=hai) anos
pai
achega
265b0e074b
Modificáronse 16 ficheiros con 324 adicións e 36 borrados
  1. 6 3
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ContractLog.java
  2. 8 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ContractLogClient.java
  3. 91 7
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ContractLogController.java
  4. 10 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  5. 26 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ContractLogClientImpl.java
  6. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ContractLogMapper.java
  7. 6 2
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ContractLogMapper.xml
  8. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/IContractLogService.java
  9. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ContractLogServiceImpl.java
  10. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/utils/FunctionMain.java
  11. 114 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  12. 3 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java
  13. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  14. 6 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  15. 34 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/unit/RegularExpressionUtil.java
  16. 13 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/unit/WbsElementUtil.java

+ 6 - 3
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/ContractLog.java

@@ -17,9 +17,6 @@
 package org.springblade.business.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
-
-import java.io.Serializable;
-
 import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
@@ -96,4 +93,10 @@ public class ContractLog extends BaseEntity {
     @ApiModelProperty("文件名称")
     private String eVisaPdfUrl;
 
+    @ApiModelProperty("审批人")
+    private String auditUserIdAndName;
+
+    @ApiModelProperty("上报批次")
+    private Integer batch;
+
 }

+ 8 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ContractLogClient.java

@@ -9,6 +9,8 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
+
 @FeignClient(value =
         BusinessConstant.APPLICATION_WEATHER_NAME
 )
@@ -16,6 +18,12 @@ public interface ContractLogClient {
 
     String API_PREFIX = "/contractLog";
 
+    @PostMapping(API_PREFIX + "/removeContractLogWbsByTheLogId")
+    void removeContractLogWbsByTheLogId(@RequestParam String theLogId);
+
+    @PostMapping(API_PREFIX + "/queryContractLogWbsByTheLogId")
+    List<JSONObject> queryContractLogWbsByTheLogId(@RequestParam String theLogId);
+
     @PostMapping(API_PREFIX + "/updateTheLogPdfUrl")
     void updateTheLogPdfUrl(@RequestParam String theLogId, @RequestParam String pdfUrl);
 

+ 91 - 7
blade-service/blade-business/src/main/java/org/springblade/business/controller/ContractLogController.java

@@ -1,6 +1,8 @@
 package org.springblade.business.controller;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
@@ -13,16 +15,23 @@ import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.ContractLog;
 import org.springblade.business.entity.ContractLogWbs;
 import org.springblade.business.entity.Task;
+import org.springblade.business.entity.TaskParallel;
 import org.springblade.business.feign.MessageWarningClient;
 import org.springblade.business.feign.OperationLogClient;
 import org.springblade.business.feign.TaskClient;
 import org.springblade.business.service.IContractLogWbsService;
+import org.springblade.business.utils.FileUtils;
 import org.springblade.business.vo.*;
+import org.springblade.common.constant.CommonConstant;
+import org.springblade.common.utils.SnowFlakeUtil;
+import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.feign.WbsTreeContractClient;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
+import org.springblade.resource.feign.NewIOSSClient;
+import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springblade.business.service.IContractLogService;
@@ -30,6 +39,7 @@ import org.springblade.core.boot.ctrl.BladeController;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -57,6 +67,68 @@ public class ContractLogController extends BladeController {
 
 	private final MessageWarningClient messageWarningClient;
 
+	private final NewIOSSClient newIOSSClient;
+
+    /**
+     * 日志上报(填报页)
+     */
+    @PostMapping("/startTaskTheLog")
+    @ApiOperationSupport(order = 9)
+    @ApiOperation(value = "日志上报(填报页)")
+    public R<Boolean> startTaskTheLog(@RequestBody StartTaskVO startTaskVO, @RequestParam String nodePrimaryKeyId, @RequestParam String recordTime){
+        if(StringUtils.isEmpty(startTaskVO.getIds())){
+            if(StringUtils.isEmpty(nodePrimaryKeyId) && StringUtils.isEmpty(recordTime)){
+                return R.fail("未找到业务数据");
+            }
+            //如果ids为空,说明是填报页上报,那么需要根据 nodePrimaryKeyId 和 recordTime 获取当前用户的填写记录
+            ContractLog log = this.contractLogService.getOne(Wrappers.<ContractLog>lambdaQuery().eq(ContractLog::getWbsNodeId, nodePrimaryKeyId).eq(ContractLog::getRecordTime, recordTime).eq(ContractLog::getCreateUser, AuthUtil.getUserId()));
+            if(log == null){
+                return R.fail("未找到业务数据");
+            }
+            startTaskVO.setIds(String.valueOf(log.getId()));
+        }
+        return this.batchTask(startTaskVO);
+    }
+
+	/**
+	 * 预览、打印
+	 */
+	@PostMapping("/theLogPreviewAndPrint")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "预览、打印")
+	@ApiImplicitParam(name = "json", value = "key为 ids数组,ids的数据为勾选的列表数据id集合")
+	public R<String> theLogPreviewAndPrint(@RequestBody JSONObject json){
+		//获取配置的路径
+		String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+
+		if(json.containsKey("ids")){
+			//id集合
+			List<String> ids = JSONArray.parseArray(JSONObject.toJSONString(json.getJSONArray("ids")), String.class);
+			//查询具体数据
+			List<ContractLog> logList = this.contractLogService.list(Wrappers.<ContractLog>lambdaQuery().in(ContractLog::getId, ids));
+			//获取pdf路径
+			List<String> pdfUrls = logList.stream().map(log -> StringUtils.isNotEmpty(log.getEVisaPdfUrl()) ? log.getEVisaPdfUrl() : log.getPdfUrl()).distinct().collect(Collectors.toList());
+
+			//删除空数据
+			pdfUrls.removeIf(StringUtils::isEmpty);
+
+			if(pdfUrls.size() > 0){
+				//合并的pdf路径
+				String fileName = SnowFlakeUtil.getId() + "-" + new Date().getTime() + ".pdf";
+				String mergePdfPath = file_path + "/pdf//" + fileName;
+				FileUtils.mergePdfPublicMethods(pdfUrls, mergePdfPath);
+
+				//上传
+				BladeFile file = this.newIOSSClient.uploadFile(fileName, mergePdfPath);
+				if(file != null){
+					return R.data(file.getLink());
+				}
+			}
+
+		}
+		return R.fail("未找到数据");
+	}
+
 	/**
 	 * 获取当前日志资料关联的工序节点信息
 	 */
@@ -78,7 +150,7 @@ public class ContractLogController extends BladeController {
 					.eq(ContractLog::getWbsNodeId, nodePrimaryKeyId)
 					.eq(ContractLog::getRecordTime, recordTime).eq(ContractLog::getCreateUser, AuthUtil.getUserId()));
 			if(log == null){
-				return R.fail("未找到数据");
+				return R.data(300, null, "未找到数据");
 			}
 
 			theLogId = String.valueOf(log.getId());
@@ -104,8 +176,8 @@ public class ContractLogController extends BladeController {
 	@PostMapping("/getSubmitLogDateList")
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "获取合同段当前日志节点下的填报日期记录")
-	public R<List<String>> getSubmitLogDateList(@RequestParam String contractId, @RequestParam String primaryKeyId){
-		return R.data(this.contractLogService.getSubmitLogDateList(contractId, primaryKeyId));
+	public R<List<String>> getSubmitLogDateList(@RequestParam String contractId, @RequestParam String primaryKeyId, @RequestParam String year){
+		return R.data(this.contractLogService.getSubmitLogDateList(contractId, primaryKeyId, year));
 	}
 
 	/**
@@ -125,9 +197,7 @@ public class ContractLogController extends BladeController {
 					this.taskClient.abolishTask(task);
 				} else if(new Integer("2").equals(task.getStatus())) {
 					//已审批的任务,修改业务数据的审批状态为未上报并撤签即可
-					this.contractLogService.update(Wrappers.<ContractLog>lambdaUpdate().set(ContractLog::getStatus, 3).in(ContractLog::getId, Arrays.asList(task.getFormDataId().split(","))));
-					// todo ================== 调用撤签
-					// todo ================== 调用撤签
+					this.contractLogService.update(Wrappers.<ContractLog>lambdaUpdate().set(ContractLog::getEVisaPdfUrl, null).set(ContractLog::getStatus, 3).in(ContractLog::getId, Arrays.asList(task.getFormDataId().split(","))));
 				}
 
 				List<ContractLog> contractLogs = this.contractLogService.getBaseMapper().selectBatchIds(Arrays.asList(task.getFormDataId().split(",")));
@@ -186,8 +256,22 @@ public class ContractLogController extends BladeController {
 					taskVO.setApprovalType(3);
 					//上报
 					if(this.taskClient.startTask(taskVO).getData()){
+                        LambdaUpdateWrapper<ContractLog> wrappers = Wrappers.lambdaUpdate();
+                        wrappers.set(ContractLog::getBatch, taskVO.getBatch()).set(ContractLog::getStatus, 1);
+
+                        //查询审批人
+                        List<TaskParallel> taskUsers = this.taskClient.queryApprovalUser(id);
+                        if(taskUsers.size() > 0){
+                            //生成审批人信息
+                            StringBuilder stringBuilder = new StringBuilder();
+                            taskUsers.forEach(users -> stringBuilder.append(",").append(users.getTaskUser()).append("-").append(users.getTaskUserName()));
+                            //设置审批人
+                            wrappers.set(ContractLog::getAuditUserIdAndName, stringBuilder.substring(1));
+                        }
+                        wrappers.eq(ContractLog::getId, id);
+
 						//修改记录
-						this.contractLogService.update(Wrappers.<ContractLog>lambdaUpdate().set(ContractLog::getStatus, 1).eq(ContractLog::getId, id));
+						this.contractLogService.update(wrappers);
 					}
 				}
 

+ 10 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -2,6 +2,7 @@ package org.springblade.business.controller;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -646,15 +647,22 @@ public class InformationWriteQueryController extends BladeController {
 						taskVO.setApprovalType(1);
 						//上报
 						if(this.taskClient.startTask(taskVO).getData()){
+							LambdaUpdateWrapper<InformationQuery> wrappers = Wrappers.lambdaUpdate();
+							wrappers.set(InformationQuery::getReportNumber, taskVO.getBatch()).set(InformationQuery::getStatus, 1);
+
 							//查询审批人
 							List<TaskParallel> taskUsers = this.taskClient.queryApprovalUser(id);
 							if(taskUsers.size() > 0){
 								//生成审批人信息
 								StringBuilder stringBuilder = new StringBuilder();
 								taskUsers.forEach(users -> stringBuilder.append(",").append(users.getTaskUser()).append("-").append(users.getTaskUserName()));
-								//修改记录
-								this.informationQueryService.update(Wrappers.<InformationQuery>lambdaUpdate().set(InformationQuery::getReportNumber, taskVO.getBatch()).set(InformationQuery::getStatus, 1).set(InformationQuery::getAuditUserIdAndName, stringBuilder.substring(1)).eq(InformationQuery::getId, id));
+								//设置审批人
+								wrappers.set(InformationQuery::getAuditUserIdAndName, stringBuilder.substring(1));
 							}
+							wrappers.eq(InformationQuery::getId, id);
+
+							//修改记录
+							this.informationQueryService.update(wrappers);
 						}
 					}
 				}catch (Exception e){

+ 26 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ContractLogClientImpl.java

@@ -29,6 +29,32 @@ public class ContractLogClientImpl implements ContractLogClient {
 
     private final IContractLogWbsService contractLogWbsService;
 
+    @Override
+    public void removeContractLogWbsByTheLogId(String theLogId) {
+        try{
+            this.contractLogWbsService.update(Wrappers.<ContractLogWbs>lambdaUpdate().set(ContractLogWbs::getIsDeleted, 1).eq(ContractLogWbs::getContractLogId, theLogId));
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public List<JSONObject> queryContractLogWbsByTheLogId(String theLogId) {
+        List<JSONObject> wbsJsonList = new ArrayList<>();
+        List<ContractLogWbs> wbsList = this.contractLogWbsService.list(Wrappers.<ContractLogWbs>lambdaQuery().eq(ContractLogWbs::getContractLogId, theLogId));
+        if(wbsList != null && wbsList.size() > 0){
+            for(ContractLogWbs logWbs : wbsList){
+                JSONObject json = new JSONObject();
+                json.put("primaryKeyId", logWbs.getTreePrimaryKeyId());
+                json.put("path", logWbs.getTitle());
+
+                wbsJsonList.add(json);
+            }
+        }
+
+        return wbsJsonList;
+    }
+
     @Override
     public void updateTheLogPdfUrl(String theLogId, String pdfUrl) {
         this.contractLogService.update(Wrappers.<ContractLog>lambdaUpdate().set(ContractLog::getPdfUrl, pdfUrl).eq(ContractLog::getId, theLogId));

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ContractLogMapper.java

@@ -31,7 +31,7 @@ import java.util.List;
  */
 public interface ContractLogMapper extends BaseMapper<ContractLog> {
 
-	List<String> getSubmitLogDateList(@Param("contractId") String contractId, @Param("primaryKeyId") String primaryKeyId);
+	List<String> getSubmitLogDateList(@Param("contractId") String contractId, @Param("primaryKeyId") String primaryKeyId, @Param("year") String year);
 
 	List<ContractLog> queryFillUser(@Param("vo") ContractLogVO vo);
 

+ 6 - 2
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ContractLogMapper.xml

@@ -25,10 +25,12 @@
         <result column="file_name" property="fileName"/>
         <result column="pdf_url" property="pdfUrl"/>
         <result column="e_visa_pdf_url" property="eVisaPdfUrl"/>
+        <result column="audit_user_id_and_name" property="auditUserIdAndName"/>
+        <result column="batch" property="batch"/>
     </resultMap>
 
     <select id="getSubmitLogDateList" resultType="java.lang.String">
-        select record_time from u_contract_log where is_deleted = 0 and wbs_node_id = #{primaryKeyId} and contract_id = #{contractId} group by record_time order by record_time DESC
+        select record_time from u_contract_log where is_deleted = 0 and wbs_node_id = #{primaryKeyId} and contract_id = #{contractId} and record_time like concat('%',#{year},'%') group by record_time order by record_time DESC
     </select>
 
     <select id="queryFillUser" resultMap="contractLogResultMap">
@@ -47,7 +49,9 @@
           file_name,
           status,
           pdf_url,
-          e_visa_pdf_url
+          e_visa_pdf_url,
+          audit_user_id_and_name,
+          batch
         from
           u_contract_log
         where

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/IContractLogService.java

@@ -34,7 +34,7 @@ public interface IContractLogService extends BaseService<ContractLog> {
 
 	List<FileUserVO> queryFillUser(ContractLogVO logVO);
 
-	List<String> getSubmitLogDateList(String contractId, String primaryKeyId);
+	List<String> getSubmitLogDateList(String contractId, String primaryKeyId, String year);
 
 	/**
 	 * 施工日志分页

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ContractLogServiceImpl.java

@@ -42,8 +42,8 @@ import java.util.List;
 public class ContractLogServiceImpl extends BaseServiceImpl<ContractLogMapper, ContractLog> implements IContractLogService {
 
 	@Override
-	public List<String> getSubmitLogDateList(String contractId, String primaryKeyId) {
-		return this.baseMapper.getSubmitLogDateList(contractId, primaryKeyId);
+	public List<String> getSubmitLogDateList(String contractId, String primaryKeyId, String year) {
+		return this.baseMapper.getSubmitLogDateList(contractId, primaryKeyId, year);
 	}
 
 	@Override

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/utils/FunctionMain.java

@@ -118,9 +118,9 @@ public class FunctionMain {
         }
     }
 
-    public static void main(String[] args) {
+    /*public static void main(String[] args) {
         getToken();
-    }
+    }*/
     public static void createTable(Class<?> clazz,String remark) {
                String tableName=clazz.getAnnotation(TableName.class).value();
                StringBuilder sql = new StringBuilder( "DROP TABLE IF EXISTS `"+tableName+"`;\n");

+ 114 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -28,6 +28,7 @@ import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.springblade.business.feign.ContractLogClient;
+import org.springblade.business.vo.SaveContractLogVO;
 import org.springblade.common.constant.CommonConstant;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.MathUtil;
@@ -45,6 +46,8 @@ import org.springblade.manager.entity.*;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.*;
 import org.springblade.manager.unit.FileUtils;
+import org.springblade.manager.unit.RegularExpressionUtil;
+import org.springblade.manager.unit.WbsElementUtil;
 import org.springblade.manager.vo.*;
 import org.springblade.manager.wrapper.ExcelTabWrapper;
 import org.springblade.resource.feign.CommonFileClient;
@@ -482,19 +485,25 @@ public class ExcelTabController extends BladeController {
                     double maxScore = 0.48;
                     String lastName = "警告";
                     String attrInfo = "key" + "__" + i + "_" + j;
-                    ;
+                    String filedType = "";
 
                     for (WbsFormElement elementInfo : elementList) {
                         String ysName = elementInfo.getEName().replaceAll("[^\u4E00-\u9FA5_]", "");
                         if (titleName.equals(ysName)) {
                             lastName = elementInfo.getEName();
                             attrInfo = elementInfo.getEKey() + "__" + i + "_" + j;
+
+                            filedType = WbsElementUtil.getInitTableFiledType(elementInfo.getEType());
+
                             maxScore = 100;
                             is_true = true;
                             break;
                         } else {
                             if (MathUtil.sim(titleName, ysName) > maxScore) {
                                 attrInfo = elementInfo.getEKey() + "__" + i + "_" + j;
+
+                                filedType = WbsElementUtil.getInitTableFiledType(elementInfo.getEType());
+
                                 lastName = ysName;
                                 maxScore = MathUtil.sim(titleName, ysName);
                                 is_true = true;
@@ -502,15 +511,19 @@ public class ExcelTabController extends BladeController {
                         }
                     }
                     String oncklickText = "'" + lastName + "'," + i + "," + j;
-                    if (is_true) {
-                        element.children().get(0).attr("placeholder", lastName).attr("@focus", "getInformation(" + oncklickText + ")")
-                                .attr("weighing", maxScore + "").attr("id", attrInfo).attr("keyName", attrInfo).attr("v-model", "formData." + attrInfo);
 
-                        //todo 正则表达式返回字段类型校验
+                    //字段正则表达式校验
+                    String regularExpression = "'" + RegularExpressionUtil.getRegularExpression(filedType) + "'," + "字段类型:" + (StringUtils.isNotEmpty(filedType) ? WbsElementUtil.getTypeName(filedType) : null) + "," + i + "," + j;
 
+                    if (is_true) {
+                        element.children().get(0).attr("placeholder", lastName).attr("@focus", "getInformation(" + oncklickText + ")")
+                                .attr("weighing", maxScore + "").attr("id", attrInfo).attr("keyName", attrInfo)
+                                .attr("@blur", "getRegularExpression(" + regularExpression + ")")
+                                .attr("v-model", "formData." + attrInfo);
                     } else {
                         element.children().get(0).attr("placeholder", lastName).attr("@focus", "getInformation(" + oncklickText + ")")
-                                .attr("weighing", maxScore + "").attr("id", attrInfo).attr("keyName", attrInfo);
+                                .attr("weighing", maxScore + "").attr("id", attrInfo).attr("keyName", attrInfo)
+                                .attr("@blur", "getRegularExpression(" + regularExpression + ")");
                     }
 
                 }
@@ -2011,4 +2024,99 @@ public class ExcelTabController extends BladeController {
         return R.data(resultMapList);
     }
 
+    /**
+     * 复制指定日期的日志填报数据
+     */
+    @GetMapping("/copy-the-log-business-data")
+    @ApiOperationSupport(order = 27)
+    @ApiOperation(value = "复制指定日期的日志填报数据")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "nodePrimaryKeyId", value = "当前操作的日志类型ID,即左侧列表的节点primaryKeyId"),
+            @ApiImplicitParam(name = "currentTime", value = "当前选择的填写日期,即右侧日期控件所选日期,格式为 yyyy-MM-dd"),
+            @ApiImplicitParam(name = "targetTime", value = "需要复制的目标日期")
+    })
+    public R<List<Map<String, Object>>> copyTheLogBusinessData(@RequestParam String nodePrimaryKeyId, @RequestParam String currentTime, @RequestParam String targetTime){
+        if(StringUtils.isNotEmpty(nodePrimaryKeyId) && StringUtils.isNotEmpty(currentTime) && StringUtils.isNotEmpty(targetTime)){
+            //获取目标的数据
+            JSONObject targetJson = this.contractLogClient.queryContractLogByPrimaryKeyIdAndRecordTime(nodePrimaryKeyId, targetTime);
+            if(targetJson == null){
+                return R.fail("目标日期下未找到当前用户填报的数据,请重新选择");
+            }
+            //查询是否存在关联工序的数据
+            List<JSONObject> wbsJsonList = this.contractLogClient.queryContractLogWbsByTheLogId(targetJson.getString("id"));
+
+            //获取目标数据所在数据表
+            WbsTreePrivate table = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, targetJson.getString("tableId")));
+
+            //获取目标数据
+            String queryTargetDataSql = "SELECT * FROM " + table.getInitTableName() + " WHERE group_id = " + targetJson.getString("dataId");
+            List<Map<String, Object>> targetDatas = this.jdbcTemplate.queryForList(queryTargetDataSql);
+
+            //检查当前日期下是否存在数据
+            JSONObject currentJson = this.contractLogClient.queryContractLogByPrimaryKeyIdAndRecordTime(nodePrimaryKeyId, currentTime);
+            String businessId = SnowFlakeUtil.getId().toString();
+            boolean isNew = true;
+            if(currentJson != null){
+                //有记录,需要删除掉原本记录填写的数据
+                String removeOldSql = "DELETE FROM " + table.getInitTableName() + " WHERE group_id = " + currentJson.getString("dataId");
+                this.jdbcTemplate.execute(removeOldSql);
+
+                //删除掉原本关联的工序节点
+                this.contractLogClient.removeContractLogWbsByTheLogId(currentJson.getString("id"));
+
+                //使用原本的数据ID
+                businessId = currentJson.getString("dataId");
+                isNew = false;
+            }
+            //新增的SQL集合
+            List<String> insertSqlList = new ArrayList<>();
+
+            //只需要替换group_id和id即可
+            for(Map<String, Object> dataMap : targetDatas){
+                StringBuilder insertSql = new StringBuilder("INSERT INTO " + table.getInitTableName()), keySql = new StringBuilder(), valueSql = new StringBuilder();
+                for(Map.Entry<String, Object> mapEntry : dataMap.entrySet()){
+                    String key = mapEntry.getKey();
+                    Object value = mapEntry.getValue();
+
+                    if("id".equals(key)){
+                        value = SnowFlakeUtil.getId();
+                    } else if("group_id".equals(key)){
+                        value = businessId;
+                    }
+                    //设置参数
+                    keySql.append(",").append(key);
+                    valueSql.append(",").append("'").append(value).append("'");
+                }
+                //组装SQL
+                insertSql.append(" (").append(keySql.toString().substring(1)).append(") ");
+                insertSql.append(" VALUES(").append(valueSql.toString().substring(1)).append(")");
+
+                insertSqlList.add(insertSql.toString());
+            }
+
+            if(insertSqlList.size() > 0){
+                //新增数据
+                for(String insertSql : insertSqlList){
+                    this.jdbcTemplate.execute(insertSql);
+                }
+            }
+            //处理数据
+            this.contractLogClient.saveContractLog(new SaveContractLogVO(
+                    Long.parseLong(businessId),
+                    targetJson.getString("projectId"),
+                    targetJson.getString("contractId"),
+                    Long.parseLong(targetJson.getString("wbsNodeId")),
+                    Long.parseLong(targetJson.getString("tableId")),
+                    Integer.parseInt(targetJson.getString("wbsNodeType")),
+                    currentTime,
+                    wbsJsonList
+            ));
+
+            //返回当前的新数据
+            return this.getTheLogBusinessData(!isNew  ? currentJson.getString("id") : null, nodePrimaryKeyId, currentTime);
+        }
+
+        return null;
+    }
+
 }

+ 3 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java

@@ -174,10 +174,10 @@ public class WbsTreeController extends BladeController {
     @ApiImplicitParam(name = "id", value = "表单id", required = true)
     public R removeTableById(@RequestParam("id") String id) {
         if (StringUtils.isNotEmpty(id)) {
-            List<WbsFormElementVO> wbsFormElements = wbsTreeService.selectFormElements(id);
+            /*List<WbsFormElementVO> wbsFormElements = wbsTreeService.selectFormElements(id);
             if (wbsFormElements.size() > 0) {
-                throw new ServiceException("该表单中存在元素,删除失败");
-            }
+                throw new ServiceException("该表单中存在元素,删除失败");
+            }*/
             List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
                     .eq(WbsTreePrivate::getStatus, 1)
                     .eq(WbsTreePrivate::getId, id));

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -369,7 +369,7 @@ public class WbsTreePrivateController extends BladeController {
      * 查询节点元素表与节点参数
      */
     @ApiOperationSupport(order = 12)
-    @ApiOperation(value = "查询节点元素表与节点参数", notes = "传入节点oldId、节点oldId")
+    @ApiOperation(value = "查询节点元素表与节点参数", notes = "传入节点parentId、wbsId、projectId")
     @RequestMapping(value = "/getNodeTabAndParam", method = RequestMethod.GET)
     public R<WbsNodeTabAndParamVO> getNodeTabAndParam(@RequestParam("parentId") String parentId,
                                                       @RequestParam("wbsId") String wbsId,

+ 6 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -313,6 +313,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 		}
 		List<JSONObject> linkTabIds = JSONArray.parseArray(JSONObject.toJSONString(tableInfoList.get(0).getLinkTabIds()), JSONObject.class);
 
+		if(StringUtils.isNotEmpty(businessId)){
+			//删除旧数据
+			String delSql = "delete from " + tableNode.getInitTableName() + " where group_id = " + businessId;
+			this.jdbcTemplate.execute(delSql);
+		}
+
 		for(TableInfo tableInfo : tableInfoList){
 			WbsTreePrivate wbsTreePrivate = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, tableInfo.getPkeyId()));
 			if(wbsTreePrivate == null){
@@ -320,12 +326,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 			}
 			String tabName = wbsTreePrivate.getInitTableName();
 
-			if(StringUtils.isNotEmpty(businessId)){
-				//删除旧数据
-				String delSql = "delete from "+tabName+" where group_id = " + businessId;
-				this.jdbcTemplate.execute(delSql);
-			}
-
 			//拼接SQL
 			StringBuilder sql = new StringBuilder("INSERT INTO " + tabName ),
 						  keySql = new StringBuilder("id, group_id"),

+ 34 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/unit/RegularExpressionUtil.java

@@ -0,0 +1,34 @@
+package org.springblade.manager.unit;
+
+/**
+ * 正则表达式工具类
+ */
+public class RegularExpressionUtil {
+
+    //正、负整数
+    String POSITIVE_NEGTIVE_INTEGER = "-?[1-9]\\d*";
+    //正、负浮点数
+    String POSITIVE_NEGTIVE_FLOAT = "-?([1-9]\\d*.\\d*|0\\.\\d*[1-9]\\d*)";
+    //日期 yyyy MM dd
+    String DATE_TIME = "\\d{4}(\\-|\\/|.)\\d{1,2}\\1\\d{1,2}";
+
+    public static String getRegularExpression(String filedType) {
+        RegularExpressionUtil obj = new RegularExpressionUtil();
+        switch (filedType) {
+            case "bigint":
+                return obj.POSITIVE_NEGTIVE_INTEGER.replaceAll("\\\\\\\\", "\\\\");
+            case "decimal":
+                return obj.POSITIVE_NEGTIVE_FLOAT.replaceAll("\\\\\\\\", "\\\\");
+            case "datetime":
+                return obj.DATE_TIME.replaceAll("\\\\\\\\", "\\\\");
+        }
+        return "";
+    }
+
+    /*public static void main(String[] args) {
+        String str = "datetime";
+        System.out.println(getRegularExpression(str));
+    }*/
+
+
+}

+ 13 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/unit/WbsElementUtil.java

@@ -171,4 +171,17 @@ public class WbsElementUtil {
         }
     }
 
+    public static String getTypeName(String type) {
+        switch (type) {
+            case "bigint":
+                return "整数或数值";
+            case "decimal":
+                return "小数";
+            case "datetime":
+                return "日期";
+            default:
+                return "字符串";
+        }
+    }
+
 }