jiangping
2024-01-05 cb6874174975a370cb60f1557704c9d49a05f9e6
Merge remote-tracking branch 'origin/master'
已添加9个文件
已修改24个文件
1145 ■■■■■ 文件已修改
server/dmvisit_admin/src/main/java/com/doumee/api/business/ApproveParamController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/CompanyController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/config/Jwt/JwtTokenUtil.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/ApproveMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Approve.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/ApproveParam.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/system/vo/ApproveParamDataVO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/system/vo/ApproveParamVO.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/AccountLoginDTO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/AuditApproveDTO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/VisitMemberDTO.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/VisitRecordDTO.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/web/response/InternalHomeVO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/web/response/MemberVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/web/response/VisitDetailVO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/web/response/VisitRecordVO.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/web/response/WxAuthorizeVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/ApproveParamService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/ApproveService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveParamServiceImpl.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java 393 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/common/tree/CompanyTree.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_web/src/main/java/com/doumee/api/web/ApiController.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_web/src/main/java/com/doumee/api/web/InternalController.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/ApproveParamController.java
@@ -7,6 +7,7 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.model.PageData;
import com.doumee.dao.business.model.ApproveParam;
import com.doumee.dao.system.vo.ApproveParamDataVO;
import com.doumee.service.business.ApproveParamService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -87,4 +88,14 @@
    public ApiResponse findById(@PathVariable Integer id) {
        return ApiResponse.success(approveParamService.findById(id));
    }
    @ApiOperation("获取配置信息")
    @GetMapping("/getApproveParamData")
    @RequiresPermissions("business:approveparam:query")
    public ApiResponse<ApproveParamDataVO> getApproveParamData() {
        return ApiResponse.success(approveParamService.getApproveParamData());
    }
}
server/dmvisit_admin/src/main/java/com/doumee/api/business/CompanyController.java
@@ -12,6 +12,7 @@
import com.doumee.dao.business.model.Company;
import com.doumee.dao.system.dto.UpdateSystemMenuSortDTO;
import com.doumee.service.business.CompanyService;
import com.doumee.service.business.ERPSyncService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -36,6 +37,9 @@
    @Autowired
    private CompanyService companyService;
    @Autowired
    private ERPSyncService erpSyncService;
    @PreventRepeat
    @ApiOperation("新建")
@@ -150,7 +154,7 @@
     */
    @ApiOperation("根据类型查询组织信息")
    @GetMapping("/findCompanyTreePage")
//    @RequiresPermissions("business:company:query")
    @RequiresPermissions("business:company:query")
    public ApiResponse<List<CompanyDTO>> findCompanyTreePage(Integer type){
        return ApiResponse.success(companyService.findCompanyTreePage(type));
    }
@@ -159,9 +163,9 @@
    @ApiOperation("部门信息同步")
    @PostMapping("/sync")
//    @RequiresPermissions("business:company:sync")
    @RequiresPermissions("business:company:sync")
    public ApiResponse sync(){
        //TODO æ‰‹åŠ¨åŒæ­¥ éƒ¨é—¨ä¿¡æ¯
        erpSyncService.syncCompany(null);
        return ApiResponse.success("同步成功");
    }
}
server/dmvisit_service/src/main/java/com/doumee/config/Jwt/JwtTokenUtil.java
@@ -43,6 +43,8 @@
    public static final String HEADER_KEY = "token";
    //取值名称
    public static final String UserId_Name = "AppUserId";
    //取值名称
    public static final String MEMBER = "MEMBER";
    //加密密钥
    private final static String jwtSecret = "MhAjU9poLf8ko54K25XBDtonaL33vtt1";
    //过期时间(s) 86400L=1天 604800L=7天
server/dmvisit_service/src/main/java/com/doumee/config/Jwt/WebMvcConfig.java
@@ -7,6 +7,7 @@
import com.doumee.core.exception.BusinessException;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.redis.RedisUtil;
import com.doumee.dao.business.model.Member;
import io.jsonwebtoken.JwtException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -14,6 +15,7 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.method.HandlerMethod;
@@ -24,6 +26,7 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.Objects;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@@ -98,21 +101,19 @@
            }
            //获取账号ID
            String memberId = JwtTokenUtil.getJwtPayLoad(token).getMemberId();
            Integer isDeleted = dao.queryForObject(" select COALESCE(DELETED,1)  from `system_user` where id  = ?", Integer.class, memberId);
            if(isDeleted== Constants.ONE){
            Member member = dao.queryForObject(" select  *  from `member` where id  = ?  limit 1  ", new BeanPropertyRowMapper<>(Member.class),memberId );
            if(Objects.isNull(member)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY);
            }
            if(member.getIsdeleted()== Constants.ONE){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已删除,请联系管理员");
            }
            Integer isForbidden = dao.queryForObject(" select COALESCE(STATUS,1)  from `system_user` where id  = ?", Integer.class, memberId);
            if(isForbidden== Constants.ONE){
            if(member.getStatus() != Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已禁用,请联系管理员");
            }
            Integer count = dao.queryForObject("select count(1) from `system_user` where id  = ?", Integer.class, memberId);
            if (count != null && count > 0) {
                request.setAttribute(JwtTokenUtil.UserId_Name, memberId);
            request.setAttribute(JwtTokenUtil.MEMBER, member);
                return true;
            }else{
                throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"用户信息出错");
            }
        } catch (IllegalArgumentException | JwtException e) {
            throw new BusinessException(ResponseStatus.NO_LOGIN.getCode(),"未登录");
        }
server/dmvisit_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -207,6 +207,7 @@
    public static final String COFFEE_BEAN_TASK ="COFFEE_BEAN_TASK";
    public static final String HOME_IMAGE ="HOME_IMAGE";
