소스 검색

1. 历史人员库接口初始化
2. 出入申请request表数据迁移 : 按照record表都对应生成一份request
3. 已完成的出入申请的user表数据迁移

IO_linweisheng_s 2 주 전
부모
커밋
5c7612fed9

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

@@ -63,3 +63,321 @@ CREATE TABLE `core_introduce_letter_out_in_history_user` (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='机构出入过的历史人员表';
 
 DROP TABLE if exists `core_introduce_letter_check_log`;
+
+-- request表数据迁移
+delimiter $$
+CREATE PROCEDURE MigrateDataWithCursorTimeBatchOptimized()
+BEGIN
+    -- 变量声明(包含所有字段)
+    DECLARE done INT DEFAULT FALSE;
+
+    -- record表字段
+    DECLARE v_record_id BIGINT;
+    DECLARE v_old_request_id BIGINT;
+    DECLARE v_user_id BIGINT;
+    DECLARE v_arrival_time DATETIME;
+    DECLARE v_departure_time DATETIME;
+    DECLARE v_record_status INT;
+    DECLARE v_pdf_url VARCHAR(255);
+    DECLARE v_accompanying_person VARCHAR(255);
+    DECLARE v_submit_sign VARCHAR(255);
+    DECLARE v_remark VARCHAR(255);
+    DECLARE v_check_image VARCHAR(255);
+
+    -- request表字段
+    DECLARE v_req_letter_id BIGINT;
+    DECLARE v_req_approve_user VARCHAR(255);
+    DECLARE v_req_approve_user_id BIGINT;
+    DECLARE v_req_approve_time DATETIME;
+    DECLARE v_req_approve_status INT;
+    DECLARE v_req_approve_remark VARCHAR(255);
+    DECLARE v_req_approve_sign_img VARCHAR(255);
+    DECLARE v_req_org_id BIGINT;
+    DECLARE v_req_letter_name VARCHAR(255);
+    DECLARE v_req_letter_file TEXT;
+    DECLARE v_req_letter_no VARCHAR(20);
+    DECLARE v_req_letter_description VARCHAR(500);
+    DECLARE v_req_letter_reasons VARCHAR(100);
+    DECLARE v_req_letter_type INT;
+    DECLARE v_req_deleted INT;
+    DECLARE v_req_start_time DATETIME;
+    DECLARE v_req_end_time DATETIME;
+    DECLARE v_req_create_by VARCHAR(50);
+    DECLARE v_req_create_time DATETIME;
+    DECLARE v_req_update_by VARCHAR(50);
+    DECLARE v_req_update_time DATETIME;
+    DECLARE v_req_effective_days INT;
+
+    -- 其他变量
+    DECLARE v_final_deleted INT; -- 最终要插入的deleted值
+    DECLARE v_new_request_id BIGINT;
+    declare v_calculated_new_id bigint;
+    DECLARE v_start_time DATETIME;
+    DECLARE v_end_time DATETIME;
+    DECLARE v_current_time DATETIME;
+    DECLARE v_next_time DATETIME;
+    DECLARE v_batch_count INT DEFAULT 0;
+    DECLARE v_total_processed INT DEFAULT 0;
+    DECLARE v_batch_start_time DATETIME;
+    DECLARE v_batch_duration INT;
+
+    -- 创建临时表用于批量更新
+    CREATE TEMPORARY TABLE temp_record_updates (
+                                                   record_id BIGINT PRIMARY KEY,
+                                                   new_request_id BIGINT
+    );
+
+    CREATE TEMPORARY TABLE temp_user_updates (
+                                                 user_id BIGINT PRIMARY KEY,
+                                                 new_request_id bigint,
+                                                 arrival_time DATETIME,
+                                                 departure_time DATETIME
+    );
+    -- 添加全局计数器
+    SET @global_row_number = 0;
+    -- 获取时间范围和最大ID
+    SELECT MIN(create_time), MAX(create_time) INTO v_start_time, v_end_time
+    FROM core_out_in_record;
+
+    SET @max_request_id = (SELECT COALESCE(MAX(id), 0) FROM core_introduce_letter_out_in_request);
+
+    SET v_current_time = v_start_time;
+
+    -- 按月分批处理
+    WHILE v_current_time <= v_end_time DO
+
+            SET v_next_time = DATE_ADD(v_current_time, INTERVAL 1 MONTH);
+            SET v_batch_count = v_batch_count + 1;
+            SET v_batch_start_time = NOW();
+
+            #         SELECT CONCAT('处理批次 ', v_batch_count, ': ', DATE_FORMAT(v_current_time, '%Y-%m')) as 批次开始;
+
+            -- 开始事务
+            START TRANSACTION;
+
+            BEGIN
+                -- 优化后的游标:一次性JOIN获取所有数据
+                DECLARE cur_records CURSOR FOR
+                    SELECT a.id,
+                           a.out_in_request_id,
+                           a.out_in_request_user_id,
+                           a.arrival_time,
+                           a.departure_time,
+                           a.status,
+                           a.pdf_url,
+                           a.accompanying_person,
+                           a.submit_sign,
+                           a.remark,
+                           a.check_image,
+                           b.letter_id,
+                           b.approve_user,
+                           b.approve_user_id,
+                           b.approve_time,
+                           b.approve_status,
+                           b.approve_remark,
+                           b.approve_sign_img,
+                           b.org_id,
+                           b.letter_name,
+                           b.letter_file,
+                           b.letter_no,
+                           b.letter_description,
+                           b.letter_reasons,
+                           b.letter_type,
+                           b.deleted,
+                           b.start_time,
+                           b.end_time,
+                           b.create_by,
+                           b.create_time,
+                           b.update_by,
+                           b.update_time,
+                           b.effective_days
+#                        (@max_request_id + ROW_NUMBER() over (order by a.id)) as calculated_new_id
+                    FROM core_out_in_record a
+                             INNER JOIN core_introduce_letter_out_in_request b ON a.out_in_request_id = b.id
+                    WHERE a.create_time >= v_current_time
+                      AND a.create_time < v_next_time
+                    ORDER BY a.id;
+
+                DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
+
+                OPEN cur_records;
+                read_loop: LOOP
+                    FETCH cur_records INTO
+                        v_record_id, v_old_request_id, v_user_id, v_arrival_time,
+                        v_departure_time, v_record_status, v_pdf_url,
+                        v_accompanying_person, v_submit_sign, v_remark, v_check_image,
+                        v_req_letter_id, v_req_approve_user, v_req_approve_user_id, v_req_approve_time,
+                        v_req_approve_status, v_req_approve_remark, v_req_approve_sign_img, v_req_org_id,
+                        v_req_letter_name, v_req_letter_file, v_req_letter_no, v_req_letter_description,
+                        v_req_letter_reasons, v_req_letter_type, v_req_deleted, v_req_start_time, v_req_end_time,
+                        v_req_create_by, v_req_create_time, v_req_update_by, v_req_update_time, v_req_effective_days;
+
+                    IF done THEN LEAVE read_loop; END IF;
+
+                    -- 生成新ID并插入
+#                 SET v_new_request_id = v_new_request_id + 1;
+                    SET @global_row_number = @global_row_number + 1;
+                    SET v_calculated_new_id = @max_request_id + @global_row_number;
+
+                    -- 根据状态设置deleted字段
+                    SET v_final_deleted = CASE
+                        -- 已过期-1 : 过去当天申请,但是没有审批,过去的当天作废 → 已删除
+                                              WHEN v_req_approve_status = 3 AND v_record_status = 3 THEN 1
+                        -- 已过期-2 : 过去当天审批通过了,但是没有填写结果 → 已删除
+                                              WHEN v_req_approve_status = 1 AND v_record_status = 3 AND v_arrival_time IS NULL THEN 1
+                        -- 已过期-3 : 审批通过,当天记录没有闭环 → 已删除
+                                              WHEN v_req_approve_status = 1 AND v_record_status = 3 AND v_arrival_time IS NOT NULL THEN 1
+                        -- 待登记-3 : 当天提交,当天审批通过的记录 → 已删除
+                                              WHEN v_req_approve_status = 1 AND v_record_status = 1 AND v_arrival_time IS NULL AND v_departure_time IS NULL THEN 1
+                        -- 待登记-1 : 历史待登记 : 已经完成进入时间填写的申请记录 → 已删除
+                                              WHEN v_req_approve_status = 1 AND v_record_status = 1 AND v_arrival_time IS NOT NULL AND v_departure_time IS NULL THEN 1
+                        -- 待登记-2 : 离开时间和PDF是否有生成 为已完成等价条件 → 已删除
+                                              WHEN v_req_approve_status = 1 AND v_record_status = 1 AND v_arrival_time IS NOT NULL AND v_pdf_url IS NULL THEN 1
+                        -- 其他状态使用原表的deleted值
+                                              ELSE v_req_deleted
+                        END;
+
+                    -- 插入新request记录(使用游标中获取的字段,无需重复查询)
+                    INSERT INTO core_introduce_letter_out_in_request_translate (id, letter_id, approve_user, approve_user_id,
+                                                                                approve_time, approve_status, approve_remark, approve_sign_img,
+                                                                                org_id, letter_name, letter_file, letter_no, letter_description,
+                                                                                letter_reasons, letter_type, deleted, start_time, end_time,
+                                                                                create_by, create_time, update_by, update_time, effective_days,
+                                                                                status, accompanying_person, check_sign, remark, remark_image)
+                    VALUES (v_calculated_new_id, v_req_letter_id, v_req_approve_user, v_req_approve_user_id, v_req_approve_time,
+                            v_req_approve_status, v_req_approve_remark, v_req_approve_sign_img, v_req_org_id,
+                            v_req_letter_name, v_req_letter_file, v_req_letter_no, v_req_letter_description,
+                            v_req_letter_reasons, v_req_letter_type, v_final_deleted, v_req_start_time, v_req_end_time,
+                            v_req_create_by, v_req_create_time, v_req_update_by, v_req_update_time, v_req_effective_days,
+                               -- 状态映射
+                            case
+                                -- 已完成2: #流程已闭环但是没有生成登记簿
+                                when v_req_approve_status = 1 and v_record_status = 1 and v_pdf_url is null and v_departure_time is not null then 5
+                                -- 已完成1: 审批通过,有生成PDF 或者 有填写离开时间
+                                WHEN (v_record_status = 1 and v_pdf_url is not null) or (v_record_status = 1 and v_departure_time is not null) THEN 2
+
+                                -- 已过期-1 : 过去当天申请,但是没有审批,过去的当天作废 → 待审批
+                                WHEN v_req_approve_status = 3 AND v_record_status = 3 THEN 0
+                                -- 已过期-2 : 过去当天审批通过了, 但是没有填写结果,有可能已经发生事实,没有走流程,也有可能是人没来的过期,迁移到代办-待登记后 自行选择 删除 还是 补全 已过期2-> 已过期
+                                WHEN v_req_approve_status = 1 AND v_record_status = 3 AND v_arrival_time IS NULL THEN 4
+                                -- 已过期-3 : 造成原因 : 这是以前为改版前,审批通过,当天记录如果没有闭环的话就把它弄过期,目前来看没有,已过期3 -> 已补登你撤回了一条消息重新编辑剑雄15:52WHEN v_req_approve_status = 1 AND v_record_status = 3 AND v_arrival_time IS NOT NULL THEN 5
+                                -- 待登记-3 : 造成原因 : 当天提交,当天审批通过的记录 处理方式 : 上线前的当天记录如果没有完成离开时间的填写或者进入时间的填写,则转移到 已过期,代办处理 待登记-3 -> 待登记
+                                when v_req_approve_status = 1 and v_record_status = 1 and v_arrival_time is null and v_departure_time is null then 1
+                                -- 待登记-1 : 造成原因 : 历史待登记 : 已经完成进入时间填写的申请记录,记录的存活时间是无限期 待登记-1 -> 待登记
+                                WHEN v_req_approve_status = 1 AND v_record_status = 1 AND v_arrival_time IS NOT NULL AND v_departure_time IS NULL THEN 1
+                                -- 待登记-2 : 造成原因 : 离开时间和PDF是否有生成 为已完成等价条件,等价为历史待登记 属于特殊需要操作的记录 9条  处理方式 : 已处理归并到正常状态中;
+                                WHEN v_req_approve_status = 1 AND v_record_status = 1 AND v_arrival_time IS NOT NULL AND v_pdf_url IS NULL THEN 5
+
+                                -- 已拒绝
+                                WHEN v_req_approve_status = 2 AND v_record_status = 2 THEN 3
+                                -- 待审批
+                                WHEN v_req_approve_status = 0 AND v_record_status = 0 THEN 0
+
+                                ELSE 5
+                                END,
+                            v_accompanying_person,  -- 直接使用游标变量
+                            v_submit_sign,          -- 直接使用游标变量
+                            v_remark,               -- 直接使用游标变量
+                            v_check_image);         -- 直接使用游标变量
+
+
+                    -- 收集更新数据到临时表(而不是立即更新)
+                    INSERT INTO temp_record_updates (record_id, new_request_id)
+                    VALUES (v_record_id, v_calculated_new_id)
+                    ON DUPLICATE KEY UPDATE new_request_id = VALUES(new_request_id);
+
+                    INSERT INTO temp_user_updates (user_id, new_request_id, arrival_time, departure_time)
+                    VALUES (v_user_id, v_calculated_new_id, v_arrival_time, v_departure_time)
+                    ON DUPLICATE KEY UPDATE new_request_id = VALUES(new_request_id),
+                                            arrival_time   = VALUES(arrival_time),
+                                            departure_time = VALUES(departure_time);
+
+                    SET v_total_processed = v_total_processed + 1;
+
+                END LOOP;
+
+                CLOSE cur_records;
+                SET done = FALSE;
+
+            END;
+            -- 批量更新record表
+            UPDATE core_out_in_record rec
+                INNER JOIN temp_record_updates tmp ON rec.id = tmp.record_id
+            SET rec.out_in_request_id = tmp.new_request_id;
+
+            -- 批量更新user表
+            UPDATE core_introduce_letter_out_in_request_user user_tbl
+                INNER JOIN temp_user_updates tmp ON user_tbl.id = tmp.user_id
+            SET user_tbl.arrival_time = tmp.arrival_time,
+                user_tbl.departure_time = tmp.departure_time,
+                user_tbl.out_in_request_id = tmp.new_request_id;
+
+
+            -- 提交事务
+            COMMIT;
+
+            -- 清空临时表
+            TRUNCATE TABLE temp_record_updates;
+            TRUNCATE TABLE temp_user_updates;
+
+            -- 输出进度
+            SET v_batch_duration = TIMESTAMPDIFF(SECOND, v_batch_start_time, NOW());
+#         SELECT CONCAT('批次 ', v_batch_count, ' 完成: 耗时 ', v_batch_duration, ' 秒') as 批次完成;
+
+            SET v_current_time = v_next_time;
+
+        END WHILE;
+
+    -- 清理和输出结果
+    DROP TEMPORARY TABLE temp_record_updates;
+    DROP TEMPORARY TABLE temp_user_updates;
+
+#     SELECT CONCAT('迁移完成!共处理 ', v_total_processed, ' 条记录') as 执行结果;
+
+END$$
+delimiter ;
+
+call MigrateDataWithCursorTimeBatchOptimized();
+
+-- 已完成的人员数据迁移
+START TRANSACTION; -- 开启事务:确保迁移要么全成功,要么全回滚(安全兜底)
+INSERT INTO core_introduce_letter_out_in_history_user (id, -- 复用源表reu.id(新表无数据,无冲突)
+                                                       org_id, -- 接待机构ID(来自core_out_in_record)
+                                                       user_name, -- 人员姓名
+                                                       company_name, -- 所属公司
+                                                       id_type, -- 证件类型
+                                                       id_card, -- 证件号码
+                                                       img_file, -- 图片文件路径
+                                                       out_in_request_id, -- 关联的出入请求ID(来自core_out_in_record)
+                                                       create_by, -- 创建人
+                                                       create_time, -- 创建时间
+                                                       update_by, -- 修改人(默认用创建人填充)
+                                                       update_time -- 修改时间(默认用创建时间填充)
+)
+select reu.id,
+       rec.org_id,
+       reu.user_name,
+       reu.company_name,
+       reu.id_type,
+       reu.id_card,
+       reu.img_file,
+       rec.out_in_request_id,
+       reu.create_by,
+       reu.create_time,
+       reu.create_by,  -- update_by 用 create_by 填充
+       reu.create_time -- update_time 用 create_time 填充
+from core_introduce_letter_out_in_request_user reu
+         inner join core_out_in_record rec on rec.out_in_request_user_id = reu.id
+where reu.id in (select a.out_in_request_user_id
+                 from core_out_in_record a
+                          inner join core_introduce_letter_out_in_request b on a.out_in_request_id = b.id
+                 where (a.status = 1 and a.pdf_url is not null)
+                    or (a.status = 1 and a.departure_time is not null));
+
+-- 验证迁移结果:查看成功迁移了多少条数据
+SELECT '新表迁移统计' AS 统计项,
+       ROW_COUNT()    AS 迁移成功条数;
+-- ROW_COUNT() 会返回上一步INSERT的行数(即迁移条数)
+
+-- 确认数据无误后,提交事务(若发现数据不对,执行 ROLLBACK; 回滚)
+COMMIT;

+ 52 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/domain/CoreIntroduceLetterOutInHistoryUser.java

@@ -0,0 +1,52 @@
+package com.xunmei.common.core.domain.letter.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.xunmei.common.core.web.domain.BaseEntity;
+
+/**
+ * 机构出入过的历史人员对象 core_introduce_letter_out_in_history_user
+ *
+ * @author xunmei
+ * @date 2025-09-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("core_introduce_letter_out_in_history_user")
+@ApiModel(value = "CoreIntroduceLetterOutInHistoryUser对象", description = "机构出入过的历史人员")
+public class CoreIntroduceLetterOutInHistoryUser extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    @ApiModelProperty(value = "接待机构")
+    private Long orgId;
+
+    @ApiModelProperty(value = "人员名称")
+    private String userName;
+
+    @ApiModelProperty(value = "申请单位")
+    private String companyName;
+
+    @ApiModelProperty(value = "证件类型")
+    private Long idType;
+
+    @ApiModelProperty(value = "证件号码")
+    private String idCard;
+
+    @ApiModelProperty(value = "证件图片")
+    private String imgFile;
+
+    @ApiModelProperty(value = "出入记录id")
+    private Long outInRequestId;
+
+}

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

@@ -0,0 +1,49 @@
+package com.xunmei.common.core.domain.letter.dto;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xunmei.common.core.web.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 机构出入过的历史人员对象 core_introduce_letter_out_in_history_user
+ *
+ * @author xunmei
+ * @date 2025-09-18
+ */
+@Data
+public class CoreIntroduceLetterOutInHistoryUserDto extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    @ApiModelProperty(value = "接待机构")
+    private Long orgId;
+
+    @ApiModelProperty(value = "人员名称")
+    private String userName;
+
+    @ApiModelProperty(value = "申请单位")
+    private String companyName;
+
+    @ApiModelProperty(value = "证件类型")
+    private Long idType;
+
+    @ApiModelProperty(value = "证件号码")
+    private String idCard;
+
+    @ApiModelProperty(value = "证件图片")
+    private String imgFile;
+
+    @ApiModelProperty(value = "出入记录id")
+    private Long outInRequestId;
+
+    @ApiModelProperty(value = "APP端查询关键字")
+    private String keyWords;
+
+}

