Jelajahi Sumber

Merge branch 'master' of http://47.110.251.215:3000/java_org/bladex

huangtf 2 tahun lalu
induk
melakukan
5d9fed2686
47 mengubah file dengan 799 tambahan dan 197 penghapusan
  1. 4 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java
  2. 3 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/AttendanceTripInfo.java
  3. 7 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ProjectCostBudget.java
  4. 1 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AllProjectStatsVO.java
  5. 22 4
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectProcessVO.java
  6. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java
  7. 13 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java
  8. 12 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java
  9. 149 7
      blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml
  10. 3 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java
  11. 31 2
      blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java
  12. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java
  13. 2 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java
  14. 7 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml
  15. 10 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDetectionDataServiceImpl.java
  16. 15 8
      blade-service/blade-control/src/main/java/org/springblade/control/controller/AttendanceManagerController.java
  17. 3 2
      blade-service/blade-control/src/main/java/org/springblade/control/controller/LogHistoryController.java
  18. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java
  19. 7 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml
  20. 2 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml
  21. 6 4
      blade-service/blade-control/src/main/java/org/springblade/control/service/AttendanceTripService.java
  22. 4 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java
  23. 2 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/LogHistoryService.java
  24. 140 90
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AttendanceTripServiceImpl.java
  25. 29 12
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java
  26. 20 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMInvoiceServiceImpl.java
  27. 19 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMLoanServiceImpl.java
  28. 19 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMOutsourcingPayServiceImpl.java
  29. 19 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPayServiceImpl.java
  30. 23 5
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPurchaseServiceImpl.java
  31. 24 6
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMUseCarServiceImpl.java
  32. 14 3
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java
  33. 20 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java
  34. 12 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java
  35. 51 0
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectProcessServiceImpl.java
  36. 14 2
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java
  37. 15 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  38. 0 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  39. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java
  40. 0 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  41. 3 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java
  42. 7 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITurnPointCalculator.java
  43. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaTurnPoint.java
  44. 7 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml
  45. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  46. 42 20
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  47. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

+ 4 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/ArchiveFileClient.java

@@ -118,4 +118,8 @@ public interface ArchiveFileClient {
 
     @PostMapping(API_PREFIX + "/updateRectificationById")
     boolean updateRectificationById(@RequestParam Long id,@RequestParam Integer rectification);
+
+    //批量查询案卷下的文件
+    @PostMapping(API_PREFIX + "/batchSearchArchiveFile")
+    List<ArchiveFile> batchSearchArchiveFile(@RequestBody List<Long> ids);
 }

+ 3 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/AttendanceTripInfo.java

