ソースを参照

来访管理登记簿代码部分提交

jingyuanchao 1 年間 前
コミット
ac5a7763ec
16 ファイル変更394 行追加42 行削除
  1. 19 0
      project_data/sql/0.0.4/soc/soc.sql
  2. 10 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteFileService.java
  3. 5 0
      soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteFileFallbackFactory.java
  4. 5 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/constant/DictConstants.java
  5. 4 0
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/domain/letter/vo/CoreOutInRecordVo.java
  6. 1 24
      soc-common/soc-common-core/src/main/java/com/xunmei/common/core/enums/RegisterBookType.java
  7. 8 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/controller/CoreOutInRecordController.java
  8. 11 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/mapper/CoreIntroduceLetterApproveLogMapper.java
  9. 12 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/mapper/CoreIntroduceLetterUserMapper.java
  10. 3 0
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/service/ICoreOutInRecordService.java
  11. 188 17
      soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/service/impl/CoreOutInRecordServiceImpl.java
  12. 2 1
      soc-modules/soc-modules-core/src/main/resources/mapper/letter/CoreOutInRecordMapper.xml
  13. 5 0
      soc-modules/soc-modules-file/src/main/java/com/xunmei/file/controller/SysFileController.java
  14. 2 0
      soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/ISysFileService.java
  15. 21 0
      soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/LocalSysFileServiceImpl.java
  16. 98 0
      soc-modules/soc-modules-file/src/main/java/com/xunmei/file/utils/PdfUtil.java

+ 19 - 0
project_data/sql/0.0.4/soc/soc.sql

@@ -166,3 +166,22 @@ DROP PROCEDURE
 END ??
 DELIMITER;
 CALL schema_change ();