@@ -226,6 +227,8 @@
    public interface RedisKeys {
        public static final String ERP_TOKEN ="ERP_TOKEN";
        public static final long EXPIRE_TIME = 7200;
        public static final String INTERNAL_TOKEN ="INTERNAL_TOKEN";
        public static final String GOODSORDER_KEY = "ordercode_";
        public static final String ACTIVITY_SIGN_KEY = "actcode_";
@@ -288,6 +291,17 @@
    int visitor = 1;//普通访客
    int internal = 2;//内部人员
}
public interface  approveStatus{
    int wait = 0;//待审批
    int auditIng = 1;//审批中
    int pass = 2;//审批通过
    int unPass = 3;//审批未通过
    int otherDeal = 4;//他人已处理
}
    public static void main(String[] args) {
        String t = URLDecoder.decode("https://lsqw.gtja.com/qwcos/v-index.html#/loginforProperty?corpId=ww4b7aefafeb430e4b&corpId=ww4b7aefafeb430e4b&agentId=1000005&agentId=1000005&fromRoute=&userCode=013561&userCode=&userId=zz&userId=&encryptUserCode=&custQwId=wmIUuSDgAAR8MhtVY8w90EyKltvoK5fA&custCode=&openId=op1wZwD1dKuBQywmWWS5957zUOJI&name=%E8%B9%84%E8%B9%84&headUrl=http%3A%2F%2Fwx.qlogo.cn%2Fmmhead%2FQ3auHgzwzM4QlibSOAvYcvRMdsoyF3Ua7duLOYSJfB3dsGsYxIYonBw%2F0&dbHeadUrl=https%3A%2F%2Ftgf.gtja.com%2Ff%2F%2Fqwoms%2F2022512%2Fqwoms_1652332606613_8.jpg");
        System.out.println(t);
server/dmvisit_service/src/main/java/com/doumee/dao/business/ApproveMapper.java
@@ -2,6 +2,9 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.Approve;
import com.doumee.dao.business.model.Member;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
@@ -9,4 +12,7 @@
 */
public interface ApproveMapper extends BaseMapper<Approve> {
    void insertBatchSomeColumn(List<Approve> list);
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Approve.java
@@ -61,14 +61,14 @@
    @ApiModelProperty(value = "审批模板编码")
    @ExcelColumn(name="审批模板编码")
    private String templatId;
    private Integer templatId;
    @ApiModelProperty(value = "ERP审批编码")
    @ExcelColumn(name="ERP审批编码")
    private String erpId;
    @ApiModelProperty(value = "审批状态 0待审批 1审批中 2审批通过 3审批未通过", example = "1")
    @ExcelColumn(name="审批状态 0待审批 1审批中 2审批通过 3审批未通过")
    @ApiModelProperty(value = "审批状态 0待审批 1审批中 2审批通过 3审批未通过 4他人已处理", example = "1")
    @ExcelColumn(name="审批状态 0待审批 1审批中 2审批通过 3审批未通过 4他人已处理")
    private Integer status;
    @ApiModelProperty(value = "状态信息")
@@ -103,4 +103,7 @@
    @ExcelColumn(name="多人审批方式 0或签 1会签")
    private Integer approveType;
    @ApiModelProperty(value = "类型 0审批 1抄送", example = "1")
    @ExcelColumn(name="类型 0审批 1抄送")
    private Integer type;
}
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/ApproveParam.java
@@ -57,7 +57,7 @@
    @ApiModelProperty(value = "审批人类型 0被访人 1指定人员 2部门主管")
    @ExcelColumn(name="审批人类型 0被访人 1指定人员 2部门主管")
    private String memberType;
    private Integer memberType;
    @ApiModelProperty(value = "等级", example = "1")
    @ExcelColumn(name="等级")
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
@@ -223,6 +223,12 @@
    @ExcelColumn(name="ERP申请记录编码")
    private String erpId;
    @ApiModelProperty(value = "创建人编码(关联member表)", example = "1")
    @ExcelColumn(name="创建人编码(关联member表)")
    private Integer createMemberId;
    @ApiModelProperty(value = "普通访客申请随访人员")
    @TableField(exist = false)
    private List<Visits> withUserList;
server/dmvisit_service/src/main/java/com/doumee/dao/system/vo/ApproveParamDataVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.doumee.dao.system.vo;
import com.doumee.dao.business.model.ApproveParam;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * å®¡æ‰¹æ¨¡ç‰ˆé…ç½®ä¿¡æ¯è¡¨
 * @author æ±Ÿè¹„蹄
 * @date 2023/12/28 11:46
 */
@Data
public class ApproveParamDataVO {
    @ApiModelProperty(value = "审批人员配置信息")
    private List<ApproveParam> auditApproveList;
    @ApiModelProperty(value = "抄送人员配置信息")
    private ApproveParam  copyForConfig;
}
server/dmvisit_service/src/main/java/com/doumee/dao/system/vo/ApproveParamVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.doumee.dao.system.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * å®¡æ‰¹æ¨¡ç‰ˆé…ç½®ä¿¡æ¯è¡¨
 * @author æ±Ÿè¹„蹄
 * @date 2023/12/28 11:46
 */
@Data
public class ApproveParamVO {
    @ApiModelProperty(value = "主键", example = "1")
    private Integer id;
    @ApiModelProperty(value = "类型", example = "1")
    private Integer type;
    @ApiModelProperty(value = "审批人类型 0被访人 1指定人员 2部门主管")
    private Integer memberType;
    @ApiModelProperty(value = "等级", example = "1")
    private Integer level;
    @ApiModelProperty(value = "审批人姓名,多个用英文逗号隔开")
    private String objNames;
    @ApiModelProperty(value = "审批人编码,多个用英文逗号隔开")
    private String objIds;
    @ApiModelProperty(value = "审批主管等级 0直接主管 1二级主管 2三级主管 4四级主管", example = "1")
    private Integer objLevel;
    @ApiModelProperty(value = "多人审批方式 0或签 1会签", example = "1")
    private Integer approveType;
    @ApiModelProperty(value = "无主管选项 0流程结束 1由上级主管代替审核", example = "1")
    private Integer noleaderOpt;
}
server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/AccountLoginDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.dao.web.reqeust;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/12/7 11:19
 */
@Data
public class AccountLoginDTO {
    @NotBlank(message = "身份证号码未录入")
    @ApiModelProperty(value = "身份证号码")
    private String account;
    @NotBlank(message = "密码未录入")
    @ApiModelProperty(value = "密码")
    private String password;
    @ApiModelProperty(value = "openId")
    private String openId;
}
server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/AuditApproveDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.doumee.dao.web.reqeust;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2024/1/4 16:17
 */
@Data
public class AuditApproveDTO {
    @ApiModelProperty(value = "审批记录主键")
    private Integer id;
    @ApiModelProperty(value = "审批状态:2=通过;3=未通过")
    private Integer status;
    @ApiModelProperty(value = "审批备注")
    private String checkInfo;
    @ApiModelProperty(value = "审批操作人", hidden = true )
    private Integer memberId;
}
server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/VisitMemberDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.doumee.dao.web.reqeust;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/12/7 11:19
 */
@Data
public class VisitMemberDTO {
    @ApiModelProperty(value = "名称")
    private String name;
    @ApiModelProperty(value = "手机号")
    private String phone;
}
server/dmvisit_service/src/main/java/com/doumee/dao/web/reqeust/VisitRecordDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.doumee.dao.web.reqeust;
import com.doumee.core.utils.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/12/7 11:19
 */
@Data
public class VisitRecordDTO {
    @ApiModelProperty(value = "来访人员名称")
    private String name;
    @ApiModelProperty(value = "创建时间开始 yyyy-MM-dd HH:mm:ss")
    private String createTimeS;
    @ApiModelProperty(value = "创建时间结束 yyyy-MM-dd HH:mm:ss")
    private String createTimeE;
    @ApiModelProperty(value = "访客记录类型: 0劳务访客 1普通访客")
    private Integer type;
    @ApiModelProperty(value = "查询状态:0=待审批;1=已审批;2=我发起的")
    private Integer state;
    @ApiModelProperty(value = "用户主键",hidden = true)
    private Integer memberId;
}
server/dmvisit_service/src/main/java/com/doumee/dao/web/response/InternalHomeVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.doumee.dao.web.response;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class InternalHomeVO {
    @ApiModelProperty(value = "主页图片")
    private String homeImg;
    @ApiModelProperty(value = "待处理任务数量")
    private Integer taskNum;
}
server/dmvisit_service/src/main/java/com/doumee/dao/web/response/MemberVO.java
@@ -32,4 +32,9 @@
    @ApiModelProperty(value = "手机号")
    private String phone;
    @ApiModelProperty(value = "人脸图片")
    private String faceImg;
    @ApiModelProperty(value = "图片前缀")
    private String prefixUrl;
}
server/dmvisit_service/src/main/java/com/doumee/dao/web/response/VisitDetailVO.java
@@ -36,4 +36,29 @@
    @ApiModelProperty(value = "随访人员信息")
    private List<Visits> withVisitsList;
    @ApiModelProperty(value = "头像前缀")
    private String prefix;
    @ApiModelProperty(value = "来访人姓名")
    private String name;
    @ApiModelProperty(value = "健康证")
    private String imgUrl;
    @ApiModelProperty(value = "人脸照片")
    private String faceImg;
    @ApiModelProperty(value = "证件显示信息")
    private String idCardDecode;
    @ApiModelProperty(value = "来访人公司")
    private String companyName;
    @ApiModelProperty(value = "被访人部门")
    private String visitUserCompany;
}
server/dmvisit_service/src/main/java/com/doumee/dao/web/response/VisitRecordVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.doumee.dao.web.response;
import com.doumee.core.utils.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2024/1/2 9:51
 */
