2
0

2 Коммитууд 7680afa123 ... 691f687f7d

Эзэн SHA1 Мессеж Огноо
  zhulu 691f687f7d Merge branch 'V1.0.14' of http://39.99.141.0:10000/fjnx/soc into V1.0.14 1 долоо хоног өмнө
  zhulu 52358d5507 出入模块 业务重构 1 долоо хоног өмнө
19 өөрчлөгдсөн 739 нэмэгдсэн , 62 устгасан
  1. 9 0
      project_data/sql/1.0.14/soc/soc.sql
  2. 25 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/domain/CoreIntroduceLetterOutInRequest.java
  3. 8 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/domain/CoreIntroduceLetterOutInRequestUser.java
  4. 5 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/dto/CoreIntroduceLetterAddOutInRequestDto.java
  5. 13 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/dto/CoreIntroduceLetterApproveRequestDto.java
  6. 5 1
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/dto/CoreIntroduceLetterRequestDto.java
  7. 39 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/dto/CoreIntroduceLetterUpdateOutInRequestDto.java
  8. 6 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/dto/CoreIntroduceLetterUserAddDto.java
  9. 21 3
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/vo/CoreIntroduceLetterOutInRequestVo.java
  10. 57 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/vo/CoreIntroduceLetterUserVo.java
  11. 4 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/vo/CoreIntroduceLetterVo.java
  12. 52 4
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/controller/CoreIntroduceLetterController.java
  13. 10 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/mapper/CoreIntroduceLetterMapper.java
  14. 72 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/mapper/ListToStringTypeHandler.java
  15. 13 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/service/ICoreIntroduceLetterOutInRequestUserService.java
  16. 13 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/service/ICoreIntroduceLetterService.java
  17. 21 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/service/impl/CoreIntroduceLetterOutInRequestUserImpl.java
  18. 207 31
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/service/impl/CoreIntroduceLetterServiceImpl.java
  19. 159 23
      soc-modules/soc-modules-core/src/main/resources/mapper/letter/CoreIntroduceLetterMapper.xml

+ 9 - 0
project_data/sql/1.0.14/soc/soc.sql

@@ -25,6 +25,15 @@ BEGIN
     END IF;
 
     IF NOT EXISTS(SELECT *
+              FROM information_schema.columns
+              WHERE table_schema = DATABASE()
+                AND table_name = 'core_introduce_letter_out_in_request_user'
+                AND column_name = 'letter_user_id') THEN
+    ALTER TABLE `core_introduce_letter_out_in_request_user`
+        ADD COLUMN `letter_user_id` bigint NULL COMMENT '介绍信用户ID' ;
+    END IF;
+
+    IF NOT EXISTS(SELECT *
                   FROM information_schema.columns
                   WHERE table_schema = DATABASE()
                     AND table_name = 'core_introduce_letter_out_in_request'

+ 25 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/domain/CoreIntroduceLetterOutInRequest.java

@@ -105,5 +105,30 @@ public class CoreIntroduceLetterOutInRequest extends BaseEntity {
     @ApiModelProperty(value = "有效天数")
     private Integer effectiveDays;
 
+    /**
+     * 出入状态 :0待审批 1 待登记 2 已完成 3 已拒绝 4 已过期 5已补登
+     */
+    public Integer status;
+
+    /**
+     * 陪伴人员
+     */
+    public String accompanyingPerson;
+
+    /**
+     * 核验人员签名
+     */
+    public String checkSign;
+
+    /**
+     * 备注
+     */
+    public String remark;
+
+    /**
+     * 备注图片
+     */
+    public String remarkImage;
+
 
 }

+ 8 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/domain/CoreIntroduceLetterOutInRequestUser.java

@@ -51,4 +51,12 @@ public class CoreIntroduceLetterOutInRequestUser
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date arrivalTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date departureTime;
+
+    private Long letterUserId;
 }

+ 5 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/dto/CoreIntroduceLetterAddOutInRequestDto.java

@@ -23,6 +23,11 @@ public class CoreIntroduceLetterAddOutInRequestDto {
      */
     private Long id;
 
+    /**
+     * 核验人签名
+     */
+    private String checkSign;
+
     private List<CoreIntroduceLetterUserAddDto> userInfos;
 
 }

+ 13 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/dto/CoreIntroduceLetterApproveRequestDto.java

@@ -42,4 +42,17 @@ public class CoreIntroduceLetterApproveRequestDto extends BaseEntity {
     private Integer type;
 
     private Date arrivalTime;
+
+//    @ApiModelProperty(value = "介绍信状态:0 草稿 ,1 使用中, 2 已逾期")
+//    private Integer status;
+
+    @ApiModelProperty(value = "APP端查询关键字")
+    private String keyWords;
+
+    @ApiModelProperty(value = "出入状态 :0待审批 1 待登记 2 已完成 3 已拒绝 4 已过期 5已补登")
+    private Integer outInRequestStatus;
+
+    private Date createTime;
+
+    private Date[] createTimeRange;
 }

+ 5 - 1
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/dto/CoreIntroduceLetterRequestDto.java