+ 104 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/controller/CoreIntroduceLetterOutInHistoryUserController.java

@@ -0,0 +1,104 @@
+package com.xunmei.core.letter.controller;
+
+import com.xunmei.common.core.domain.letter.domain.CoreIntroduceLetterOutInHistoryUser;
+import com.xunmei.common.core.domain.letter.dto.CoreIntroduceLetterOutInHistoryUserDto;
+import com.xunmei.common.core.web.controller.BaseController;
+import com.xunmei.common.core.web.domain.AjaxResult;
+import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.common.log.annotation.Log;
+import com.xunmei.common.log.enums.BusinessType;
+import com.xunmei.common.security.annotation.RequiresPermissions;
+import com.xunmei.core.letter.service.ICoreIntroduceLetterOutInHistoryUserService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 机构出入过的历史人员Controller
+ *
+ * @author xunmei
+ * @date 2025-09-18
+ */
+@Api(tags = {"CoreIntroduceLetterOutInHistoryUser", "机构出入过的历史人员"})
+@RestController
+@RequestMapping("/outInHistoryUser")
+public class CoreIntroduceLetterOutInHistoryUserController extends BaseController {
+    @Autowired
+    private ICoreIntroduceLetterOutInHistoryUserService coreIntroduceLetterOutInHistoryUserService;
+
+/**
+ * 查询机构出入过的历史人员列表
+ */
+@ApiOperation(value = "查询CoreIntroduceLetterOutInHistoryUser列表")
+//@RequiresPermissions("letter:outInHistoryUser:list")
+@GetMapping("/list")
+    public TableDataInfo<CoreIntroduceLetterOutInHistoryUser> list(CoreIntroduceLetterOutInHistoryUserDto coreIntroduceLetterOutInHistoryUser) {
+
+        return coreIntroduceLetterOutInHistoryUserService.selectPage(coreIntroduceLetterOutInHistoryUser);
+    }
+
+    /**
+     * 获取机构出入过的历史人员详细信息
+     */
+    @ApiOperation(value = "获取CoreIntroduceLetterOutInHistoryUser详细信息")
+//    @RequiresPermissions("letter:outInHistoryUser:query")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
+        return success(coreIntroduceLetterOutInHistoryUserService.selectCoreIntroduceLetterOutInHistoryUserById(id));
+    }
+
+    /**
+     * 新增机构出入过的历史人员
+     */
+    @ApiOperation(value = "新增CoreIntroduceLetterOutInHistoryUser")
+//    @RequiresPermissions("letter:outInHistoryUser:add")
+    @Log(title = "机构出入过的历史人员", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody CoreIntroduceLetterOutInHistoryUser coreIntroduceLetterOutInHistoryUser) {
+        return toAjax(coreIntroduceLetterOutInHistoryUserService.insertCoreIntroduceLetterOutInHistoryUser(coreIntroduceLetterOutInHistoryUser));
+    }
+
+    /**
+     * 修改机构出入过的历史人员
+     */
+    @ApiOperation(value = "修改CoreIntroduceLetterOutInHistoryUser")
+//    @RequiresPermissions("letter:outInHistoryUser:edit")
+    @Log(title = "机构出入过的历史人员", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody CoreIntroduceLetterOutInHistoryUser coreIntroduceLetterOutInHistoryUser) {
+        return toAjax(coreIntroduceLetterOutInHistoryUserService.updateCoreIntroduceLetterOutInHistoryUser(coreIntroduceLetterOutInHistoryUser));
+    }
+
+//    /**
+//     * 删除机构出入过的历史人员
+//     */
+//    @ApiOperation(value = "删除CoreIntroduceLetterOutInHistoryUser")
+//    @RequiresPermissions("letter:outInHistoryUser:remove")
+//    @Log(title = "机构出入过的历史人员", businessType = BusinessType.DELETE)
+//    @DeleteMapping("/{ids}")
+//    public AjaxResult remove(@PathVariable Long[] ids) {
+//        return toAjax(coreIntroduceLetterOutInHistoryUserService.deleteCoreIntroduceLetterOutInHistoryUserByIds(ids));
+//    }
+
+    /**
+     * 删除机构出入过的历史人员
+     */
+    @ApiOperation(value = "删除CoreIntroduceLetterOutInHistoryUser")
+//    @RequiresPermissions("letter:outInHistoryUser:remove")
+    @Log(title = "机构出入过的历史人员", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{id}")
+    public AjaxResult remove(@PathVariable Long id) {
+        return toAjax(coreIntroduceLetterOutInHistoryUserService.deleteCoreIntroduceLetterOutInHistoryUserById(id));
+    }
+
+
+    /**
+     * 提交时入库
+     */
+    @ApiOperation(value = "校验登记提交入库")
+    @PostMapping(value = "/inboundOutInHistory")
+    public AjaxResult inboundOutInHistory(@RequestBody  CoreIntroduceLetterOutInHistoryUser dto) {
+        return toAjax(coreIntroduceLetterOutInHistoryUserService.inboundOutInHistory(dto));
+    }
+}

