Pārlūkot izejas kodu

添加员工通道

cuimengchao 3 gadi atpakaļ
vecāks
revīzija
f9b9b20e7e

+ 10 - 1
src/main/java/com/yx/face/boot/uitls/SMSOrIdCardUtils.java

@@ -1,5 +1,7 @@
 package com.yx.face.boot.uitls;
 
+import org.apache.commons.lang3.StringUtils;
+
 import java.util.regex.Pattern;
 
 /**
@@ -82,9 +84,16 @@ public class SMSOrIdCardUtils {
     隐藏身份证中间的部分
      */
     public static String hideIdNumber(String idNumber){
-        return idNumber.replaceAll("(\\d{4})\\d{10}(\\d{4})","$1*****$2");
+        if (StringUtils.isEmpty(idNumber) || (idNumber.length() < 8)) {
+            return idNumber;
+        }
+        return idNumber.replaceAll("(?<=\\w{4})\\w(?=\\w{4})", "*");
     }
 
+    public static void main(String[] args) {
+        String s = hideIdNumber("52020119960112363X");
+        System.out.println(s);
+    }
     /*
       隐藏名字的第一个字
       */

+ 2 - 2
src/main/java/com/yx/face/controller/TBFaceController.java

@@ -154,11 +154,11 @@ public class TBFaceController {
         try {
             JSONObject paramJson = getParamJson(request);
             JSONArray data = paramJson.getJSONArray("data");
+            System.out.println(data);
             for (Object datum : data) {
                 Map<String, String> map = new HashMap<>();
-                map.put("name", JSONObject.parseObject(datum.toString()).getString("name"));
+                map.put(JSONObject.parseObject(datum.toString()).getString("cardid"), paramJson.getString("SN"));
                 map.put("SN", paramJson.getString("SN"));
-                map.put("taskId", paramJson.getString("taskId"));
                 list.add(map);
             }
             if (!list.isEmpty()){

+ 9 - 11
src/main/java/com/yx/face/controller/admin/SystemLongTermDocumentsController.java

@@ -1,31 +1,20 @@
 package com.yx.face.controller.admin;
 
-import com.alibaba.excel.EasyExcel;
 import com.github.pagehelper.PageInfo;
 import com.yx.face.boot.core.BaseController;
 import com.yx.face.boot.restful.RestDTO;
 import com.yx.face.boot.restful.RestResponse;
 import com.yx.face.boot.restful.RestResult;
-import com.yx.face.boot.uitls.ExcelListenerUtils;
-import com.yx.face.model.dto.UserWhitelistDTO;
-import com.yx.face.model.excel.UserWhitelistExcel;
 import com.yx.face.model.query.FaceDeviceQu;
 import com.yx.face.model.query.SysLongTermDocumentsQu;
-import com.yx.face.model.search.UserWhitelistSearch;
 import com.yx.face.model.vo.SystemLongTermDocumentsVO;
-import com.yx.face.model.vo.UserWhitelistVO;
 import com.yx.face.service.SystemLongTermDocumentsService;
-import com.yx.face.service.UserWhitelistService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-import java.util.List;
 
 /**
  * @description:
@@ -64,4 +53,13 @@ public class SystemLongTermDocumentsController extends BaseController {
         if (insert == 1) return RestResponse.ok(true);
         else return RestResponse.error("删除失败");
     }
+    @ApiOperation("人员单个下发")
+    @GetMapping("/singleIssue")
+    public RestResult<String> singleIssue(Integer id) {
+        if (id == null){
+            return RestResponse.error("缺少参数");
+        }
+        RestResult<String> restResult  = systemLongTermDocumentsService.singleIssue(id);
+        return restResult;
+    }
 }

+ 2 - 0
src/main/java/com/yx/face/dao/FaceDeviceDao.java

@@ -48,5 +48,7 @@ public interface FaceDeviceDao extends TKMapper<FaceDevice> {
     List<FaceDevice> selectSnList(@Param("type") Integer type, @Param("sn") String sn, @Param("provinceId") Integer provinceId, @Param("adminId") Integer adminId);
 
     Integer update(@Param("sn") String sn, @Param("type") int type, @Param("adminId") Integer adminId);
+
+    List<FaceDevice> selectTypeFaceDev(@Param("type") int type);
 }
 

+ 3 - 6
src/main/java/com/yx/face/model/entity/SystemLongTermDocuments.java

@@ -14,14 +14,14 @@ import java.util.Date;
 public class SystemLongTermDocuments {
 
     @Id
-    private String id;
+    private Integer id;
     private String name;
     @Column(name = "app_id")
     private String appId;
     @Column(name = "entry_id")
     private String entryId;
-    @Column(name = "image")
-    private String image;
+    @Column(name = "photo")
+    private String photo;
     @Column(name = "id_number")
     private String idNumber;
     @Column(name = "create_time")
@@ -29,9 +29,6 @@ public class SystemLongTermDocuments {
     @Column(name = "expire_time")
     private Date expireTime;
     private String phone;
-    private String expansion3;
-    private String expansion1;
-    private String expansion2;
     @Column(name = "admin_id")
     private Integer adminId;
     @Column(name = "card_no")

+ 7 - 1
src/main/java/com/yx/face/model/vo/SystemLongTermDocumentsVO.java

@@ -16,9 +16,15 @@ import java.util.Date;
 public class SystemLongTermDocumentsVO {
 
     @ApiModelProperty(value = "id")
-    private String id;
+    private Integer id;
     @ApiModelProperty(value = "姓名")
     private String name;
+
+
+    private Integer adminId;
+
+    private Integer cardNo;
+
     @ApiModelProperty(value = "头像")
     private String photo;
     @ApiModelProperty(value = "身份证号")

+ 2 - 0
src/main/java/com/yx/face/service/SystemLongTermDocumentsService.java

@@ -3,6 +3,7 @@ package com.yx.face.service;
 
 import com.github.pagehelper.PageInfo;
 import com.yx.face.boot.restful.RestDTO;
+import com.yx.face.boot.restful.RestResult;
 import com.yx.face.model.query.FaceDeviceQu;
 import com.yx.face.model.query.SysLongTermDocumentsQu;
 import com.yx.face.model.vo.SystemLongTermDocumentsVO;
@@ -18,4 +19,5 @@ public interface SystemLongTermDocumentsService {
 
     Integer delete(String sn);
 
+    RestResult<String> singleIssue(Integer id);
 }

+ 121 - 10
src/main/java/com/yx/face/service/impl/FaceTBServiceImpl.java

@@ -1,5 +1,6 @@
 package com.yx.face.service.impl;
 
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
@@ -13,6 +14,7 @@ import com.yx.face.boot.uitls.RedisUtil;
 import com.yx.face.dao.*;
 import com.yx.face.model.dto.FacePassDTO;
 import com.yx.face.model.entity.*;
+import com.yx.face.model.vo.SystemLongTermDocumentsVO;
 import com.yx.face.netty_client.NettyClient;
 import com.yx.face.service.FaceTBService;
 //import com.yx.face.service.SuKangMaAipService;
@@ -21,6 +23,7 @@ import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
@@ -28,6 +31,7 @@ import org.springframework.util.StringUtils;
 import javax.annotation.Resource;
 import javax.persistence.Column;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @description: FaceTBServiceImpl <br>
@@ -47,17 +51,18 @@ public class FaceTBServiceImpl implements FaceTBService {
     private UserInfoDao userInfoDao;
     @Resource
     private FaceLogDao faceLogDao;
-
     @Resource
     private SystemConfigDao systemConfigDao;
-//    @Autowired
-//    private SuKangMaAipService suKangMaAipService;
-
+    @Resource
+    private SystemLongTermDocumentsDao systemLongTermDocumentsDao;
     @Autowired
-    private RedisUtil redisUtil;
-
+    private AsyncTriggerRetryImpl asyncTriggerRetry;
+    @Resource
+    private FaceTaskDao faceTaskDao;
     @Autowired
     private TBDeviceFaceService tbDeviceFaceService;
+    @Autowired
+    private RedisUtil redisUtil;
     @Value("${web.address}")
     private String address;
 
@@ -666,9 +671,9 @@ public class FaceTBServiceImpl implements FaceTBService {
             if (verifytype == 0 || verifytype == 2) {
                 faceLogDao.insertSelective(faceLog);
             }
-            Map<String, String> maps = new HashMap<>(1);
-            maps.put("face-log", JSONObject.toJSONString(faceLog));
-            nettyClient.sendMessage(JSON.toJSONString(maps));
+//            Map<String, String> maps = new HashMap<>(1);
+//            maps.put("face-log", JSONObject.toJSONString(faceLog));
+//            nettyClient.sendMessage(JSON.toJSONString(maps));
 
         }
         return result;
@@ -741,8 +746,114 @@ public class FaceTBServiceImpl implements FaceTBService {
 
     @Override
     public void pushUsersOnline(List<Map<String, String>> list) {
+        //获取员工通道
+        List<FaceDevice> faceDeviceList = faceDeviceDao.selectTypeFaceDev(2);
+        if (faceDeviceList.isEmpty()) {
+            log.info("设备为空===========");
+            return;
+        }
+        //获取员工列表
+        List<SystemLongTermDocumentsVO> systemLongTermDocumentsDaoList = systemLongTermDocumentsDao.getList(42, null);
+        if (faceDeviceList.isEmpty()) {
+            log.info("获取员工列表===========");
+            return;
+        }
+        List<SystemLongTermDocumentsVO> mapList = new ArrayList<>();
+        for (SystemLongTermDocumentsVO vo : systemLongTermDocumentsDaoList) {
+            for (Map<String, String> map : list) {
+                String s = map.get(vo.getIdNumber());
+                if (StringUtils.hasText(s)) {
+                    mapList.add(vo);
+                    break;
+                }
+            }
+        }
+        //取差集
+        List<SystemLongTermDocumentsVO> differenceList = systemLongTermDocumentsDaoList.stream()
+                .filter(item -> !mapList.stream()
+                        .map(e -> e.getIdNumber())
+                        .collect(Collectors.toList())
+                        .contains(item.getIdNumber()))
+                .collect(Collectors.toList());
+        String sn = list.get(0).get("SN");
+        FaceDevice faceDeviceBySn = faceDeviceDao.getFaceDeviceBySn(sn);
+        for (SystemLongTermDocumentsVO vo : differenceList) {
+            faceDeviceList(faceDeviceBySn, vo);
+        }
+    }
+
+
+    @Async
+    public void faceDeviceList(FaceDevice faceDevice, SystemLongTermDocumentsVO vo) {
+        //天波人脸服务请求日志表
+        FaceRequestLog requestLog;
+        Date now = new Date();
+        //人脸下发表
+        FacePass facePass;
+        //唯一id
+        Long faceTaskId;
+        //人脸清除定时任务
+        FaceTask faceTask;
+        //人脸下发到设备里面
+        Map<String, Object> params = Maps.newHashMapWithExpectedSize(3);
+        List<Map<String, Object>> data = Lists.newArrayListWithExpectedSize(1);
+        Map<String, Object> dataItem = Maps.newHashMapWithExpectedSize(8);
+        // 下发参数
+        dataItem.put("pin", vo.getCardNo());
+        dataItem.put("name", vo.getName());
+        dataItem.put("validPeriodStart", DateUtil.format(vo.getCreateTime(), "yyyy-MM-dd HH:mm:ss"));
+        dataItem.put("validPeriodEnd", DateUtil.format(vo.getExpireTime(), "yyyy-MM-dd HH:mm:ss"));
+        dataItem.put("userType", 0);
+        dataItem.put("photo", vo.getPhoto());
+        dataItem.put("rightno", 105);
+        dataItem.put("cardid", vo.getIdNumber());
+        data.add(dataItem);
+        params.put("SN", faceDevice.getSn());
+        params.put("Data", data);
+        //天波人脸服务请求日志表
+        requestLog = new FaceRequestLog();
+        requestLog.setName("下发人脸");
+        requestLog.setContext("/downUser");
+        requestLog.setParams(JSONObject.toJSONString(params));
+        requestLog.setStatus(1);
+        requestLog.setUsedTime(0L);
+        requestLog.setUpdateTime(now);
+        requestLog.setCreateTime(now);
+        //人脸下发记录表
+        faceRequestLogDao.insertSelective(requestLog);
+        params.put("taskId", requestLog.getId());
+        //人脸下发表
+        facePass = new FacePass();
+        facePass.setUserId(Long.valueOf(vo.getCardNo()));
+        facePass.setDeviceSn(faceDevice.getSn());
+        facePass.setDeviceId(faceDevice.getId());
+        facePass.setStartTime(vo.getCreateTime());
+        facePass.setEndTime(vo.getExpireTime());
+        facePass.setAdminId(vo.getAdminId());
+        facePass.setStatus(2);
+        facePass.setType(2);
+        facePass.setTaskId(vo.getAdminId().toString());
+        facePass.setUpdateTime(now);
+        facePass.setCreateTime(now);
+        //人脸下发
+        facePassDao.insertSelective(facePass);
+        //数据同步
+        asyncTriggerRetry.send(params, facePass);
+
+        faceTaskId = faceTaskDao.getFaceTaskId(faceDevice.getSn(), Long.valueOf(vo.getCardNo()));
+        faceTask = new FaceTask();
+        faceTask.setId(faceTaskId);
+        faceTask.setTaskTime(facePass.getEndTime());
+        faceTask.setStatus(0);
+        faceTask.setUpdateTime(now);
+        if (faceTaskId == null) {
+            faceTask.setDeviceSn(faceDevice.getSn());
+            faceTask.setUserId(Long.valueOf(vo.getCardNo()));
+            faceTask.setCreateTime(now);
+            faceTaskDao.insertSelective(faceTask);
+        }
+        faceTaskDao.updateByPrimaryKeySelective(faceTask);
 
-        redisUtil.set("1", list);
     }
 
     private String buildImage(String image, String phone) {

+ 131 - 3
src/main/java/com/yx/face/service/impl/SystemLongTermDocumentsServiceImpl.java

@@ -1,21 +1,36 @@
 package com.yx.face.service.impl;
 
 
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.yx.face.boot.restful.RestDTO;
+import com.yx.face.boot.restful.RestResult;
 import com.yx.face.boot.restful.ServiceException;
-import com.yx.face.dao.FaceDeviceDao;
-import com.yx.face.dao.SystemLongTermDocumentsDao;
+import com.yx.face.boot.uitls.DateUtils;
+import com.yx.face.boot.uitls.SMSOrIdCardUtils;
+import com.yx.face.dao.*;
+import com.yx.face.model.entity.*;
 import com.yx.face.model.query.FaceDeviceQu;
 import com.yx.face.model.query.SysLongTermDocumentsQu;
 import com.yx.face.model.vo.SystemLongTermDocumentsVO;
+import com.yx.face.model.vo.UserVisitorListVO;
+import com.yx.face.model.vo.UserWhitelistVO;
 import com.yx.face.service.SystemLongTermDocumentsService;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 
 @Slf4j
@@ -26,6 +41,15 @@ public class SystemLongTermDocumentsServiceImpl implements SystemLongTermDocumen
     private SystemLongTermDocumentsDao systemLongTermDocumentsDao;
     @Resource
     private FaceDeviceDao faceDeviceDao;
+    @Resource
+    private FaceRequestLogDao faceRequestLogDao;
+    @Resource
+    private FacePassDao facePassDao;
+    @Autowired
+    private AsyncTriggerRetryImpl asyncTriggerRetry;
+    @Resource
+    private FaceTaskDao faceTaskDao;
+
 
     @Override
     public PageInfo<SystemLongTermDocumentsVO> getList(RestDTO<SysLongTermDocumentsQu> dto) {
@@ -37,6 +61,14 @@ public class SystemLongTermDocumentsServiceImpl implements SystemLongTermDocumen
 //        }
         PageHelper.startPage(dto.getPageNum(), dto.getPageSize());
         List<SystemLongTermDocumentsVO> list = systemLongTermDocumentsDao.getList(dto.getData().getAdminId(), dto.getData().getName());
+        for (SystemLongTermDocumentsVO vo : list) {
+            if (StringUtils.isNotBlank(vo.getPhone()))
+                vo.setPhone(SMSOrIdCardUtils.hidePhone(vo.getPhone()));
+            if (StringUtils.isNotBlank(vo.getIdNumber()))
+                vo.setIdNumber(SMSOrIdCardUtils.hideIdNumber(vo.getIdNumber()));
+//            if (StringUtils.isNotBlank(vo.getName()))
+//                vo.setName(SMSOrIdCardUtils.hideName(vo.getName().trim()));
+        }
         return new PageInfo<>(list);
     }
 
@@ -50,7 +82,103 @@ public class SystemLongTermDocumentsServiceImpl implements SystemLongTermDocumen
 
     @Override
     public Integer delete(String sn) {
-        Integer update = faceDeviceDao.update(sn, 1, 0);
+        Integer update = faceDeviceDao.update(sn, 0, 0);
         return update;
     }
+
+    @Override
+    public RestResult<String> singleIssue(Integer id) {
+        RestResult<String> objectRestResult = new RestResult<>();
+        //获取员工通道
+        List<FaceDevice> faceDeviceList = faceDeviceDao.selectTypeFaceDev(2);
+        if (faceDeviceList.isEmpty()) {
+            objectRestResult.setCode(401);
+            objectRestResult.setMsg("设备不在线下发失败");
+            return objectRestResult;
+        }
+        SystemLongTermDocuments systemLongTermDocuments = systemLongTermDocumentsDao.selectByPrimaryKey(id);
+        if (systemLongTermDocuments == null) {
+            objectRestResult.setCode(401);
+            objectRestResult.setMsg("未查询到要下发的人员信息");
+            return objectRestResult;
+        }
+        for (FaceDevice face : faceDeviceList) {
+            faceDeviceList(face, systemLongTermDocuments);
+        }
+        objectRestResult.setCode(200);
+        objectRestResult.setMsg("下发成功");
+        return objectRestResult;
+    }
+
+
+    public void faceDeviceList(FaceDevice faceDevice, SystemLongTermDocuments systemLongTermDocuments) {
+        //天波人脸服务请求日志表
+        FaceRequestLog requestLog;
+        Date now = new Date();
+        //人脸下发表
+        FacePass facePass;
+        //唯一id
+        Long faceTaskId;
+        //人脸清除定时任务
+        FaceTask faceTask;
+        //人脸下发到设备里面
+        Map<String, Object> params = Maps.newHashMapWithExpectedSize(3);
+        List<Map<String, Object>> data = Lists.newArrayListWithExpectedSize(1);
+        Map<String, Object> dataItem = Maps.newHashMapWithExpectedSize(8);
+        // 下发参数
+        dataItem.put("pin", systemLongTermDocuments.getCardNo());
+        dataItem.put("name", systemLongTermDocuments.getName());
+        dataItem.put("validPeriodStart", DateUtil.format(systemLongTermDocuments.getCreateTime(), "yyyy-MM-dd HH:mm:ss"));
+        dataItem.put("validPeriodEnd", DateUtil.format(systemLongTermDocuments.getExpireTime(), "yyyy-MM-dd HH:mm:ss"));
+        dataItem.put("userType", 0);
+        dataItem.put("photo", systemLongTermDocuments.getPhoto());
+        dataItem.put("rightno", 105);
+        dataItem.put("cardid", systemLongTermDocuments.getIdNumber());
+        data.add(dataItem);
+        params.put("SN", faceDevice.getSn());
+        params.put("Data", data);
+        //天波人脸服务请求日志表
+        requestLog = new FaceRequestLog();
+        requestLog.setName("下发人脸");
+        requestLog.setContext("/downUser");
+        requestLog.setParams(JSONObject.toJSONString(params));
+        requestLog.setStatus(1);
+        requestLog.setUsedTime(0L);
+        requestLog.setUpdateTime(now);
+        requestLog.setCreateTime(now);
+        //人脸下发记录表
+        faceRequestLogDao.insertSelective(requestLog);
+        params.put("taskId", requestLog.getId());
+        //人脸下发表
+        facePass = new FacePass();
+        facePass.setUserId(Long.valueOf(systemLongTermDocuments.getCardNo()));
+        facePass.setDeviceSn(faceDevice.getSn());
+        facePass.setDeviceId(faceDevice.getId());
+        facePass.setStartTime(systemLongTermDocuments.getCreateTime());
+        facePass.setEndTime(systemLongTermDocuments.getExpireTime());
+        facePass.setAdminId(systemLongTermDocuments.getAdminId());
+        facePass.setStatus(2);
+        facePass.setType(2);
+        facePass.setTaskId(systemLongTermDocuments.getAdminId().toString());
+        facePass.setUpdateTime(now);
+        facePass.setCreateTime(now);
+        //人脸下发
+        facePassDao.insertSelective(facePass);
+        //数据同步
+        asyncTriggerRetry.send(params, facePass);
+
+        faceTaskId = faceTaskDao.getFaceTaskId(faceDevice.getSn(), Long.valueOf(systemLongTermDocuments.getCardNo()));
+        faceTask = new FaceTask();
+        faceTask.setId(faceTaskId);
+        faceTask.setTaskTime(facePass.getEndTime());
+        faceTask.setStatus(0);
+        faceTask.setUpdateTime(now);
+        if (faceTaskId == null) {
+            faceTask.setDeviceSn(faceDevice.getSn());
+            faceTask.setUserId(Long.valueOf(systemLongTermDocuments.getCardNo()));
+            faceTask.setCreateTime(now);
+            faceTaskDao.insertSelective(faceTask);
+        }
+        faceTaskDao.updateByPrimaryKeySelective(faceTask);
+    }
 }

+ 5 - 5
src/main/java/com/yx/face/service/impl/UserInfoServiceImpl.java

@@ -396,12 +396,12 @@ public class UserInfoServiceImpl implements UserInfoService {
             userVisitorOne.setUpdateTime(now);
             userVisitorOne.setAvatar(userInfo.getAvatar());
             userVisitorListDao.updateByPrimaryKeySelective(userVisitorOne);
-            userVisitorOne = userVisitorListDao.selectByPrimaryKey(userVisitorList.getId());
+//            userVisitorOne = userVisitorListDao.selectByPrimaryKey(userVisitorList.getId());
         }
-        //开启异步线程
-        Map<String, String> maps = new HashMap<>(1);
-        maps.put("user-visitor", JSONObject.toJSONString(userVisitorOne));
-        nettyClient.sendMessage(JSON.toJSONString(maps));
+//        //开启异步线程
+//        Map<String, String> maps = new HashMap<>(1);
+//        maps.put("user-visitor", JSONObject.toJSONString(userVisitorOne));
+//        nettyClient.sendMessage(JSON.toJSONString(maps));
     }
 
 

+ 6 - 0
src/main/resources/mapper/FaceDeviceDao.xml

@@ -203,5 +203,11 @@
             </if>
         </where>
     </select>
+    <select id="selectTypeFaceDev" resultType="com.yx.face.model.entity.FaceDevice">
+        SELECT sn ,id
+        FROM face_device
+        WHERE enable = 1 and  online = 1 and  auth = 1
+          AND type = #{type}
+    </select>
 </mapper>
 

+ 2 - 0
src/main/resources/mapper/SystemLongTermDocumentsDao.xml

@@ -10,6 +10,8 @@
         a.create_time AS createTime,
         a.expire_time AS expireTime,
         a.phone,
+        a.admin_id AS adminId,
+        a.card_no   AS   cardNo,
         b.username
         FROM system_long_term_documents AS a
         LEFT JOIN admin AS b on a.admin_id = b.id