@@ -1,6 +1,7 @@
 package org.springblade.control.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -32,9 +33,11 @@ public class AttendanceTripInfo extends BaseEntity {
     private String endCity;
 
     @ApiModelProperty(value = "开始时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date startDate;
 
     @ApiModelProperty(value = "结束时间")
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "GMT+8")
     private Date endDate;
 
     @ApiModelProperty(value = "时长(天)")

+ 7 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ProjectCostBudget.java

@@ -79,7 +79,7 @@ public class ProjectCostBudget extends BaseEntity {
     @ApiModelProperty(value = "预算备注")
     private String budgetRemark;
 
-    @ApiModelProperty(value = "之前是否审批通过")
+    @ApiModelProperty(value = "成本测算是否审批通过")
     private String approve;
 
     @ApiModelProperty(value = "计划任务类型")
@@ -116,6 +116,12 @@ public class ProjectCostBudget extends BaseEntity {
     @ApiModelProperty(value = "计划天数")
     private BigDecimal planDays;
 
+    @ApiModelProperty(value = "实际任务天数")
+    private BigDecimal practicalTaskDays;
+
+    @ApiModelProperty(value = "任务完成后是否审批通过")
+    private String taskApprove;
+
     @ApiModelProperty(value = "关联回款")
     @JsonSerialize(nullsUsing = NullSerializer.class)
     private Long contractReturnedId;

+ 1 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/AllProjectStatsVO.java

@@ -33,7 +33,7 @@ public class AllProjectStatsVO {
     @ApiModelProperty(value = "预算成本")
     private BigDecimal budgetCost;
 
-    @ApiModelProperty(value = "实际已支出成本")
+    @ApiModelProperty(value = "实际已支出成本")
     private BigDecimal practicalPayCost;
 
     @ApiModelProperty(value = "实际已回款")

+ 22 - 4
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ProjectProcessVO.java

@@ -5,6 +5,10 @@ import jdk.net.SocketFlow;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.control.entity.ProjectProcess;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * @Param
@@ -18,15 +22,29 @@ public class ProjectProcessVO extends ProjectProcess {
     private String statusValue;
 
     @ApiModelProperty(value = "是否参与")
-    private String isParticipate;
+    private Integer isParticipate;
 
     @ApiModelProperty(value = "成本支出")
-    private String costIncome;
+    private BigDecimal costDisburse;
 
     @ApiModelProperty(value = "时间成本")
-    private String timeCost;
+    private BigDecimal timeCost;
 
     @ApiModelProperty(value = "人员投入")
-    private String staffTotal;
+    private Integer staffTotal;
+
+    @ApiModelProperty(value = "明细")
+    private List<costDetail> costDetails;
+
+    @Data
+    public static class costDetail {
+        @ApiModelProperty(value = "费用类型")
+        private String costTypeValue;
+
+        @ApiModelProperty(value = "费用")
+        private BigDecimal price;
 
+        @ApiModelProperty(value = "总计")
+        private BigDecimal total;
+    }
 }

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

@@ -230,6 +230,8 @@ public class ArchiveTreeContractVO2 implements INodeEx<ArchiveTreeContractVO2> {
     //案卷后缀
     private String archiveNameSuffix;
 
+    private Integer treeNumber;
+
     public String toString() {
         return "TreeNode(parentId=" + this.getParentId()
                 + ",ancestors" + this.getAncestors()

+ 13 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchivesAutoController.java

@@ -164,6 +164,19 @@ public class ArchivesAutoController extends BladeController {
 		}
 	}
 
+	/**
+	 * 查询档案里的文件
+	 */
+	@GetMapping("/getArchiveFileList")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "查询档案里的文件", notes = "传入案卷主键")
+	@ApiImplicitParams({
+			@ApiImplicitParam(name = "id", value = "案卷id", required = true),
+	})
+	public R<ArchivesAutoVO> getArchiveFileList(Long id) {
+		return R.data(archivesAutoService.getArchiveFileList(id));
+	}
+
 	/**
 	 * 档案统计-档案柜切换档案查看权限
 	 */

+ 12 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.java

@@ -92,11 +92,21 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
 	 */
     List<ArchivesAutoVO> pageByArchivesAuto(IPage page, @Param("vo") ArchivesAutoVO vo);
 
+	/**
+	 *  档案利用-档案查询,不带范围,不连接文件表
+	 */
+	List<ArchivesAutoVO> pageByArchivesAuto11(IPage page, @Param("vo") ArchivesAutoVO vo);
+
 	/**
 	 *  档案利用-档案查询,带范围
 	 */
 	List<ArchivesAutoVO> pageByArchivesAuto2(IPage page, @Param("vo") ArchivesAutoVO vo);
 
+	/**
+	 *  档案利用-档案查询,带范围,不连接文件表
+	 */
+	List<ArchivesAutoVO> pageByArchivesAuto22(IPage page, @Param("vo") ArchivesAutoVO vo);
+
 	/**
 	 *  档案鉴定-档案查询
 	 */
@@ -135,4 +145,6 @@ public interface ArchivesAutoMapper extends BaseMapper<ArchivesAuto> {
 	List<ArchivesAutoVO> pageByArchivesAuto4(@Param("vo") ArchivesAutoVO vo);
 
     Long getAllArchiveFileSize(@Param("projectId") Long projectId);
+
+	ArchivesAutoVO getArchiveFileList(@Param("id") Long id);
 }

+ 149 - 7
blade-service/blade-archive/src/main/java/org/springblade/archive/mapper/ArchivesAutoMapper.xml

@@ -49,10 +49,58 @@
         <result column="filing_unit" property="filingUnit"/>
         <result column="file_size" property="fileSize"/>
         <result column="is_reviewed" property="isReviewed"/>
-        <collection property="approvalFileList" javaType="java.util.List"
-                    select="approvalFile"
-                    column="{archiveId=id}">
-        </collection>
+    </resultMap>
+<!-- 带文件子查询的-->
+    <resultMap id="archivesAutoResultMap2" type="org.springblade.archive.vo.ArchivesAutoVO">
+        <result column="id" property="id"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="project_id" property="projectId"/>
+        <result column="contract_id" property="contractId"/>
+        <result column="name" property="name"/>
+        <result column="file_number" property="fileNumber"/>
+        <result column="micron" property="micron"/>
+        <result column="unit" property="unit"/>
+        <result column="quantity" property="quantity"/>
+        <result column="specification" property="specification"/>
+        <result column="start_date" property="startDate"/>
+        <result column="end_date" property="endDate"/>
+        <result column="storage_time" property="storageTime"/>
+        <result column="secret_level" property="secretLevel"/>
+        <result column="carrier_type" property="carrierType"/>
+        <result column="keywords" property="keywords"/>
+        <result column="reviewer" property="reviewer"/>
+        <result column="review_date" property="reviewDate"/>
+        <result column="storage_location" property="storageLocation"/>
+        <result column="is_archive" property="isArchive"/>
+        <result column="remark" property="remark"/>
+        <result column="roll_date" property="rollDate"/>
+        <result column="rollor" property="rollor"/>
+        <result column="node_id" property="nodeId"/>
+        <result column="out_url" property="outUrl"/>
+        <result column="cd_id" property="cdId"/>
+        <result column="file_n" property="fileN"/>
+        <result column="page_n" property="pageN"/>
+        <result column="mileage" property="mileage"/>
+        <result column="file_type" property="fileType"/>
+        <result column="size" property="size"/>
+        <result column="tree_sort" property="treeSort"/>
+        <result column="is_open" property="isOpen"/>
+        <result column="ischeck" property="ischeck"/>
+        <result column="is_auto_file" property="isAutoFile"/>
+        <result column="auto_file_sort" property="autoFileSort"/>
+        <result column="filing_unit" property="filingUnit"/>
+        <result column="file_size" property="fileSize"/>
+        <result column="is_reviewed" property="isReviewed"/>
+                <collection property="approvalFileList" javaType="java.util.List"
+                            select="approvalFile"
+                            column="{archiveId=id}">
+                </collection>
     </resultMap>
 
     <select id="approvalFile" resultType="org.springblade.archive.vo.ArchivesAutoVO$ApprovalFile">
@@ -373,7 +421,7 @@
         where project_id = #{projectId};
     </select>
     <select id="pageByArchivesAuto" resultMap="archivesAutoResultMap">
-        select uaa.*,(select COUNT(1) from u_archive_file af WHERE af.archive_id = uaa.id AND af.is_element = 0 and af.is_deleted = 0) as pageNumber
+        select uaa.*
         from m_archive_tree_contract matc left join u_archives_auto uaa on matc.id = uaa.node_id left join
         u_archive_file uaf on uaa.id = uaf.archive_id
         where uaa.is_deleted = 0 and uaa.is_archive = 1
@@ -423,8 +471,52 @@
         order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
     </select>
 
+    <select id="pageByArchivesAuto11" resultMap="archivesAutoResultMap">
+        select uaa.*
+        from m_archive_tree_contract matc left join u_archives_auto uaa on matc.id = uaa.node_id
+        where uaa.is_deleted = 0 and uaa.is_archive = 1 and uaa.name like concat('%',#{vo.queryValue},'%')
+        <if test="vo.projectId != null and vo.projectId != ''">
+            and matc.project_id = #{vo.projectId}
+        </if>
+        <if test="vo.contractId != null and vo.contractId != ''">
+            and uaa.contract_id = #{vo.contractId} and matc.contract_id = #{vo.contractId}
+        </if>
+        <if test="vo.storageTimes != null and vo.storageTimes != ''">
+            and uaa.storage_time in
+            <foreach collection="vo.storageTimes" item="storageTime" open="(" separator="," close=")">
+                #{storageTime}
+            </foreach>
+        </if>
+        <if test="vo.secretLevels != null and vo.secretLevels != ''">
+            and uaa.secret_level in
+            <foreach collection="vo.secretLevels" item="secretLevel" open="(" separator="," close=")">
+                #{secretLevel}
+            </foreach>
+        </if>
+        <if test="vo.carrierTypes != null and vo.carrierTypes != ''">
+            and uaa.carrier_type in
+            <foreach collection="vo.carrierTypes" item="carrierType" open="(" separator="," close=")">
+                #{carrierType}
+            </foreach>
+        </if>
+        <if test="vo.years != null and vo.years != ''">
+            and
+            <foreach collection="vo.years" item="year" separator=" or" open="(" close=")">
+                #{year} BETWEEN DATE_FORMAT(uaa.start_date,'%Y') and DATE_FORMAT(uaa.end_date ,'%Y')
+            </foreach>
+        </if>
+        <if test="vo.months != null and vo.months != ''">
+            and
+            <foreach collection="vo.months" item="month" separator=" or" open="(" close=")">
+                #{month} BETWEEN DATE_FORMAT(uaa.start_date,'%c') and DATE_FORMAT(uaa.end_date ,'%c')
+            </foreach>
+        </if>
+        GROUP BY uaa.id
+        order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
+    </select>
+
     <select id="pageByArchivesAuto2" resultMap="archivesAutoResultMap">
-        select uaa.*,(select COUNT(1) from u_archive_file af WHERE af.archive_id = uaa.id AND af.is_element = 0 and af.is_deleted = 0) as pageNumber from
+        select uaa.* from
         (SELECT id FROM m_archive_tree_contract WHERE project_id =#{vo.projectId}
         and 1=2
         <foreach collection="vo.nodeIdArray" item="nodeId">
@@ -476,8 +568,54 @@
         order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
     </select>
 
+    <select id="pageByArchivesAuto22" resultMap="archivesAutoResultMap">
+        select uaa.* from
+        (SELECT id FROM m_archive_tree_contract WHERE project_id =#{vo.projectId}
+        and 1=2
+        <foreach collection="vo.nodeIdArray" item="nodeId">
+            or ancestors like concat('%',#{nodeId},'%') or id = #{nodeId}
+        </foreach>
+        ) matc left join u_archives_auto uaa on matc.id = uaa.node_id
+        where uaa.is_deleted = 0 and uaa.is_archive = 1 and uaa.name like concat('%',#{vo.queryValue},'%')
+        <if test="vo.contractId != null and vo.contractId != ''">
+            and uaa.contract_id = #{vo.contractId}
+        </if>
+        <if test="vo.storageTimes != null and vo.storageTimes != ''">
+            and uaa.storage_time in
+            <foreach collection="vo.storageTimes" item="storageTime" open="(" separator="," close=")">
+                #{storageTime}
+            </foreach>
+        </if>
+        <if test="vo.secretLevels != null and vo.secretLevels != ''">
+            and uaa.secret_level in
+            <foreach collection="vo.secretLevels" item="secretLevel" open="(" separator="," close=")">
+                #{secretLevel}
+            </foreach>
+        </if>
+        <if test="vo.carrierTypes != null and vo.carrierTypes != ''">
+            and uaa.carrier_type in
+            <foreach collection="vo.carrierTypes" item="carrierType" open="(" separator="," close=")">
+                #{carrierType}
+            </foreach>
+        </if>
+        <if test="vo.years != null and vo.years != ''">
+            and
+            <foreach collection="vo.years" item="year" separator=" or" open="(" close=")">
+                #{year} BETWEEN DATE_FORMAT(uaa.start_date,'%Y') and DATE_FORMAT(uaa.end_date ,'%Y')
+            </foreach>
+        </if>
+        <if test="vo.months != null and vo.months != ''">
+            and
+            <foreach collection="vo.months" item="month" separator=" or" open="(" close=")">
+                #{month} BETWEEN DATE_FORMAT(uaa.start_date,'%c') and DATE_FORMAT(uaa.end_date ,'%c')
+            </foreach>
+        </if>
+        GROUP BY uaa.id
+        order by uaa.tree_sort,uaa.auto_file_sort,uaa.file_number asc
+    </select>
+
     <select id="pageByArchivesAuto3" resultMap="archivesAutoResultMap">
-        select uaa.*,(select COUNT(1) from u_archive_file af WHERE af.archive_id = uaa.id AND af.is_element = 0 and af.is_deleted = 0) as pageNumber
+        select uaa.*
         from
         (SELECT id FROM m_archive_tree_contract WHERE project_id =#{vo.projectId}
         and  ancestors like concat('%',#{vo.nodeId},'%')
@@ -704,6 +842,10 @@
     <select id="getAllArchiveFileSize" resultType="java.lang.Long">
         select sum(uaa.file_size)  from u_archives_auto uaa WHERE uaa.project_id = #{projectId} and is_deleted = 0
     </select>
+    <select id="getArchiveFileList"  resultMap="archivesAutoResultMap2">
+        select *
+        from u_archives_auto uaa WHERE uaa.id = #{id} and is_deleted = 0
+    </select>
 
 
     <update id="splitFiles">

+ 3 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/service/IArchivesAutoService.java

@@ -18,6 +18,7 @@ package org.springblade.archive.service;
 
 import org.springblade.archive.entity.ArchivesAuto;
 import org.springblade.archive.vo.ArchivesAutoVO;
+import org.springblade.business.entity.ArchiveFile;
 import org.springblade.core.mp.base.BaseService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.tool.api.R;
@@ -92,4 +93,6 @@ public interface IArchivesAutoService extends BaseService<ArchivesAuto> {
     void getArchivesAuthByUser(Long projectId,Long contractId,Integer archiveType);
 
     Long allArchiveFileSize(Long projectId);
+
+	ArchivesAutoVO getArchiveFileList(Long id);
 }

+ 31 - 2
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchivesAutoServiceImpl.java

@@ -64,6 +64,7 @@ import org.springblade.resource.feign.NewIOSSClient;
 import org.springblade.system.entity.DictBiz;
 import org.springblade.system.feign.IDictBizClient;
 import org.springblade.system.user.entity.User;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.EnableAsync;
@@ -142,11 +143,22 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		}
 		if (StringUtils.isNotBlank(vo.getNodeIds())) {
 			vo.setNodeIdArray(Arrays.asList(vo.getNodeIds().split(",")));
-			archivesAutos = baseMapper.pageByArchivesAuto2(page, vo);
+			//如果搜索类型不为文件,就不连接文件表
+			if (vo.getSearchType() == 2) {
+				archivesAutos = baseMapper.pageByArchivesAuto2(page, vo);
+			}else {
+				archivesAutos = baseMapper.pageByArchivesAuto22(page, vo);
+			}
 		} else {
-			archivesAutos = baseMapper.pageByArchivesAuto(page, vo);
+			//如果搜索类型不为文件,就不连接文件表
+			if (vo.getSearchType() == 2) {
+				archivesAutos = baseMapper.pageByArchivesAuto(page, vo);
+			}else {
+				archivesAutos = baseMapper.pageByArchivesAuto11(page, vo);
+			}
 		}
 		if (archivesAutos != null && archivesAutos.size() >0) {
+			//手动插入档案内文件
 			archivesAutos.stream().forEach(aa -> {
 				if (StringUtils.isNotBlank(aa.getStorageTime())) {
 					aa.setStorageTimeValue("3".equals(aa.getStorageTime()) ? "永久" : ("2".equals(aa.getStorageTime()) ? "30年" : "10年"));
@@ -281,6 +293,23 @@ public class ArchivesAutoServiceImpl extends BaseServiceImpl<ArchivesAutoMapper,
 		return size * 1024L;
 	}
 
+	@Override
+	public ArchivesAutoVO getArchiveFileList(Long id) {
+		ArchivesAutoVO vo = baseMapper.getArchiveFileList(id);
+		if (StringUtils.isNotBlank(vo.getStorageTime())) {
+			vo.setStorageTimeValue("3".equals(vo.getStorageTime()) ? "永久" : ("2".equals(vo.getStorageTime()) ? "30年" : "10年"));
+		}
+		if (StringUtils.isNotBlank(vo.getSecretLevel())) {
+			vo.setSecretLevelValue("1".equals(vo.getSecretLevel()) ? "机密" : ("2".equals(vo.getSecretLevel()) ? "绝密" : "秘密"));
+		}
+		if (vo.getApprovalFileList() != null && vo.getApprovalFileList().size() > 0) {
+			vo.setPageNumber(vo.getApprovalFileList().size());
+		}else {
+			vo.setPageNumber(0);
+		}
+		return vo;
+	}
+
 	/**
 	 * 根据搜索获取档案柜
 	 * @param archivesAuto

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/ArchiveFileClientImpl.java

@@ -251,5 +251,10 @@ public class ArchiveFileClientImpl implements ArchiveFileClient {
         return true;
     }
 
+    @Override
+    public List<ArchiveFile> batchSearchArchiveFile(List<Long> ids) {
+        return fileMapper.batchSearchArchiveFile(ids);
+    }
+
 
 }

+ 2 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.java

@@ -88,4 +88,6 @@ public interface ArchiveFileMapper extends BaseMapper<ArchiveFile> {
     List<ArchiveFile> getAllPdfFileUrlByProjectIdAndFileType(@Param("projectId") Long projectId);
 
     void updateRectificationById(@Param("id") Long id,@Param("rectification") Integer rectification);
+
+    List<ArchiveFile> batchSearchArchiveFile(@Param("ids") List<Long> ids);
 }

+ 7 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/ArchiveFileMapper.xml

@@ -382,6 +382,13 @@
         FROM u_archive_file
         WHERE project_id = #{projectId}
     </select>
+    <select id="batchSearchArchiveFile" resultType="org.springblade.business.entity.ArchiveFile">
+        select * FROM u_archive_file
+        WHERE is_element = 0 and archive_id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </select>
 
     <update id="updateRectificationById">
         update u_archive_file set rectification = #{rectification} where

+ 10 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialDetectionDataServiceImpl.java

@@ -127,7 +127,16 @@ public class TrialDetectionDataServiceImpl extends BaseServiceImpl<TrialDetectio
             }
             IPage<TrialDetectionData> pages = this.page(page, queryWrapper.lambda().orderBy(true, false, TrialDetectionData::getCreateTime));
             List<TrialDetectionDataVO> trialDetectionDataVOS = BeanUtil.copyProperties(pages.getRecords(), TrialDetectionDataVO.class);
-            Map<String, Attach> fileMaps = jdbcTemplate.query("select link,original_name from blade_attach", new BeanPropertyRowMapper<>(Attach.class)).stream().collect(Collectors.toMap(Attach::getLink, Function.identity()));
+            //Map<String, Attach> fileMaps = jdbcTemplate.query("select link,original_name from blade_attach", new BeanPropertyRowMapper<>(Attach.class)).stream().collect(Collectors.toMap(Attach::getLink, Function.identity()));
+
+            List<Attach> attachList = jdbcTemplate.query("select link, original_name from blade_attach", new BeanPropertyRowMapper<>(Attach.class));
+            Map<String, Attach> fileMaps = new HashMap<>();
+            for (Attach attach : attachList) {
+                if (attach.getLink() != null) {
+                    fileMaps.put(attach.getLink(), attach);
+                }
+            }
+
             List<String> list = new ArrayList<>();
             if (ObjectUtil.isNotEmpty(dto.getQualityTestPKeyId())) {
                 list = inspectionRecordMapper.selectSelectedStatusList(Long.parseLong(dto.getQualityTestPKeyId()), "2,3");

+ 15 - 8
blade-service/blade-control/src/main/java/org/springblade/control/controller/AttendanceManagerController.java

@@ -8,7 +8,7 @@ import lombok.AllArgsConstructor;
 import org.springblade.control.dto.AttendanceTripInfoDTO;
 import org.springblade.control.service.AttendanceTripService;
 import org.springblade.control.vo.AttendanceTripInfoVO;
-import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMDraftGroupVO;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
@@ -35,10 +35,17 @@ public class AttendanceManagerController extends BladeController {
     @GetMapping("/trip/draft/list")
     @ApiOperationSupport(order = 2)
     @ApiOperation(value = "出差信息草稿箱列表")
-    public R<List<EMDraftVO>> tripDraftList() {
+    public R<List<EMDraftGroupVO>> tripDraftList() {
         return R.data(attendanceTripService.tripDraftList());
     }
 
+    @GetMapping("/trip/draft/detail")
+    @ApiOperationSupport(order = 2)
+    @ApiOperation(value = "财务报销草稿箱编辑详情", notes = "传入当前草稿的eMDraftIds")
+    public R<List<AttendanceTripInfoVO>> financialDraftDetail(@RequestParam String eMDraftIds) {
+        return R.data(attendanceTripService.financialDraftDetail(eMDraftIds));
+    }
+
     @GetMapping("/trip/detail")
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "出差信息信息详情", notes = "传入出差信息id")
@@ -48,16 +55,16 @@ public class AttendanceManagerController extends BladeController {
 
     @PostMapping("/trip/submit")
     @ApiOperationSupport(order = 4)
-    @ApiOperation(value = "出差信息信息提交", notes = "传入AttendanceTripInfoDTO")
-    public R<Object> tripSubmit(@RequestBody AttendanceTripInfoDTO dto) {
-        return R.status(attendanceTripService.tripSubmit(dto));
+    @ApiOperation(value = "出差信息信息提交", notes = "传入List<AttendanceTripInfoDTO>集合")
+    public R<Object> tripSubmit(@RequestBody List<AttendanceTripInfoDTO> dtoList) {
+        return R.status(attendanceTripService.tripSubmit(dtoList));
     }
 
     @PostMapping("/trip/remove")
     @ApiOperationSupport(order = 5)
-    @ApiOperation(value = "出差信息记录物理删除", notes = "传入出差信息id")
-    public R<Object> tripRemove(@RequestParam Long id) {
-        return R.status(attendanceTripService.tripRemove(id));
+    @ApiOperation(value = "出差信息记录物理删除", notes = "传入groupId")
+    public R<Object> tripRemove(@RequestParam Long groupId) {
+        return R.status(attendanceTripService.tripRemove(groupId));
     }
 
     @PostMapping("/trip/cancel")

+ 3 - 2
blade-service/blade-control/src/main/java/org/springblade/control/controller/LogHistoryController.java

@@ -9,6 +9,7 @@ import org.springblade.control.service.LogHistoryService;
 import org.springblade.control.vo.LogHistoryInfoVO;
 import org.springblade.control.vo.TaskPlanInfoVO;
 import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.tool.api.R;
 import org.springframework.web.bind.annotation.*;
 
@@ -40,8 +41,8 @@ public class LogHistoryController extends BladeController {
     @PostMapping("/detail")
     @ApiOperationSupport(order = 3)
     @ApiOperation(value = "日志填报详情", notes = "传入日志id")
-    public R<LogHistoryInfoVO> logDetail(@RequestParam Long id) {
-        return R.data(logHistoryService.logDetail(id));
+    public R<LogHistoryInfoVO> logDetail(@RequestParam Long id, BladeUser bladeUser) {
+        return R.data(logHistoryService.logDetail(id, bladeUser));
     }
 
     @PostMapping("/remove")

+ 4 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.java

@@ -51,4 +51,8 @@ public interface ProjectCostBudgetMapper extends BaseMapper<ProjectCostBudget> {
     Integer getPostMoney(@Param("type") Integer postType);
 
     List<ProjectCostBudget> getAllBudgetByProjectId(@Param("id") Long id);
+
+    List<ProjectCostBudget> getProjectAllFinishedTask(@Param("projectId") Long projectId,@Param("costType") Integer costType);
+
+    List<ProjectCostBudget> getAllPracticalBudgetByProjectId(@Param("projectId") Long projectId);
 }

+ 7 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml

@@ -121,6 +121,13 @@
     <select id="getAllBudgetByProjectId" resultType="org.springblade.control.entity.ProjectCostBudget">
         select * from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.project_id = #{id} and pcb.parent_id = 0
     </select>
+    <select id="getProjectAllFinishedTask" resultType="org.springblade.control.entity.ProjectCostBudget">
+        select * from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.project_id = #{projectId} and cost_type = #{costType} and pcb.task_approve = 1
+    </select>
+    <select id="getAllPracticalBudgetByProjectId"
+            resultType="org.springblade.control.entity.ProjectCostBudget">
+        select * from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.project_id = #{projectId} and pcb.task_approve = 1
+    </select>
 
 
 </mapper>

+ 2 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml

@@ -57,6 +57,7 @@
         select
             (select sum(cci.contract_money)  from c_control_contract_info cci WHERE cci.is_deleted = 0) as allContractMoney,
             (select SUM(cbs.project_cost_total)  from c_project_cost_budget_stats cbs WHERE cbs.is_deleted = 0) as allProjectCost,
+            (select SUM(pcb.actual_total_money)  from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.task_approve = 1)as "allPracticalDisburse",
             (select SUM(cri.practical_returned_money)  from c_contract_returned_info cri WHERE cri.is_deleted = 0) as allReturned
     </select>
     <select id="ProjectListStats" resultType="org.springblade.control.vo.AllProjectStatsVO">
@@ -64,6 +65,7 @@
             cpi.name as 'projectName',
             cci.contract_money  as 'contractMoney',
                 (select cbs.project_cost_total from c_project_cost_budget_stats cbs WHERE cpi.id = cbs.project_id  and cbs.is_deleted = 0) as 'budgetCost',
+                (select SUM(pcb.actual_total_money)  from c_project_cost_budget pcb WHERE  pcb.is_deleted =0 and pcb.project_id = cpi.id and pcb.task_approve = 1)as "practicalPayCost",
                 (select SUM(cri.practical_returned_money)  from c_contract_returned_info cri WHERE cpi.id = cri.project_id and cri.is_deleted = 0) as 'ReturnedMoney',
                 (cci.contract_money - IFNULL((select SUM(cri.practical_returned_money) from c_contract_returned_info cri WHERE cri.contract_id = cci.id and cri.is_deleted = 0),0)) as 'unreturnedMoney'
         from c_control_project_info cpi left join c_control_contract_info cci on cpi.id = cci.project_id and cci.is_deleted = 0

+ 6 - 4
blade-service/blade-control/src/main/java/org/springblade/control/service/AttendanceTripService.java

@@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.control.dto.AttendanceTripInfoDTO;
 import org.springblade.control.entity.AttendanceTripInfo;
 import org.springblade.control.vo.AttendanceTripInfoVO;
-import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMDraftGroupVO;
 import org.springblade.core.mp.base.BaseService;
 
 import java.util.List;
@@ -13,14 +13,16 @@ public interface AttendanceTripService extends BaseService<AttendanceTripInfo> {
 
     IPage<AttendanceTripInfoVO> tripPage(IPage<AttendanceTripInfo> page, AttendanceTripInfoDTO dto);
 
-    List<EMDraftVO> tripDraftList();
+    List<EMDraftGroupVO> tripDraftList();
 
     AttendanceTripInfoVO tripDetail(Long id);
 
-    boolean tripSubmit(AttendanceTripInfoDTO dto);
+    boolean tripSubmit(List<AttendanceTripInfoDTO> dtoList);
 
-    boolean tripRemove(Long id);
+    boolean tripRemove(Long groupId);
 
     boolean tripCancel(Long id);
 
+    List<AttendanceTripInfoVO> financialDraftDetail(String eMDraftIds);
+
 }

+ 4 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/IProjectCostBudgetService.java

@@ -54,4 +54,8 @@ public interface IProjectCostBudgetService extends BaseService<ProjectCostBudget
     List<Map<String,List<Integer>>> MonthOfYearPlanOverview();
 
     List<ProjectCostBudget> getAllBudgetByProjectId(Long id);
+
+    List<ProjectCostBudget> getProjectAllFinishedTask(Long projectId,Integer costType);
+
+    List<ProjectCostBudget> getAllPracticalBudgetByProjectId(Long projectId);
 }

+ 2 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/LogHistoryService.java

@@ -5,6 +5,7 @@ import org.springblade.control.entity.LogHistoryInfo;
 import org.springblade.control.vo.LogHistoryInfoVO;
 import org.springblade.control.vo.TaskPlanInfoVO;
 import org.springblade.core.mp.base.BaseService;
+import org.springblade.core.secure.BladeUser;
 
 import java.util.List;
 import java.util.Map;
@@ -15,7 +16,7 @@ public interface LogHistoryService extends BaseService<LogHistoryInfo> {
 
     boolean logSubmit(LogHistoryInfoDTO dto);
 
-    LogHistoryInfoVO logDetail(Long id);
+    LogHistoryInfoVO logDetail(Long id, BladeUser bladeUser);
 
     boolean logRemove(Long id);
 

+ 140 - 90
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/AttendanceTripServiceImpl.java

@@ -12,12 +12,13 @@ import org.springblade.control.entity.*;
 import org.springblade.control.mapper.AttendanceTripMapper;
 import org.springblade.control.service.AttendanceTripService;
 import org.springblade.control.vo.AttendanceTripInfoVO;
-import org.springblade.control.vo.EMDraftVO;
+import org.springblade.control.vo.EMDraftGroupVO;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
@@ -49,11 +50,13 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
             BeanUtils.copyProperties(obj, vo);
 
             Set<String> names = new HashSet<>();
-            String[] userIds = vo.getFellowTravelerUserIds().split(",");
-            for (String id : userIds) {
-                String userName = userMap.get(Long.parseLong(id));
-                if (StringUtils.isNotEmpty(userName)) {
-                    names.add(userName);
+            if (ObjectUtil.isNotEmpty(vo.getFellowTravelerUserIds())) {
+                String[] userIds = vo.getFellowTravelerUserIds().split(",");
+                for (String id : userIds) {
+                    String userName = userMap.get(Long.parseLong(id));
+                    if (StringUtils.isNotEmpty(userName)) {
+                        names.add(userName);
+                    }
                 }
             }
             vo.setFellowTravelerUserNames(StringUtils.join(names, "、"));
@@ -65,7 +68,7 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
     }
 
     @Override
-    public List<EMDraftVO> tripDraftList() {
+    public List<EMDraftGroupVO> tripDraftList() {
         if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
             throw new ServiceException("获取当前用户信息失败,请联系管理员");
         }
@@ -79,16 +82,28 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
         queryWrapper.eq(AttendanceTripInfo::getIsTemp, 0); //暂存
         List<AttendanceTripInfo> list = baseMapper.selectList(queryWrapper);
         Map<Long, List<User>> userMaps = iUserClient.selectUserAll().stream().collect(Collectors.groupingBy(User::getId));
-        List<EMDraftVO> resultVOS = new ArrayList<>();
-        for (AttendanceTripInfo obj : list) {
-            EMDraftVO vo = new EMDraftVO();
-            vo.setId(obj.getId());
-            userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的商旅出差" : ""));
-            vo.setUpdateTime(obj.getUpdateTime());
-            resultVOS.add(vo);
+        List<String> dataIds = list.stream().map(AttendanceTripInfo::getId).map(String::valueOf).collect(Collectors.toList());
+
+        List<EMDraftGroupVO> resultList = new LinkedList<>();
+        if (dataIds.size() > 0) {
+            List<ExDraftRecord> query = jdbcTemplate.query("select * from c_ex_draft_record where data_type = 9 and data_id in(" + StringUtils.join(dataIds, ",") + ")", new BeanPropertyRowMapper<>(ExDraftRecord.class));
+            Map<Long, List<ExDraftRecord>> groupMaps = query.stream().collect(Collectors.groupingBy(ExDraftRecord::getGroupId));
+            for (Map.Entry<Long, List<ExDraftRecord>> listEntry : groupMaps.entrySet()) {
+                Long groupId = listEntry.getKey();
+                List<Long> ids = listEntry.getValue().stream().map(ExDraftRecord::getDataId).collect(Collectors.toList());
+                AttendanceTripInfo obj = baseMapper.selectById(ids.get(0));
+                EMDraftGroupVO vo = new EMDraftGroupVO();
+                if (obj != null) {
+                    userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的商旅出差" : ""));
+                    vo.setUpdateTime(obj.getUpdateTime());
+                }
+                vo.setGroupId(groupId);
+                vo.setEMDraftIds(StringUtils.join(ids, ","));
+                resultList.add(vo);
+            }
         }
-        return resultVOS.stream()
-                .sorted(Comparator.comparing(EMDraftVO::getUpdateTime).reversed())
+        return resultList.stream()
+                .sorted(Comparator.comparing(EMDraftGroupVO::getUpdateTime).reversed())
                 .collect(Collectors.toList());
     }
 
@@ -101,106 +116,134 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
     }
 
     @Override
-    public boolean tripSubmit(AttendanceTripInfoDTO dto) {
+    public boolean tripSubmit(List<AttendanceTripInfoDTO> dtoList) {
         if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
             throw new ServiceException("获取当前用户信息失败,请联系管理员");
         }
         boolean var = false;
-        if (("1").equals(dto.getSubmitStatus())) {
-            if (ObjectUtil.isNotEmpty(dto.getId())) {
-                AttendanceTripInfo obj = baseMapper.selectById(dto.getId());
-                if (obj != null && obj.getStatus() == 3) {
-                    //如果是已驳回任务,那么重新生成新的记录信息
-                    dto.setId(SnowFlakeUtil.getId());
-                    var = true;
-                }
-            }
-            dto.setIsTemp(0); //暂存
-            dto.setStatus(0); //未上报
-            if (var) {
-                this.save(dto);
-            } else {
-                this.saveOrUpdate(dto);
-            }
-            return true;
-
-        } else if (("2").equals(dto.getSubmitStatus())) { //提交审批
-            if (ObjectUtil.isNotEmpty(dto.getId())) {
-                AttendanceTripInfo obj = baseMapper.selectById(dto.getId());
-                if (obj != null && (obj.getStatus() != 0 && obj.getStatus() != 3)) {
-                    throw new ServiceException("当前填报的信息不是未上报、已驳回状态,不允许操作!");
-                } else if (obj != null && obj.getStatus() == 3) {
-                    //如果是已驳回任务,那么重新生成新的记录信息
-                    dto.setId(SnowFlakeUtil.getId());
-                    var = true;
-                }
-            }
-            if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getPersonnelUser())) {
-                //新增审批任务
-                if (ObjectUtil.isEmpty(SecureUtil.getUserName())) {
-                    throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        Long draftGroupId = SnowFlakeUtil.getId(); //草稿draftGroupId
+        for (AttendanceTripInfoDTO dto : dtoList) {
+            if (("1").equals(dto.getSubmitStatus())) {
+                if (ObjectUtil.isNotEmpty(dto.getId())) {
+                    AttendanceTripInfo obj = baseMapper.selectById(dto.getId());
+                    if (obj != null && obj.getStatus() == 3) {
+                        //如果是已驳回任务,那么重新生成新的记录信息
+                        dto.setId(SnowFlakeUtil.getId());
+                        var = true;
+                    }
                 }
-                TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
-                taskProcessInfo.setId(SnowFlakeUtil.getId());
-                taskProcessInfo.setStatus(1); //待审批
-                taskProcessInfo.setReportDate(new Date());
-                taskProcessInfo.setTaskType(9); //出差审批
-                taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【出差审批】审批");
-                //上报人
-                taskProcessInfo.setReportUserId(SecureUtil.getUserId());
-
-                //审批人
-                List<String> auditUserIds = new LinkedList<>();
-                EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
-                auditUserIds.add(responsibleObj.getUserId());
-                EMProcessTaskUser personnelUser = dto.getPersonnelUser(); //人事
-                auditUserIds.add(personnelUser.getUserId());
-                taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
-
-                //抄送人
-                if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
-                    List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
-                    taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
-                }
-                taskProcessService.save(taskProcessInfo);
-
-                //新增信息
-                dto.setIsTemp(1); //提交
-                dto.setStatus(1); //待审批
+                dto.setIsTemp(0); //暂存
+                dto.setStatus(0); //未上报
                 if (var) {
                     this.save(dto);
                 } else {
                     this.saveOrUpdate(dto);
                 }
+                Long aLong = jdbcTemplate.queryForObject("select count(1) from c_ex_draft_record where data_type = 9 and data_id = " + dto.getId(), Long.class);
+                if (aLong == null || aLong == 0L) {
+                    //绑定关系
+                    jdbcTemplate.execute("insert into c_ex_draft_record(id,group_id,data_id,data_type) values(" + SnowFlakeUtil.getId() + "," + draftGroupId + "," + dto.getId() + ",9)");
+                }
+
+            } else if (("2").equals(dto.getSubmitStatus())) { //提交审批
+                if (ObjectUtil.isNotEmpty(dto.getId())) {
+                    AttendanceTripInfo obj = baseMapper.selectById(dto.getId());
+                    if (obj != null && (obj.getStatus() != 0 && obj.getStatus() != 3)) {
+                        throw new ServiceException("当前填报的信息不是未上报、已驳回状态,不允许操作!");
+                    } else if (obj != null && obj.getStatus() == 3) {
+                        //如果是已驳回任务,那么重新生成新的记录信息
+                        dto.setId(SnowFlakeUtil.getId());
+                        var = true;
+                    }
+                }
+                if (ObjectUtil.isNotEmpty(dto.getResponsibleUser()) && ObjectUtil.isNotEmpty(dto.getPersonnelUser())) {
+                    //新增审批任务
+                    if (ObjectUtil.isEmpty(SecureUtil.getUserName())) {
+                        throw new ServiceException("获取当前用户信息失败,请联系管理员");
+                    }
+                    TaskProcessInfo taskProcessInfo = new TaskProcessInfo();
+                    taskProcessInfo.setId(SnowFlakeUtil.getId());
+                    taskProcessInfo.setStatus(1); //待审批
+                    taskProcessInfo.setReportDate(new Date());
+                    taskProcessInfo.setTaskType(9); //出差审批
+                    taskProcessInfo.setTaskName("【" + SecureUtil.getUserName() + "】向您发起【出差审批】审批");
+                    //上报人
+                    taskProcessInfo.setReportUserId(SecureUtil.getUserId());
 
-                //新增审批任务关联信息
-                jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",9)");
+                    //审批人
+                    List<String> auditUserIds = new LinkedList<>();
+                    EMProcessTaskUser responsibleObj = dto.getResponsibleUser(); //部门负责人
+                    auditUserIds.add(responsibleObj.getUserId());
+                    EMProcessTaskUser personnelUser = dto.getPersonnelUser(); //人事
+                    auditUserIds.add(personnelUser.getUserId());
+                    List<String> nonEmptyAuditUserIds = new LinkedList<>();
+                    for (String userId : auditUserIds) {
+                        if (StringUtils.isNotEmpty(userId)) {
+                            nonEmptyAuditUserIds.add(userId);
+                        }
+                    }
+                    if (nonEmptyAuditUserIds.size() == 0) {
+                        taskProcessInfo.setAuditUserIds(null);
+                    } else {
+                        taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
+                    }
 
-                //关联项目id,项目计划预算等,在任务闭环时计算推送
 
-                return true;
+                    //抄送人
+                    if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
+                        List<String> ccUserObjList = dto.getCcUserList().stream().map(EMProcessTaskUser::getUserId).collect(Collectors.toList());
+                        taskProcessInfo.setCcUserIds(StringUtils.join(ccUserObjList, ","));
+                    }
+                    taskProcessService.save(taskProcessInfo);
+
+                    //新增信息
+                    dto.setIsTemp(1); //提交
+                    dto.setStatus(1); //待审批
+                    if (var) {
+                        this.save(dto);
+                    } else {
+                        this.saveOrUpdate(dto);
+                    }
+
+                    //新增审批任务关联信息
+                    jdbcTemplate.execute("delete from c_expense_task_record where task_id = " + taskProcessInfo.getId() + " and expense_info_id = " + dto.getId() + " ; insert into c_expense_task_record(id,task_id,expense_info_id,expense_info_type) values (" + SnowFlakeUtil.getId() + "," + taskProcessInfo.getId() + "," + dto.getId() + ",9)");
 
-            } else {
-                throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+                    //关联项目id,项目计划预算等,在任务闭环时计算推送
+
+                } else {
+                    throw new ServiceException("获取当前审批流程人员信息失败,请联系管理员");
+                }
             }
         }
-        return false;
+        return true;
     }
 
     @Override
-    public boolean tripRemove(Long id) {
-        AttendanceTripInfo attendanceTripInfo = baseMapper.selectById(id);
-        if (attendanceTripInfo.getIsTemp().equals(0)) {
-            return this.removeById(id);
-        } else {
-            throw new ServiceException("当前记录信息不是草稿数据,无法删除");
+    public boolean tripRemove(Long groupId) {
+        List<ExDraftRecord> query = jdbcTemplate.query("select * from c_ex_draft_record where group_id = " + groupId, new BeanPropertyRowMapper<>(ExDraftRecord.class));
+        if (query.size() > 0) {
+            List<String> ids = query.stream().map(ExDraftRecord::getDataId).map(String::valueOf).collect(Collectors.toList());
+            if (ids.size() > 0) {
+                jdbcTemplate.execute("delete from c_ex_draft_record where group_id = " + groupId);
+                jdbcTemplate.execute("delete from c_attendance_trip_info where id in(" + StringUtils.join(ids, ",") + ")");
+                return true;
+            }
+            return false;
         }
+        return false;
     }
 
     @Override
     public boolean tripCancel(Long id) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
         AttendanceTripInfo obj = baseMapper.selectById(id);
         if (obj != null && obj.getStatus().equals(1)) {
+            if (!obj.getCreateUser().equals(SecureUtil.getUserId())) {
+                throw new ServiceException("当前申请信息不是当前用户创建的,无法操作");
+            }
+
             //查询记录任务关联信息
             List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where expense_info_id = " + id, new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
             if (records.size() > 0) {
@@ -220,4 +263,11 @@ public class AttendanceTripServiceImpl extends BaseServiceImpl<AttendanceTripMap
         }
         return false;
     }
+
+    @Override
+    public List<AttendanceTripInfoVO> financialDraftDetail(String eMDraftIds) {
+        List<AttendanceTripInfo> attendanceTripInfos = baseMapper.selectBatchIds(Func.toStrList(eMDraftIds));
+        List<AttendanceTripInfoVO> vos = BeanUtil.copyProperties(attendanceTripInfos, AttendanceTripInfoVO.class);
+        return vos;
+    }
 }

+ 29 - 12
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMFinancialReimbursementServiceImpl.java

@@ -6,17 +6,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
-import org.checkerframework.checker.units.qual.A;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.control.dto.EMFinancialReimbursementInfoDTO;
-import org.springblade.control.dto.EMFinancialReimbursementInfoDTOBatch;
-import org.springblade.control.dto.EMFinancialReimbursementInfoDTODetailInfo;
 import org.springblade.control.entity.*;
 import org.springblade.control.mapper.ExMFinancialReimbursementMapper;
 import org.springblade.control.service.EMFinancialReimbursementService;
 import org.springblade.control.utils.BuildSerialUtils;
 import org.springblade.control.vo.EMDraftGroupVO;
-import org.springblade.control.vo.EMDraftVO;
 import org.springblade.control.vo.EMFinancialReimbursementInfoVO;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -96,7 +92,7 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<ExMFina
         List<String> dataIds = list.stream().map(EMFinancialReimbursementInfo::getId).map(String::valueOf).collect(Collectors.toList());
         List<EMDraftGroupVO> resultList = new LinkedList<>();
         if (dataIds.size() > 0) {
-            List<ExDraftRecord> query = jdbcTemplate.query("select * from c_ex_draft_record where data_type = 1 and data_id in(" + StringUtils.join(dataIds, ",") + ")", new BeanPropertyRowMapper<>(ExDraftRecord.class));
+            List<ExDraftRecord> query = jdbcTemplate.query("select * from c_ex_draft_record where data_type = 2 and data_id in(" + StringUtils.join(dataIds, ",") + ")", new BeanPropertyRowMapper<>(ExDraftRecord.class));
             Map<Long, List<ExDraftRecord>> groupMaps = query.stream().collect(Collectors.groupingBy(ExDraftRecord::getGroupId));
             for (Map.Entry<Long, List<ExDraftRecord>> listEntry : groupMaps.entrySet()) {
                 Long groupId = listEntry.getKey();
@@ -104,7 +100,7 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<ExMFina
                 EMFinancialReimbursementInfo obj = baseMapper.selectById(ids.get(0));
                 EMDraftGroupVO vo = new EMDraftGroupVO();
                 if (obj != null) {
-                    userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的日常报销" : ""));
+                    userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的财务报销" : ""));
                     vo.setUpdateTime(obj.getUpdateTime());
                 }
                 vo.setGroupId(groupId);
@@ -112,7 +108,9 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<ExMFina
                 resultList.add(vo);
             }
         }
-        return resultList;
+        return resultList.stream()
+                .sorted(Comparator.comparing(EMDraftGroupVO::getUpdateTime).reversed())
+                .collect(Collectors.toList());
     }
 
     @Override
@@ -152,10 +150,10 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<ExMFina
                     this.saveOrUpdate(dto);
                 }
 
-                Long aLong = jdbcTemplate.queryForObject("select count(1) from c_ex_draft_record where data_type = 1 and data_id = " + dto.getId(), Long.class);
+                Long aLong = jdbcTemplate.queryForObject("select count(1) from c_ex_draft_record where data_type = 2 and data_id = " + dto.getId(), Long.class);
                 if (aLong == null || aLong == 0L) {
                     //绑定关系
-                    jdbcTemplate.execute("insert into c_ex_draft_record(id,group_id,data_id,data_type) values(" + SnowFlakeUtil.getId() + "," + draftGroupId + "," + dto.getId() + ",1)");
+                    jdbcTemplate.execute("insert into c_ex_draft_record(id,group_id,data_id,data_type) values(" + SnowFlakeUtil.getId() + "," + draftGroupId + "," + dto.getId() + ",2)");
                 }
 
             } else if (("2").equals(dto.getSubmitStatus())) { //提交审批
@@ -197,7 +195,19 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<ExMFina
                     }
                     EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
                     auditUserIds.add(cashierObj.getUserId());
-                    taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+
+                    List<String> nonEmptyAuditUserIds = new LinkedList<>();
+                    for (String userId : auditUserIds) {
+                        if (StringUtils.isNotEmpty(userId)) {
+                            nonEmptyAuditUserIds.add(userId);
+                        }
+                    }
+                    if (nonEmptyAuditUserIds.size() == 0) {
+                        taskProcessInfo.setAuditUserIds(null);
+                    } else {
+                        taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
+                    }
+
 
                     //抄送人
                     if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
@@ -245,8 +255,15 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<ExMFina
 
     @Override
     public boolean financialCancel(Long id) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
         EMFinancialReimbursementInfo obj = baseMapper.selectById(id);
         if (obj != null && obj.getStatus().equals(1)) {
+            if (!obj.getCreateUser().equals(SecureUtil.getUserId())) {
+                throw new ServiceException("当前申请信息不是当前用户创建的,无法操作");
+            }
+
             //查询记录任务关联信息
             List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where expense_info_id = " + id, new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
             if (records.size() > 0) {
@@ -260,11 +277,11 @@ public class EMFinancialReimbursementServiceImpl extends BaseServiceImpl<ExMFina
 
                 //修改当前记录为未上报状态,且暂存
                 if (this.update(Wrappers.<EMFinancialReimbursementInfo>lambdaUpdate().set(EMFinancialReimbursementInfo::getStatus, 0).set(EMFinancialReimbursementInfo::getIsTemp, 0).eq(EMFinancialReimbursementInfo::getId, id))) {
-                    Long aLong = jdbcTemplate.queryForObject("select count(1) from c_ex_draft_record where data_type = 1 and data_id = " + id, Long.class);
+                    Long aLong = jdbcTemplate.queryForObject("select count(1) from c_ex_draft_record where data_type = 2 and data_id = " + id, Long.class);
                     if (aLong == null || aLong == 0L) {
                         //绑定关系
                         Long draftGroupId = SnowFlakeUtil.getId();
-                        jdbcTemplate.execute("insert into c_ex_draft_record(id,group_id,data_id,data_type) values(" + SnowFlakeUtil.getId() + "," + draftGroupId + "," + id + ",1)");
+                        jdbcTemplate.execute("insert into c_ex_draft_record(id,group_id,data_id,data_type) values(" + SnowFlakeUtil.getId() + "," + draftGroupId + "," + id + ",2)");
                     }
                 }
 

+ 20 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMInvoiceServiceImpl.java

@@ -171,7 +171,18 @@ public class EMInvoiceServiceImpl extends BaseServiceImpl<ExMInvoiceMapper, EMIn
                 auditUserIds.add(responsibleObj.getUserId());
                 EMProcessTaskUser financeObj = dto.getFinanceUser(); //财务
                 auditUserIds.add(financeObj.getUserId());
-                taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+
+                List<String> nonEmptyAuditUserIds = new LinkedList<>();
+                for (String userId : auditUserIds) {
+                    if (StringUtils.isNotEmpty(userId)) {
+                        nonEmptyAuditUserIds.add(userId);
+                    }
+                }
+                if (nonEmptyAuditUserIds.size() == 0) {
+                    taskProcessInfo.setAuditUserIds(null);
+                } else {
+                    taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
+                }
 
                 //抄送人
                 if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
@@ -216,8 +227,15 @@ public class EMInvoiceServiceImpl extends BaseServiceImpl<ExMInvoiceMapper, EMIn
 
     @Override
     public boolean invoiceCancel(Long id) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
         EMInvoiceInfo obj = baseMapper.selectById(id);
         if (obj != null && obj.getStatus().equals(1)) {
+            if (!obj.getCreateUser().equals(SecureUtil.getUserId())) {
+                throw new ServiceException("当前申请信息不是当前用户创建的,无法操作");
+            }
+
             //查询记录任务关联信息
             List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where expense_info_id = " + id, new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
             if (records.size() > 0) {
@@ -240,7 +258,7 @@ public class EMInvoiceServiceImpl extends BaseServiceImpl<ExMInvoiceMapper, EMIn
 
     @Override
     public boolean invoiceUpload(Long id, String pdfUrl) {
-        if (StringUtils.isNotEmpty(pdfUrl)) {
+        if (StringUtils.isEmpty(pdfUrl)) {
             throw new ServiceException("未获取到当前pdf路径信息,上传失败!");
         }
         EMInvoiceInfo obj = baseMapper.selectById(id);

+ 19 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMLoanServiceImpl.java

@@ -180,7 +180,18 @@ public class EMLoanServiceImpl extends BaseServiceImpl<ExMLoanMapper, EMLoanInfo
                 }
                 EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
                 auditUserIds.add(cashierObj.getUserId());
-                taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+
+                List<String> nonEmptyAuditUserIds = new LinkedList<>();
+                for (String userId : auditUserIds) {
+                    if (StringUtils.isNotEmpty(userId)) {
+                        nonEmptyAuditUserIds.add(userId);
+                    }
+                }
+                if (nonEmptyAuditUserIds.size() == 0) {
+                    taskProcessInfo.setAuditUserIds(null);
+                } else {
+                    taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
+                }
 
                 //抄送人
                 if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
@@ -223,8 +234,15 @@ public class EMLoanServiceImpl extends BaseServiceImpl<ExMLoanMapper, EMLoanInfo
 
     @Override
     public boolean loanCancel(Long id) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
         EMLoanInfo obj = baseMapper.selectById(id);
         if (obj != null && obj.getStatus().equals(1)) {
+            if (!obj.getCreateUser().equals(SecureUtil.getUserId())) {
+                throw new ServiceException("当前申请信息不是当前用户创建的,无法操作");
+            }
+
             //查询记录任务关联信息
             List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where expense_info_id = " + id, new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
             if (records.size() > 0) {

+ 19 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMOutsourcingPayServiceImpl.java

@@ -169,7 +169,18 @@ public class EMOutsourcingPayServiceImpl extends BaseServiceImpl<ExMOutsourcingP
                 }
                 EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
                 auditUserIds.add(cashierObj.getUserId());
-                taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+
+                List<String> nonEmptyAuditUserIds = new LinkedList<>();
+                for (String userId : auditUserIds) {
+                    if (StringUtils.isNotEmpty(userId)) {
+                        nonEmptyAuditUserIds.add(userId);
+                    }
+                }
+                if (nonEmptyAuditUserIds.size() == 0) {
+                    taskProcessInfo.setAuditUserIds(null);
+                } else {
+                    taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
+                }
 
                 //抄送人
                 if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
@@ -214,8 +225,15 @@ public class EMOutsourcingPayServiceImpl extends BaseServiceImpl<ExMOutsourcingP
 
     @Override
     public boolean outsourcingCancel(Long id) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
         EMOutsourcingPayInfo obj = baseMapper.selectById(id);
         if (obj != null && obj.getStatus().equals(1)) {
+            if (!obj.getCreateUser().equals(SecureUtil.getUserId())) {
+                throw new ServiceException("当前申请信息不是当前用户创建的,无法操作");
+            }
+
             //查询记录任务关联信息
             List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where expense_info_id = " + id, new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
             if (records.size() > 0) {

+ 19 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPayServiceImpl.java

@@ -150,7 +150,18 @@ public class EMPayServiceImpl extends BaseServiceImpl<ExMPayMapper, EMPayInfo> i
                 }
                 EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
                 auditUserIds.add(cashierObj.getUserId());
-                taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+
+                List<String> nonEmptyAuditUserIds = new LinkedList<>();
+                for (String userId : auditUserIds) {
+                    if (StringUtils.isNotEmpty(userId)) {
+                        nonEmptyAuditUserIds.add(userId);
+                    }
+                }
+                if (nonEmptyAuditUserIds.size() == 0) {
+                    taskProcessInfo.setAuditUserIds(null);
+                } else {
+                    taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
+                }
 
                 //抄送人
                 if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
@@ -194,8 +205,15 @@ public class EMPayServiceImpl extends BaseServiceImpl<ExMPayMapper, EMPayInfo> i
 
     @Override
     public boolean payCancel(Long id) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
         EMPayInfo obj = baseMapper.selectById(id);
         if (obj != null && obj.getStatus().equals(1)) {
+            if (!obj.getCreateUser().equals(SecureUtil.getUserId())) {
+                throw new ServiceException("当前申请信息不是当前用户创建的,无法操作");
+            }
+
             //查询记录任务关联信息
             List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where expense_info_id = " + id, new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
             if (records.size() > 0) {

+ 23 - 5
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMPurchaseServiceImpl.java

@@ -12,8 +12,6 @@ import org.springblade.control.entity.*;
 import org.springblade.control.mapper.ExMPurchaseMapper;
 import org.springblade.control.service.EMPurchaseService;
 import org.springblade.control.vo.EMDraftGroupVO;
-import org.springblade.control.vo.EMDraftVO;
-import org.springblade.control.vo.EMFinancialReimbursementInfoVO;
 import org.springblade.control.vo.EMPurchaseInfoVO;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -91,7 +89,7 @@ public class EMPurchaseServiceImpl extends BaseServiceImpl<ExMPurchaseMapper, EM
                 EMPurchaseInfo obj = baseMapper.selectById(ids.get(0));
                 EMDraftGroupVO vo = new EMDraftGroupVO();
                 if (obj != null) {
-                    userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的日常报销" : ""));
+                    userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的采购申请" : ""));
                     vo.setUpdateTime(obj.getUpdateTime());
                 }
                 vo.setGroupId(groupId);
@@ -99,7 +97,9 @@ public class EMPurchaseServiceImpl extends BaseServiceImpl<ExMPurchaseMapper, EM
                 resultList.add(vo);
             }
         }
-        return resultList;
+        return resultList.stream()
+                .sorted(Comparator.comparing(EMDraftGroupVO::getUpdateTime).reversed())
+                .collect(Collectors.toList());
     }
 
     @Override
@@ -177,7 +177,18 @@ public class EMPurchaseServiceImpl extends BaseServiceImpl<ExMPurchaseMapper, EM
                     }
                     EMProcessTaskUser cashierObj = dto.getCashierUser(); //出纳
                     auditUserIds.add(cashierObj.getUserId());
-                    taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+
+                    List<String> nonEmptyAuditUserIds = new LinkedList<>();
+                    for (String userId : auditUserIds) {
+                        if (StringUtils.isNotEmpty(userId)) {
+                            nonEmptyAuditUserIds.add(userId);
+                        }
+                    }
+                    if (nonEmptyAuditUserIds.size() == 0) {
+                        taskProcessInfo.setAuditUserIds(null);
+                    } else {
+                        taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
+                    }
 
                     //抄送人
                     if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
@@ -223,8 +234,15 @@ public class EMPurchaseServiceImpl extends BaseServiceImpl<ExMPurchaseMapper, EM
 
     @Override
     public boolean purchaseCancel(Long id) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
         EMPurchaseInfo obj = baseMapper.selectById(id);
         if (obj != null && obj.getStatus().equals(1)) {
+            if (!obj.getCreateUser().equals(SecureUtil.getUserId())) {
+                throw new ServiceException("当前申请信息不是当前用户创建的,无法操作");
+            }
+
             //查询记录任务关联信息
             List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where expense_info_id = " + id, new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
             if (records.size() > 0) {

+ 24 - 6
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/EMUseCarServiceImpl.java

@@ -12,8 +12,6 @@ import org.springblade.control.entity.*;
 import org.springblade.control.mapper.ExMUseCarMapper;
 import org.springblade.control.service.EMUseCarService;
 import org.springblade.control.vo.EMDraftGroupVO;
-import org.springblade.control.vo.EMDraftVO;
-import org.springblade.control.vo.EMPurchaseInfoVO;
 import org.springblade.control.vo.EMUseCarInfoVO;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -56,7 +54,7 @@ public class EMUseCarServiceImpl extends BaseServiceImpl<ExMUseCarMapper, EMUseC
             vo.setApprovalResultName(vo.getApprovalStatusName().equals("已审批") || vo.getApprovalStatusName().equals("已驳回") ? "已通过" : "未通过");
             vo.setUcOrgName(""); //TODO 部门
 
-            if (ObjectUtil.isNotEmpty(obj.getUseStartDate()) && ObjectUtil.isNotEmpty(obj.getUseEndDate())){
+            if (ObjectUtil.isNotEmpty(obj.getUseStartDate()) && ObjectUtil.isNotEmpty(obj.getUseEndDate())) {
                 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd");
                 String useDate = simpleDateFormat.format(obj.getUseStartDate());
                 String returnDate = simpleDateFormat.format(obj.getUseEndDate());
@@ -93,7 +91,7 @@ public class EMUseCarServiceImpl extends BaseServiceImpl<ExMUseCarMapper, EMUseC
                 EMUseCarInfo obj = baseMapper.selectById(ids.get(0));
                 EMDraftGroupVO vo = new EMDraftGroupVO();
                 if (obj != null) {
-                    userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的日常报销" : ""));
+                    userMaps.get(obj.getCreateUser()).stream().findAny().ifPresent(user -> vo.setTitle((ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getRealName())) ? user.getRealName() + "提交的用车申请" : ""));
                     vo.setUpdateTime(obj.getUpdateTime());
                 }
                 vo.setGroupId(groupId);
@@ -101,7 +99,9 @@ public class EMUseCarServiceImpl extends BaseServiceImpl<ExMUseCarMapper, EMUseC
                 resultList.add(vo);
             }
         }
-        return resultList;
+        return resultList.stream()
+                .sorted(Comparator.comparing(EMDraftGroupVO::getUpdateTime).reversed())
+                .collect(Collectors.toList());
     }
 
     @Override
@@ -173,7 +173,18 @@ public class EMUseCarServiceImpl extends BaseServiceImpl<ExMUseCarMapper, EMUseC
                     auditUserIds.add(responsibleObj.getUserId());
                     EMProcessTaskUser personnelUser = dto.getPersonnelUser(); //人事
                     auditUserIds.add(personnelUser.getUserId());
-                    taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+
+                    List<String> nonEmptyAuditUserIds = new LinkedList<>();
+                    for (String userId : auditUserIds) {
+                        if (StringUtils.isNotEmpty(userId)) {
+                            nonEmptyAuditUserIds.add(userId);
+                        }
+                    }
+                    if (nonEmptyAuditUserIds.size() == 0) {
+                        taskProcessInfo.setAuditUserIds(null);
+                    } else {
+                        taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
+                    }
 
                     //抄送人
                     if (ObjectUtil.isNotEmpty(dto.getCcUserList())) {
@@ -219,8 +230,15 @@ public class EMUseCarServiceImpl extends BaseServiceImpl<ExMUseCarMapper, EMUseC
 
     @Override
     public boolean carCancel(Long id) {
+        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+            throw new ServiceException("获取当前用户信息失败,请联系管理员");
+        }
         EMUseCarInfo obj = baseMapper.selectById(id);
         if (obj != null && obj.getStatus().equals(1)) {
+            if (!obj.getCreateUser().equals(SecureUtil.getUserId())) {
+                throw new ServiceException("当前申请信息不是当前用户创建的,无法操作");
+            }
+
             //查询记录任务关联信息
             List<ExpenseTaskRecord> records = jdbcTemplate.query("select * from c_expense_task_record where expense_info_id = " + id, new BeanPropertyRowMapper<>(ExpenseTaskRecord.class));
             if (records.size() > 0) {

+ 14 - 3
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/LogHistoryServiceImpl.java

@@ -18,6 +18,7 @@ import org.springblade.control.vo.LogHistoryInfoVO;
 import org.springblade.control.vo.TaskPlanInfoVO;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.SecureUtil;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.DateUtil;
@@ -205,8 +206,8 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
     }
 
     @Override
-    public LogHistoryInfoVO logDetail(Long id) {
-        if (ObjectUtil.isEmpty(SecureUtil.getUser())) {
+    public LogHistoryInfoVO logDetail(Long id, BladeUser bladeUser) {
+        if (ObjectUtil.isEmpty(bladeUser) && ObjectUtil.isEmpty(SecureUtil.getUser())) {
             throw new ServiceException("获取当前用户信息失败,请联系管理员");
         }
         LogHistoryInfo obj = baseMapper.selectById(id);
@@ -327,7 +328,17 @@ public class LogHistoryServiceImpl extends BaseServiceImpl<LogHistoryMapper, Log
             responsibleObj.setUserName(departmentHead.getRealName());
             auditUserIds.add(responsibleObj.getUserId());
 
-            taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+            List<String> nonEmptyAuditUserIds = new LinkedList<>();
+            for (String userId : auditUserIds) {
+                if (StringUtils.isNotEmpty(userId)) {
+                    nonEmptyAuditUserIds.add(userId);
+                }
+            }
+            if (nonEmptyAuditUserIds.size() == 0) {
+                taskProcessInfo.setAuditUserIds(null);
+            } else {
+                taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
+            }
 
             taskProcessService.save(taskProcessInfo);
 

+ 20 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -385,6 +385,26 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
         return baseMapper.getAllBudgetByProjectId(id);
     }
 
+    /**
+     * 获取当前项目所有预算已闭环的任务
+     * @param projectId
+     * @return
+     */
+    @Override
+    public List<ProjectCostBudget> getProjectAllFinishedTask(Long projectId,Integer costType) {
+        return baseMapper.getProjectAllFinishedTask(projectId,costType);
+    }
+
+    /**
+     * 获取项目的所有实际费用
+     * @param id
+     * @return
+     */
+    @Override
+    public List<ProjectCostBudget> getAllPracticalBudgetByProjectId(Long projectId) {
+        return baseMapper.getAllPracticalBudgetByProjectId(projectId);
+    }
+
     /**
      * 统计一行的几个总金额
      */

+ 12 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectInfoServiceImpl.java

@@ -164,6 +164,8 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
         List<DictInfo> costTypeDict = baseMapper.getCostTypeDict();
         //获取项目所有预算
         List<ProjectCostBudget> budgets = budgetService.getAllBudgetByProjectId(id);
+        //获取项目所有实际费用
+        List<ProjectCostBudget> practicalList = budgetService.getAllPracticalBudgetByProjectId(id);
         if (budgets != null && budgets.size() > 0){
             Map<Integer, List<ProjectCostBudget>> budgetMap = budgets.parallelStream()
                     .collect(Collectors.groupingBy(ProjectCostBudget::getCostType));
@@ -179,6 +181,16 @@ public class ProjectInfoServiceImpl extends BaseServiceImpl<ProjectInfoMapper, C
                     }
                 }
                 vo.setBudgetCost(bigDecimal);
+                //设置费用分类实际费用,目前只设置人工
+                BigDecimal practicalCost = new BigDecimal(0);
+                if (practicalList != null && practicalList.size() > 0){
+                    for (ProjectCostBudget budget : practicalList) {
+                        if (budget.getCostType() == i){
+                            practicalCost = practicalCost.add(budget.getActualTotalMoney());
+                        }
+                    }
+                }
+                vo.setPracticalCost(practicalCost);
                 list.add(vo);
             }
             return list;

+ 51 - 0
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectProcessServiceImpl.java

@@ -4,16 +4,24 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.AllArgsConstructor;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.control.dto.ControlProjectInfoDTO;
+import org.springblade.control.entity.ProjectCostBudget;
 import org.springblade.control.entity.ProjectProcess;
 import org.springblade.control.mapper.ProjectProcessMapper;
+import org.springblade.control.service.IProjectCostBudgetService;
 import org.springblade.control.service.IProjectProcessService;
 import org.springblade.control.vo.ProjectProcessVO;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.system.entity.TopMenu;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @Param
@@ -24,6 +32,7 @@ import java.util.List;
 @AllArgsConstructor
 public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessMapper, ProjectProcess> implements IProjectProcessService {
     private final ProjectProcessMapper processMapper;
+    private final IProjectCostBudgetService budgetService;
 
     /**
      * 新增项目时保存进程
@@ -109,6 +118,48 @@ public class ProjectProcessServiceImpl extends BaseServiceImpl<ProjectProcessMap
      */
     @Override
     public List<ProjectProcessVO> processService(Long projectId, Integer costType) {
+        //获取当前项目所有项目环节
+        List<ProjectProcessVO> list = processMapper.getProjectProcess(projectId);
+        //获取项目具体部门所有已闭环的任务
+        List<ProjectCostBudget> budgets = budgetService.getProjectAllFinishedTask(projectId,costType);
+        if (budgets != null || budgets.size() > 0){
+            //获取项目环节的set集合
+            Set<Long> set = budgets.stream().map(l -> l.getProjectProcess()).collect(Collectors.toSet());
+            //根据项目环节分组
+            Map<Long, List<ProjectCostBudget>> map = budgets.parallelStream()
+                    .collect(Collectors.groupingBy(ProjectCostBudget::getProjectProcess));
+            //包含此环节就统计,不包含就跳出
+            for (ProjectProcessVO vo : list) {
+                if (set.contains(vo.getId())){
+                    //设置参与
+                    vo.setIsParticipate(1);
+                    //时间成本统计总天数,人员投入统计总人数,成本支出统计当前环节总支出
+                    List<ProjectCostBudget> budgetList = map.get(vo.getId());
+                    BigDecimal costDisburse = new BigDecimal(0);
+                    BigDecimal timeCost = new BigDecimal(0);
+                    int staffTotal = budgetList.size();
+                    for (ProjectCostBudget budget : budgetList) {
+                        costDisburse = costDisburse.add(budget.getActualTotalMoney());
+                        timeCost = timeCost.add(budget.getPracticalTaskDays());
+                    }
+                    //设置费用明细
+                    List<ProjectProcessVO.costDetail> details = new ArrayList<>();
+                    ProjectProcessVO.costDetail costDetail = new ProjectProcessVO.costDetail();
+                    costDetail.setCostTypeValue("人工成本");
+                    costDetail.setPrice(costDisburse);
+                    costDetail.setTotal(costDisburse);
+                    details.add(costDetail);
+                    //目前环节费用的成本支出只统计了人工成本
+                    vo.setCostDisburse(costDisburse);
+                    vo.setTimeCost(timeCost);
+                    vo.setStaffTotal(staffTotal);
+                    vo.setCostDetails(details);
+                }else {
+                    vo.setIsParticipate(0);
+                }
+            }
+            return list;
+        }
         return null;
     }
 }

+ 14 - 2
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/TaskProcessServiceImpl.java

@@ -488,7 +488,13 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                         responsibleObj.setUserName(departmentHead.getRealName());
                         auditUserIds.add(responsibleObj.getUserId());
 
-                        taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+                        List<String> nonEmptyAuditUserIds = new LinkedList<>();
+                        for (String userId : auditUserIds) {
+                            if (StringUtils.isNotEmpty(userId)) {
+                                nonEmptyAuditUserIds.add(userId);
+                            }
+                        }
+                        taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
 
                         this.save(taskProcessInfo);
 
@@ -518,7 +524,13 @@ public class TaskProcessServiceImpl extends BaseServiceImpl<TaskProcessMapper, T
                         responsibleObj.setUserName(departmentHead.getRealName());
                         auditUserIds.add(responsibleObj.getUserId());
 
-                        taskProcessInfo.setAuditUserIds(StringUtils.join(auditUserIds, ","));
+                        List<String> nonEmptyAuditUserIds = new LinkedList<>();
+                        for (String userId : auditUserIds) {
+                            if (StringUtils.isNotEmpty(userId)) {
+                                nonEmptyAuditUserIds.add(userId);
+                            }
+                        }
+                        taskProcessInfo.setAuditUserIds(StringUtils.join(nonEmptyAuditUserIds, ","));
 
                         this.save(taskProcessInfo);
 

+ 15 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java

@@ -166,15 +166,25 @@ public class ArchiveTreeContractController extends BladeController {
             ar.setArchiveNameSuffix(archiveTreeContract.getArchiveNameSuffix());
         }
 
-        if(ar.getArchiveAutoType()==null || ar.getArchiveAutoType()!=2){
-            ar.setArchiveAutoType(archiveTreeContract.getArchiveAutoType());
+        ar.setArchiveAutoType(archiveTreeContract.getArchiveAutoType());
+        if(archiveTreeContract.getArchiveAutoType()==2){
+            //客户级的group用19位,在同步的时候方便判断是值是客户级还是项目级
+            double v = Math.random();
+            if (v < 0.1) {
+                v = v + 0.1;
+            }
+            v = v * 1000000;
+            long ran = (long) v;
+            Long contractGroupId = Long.parseLong(System.currentTimeMillis() + "" + ran);
+            archiveTreeContract.setArchiveAutoGroupId(contractGroupId);
+            archiveTreeContract.setArchiveAutoGroupSelect(1);
         }
 
         boolean b = archiveTreeContractService.updateById(ar);
         //更新下级节点为同一规则
-        if(ar.getArchiveAutoType()==null || ar.getArchiveAutoType()!=2){
-            archiveTreeContractService.updateAllSonNodeIdsForArchiveAutoRule(ar);
-        }
+
+        archiveTreeContractService.updateAllSonNodeIdsForArchiveAutoRule(ar);
+
 
 
         return R.status(b);

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

@@ -626,7 +626,6 @@ public class ExcelTabController extends BladeController {
         InputStream fileInputStream = null;
         if (file1.exists()) {
             fileInputStream = new FileInputStream(file1);
-            ;
         } else {
             String path = sys_file_net_url + fileUrl.replaceAll("//", "/").replaceAll(file_path, "");
             fileInputStream = CommonUtil.getOSSInputStream(path);

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java

@@ -158,14 +158,14 @@ public class WbsParamController {
                     for (WbsParamBean b : updateList) {
                         WbsParam old = this.service.getById(b.getId());
                         if (pb.isCommon()) {
-                            if (old != null && (!old.getV().equals(b.getV())||StringUtils.isNotEquals(old.getRemark(),b.getRemark()))) {
+                            if (old != null && (StringUtils.isNotEquals(old.getK(),b.getK())||StringUtils.isNotEquals(old.getRemark(),b.getRemark()))) {
                                 /*只有公式内容变化的时候才需要更新*/
                                 old.setIsDeleted(0);
                                 BeanUtils.copyProperties(b, old);
                                 ul.add(old);
                             }
                         } else {
-                            if (old != null && (!old.getV().equals(b.getV())||StringUtils.isNotEquals(old.getRemark(),b.getRemark()))) {
+                            if (old != null && (StringUtils.isNotEquals(old.getV(),b.getV())||StringUtils.isNotEquals(old.getRemark(),b.getRemark()))) {
                                 /*只有公式内容变化的时候才需要更新*/
                                 old.setIsDeleted(0);
                                 BeanUtils.copyProperties(b, old);

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

@@ -7,7 +7,6 @@ import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.WbsTreeContractDTO2;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.WbsTreeContract;
@@ -21,8 +20,6 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.util.*;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 @RestController
 @AllArgsConstructor

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

@@ -203,11 +203,12 @@ public class WbsTreeController extends BladeController {
             if (var) {
                 if (wbsTreeService.removeTableById(id)) {
                     //如果当前节点没有表单,那么修改is_exist_form = 0
-                    WbsTree wbsTreeZi = jdbcTemplate.query("select * from m_wbs_tree where is_deleted = 1 and id = " + id, new BeanPropertyRowMapper<>(WbsTree.class)).stream().findAny().orElse(null);
+                    WbsTree wbsTreeZi = jdbcTemplate.query("select * from m_wbs_tree where type = 2 and is_deleted = 1 and id = " + id, new BeanPropertyRowMapper<>(WbsTree.class)).stream().findAny().orElse(null);
                     if (wbsTreeZi != null) {
                         WbsTree wbsTreeFu = wbsTreeService.getBaseMapper().selectOne(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getId, wbsTreeZi.getParentId()));
                         if (wbsTreeFu != null) {
-                            List<WbsTree> nodes = wbsTreeService.getBaseMapper().selectList(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getParentId, wbsTreeFu.getId()));
+                            //当前父级下没有表,表示修改
+                            List<WbsTree> nodes = wbsTreeService.getBaseMapper().selectList(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getType, 2).eq(WbsTree::getParentId, wbsTreeFu.getId()));
                             if (nodes.size() == 0) {
                                 wbsTreeService.update(Wrappers.<WbsTree>lambdaUpdate().set(WbsTree::getIsExistForm, 0).eq(WbsTree::getId, wbsTreeFu.getId()));
                             }

+ 7 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITurnPointCalculator.java

@@ -8,6 +8,7 @@ import org.springblade.manager.formula.impl.TableElementConverter;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.stream.Collectors;
 
 import static com.mixsmart.utils.CustomFunction.rangeList;
@@ -20,9 +21,10 @@ import static org.springblade.manager.formula.TurnPoint.*;
 public interface ITurnPointCalculator {
 
 
-    static List<TurnPoint> create(List<Map<String, Object>> data, LinkedHashMap<String, String> configMap) {
+    static List<TurnPoint> create(List<Map<String, Object>> data, LinkedHashMap<String, String> configMap,String g8pcfw) {
         if (Func.isNotEmpty(data) && configMap != null) {
             LevelInfo levelInfo = new LevelInfo();
+            levelInfo.setDx(g8pcfw);
             List<TurnPoint> tmp = new ArrayList<>();
             for (int i = 0; i < data.size(); i++) {
                 Map<String, Object> dm = data.get(i);
@@ -89,7 +91,8 @@ public interface ITurnPointCalculator {
                         TurnPoint close = new TurnPoint(levelInfo, new HashMap<>());
                         close.setName(levelInfo.getBmdName());
                         close.setSj(levelInfo.getBmdSj());
-                        double ldx = Double.parseDouble(rangeList(1, 0, levelInfo.getDx(), 0.001, 3, 1).get(0).toString());
+                        /*闭合点的偏差范围是±3mm*/
+                        double ldx=Arrays.asList(-3,-2,-1,1,2,3).get(ThreadLocalRandom.current().nextInt(6));
                         close.setSc(close.getSj0L() + ldx);
                         close.setDx(ldx);
                         close.setType(TurnPoint.CLOSE);
@@ -113,6 +116,8 @@ public interface ITurnPointCalculator {
         return Collections.emptyList();
     }
 
+
+
     static List<TurnPoint> fill(List<TurnPoint> turnPointList) {
         if (ListUtils.isNotEmpty(turnPointList)) {
             Random rd = new Random();

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaTurnPoint.java

@@ -60,6 +60,7 @@ public class FormulaTurnPoint implements FormulaStrategy {
                     return;
                 }
             }
+            String g8pcfw =Expression.parse("WP['g8pcfw']").calculate(tec.getConstantMap());
             CompositeDataAccess cda = new CompositeDataAccess(dataSourceMap);
             List<Map<String, Object>> tableData = new ArrayList<>();
             /*用来映射元素*/
@@ -88,7 +89,7 @@ public class FormulaTurnPoint implements FormulaStrategy {
             }
             @SuppressWarnings("unchecked")
             Map<String, Object> g8 = (Map<String, Object>) tec.getConstantMap().computeIfAbsent("G8", k -> new HashMap<>());
-            List<TurnPoint> result = ITurnPointCalculator.create(tableData, configMap);
+            List<TurnPoint> result = ITurnPointCalculator.create(tableData, configMap,g8pcfw);
             /*V判断*/
             forG8(result, g8,tec);
             List<Object> data= result.stream().map(TurnPoint::getDataMap).flatMap(m -> {

+ 7 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ArchiveTreeContractMapper.xml

@@ -116,6 +116,7 @@
         <result column="reviewer" property="reviewer"/>
         <result column="specification" property="specification"/>
         <result column="archive_name_suffix" property="archiveNameSuffix"/>
+        <result column="tree_number" property="treeNumber"/>
     </resultMap>
 
 
@@ -215,7 +216,12 @@
         d.archive_name_suffix,
         d.contract_id,
         (SELECT CASE WHEN count(1) > 0 THEN 1 ELSE 0 END FROM m_archive_tree_contract WHERE parent_id = d.id and is_deleted = 0 and project_id = #{projectId})
-        AS "has_children"
+        AS "has_children",
+        (SELECT  count(1)  FROM m_archive_tree_contract WHERE  is_deleted = 0 and project_id = #{projectId} and ancestors like CONCAT('%',d.id,'%')
+        <if test="code!=null and code!=''">
+            AND (tree_code = #{code} or tree_code = #{contractId} or parent_id = 0)
+        </if>
+        ) as tree_number
         FROM
         m_archive_tree_contract d
         WHERE
@@ -484,10 +490,6 @@
         <if test="archiveAutoType ==1 ">
             and (archive_auto_type != 2 and archive_auto_type != 3 or archive_auto_type is null)
         </if>
-        /*分类并卷规则不能覆盖单独组卷规则*/
-        <if test="archiveAutoType ==2 ">
-            and (archive_auto_type != 3 or archive_auto_type is null)
-        </if>
     </update>
 
 </mapper>

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -1607,10 +1607,10 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                                      data=result.get(1);
                              }
                          }
-
-                         f = f.replace(m.group(),putDataWithKey(data));
+                         f = f.replace(m.group(),putDataWithKey(BaseUtils.isNumber(data)?Double.parseDouble(data.toString()):data));
                      }
                      fd.getFormula().setFormula(f);
+                     formula.setScale(1);
                  }
                  formula.setFormula(f);
              }catch (Exception e){

+ 42 - 20
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -48,6 +48,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.math.BigInteger;
 import java.util.*;
 import java.util.function.Function;
 import java.util.regex.Matcher;
@@ -560,7 +561,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     .select(WbsTreeContract::getNodeName, WbsTreeContract::getTableOwner, WbsTreeContract::getPKeyId, WbsTreeContract::getInitTableName, WbsTreeContract::getSort, WbsTreeContract::getFullName, WbsTreeContract::getUpdateTime)
                     .eq(WbsTreeContract::getContractId, node.getContractId()).eq(WbsTreeContract::getType, 2)
                     .eq(WbsTreeContract::getWbsId, node.getWbsId()).eq(WbsTreeContract::getWbsType, node.getWbsType())
-                    .eq(WbsTreeContract::getStatus, 1));
+                    .eq(WbsTreeContract::getStatus, 1)
+                    .ne(WbsTreeContract::getIsBussShow, 2)); //隐藏的表单不操作
 
             Map<Long, WbsTreeContract> tabMaps = tabs.stream().collect(Collectors.toMap(WbsTreeContract::getPKeyId, Function.identity()));
 
@@ -656,14 +658,20 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                     List<String> keysAll = Func.toStrList(filedTabMaps.get(initTabName).get(0));
 
                     //获取所有有效字段长度
-                    String sql = "SELECT COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? AND COLUMN_NAME IN (" + StringUtils.repeat("?", ",", keysAll.size()) + ")";
+                    String sql = "SELECT COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? AND COLUMN_NAME IN (" + StringUtils.repeat("?", ",", keysAll.size()) + ") AND CHARACTER_MAXIMUM_LENGTH IS NOT NULL";
                     List<Object> args = new ArrayList<>(Arrays.asList("bladex", initTabName));
                     args.addAll(keysAll);
                     List<Map<String, Object>> keyLengthMap = jdbcTemplate.queryForList(sql, args.toArray());
                     Map<String, Integer> keyLengthMaps = new HashMap<>();
                     for (Map<String, Object> row : keyLengthMap) {
                         String key = (String) row.get("COLUMN_NAME");
-                        int length = (int) row.get("CHARACTER_MAXIMUM_LENGTH");
+                        BigInteger maxLength = (BigInteger) row.get("CHARACTER_MAXIMUM_LENGTH");
+                        int length;
+                        if (maxLength != null) {
+                            length = maxLength.intValue();
+                        } else {
+                            length = -1; //默认值
+                        }
                         keyLengthMaps.put(key, length);
                     }
 
@@ -705,7 +713,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                 for (String exKey : exKeys) {
                                     String[] split = exKey.split("---");
                                     String key = split[0];
-                                    int length = Integer.parseInt(split[1]) * 200; //长度扩容+200
+                                    int length = Integer.parseInt(split[1]) * 2; //长度扩容两倍
                                     String alterSql = "ALTER TABLE " + initTabName + " MODIFY " + key + " VARCHAR(" + length + ");";
                                     exStrBuilder.append(alterSql);
                                 }
@@ -769,6 +777,26 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
                 //入库
                 if (resultSQLS.size() > 0) {
+                    List<String> SqlWithAlter = new ArrayList<>();
+                    List<String> SqlWithoutAlter = new ArrayList<>();
+
+                    for (String sql : resultSQLS) {
+                        if (sql.contains("ALTER TABLE")) {
+                            SqlWithAlter.add(sql);
+                        } else {
+                            SqlWithoutAlter.add(sql);
+                        }
+                    }
+
+                    //清空原始列表
+                    resultSQLS.clear();
+
+                    //将SqlWithAlter列表的元素添加到结果列表的开头
+                    resultSQLS.addAll(SqlWithAlter);
+
+                    //将SqlWithoutAlter列表的元素添加到结果列表的末尾
+                    resultSQLS.addAll(SqlWithoutAlter);
+
                     List<List<String>> partition = Lists.partition(resultSQLS, 10);
                     for (List<String> strings : partition) {
                         jdbcTemplate.execute(StringUtils.join(strings, " "));
@@ -854,7 +882,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                         td = doc.select("el-select[keyname~=" + findIndex + ".*]");
                                     }
                                     if (td.size() == 0) {
-                                        //测站点
+                                        //测站点、后视点
                                         td = doc.select("hc-form-select-search[keyname~=" + findIndex + ".*]");
                                     }
                                     String placeholderValue = "";
@@ -875,9 +903,9 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                             //特殊处理
                                             if (placeholderValue.equals("测站点") && StringUtils.isNotEmpty(inputType)) {
                                                 tdJL = docJL.select("hc-form-select-search[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*][type~=" + this.escapeRegex(inputType) + ".*]");
-                                            } /*else if (placeholderValue.equals("日期:")) {
-                                                tdJL = docJL.select("el-date-picker[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*][type~=" + this.escapeRegex(inputType) + ".*]");
-                                            }*/
+                                            } else if (placeholderValue.equals("后视点") && StringUtils.isNotEmpty(inputType)) {
+                                                tdJL = docJL.select("hc-form-select-search[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*][type~=" + this.escapeRegex(inputType) + ".*]");
+                                            }
 
                                             if (tdJL.size() == 0) {
                                                 //日期格式
@@ -899,10 +927,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                                 //下拉框
                                                 tdJL = docJL.select("el-select[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*]");
                                             }
-                                            if (tdJL.size() == 0) {
-                                                //测站点
-                                                tdJL = docJL.select("hc-form-select-search[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*]");
-                                            }
+
                                             if (tdJL.size() >= 1) {
                                                 for (Element element : tdJL) {
                                                     String keyname = element.attr("keyname");
@@ -963,7 +988,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                             td = doc.select("el-select[keyname~=" + findIndex + ".*]");
                                         }
                                         if (td.size() == 0) {
-                                            //测站点
+                                            //测站点、后视点
                                             td = doc.select("hc-form-select-search[keyname~=" + findIndex + ".*]");
                                         }
                                         String placeholderValue = "";
@@ -985,9 +1010,9 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                                 //特殊处理
                                                 if (placeholderValue.equals("测站点") && StringUtils.isNotEmpty(inputType)) {
                                                     tdJL = docJL.select("hc-form-select-search[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*][type~=" + this.escapeRegex(inputType) + ".*]");
-                                                } /*else if (placeholderValue.equals("日期:")) {
-                                                    tdJL = docJL.select("el-date-picker[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*][type~=" + this.escapeRegex(inputType) + ".*]");
-                                                }*/
+                                                } else if (placeholderValue.equals("后视点") && StringUtils.isNotEmpty(inputType)) {
+                                                    tdJL = docJL.select("hc-form-select-search[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*][type~=" + this.escapeRegex(inputType) + ".*]");
+                                                }
 
                                                 if (tdJL.size() == 0) {
                                                     //日期格式
@@ -1009,10 +1034,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                                                     //下拉框
                                                     tdJL = docJL.select("el-select[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*]");
                                                 }
-                                                if (tdJL.size() == 0) {
-                                                    //测站点
-                                                    tdJL = docJL.select("hc-form-select-search[placeholderxx~=" + this.escapeRegex(placeholderValue) + ".*]");
-                                                }
+
                                                 if (tdJL.size() >= 1) {
                                                     for (Element element : tdJL) {
                                                         String keyname = element.attr("keyname");

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -468,6 +468,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     @Async
     public void refreshRedisCache(List<WbsTreeContract> listContractAdd) {
         Map<Long, List<String>> contractIdByParentIds = listContractAdd.stream()
+                .filter(contract -> contract.getParentId() != null)
                 .collect(Collectors.groupingBy(WbsTreeContract::getParentId,
                         Collectors.mapping(WbsTreeContract::getContractId, Collectors.toList())));
         Set<Long> parentIds = contractIdByParentIds.keySet();