@Data
public class VisitRecordVO {
    @ApiModelProperty(value = "主键")
    private Integer id;
    @ApiModelProperty(value = "访客姓名")
    private String name;
    @ApiModelProperty(value = "进厂日期")
    private String startTime;
    @ApiModelProperty(value = "出厂日期")
    private String endTime;
    @ApiModelProperty(value = "入厂人数")
    private Integer inNum;
    @ApiModelProperty(value = "来访事由")
    private String reason;
    @ApiModelProperty(value = "创建时间")
    private String createDate;
}
server/dmvisit_service/src/main/java/com/doumee/dao/web/response/WxAuthorizeVO.java
@@ -15,4 +15,7 @@
    @ApiModelProperty(value = "授权OPENID")
    private String openid;
    @ApiModelProperty(value = "用户token")
    private String token;
}
server/dmvisit_service/src/main/java/com/doumee/service/business/ApproveParamService.java
@@ -3,6 +3,8 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.ApproveParam;
import com.doumee.dao.system.vo.ApproveParamDataVO;
import java.util.List;
/**
@@ -94,4 +96,11 @@
     * @return long
     */
    long count(ApproveParam approveParam);
    /**
     * èŽ·å–é…ç½®ä¿¡æ¯
     * @return
     */
    ApproveParamDataVO getApproveParamData();
}
server/dmvisit_service/src/main/java/com/doumee/service/business/ApproveService.java
@@ -3,6 +3,8 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Approve;
import com.doumee.dao.web.response.InternalHomeVO;
import java.util.List;
/**
@@ -94,4 +96,12 @@
     * @return long
     */
    long count(Approve approve);
    /**
     * èŽ·å–å†…éƒ¨äººå‘˜é¦–é¡µæ•°æ®
     * @param memberId
     * @return
     */
    InternalHomeVO getHomeData(Integer memberId);
}
server/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -9,7 +9,9 @@
import com.doumee.dao.admin.request.MemberQuery;
import com.doumee.dao.admin.response.MemberInfoDTO;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.web.reqeust.AccountLoginDTO;
import com.doumee.dao.web.reqeust.CheckVisitedDTO;
import com.doumee.dao.web.reqeust.VisitMemberDTO;
import com.doumee.dao.web.response.MemberVO;
import com.doumee.dao.web.response.WxAuthorizeVO;
@@ -178,5 +180,18 @@
    MemberVO getVisitedMember(CheckVisitedDTO checkVisitedDTO);
    /**
     * è´¦å·å¯†ç 
     * å†…部人员/劳务访客登录
     * @param accountLoginDTO
     * @return
     */
    WxAuthorizeVO accountLogin(AccountLoginDTO accountLoginDTO);
    /**
     * å†…部可拜访人员分页
     * @param param
     * @return
     */
    PageData<MemberVO> getVisitedMemberList(PageWrap<VisitMemberDTO> param);
}
server/dmvisit_service/src/main/java/com/doumee/service/business/VisitsService.java
@@ -3,7 +3,10 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Visits;
import com.doumee.dao.web.reqeust.AuditApproveDTO;
import com.doumee.dao.web.reqeust.VisitRecordDTO;
import com.doumee.dao.web.response.VisitDetailVO;
import com.doumee.dao.web.response.VisitRecordVO;
import java.util.List;
@@ -107,4 +110,18 @@
     * @return
     */
    VisitDetailVO getVisitDetail(Integer id);
    /**
     * å†…部人员 ä»»åŠ¡ä¸­å¿ƒ
     * @param param
     * @return
     */
    PageData<VisitRecordVO> taskCenter(PageWrap<VisitRecordDTO> param);
    /**
     * è®¿å®¢è®°å½•审批流审批
     * @param auditApproveDTO
     */
    void auditApprove(AuditApproveDTO auditApproveDTO);
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveParamServiceImpl.java
@@ -1,10 +1,14 @@
package com.doumee.service.business.impl;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.ApproveParamMapper;
import com.doumee.dao.business.model.ApproveParam;
import com.doumee.dao.system.vo.ApproveParamDataVO;
import com.doumee.service.business.ApproveParamService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -15,6 +19,9 @@
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
/**
 * å®¡æ‰¹æ¨¡ç‰ˆé…ç½®ä¿¡æ¯è¡¨Service实现
@@ -29,9 +36,62 @@
    @Override
    public Integer create(ApproveParam approveParam) {
        this.checkData(approveParam);
        approveParamMapper.insert(approveParam);
        return approveParam.getId();
    }
    /**
     * éªŒè¯æ•°æ®å¿…å¡«
     * @param approveParam
     */
    public void checkData(ApproveParam approveParam){
        if(Objects.isNull(approveParam)
                ||Objects.isNull(approveParam.getType())
                ||Objects.isNull(approveParam.getMemberType())
                ||Objects.isNull(approveParam.getLevel())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        if(approveParam.getType().equals(Constants.ZERO)){
            if(approveParam.getMemberType().equals(Constants.ONE)
                    &&
                    (Objects.isNull(approveParam.getObjIds())||Objects.isNull(approveParam.getObjNames()))
            ){
                //指定人员类型 åˆ¤æ–­æ•°æ®å¿…å¡«
                throw new BusinessException(ResponseStatus.BAD_REQUEST);
            }else if(approveParam.getMemberType().equals(Constants.TWO)
                    &&
                    (Objects.isNull(approveParam.getObjLevel())||Objects.isNull(approveParam.getNoleaderOpt()))
            ){
                //指定部门主管 åˆ¤æ–­æ•°æ®å¿…å¡«
                throw new BusinessException(ResponseStatus.BAD_REQUEST);
            }
        }else{
            if(Objects.isNull(approveParam.getObjIds())||Objects.isNull(approveParam.getObjNames())){
                //指定人员类型 åˆ¤æ–­æ•°æ®å¿…å¡«
                throw new BusinessException(ResponseStatus.BAD_REQUEST);
            }
        }
    }
    @Override
    public ApproveParamDataVO getApproveParamData(){
        ApproveParamDataVO approveParamDataVO = new ApproveParamDataVO();
        List<ApproveParam> approveParamList = approveParamMapper.selectList(new QueryWrapper<ApproveParam>()
                .lambda().eq(ApproveParam::getIsdeleted,Constants.ZERO)
                .orderByAsc(ApproveParam::getLevel)
        );
        approveParamDataVO.setAuditApproveList(approveParamList.stream().filter(m->m.getType().equals(Constants.ZERO)).collect(Collectors.toList()));
        Optional<ApproveParam> paramOptional = approveParamList.stream().filter(m->m.getType().equals(Constants.ONE)).findFirst();
        if(paramOptional.isPresent()){
            approveParamDataVO.setCopyForConfig(paramOptional.get());
        }
        return approveParamDataVO;
    }
    @Override
    public void deleteById(Integer id) {
@@ -54,6 +114,7 @@
    @Override
    public void updateById(ApproveParam approveParam) {
        this.checkData(approveParam);
        approveParamMapper.updateById(approveParam);
    }
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java
@@ -1,10 +1,13 @@
package com.doumee.service.business.impl;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.ApproveMapper;
import com.doumee.dao.business.model.Approve;
import com.doumee.dao.web.response.InternalHomeVO;
import com.doumee.service.business.ApproveService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -26,6 +29,9 @@
    @Autowired
    private ApproveMapper approveMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    public Integer create(Approve approve) {
@@ -166,4 +172,24 @@
        QueryWrapper<Approve> wrapper = new QueryWrapper<>(approve);
        return approveMapper.selectCount(wrapper);
    }
    /**
     * å†…部人员H5页面首页
     * @param memberId
     * @return
     */
    @Override
    public InternalHomeVO getHomeData(Integer memberId){
        InternalHomeVO internalHomeVO = new InternalHomeVO();
        internalHomeVO.setHomeImg(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.HOME_IMAGE).getCode());
        internalHomeVO.setTaskNum(approveMapper.selectCount(new QueryWrapper<Approve>().lambda().eq(Approve::getChekorId,memberId).eq(Approve::getStatus,Constants.ZERO)));
        return internalHomeVO;
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -19,8 +19,10 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DESUtil;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.core.utils.Utils;
import com.doumee.core.utils.redis.RedisUtil;
import com.doumee.core.wx.WXConstant;
import com.doumee.dao.admin.request.LaborEmpowerDTO;
import com.doumee.dao.admin.request.LaborMemberDTO;
@@ -32,8 +34,12 @@
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.model.SystemDictData;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.web.reqeust.AccountLoginDTO;
import com.doumee.dao.web.reqeust.CheckVisitedDTO;
import com.doumee.dao.web.reqeust.VisitMemberDTO;
import com.doumee.dao.web.reqeust.VisitRecordDTO;
import com.doumee.dao.web.response.MemberVO;
import com.doumee.dao.web.response.VisitRecordVO;
import com.doumee.dao.web.response.WxAuthorizeVO;
import com.doumee.service.business.MemberService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -47,6 +53,7 @@
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -86,6 +93,10 @@
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private UserActionJoinMapper userActionJoinMapper;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    @Override
    public Integer create(Member member) {
@@ -799,17 +810,24 @@
        Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
                .eq(Member::getOpenid,openId)
                .eq(Member::getIsdeleted,Constants.ZERO)
                .ne(Member::getType,Constants.memberType.visitor)
        );
        //非访客用户 è¿›è¡Œåˆ¤æ–­æ˜¯å¦å­˜åœ¨ç”¨æˆ·
        if(Objects.isNull(member)&&!member.getType().equals(Constants.memberType.visitor)){
            if(member.getIsdeleted() == Constants.ONE){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已删除,请联系管理员");
            }
            if(member.getStatus() != Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已禁用,请联系管理员");
            }
            JwtPayLoad payLoad = new JwtPayLoad(Integer.toString(member.getId()));
            String token = JwtTokenUtil.generateToken(payLoad);
            //存储token至redis
            RedisUtil.addObject(redisTemplate,Constants.RedisKeys.INTERNAL_TOKEN+"_"+member.getId(),token,Constants.RedisKeys.EXPIRE_TIME);
            wxAuthorizeVO.setToken(token);
        }
        return wxAuthorizeVO;
    }
@@ -841,7 +859,85 @@
    @Override
    public PageData<MemberVO> getVisitedMemberList(PageWrap<VisitMemberDTO> param) {
        VisitMemberDTO visitMemberDTO = param.getModel();
        IPage<Member> page = new Page<>(param.getPage(), param.getCapacity());
        MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(visitMemberDTO);
        queryWrapper.selectAs(Member::getId,MemberVO::getId);
        queryWrapper.selectAs(Member::getName,MemberVO::getName);
        queryWrapper.selectAs(Member::getPhone,MemberVO::getPhone);
        queryWrapper.selectAs(Member::getCompanyId,MemberVO::getCompanyId);
        queryWrapper.selectAs(Member::getFaceImg,MemberVO::getFaceImg);
        queryWrapper.eq(Member::getIsdeleted,Constants.ZERO);
        queryWrapper.eq(Member::getStatus,Constants.ZERO);
        queryWrapper.eq(Member::getCanVisit,Constants.ONE);
        queryWrapper.eq(Member::getType,Constants.memberType.internal);
        if(!Objects.isNull(visitMemberDTO)){
            queryWrapper.and(StringUtils.isNotBlank(visitMemberDTO.getName()), ms->ms.like(Member::getPhone,visitMemberDTO.getName())
                    .or().like(Member::getPhone,visitMemberDTO.getName()));
        }
        queryWrapper.orderByDesc(Visits::getCreateDate);
        IPage<MemberVO> result = memberJoinMapper.selectJoinPage(page, MemberVO.class,queryWrapper);
        String prefixUrl = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() +
                systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
        result.getRecords().forEach(i->{
            i.setPrefixUrl(prefixUrl);
        });
        return PageData.from(result);
    }
    @Override
    public WxAuthorizeVO accountLogin(AccountLoginDTO accountLoginDTO){
        if(accountLoginDTO.getAccount().length()!=18
            //&&!IdcardUtil.isValidCard(accountLoginDTO.getAccount())
        ){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,身份证号码有误,请核实后重试!");
        }
        Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
                .eq(Member::getIdcardNo, DESUtil.encrypt(Constants.EDS_PWD, accountLoginDTO.getAccount()))
                .ne(Member::getType,Constants.memberType.visitor)
        );
        if(Objects.isNull(member)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未查询到用户,请联系管理员");
        }
        if(member.getIsdeleted() == Constants.ONE){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已删除,请联系管理员");
        }
        if(member.getStatus() != Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已禁用,请联系管理员");
        }
        String md5Password = DESUtil.encrypt(Constants.EDS_PWD, accountLoginDTO.getPassword());
        if(!md5Password.equals(member.getPassward())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"账户密码错误!");
        }
        if(StringUtils.isNotBlank(accountLoginDTO.getOpenId())){
            //先清空原有访客的openid绑定关系
            memberMapper.update(null, new UpdateWrapper<Member>().lambda()
                    .ne(Member::getType,Constants.memberType.visitor)
                    .eq(Member::getOpenid,accountLoginDTO.getOpenId())
                    .set(Member::getOpenid,null)
            );
            //更新当前登录用户 openId
            member.setOpenid(accountLoginDTO.getOpenId());
            memberMapper.updateById(member);
        }
        WxAuthorizeVO wxAuthorizeVO = new WxAuthorizeVO();
        JwtPayLoad payLoad = new JwtPayLoad(Integer.toString(member.getId()));
        String token = JwtTokenUtil.generateToken(payLoad);
        //存储token至redis
        RedisUtil.addObject(redisTemplate,Constants.RedisKeys.INTERNAL_TOKEN+"_"+member.getId(),token,Constants.RedisKeys.EXPIRE_TIME);
        wxAuthorizeVO.setToken(token);
        return wxAuthorizeVO;
    }
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -1,12 +1,15 @@
package com.doumee.service.business.impl;
import cn.hutool.core.util.IdcardUtil;
import com.alibaba.fastjson.JSONObject;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.erp.ErpConstants;
import com.doumee.core.erp.ErpTool;
import com.doumee.core.erp.model.openapi.request.VisitListRequest;
import com.doumee.core.erp.model.openapi.request.erp.ApproveAddRequest;
import com.doumee.core.erp.model.openapi.request.erp.UserInfoRequest;
import com.doumee.core.erp.model.openapi.response.VisitEventListResponse;
import com.doumee.core.erp.model.openapi.response.erp.ApproveInfoResponse;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
@@ -24,14 +27,17 @@
import com.doumee.core.utils.Utils;
import com.doumee.core.wx.wxPlat.WxPlatNotice;
import com.doumee.dao.admin.response.MemberInfoDTO;
import com.doumee.dao.business.DeviceRoleMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.ProblemLogMapper;
import com.doumee.dao.business.VisitsMapper;
import com.doumee.dao.business.*;
import com.doumee.dao.business.join.DeviceJoinMapper;
import com.doumee.dao.business.join.VisitEventJoinMapper;
import com.doumee.dao.business.join.VisitsJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.web.reqeust.AuditApproveDTO;
import com.doumee.dao.web.reqeust.VisitRecordDTO;
import com.doumee.dao.web.response.InternalHomeVO;
import com.doumee.dao.web.response.VisitDetailVO;
import com.doumee.dao.web.response.VisitRecordVO;
import com.doumee.service.business.ApproveService;
import com.doumee.service.business.VisitsService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -61,6 +67,10 @@
    @Autowired
    private VisitsMapper visitsMapper;
    @Autowired
    private ApproveMapper approveMapper;
    @Autowired
    private ApproveParamMapper approveParamMapper;
    @Autowired
    private DeviceRoleMapper deviceRoleMapper;
    @Autowired
    private ProblemLogMapper problemLogMapper ;