+
+-- 删除知识库标签管理菜单权限
+set @id = (select id from sys_menu where menu_name='知识库标签管理' limit 1);
+select @id;
+update sys_menu  set id =1731954732809224193 where id=@id;
+update sys_menu  set parent_id =1731954732809224193 where parent_id=@id;
+-- 隐藏知识库标签管理菜单
+delete  from sys_role_menu rm  where rm.menu_id in ( select id from sys_menu  where menu_name='知识库标签管理' union all select sm.id from sys_menu m inner join sys_menu sm on m.id=sm.parent_id where  m.menu_name='知识库标签管理');
+delete from sys_menu where id=1731954732809224193 or parent_id=1731954732809224193;
+
+-- 恢复知识库标签管理菜单权限
+-- set @eduParentId = (select id from sys_menu where menu_name='教育培训' limit 1);
+-- INSERT INTO `sys_menu`(`menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `platform_type`, `icon`, `image_path`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ('查询标签', 1731954732809224193, 1, '', NULL, NULL, 1, 0, 'F', '0', '0', 'core:knowledge:query', '1', '#', NULL, '何悦', '2023-08-21 15:54:54', '何悦', '2023-08-24 09:04:24', '');
+-- INSERT INTO `sys_menu`(`menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `platform_type`, `icon`, `image_path`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ('新增标签', 1731954732809224193, 2, '', NULL, NULL, 1, 0, 'F', '0', '0', 'core:knowledge:add', '1', '#', NULL, '何悦', '2023-08-21 15:55:21', '何悦', '2023-08-24 09:04:37', '');
+-- INSERT INTO `sys_menu`(`menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `platform_type`, `icon`, `image_path`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ('编辑标签', 1731954732809224193, 3, '', NULL, NULL, 1, 0, 'F', '0', '0', 'core:knowledge:edit', '1', '#', NULL, '何悦', '2023-08-21 15:55:42', '何悦', '2023-08-24 09:04:44', '');
+-- INSERT INTO `sys_menu`(`menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `platform_type`, `icon`, `image_path`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ('删除标签', 1731954732809224193, 4, '', NULL, NULL, 1, 0, 'F', '0', '0', 'core:knowledge:remove', '1', '#', NULL, '何悦', '2023-08-21 15:56:03', '何悦', '2023-08-24 09:04:59', '');
+-- INSERT INTO `sys_menu`(`id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `platform_type`, `icon`, `image_path`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1731954732809224193, '知识库标签管理', @eduParentId, 14, 'knowledge', 'core/knowledge/index', NULL, 1, 0, 'C', '0', '0', 'core:knowledge:list', '1', 'documentation', NULL, '何悦', '2023-08-21 15:49:29', '超级管理员', '2023-09-14 14:33:40', '');
+
+

+ 10 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteFileService.java

@@ -60,6 +60,16 @@ public interface RemoteFileService {
     R<String> generateDrillPdf(@RequestBody Map<String, Object> data);
 
     /**
+     * 生成来访管理登记簿
+     *
+     * @param data     文件信息
+     * @param cacheDir 缓存目录
+     * @return 结果
+     */
+    @PostMapping(value = "/file/generateOutInPdf")
+    R<String> generateOutInPdf(@RequestBody Map<String, Object> data);
+
+    /**
      * 获取本地存储路径前缀
      *
      * @return 结果

+ 5 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteFileFallbackFactory.java

@@ -80,6 +80,11 @@ public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileServ
             public void deletedZipFile() {
 
             }
+
+            @Override
+            public R<String> generateOutInPdf(Map<String, Object> data) {
+                return null;
+            }
         };
     }
 }

+ 5 - 0
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/constant/DictConstants.java

@@ -250,6 +250,11 @@ public class DictConstants {
      */
     public static final String CORE_DRILL_CATEGORY = "core_drill_category";
 
+    /**
+     * 介绍下证件类型
+     */
+    public static final String LETTER_ID_TYPE = "letter_id_type";
+
 
 
 }

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

@@ -126,5 +126,9 @@ public class CoreOutInRecordVo{
 
     private Integer effectiveDays;
 
+    private Long letterUserId;
+
+    private Long letterOrgId;
+
 
 }

+ 1 - 24
soc-common/soc-common-core/src/main/java/com/xunmei/common/core/enums/RegisterBookType.java

@@ -18,30 +18,7 @@ public enum RegisterBookType {
     SECURITY_PERFORMANCE(0, "安保履职登记簿"),
     EDUCATION_TRAINING(1, "教育培训登记簿"),
     SAFETY_DRILL(2, "预案演练登记簿"),
-    SAFETY_CHECK_REPORT(3, "网点安全保卫履职每日"),
-    SAFETY_EDUCATION_REPORT(4, "网点安全保卫履职每月"),
-    PLAN_DRILL_REPORT(5, "网点安全保卫履职每季"),
-    INTELLIGENT_OPERATION_REPORT(6, "网点设备状态监测"),
-    DAY_OF_JKRESUMTPION(7, "金库安全保卫履职每日"),
-    QUARTER_OF_JKREUMPTION(8, "金库安全保卫履职每季"),
-    WEEK_OF_YJZXREUMPTION(9, "一级支行机构履职每周"),
-    MONTH_OF_YJZXREUMPTION(10, "一级支行机构履职每月"),
-    QUARTER_OF_YJZXREUMPTION(11, "一级支行机构履职每季"),
-    QUARTER_OF_YJZXFGHZREUMPTION(12, "一级支行分管行长季度"),
-    HALFYEAR_OF_YJZXFGHZREUMPTION(13, "一级支行分管行长半年"),
-    HALFYEAR_OF_YJZXREUMPTION(14, "一级支行机构履职半年"),
-    YEAR_OF_YJZXREUMPTION(15, "一级支行机构履职每年"),
-    WEEK_OF_JKREUMPTION(16, "金库安全保卫履职每周"),
-    MONTH_OF_JKREUMPTION(17, "金库安全保卫履职每月"),
-    YEAR_OF_JKREUMPTION(18, "金库安全保卫履职每年"),
-    WEEK_OF_WDREUMPTION(19, "网点安全保卫履职每周"),
-    YEAE_OF_WDREUMPTION(20, "网点安全保卫履职每年"),
-    DAY_OF_WDPROTECTION_DATA(21, "营业网点布防情况统计每日"),
-    DAY_OF_JKPROTECTION_DATA(22, "金库布防情况统计每日"),
-    VISIT_RECORD(23, "来访管理登记簿"),
-    JK_OPERATION_REPORT(24, "金库设备状态监测"),
-    DEVICE_STATISTICS_NUM(25, "营业网点安防消防设备器材统计"),
-
+    VISIT_RECORD(3, "来访管理登记簿"),
     SAFE_CHECK_REPORT(26, "安全检查登记簿"),
 
 

+ 8 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/controller/CoreOutInRecordController.java

@@ -82,4 +82,12 @@ public class CoreOutInRecordController extends BaseController {
     public AjaxResult remove(@PathVariable Long[] ids) {
         return toAjax(coreOutInRecordService.deleteCoreOutInRecordByIds(ids));
     }
+
+
+    @ApiOperation(value = "生成来访管理登记簿")
+    @GetMapping("build/{id}")
+    public AjaxResult pdf(@PathVariable("id") Long id) {
+        return coreOutInRecordService.buildOutInRecordPdf(id);
+    }
+
 }

+ 11 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/mapper/CoreIntroduceLetterApproveLogMapper.java

@@ -0,0 +1,11 @@
+package com.xunmei.core.letter.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunmei.common.core.domain.letter.domain.CoreIntroduceLetterApproveLog;
+
+/**
+ * @author jingyuanchao
+ * @date 2023/12/5 10:15
+ */
+public interface CoreIntroduceLetterApproveLogMapper  extends BaseMapper<CoreIntroduceLetterApproveLog> {
+}

+ 12 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/mapper/CoreIntroduceLetterUserMapper.java

@@ -0,0 +1,12 @@
+package com.xunmei.core.letter.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xunmei.common.core.domain.letter.domain.CoreIntroduceLetterApproveLog;
+import com.xunmei.common.core.domain.letter.domain.CoreIntroduceLetterUser;
+
+/**
+ * @author jingyuanchao
+ * @date 2023/12/5 10:15
+ */
+public interface CoreIntroduceLetterUserMapper extends BaseMapper<CoreIntroduceLetterUser> {
+}

+ 3 - 0
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/service/ICoreOutInRecordService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.xunmei.common.core.domain.letter.domain.CoreOutInRecord;
 import com.xunmei.common.core.domain.letter.dto.CoreOutInRecordRequestDto;
 import com.xunmei.common.core.domain.letter.vo.CoreOutInRecordVo;
+import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.common.core.web.page.TableDataInfo;
 
 import java.util.List;
@@ -70,4 +71,6 @@ public interface ICoreOutInRecordService extends IService<CoreOutInRecord> {
      * @return Page
      */
     TableDataInfo<CoreOutInRecordVo> selectPage(CoreOutInRecordRequestDto coreOutInRecord);
+
+    AjaxResult buildOutInRecordPdf(Long id);
 }

+ 188 - 17
soc-modules/soc-modules-core/src/main/java/com/xunmei/core/letter/service/impl/CoreOutInRecordServiceImpl.java

@@ -3,30 +3,62 @@ package com.xunmei.core.letter.service.impl;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.xunmei.common.core.constant.CacheConstants;
+import com.xunmei.common.core.constant.DictConstants;
 import com.xunmei.common.core.constant.ErrorMsgConstants;
 import com.xunmei.common.core.constant.SecurityConstants;
+import com.xunmei.common.core.domain.R;
+import com.xunmei.common.core.domain.edu.domain.CoreEduTrainingTask;
+import com.xunmei.common.core.domain.edu.domain.CoreEduTrainingTaskToUser;
+import com.xunmei.common.core.domain.edu.vo.CoreEduTrainingTaskDetailVo;
+import com.xunmei.common.core.domain.letter.domain.CoreIntroduceLetter;
+import com.xunmei.common.core.domain.letter.domain.CoreIntroduceLetterApproveLog;
+import com.xunmei.common.core.domain.letter.domain.CoreIntroduceLetterUser;
 import com.xunmei.common.core.domain.letter.domain.CoreOutInRecord;
 import com.xunmei.common.core.domain.letter.dto.CoreOutInRecordRequestDto;
 import com.xunmei.common.core.domain.letter.vo.CoreOutInRecordVo;
+import com.xunmei.common.core.domain.registerbook.domain.CoreRegisterBookPdf;
+import com.xunmei.common.core.enums.RegisterBookType;
+import com.xunmei.common.core.exception.SystemException;
 import com.xunmei.common.core.utils.DateUtils;
+import com.xunmei.common.core.web.domain.AjaxResult;
 import com.xunmei.common.core.web.page.TableDataInfo;
+import com.xunmei.common.redis.utils.RedisUtils;
+import com.xunmei.common.security.utils.DictUtils;
 import com.xunmei.common.security.utils.SecurityUtils;
+import com.xunmei.core.letter.mapper.CoreIntroduceLetterApproveLogMapper;
+import com.xunmei.core.letter.mapper.CoreIntroduceLetterMapper;
+import com.xunmei.core.letter.mapper.CoreIntroduceLetterUserMapper;
 import com.xunmei.core.letter.mapper.CoreOutInRecordMapper;
 import com.xunmei.core.letter.service.ICoreOutInRecordService;
 
+import com.xunmei.core.registerbook.service.ICoreRegisterBookPdfService;
+import com.xunmei.core.thread.ThreadPoolConfig;
+import com.xunmei.system.api.RemoteFileService;
 import com.xunmei.system.api.RemoteOrgService;
+import com.xunmei.system.api.RemoteUserService;
 import com.xunmei.system.api.domain.SysOrg;
+import com.xunmei.system.api.domain.SysUser;
 import com.xunmei.system.api.function.RemoteCallHandlerExecutor;
+import com.xunmei.system.api.vo.SysOrgVO;
+import io.netty.util.internal.StringUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.Arrays;
-import java.util.List;
+import java.io.File;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
 
 /**
  * 人员出入登记Service业务层处理
@@ -38,9 +70,17 @@ import java.util.List;
 public class CoreOutInRecordServiceImpl extends ServiceImpl<CoreOutInRecordMapper, CoreOutInRecord> implements ICoreOutInRecordService {
     @Autowired
     private CoreOutInRecordMapper coreOutInRecordMapper;
+    @Autowired
+    private CoreIntroduceLetterMapper letterMapper;
     @Resource
     private RemoteOrgService orgService;
-
+    @Resource
+    private RemoteFileService fileService;
+    @Autowired
+    private ICoreRegisterBookPdfService registerBookPdfService;
+    @Autowired
+    @Qualifier(ThreadPoolConfig.SOC_EXECUTOR)
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
     @Override
     public TableDataInfo<CoreOutInRecordVo> selectPage(CoreOutInRecordRequestDto request) {
         //未删除
@@ -51,13 +91,11 @@ public class CoreOutInRecordServiceImpl extends ServiceImpl<CoreOutInRecordMappe
         } else {
             page = new Page<>();
         }
-        if(ObjectUtil.isNotEmpty( request.getRange()))
-        {
+        if (ObjectUtil.isNotEmpty(request.getRange())) {
             request.setStartTime(DateUtil.beginOfDay(request.getRange()[0]));
             request.setEndTime(DateUtil.endOfDay(request.getRange()[1]));
         }
-        if(ObjectUtil.isNotEmpty(request.getArrivalTime()))
-        {
+        if (ObjectUtil.isNotEmpty(request.getArrivalTime())) {
             request.setStartTime(DateUtil.beginOfDay(request.getArrivalTime()));
             request.setEndTime(DateUtil.endOfDay(request.getArrivalTime()));
         }
@@ -68,9 +106,8 @@ public class CoreOutInRecordServiceImpl extends ServiceImpl<CoreOutInRecordMappe
         //获取数据
         page = coreOutInRecordMapper.selectCoreOutInRecordPageList(page, request);
 
-        if(ObjectUtil.isNotEmpty(page.getRecords()))
-        {
-            page.getRecords().forEach(vo->{
+        if (ObjectUtil.isNotEmpty(page.getRecords())) {
+            page.getRecords().forEach(vo -> {
                 vo.setLetterFile(ObjectUtil.isNotEmpty(vo.getLetterFileStr()) ? JSON.parseArray(vo.getLetterFileStr(), String.class) : null);
             });
         }
@@ -91,11 +128,11 @@ public class CoreOutInRecordServiceImpl extends ServiceImpl<CoreOutInRecordMappe
     @Override
     public CoreOutInRecordVo selectCoreOutInRecordById(Long id) {
 
-         CoreOutInRecordVo vo = coreOutInRecordMapper.selectCoreOutInRecordById(id);
-         if(ObjectUtil.isNotEmpty(vo)){
-             vo.setLetterFile(ObjectUtil.isNotEmpty(vo.getLetterFileStr()) ? JSON.parseArray(vo.getLetterFileStr(), String.class) : null);
-         }
-         return vo;
+        CoreOutInRecordVo vo = coreOutInRecordMapper.selectCoreOutInRecordById(id);
+        if (ObjectUtil.isNotEmpty(vo)) {
+            vo.setLetterFile(ObjectUtil.isNotEmpty(vo.getLetterFileStr()) ? JSON.parseArray(vo.getLetterFileStr(), String.class) : null);
+        }
+        return vo;
     }
 
     /**
@@ -117,8 +154,7 @@ public class CoreOutInRecordServiceImpl extends ServiceImpl<CoreOutInRecordMappe
      */
     @Override
     public int insertCoreOutInRecord(CoreOutInRecord coreOutInRecord) {
-        if(ObjectUtil.isEmpty(coreOutInRecord.getId()))
-        {
+        if (ObjectUtil.isEmpty(coreOutInRecord.getId())) {
             coreOutInRecord.setId(IdWorker.getId());
         }
         coreOutInRecord.setCreateTime(DateUtils.getNowDate());
@@ -158,4 +194,139 @@ public class CoreOutInRecordServiceImpl extends ServiceImpl<CoreOutInRecordMappe
     public int deleteCoreOutInRecordById(Long id) {
         return coreOutInRecordMapper.deleteById(id);
     }
+
+    @Override
+    public AjaxResult buildOutInRecordPdf(Long id) {
+        final CoreOutInRecordVo record = selectCoreOutInRecordById(id);
+        final List<SysOrgVO> orgList = RedisUtils.getCacheList(CacheConstants.ORG_CACHE_LIST_KEY);
+        final SysOrgVO sysOrg = orgList.stream().filter(org -> ObjectUtil.equal(record.getOrgId(), org.getId())).findFirst().get();
+        String fileName = getFileOrgName(sysOrg) + "_" + RegisterBookType.VISIT_RECORD.getText() + "_" + DateUtil.format(new Date(), "yyyyMMddHHmmss") + ".pdf";
+        Map<String, Object> data = this.getFtlEdu(record, orgList);
+        data.put("fileName", fileName);
+        data.put("id", id);
+      //  CompletableFuture.runAsync(() -> {
+            R<String> r = RemoteCallHandlerExecutor.executeRemoteCall(() -> fileService.generateOutInPdf(data), ErrorMsgConstants.GENERATE_PDF_ERROR);
+            if (null == r || null == r.getData()) {
+                throw new SystemException(ErrorMsgConstants.GENERATE_PDF_ERROR);
+            }
+          /*  String pdfUrl = r.getData();
+            LambdaUpdateWrapper<CoreOutInRecord> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(CoreOutInRecord::getId, id);
+            updateWrapper.set(CoreEduTrainingTask::getPdfUrl, pdfUrl);
+            this.update(updateWrapper);*/
+
+            CoreRegisterBookPdf registerBookPdf = new CoreRegisterBookPdf();
+            registerBookPdf.setId(id);
+            registerBookPdf.setRegisterBookType(RegisterBookType.VISIT_RECORD.getNum());
+            registerBookPdf.setDate(new Date());
+            registerBookPdf.setOrgId(record.getLetterOrgId());
+            registerBookPdf.setOrgName(record.getOrgName());
+            registerBookPdf.setOrgPath(sysOrg.getPath());
+            /*registerBookPdf.setFileUrl(pdfUrl);
+            registerBookPdf.setFileName(StringUtils.substringAfterLast(pdfUrl, File.separator));
+            registerBookPdfService.save(registerBookPdf);*/
+       // }, threadPoolTaskExecutor);
+
+        return AjaxResult.success("正在生成pdf,请稍后刷新页面查看!");
+    }
+
+    private String getFileOrgName(SysOrgVO org) {
+        String[] strings = org.getPath().split("-");
+        List<Long> list = Arrays.stream(strings).map(Long::valueOf).collect(Collectors.toList());
+        List<SysOrg> sysOrgList = RemoteCallHandlerExecutor.executeRemoteCall(() -> orgService.selectOrgByIdList(list, SecurityConstants.INNER), ErrorMsgConstants.QUERY_ORG_DATA_ERROR);
+        final Map<Long, String> map = sysOrgList.stream().collect(Collectors.toMap(SysOrg::getId, SysOrg::getShortName));
+        List<String> list1 = new ArrayList<>();
+        for (String orgId : strings) {
+            list1.add(map.get(Long.parseLong(orgId)));
+        }
+        return String.join("_", list1);
+    }
+
+    private Map<String, Object> getFtlEdu(CoreOutInRecordVo record, List<SysOrgVO> orgList) {
+        final CoreIntroduceLetterApproveLog approveLog = letterMapper.findCheckLog(record.getLetterId(), record.getOrgId());
+        final SysOrgVO inOrg = orgList.stream().filter(org -> ObjectUtil.equal(org.getId(), record.getOrgId())).findFirst().get();
+        final SysOrgVO outOrg = orgList.stream().filter(org -> ObjectUtil.equal(org.getId(), record.getLetterOrgId())).findFirst().get();
+        String prefixPath = RemoteCallHandlerExecutor.executeRemoteCall(() -> fileService.getLocalPathPrefix(), ErrorMsgConstants.QUERY_FILE_PATH_ERROR);
+        String staticsPath = RemoteCallHandlerExecutor.executeRemoteCall(() -> fileService.getStaticPathPrefix(), ErrorMsgConstants.QUERY_FILE_PATH_ERROR);
+
+        Map<String, Object> data = new HashMap<>();
+
+        //接待机构
+        String inOrgName = ObjectUtil.isNotEmpty(inOrg.getShortName()) ? inOrg.getShortName() : inOrg.getName();
+        data.put("inOrg", inOrgName);
+        //接待日期
+        String time = DateUtil.format(record.getArrivalTime(), "yyyy年MM月dd日");
+        data.put("time", StringUtils.isNotEmpty(time) ? time : StringUtil.EMPTY_STRING);
+        //来访事由
+        data.put("reasons", StringUtils.isNotEmpty(record.getReasons()) ? record.getReasons() : StringUtil.EMPTY_STRING);
+        //审批人
+        data.put("approveUser", StringUtils.isNotEmpty(approveLog.getApproveUser()) ? approveLog.getApproveUser() : StringUtil.EMPTY_STRING);
+        //来访单位
+        String outOrgName = ObjectUtil.isNotEmpty(outOrg.getShortName()) ? outOrg.getShortName() : outOrg.getName();
+        data.put("outOrgName", outOrgName);
+        //来访人员
+        data.put("userName", record.getUserName());
+        //证件类型
+       /* final CoreIntroduceLetterUser letterUser = letterUserMapper.selectOne(new LambdaQueryWrapper<CoreIntroduceLetterUser>()
+                .eq(CoreIntroduceLetterUser::getLetterId, record.getLetterId())
+                .eq(CoreIntroduceLetterUser::getId, record.getLetterUserId()));
+        final String idTypeLabel = DictUtils.getDictLabel(DictConstants.LETTER_ID_TYPE, letterUser.getIdType());*/
+        data.put("idType", record.getIdType());
+        //证件号码
+        data.put("idCard", record.getIdCard());
+
+        //进入时间
+        String inTime = DateUtil.format(record.getArrivalTime(), "yyyy年MM月dd日HH时mm分");
+        data.put("inTime", inTime);
+        //离开时间
+        String outTime = DateUtil.format(record.getDepartureTime(), "yyyy年MM月dd日HH时mm分");
+        data.put("outTime", outTime);
+        //证件图片
+        final String imgFile = record.getImgFile();
+        if (ObjectUtil.isEmpty(imgFile)) {
+            data.put("imageFile", new ArrayList<>());
+        } else {
+            data.put("imageFile", getFileRealPath(Arrays.asList(imgFile.split(",")), prefixPath, staticsPath));
+        }
+        //介绍信附件
+        final String file = record.getLetterFileStr();
+        if (ObjectUtil.isEmpty(file)) {
+            data.put("file", new ArrayList<>());
+        } else {
+            final List<String> list = JSON.parseArray(file, String.class);
+            List<String> strings = new ArrayList<>();
+            for (String json : list) {
+                final Map map = JSON.parseObject(json, Map.class);
+                final String url = (String)map.get("url");
+                if (ObjectUtil.isNotEmpty(url)){
+                    strings.add(url);
+                }
+            }
+            data.put("file", getFileRealPath(strings, prefixPath, staticsPath));
+        }
+        //核验图片
+        final String checkImage = record.getCheckImage();
+        if (ObjectUtil.isEmpty(checkImage) || !checkImage.contains(File.separator)) {
+            data.put("checkImage", new ArrayList<>());
+        } else {
+            data.put("checkImage", getFileRealPath(Arrays.asList(checkImage.split(",")), prefixPath, staticsPath));
+        }
+        return data;
+    }
+
+
+    private List<String> getFileRealPath(List<String> fileList, String prefixPath, String staticsPath) {
+        List<String> list = new ArrayList<>();
+        if (ObjectUtil.isEmpty(fileList)) {
+            return list;
+        }
+        for (String path : fileList) {
+            if (path.contains(staticsPath)) {
+                //删除 /statics 前缀路径
+                path = path.replace(staticsPath, StringUtil.EMPTY_STRING);
+            }
+            list.add(prefixPath + path);
+        }
+        return list;
+    }
 }

+ 2 - 1
soc-modules/soc-modules-core/src/main/resources/mapper/letter/CoreOutInRecordMapper.xml

@@ -83,7 +83,8 @@
             l.letter_file as letterFileStr,
             l.start_time,
             l.end_time,
-            l.effective_days
+            l.effective_days,
+            l.org_id as letterOrgId
         FROM
             core_out_in_record r
                 INNER JOIN sys_org o ON r.org_id=o.id

+ 5 - 0
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/controller/SysFileController.java

@@ -157,7 +157,12 @@ public class SysFileController {
     @PostMapping(value = "/generateDrillPdf")
     R<String> generateDrillPdf(@RequestBody Map<String, Object> data) throws Exception {
         return R.ok(sysFileService.generateDrillPdf(data));
+    }
 
+    @ApiOperation(value = "出入管理pdf")
+    @PostMapping(value = "/generateOutInPdf")
+    R<String> generateOutInPdf(@RequestBody Map<String, Object> data) throws Exception {
+        return R.ok(sysFileService.generateOutInPdf(data));
     }
 
     @ApiOperation(value = "获取文件相对路径")

+ 2 - 0
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/ISysFileService.java

@@ -74,4 +74,6 @@ public interface ISysFileService
     void cutFileCompress(CoreRegisterBookPdfExportDto exportDto);
 
     void deletedZipFile();
+
+    String generateOutInPdf(Map<String, Object> data)throws Exception;
 }

+ 21 - 0
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/LocalSysFileServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.lowagie.text.*;
 import com.lowagie.text.pdf.*;
 import com.xunmei.common.core.constant.CacheConstants;
@@ -350,6 +351,26 @@ public class LocalSysFileServiceImpl implements ISysFileService {
     }
 
     @Override
+    public String generateOutInPdf(Map<String, Object> data) throws Exception {
+        PdfFilePathVo pathVo = getLocalFilePath(localFilePath, "visit", data.get("fileName").toString());
+        log.info("开始生成来访管理登记簿,当前绝对地址为:{}", pathVo.getAbsolutePath());
+        final ItextPdfTableVo pdfTableVo = PdfUtil.createTable(pathVo.getAbsolutePath(), 6, 10);
+        final Document document = pdfTableVo.getDocument();
+        final PdfWriter writer = pdfTableVo.getWriter();
+
+        final PdfPTable table = pdfTableVo.getTable();
+        final BaseFont fs = pdfTableVo.getFs();
+        final Font tableFont = pdfTableVo.getTableFont();
+        PdfUtil.dealHeader(document, fs, "来 访 管 理 登 记 簿", 24);
+        PdfUtil.dealOutInBody(document, table, tableFont, data);
+        document.close();
+        writer.close();
+        log.info("来访管理登记簿生成结束,当前绝对地址为:{}", pathVo.getAbsolutePath());
+        //此处返回  /statics/edu/xxx.pdf
+        return this.prefix + pathVo.getRelativePath();
+    }
+
+    @Override
     public String uploadFileBase64(FileBase64Vo file) throws Exception {
         String filePath = FileUploadUtils.uploadBase64(localFilePath, file);
         return filePath;

+ 98 - 0
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/utils/PdfUtil.java

@@ -260,6 +260,104 @@ public class PdfUtil {
         return result.toString();
     }
 
+    public static void dealOutInBody(Document document, PdfPTable table, Font tableFont, Map<String, Object> data) throws Exception {
+        table.setSplitLate(false);
+        table.setSplitRows(true);
+        //第一行
+        createPDFCell(tableFont, table, "接待机构", Element.ALIGN_CENTER, 1, 1);
+        createPDFCell(tableFont, table, data.get("inOrg").toString(), Element.ALIGN_CENTER, 2, 1);
+        createPDFCell(tableFont, table, "接待日期", Element.ALIGN_CENTER, 1, 1);
+        createPDFCell(tableFont, table, data.get("time").toString(), Element.ALIGN_CENTER, 2, 1);
+        //第二行
+        createPDFCell(tableFont, table, "来访事由", Element.ALIGN_CENTER, 1, 1);
+        createPDFCell(tableFont, table, data.get("reasons").toString(), Element.ALIGN_CENTER, 2, 1);
+        createPDFCell(tableFont, table, "审批人", Element.ALIGN_CENTER, 1, 1);
+        createPDFCell(tableFont, table, data.get("approveUser").toString(), Element.ALIGN_CENTER, 2, 1);
+        //第三行
+        createPDFCell(tableFont, table, "来访单位", Element.ALIGN_CENTER, 1, 1);
+        createPDFCell(tableFont, table, data.get("outOrgName").toString(), Element.ALIGN_CENTER, 2, 1);
+        createPDFCell(tableFont, table, "来访人员", Element.ALIGN_CENTER, 1, 1);
+        createPDFCell(tableFont, table, data.get("userName").toString(), Element.ALIGN_CENTER, 2, 1);
+        //第四行
+        createPDFCell(tableFont, table, "证件类型", Element.ALIGN_CENTER, 1, 1);
+        createPDFCell(tableFont, table, data.get("idType").toString(), Element.ALIGN_CENTER, 2, 1);
+        createPDFCell(tableFont, table, "证件号码", Element.ALIGN_CENTER, 1, 1);
+        createPDFCell(tableFont, table, data.get("idCard").toString(), Element.ALIGN_CENTER, 2, 1);
+        //第五行
+        createPDFCell(tableFont, table, "进入时间", Element.ALIGN_CENTER, 1, 1);
+        createPDFCell(tableFont, table, data.get("inTime").toString(), Element.ALIGN_CENTER, 2, 1);
+        createPDFCell(tableFont, table, "离开时间", Element.ALIGN_CENTER, 1, 1);
+        createPDFCell(tableFont, table, data.get("outTime").toString(), Element.ALIGN_CENTER, 2, 1);
+
+        //第八行
+        createPDFCell(tableFont, table, "来访原由", Element.ALIGN_CENTER, 1, 40);
+        //createPDFCellWithoutBorder(tableFont, table, "来访原由:" + data.get("imageFile").toString() + " ;", Element.ALIGN_LEFT, 6, 1);
+
+/*
+
+        //预设案由
+        PdfPCell contentCell = new PdfPCell();
+        contentCell.setColspan(6);
+        Paragraph content = new Paragraph();
+        String text = data.get("presetCase").toString();
+        content.add(new Chunk(text, tableFont));
+        contentCell.addElement(content);
+        contentCell.setBorder(Rectangle.LEFT | Rectangle.RIGHT | Rectangle.BOTTOM);
+        table.addCell(contentCell);
+
+        //演练情况
+        PdfPCell noteCell = new PdfPCell();
+        noteCell.setColspan(6);
+        Paragraph paragraph = new Paragraph();
+        String noteText = data.get("drillSituation").toString();
+        paragraph.add(new Chunk(noteText, tableFont));
+        noteCell.addElement(paragraph);
+        noteCell.setBorder(Rectangle.LEFT | Rectangle.RIGHT);
+        table.addCell(noteCell);
+        //演练情况 图片填充
+        final PdfPTable imageTable1 = getImage((List<String>) data.get("imageData"), 6,100,100,3);
+        final PdfPCell cell1 = new PdfPCell();
+        cell1.setNoWrap(false);
+        cell1.setPaddingLeft(8f);
+        cell1.setPaddingRight(8f);
+        cell1.setPaddingBottom(8f);
+        cell1.setPaddingTop(8f);
+        cell1.setColspan(6);
+        cell1.setBorder(Rectangle.LEFT | Rectangle.RIGHT | Rectangle.BOTTOM);
+        cell1.addElement(imageTable1);
+        table.addCell(cell1);
+
+        //签字区域
+        PdfPCell signCell = new PdfPCell();
+        signCell.setColspan(6);
+        Paragraph signParagraph = new Paragraph();
+        signParagraph.add(new Chunk("参会演练人员(签字):", tableFont));
+        signCell.addElement(signParagraph);
+        signCell.setBorder(Rectangle.LEFT | Rectangle.RIGHT);
+        table.addCell(signCell);
+        //图片填充
+        final PdfPTable imageTable = getImage((List<String>) data.get("image"), 12,50,50,5);
+        final PdfPCell cell = new PdfPCell();
+        cell.setNoWrap(false);
+        cell.setPaddingLeft(8f);
+        cell.setPaddingRight(8f);
+        cell.setPaddingBottom(8f);
+        cell.setPaddingTop(8f);
+        cell.setColspan(6);
+        cell.setBorder(Rectangle.LEFT | Rectangle.RIGHT | Rectangle.BOTTOM);
+        cell.addElement(imageTable);
+        table.addCell(cell);
+
+        //第三行
+        createPDFCell(tableFont, table, "记录人", Element.ALIGN_CENTER, 1, 1);
+        createPDFCell(tableFont, table, data.get("recorderName").toString(), Element.ALIGN_CENTER, 5, 1);
+
+    *//*    //第三行
+        createPDFCell(tableFont, table, "参会人员签字", Element.ALIGN_CENTER, 1, 1);
+        createPDFCell(tableFont, table, data.get("users").toString(), Element.ALIGN_CENTER, 5, 1);*/
+
+        document.add(table);
+    }
     public static void dealDrillBody(Document document, PdfPTable table, Font tableFont, Map<String, Object> data) throws Exception {
         table.setSplitLate(false);
         table.setSplitRows(true);