@@ -33,7 +33,7 @@ public class CoreIntroduceLetterRequestDto extends BaseEntity {
     @ApiModelProperty(value = "介绍信有效期")
     private List<Date> range;
 
-    @ApiModelProperty(value = "状态:0 草稿 ,1 使用中, 2 已逾期")
+    @ApiModelProperty(value = "介绍信状态:0 草稿 ,1 使用中, 2 已逾期")
     private Integer status;
 
     @ApiModelProperty(value = "类型:1 职能部门出入, 2 临时出入,3 紧急出入")
@@ -44,4 +44,8 @@ public class CoreIntroduceLetterRequestDto extends BaseEntity {
 
     @ApiModelProperty(value = "APP端查询关键字")
     private String keyWords;
+
+
+    @ApiModelProperty(value = "出入状态 :0待审批 1 待登记 2 已完成 3 已拒绝 4 已过期 5已补登")
+    private Integer outInRequestStatus;
 }

+ 39 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/dto/CoreIntroduceLetterUpdateOutInRequestDto.java

@@ -0,0 +1,39 @@
+package com.xunmei.common.core.domain.letter.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 介绍信对象 core_introduce_letter
+ *
+ * @author xunmei
+ * @date 2023-10-12
+ */
+@Data
+
+public class CoreIntroduceLetterUpdateOutInRequestDto {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * $column.columnComment
+     */
+    private Long id;
+
+    /**
+     * 1 保存 2 提交
+     */
+    private Integer type;
+
+    private Long letterId;
+
+    private List<CoreIntroduceLetterUserAddDto> userInfos;
+
+    private String letterReasons;
+
+    private String accompanyingPerson;
+
+    private String remark;
+
+    private String remarkImage;
+}

+ 6 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/dto/CoreIntroduceLetterUserAddDto.java

@@ -54,11 +54,17 @@ public class CoreIntroduceLetterUserAddDto {
      */
     private Long letterId;
 
+    private Long letterUserId;
 
     private String createBy;
 
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date arrivalTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date departureTime;
 
 }

+ 21 - 3
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/vo/CoreIntroduceLetterOutInRequestVo.java

@@ -49,6 +49,13 @@ public class CoreIntroduceLetterOutInRequestVo {
     private String letterNo;
 
     /**
+     * 介绍信编号
+     */
+    @ApiModelProperty(value = "介绍信Id")
+    private Long letterId;
+
+
+    /**
      * 有效开始时间
      */
     @ApiModelProperty(value = "有效开始时间")
@@ -90,7 +97,7 @@ public class CoreIntroduceLetterOutInRequestVo {
     private String orgName;
 
 
-    @ApiModelProperty(value = "状态:0 草稿 ,1 使用中, 2 已逾期")
+    @ApiModelProperty(value = "出入状态 :0待审批 1 待登记 2 已完成 3 已拒绝 4 已过期 5已补登")
     private Integer status;
 
     @ApiModelProperty(value = "类型:1 职能部门出入, 2 临时出入,3 紧急出入")
@@ -119,7 +126,8 @@ public class CoreIntroduceLetterOutInRequestVo {
     @ApiModelProperty(value = "类型:1 职能部门出入, 2 临时出入,3 紧急出入")
     private String letterDescription;
 
-
+    @ApiModelProperty(value = "出入人员名称,以','分隔")
+    private String userNames;
 
     private List<CoreIntroduceLetterOutInRequestUser> userInfos;
 
@@ -130,6 +138,16 @@ public class CoreIntroduceLetterOutInRequestVo {
     @ApiModelProperty(value = "接待机构名称")
     private String receptionOrgNames;
 
-    @JsonFormat(pattern = "yyyy年MM月dd日", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    private String accompanyingPerson;
+
+    private String remark;
+
+    private String remarkImage;
+
 }

+ 57 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/vo/CoreIntroduceLetterUserVo.java

@@ -0,0 +1,57 @@
+package com.xunmei.common.core.domain.letter.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ *
+ * @author xunmei
+ * @date 2025-10-12
+ */
+@Data
+public class CoreIntroduceLetterUserVo {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * $column.columnComment
+     */
+    private Long id;
+
+    /**
+     * 人员名称
+     */
+    @ApiModelProperty(value = "人员名称")
+    private String userName;
+    /**
+     * 介绍信名称
+     */
+    @ApiModelProperty(value = "单位名称")
+    private String companyName;
+
+    /**
+     * 证件照片
+     */
+    @ApiModelProperty(value = "证件照片")
+    private String imgFile;
+
+    /**
+     * 证件类型
+     */
+    private String idType;
+
+    /**
+     * 证件号码
+     */
+    private String idCard;
+
+    /**
+     * 介绍信ID
+     */
+    private Long letterId;
+
+}

+ 4 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/vo/CoreIntroduceLetterVo.java

@@ -64,6 +64,7 @@ public class CoreIntroduceLetterVo {
      * 介绍信文件
      */
     private List<String> letterFile;
+    private String letterFileStr;
 
     /**
      * 创建机构
@@ -115,5 +116,8 @@ public class CoreIntroduceLetterVo {
 
     private  String letterUserNames;
 
+    List<CoreIntroduceLetterUserVo> userInfos;
+
+    List<CoreIntroduceLetterOutInRequestVo> recentOutInRequestRecords;
 
 }

+ 52 - 4
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/controller/CoreIntroduceLetterController.java

@@ -1,5 +1,6 @@
 package com.xunmei.core.letter.controller;
 
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.xunmei.common.core.domain.letter.domain.CoreIntroduceLetterOutInRequest;
 import com.xunmei.common.core.domain.letter.dto.*;
@@ -18,6 +19,7 @@ import io.swagger.annotations.ApiOperation;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.Date;
 
 /**
  * 介绍信Controller
@@ -36,7 +38,7 @@ public class CoreIntroduceLetterController extends BaseController {
  * 查询介绍信列表
  */
 @ApiOperation(value = "查询CoreIntroduceLetter列表")
-@RequiresPermissions("core:letter:query")
+//@RequiresPermissions("core:letter:query")
 @GetMapping("/list")
     public TableDataInfo<CoreIntroduceLetterVo> list(CoreIntroduceLetterRequestDto requestDto) {
         return coreIntroduceLetterService.selectPage(requestDto);
@@ -113,7 +115,7 @@ public class CoreIntroduceLetterController extends BaseController {
     @ApiOperation(value = "审批")
     @RequiresPermissions("core:letter:approve")
     @Log(title = "介绍信" , businessType = BusinessType.UPDATE)
-    @PutMapping("/approve")
+    @PutMapping("/outinrequest/approve")
     public AjaxResult approveLetter(@RequestBody CoreIntroduceLetterOutInRequest request) {
         coreIntroduceLetterService.auditLetter(request);
         return success();
@@ -159,17 +161,28 @@ public class CoreIntroduceLetterController extends BaseController {
 
 
     /**
-     * 新增介绍信
+     * 新增出入申请
      */
     @ApiOperation(value = "新增出入申请")
     @Log(title = "介绍信出入申请" , businessType = BusinessType.INSERT)
-    @PostMapping("outInRequest")
+    @PostMapping("outinrequest")
     public AjaxResult addOutInRequest(@RequestBody CoreIntroduceLetterAddOutInRequestDto coreIntroduceLetter) {
         coreIntroduceLetterService.insertOutInRequest(coreIntroduceLetter);
         return success();
     }
 
     /**
+     * 删除出入申请
+     */
+    @ApiOperation(value = "删除出入申请")
+    @Log(title = "删除出入申请" , businessType = BusinessType.DELETE)
+    @DeleteMapping("outinrequest/{id}")
+    public AjaxResult addOutInRequest(@PathVariable("id") Long outInRequestId) {
+        coreIntroduceLetterService.deleteOutInRequest(outInRequestId);
+        return success();
+    }
+
+    /**
      * 获取出入申请详细信息
      */
     @ApiOperation(value = "获取CoreIntroduceLetter详细信息")
@@ -179,4 +192,39 @@ public class CoreIntroduceLetterController extends BaseController {
         return success(coreIntroduceLetterService.selectOutInRequestInfoById(id));
     }
 
+    /**
+     * 登记出入信息
+     */
+    @ApiOperation(value = "修改出入申请信息")
+    @Log(title = "修改出入申请" , businessType = BusinessType.INSERT)
+    @PutMapping("outinrequest")
+    public AjaxResult updateOutInRequest(@RequestBody CoreIntroduceLetterUpdateOutInRequestDto outInRequestDto) {
+        coreIntroduceLetterService.updateOutInRequest(outInRequestDto);
+        return success();
+    }
+
+    @ApiOperation(value = "查询出入申请列表")
+    @RequiresPermissions("core:letter:query")
+    @GetMapping("/outinrequest/list")
+    public TableDataInfo<CoreIntroduceLetterOutInRequestVo> outInRequestList(CoreIntroduceLetterApproveRequestDto requestDto) {
+        if(ObjectUtil.isNull(requestDto))
+        {
+            throw new RuntimeException("请求参数不能为空");
+        }
+        if(ObjectUtil.isEmpty( requestDto.getOrgId()))
+        {
+            requestDto.setOrgId(SecurityUtils.getLoginUser().getOrgId());
+        }
+        if(ObjectUtil.isNull(requestDto.getOrgId()))
+        {
+            throw new RuntimeException("请求参数机构编码不能为空");
+        }
+        if (ObjectUtil.isNotEmpty(requestDto.getCreateTime())) {
+            requestDto.setCreateTimeRange(new Date[]{
+                    DateUtil.beginOfDay(requestDto.getCreateTime()),
+                    DateUtil.endOfDay(requestDto.getCreateTime())
+            });
+        }
+        return coreIntroduceLetterService.selectOntInRequestListPage(requestDto);
+    }
 }

+ 10 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/mapper/CoreIntroduceLetterMapper.java

@@ -69,6 +69,8 @@ public interface CoreIntroduceLetterMapper extends BaseMapper<CoreIntroduceLette
 
     void saveUserList(@Param("userList")List<CoreIntroduceLetterUser> userList);
 
+    void batchUpdateLetterUserList(@Param("userList")List<CoreIntroduceLetterUserAddDto> userList);
+
     void saveToOrgList(@Param("toOrgList") List<CoreIntroduceLetterToOrg> toOrgList);
 
     void deleteUserList(@Param("letterId") Long letterId);
@@ -78,6 +80,8 @@ public interface CoreIntroduceLetterMapper extends BaseMapper<CoreIntroduceLette
     Page<CoreIntroduceLetterVo> selectPageList(@Param("page") Page<CoreIntroduceLetterVo> page, @Param("coreIntroduceLetter") CoreIntroduceLetterRequestDto coreIntroduceLetter);
     Page<CoreIntroduceLetterVo> selectPageListForApp(@Param("page") Page<CoreIntroduceLetterVo> page, @Param("coreIntroduceLetter") CoreIntroduceLetterRequestDto coreIntroduceLetter);
 
+    List<CoreIntroduceLetterUserVo> selectLetterUsers(@Param("letterIds")  List<Long> letterIds);
+
 
     List<CoreIntroduceLetterToOrg> findToOrgListA(@Param("records")  List<CoreIntroduceLetterVo> records);
     List<CoreIntroduceLetterToOrg> findToOrgListB(@Param("records")  List<CoreIntroduceLetterInfoVo> records);
@@ -94,6 +98,10 @@ public interface CoreIntroduceLetterMapper extends BaseMapper<CoreIntroduceLette
 
     Page<CoreIntroduceLetterOutInRequestVo> selectApproveListPage(@Param("page") Page<CoreIntroduceLetterOutInRequestVo> page, @Param("coreIntroduceLetter") CoreIntroduceLetterApproveRequestDto coreIntroduceLetter);
 
+    Page<CoreIntroduceLetterOutInRequestVo> selectOntInRequestListPage(@Param("page") Page<CoreIntroduceLetterOutInRequestVo> page, @Param("coreIntroduceLetter") CoreIntroduceLetterApproveRequestDto coreIntroduceLetter);
+
+
+
     void saveCheckLogs(@Param("checkLogs") List<CoreIntroduceLetterOutInRequest> checkLogs);
 
     List<CoreIntroduceLetterOutInRequestVo> findLetterApproveInfos(@Param("letterId") Long letterId);
@@ -116,4 +124,6 @@ public interface CoreIntroduceLetterMapper extends BaseMapper<CoreIntroduceLette
 
     CoreIntroduceLetterOutInRequestVo selectOneOutInRequestById(@Param("id")  Long id);
 
+    List<CoreIntroduceLetterOutInRequestVo> selectOutInRequestByLetterIds(@Param("letterIds") List<Long> letterIds,@Param("status") Integer status,@Param("orgId") Long orgId);
+
 }

+ 72 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/mapper/ListToStringTypeHandler.java

@@ -0,0 +1,72 @@
+package com.xunmei.core.letter.mapper;
+
+/**
+ * @ClassName ListToStringTypeHandler
+ * @Description: 类描述
+ * @Author: LuZhu
+ * @CreateDate: 2025/9/30 16:32
+ */
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+
+/**
+ * MyBatis TypeHandler:将数据库中的 JSON 字符串 ["a","b"] 转为 Java List<String>
+ * 支持读写 JSON 格式的字符串数组
+ */
+public class ListToStringTypeHandler extends BaseTypeHandler<List<String>> {
+
+    private static final ObjectMapper objectMapper = new ObjectMapper();
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
+        try {
+            // 将 List<String> 序列化为 JSON 字符串 ["a","b"]
+            String json = objectMapper.writeValueAsString(parameter);
+            ps.setString(i, json);
+        } catch (Exception e) {
+            throw new SQLException("Error converting List<String> to JSON", e);
+        }
+    }
+
+    @Override
+    public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        String json = rs.getString(columnName);
+        return parseJsonToList(json);
+    }
+
+    @Override
+    public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        String json = rs.getString(columnIndex);
+        return parseJsonToList(json);
+    }
+
+    @Override
+    public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        String json = cs.getString(columnIndex);
+        return parseJsonToList(json);
+    }
+
+    /**
+     * 将 JSON 字符串解析为 List<String>
+     */
+    private List<String> parseJsonToList(String json) throws SQLException {
+        if (json == null || json.trim().isEmpty()) {
+            return null;
+        }
+        try {
+            // 使用 TypeReference 确保泛型正确
+            return objectMapper.readValue(json, new TypeReference<List<String>>() {});
+        } catch (Exception e) {
+            throw new SQLException("Error parsing JSON to List<String>", e);
+        }
+    }
+}

+ 13 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/service/ICoreIntroduceLetterOutInRequestUserService.java

@@ -0,0 +1,13 @@
+package com.xunmei.core.letter.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xunmei.common.core.domain.letter.domain.CoreIntroduceLetter;
+import com.xunmei.common.core.domain.letter.domain.CoreIntroduceLetterOutInRequestUser;
+
+/**
+ * @Description: 类描述
+ * @Author: LuZhu
+ * @CreateDate: 2025/10/14 10:07
+ */
+public interface ICoreIntroduceLetterOutInRequestUserService extends IService<CoreIntroduceLetterOutInRequestUser> {
+}

+ 13 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/service/ICoreIntroduceLetterService.java

@@ -85,6 +85,8 @@ public interface ICoreIntroduceLetterService extends IService<CoreIntroduceLette
 
     TableDataInfo<CoreIntroduceLetterOutInRequestVo> selectApproveListPage(CoreIntroduceLetterApproveRequestDto requestDto);
 
+    TableDataInfo<CoreIntroduceLetterOutInRequestVo> selectOntInRequestListPage(CoreIntroduceLetterApproveRequestDto requestDto);
+
     List<CoreIntroduceLetterCheckLogVo> auditAllList(Long id);
 
     List<CoreIntroduceLetterApprovedPersonVo> getOutInApprovedPersonList(CoreIntroduceLetterApproveRequestDto requestDto);
@@ -109,6 +111,17 @@ public interface ICoreIntroduceLetterService extends IService<CoreIntroduceLette
     void insertOutInRequest(CoreIntroduceLetterAddOutInRequestDto coreIntroduceLetter);
 
     /**
+     * 取消出入申请
+     *
+     * @param
+     * @return 结果
+     */
+    void deleteOutInRequest(Long outInRequestId);
+
+    void updateOutInRequest(CoreIntroduceLetterUpdateOutInRequestDto OutInRequest);
+
+
+    /**
      * 查询介绍信
      *
      * @param id 介绍信主键

+ 21 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/service/impl/CoreIntroduceLetterOutInRequestUserImpl.java

@@ -0,0 +1,21 @@
+package com.xunmei.core.letter.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.domain.letter.domain.CoreIntroduceLetterOutInRequestUser;
+import com.xunmei.common.core.domain.letter.domain.CoreOutInRecord;
+import com.xunmei.core.letter.mapper.CoreIntroduceLetterOutInRequestUserMapper;
+import com.xunmei.core.letter.mapper.CoreOutInRecordMapper;
+import com.xunmei.core.letter.service.ICoreIntroduceLetterOutInRequestUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @ClassName CoreIntroduceLetterOutInRequestUserImpl
+ * @Description: 类描述
+ * @Author: LuZhu
+ * @CreateDate: 2025/10/14 10:08
+ */
+@Slf4j
+@Service
+public class CoreIntroduceLetterOutInRequestUserImpl extends ServiceImpl<CoreIntroduceLetterOutInRequestUserMapper, CoreIntroduceLetterOutInRequestUser> implements ICoreIntroduceLetterOutInRequestUserService {
+}

+ 207 - 31
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/service/impl/CoreIntroduceLetterServiceImpl.java

@@ -30,6 +30,7 @@ import com.xunmei.core.letter.mapper.CoreIntroduceLetterOutInRequestMapper;
 import com.xunmei.core.letter.mapper.CoreIntroduceLetterMapper;
 import com.xunmei.core.letter.mapper.CoreIntroduceLetterOutInRequestUserMapper;
 import com.xunmei.core.letter.mapper.CoreOutInRecordMapper;
+import com.xunmei.core.letter.service.ICoreIntroduceLetterOutInRequestUserService;
 import com.xunmei.core.letter.service.ICoreIntroduceLetterService;
 import com.xunmei.system.api.RemoteOrgService;
 import com.xunmei.system.api.RemoteRoleService;
@@ -66,6 +67,9 @@ public class CoreIntroduceLetterServiceImpl extends ServiceImpl<CoreIntroduceLet
     @Autowired
     private CoreIntroduceLetterOutInRequestUserMapper outInRequestUserMapper;
 
+    @Resource
+    ICoreIntroduceLetterOutInRequestUserService outInRequestUserService;
+
     @Autowired
     private RemoteRoleService roleService;
     @Autowired
@@ -86,18 +90,52 @@ public class CoreIntroduceLetterServiceImpl extends ServiceImpl<CoreIntroduceLet
 //        if (ObjectUtil.isNotNull(request.getRequestFromWeb()) && request.getRequestFromWeb() ) {
 //            request.setType(1);
 //        }
-            if (ObjectUtil.equal(request.getRequestFromWeb(), true)) {
+        // Web 端查詢
+        if (ObjectUtil.equal(request.getRequestFromWeb(), true)) {
             //获取数据
             page = coreIntroduceLetterMapper.selectPageList(page, request);
-        } else {
-            page = coreIntroduceLetterMapper.selectPageListForApp(page, request);
-        }
+            if (CollectionUtils.isNotEmpty(page.getRecords())) {
+                List<SysOrg> orgList = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.findAllOrg(SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
 
+                page = this.buildPageVo(page, orgList);
+            }
+        }
+        // APP 端查詢
+        else {
+            page = coreIntroduceLetterMapper.selectPageListForApp(page, request);
+            if(CollectionUtils.isNotEmpty(page.getRecords())){
+                List<Long> letterIds = page.getRecords().stream().map(CoreIntroduceLetterVo::getId).collect(Collectors.toList());
+                List<CoreIntroduceLetterUserVo> coreIntroduceLetterUserVos = coreIntroduceLetterMapper.selectLetterUsers(letterIds);
+
+                // 获取最近3条出入记录
+                List<CoreIntroduceLetterOutInRequestVo> coreIntroduceLetterOutInRequestVos = coreIntroduceLetterMapper.selectOutInRequestByLetterIds(page.getRecords().stream().map(CoreIntroduceLetterVo::getId).collect(Collectors.toList()), request.getOutInRequestStatus(),request.getOrgId());
+                if(CollectionUtils.isNotEmpty(coreIntroduceLetterOutInRequestVos)){
+                    coreIntroduceLetterOutInRequestVos.forEach(x-> {
+                        List<String> names = x.getUserInfos().stream().map(CoreIntroduceLetterOutInRequestUser::getUserName).filter(name -> name != null && !name.trim().isEmpty()).collect(Collectors.toList());
+                        if(names.size()>0)
+                        {
+                            if(names.size() ==x.getUserInfos().size())
+                            {
+                                x.setUserNames(names.stream().collect(Collectors.joining(",")));
+                            }
+                            else if  (names.size()>0 && names.size()<x.getUserInfos().size()){
+                                x.setUserNames(names.stream().collect(Collectors.joining(",")) + " 等"+x.getUserInfos().size()+"人");
+                            }
+                        }
+                        else
+                        {
+                            x.setUserNames("待登记后显示");
+                        }
+                    });
+                }
 
-        if (CollectionUtils.isNotEmpty(page.getRecords())) {
-            List<SysOrg> orgList = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.findAllOrg(SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
-            page = this.buildPageVo(page, orgList);
+                page.getRecords().forEach(x-> {
+                    x.setRecentOutInRequestRecords(coreIntroduceLetterOutInRequestVos.stream().filter(y -> ObjectUtil.equal(y.getLetterId(), x.getId())).collect(Collectors.toList()));
+                    x.setUserInfos(coreIntroduceLetterUserVos.stream().filter(y -> ObjectUtil.equal(y.getLetterId(), x.getId())).collect(Collectors.toList()));
+                });
+            }
         }
+
         //抓换为TableDataInfo适配前端
         return TableDataInfo.build(page);
 
@@ -131,6 +169,56 @@ public class CoreIntroduceLetterServiceImpl extends ServiceImpl<CoreIntroduceLet
     }
 
     @Override
+    public TableDataInfo<CoreIntroduceLetterOutInRequestVo> selectOntInRequestListPage(CoreIntroduceLetterApproveRequestDto requestDto) {
+
+        Page<CoreIntroduceLetterOutInRequestVo> page;
+        //分页
+        if (requestDto.getPageNum() != null && requestDto.getPageSize() != null) {
+            page = new Page<>(requestDto.getPageNum(), requestDto.getPageSize());
+        } else {
+            page = new Page<>();
+        }
+        //获取数据
+        page = coreIntroduceLetterMapper.selectOntInRequestListPage(page, requestDto);
+        if (CollectionUtils.isNotEmpty(page.getRecords())) {
+
+
+
+            //获取人员信息
+            final LambdaQueryWrapper<CoreIntroduceLetterOutInRequestUser> oqw = new LambdaQueryWrapper<CoreIntroduceLetterOutInRequestUser>();
+            oqw.in(CoreIntroduceLetterOutInRequestUser::getOutInRequestId, page.getRecords().stream().map(x->x.getId()).collect(Collectors.toList()));
+            List<CoreIntroduceLetterOutInRequestUser> userList =  outInRequestUserMapper.selectList(oqw);
+            Map<Long, List<CoreIntroduceLetterOutInRequestUser>> userListMap = userList.stream().collect(Collectors.groupingBy(CoreIntroduceLetterOutInRequestUser::getOutInRequestId));
+
+
+            page.getRecords().stream().forEach(vo -> {
+                vo.setLetterFile(ObjectUtil.isNotEmpty(vo.getLetterFileStr()) ? JSON.parseArray(vo.getLetterFileStr(), String.class) : null);
+                if (CollectionUtils.isNotEmpty(userListMap) && userListMap.containsKey(vo.getId())) {
+                    vo.setUserInfos(userListMap.get(vo.getId()));
+
+                    List<String> names = userListMap.get(vo.getId()).stream().map(CoreIntroduceLetterOutInRequestUser::getUserName).filter(name -> name != null && !name.trim().isEmpty()).collect(Collectors.toList());
+                    if(names.size()>0)
+                    {
+                        if(names.size() ==vo.getUserInfos().size())
+                        {
+                            vo.setUserNames(names.stream().collect(Collectors.joining(",")));
+                        }
+                        else if  (names.size()>0 && names.size()<vo.getUserInfos().size()){
+                            vo.setUserNames(names.stream().collect(Collectors.joining(",")) + " 等"+vo.getUserInfos().size()+"人");
+                        }
+                    }
+                    else
+                    {
+                        vo.setUserNames("待登记后显示");
+                    }
+                }
+            });
+        }
+        //抓换为TableDataInfo适配前端
+        return TableDataInfo.build(page);
+    }
+
+    @Override
     public List<CoreIntroduceLetterCheckLogVo> auditAllList(Long id) {
         return coreIntroduceLetterMapper.auditAllList(id);
     }
@@ -153,8 +241,18 @@ public class CoreIntroduceLetterServiceImpl extends ServiceImpl<CoreIntroduceLet
         outInRequest.setApproveTime(new Date());
         outInRequest.setApproveUser(SecurityUtils.getUsername());
         outInRequest.setApproveUserId(SecurityUtils.getUserId());
+        if(outInRequest.getApproveStatus() ==1)
+        {
+            outInRequest.setStatus(1);
+        }
+        else if(outInRequest.getApproveStatus() ==2)
+        {
+            outInRequest.setStatus(3);
+        }
         coreIntroduceLetterMapper.approveLetter(outInRequest);
-        coreOutInRecordMapper.updateCoreOutInRecordStatus(outInRequest.getApproveStatus(),outInRequest.getId());
+
+        // 出入记录表已废弃
+        //coreOutInRecordMapper.updateCoreOutInRecordStatus(outInRequest.getApproveStatus(),outInRequest.getId());
 
     }
 
@@ -303,7 +401,7 @@ public class CoreIntroduceLetterServiceImpl extends ServiceImpl<CoreIntroduceLet
         });
         //封装接待机构
         List<CoreIntroduceLetterToOrg> toOrgList = new ArrayList<>();
-        List<CoreIntroduceLetterOutInRequest> checkLogs = new ArrayList<>();
+//        List<CoreIntroduceLetterOutInRequest> checkLogs = new ArrayList<>();
         List<Long> orgIds = coreIntroduceLetter.getReceptionOrgIds();
         orgIds.forEach(r -> {
             CoreIntroduceLetterToOrg toOrg = new CoreIntroduceLetterToOrg();
@@ -311,18 +409,18 @@ public class CoreIntroduceLetterServiceImpl extends ServiceImpl<CoreIntroduceLet
             toOrg.setOrgId(r);
             toOrgList.add(toOrg);
 
-            CoreIntroduceLetterOutInRequest checkLog = new CoreIntroduceLetterOutInRequest();
-            checkLog.setId(IdWorker.getId());
-            checkLog.setOrgId(r);
-            checkLog.setLetterId(introduceLetter.getId());
-            checkLog.setApproveStatus(0);
-            checkLogs.add(checkLog);
+//            CoreIntroduceLetterOutInRequest checkLog = new CoreIntroduceLetterOutInRequest();
+//            checkLog.setId(IdWorker.getId());
+//            checkLog.setOrgId(r);
+//            checkLog.setLetterId(introduceLetter.getId());
+//            checkLog.setApproveStatus(0);
+//            checkLogs.add(checkLog);
         });
 
         objectMap.put("introduceLetter", introduceLetter);
         objectMap.put("userList", userList);
         objectMap.put("toOrgList", toOrgList);
-        objectMap.put("checkLogs", checkLogs);
+//        objectMap.put("checkLogs", checkLogs);
         return objectMap;
     }
 
@@ -518,7 +616,8 @@ public class CoreIntroduceLetterServiceImpl extends ServiceImpl<CoreIntroduceLet
         outInRequest.setEndTime(coreIntroduceLetterVo.getEndTime());
         outInRequest.setEffectiveDays(coreIntroduceLetterVo.getEffectiveDays());
 
-
+        outInRequest.setStatus(0);
+        outInRequest.setCheckSign(outInRequestDto.getCheckSign());
         outInRequest.setDeleted(0);
         outInRequest.setApproveStatus(0);
         outInRequest.setCreateTime(date);
@@ -528,7 +627,7 @@ public class CoreIntroduceLetterServiceImpl extends ServiceImpl<CoreIntroduceLet
         //封装人员信息
 //        List<CoreIntroduceLetterUserAddDto> userAddVoList = outInRequestDto.getUserInfos();
         List<CoreIntroduceLetterOutInRequestUser> outInRequestUserList = new ArrayList<>();
-        List<CoreOutInRecord> outInRecordList = new ArrayList<>();
+//        List<CoreOutInRecord> outInRecordList = new ArrayList<>();
         outInRequestDto.getUserInfos().forEach(r -> {
             CoreIntroduceLetterOutInRequestUser user = new CoreIntroduceLetterOutInRequestUser();
             final Optional<CoreIntroduceLetterUserAddDto> first = letterUserList.stream().filter(x -> ObjectUtil.equal(x.getId(), r.getId())).findFirst();
@@ -542,28 +641,105 @@ public class CoreIntroduceLetterServiceImpl extends ServiceImpl<CoreIntroduceLet
             }
 
             user.setId(IdWorker.getId());
+            // 用于回写人员信息到介绍信
+            user.setLetterUserId(r.getId());
             user.setOutInRequestId(outInRequest.getId());
             user.setCreateTime(date);
             user.setCreateBy(SecurityUtils.getUsername());
             outInRequestUserList.add(user);
 
-            CoreOutInRecord  coreOutInRecord=new CoreOutInRecord();
-            coreOutInRecord.setId(IdWorker.getId());
-            coreOutInRecord.setOutInRequestId(outInRequest.getId());
-            coreOutInRecord.setOutInRequestUserId(user.getId());
-            coreOutInRecord.setOrgId(SecurityUtils.getLoginUser().getOrgId());
-            coreOutInRecord.setStatus(0);
-            coreOutInRecord.setOutInRequestEffectiveStartTime(date);
-            coreOutInRecord.setOutInRequestEffectiveEndTime(DateUtil.endOfDay(date));
-            coreOutInRecord.setCreateTime(DateUtils.getNowDate());
-            coreOutInRecord.setCreateBy(SecurityUtils.getUsername());
-
-            outInRecordList.add(coreOutInRecord);
+//            CoreOutInRecord  coreOutInRecord=new CoreOutInRecord();
+//            coreOutInRecord.setId(IdWorker.getId());
+//            coreOutInRecord.setOutInRequestId(outInRequest.getId());
+//            coreOutInRecord.setOutInRequestUserId(user.getId());
+//            coreOutInRecord.setOrgId(SecurityUtils.getLoginUser().getOrgId());
+//            coreOutInRecord.setStatus(0);
+//            coreOutInRecord.setOutInRequestEffectiveStartTime(date);
+//            coreOutInRecord.setOutInRequestEffectiveEndTime(DateUtil.endOfDay(date));
+//            coreOutInRecord.setCreateTime(DateUtils.getNowDate());
+//            coreOutInRecord.setCreateBy(SecurityUtils.getUsername());
+
+//            outInRecordList.add(coreOutInRecord);
         });
 
         outInRequestMapper.insert(outInRequest);
         coreIntroduceLetterMapper.saveOutInRequestUserList(outInRequestUserList);
-        coreOutInRecordMapper.saveOutInRecordList(outInRecordList);
+//        coreOutInRecordMapper.saveOutInRecordList(outInRecordList);
+    }
+
+    @Override
+    public void deleteOutInRequest(Long outInRequestId) {
+        CoreIntroduceLetterOutInRequest outInRequest = outInRequestMapper.selectById(outInRequestId);
+        outInRequest.setDeleted(1);
+        outInRequestMapper.updateById(outInRequest);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateOutInRequest(CoreIntroduceLetterUpdateOutInRequestDto outInRequestDto) {
+        // 更新出入申请信息
+        CoreIntroduceLetterOutInRequest outInRequest = outInRequestMapper.selectById(outInRequestDto.getId());
+        if(outInRequest.getStatus()==2)
+        {
+            throw new RuntimeException("更新失败,当前出入记录已登记,请勿重复操作");
+        }
+
+        outInRequest.setLetterReasons(outInRequestDto.getLetterReasons());
+        outInRequest.setAccompanyingPerson(outInRequestDto.getAccompanyingPerson());
+        outInRequest.setRemark(outInRequestDto.getRemark());
+        outInRequest.setRemarkImage(outInRequestDto.getRemarkImage());
+        outInRequest.setUpdateTime(new Date());
+        outInRequest.setUpdateBy(SecurityUtils.getUsername());
+
+        if(outInRequestDto.getType()==2)
+        {
+            outInRequest.setStatus(2);
+        }
+
+        outInRequestMapper.updateById(outInRequest);
+
+        // 更新介绍信信息
+        CoreIntroduceLetter letter = coreIntroduceLetterMapper.selectById(outInRequestDto.getLetterId());
+        letter.setReasons(outInRequestDto.getLetterReasons());
+        coreIntroduceLetterMapper.updateById(letter);
+
+        // 更新人员信息
+        List<CoreIntroduceLetterOutInRequestUser> users = outInRequestUserService.listByIds(outInRequestDto.getUserInfos().stream().map(x -> x.getId()).collect(Collectors.toList()));
+//        List<CoreIntroduceLetterOutInRequestUser> outInRequestUserList = new ArrayList<>();
+        outInRequestDto.getUserInfos().forEach(r -> {
+            users.stream().filter(x -> ObjectUtil.equal(x.getId(), r.getId())).findFirst().ifPresent(x -> {
+                x.setUserName(r.getUserName());
+                x.setCompanyName(r.getCompanyName());
+                x.setIdType(r.getIdType());
+                x.setIdCard(r.getIdCard());
+                x.setArrivalTime(r.getArrivalTime());
+                x.setDepartureTime(r.getDepartureTime());
+            });
+        });
+        outInRequestUserService.updateBatchById(users);
+        // TODO 回写介绍信人员,回写历史人员库
+        if(outInRequestDto.getType()==2) {
+            //回写介绍信人员
+            List<CoreIntroduceLetterUserAddDto> fromLetterUserList = outInRequestDto.getUserInfos().stream().filter(x -> x.getLetterUserId() != null).collect(Collectors.toList());
+            CoreIntroduceLetterInfoVo coreIntroduceLetterVo = coreIntroduceLetterMapper.selectOneById(outInRequestDto.getLetterId());
+            List<CoreIntroduceLetterInfoVo> list = new ArrayList<>();
+            list.add(coreIntroduceLetterVo);
+            List<CoreIntroduceLetterUserAddDto> letterUserList = coreIntroduceLetterMapper.findUserList(list);
+
+            letterUserList.stream().forEach(l -> {
+                fromLetterUserList.stream().filter(x -> ObjectUtil.equal(x.getId(), l.getId())).findFirst().ifPresent(x -> {
+                    l.setUserName(x.getUserName());
+                    l.setCompanyName(x.getCompanyName());
+                    l.setIdType(x.getIdType());
+                    l.setIdCard(x.getIdCard());
+                });
+            });
+            coreIntroduceLetterMapper.batchUpdateLetterUserList(letterUserList);
+            //回写历史人员库
+
+
+
+        }
     }
 
     @Override

+ 159 - 23
soc-modules/soc-modules-core/src/main/resources/mapper/letter/CoreIntroduceLetterMapper.xml

@@ -74,34 +74,72 @@
         </if>
         order by a.create_time DESC
     </select>
-    <select id="selectPageListForApp"
-            resultType="com.xunmei.common.core.domain.letter.vo.CoreIntroduceLetterVo">
-        select * from (
+
+    <resultMap id="letterListForAppMap" type="com.xunmei.common.core.domain.letter.vo.CoreIntroduceLetterVo">
+        <id property="id" column="id"/>
+        <result property="startTime" column="start_time"/>
+        <result property="endTime" column="end_time"/>
+        <result property="letterFile" column="letter_file" typeHandler="com.xunmei.core.letter.mapper.ListToStringTypeHandler"/>
+        <result property="orgId" column="org_id"/>
+        <result property="orgPath" column="org_path"/>
+        <result property="orgName" column="org_name"/>
+        <result property="letterNo" column="letter_no"/>
+        <result property="reasons" column="reasons"/>
+        <result property="status" column="status"/>
+        <result property="type" column="type"/>
+        <result property="effectiveDays" column="effective_days"/>
+
+        <!-- 一对多:出入人员 -->
+        <collection property="userInfos" ofType="com.xunmei.common.core.domain.letter.vo.CoreIntroduceLetterUserVo">
+            <id property="id" column="userId"/>
+            <result property="userName" column="user_name"/>
+            <result property="companyName" column="company_name"/>
+            <result property="idCard" column="id_card"/>
+            <result property="idType" column="id_type"/>
+            <result property="imgFile" column="img_file"/>
+        </collection>
+    </resultMap>
+
+    <select id="selectPageListForApp" resultType="com.xunmei.common.core.domain.letter.vo.CoreIntroduceLetterVo">
         select
-        a.*,
-        group_concat(u.user_name) as letterUserNames
+            DISTINCT
+            a.*
         from core_introduce_letter a
         INNER JOIN core_introduce_letter_to_org o ON a.id =o.letter_id
         INNER JOIN core_introduce_letter_user u ON a.id = u.letter_id
+        LEFT JOIN core_introduce_letter_out_in_request r ON a.id = r.letter_id
         where a.deleted=0 ANd a.status!=0
-        <if test="coreIntroduceLetter.orgId != null ">
-            and o.org_id = #{coreIntroduceLetter.orgId}
-        </if>
-        <if test="coreIntroduceLetter.letterNo !=null  and coreIntroduceLetter.letterNo !=''">
-            and a.letter_no like concat('%', #{coreIntroduceLetter.letterNo}, '%')
-        </if>
-        <if test="coreIntroduceLetter.type !=null  and coreIntroduceLetter.type !=''">
-            and a.type = #{coreIntroduceLetter.type}
-        </if>
-        GROUP BY a.id
-        order by a.create_time DESC
-        ) as c
-        <where>
-            <if test="coreIntroduceLetter.keyWords !=null  and coreIntroduceLetter.reasons !=''">
-                and c.reasons like concat('%', #{coreIntroduceLetter.keyWords}, '%')
-                or c.letterUserNames like concat('%', #{coreIntroduceLetter.keyWords}, '%')
+            <if test="coreIntroduceLetter.orgId != null ">
+                and o.org_id = #{coreIntroduceLetter.orgId}
             </if>
-        </where>
+            <if test="coreIntroduceLetter.letterNo !=null  and coreIntroduceLetter.letterNo !=''">
+                and a.letter_no like concat('%', #{coreIntroduceLetter.letterNo}, '%')
+            </if>
+            <if test="coreIntroduceLetter.type !=null  and coreIntroduceLetter.type !=''">
+                and a.type = #{coreIntroduceLetter.type}
+            </if>
+            <if test="coreIntroduceLetter.status !=null">
+                and a.`status` = #{coreIntroduceLetter.status}
+            </if>
+            <if test="coreIntroduceLetter.outInRequestStatus !=null">
+                and r.`status` = #{coreIntroduceLetter.outInRequestStatus}
+            </if>
+            <if test="coreIntroduceLetter.keyWords !=null and coreIntroduceLetter.keyWords !=''">
+                and u.user_name like concat('%', #{coreIntroduceLetter.keyWords}, '%')
+            </if>
+        order by a.status , a.start_time DESC
+    </select>
+
+    <select id="selectLetterUsers" resultType="com.xunmei.common.core.domain.letter.vo.CoreIntroduceLetterUserVo">
+        select
+            u.*
+        from core_introduce_letter a
+        INNER JOIN core_introduce_letter_user u ON a.id = u.letter_id
+        where
+        a.id IN
+        <foreach collection="letterIds" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
     </select>
 
 
@@ -178,6 +216,18 @@
             (#{item.id},#{item.userName},#{item.companyName},#{item.idType},#{item.idCard},#{item.imgFile},#{item.letterId},#{item.createBy},#{item.createTime})
         </foreach>
     </insert>
+    <update id="batchUpdateLetterUserList" parameterType="java.util.List">
+        <foreach collection="userList" item="item" index="index" separator=";">
+            update core_introduce_letter_user
+            set user_name=#{item.userName},
+            company_name=#{item.companyName},
+            id_type=#{item.idType},
+            id_card=#{item.idCard}
+            where id=#{item.id}
+        </foreach>
+    </update>
+
+
     <insert id="saveToOrgList">
         insert into core_introduce_letter_to_org (letter_id,org_id) values
         <foreach collection="toOrgList" item="item" index="index"  separator="," >
@@ -258,7 +308,8 @@
              approve_time=#{coreIntroduceLetter.approveTime},
              approve_status=#{coreIntroduceLetter.approveStatus},
              approve_remark=#{coreIntroduceLetter.approveRemark},
-             approve_sign_img=#{coreIntroduceLetter.approveSignImg}
+             approve_sign_img=#{coreIntroduceLetter.approveSignImg},
+             status=#{coreIntroduceLetter.status}
          where id=#{coreIntroduceLetter.id}
     </update>
 
@@ -331,8 +382,43 @@
         <if test="coreIntroduceLetter.approveStatus !=null">
             and a.approve_status = #{coreIntroduceLetter.approveStatus}
         </if>
+        <if test="coreIntroduceLetter.approveStatus !=null">
+            and a.approve_status = #{coreIntroduceLetter.approveStatus}
+        </if>
         order by a.approve_status ASC,a.create_time DESC
     </select>
+
+    <select id="selectOntInRequestListPage"
+            resultType="com.xunmei.common.core.domain.letter.vo.CoreIntroduceLetterOutInRequestVo">
+        select
+        DISTINCT
+        a.*,
+        a.letter_file as letterFileStr
+        from core_introduce_letter_out_in_request a
+        Left JOIN core_introduce_letter_out_in_request_user u ON a.id = u.out_in_request_id
+        where a.deleted=0
+        <if test="coreIntroduceLetter.orgId !=null  and coreIntroduceLetter.orgId !=''">
+            and a.org_id = #{coreIntroduceLetter.orgId}
+        </if>
+        <if test="coreIntroduceLetter.reasons !=null  and coreIntroduceLetter.reasons !=''">
+            and a.letter_reasons like concat('%', #{coreIntroduceLetter.reasons}, '%')
+        </if>
+        <if test="coreIntroduceLetter.type !=null  and coreIntroduceLetter.type !=''">
+            and a.letter_type like concat('%', #{coreIntroduceLetter.type}, '%')
+        </if>
+        <if test="coreIntroduceLetter.outInRequestStatus !=null">
+            and a.status = #{coreIntroduceLetter.outInRequestStatus}
+        </if>
+        <if test="coreIntroduceLetter.createTimeRange !=null">
+            and a.create_time >= #{coreIntroduceLetter.createTimeRange[0]}
+            and a.create_time <![CDATA[<=]]> #{coreIntroduceLetter.createTimeRange[1]}
+        </if>
+        <if test="coreIntroduceLetter.keyWords !=null and coreIntroduceLetter.keyWords !=''">
+            and u.user_name like concat('%', #{coreIntroduceLetter.keyWords}, '%')
+        </if>
+        order by a.status ASC, a.create_time DESC
+    </select>
+
     <select id="findLetterApproveInfos"
             resultType="com.xunmei.common.core.domain.letter.vo.CoreIntroduceLetterOutInRequestVo">
         select
@@ -417,4 +503,54 @@
     <select id="selectOneOutInRequestById" resultType="com.xunmei.common.core.domain.letter.vo.CoreIntroduceLetterOutInRequestVo">
         select a.*,a.letter_file as letterFileStr from core_introduce_letter_out_in_request a where a.id =#{id}
     </select>
+
+    <resultMap id="OutInRequestResultMap" type="com.xunmei.common.core.domain.letter.vo.CoreIntroduceLetterOutInRequestVo">
+        <id property="id" column="id"/>
+        <result property="letterId" column="letter_id"/>
+        <result property="letterNo" column="letter_no"/>
+        <result property="letterType" column="letter_type"/>
+        <result property="startTime" column="start_time"/>
+        <result property="endTime" column="end_time"/>
+        <result property="status" column="status"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="approveTime" column="approve_time"/>
+        <!-- 一对多:collection 映射子表 -->
+        <collection property="userInfos" ofType="com.xunmei.common.core.domain.letter.domain.CoreIntroduceLetterOutInRequestUser">
+            <id property="id" column="userId"/>
+            <result property="userName" column="user_name"/>
+            <result property="companyName" column="company_name"/>
+            <result property="imgFile" column="userImgFile"/>
+        </collection>
+    </resultMap>
+
+    <select id="selectOutInRequestByLetterIds" resultMap="OutInRequestResultMap">
+        SELECT
+        s.*,
+        u.id AS userId,
+        u.user_name,
+        u.company_name,
+        u.img_file AS userImgFile
+        FROM(
+            SELECT r.*
+            FROM (
+                SELECT
+                r.*,
+                ROW_NUMBER() OVER (PARTITION BY r.letter_id ORDER BY r.create_time DESC) AS rn
+                FROM core_introduce_letter_out_in_request r
+                WHERE
+                    r.deleted = 0 AND
+                    r.org_id = #{orgId} AND
+                    r.letter_id IN
+                    <foreach collection="letterIds" item="id" open="(" separator="," close=")">
+                        #{id}
+                    </foreach>
+                    <if test="status !=null">
+                        AND r.status = #{status}
+                    </if>
+            ) r
+            WHERE r.rn <![CDATA[<=]]> 3
+        ) s INNER JOIN core_introduce_letter_out_in_request_user u ON s.id = u.out_in_request_id
+        ORDER BY r.create_time DESC;
+    </select>
 </mapper>