+ 61 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/mapper/CoreIntroduceLetterOutInHistoryUserMapper.java

@@ -0,0 +1,61 @@
+package com.xunmei.core.letter.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunmei.common.core.domain.letter.domain.CoreIntroduceLetterOutInHistoryUser;
+import java.util.List;
+
+/**
+ * 机构出入过的历史人员Mapper接口
+ *
+ * @author xunmei
+ * @date 2025-09-18
+ */
+public interface CoreIntroduceLetterOutInHistoryUserMapper extends BaseMapper<CoreIntroduceLetterOutInHistoryUser> {
+    /**
+     * 查询机构出入过的历史人员
+     *
+     * @param id 机构出入过的历史人员主键
+     * @return 机构出入过的历史人员
+     */
+    CoreIntroduceLetterOutInHistoryUser selectCoreIntroduceLetterOutInHistoryUserById(Long id);
+
+    /**
+     * 查询机构出入过的历史人员列表
+     *
+     * @param coreIntroduceLetterOutInHistoryUser 机构出入过的历史人员
+     * @return 机构出入过的历史人员集合
+     */
+    List<CoreIntroduceLetterOutInHistoryUser> selectCoreIntroduceLetterOutInHistoryUserList(CoreIntroduceLetterOutInHistoryUser coreIntroduceLetterOutInHistoryUser);
+
+    /**
+     * 新增机构出入过的历史人员
+     *
+     * @param coreIntroduceLetterOutInHistoryUser 机构出入过的历史人员
+     * @return 结果
+     */
+    int insertCoreIntroduceLetterOutInHistoryUser(CoreIntroduceLetterOutInHistoryUser coreIntroduceLetterOutInHistoryUser);
+
+    /**
+     * 修改机构出入过的历史人员
+     *
+     * @param coreIntroduceLetterOutInHistoryUser 机构出入过的历史人员
+     * @return 结果
+     */
+    int updateCoreIntroduceLetterOutInHistoryUser(CoreIntroduceLetterOutInHistoryUser coreIntroduceLetterOutInHistoryUser);
+
+    /**
+     * 删除机构出入过的历史人员
+     *
+     * @param id 机构出入过的历史人员主键
+     * @return 结果
+     */
+    int deleteCoreIntroduceLetterOutInHistoryUserById(Long id);
+
+    /**
+     * 批量删除机构出入过的历史人员
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteCoreIntroduceLetterOutInHistoryUserByIds(Long[] ids);
+}

+ 80 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/service/ICoreIntroduceLetterOutInHistoryUserService.java

@@ -0,0 +1,80 @@
+package com.xunmei.core.letter.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.xunmei.common.core.domain.letter.domain.CoreIntroduceLetterOutInHistoryUser;
+import com.xunmei.common.core.domain.letter.dto.CoreIntroduceLetterOutInHistoryUserDto;
+import com.xunmei.common.core.web.page.TableDataInfo;
+
+import java.util.List;
+
+
+
+/**
+ * 机构出入过的历史人员Service接口
+ *
+ * @author xunmei
+ * @date 2025-09-18
+ */
+public interface ICoreIntroduceLetterOutInHistoryUserService extends IService<CoreIntroduceLetterOutInHistoryUser> {
+    /**
+     * 查询机构出入过的历史人员
+     *
+     * @param id 机构出入过的历史人员主键
+     * @return 机构出入过的历史人员
+     */
+     CoreIntroduceLetterOutInHistoryUser selectCoreIntroduceLetterOutInHistoryUserById(Long id);
+
+    /**
+     * 查询机构出入过的历史人员列表
+     *
+     * @param coreIntroduceLetterOutInHistoryUser 机构出入过的历史人员
+     * @return 机构出入过的历史人员集合
+     */
+    List<CoreIntroduceLetterOutInHistoryUser> selectCoreIntroduceLetterOutInHistoryUserList(CoreIntroduceLetterOutInHistoryUser coreIntroduceLetterOutInHistoryUser);
+
+    /**
+     * 新增机构出入过的历史人员
+     *
+     * @param coreIntroduceLetterOutInHistoryUser 机构出入过的历史人员
+     * @return 结果
+     */
+    int insertCoreIntroduceLetterOutInHistoryUser(CoreIntroduceLetterOutInHistoryUser coreIntroduceLetterOutInHistoryUser);
+
+    /**
+     * 修改机构出入过的历史人员
+     *
+     * @param coreIntroduceLetterOutInHistoryUser 机构出入过的历史人员
+     * @return 结果
+     */
+    int updateCoreIntroduceLetterOutInHistoryUser(CoreIntroduceLetterOutInHistoryUser coreIntroduceLetterOutInHistoryUser);
+
+    /**
+     * 批量删除机构出入过的历史人员
+     *
+     * @param ids 需要删除的机构出入过的历史人员主键集合
+     * @return 结果
+     */
+    int deleteCoreIntroduceLetterOutInHistoryUserByIds(Long[] ids);
+
+    /**
+     * 删除机构出入过的历史人员信息
+     *
+     * @param id 机构出入过的历史人员主键
+     * @return 结果
+     */
+    int deleteCoreIntroduceLetterOutInHistoryUserById(Long id);
+
+    /**
+     * 查询机构出入过的历史人员分页数据
+     *
+     * @param coreIntroduceLetterOutInHistoryUser 查询条件对象
+     * @return Page
+     */
+    TableDataInfo<CoreIntroduceLetterOutInHistoryUser> selectPage(CoreIntroduceLetterOutInHistoryUserDto coreIntroduceLetterOutInHistoryUser);
+
+    /**
+     * 核验登记提交后入库
+     */
+
+    int inboundOutInHistory (CoreIntroduceLetterOutInHistoryUser coreIntroduceLetterOutInHistoryUser);
+}

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

@@ -0,0 +1,181 @@
+package com.xunmei.core.letter.service.impl;
+
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.domain.letter.domain.CoreIntroduceLetterOutInHistoryUser;
+import com.xunmei.common.core.domain.letter.dto.CoreIntroduceLetterOutInHistoryUserDto;
+import com.xunmei.common.core.utils.DateUtils;
+import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.common.security.utils.SecurityUtils;
+import com.xunmei.core.letter.mapper.CoreIntroduceLetterOutInHistoryUserMapper;
+import com.xunmei.core.letter.service.ICoreIntroduceLetterOutInHistoryUserService;
+import com.xunmei.system.api.RemoteUserService;
+import com.xunmei.system.api.model.LoginUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 机构出入过的历史人员Service业务层处理
+ *
+ * @author xunmei
+ * @date 2025-09-18
+ */
+@Service
+public class CoreIntroduceLetterOutInHistoryUserServiceImpl extends ServiceImpl<CoreIntroduceLetterOutInHistoryUserMapper, CoreIntroduceLetterOutInHistoryUser> implements ICoreIntroduceLetterOutInHistoryUserService {
+    @Autowired
+    private CoreIntroduceLetterOutInHistoryUserMapper coreIntroduceLetterOutInHistoryUserMapper;
+    @Autowired
+    private RemoteUserService userService;
+
+    @Override
+    public TableDataInfo<CoreIntroduceLetterOutInHistoryUser> selectPage(CoreIntroduceLetterOutInHistoryUserDto request) {
+        //未删除
+        Page<CoreIntroduceLetterOutInHistoryUser> page;
+        //分页
+        if (request.getPageNum() != null && request.getPageSize() != null) {
+            page = new Page<>(request.getPageNum(), request.getPageSize());
+        } else {
+            page = new Page<>();
+        }
+
+        LambdaQueryWrapper<CoreIntroduceLetterOutInHistoryUser> lqw = new LambdaQueryWrapper<>();
+        lqw.eq(CoreIntroduceLetterOutInHistoryUser::getOrgId, request.getOrgId())
+                .and(qw -> {
+                    qw.like(ObjectUtil.isNotEmpty(request.getKeyWords()), CoreIntroduceLetterOutInHistoryUser::getIdCard, request.getKeyWords())
+                            .or()
+                            .like(ObjectUtil.isNotEmpty(request.getKeyWords()), CoreIntroduceLetterOutInHistoryUser::getUserName, request.getKeyWords());
+                });
+
+        page = coreIntroduceLetterOutInHistoryUserMapper.selectPage(page, lqw);
+
+
+        //抓换为TableDataInfo适配前端
+        return TableDataInfo.build(page);
+
+
+    }
+
+
+    /**
+     * 查询机构出入过的历史人员
+     *
+     * @param id 机构出入过的历史人员主键
+     * @return 机构出入过的历史人员
+     */
+    @Override
+    public CoreIntroduceLetterOutInHistoryUser selectCoreIntroduceLetterOutInHistoryUserById(Long id) {
+        return coreIntroduceLetterOutInHistoryUserMapper.selectById(id);
+    }
+
+    /**
+     * 查询机构出入过的历史人员列表
+     *
+     * @param coreIntroduceLetterOutInHistoryUser 机构出入过的历史人员
+     * @return 机构出入过的历史人员
+     */
+    @Override
+    public List<CoreIntroduceLetterOutInHistoryUser> selectCoreIntroduceLetterOutInHistoryUserList(CoreIntroduceLetterOutInHistoryUser coreIntroduceLetterOutInHistoryUser) {
+        return coreIntroduceLetterOutInHistoryUserMapper.selectList(new QueryWrapper<>(coreIntroduceLetterOutInHistoryUser));
+    }
+
+    /**
+     * 新增机构出入过的历史人员
+     *
+     * @param coreIntroduceLetterOutInHistoryUser 机构出入过的历史人员
+     * @return 结果
+     */
+    @Override
+    public int insertCoreIntroduceLetterOutInHistoryUser(CoreIntroduceLetterOutInHistoryUser coreIntroduceLetterOutInHistoryUser) {
+        coreIntroduceLetterOutInHistoryUser.setCreateTime(DateUtils.getNowDate());
+        return coreIntroduceLetterOutInHistoryUserMapper.insert(coreIntroduceLetterOutInHistoryUser);
+    }
+
+    /**
+     * 修改机构出入过的历史人员
+     *
+     * @param coreIntroduceLetterOutInHistoryUser 机构出入过的历史人员
+     * @return 结果
+     */
+    @Override
+    public int updateCoreIntroduceLetterOutInHistoryUser(CoreIntroduceLetterOutInHistoryUser coreIntroduceLetterOutInHistoryUser) {
+        coreIntroduceLetterOutInHistoryUser.setUpdateTime(DateUtils.getNowDate());
+        return coreIntroduceLetterOutInHistoryUserMapper.updateById(coreIntroduceLetterOutInHistoryUser);
+    }
+
+    /**
+     * 批量删除机构出入过的历史人员
+     *
+     * @param ids 需要删除的机构出入过的历史人员主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCoreIntroduceLetterOutInHistoryUserByIds(Long[] ids) {
+        return coreIntroduceLetterOutInHistoryUserMapper.deleteBatchIds(Arrays.asList((ids)));
+    }
+
+    /**
+     * 删除机构出入过的历史人员信息
+     *
+     * @param id 机构出入过的历史人员主键
+     * @return 结果
+     */
+    @Override
+    public int deleteCoreIntroduceLetterOutInHistoryUserById(Long id) {
+
+        return coreIntroduceLetterOutInHistoryUserMapper.deleteById(id);
+    }
+
+    /**
+     * 思路1 :
+     * 1.获取当前用户登录的机构编码进行排判断,如果是才进行入库否则报错。
+     * 2.根据传来的人员信息到数据库中进行查询,如果有则进行更新,如果没有则进行插入。
+     * <p>
+     * 思路2 :
+     * 1. 直接将传来的人员信息按照机构编码,证件类型等查询,如果有则更新,没有则进行插入。
+     * 2.会不会有问题?
+     * 1. 机构之间的人员信息是不允许编辑的。
+     * 2.数据库那边人员信息相同,但是机构ID不同。
+     * 3.什么时候回出现多条?
+     * 1. 组织机构相同,但是出现多条的情况,证件类型不一致,身份证填错。
+     * 2. 出入事由不同,会出现4个判断指标?不回
+     *
+     * @param outInRequestUser
+     */
+    public int inboundOutInHistory(CoreIntroduceLetterOutInHistoryUser outInRequestUser) {
+//        LoginUser loginUser = SecurityUtils.getLoginUser();
+//        if (NumberUtil.equals(outInRequestUser.getOrgId(), loginUser.getOrgId())) {
+//            LambdaQueryWrapper<CoreIntroduceLetterOutInHistoryUser> lqw = new LambdaQueryWrapper<>();
+//            lqw
+//                    .eq(CoreIntroduceLetterOutInHistoryUser::getUserName, outInRequestUser.getUserName())
+//                    .eq(CoreIntroduceLetterOutInHistoryUser::getIdType, outInRequestUser.getIdType())
+//                    .eq(CoreIntroduceLetterOutInHistoryUser::getIdCard, outInRequestUser.getIdCard());
+//            CoreIntroduceLetterOutInHistoryUser result = coreIntroduceLetterOutInHistoryUserMapper.selectOne(lqw);
+//            if (ObjectUtil.isNotEmpty(result)) {
+//                outInRequestUser.setId(result.getId());
+//                return coreIntroduceLetterOutInHistoryUserMapper.updateById(outInRequestUser);
+//            }
+//            return coreIntroduceLetterOutInHistoryUserMapper.insert(outInRequestUser);
+//
+//        }
+        LambdaQueryWrapper<CoreIntroduceLetterOutInHistoryUser> lqw = new LambdaQueryWrapper<>();
+        lqw.eq(CoreIntroduceLetterOutInHistoryUser::getOrgId, outInRequestUser.getOrgId())
+                .eq(CoreIntroduceLetterOutInHistoryUser::getUserName, outInRequestUser.getUserName())
+                .eq(CoreIntroduceLetterOutInHistoryUser::getIdType, outInRequestUser.getIdType())
+                .eq(CoreIntroduceLetterOutInHistoryUser::getIdCard, outInRequestUser.getIdCard());
+        List<CoreIntroduceLetterOutInHistoryUser> outInRequestUserList = coreIntroduceLetterOutInHistoryUserMapper.selectList(lqw); //应该是唯一一条了
+
+        if (outInRequestUserList.size() > 0) {
+            outInRequestUser.setId(outInRequestUserList.get(0).getId());
+            return coreIntroduceLetterOutInHistoryUserMapper.updateById(outInRequestUser);
+        }
+        return coreIntroduceLetterOutInHistoryUserMapper.insert(outInRequestUser);
+
+    }
+}

+ 168 - 0
soc-modules/soc-modules-core/src/main/resources/mapper/letter/CoreIntroduceLetterOutInHistoryUserMapper.xml

@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xunmei.core.letter.mapper.CoreIntroduceLetterOutInHistoryUserMapper">
+
+<!--    <resultMap type="com.xunmei.core.letter.domain.CoreIntroduceLetterOutInHistoryUser" id="CoreIntroduceLetterOutInHistoryUserResult">-->
+<!--                <result property="id" column="id"/>-->
+<!--                <result property="orgId" column="org_id"/>-->
+<!--                <result property="userName" column="user_name"/>-->
+<!--                <result property="companyName" column="company_name"/>-->
+<!--                <result property="idType" column="id_type"/>-->
+<!--                <result property="idCard" column="id_card"/>-->
+<!--                <result property="imgFile" column="img_file"/>-->
+<!--                <result property="outInRequestId" column="out_in_request_id"/>-->
+<!--                <result property="createBy" column="create_by"/>-->
+<!--                <result property="createTime" column="create_time"/>-->
+<!--                <result property="updateBy" column="update_by"/>-->
+<!--                <result property="updateTime" column="update_time"/>-->
+<!--    </resultMap>-->
+
+    <sql id="selectCoreIntroduceLetterOutInHistoryUserVo">
+        select id, org_id, user_name, company_name, id_type, id_card, img_file, out_in_request_id, create_by, create_time, update_by, update_time
+        from core_introduce_letter_out_in_history_user
+    </sql>
+
+<!--    <select id="selectCoreIntroduceLetterOutInHistoryUserList" parameterType="com.xunmei.core.letter.domain.CoreIntroduceLetterOutInHistoryUser"-->
+<!--            resultMap="CoreIntroduceLetterOutInHistoryUserResult">-->
+<!--        <include refid="selectCoreIntroduceLetterOutInHistoryUserVo"/>-->
+<!--        <where>-->
+<!--                        <if test="orgId != null ">-->
+<!--                            and org_id = #{orgId}-->
+<!--                        </if>-->
+<!--                        <if test="userName != null  and userName != ''">-->
+<!--                            and user_name like concat('%', #{userName}, '%')-->
+<!--                        </if>-->
+<!--                        <if test="companyName != null  and companyName != ''">-->
+<!--                            and company_name like concat('%', #{companyName}, '%')-->
+<!--                        </if>-->
+<!--                        <if test="idType != null ">-->
+<!--                            and id_type = #{idType}-->
+<!--                        </if>-->
+<!--                        <if test="idCard != null  and idCard != ''">-->
+<!--                            and id_card = #{idCard}-->
+<!--                        </if>-->
+<!--                        <if test="imgFile != null  and imgFile != ''">-->
+<!--                            and img_file = #{imgFile}-->
+<!--                        </if>-->
+<!--                        <if test="outInRequestId != null ">-->
+<!--                            and out_in_request_id = #{outInRequestId}-->
+<!--                        </if>-->
+<!--        </where>-->
+<!--    </select>-->
+
+<!--    <select id="selectCoreIntroduceLetterOutInHistoryUserById" parameterType="Long"-->
+<!--            resultMap="CoreIntroduceLetterOutInHistoryUserResult">-->
+<!--            <include refid="selectCoreIntroduceLetterOutInHistoryUserVo"/>-->
+<!--            where id = #{id}-->
+<!--    </select>-->
+
+<!--    <insert id="insertCoreIntroduceLetterOutInHistoryUser" parameterType="com.xunmei.core.letter.domain.CoreIntroduceLetterOutInHistoryUser">-->
+<!--        insert into core_introduce_letter_out_in_history_user-->
+<!--        <trim prefix="(" suffix=")" suffixOverrides=",">-->
+<!--                    <if test="id != null">id,-->
+<!--                    </if>-->
+<!--                    <if test="orgId != null">org_id,-->
+<!--                    </if>-->
+<!--                    <if test="userName != null">user_name,-->
+<!--                    </if>-->
+<!--                    <if test="companyName != null">company_name,-->
+<!--                    </if>-->
+<!--                    <if test="idType != null">id_type,-->
+<!--                    </if>-->
+<!--                    <if test="idCard != null">id_card,-->
+<!--                    </if>-->
+<!--                    <if test="imgFile != null">img_file,-->
+<!--                    </if>-->
+<!--                    <if test="outInRequestId != null">out_in_request_id,-->
+<!--                    </if>-->
+<!--                    <if test="createBy != null">create_by,-->
+<!--                    </if>-->
+<!--                    <if test="createTime != null">create_time,-->
+<!--                    </if>-->
+<!--                    <if test="updateBy != null">update_by,-->
+<!--                    </if>-->
+<!--                    <if test="updateTime != null">update_time,-->
+<!--                    </if>-->
+<!--        </trim>-->
+<!--        <trim prefix="values (" suffix=")" suffixOverrides=",">-->
+<!--                    <if test="id != null">#{id},-->
+<!--                    </if>-->
+<!--                    <if test="orgId != null">#{orgId},-->
+<!--                    </if>-->
+<!--                    <if test="userName != null">#{userName},-->
+<!--                    </if>-->
+<!--                    <if test="companyName != null">#{companyName},-->
+<!--                    </if>-->
+<!--                    <if test="idType != null">#{idType},-->
+<!--                    </if>-->
+<!--                    <if test="idCard != null">#{idCard},-->
+<!--                    </if>-->
+<!--                    <if test="imgFile != null">#{imgFile},-->
+<!--                    </if>-->
+<!--                    <if test="outInRequestId != null">#{outInRequestId},-->
+<!--                    </if>-->
+<!--                    <if test="createBy != null">#{createBy},-->
+<!--                    </if>-->
+<!--                    <if test="createTime != null">#{createTime},-->
+<!--                    </if>-->
+<!--                    <if test="updateBy != null">#{updateBy},-->
+<!--                    </if>-->
+<!--                    <if test="updateTime != null">#{updateTime},-->
+<!--                    </if>-->
+<!--        </trim>-->
+<!--    </insert>-->
+
+<!--    <update id="updateCoreIntroduceLetterOutInHistoryUser" parameterType="com.xunmei.core.letter.domain.CoreIntroduceLetterOutInHistoryUser">-->
+<!--        update core_introduce_letter_out_in_history_user-->
+<!--        <trim prefix="SET" suffixOverrides=",">-->
+<!--                    <if test="orgId != null">org_id =-->
+<!--                        #{orgId},-->
+<!--                    </if>-->
+<!--                    <if test="userName != null">user_name =-->
+<!--                        #{userName},-->
+<!--                    </if>-->
+<!--                    <if test="companyName != null">company_name =-->
+<!--                        #{companyName},-->
+<!--                    </if>-->
+<!--                    <if test="idType != null">id_type =-->
+<!--                        #{idType},-->
+<!--                    </if>-->
+<!--                    <if test="idCard != null">id_card =-->
+<!--                        #{idCard},-->
+<!--                    </if>-->
+<!--                    <if test="imgFile != null">img_file =-->
+<!--                        #{imgFile},-->
+<!--                    </if>-->
+<!--                    <if test="outInRequestId != null">out_in_request_id =-->
+<!--                        #{outInRequestId},-->
+<!--                    </if>-->
+<!--                    <if test="createBy != null">create_by =-->
+<!--                        #{createBy},-->
+<!--                    </if>-->
+<!--                    <if test="createTime != null">create_time =-->
+<!--                        #{createTime},-->
+<!--                    </if>-->
+<!--                    <if test="updateBy != null">update_by =-->
+<!--                        #{updateBy},-->
+<!--                    </if>-->
+<!--                    <if test="updateTime != null">update_time =-->
+<!--                        #{updateTime},-->
+<!--                    </if>-->
+<!--        </trim>-->
+<!--        where id = #{id}-->
+<!--    </update>-->
+
+<!--    <delete id="deleteCoreIntroduceLetterOutInHistoryUserById" parameterType="Long">-->
+<!--        delete-->
+<!--        from core_introduce_letter_out_in_history_user where id = #{id}-->
+<!--    </delete>-->
+
+<!--    <delete id="deleteCoreIntroduceLetterOutInHistoryUserByIds" parameterType="String">-->
+<!--        delete from core_introduce_letter_out_in_history_user where id in-->
+<!--        <foreach item="id" collection="array" open="(" separator="," close=")">-->
+<!--            #{id}-->
+<!--        </foreach>-->
+<!--    </delete>-->
+</mapper>