@@ -68,7 +78,8 @@
    private MemberMapper memberMapper ;
    @Autowired
    private VisitsJoinMapper visitsJoinMapper;
    @Autowired
    private CompanyMapper companyMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
@@ -125,12 +136,333 @@
        visitsMapper.insert(visits);
        initWithVisitInfo(visits);
        updateProblemLog(visits,problemLog,member);
        //创建审批记录
        createApprove(visits,visitMember);
        //发送微信公众号通知
        wxPlatNotice.sendVisitAuditTemplateNotice(visits,
                systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_PREFIX).getCode(),
                systemDictDataBiz.queryByCode(Constants.WX_PLATFORM,Constants.WX_PLATFORM_AUDIT_VISIT).getCode());
        return visits.getId();
    }
    /**
     * åˆ›å»ºå®¡æ‰¹è®°å½•
     * @param visits
     * @param visitMember
     */
    public void createApprove(Visits visits,Member visitMember){
        List<Integer> approveIds = new ArrayList<>();
        ApproveParam approveParam = null;//this.getApproveIds(1,visitMember,approveIds);
        //创建待审批记录
        //获取审批配置主键
        Integer firstApproveId = this.checkFirstAudit();
        //内部人员创建 ä¸”创建人与被访问人相同
        if(!Objects.isNull(visits.getCreateMemberId())//内部人员发布
                &&visits.getCreateMemberId().equals(visitMember.getId())//创建人员与被访问人员是否是同一人
                &&!Objects.isNull(firstApproveId)//审批配置第一级为 è¢«è®¿é—®äººå®¡æ‰¹
        ){
            approveParam = this.getApproveIds(2,visitMember,approveIds);
            Approve approve = new Approve();
            approve.setCreateDate(new Date());
            approve.setIsdeleted(Constants.ZERO);
            approve.setCheckInfo("自动审批");
            approve.setTemplatId(firstApproveId);
            approve.setIsEndCheck(Constants.ZERO);
            approve.setType(Constants.ZERO);
            approve.setLevel(Constants.ONE);
            approve.setVisitId(visits.getId());
            approveMapper.insert(approve);
            if(!CollectionUtils.isNotEmpty(approveIds)){
                approve.setIsEndCheck(Constants.ONE);
                visits.setStatus(Constants.TWO);
                visitsMapper.updateById(visits);
                //存储抄送记录
                this.saveCopyFor(visits.getId());
            }
        }else{
            approveParam = this.getApproveIds(null,visitMember,approveIds);
            if(!CollectionUtils.isNotEmpty(approveIds)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"无有效的审批配置,请联系管理员");
            }
        }
        if(!Objects.isNull(approveIds)){
            //创建下一级审批记录
            this.saveAuditRecord(visits.getId(),approveIds,approveParam);
        }
    }
    /**
     * å®¡æ‰¹ å®¡æ‰¹è®°å½• æˆ–ç­¾ å®¡æ‰¹é€šè¿‡è¿›å…¥ä¸‹ä¸€æ­¥  ä¼šç­¾ æ£€æµ‹æ˜¯å¦æ˜¯æœ€åŽä¸€æ¡å¾…审批
     * @param auditApproveDTO
     */
    @Override
    public void auditApprove(AuditApproveDTO auditApproveDTO){
        Approve approve = approveMapper.selectById(auditApproveDTO.getId());
        if(Objects.isNull(approve)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(approve.getStatus().equals(Constants.approveStatus.wait)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"审批记录已处理!");
        }
        Visits visits = visitsMapper.selectById(approve.getVisitId());
        if(Objects.isNull(visits)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(!auditApproveDTO.getMemberId().equals(approve.getChekorId())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"人员信息匹配错误!");
        }
        //被访人
        Member visitMember = memberMapper.selectById(visits.getReceptMemberId());
        List<Integer> approveIds = new ArrayList<>();
        ApproveParam approveParam = this.getApproveIds(approve.getLevel()+1,visitMember,approveIds);
        approve.setStatus(auditApproveDTO.getStatus());
        approve.setEditDate(new Date());
        approve.setChekorId(auditApproveDTO.getMemberId());
        approve.setCheckInfo(auditApproveDTO.getCheckInfo());
        approveMapper.updateById(approve);
        if(auditApproveDTO.getStatus().equals(Constants.approveStatus.pass)){
            if(approve.getApproveType().equals(Constants.ONE)){
                //会签 æŸ¥è¯¢æ˜¯å¦æ˜¯æœ€åŽä¸€æ¡è®°å½• å¦‚果是最后一条记录 åˆ™ç”Ÿæˆä¸‹çº§å®¡æ‰¹è®°å½• å¦‚果是最后一级,则进行审批确认
                if(approveMapper.selectCount(new QueryWrapper<Approve>().lambda()
                        .eq(Approve::getVisitId,visits.getId())
                        .eq(Approve::getLevel,approve.getLevel())
                        .ne(Approve::getId,approve.getId())
                )<=Constants.ZERO){
                    //当前审批级别 æœ€åŽä¸€æ¡å¾…审批记录
                    if(!CollectionUtils.isNotEmpty(approveIds)){
                        //没有下级审批流则 ä¿®æ”¹è®¿å®¢è®°å½•主键
                        visits.setStatus(auditApproveDTO.getStatus());
                        visits.setCheckDate(new Date());
                        visits.setCheckorId(auditApproveDTO.getMemberId());
                        visitsMapper.updateById(visits);
                    }else{
                        this.saveAuditRecord(visits.getId(),approveIds,approveParam);
                    }
                }
            }else{
                //或签
                approveMapper.update(null,new UpdateWrapper<Approve>().lambda()
                        .set(Approve::getStatus,Constants.approveStatus.otherDeal)
                        .set(Approve::getEditDate,new Date())
                        .set(Approve::getCheorId,auditApproveDTO.getMemberId())
                        .eq(Approve::getVisitId,visits.getId())
                        .eq(Approve::getStatus,Constants.approveStatus.wait)
                        .ne(Approve::getId,approve.getId())
                        .eq(Approve::getLevel,approve.getLevel())
                );
                if(!CollectionUtils.isNotEmpty(approveIds)){
                    //没有下级审批流则 ä¿®æ”¹è®¿å®¢è®°å½•主键
                    visits.setStatus(auditApproveDTO.getStatus());
                    visits.setCheckDate(new Date());
                    visits.setCheckorId(auditApproveDTO.getMemberId());
                    visitsMapper.updateById(visits);
                }else{
                    this.saveAuditRecord(visits.getId(),approveIds,approveParam);
                }
            }
        }else if(auditApproveDTO.getStatus().equals(Constants.approveStatus.unPass)){
            visits.setStatus(auditApproveDTO.getStatus());
            visits.setCheckDate(new Date());
            visits.setCheckorId(auditApproveDTO.getMemberId());
            visitsMapper.updateById(visits);
            approveMapper.update(null,new UpdateWrapper<Approve>().lambda()
                    .set(Approve::getStatus,Constants.approveStatus.otherDeal)
                    .set(Approve::getEditDate,new Date())
                    .set(Approve::getCheorId,auditApproveDTO.getMemberId())
                    .eq(Approve::getVisitId,visits.getId())
                    .eq(Approve::getStatus,Constants.approveStatus.wait)
                    .ne(Approve::getId,approve.getId())
                    .eq(Approve::getLevel,approve.getLevel())
            );
        }else{
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"审批状态错误!");
        }
    }
    /**
     * å­˜å‚¨æŠ„送记录
     * @param visitId
     */
    public void  saveCopyFor(Integer visitId){
        ApproveParam approveParam = approveParamMapper.selectOne(new QueryWrapper<ApproveParam>().lambda()
                .eq(ApproveParam::getIsdeleted,Constants.ZERO)
                .eq(ApproveParam::getType,Constants.ONE)
                .eq(ApproveParam::getLevel,Constants.ONE)
                .last("limit 1"));
        if(Objects.isNull(approveParam)){
            return;
        }
        if(StringUtils.isNotBlank(approveParam.getObjIds())){
            String [] ids = approveParam.getObjIds().split(",");
            List<Approve> approveList = new ArrayList<>();
            for (String id:ids) {
                Approve approve = new Approve();
                approve.setCreateDate(new Date());
                approve.setIsdeleted(Constants.ZERO);
                approve.setCheckInfo("抄送记录");
                approve.setTemplatId(approveParam.getId());
                approve.setChekorId(Integer.valueOf(id));
                approve.setType(Constants.ONE);
                approve.setVisitId(visitId);
                approveList.add(approve);
            }
            approveMapper.insertBatchSomeColumn(approveList);
        }
    }
    /**
     * å­˜å‚¨ä¸‹çº§å®¡æ‰¹è®°å½•
     * @param visitId
     * @param ids
     * @param approveParam
     */
    public void  saveAuditRecord(Integer visitId,List<Integer> ids,ApproveParam approveParam){
        if(CollectionUtils.isNotEmpty(ids)) {
            List<Approve> approveList = new ArrayList<>();
            for (Integer id:ids) {
                Approve approve = new Approve();
                approve.setCreateDate(new Date());
                approve.setIsdeleted(Constants.ZERO);
                approve.setStatus(Constants.ZERO);
                approve.setCheckInfo("抄送记录");
                approve.setTemplatId(approveParam.getId());
                approve.setLevel(approveParam.getLevel());
                approve.setApproveType(approveParam.getApproveType());
                approve.setChekorId(id);
                approve.setType(Constants.ONE);
                approve.setVisitId(visitId);
                approveList.add(approve);
            }
            approveMapper.insertBatchSomeColumn(approveList);
        }
    }
    /**
     * åˆ¤æ–­ä¸€çº§å®¡æ‰¹äººæ˜¯å¦æ˜¯åˆ›å»ºäºº
     * @return
     */
    public Integer checkFirstAudit(){
        ApproveParam approveParam = approveParamMapper.selectOne(new QueryWrapper<ApproveParam>().lambda()
                .eq(ApproveParam::getIsdeleted,Constants.ZERO)
                .eq(ApproveParam::getType,Constants.ZERO)
                .eq(ApproveParam::getLevel,Constants.ONE)
                .eq(ApproveParam::getMemberType,Constants.ZERO)
                .last("limit 1"));
         return  Objects.isNull(approveParam)?null:approveParam.getId();
    }
    /**
     * åˆ›å»ºå®¡æ‰¹äººå‘˜ä¿¡æ¯ è‹¥è¿”回待审批人员主键列表为空,则无审批人员 æŠ›å‡ºå¯¹åº”异常
     * @param level   å¤„理级别
     * @param visitMember è¢«è®¿äºº
     */
    public ApproveParam getApproveIds(Integer level,Member visitMember,List<Integer> ids){
        //查询审批配置项
        List<ApproveParam> allParam = approveParamMapper.selectList(new QueryWrapper<ApproveParam>().lambda()
                .eq(ApproveParam::getIsdeleted,Constants.ZERO)
                .eq(ApproveParam::getType,Constants.ZERO)
                .ge(!Objects.isNull(level),ApproveParam::getLevel,level)
                .orderByAsc(ApproveParam::getLevel));
        ApproveParam approveParam = new ApproveParam();
        //发送审批/抄送记录的用户主键集合
        ids.clear();
        if(Objects.isNull(allParam)){
            if(Objects.isNull(level)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未配置访客记录审批流,请联系管理员");
            }
        }else{
             approveParam = allParam.get(0);
            if(approveParam.getMemberType().equals(Constants.ZERO)){
                //被访人审批
                //添加审批人
                ids.add(visitMember.getId());
            }else if(approveParam.getMemberType().equals(Constants.ONE)){
                //指定人员审批
                String [] objIds = approveParam.getObjIds().split(",");
                for (String id:objIds) {
                    //添加审批人
                    ids.add(Integer.valueOf(id));
                }
            }else if(approveParam.getMemberType().equals(Constants.TWO)){
                //部门主管审批
                //审批部门
                Company auditCompany = this.getAuditCompanyHead(visitMember.getCompanyId(),approveParam.getObjLevel());
                if(Objects.isNull(auditCompany)){
                    //审批部门为空 è‡ªåŠ¨æµè½¬ä¸‹ä¸€çº§å®¡æ‰¹é…ç½®
                    level = level + 1;
                    return this.getApproveIds(level,visitMember,ids);
                }else{
                    //查询部门负责人
                    Member headMember = memberMapper.selectById(auditCompany.getHeadId());
                    if(Objects.isNull(headMember)){
                        //未查询到部门负责人
                        if(approveParam.getNoleaderOpt().equals(Constants.ONE)&&!Objects.isNull(auditCompany.getParentId())){
                            //由上级主管代替审核
                            auditCompany = companyMapper.selectOne(new QueryWrapper<Company>().lambda().eq(Company::getId,auditCompany.getParentId()));
                            if(Objects.isNull(auditCompany)){
                                //审批部门为空 è‡ªåŠ¨æµè½¬ä¸‹ä¸€çº§å®¡æ‰¹é…ç½®
                                level = level + 1;
                                this.getApproveIds(level,visitMember,ids);
                            }else{
                                headMember = memberMapper.selectById(auditCompany.getHeadId());
                                if(Objects.isNull(headMember)){
                                    //查询部门负责人 ä¸ºç©º è‡ªåŠ¨æµè½¬ä¸‹ä¸€çº§å®¡æ‰¹é…ç½®
                                    level = level + 1;
                                    return this.getApproveIds(level,visitMember,ids);
                                }else{
                                    //添加审批人
                                    ids.add(headMember.getId());
                                }
                            }
                        }else{
                            level = level + 1;
                            return this.getApproveIds(level,visitMember,ids);
                        }
                    }else{
                        //添加审批人
                        ids.add(headMember.getId());
                    }
                }
            }
        }
        return approveParam;
    }
    /**
     * æ ¹æ®é…ç½®æŸ¥è¯¢ä¸Šçº§æ•°æ®
     * @param companyId ç›´æŽ¥éƒ¨é—¨
     * @param objLevel  æŸ¥è¯¢çº§åˆ«
     */
    public Company getAuditCompanyHead(Integer companyId,Integer objLevel){
        Integer queryLevel = Constants.ONE;
        Integer nextCompanyId = companyId;
        Company auditCompany = new Company();
        while(queryLevel.equals(objLevel)){
            auditCompany = companyMapper.selectById(nextCompanyId);
            if(Objects.isNull(auditCompany)){
                return null;
            }
            nextCompanyId = auditCompany.getParentId();
        }
        return auditCompany;
    }
    /**
     * æ ¡éªŒå¿…填项数据是否合法
@@ -692,6 +1024,18 @@
        visitDetailVO.setVisitUserName(member.getName());
        visitDetailVO.setVisitReason(visits.getReason());
        visitDetailVO.setVisitTime(DateUtil.DateToStr(visits.getStarttime(),"yyyy-MM-dd HH:mm") + " è‡³ " + DateUtil.DateToStr(visits.getEndtime(),"yyyy-MM-dd HH:mm") );
        //被访人员部门
        Company company = companyMapper.selectById(member.getCompanyId());
        if(!Objects.isNull(company)){
            visitDetailVO.setVisitUserCompany(company.getName());
        }
        visitDetailVO.setName(visits.getName());
            visitDetailVO.setCompanyName(visits.getCompanyName());
            visitDetailVO.setFaceImg(visits.getFaceImg());
            visitDetailVO.setImgUrl(visits.getImgurl());
            visitDetailVO.setIdCardDecode(visits.getIdcardDecode());
            visitDetailVO.setPrefix(systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode() +
                    systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode());
        if(StringUtils.isNotBlank(visits.getDoors())){
            List<DeviceRole> deviceRoleList = deviceRoleMapper.selectList(new QueryWrapper<DeviceRole>().lambda()
                            .select(DeviceRole::getName)
@@ -703,8 +1047,9 @@
                );
            }
        }
        visitDetailVO.setWithVisitsList(visitsMapper.selectList(new QueryWrapper<Visits>().lambda()
                .select(Visits::getName,Visits::getPhone)
        visitDetailVO.setWithVisitsList(
                visitsMapper.selectList(new QueryWrapper<Visits>().lambda()
                .select(Visits::getName,Visits::getPhone,Visits::getFaceImg,Visits::getImgurl,Visits::getIdcardDecode)
                .eq(Visits::getParentId,id)));
        return visitDetailVO;
    }
@@ -712,5 +1057,39 @@
    @Override
    public PageData<VisitRecordVO> taskCenter(PageWrap<VisitRecordDTO> param) {
        VisitRecordDTO visitRecordDTO = param.getModel();
        IPage<Visits> page = new Page<>(param.getPage(), param.getCapacity());
        MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(visitRecordDTO);
        queryWrapper.selectAs(Visits::getId,VisitRecordVO::getId);
        queryWrapper.selectAs(Visits::getName,VisitRecordVO::getName);
        queryWrapper.selectAs(Visits::getStarttime,VisitRecordVO::getStartTime);
        queryWrapper.selectAs(Visits::getEndtime,VisitRecordVO::getEndTime);
        queryWrapper.selectAs(Visits::getReason,VisitRecordVO::getReason);
        queryWrapper.selectAs(Visits::getMemberNum,VisitRecordVO::getInNum);
        queryWrapper.selectAs(Visits::getCreateDate,VisitRecordVO::getCreateDate);
        queryWrapper.leftJoin(Approve.class,Approve::getId,Visits::getId);
        if(!Objects.isNull(visitRecordDTO)){
            queryWrapper.like(StringUtils.isNotBlank(visitRecordDTO.getName()),Visits::getName,visitRecordDTO.getName());
            queryWrapper.le(!Objects.isNull(visitRecordDTO.getCreateTimeS()),Visits::getCreateDate,visitRecordDTO.getCreateTimeS());
            queryWrapper.ge(!Objects.isNull(visitRecordDTO.getCreateTimeE()),Visits::getCreateDate,visitRecordDTO.getCreateTimeE());
            queryWrapper.eq(!Objects.isNull(visitRecordDTO.getType()),Visits::getType,visitRecordDTO.getType());
            if(!Objects.isNull(visitRecordDTO.getState())&&visitRecordDTO.getState()<Constants.TWO){
                queryWrapper.eq(Approve::getStatus,visitRecordDTO.getState());
                queryWrapper.eq(Approve::getChekorId,visitRecordDTO.getMemberId());
            }else if(!Objects.isNull(visitRecordDTO.getState())&&visitRecordDTO.getState()==Constants.TWO){
                queryWrapper.eq(Visits::getMemberId,visitRecordDTO.getMemberId());
            }
        }
        queryWrapper.orderByDesc(Visits::getCreateDate);
        IPage<VisitRecordVO> result = visitsJoinMapper.selectJoinPage(page, VisitRecordVO.class,queryWrapper);
        return PageData.from(result);
    }
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/erp/ErpSyncServiceImpl.java
@@ -222,13 +222,16 @@
     */
    private Company getAddCompanyModel(ErpOrgListResponse respone, Date date) {
        Company    company = new Company();
        company.setStatus(respone.getStatus());
        company.setIsdeleted(Constants.ZERO);
        company.setName(respone.getName());
        company.setErpId(respone.getId());
        company.setCreateDate(date);
        company.setType(Constants.ONE);
        company.setCode(respone.getCode());
        if(StringUtils.isNotBlank(respone.getParentOrgId())&&!respone.getParentOrgId().equals("orgRoot")){
        company.setErpParentId(respone.getParentOrgId());
        }
        company.setErpDate(date);
        company.setHkStatus(Constants.ZERO);
        return  company;
server/dmvisit_service/src/main/java/com/doumee/service/common/tree/CompanyTree.java
@@ -46,7 +46,7 @@
                    rootNodeList.add(treeNode);
                }
            }else{
                if (Objects.isNull(treeNode.getErpId())) {
                if (Objects.isNull(treeNode.getErpParentId())) {
                    // æ˜¯ï¼Œæ·»åŠ 
                    rootNodeList.add(treeNode);
                }
server/dmvisit_web/src/main/java/com/doumee/api/web/ApiController.java
@@ -2,6 +2,7 @@
import com.doumee.config.Jwt.JwtTokenUtil;
import com.doumee.core.model.PageData;
import com.doumee.dao.business.model.Member;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@@ -34,7 +35,15 @@
     */
    protected Integer getMemberId() {
        Object obj = this.getRequest().getAttribute(JwtTokenUtil.UserId_Name);
        return obj != null ? (Integer) obj : null;
        return obj != null ? Integer.valueOf( obj.toString() ): null;
    }
    /**
     * èŽ·å–ç”¨æˆ·
     *
     * @return
     */
    protected Member getMember() {
        Member member = (Member) this.getRequest().getAttribute(JwtTokenUtil.MEMBER);
        return member != null ? member : null;
    }
}
server/dmvisit_web/src/main/java/com/doumee/api/web/InternalController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,125 @@
package com.doumee.api.web;
import com.alibaba.fastjson.JSONObject;
import com.doumee.config.annotation.LoginRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Visits;
import com.doumee.dao.web.reqeust.AccountLoginDTO;
import com.doumee.dao.web.reqeust.AuditApproveDTO;
import com.doumee.dao.web.reqeust.VisitMemberDTO;
import com.doumee.dao.web.reqeust.VisitRecordDTO;
import com.doumee.dao.web.response.*;
import com.doumee.service.business.ApproveService;
import com.doumee.service.business.MemberService;
import com.doumee.service.business.VisitsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/12/28 14:31
 */
@Api(tags = "3、内部劳务人员")
@Trace(exclude = true)
@RestController
@RequestMapping("/web/internal")
@Slf4j
public class InternalController extends ApiController{
    @Autowired
    private MemberService memberService;
    @Autowired
    private VisitsService visitsService;
    @Autowired
    private ApproveService approveService;
    @ApiOperation(value = "人员登录", notes = "H5")
    @PostMapping("/accountLogin")
    public ApiResponse<WxAuthorizeVO> accountLogin(@RequestBody AccountLoginDTO accountLoginDTO) {
        WxAuthorizeVO wxAuthorizeVO = memberService.accountLogin(accountLoginDTO);
        return ApiResponse.success("登录成功",wxAuthorizeVO);
    }
    @LoginRequired
    @ApiOperation(value = "内部人员首页", notes = "H5")
    @GetMapping("/internalHome")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<InternalHomeVO> internalHome() {
        return ApiResponse.success("查询成功",approveService.getHomeData(getMemberId()));
    }
    @LoginRequired
    @ApiOperation("任务中心")
    @PostMapping("/taskCenter")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<PageData<VisitRecordVO>> taskCenter (@RequestBody PageWrap<VisitRecordDTO> pageWrap) {
        pageWrap.getModel().setMemberId(getMemberId());
        return ApiResponse.success(visitsService.taskCenter(pageWrap));
    }
    @LoginRequired
    @ApiOperation("访客记录详情")
    @GetMapping("/visitDetail")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "id", value = "记录主键", required = true)
    })
    public ApiResponse<VisitDetailVO> visitDetail (@RequestParam Integer id) {
        return ApiResponse.success(visitsService.getVisitDetail(id));
    }
    @LoginRequired
    @ApiOperation(value = "人员分页",notes = "可拜访内部人员")
    @PostMapping("/memberList")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<PageData<MemberVO>> memberList (@RequestBody PageWrap<VisitMemberDTO> pageWrap) {
        return ApiResponse.success(memberService.getVisitedMemberList(pageWrap));
    }
    @LoginRequired
    @ApiOperation(value = "访客记录提交", notes = "内部人员提交")
    @PostMapping("/createVisit")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse createVisit(@RequestBody Visits visits) {
        visits.setCreateMemberId(getMemberId());
        return ApiResponse.success("查询成功", visitsService.createFk(visits));
    }
    @LoginRequired
    @ApiOperation(value = "审批流记录审批", notes = "内部人员")
    @PostMapping("/auditApprove")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse auditApprove(@RequestBody AuditApproveDTO auditApproveDTO) {
        visitsService.auditApprove(auditApproveDTO);
        return ApiResponse.success("操作成功");
    }
}
server/dmvisit_web/src/main/java/com/doumee/api/web/VisitorController.java
@@ -60,7 +60,7 @@
    }
    @ApiOperation(value = "访客记录提交", notes = "访客记录提交")
    @ApiOperation(value = "访客记录提交", notes = "访客提交")
    @PostMapping("/createFk")
    public ApiResponse createFk(@RequestBody Visits visits) {
        return ApiResponse.success("查询成功", visitsService.createFk(visits));