chenr 1 сар өмнө
parent
commit
057d8b1c66

+ 1 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ServicePlanDTO.java

@@ -31,4 +31,5 @@ import lombok.EqualsAndHashCode;
 public class ServicePlanDTO extends ServicePlan {
 	private static final long serialVersionUID = 1L;
 
+    private String userId;
 }

+ 13 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/ServiceUserDto.java

@@ -0,0 +1,13 @@
+package org.springblade.manager.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ServiceUserDto {
+    private String userId;
+    private String userName;
+}

+ 15 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ServicePlan.java

@@ -19,6 +19,8 @@ package org.springblade.manager.entity;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.time.LocalDate;
+
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.core.mp.base.BaseEntity;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -39,31 +41,44 @@ public class ServicePlan extends BaseEntity {
 	/**
 	* 填写类型 1月度服务计划 2服务完成确认单
 	*/
+    @ApiModelProperty(value = "填写类型 1月度服务计划 2服务完成确认单")
 		private Integer fileInType;
     /**
      * 项目Id
      */
+    @ApiModelProperty(value = "项目Id")
         private Long projectId;
     /**
      * 合同段Id
      */
+    @ApiModelProperty(value = "合同段Id")
         private Long contractId;
 	/**
 	* 计划开始时间
 	*/
+    @ApiModelProperty(value = "计划开始时间")
 		private LocalDate planStartTime;
 	/**
 	* 计划结束时间
 	*/
+    @ApiModelProperty(value = "计划结束时间")
 		private LocalDate planEndTime;
     /**
      * 编写人
      */
+    @ApiModelProperty(value = "编写人ID 逗号拼接")
         private String writeUser;
 	/**
 	* 发送人员
 	*/
+    @ApiModelProperty(value = "发送人员ID 逗号拼接")
 		private String sendUser;
+    /**
+     * pdf路径
+      */
+    @ApiModelProperty(value = "pdf路径")
+        private String pdfUrl;
+
 
 
 

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ServicePlanVO.java

@@ -41,4 +41,6 @@ public class ServicePlanVO extends ServicePlan {
    //发送人
    private String sendUserName;
 
+   private String planTime;
+
 }

+ 6 - 0
blade-service/blade-manager/pom.xml

@@ -208,6 +208,12 @@
             <version>7.2.4</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>joda-time</groupId>
+            <artifactId>joda-time</artifactId>
+            <version>2.10.3</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     <build>
         <plugins>

+ 109 - 44
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ServicePlanController.java

@@ -43,15 +43,18 @@ import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.oss.model.BladeFile;
+import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.dto.ServicePlanDTO;
+import org.springblade.manager.dto.ServiceUserDto;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestParam;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -77,7 +80,7 @@ import java.util.stream.Collectors;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/serviceplan")
-@Api(value = "", tags = "接口")
+@Api(value = "服务计划", tags = "服务计划接口")
 public class ServicePlanController extends BladeController {
 
 	private final IServicePlanService servicePlanService;
@@ -90,6 +93,9 @@ public class ServicePlanController extends BladeController {
 	@GetMapping("/detail")
 	@ApiOperationSupport(order = 1)
 	@ApiOperation(value = "详情", notes = "传入servicePlan")
+    @ApiImplicitParams(value = {
+        @ApiImplicitParam(name = "id", value = "id", required = true)
+    })
 	public R<ServicePlanVO> detail(ServicePlan servicePlan) {
 		ServicePlan detail = servicePlanService.getOne(Condition.getQueryWrapper(servicePlan));
 		return R.data(ServicePlanWrapper.build().entityVO(detail));
@@ -98,13 +104,13 @@ public class ServicePlanController extends BladeController {
 	/**
 	 * 分页
 	 */
-	@GetMapping("/list")
-	@ApiOperationSupport(order = 2)
-	@ApiOperation(value = "分页", notes = "传入servicePlan")
-	public R<IPage<ServicePlanVO>> list(ServicePlan servicePlan, Query query) {
-		IPage<ServicePlan> pages = servicePlanService.page(Condition.getPage(query), Condition.getQueryWrapper(servicePlan));
-		return R.data(ServicePlanWrapper.build().pageVO(pages));
-	}
+//	@GetMapping("/list")
+//	@ApiOperationSupport(order = 2)
+//	@ApiOperation(value = "分页", notes = "传入servicePlan")
+//	public R<IPage<ServicePlanVO>> list(ServicePlan servicePlan, Query query) {
+//		IPage<ServicePlan> pages = servicePlanService.page(Condition.getPage(query), Condition.getQueryWrapper(servicePlan));
+//		return R.data(ServicePlanWrapper.build().pageVO(pages));
+//	}
 
 
 	/**
@@ -113,40 +119,89 @@ public class ServicePlanController extends BladeController {
 	@GetMapping("/page")
 	@ApiOperationSupport(order = 3)
 	@ApiOperation(value = "分页", notes = "传入servicePlan")
+    @ApiImplicitParams(value = {
+        @ApiImplicitParam(name = "projectId", value = "项目Id", required = true),
+        @ApiImplicitParam(name = "contractId", value = "合同Id", required = true)
+    })
 	public R<IPage<ServicePlanVO>> page(ServicePlanDTO servicePlan, Query query) {
 		IPage<ServicePlanVO> pages = servicePlanService.selectServicePlanPage(Condition.getPage(query), servicePlan);
 		return R.data(pages);
 	}
+    @GetMapping("/getSendUserAndWriteUser")
+    @ApiOperationSupport(order = 35)
+    @ApiOperation(value = "获取发送人及填写人", notes = "获取发送人及填写人")
+    @ApiImplicitParams(value = {
+        @ApiImplicitParam(name = "projectId", value = "项目Id", required = true),
+        @ApiImplicitParam(name = "contractId", value = "合同Id", required = true)
+    })
+    public R<Map<String,List<ServiceUserDto>>> getSendUserAndWriteUser(Long projectId, Long contractId){
+        return R.data(servicePlanService.getSendUserAndWriteUser(projectId,contractId));
+    }
 
 	/**
 	 * 新增
 	 */
-	@PostMapping("/save")
-	@ApiOperationSupport(order = 4)
-	@ApiOperation(value = "新增", notes = "传入servicePlan")
-	public R save(@Valid @RequestBody ServicePlan servicePlan) {
-		return R.status(servicePlanService.save(servicePlan));
-	}
+//	@PostMapping("/save")
+//	@ApiOperationSupport(order = 4)
+//	@ApiOperation(value = "新增", notes = "传入servicePlan")
+//    @ApiImplicitParams(value = {
+//        @ApiImplicitParam(name = "projectId", value = "项目Id", required = true),
+//        @ApiImplicitParam(name = "contractId", value = "合同Id", required = true),
+//        @ApiImplicitParam(name = "type", value = "1月度服务计划 2服务完成确认单", required = true),
+//        @ApiImplicitParam(name = "planStartTime", value = "计划开始时间", required = true),
+//        @ApiImplicitParam(name = "planEndTime", value = "计划结束时间", required = true),
+//    })
+//	public R save(@Valid @RequestBody ServicePlan servicePlan) {
+//        servicePlan.setWriteUser(SecureUtil.getUserId()+"");
+//        return R.status(servicePlanService.save(servicePlan));
+//	}
 
 	/**
 	 * 修改
 	 */
-	@PostMapping("/update")
-	@ApiOperationSupport(order = 5)
-	@ApiOperation(value = "修改", notes = "传入servicePlan")
-	public R update(@Valid @RequestBody ServicePlan servicePlan) {
-		return R.status(servicePlanService.updateById(servicePlan));
-	}
+//	@PostMapping("/update")
+//	@ApiOperationSupport(order = 5)
+//	@ApiOperation(value = "修改", notes = "传入servicePlan")
+//	public R update(@Valid @RequestBody ServicePlan servicePlan) {
+//        if(servicePlan.getWriteUser()!=null){
+//            if(!servicePlan.getWriteUser().contains(SecureUtil.getUserId()+"")){
+//                servicePlan.setWriteUser(servicePlan.getWriteUser()+","+SecureUtil.getUserId()+"");
+//            }
+//        }
+//		return R.status(servicePlanService.updateById(servicePlan));
+//	}
+    @GetMapping("/sendServicePlan")
+    @ApiOperationSupport(order = 34)
+    @ApiOperation(value = "修改服务计划流程", notes = "修改服务计划流程")
+    @ApiImplicitParams(value = {
+        @ApiImplicitParam(name = "id", value = "计划id", required = true),
+        @ApiImplicitParam(name = "sendUser", value = "发送人ID 逗号拼接", required = false),
+        @ApiImplicitParam(name = "status", value = "2发送,3回退,4完成", required = true),
+    })
+    public R changeServicePlanStatus(Long id,String sendUser,Integer status){
+        ServicePlan plan = servicePlanService.getById(id);
+        if(plan!=null){
+            if(StringUtils.isNotEmpty(sendUser)&&status==2){
+                plan.setSendUser(sendUser);
+                plan.setStatus(2);
+            } else if (status==3) {
+                plan.setStatus(3);
+            }else {
+                plan.setStatus(4);
+            }
+        }
+       return R.status(servicePlanService.updateById(plan));
+    }
 
 	/**
 	 * 新增或修改
 	 */
-	@PostMapping("/submit")
-	@ApiOperationSupport(order = 6)
-	@ApiOperation(value = "新增或修改", notes = "传入servicePlan")
-	public R submit(@Valid @RequestBody ServicePlan servicePlan) {
-		return R.status(servicePlanService.saveOrUpdate(servicePlan));
-	}
+//	@PostMapping("/submit")
+//	@ApiOperationSupport(order = 6)
+//	@ApiOperation(value = "新增或修改", notes = "传入servicePlan")
+//	public R submit(@Valid @RequestBody ServicePlan servicePlan) {
+//		return R.status(servicePlanService.saveOrUpdate(servicePlan));
+//	}
 
 
 	/**
@@ -161,24 +216,23 @@ public class ServicePlanController extends BladeController {
 
     @GetMapping("/getServiceHtml")
     @ApiOperationSupport(order = 8)
-    @ApiOperation(value = "获取服务计划html", notes = "传入pKeyId,id")
-    public R<String> getServiceHtml(Long projectId, Long contractId,Integer type){
-        return R.data(servicePlanService.getServiceHtml(projectId,contractId,type));
+    @ApiOperation(value = "获取服务计划html", notes = "projectId,contractId,type 1月度服务计划 2服务完成确认单")
+    @ApiImplicitParams(value = {
+        @ApiImplicitParam(name = "projectId", value = "项目ID", required = true),
+        @ApiImplicitParam(name = "contractId", value = "合同段ID", required = false),
+        @ApiImplicitParam(name = "pkeyId", value = "1月度服务计划 2服务完成确认单", required = true),
+    })
+    public R<String> getServiceHtml(Long projectId, Long contractId,Long pkeyId){
+        return R.data(servicePlanService.getServiceHtml(projectId,contractId,pkeyId));
     }
 
     @GetMapping("/get-html-buss-cols")
     @ApiOperationSupport(order = 36)
     @ApiOperation(value = "获取坐标位置", notes = "获取坐标位置")
     @ApiImplicitParams(value = {
-        @ApiImplicitParam(name = "pkeyId", value = "pkeyId", required = true)
+        @ApiImplicitParam(name = "pkeyId", value = "1月度服务计划 2服务完成确认单", required = true)
     })
-    public R getHtmlBussCols(Integer type) {
-        Long pkeyId = 0L;
-        if(type==1){
-            pkeyId=1937773223861026820L;
-        }else {
-            pkeyId=1937773223861026822L;
-        }
+    public R getHtmlBussCols(Long pkeyId) {
         String sql="select * from m_wbs_tree_contract where p_key_id="+pkeyId;
         WbsTreeContract wbsTreeContract = jdbcTemplate.queryForObject( sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
         if (wbsTreeContract == null) {
@@ -242,14 +296,17 @@ public class ServicePlanController extends BladeController {
     @PostMapping("/saveServiceData")
     @ApiOperationSupport(order = 9)
     @ApiOperation(value = "保存服务计划数据", notes = "传入dataInfo")
+    @Transactional
     public R saveServiceData(@Valid @RequestBody JSONObject dataInfo) throws Exception {
         JSONArray dataArray = new JSONArray();
-        String groupId = dataInfo.getString("groupId");
-        String type = dataInfo.getString("type");
+        Long pkeyId = Long.valueOf(dataInfo.getString("pkeyId"));
+        Long projectId=Long.valueOf(dataInfo.getString("projectId"));
+        Long contractId=Long.valueOf(dataInfo.getString("contractId"));
         dataArray.add(dataInfo);
         List<TableInfo> tableInfoList=getServiceData(dataArray);
-        servicePlanService.saveServiceData(tableInfoList,Func.toLong(groupId),Func.toInt(type));
-        servicePlanService.saveServicePlanPdf(Func.toInt(type),Func.toLong(groupId));
+        Long groupId = servicePlanService.saveServicePlan(pkeyId,projectId,contractId,dataInfo);
+        servicePlanService.saveServiceData(tableInfoList,groupId,pkeyId);
+        servicePlanService.saveServicePlanPdf(projectId,pkeyId,Func.toLong(groupId));
         return R.status( true);
     }
 
@@ -260,8 +317,6 @@ public class ServicePlanController extends BladeController {
             for (int m = 0; m < dataInfo.size(); m++) {
                 TableInfo tableInfo = new TableInfo();
                 JSONObject dataInfo2 = dataInfo.getJSONObject(m);
-                tableInfo.setPkeyId(dataInfo2.getString("pkeyId"));
-                tableInfo.setTestGroupId(dataInfo2.getString("group_id"));
                 tableInfo.setToBeUpdated(true);
                 tableInfo.setContractId(dataInfo2.getString("contractId"));
                 dataInfo2.fluentRemove("contractId")
@@ -320,7 +375,6 @@ public class ServicePlanController extends BladeController {
                         }
                     }
                 }
-                dataMap2.put("p_key_id", tableInfo.getPkeyId());
                 tableInfo.setDataMap(dataMap2);
                 result.add(tableInfo);
             }
@@ -329,4 +383,15 @@ public class ServicePlanController extends BladeController {
         return null;
     }
 
+    @GetMapping("/getServiceBussData")
+    @ApiOperationSupport(order = 36)
+    @ApiOperation(value = "获取保存数据", notes = "获取保存数据")
+    @ApiImplicitParams(value = {
+        @ApiImplicitParam(name = "id", value = "id", required = true),
+        @ApiImplicitParam(name = "pkeyId", value = "1月度服务计划 2服务完成确认单", required = true)
+    })
+    public R<List<Map<String, Object>>> getServiceBussData(Long id,Long pkeyId){
+        return R.data(servicePlanService.getServiceBussData(id,pkeyId));
+    }
+
 }

+ 13 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IServicePlanService.java

@@ -16,15 +16,19 @@
  */
 package org.springblade.manager.service;
 
+import com.alibaba.fastjson.JSONObject;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.dto.ServicePlanDTO;
+import org.springblade.manager.dto.ServiceUserDto;
 import org.springblade.manager.entity.ServicePlan;
 import org.springblade.manager.vo.ServicePlanVO;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import javax.validation.Valid;
 import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 
 /**
  *  服务类
@@ -43,9 +47,15 @@ public interface IServicePlanService extends BaseService<ServicePlan> {
 	 */
 	IPage<ServicePlanVO> selectServicePlanPage(IPage<ServicePlanVO> page, ServicePlanDTO servicePlan);
 
-    String getServiceHtml(Long projectId,Long contractId,Integer type);
+    String getServiceHtml(Long projectId,Long contractId,Long pkeyId);
 
-    boolean saveServiceData(List<TableInfo> tableInfoList,Long groupId,Integer type);
+    boolean saveServiceData(List<TableInfo> tableInfoList,Long groupId,Long pkeyId);
 
-    void saveServicePlanPdf(int anInt, long aLong) throws Exception;
+    void saveServicePlanPdf(Long projectId,Long pkeyId, Long id) throws Exception;
+
+    List<Map<String, Object>> getServiceBussData(Long id, Long pkeyId);
+
+    Map<String,List<ServiceUserDto>> getSendUserAndWriteUser(Long projectId, Long contractId);
+
+    Long saveServicePlan(Long pkeyId,Long projectId,Long contractId,@Valid JSONObject dataInfo);
 }

+ 238 - 67
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ServicePlanServiceImpl.java

@@ -47,6 +47,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.dto.ServicePlanDTO;
+import org.springblade.manager.dto.ServiceUserDto;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.manager.vo.ServicePlanVO;
@@ -70,6 +71,7 @@ import org.springframework.transaction.support.DefaultTransactionDefinition;
 import javax.annotation.Resource;
 import java.io.*;
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -91,17 +93,25 @@ public class ServicePlanServiceImpl extends BaseServiceImpl<ServicePlanMapper, S
 
 	@Override
 	public IPage<ServicePlanVO> selectServicePlanPage(IPage<ServicePlanVO> page, ServicePlanDTO servicePlan) {
-        List<ServicePlanVO> vos = baseMapper.selectServicePlanPage(page, servicePlan);
-        for (ServicePlanVO vo : vos) {
-           vo.setStatusValue(vo.getStatus()==1?"1计划中":vo.getStatus()==2?"协同中-甲方":vo.getStatus()==3?"协同中-系统":"已计划");
+        servicePlan.setUserId(SecureUtil.getUserId()+"");
+        List<ServicePlan> vos = baseMapper.selectServicePlanPage(page, servicePlan);
+        List<ServicePlanVO>voList = new ArrayList<>();
+        for (ServicePlan sp : vos) {
+            ServicePlanVO vo = new ServicePlanVO();
+            BeanUtil.copyProperties(sp, vo);
+           vo.setStatusValue(vo.getStatus()==1?"计划中":vo.getStatus()==2?"协同中-甲方":vo.getStatus()==3?"协同中-系统":"已计划");
            vo.setIsEdit(checkIsEdit(vo));
            vo.setStartTime(vo.getPlanStartTime().format(DateTimeFormatter.ofPattern("yyyy年M月d日")));
            vo.setEndTime(vo.getPlanEndTime().format(DateTimeFormatter.ofPattern("yyyy年M月d日")));
+           vo.setPlanTime(vo.getStartTime()+"至"+vo.getEndTime());
            vo.setSendUserName(slectUserName(vo.getSendUser()));
+            voList.add( vo);
         }
-        return page.setRecords(vos);
+        return page.setRecords(voList);
 	}
 
+
+
     private String slectUserName(String sendUser) {
         if(StringUtils.isNotEmpty(sendUser)){
             String sql="select real_name from blade_user where id in("+sendUser+")";
@@ -131,13 +141,7 @@ public class ServicePlanServiceImpl extends BaseServiceImpl<ServicePlanMapper, S
     }
 
     @Override
-    public String getServiceHtml(Long projectId, Long contractId,Integer type) {
-        Long pkeyId = 0L;
-        if(type==1){
-            pkeyId=1937773223861026820L;
-        }else {
-            pkeyId=1937773223861026822L;
-        }
+    public String getServiceHtml(Long projectId, Long contractId,Long pkeyId) {
         String sql="select * from m_wbs_tree_contract where p_key_id="+pkeyId;
         WbsTreeContract wbsTreeContract = jdbcTemplate.queryForObject( sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
         if (wbsTreeContract == null) {
@@ -155,31 +159,10 @@ public class ServicePlanServiceImpl extends BaseServiceImpl<ServicePlanMapper, S
 
             // 远程搜索配置
             Document doc = Jsoup.parse(htmlString);
-            int maxCol = doc.select("Col").size();
             Element table = doc.select("table").first();
-            Elements hc = doc.select("hc-form-select-search");
-            if (hc.size() >= 1) {
-                for (int i = 0; i < hc.size(); i++) {
-                    Element datax = hc.get(i);
-                    datax.removeAttr("pkeyId");
-                    datax.removeAttr("contractId");
-                    datax.attr("pkeyId", pkeyId + "");
-                    datax.attr("contractId",contractId+"");
-                }
-            }
-
-            // 远程搜索配置2-设计强度搜索
-            Elements hc2 = doc.select("hc-form-select-search2");
-            if (hc2.size() >= 1) {
-                for (int i = 0; i < hc2.size(); i++) {
-                    Element datax = hc2.get(i);
-                    datax.removeAttr("contractId");
-                    datax.attr("contractId", contractId+"");
-                }
-            }
             // 标题解决
             String sql1="select * from m_project_info where id="+projectId;
-            ProjectInfo projectInfo = jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<>(ProjectInfo.class));
+            ProjectInfo projectInfo = jdbcTemplate.queryForObject(sql1,new BeanPropertyRowMapper<>(ProjectInfo.class));
             //判断是否是水利水电表,水利水电项目名14,表名12 。   其他表都是18
             Boolean isWater = false;
             // 添加标题显示
@@ -228,35 +211,26 @@ public class ServicePlanServiceImpl extends BaseServiceImpl<ServicePlanMapper, S
     }
 
     @Override
-    public boolean saveServiceData(List<TableInfo> tableInfoList,Long groupId,Integer type) {
-        //试验填报
+    public boolean saveServiceData(List<TableInfo> tableInfoList,Long groupId,Long  pkeyId) {
         if (ListUtils.isNotEmpty(tableInfoList)) {
             for (TableInfo tableInfo : tableInfoList) {
-                Long pkeyId = 0L;
-                if(type==1){
-                    pkeyId=1937773223861026820L;
-                }else {
-                    pkeyId=1937773223861026822L;
-                }
                 String sql="select * from m_wbs_tree_contract where p_key_id="+pkeyId;
                 WbsTreeContract wbsTreeContract = jdbcTemplate.queryForObject( sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
                 if (wbsTreeContract == null || StringUtils.isEmpty(wbsTreeContract.getInitTableName())) {
                     continue;
                 }
                 //删除SQL
-                String delSql = "delete from " + wbsTreeContract.getInitTableName() + " where p_key_id='" + tableInfo.getPkeyId() + "' and group_id = '" + groupId + "'";
+                String delSql = "delete from " + wbsTreeContract.getInitTableName() + " where p_key_id='" + pkeyId + "' and group_id = '" + groupId + "'";
 
-                //新增SQL
+                //新增SQ
                 String sqlInfo = "";
                 LinkedHashMap<String, String> dataMap2 = tableInfo.getDataMap();
-                if(!dataMap2.containsKey("p_key_id")){
-                    if(tableInfo.getPkeyId()!=null&&!tableInfo.getPkeyId().equals("")){
-                        dataMap2.put("p_key_id",tableInfo.getPkeyId());
-                    }
-                }
                 sqlInfo = "INSERT INTO " + wbsTreeContract.getInitTableName() + " ( ";
-                String keyStr = "id,group_id,";
-                String valStr = SnowFlakeUtil.getId() + "," + groupId + ",";
+                String keyStr = "id,p_key_id,group_id,";
+                String valStr = SnowFlakeUtil.getId() + "," + pkeyId + ","+groupId+",";
+                if(dataMap2.containsKey("p_key_id")){
+                    dataMap2.remove("p_key_id");
+                }
                 for (String keys : dataMap2.keySet()) {
                     keyStr += keys + ",";
                     valStr += "'" + dataMap2.get(keys) + "',";
@@ -283,13 +257,7 @@ public class ServicePlanServiceImpl extends BaseServiceImpl<ServicePlanMapper, S
     }
 
     @Override
-    public void saveServicePlanPdf(int type, long id) throws Exception {
-        Long pkeyId = 0L;
-        if(type==1){
-            pkeyId=1937773223861026820L;
-        }else {
-            pkeyId=1937773223861026822L;
-        }
+    public void saveServicePlanPdf(Long projectId,Long pkeyId, Long id) throws Exception {
         String file_path = FileUtils.getSysLocalFileUrl();//ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
         String sys_file_net_url = ParamCache.getValue(CommonConstant.SYS_FILE_NET_URL);
         String sql="select * from m_wbs_tree_contract where p_key_id="+pkeyId;
@@ -315,7 +283,7 @@ public class ServicePlanServiceImpl extends BaseServiceImpl<ServicePlanMapper, S
         }
 
         //获取数据信息info
-        List<Map<String, Object>> bussDataInfoTrial = this.getBussDataInfoTrial(type,id);
+        List<Map<String, Object>> bussDataInfoTrial = this.getBussDataInfoTrial(pkeyId,id);
         Map<String, Object> DataInfo = new HashMap<>();
         if (bussDataInfoTrial.size() > 0) {
             DataInfo.putAll(bussDataInfoTrial.stream().findAny().orElse(null));
@@ -326,7 +294,7 @@ public class ServicePlanServiceImpl extends BaseServiceImpl<ServicePlanMapper, S
         Sheet sheet = workbook.getSheetAt(0);
         sheet.setForceFormulaRecalculation(true);
 
-       String sql2="selece * from m_project_info where id="+wbsTreeContract.getProjectId();
+       String sql2="select * from m_project_info where id="+projectId;
        ProjectInfo projectInfo = jdbcTemplate.queryForObject(sql2, new BeanPropertyRowMapper<>(ProjectInfo.class));
         int all = sheet.getRow(0).getLastCellNum();
         int mergedCellCnt = sheet.getNumMergedRegions();
@@ -500,23 +468,226 @@ public class ServicePlanServiceImpl extends BaseServiceImpl<ServicePlanMapper, S
         FileUtils.setExcelScaleToPdf(excelPath, pdfPath);
         BladeFile bladeFile = newIOSSClient.uploadFile(id + ".pdf", pdfPath);
         if (bladeFile != null) {
-            String sql3="update m_service_plan set pdf_url="+bladeFile.getLink()+" where id="+id;
+            String sql3="update m_service_plan set pdf_url=' "+bladeFile.getLink()+" ' where id="+id;
             jdbcTemplate.update(sql3);
         }
 
     }
 
-    private List<Map<String, Object>> getBussDataInfoTrial(Integer type, Long id) {
-        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        String sys_file_net_url = ParamCache.getValue(CommonConstant.SYS_FILE_NET_URL);
+    @Override
+    public List<Map<String, Object>> getServiceBussData(Long id, Long pkeyId) {
         List<Map<String, Object>> list = new ArrayList<>();
         Map<String, Object> reData = new HashMap<>();
-        Long pkeyId = 0L;
-        if(type==1){
-            pkeyId=1937773223861026820L;
+        String sqll="select * from m_wbs_tree_contract where p_key_id="+pkeyId;
+        WbsTreeContract wbsTreeContract = jdbcTemplate.queryForObject(sqll, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+        if (wbsTreeContract == null) {
+            throw new ServiceException("该数据下无此节点!");
+        }
+        if (wbsTreeContract.getHtmlUrl() == null) {
+            throw new ServiceException("请关联清表!");
+        }
+        //表单是否存储在
+        String tabName = wbsTreeContract.getInitTableName();
+        String isExitSql = "select * from information_schema.TABLES where TABLE_NAME='" + tabName + "'";
+        List<Map<String, Object>> tabList = jdbcTemplate.queryForList(isExitSql);
+        if (tabList.size() <= 0) {
+            throw new ServiceException("请关联清表!");
+        }
+        //实体数据
+        String querySql = "select * from " + wbsTreeContract.getInitTableName() + " where p_key_id=" + pkeyId + " and group_id = " + id;
+        List<Map<String, Object>> dataIn = jdbcTemplate.queryForList(querySql);
+        //匹配关联
+        try {
+            if (dataIn.size() >= 1) {
+                Map<String, Object> mysqlData = dataIn.get(0);
+                for (String key : mysqlData.keySet()) {
+                    String tabVal = mysqlData.get(key) + "";
+                    // 时间段处理
+                    if (StringUtils.isNotEmpty(tabVal) && !tabVal.equals("null")) {
+                        if (tabVal.contains("T") && tabVal.contains(".000Z]")) {
+                            String[] tabData = tabVal.split("_\\^_");
+
+                            if (reData.containsKey("pickerKey")) {
+                                String pickerKey = reData.get("pickerKey") + "," + key + "__" + tabData[1];
+                                reData.put("pickerKey", pickerKey);
+                            } else {
+                                reData.put("pickerKey", key + "__" + tabData[1]);
+                            }
+
+                            String sql = tabData[0];
+                            sql = sql.replaceAll("\\[", "['");
+                            sql = sql.replaceAll("]", "']");
+                            sql = sql.replaceAll("000Z,", "000Z',");
+                            sql = sql.replaceAll(", 20", ", '20");
+                            //   sql = sql.replaceAll("'", "");
+                            if (StringUtils.isNotEmpty(tabData[0])) {
+                                reData.put(key + "__" + tabData[1], sql);
+                            }
+                        } else if (tabVal.indexOf("T") >= 0 && tabVal.indexOf(".000Z") >= 0) {//时间
+                            // 时间和字符串合作
+                            if (tabVal.indexOf("☆") >= 0) {
+                                String[] mysql = tabVal.split("☆");
+                                for (String data : mysql) {
+                                    String[] tabData = data.split("_\\^_");
+                                    if (StringUtils.isNotEmpty(tabData[0])) {
+                                        reData.put(key + "__" + tabData[1], tabData[0]);
+                                    }
+                                }
+                            } else {
+                                String[] tabData = tabVal.split("_\\^_");
+                                if (StringUtils.isNotEmpty(tabData[0])) {
+                                    reData.put(key + "__" + tabData[1], tabData[0]);
+                                }
+                            }
+                        } else if (tabVal.indexOf("☆") >= 0) {
+                            String[] mysql = tabVal.split("☆");
+                            for (String data : mysql) {
+                                String[] tabData = data.split("_\\^_");
+                                if (StringUtils.isNotEmpty(tabData[0])) {
+                                    reData.put(key + "__" + tabData[1], tabData[0]);
+                                }
+                            }
+                        } else if (tabVal.indexOf("_^_") >= 0) {
+                            String[] tabData = tabVal.split("_\\^_");
+                            if (StringUtils.isNotEmpty(tabData[0])) {
+                                if (tabVal.contains("[") && tabVal.contains("年")) {
+                                    String[] strings = StringUtils.strip(tabData[0], "[]").split(",");
+                                    reData.put(key + "__" + tabData[1], strings);
+                                } else {
+                                    reData.put(key + "__" + tabData[1], tabData[0]);
+                                }
+                            }
+                        } else {
+                            reData.put(key, tabVal);
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        list.add(reData);
+        return list;
+    }
+
+    @Override
+    public Map<String,List<ServiceUserDto>> getSendUserAndWriteUser(Long projectId, Long contractId) {
+        HashMap<String, List<ServiceUserDto>> map = new HashMap<>();
+        List<String> sendList=baseMapper.getUserID(projectId, contractId,1);
+        List<String> writeList=baseMapper.getUserID(projectId, contractId,2);
+        List<String> sendResult = sendList.stream()
+            .flatMap(str -> Arrays.stream(str.split(",")))
+            .distinct()
+            .sorted()
+            .collect(Collectors.toList());
+        List<String> writedResult = writeList.stream()
+            .flatMap(str -> Arrays.stream(str.split(",")))
+            .distinct()
+            .sorted()
+            .collect(Collectors.toList());
+           map.put("sendUser",  getUserNamesByIds(sendResult));
+           map.put("writeUser",  getUserNamesByIds(writedResult));
+        return map;
+    }
+
+    @Override
+    public Long saveServicePlan(Long pkeyId,Long projectId,Long contractId,JSONObject dataInfo) {
+        ServicePlan plan = new ServicePlan();
+        if(dataInfo.containsKey("key_15__3_4")){
+            Object o = dataInfo.get("key_15__3_4");
+            String startDate = null;
+            String endDate = null;
+            if (o instanceof List<?>) {
+                List<?> list = (List<?>) o;
+                if (list.size() >= 2 && list.get(0) instanceof String && list.get(1) instanceof String) {
+                    startDate = formatDate((String) list.get(0));
+                    endDate = formatDate((String) list.get(1));
+                }
+            } else if (o != null && o.getClass().isArray()) {
+                Object[] array = (Object[]) o;
+                if (array.length >= 2 && array[0] instanceof String && array[1] instanceof String) {
+                    startDate = formatDate((String) array[0]);
+                    endDate = formatDate((String) array[1]);
+                }
+            }
+            if (startDate != null) {
+                plan.setPlanStartTime(LocalDate.parse(startDate));
+            }
+            if (endDate != null) {
+                plan.setPlanEndTime(LocalDate.parse(endDate));
+            }
+        }
+        if(dataInfo.containsKey("group_id")&&dataInfo.get("group_id")!=null&&StringUtils.isNotEmpty(dataInfo.get("group_id").toString())){
+            plan.setId(dataInfo.getLongValue("group_id"));
+            ServicePlan plan1 = this.getById(plan.getId());
+            if(plan1.getWriteUser()!=null){
+                if(!plan1.getWriteUser().contains(SecureUtil.getUserId()+"")){
+                    plan.setWriteUser(plan1.getWriteUser()+","+SecureUtil.getUserId());
+                }
+            }
+            if(plan1.getStatus()!=null){
+                plan.setStatus(plan1.getStatus());
+            }
         }else {
-            pkeyId=1937773223861026822L;
+            plan.setProjectId(projectId);
+            plan.setContractId(contractId);
+            plan.setStatus(1);
+            plan.setWriteUser(SecureUtil.getUserId()+"");
+            if(pkeyId==1937773223861026820L){
+                plan.setFileInType(1);
+            }else {
+                plan.setFileInType(2);
+            }
+        }
+        this.saveOrUpdate(plan);
+        return plan.getId();
+    }
+    private static String formatDate(String dateStr) {
+        if (dateStr == null || dateStr.trim().isEmpty()) return null;
+        try {
+            // 替换掉“年”、“月”、“日”字符,然后解析为LocalDate
+            return dateStr.replaceAll("年", "-")
+                .replaceAll("月", "-")
+                .replaceAll("日", "")
+                .trim();
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public List<ServiceUserDto> getUserNamesByIds(List<String> sendResult) {
+        if (sendResult == null || sendResult.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        // 构建 SQL 查询语句
+        String inSql = sendResult.stream()
+            .map(id -> "?")
+            .collect(Collectors.joining(", "));
+
+        String sql = "SELECT id, real_name FROM blade_user WHERE id IN (" + inSql + ")";
+
+        try {
+            List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql, sendResult.toArray());
+
+            return rows.stream()
+                .map(row -> new ServiceUserDto(
+                    row.get("id").toString(),
+                    row.get("real_name").toString()))
+                .collect(Collectors.toList());
+        } catch (DataAccessException e) {
+            // 日志记录异常信息
+            log.error("查询用户信息失败", e);
+            return Collections.emptyList();
         }
+    }
+
+    private List<Map<String, Object>> getBussDataInfoTrial(Long pkeyId ,Long id) {
+        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
+        String sys_file_net_url = ParamCache.getValue(CommonConstant.SYS_FILE_NET_URL);
+        List<Map<String, Object>> list = new ArrayList<>();
+        Map<String, Object> reData = new HashMap<>();
         String sqll="select * from m_wbs_tree_contract where p_key_id="+pkeyId;
         WbsTreeContract wbsTreeContract = jdbcTemplate.queryForObject(sqll, new BeanPropertyRowMapper<>(WbsTreeContract.class));
         if (wbsTreeContract == null) {