Browse Source

init: init project step4: biz code support

shc 1 năm trước cách đây
mục cha
commit
736812ab23
22 tập tin đã thay đổi với 1224 bổ sung758 xóa
  1. 1 12
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/UserDTO.java
  2. 37 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/WmUserSignDTO.java
  3. 4 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmDaAgent.java
  4. 6 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmDaDrugEnt.java
  5. 3 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java
  6. 307 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/InitController.java
  7. 2 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserController.java
  8. 2 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmScorePackageController.java
  9. 30 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmUserSignController.java
  10. 2 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysEnterpriseAreaService.java
  11. 9 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserAreaService.java
  12. 2 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserService.java
  13. 12 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmUserSignService.java
  14. 5 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysEnterpriseAreaServiceImpl.java
  15. 11 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserAreaServiceImpl.java
  16. 22 34
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserServiceImpl.java
  17. 8 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDaAgentServiceImpl.java
  18. 7 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDaDrugEntServiceImpl.java
  19. 14 15
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskContentServiceImpl.java
  20. 726 687
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmUserSignServiceImpl.java
  21. 7 0
      hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmDaAgentMapper.xml
  22. 7 0
      hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmDaDrugEntMapper.xml

+ 1 - 12
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/UserDTO.java

@@ -38,18 +38,6 @@ public class UserDTO extends SysUser {
      */
     private String w1;
 
-    private String subType;
-
-    /**
-     * 税源地
-     */
-    private String subjectLocation;
-
-    /**
-     * 认证状态
-     */
-    private String certType;
-
     /**
      * 用户id集合
      */
@@ -71,4 +59,5 @@ public class UserDTO extends SysUser {
     @NotEmpty(message = "需要至少分配一个区域", groups = {BaseEntity.Create.class})
     private List<Long> areaCodes;
 
+
 }

+ 37 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/WmUserSignDTO.java

@@ -0,0 +1,37 @@
+package com.qunzhixinxi.hnqz.admin.api.dto;
+
+import lombok.AccessLevel;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+
+/**
+ * 用户签到
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2024/05/15 18:21
+ */
+@NoArgsConstructor(access = AccessLevel.NONE)
+public final class WmUserSignDTO {
+
+    @Data
+    public static final class OnTempSign {
+
+        @NotBlank(message = "位置ID必填")
+        private String locationId;
+
+        @NotBlank(message = "任务类型必填")
+        private String taskTypeId;
+
+        @NotNull(message = "是否组合校验必填")
+        private Boolean combine;
+
+        @NotNull(message = "签到时间必填")
+        private LocalDateTime signTime;
+
+    }
+}

+ 4 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmDaAgent.java

@@ -172,4 +172,8 @@ public class WmDaAgent implements Serializable {
     @NotEmpty(message = "区域必填", groups = {BaseEntity.Create.class})
     @TableField(exist = false)
     private List<Long> areaCodes;
+
+
+    @TableField(exist = false)
+    private List<Long> entIds;
 }

+ 6 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmDaDrugEnt.java

@@ -114,4 +114,10 @@ public class WmDaDrugEnt implements Serializable {
     @TableField(exist = false)
     private List<Long> areaCodes;
 
+    /**
+     * 企业ID
+     */
+    @TableField(exist = false)
+    private List<Long> entIds;
+
 }

+ 3 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java

@@ -465,7 +465,7 @@ public class ApiController {
                                         if ("score_id".equals(key)) {
                                             pkgId = value.toString();
                                         }
-                                        if ("COUNT".equals(key)) {
+                                        if ("COUNT".equalsIgnoreCase(key)) {
                                             count = value.toString();
                                         }
                                     }
@@ -1322,7 +1322,8 @@ public class ApiController {
 
         String ipAddr = HttpUtils.getIpAddr(request);
         log.info("提交任务远端IP: [{}]", ipAddr);
-        String region = ip2Region.toRegion(ipAddr);
+        //String region = ip2Region.toRegion(ipAddr);
+        String region = "xxx-yyy";
         log.info("提交任务远端地址: [{}]", region);
         log.info("saveTaskContent入参:{}", wmTaskContent);
         Set<String> errorHash = new HashSet<>();

+ 307 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/InitController.java

@@ -1,15 +1,40 @@
 package com.qunzhixinxi.hnqz.admin.controller;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.qunzhixinxi.hnqz.admin.api.constant.enums.DelEnum;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysAreaEntity;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysDeptRelation;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysUserArea;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmDaAgent;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmDaDrugEnt;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskType;
+import com.qunzhixinxi.hnqz.admin.mapper.SysDeptMapper;
+import com.qunzhixinxi.hnqz.admin.mapper.SysDeptRelationMapper;
+import com.qunzhixinxi.hnqz.admin.mapper.WmDaAgentMapper;
+import com.qunzhixinxi.hnqz.admin.mapper.WmDaDrugEntMapper;
+import com.qunzhixinxi.hnqz.admin.mapper.WmTaskTypeMapper;
+import com.qunzhixinxi.hnqz.admin.service.SysAreaEntityService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserAreaService;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.security.annotation.Inner;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 
 /**
  * 初始化控制器
@@ -23,6 +48,14 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping(value = "/init", produces = MediaType.APPLICATION_JSON_VALUE)
 public class InitController {
 
+    private final WmTaskTypeMapper wmTaskTypeMapper;
+    private final SysDeptMapper sysDeptMapper;
+    private final WmDaDrugEntMapper wmDaDrugEntMapper;
+    private final SysDeptRelationMapper sysDeptRelationMapper;
+    private final WmDaAgentMapper wmDaAgentMapper;
+    private final SysUserAreaService userAreaService;
+    private final SysAreaEntityService areaEntityService;
+
 
     @Inner(value = false)
     @GetMapping(value = "/cnbg/test")
@@ -30,8 +63,281 @@ public class InitController {
         return R.ok("TEST:" + System.currentTimeMillis());
     }
 
-    @PostMapping(value = "/tasktype")
+    /**
+     * 批量同步指定的任务类型给所有企业
+     *
+     * @return 结果
+     */
+    @Inner(value = false)
+    @PostMapping(value = "/cnbg/tasktype")
     public R<?> taskTypeInit() {
+
+        List<WmTaskType> tempList = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery().eq(WmTaskType::getTaskTypeLevel, "1"));
+
+        //List<WmTaskType> tempList = wmTaskTypeMapper.selectBatchIds(wmTaskTypes);
+
+        // 1.第一级是药企的情况
+//		List<SysDept> deptList = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery()
+//				.eq(SysDept::getLevel, 2));
+        List<SysDept> sysDepts1 = sysDeptMapper.listAllDept();
+        List<SysDept> deptList = new ArrayList<>();
+        if (CollectionUtil.isNotEmpty(sysDepts1)) {
+            deptList = sysDepts1.stream()
+                    .filter(sysDept -> sysDept.getLevel().equals(2))
+                    .collect(Collectors.toList());
+        }
+        // 遍历药企
+        for (SysDept dept : deptList) {
+            // 生成药企任务类型
+            WmDaDrugEnt wmDaDrugEnt = wmDaDrugEntMapper.selectOne(Wrappers.<WmDaDrugEnt>lambdaQuery()
+                    .eq(WmDaDrugEnt::getDeptId, dept.getDeptId())
+//					.eq(WmDaDrugEnt::getEnableFlag, EnableEnum.ENABLE.val())
+                    .eq(WmDaDrugEnt::getDelFlag, DelEnum.NOT_DEL.val()));
+            if (wmDaDrugEnt == null) {
+                continue;
+            }
+            for (WmTaskType wmTaskType1 : tempList) {
+                WmTaskType newOne = BeanUtil.copyProperties(wmTaskType1, WmTaskType.class);
+                newOne.setCreateTime(null);
+                newOne.setId(null);
+                newOne.setDurgentId(wmDaDrugEnt.getId());
+                newOne.setTaskTypeLevel("2");
+                newOne.setTaskEntId(wmDaDrugEnt.getId());
+                newOne.setDeptId(wmDaDrugEnt.getDeptId());
+                newOne.setStatus("0");
+                newOne.setBaseId(wmTaskType1.getId());
+                newOne.setRuleId(String.valueOf(wmDaDrugEnt.getId()));
+                newOne.setParentId(wmTaskType1.getParentId());
+                newOne.setTaskReceiverType(wmTaskType1.getTaskReceiverType());
+                List<WmTaskType> taskTypeList = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery()
+                        .eq(WmTaskType::getTaskTypeName, wmTaskType1.getTaskTypeName())
+                        .eq(WmTaskType::getRuleId, newOne.getRuleId())
+                        .eq(WmTaskType::getDeptId, newOne.getDeptId())
+                        .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
+                if (CollectionUtil.isEmpty(taskTypeList)) {
+                    newOne.setCreateTime(LocalDateTime.now());
+                    wmTaskTypeMapper.insert(newOne);
+                }
+            }
+
+            // 查询一级CSO
+            List<SysDeptRelation> deptRelationList = sysDeptRelationMapper.selectList(Wrappers.<SysDeptRelation>lambdaQuery()
+                    .eq(SysDeptRelation::getAncestor, dept.getDeptId())
+                    .ne(SysDeptRelation::getDescendant, dept.getDeptId()));
+            if (CollectionUtil.isEmpty(deptRelationList)) {
+                continue;
+            }
+            List<Integer> oneCSODeptIdList = deptRelationList.stream()
+                    .map(SysDeptRelation::getDescendant)
+                    .collect(Collectors.toList());
+            List<SysDept> oneCSODeptList = sysDeptMapper.selectByIds(oneCSODeptIdList);
+//			List<SysDept> oneCSODeptList = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery()
+//					.eq(SysDept::getParentId, dept.getDeptId())
+//					.eq(SysDept::getDelFlag, DelEnum.NOT_DEL.val())
+//					.eq(SysDept::getLevel, 3));
+            for (SysDept oneCSODept : oneCSODeptList) {
+                // 生成药企给一级CSO的任务类型
+                WmDaAgent wmDaAgent = wmDaAgentMapper.selectOne(Wrappers.<WmDaAgent>lambdaQuery()
+                        .eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.val())
+//						.eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
+                        .eq(WmDaAgent::getDeptId, oneCSODept.getDeptId()));
+                if (wmDaAgent == null) {
+                    continue;
+                }
+                for (WmTaskType wmTaskType1 : tempList) {
+                    WmTaskType newOne = BeanUtil.copyProperties(wmTaskType1, WmTaskType.class);
+                    newOne.setCreateTime(null);
+                    newOne.setId(null);
+                    newOne.setLevel1Id(wmDaAgent.getId());
+                    newOne.setDurgentId(wmDaDrugEnt.getId());
+                    newOne.setTaskTypeLevel("2");
+                    newOne.setRuleId(wmDaDrugEnt.getId() + wmDaAgent.getId() + "");
+                    newOne.setTaskEntId(wmDaAgent.getId());
+                    newOne.setDeptId(wmDaAgent.getDeptId());
+                    newOne.setStatus("0");
+                    newOne.setBaseId(wmTaskType1.getId());
+                    newOne.setTaskReceiverType(wmTaskType1.getTaskReceiverType());
+                    List<WmTaskType> taskTypeList = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery()
+                            .eq(WmTaskType::getTaskTypeName, wmTaskType1.getTaskTypeName())
+                            .eq(WmTaskType::getRuleId, newOne.getRuleId())
+                            .eq(WmTaskType::getDeptId, newOne.getDeptId())
+                            .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
+                    if (CollectionUtil.isEmpty(taskTypeList)) {
+                        newOne.setCreateTime(LocalDateTime.now());
+                        wmTaskTypeMapper.insert(newOne);
+                    }
+                }
+                // 生成一级CSO的任务类型
+                for (WmTaskType wmTaskType2 : tempList) {
+                    WmTaskType newOne = BeanUtil.copyProperties(wmTaskType2, WmTaskType.class);
+                    newOne.setCreateTime(null);
+                    newOne.setId(null);
+                    newOne.setLevel1Id(wmDaAgent.getId());
+                    newOne.setTaskTypeLevel("2");
+                    newOne.setTaskEntId(wmDaAgent.getId());
+                    newOne.setRuleId(String.valueOf(wmDaAgent.getId()));
+                    newOne.setDeptId(wmDaAgent.getDeptId());
+                    newOne.setStatus("0");
+                    newOne.setBaseId(wmTaskType2.getId());
+                    newOne.setTaskReceiverType(wmTaskType2.getTaskReceiverType());
+                    List<WmTaskType> taskTypeList = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery()
+                            .eq(WmTaskType::getTaskTypeName, wmTaskType2.getTaskTypeName())
+                            .eq(WmTaskType::getRuleId, newOne.getRuleId())
+                            .eq(WmTaskType::getDeptId, newOne.getDeptId())
+                            .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
+                    if (CollectionUtil.isEmpty(taskTypeList)) {
+                        newOne.setCreateTime(LocalDateTime.now());
+                        wmTaskTypeMapper.insert(newOne);
+                    }
+                }
+
+                // 查询二级CSO
+                List<SysDept> twoCSODeptList = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery()
+                        .eq(SysDept::getParentId, oneCSODept.getDeptId())
+//						.eq(SysDept::getDelFlag, DelEnum.NOT_DEL.val())
+                        .eq(SysDept::getLevel, 4));
+                for (SysDept twoCSODept : twoCSODeptList) {
+                    // 生成二级CSO任务类型
+                    WmDaAgent wmDaAgent2 = wmDaAgentMapper.selectOne(Wrappers.<WmDaAgent>lambdaQuery()
+                            .eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.val())
+//							.eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
+                            .eq(WmDaAgent::getDeptId, twoCSODept.getDeptId()));
+                    if (wmDaAgent2 == null) {
+                        continue;
+                    }
+                    for (WmTaskType wmTaskType2 : tempList) {
+                        WmTaskType newOne = BeanUtil.copyProperties(wmTaskType2, WmTaskType.class);
+                        newOne.setCreateTime(null);
+                        newOne.setId(null);
+                        newOne.setLevel1Id(wmDaAgent2.getId());
+                        newOne.setTaskTypeLevel("2");
+                        newOne.setTaskEntId(wmDaAgent2.getId());
+                        newOne.setRuleId(String.valueOf(wmDaAgent2.getId()));
+                        newOne.setDeptId(wmDaAgent2.getDeptId());
+                        newOne.setStatus("0");
+                        newOne.setBaseId(wmTaskType2.getId());
+                        newOne.setTaskReceiverType(wmTaskType2.getTaskReceiverType());
+                        List<WmTaskType> taskTypeList = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery()
+                                .eq(WmTaskType::getTaskTypeName, wmTaskType2.getTaskTypeName())
+                                .eq(WmTaskType::getRuleId, newOne.getRuleId())
+                                .eq(WmTaskType::getDeptId, newOne.getDeptId())
+                                .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
+                        if (CollectionUtil.isEmpty(taskTypeList)) {
+                            newOne.setCreateTime(LocalDateTime.now());
+                            wmTaskTypeMapper.insert(newOne);
+                        }
+                    }
+                }
+
+            }
+
+        }
+
+        // 2.第一级是CSO的情况
+//		List<SysDept> deptList2 = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery()
+//				.eq(SysDept::getLevel, 3)
+//				.isNull(SysDept::getParentId));
+        List<SysDept> sysDepts = sysDeptMapper.listAllDept();
+        List<SysDept> deptList2 = new ArrayList<>();
+        if (CollectionUtil.isNotEmpty(sysDepts)) {
+            deptList2 = sysDepts.stream()
+                    .filter(sysDept -> sysDept.getLevel().equals(3) && sysDept.getParentId() == null)
+                    .collect(Collectors.toList());
+        }
+        // 查询一级CSO
+        for (SysDept oneCSODept : deptList2) {
+            // 生成药企给一级CSO的任务类型
+            WmDaAgent wmDaAgent = wmDaAgentMapper.selectOne(Wrappers.<WmDaAgent>lambdaQuery()
+                    .eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.val())
+//					.eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
+                    .eq(WmDaAgent::getDeptId, oneCSODept.getDeptId()));
+            if (wmDaAgent == null) {
+                continue;
+            }
+            // 生成一级CSO的任务类型
+            for (WmTaskType wmTaskType2 : tempList) {
+                WmTaskType newOne = BeanUtil.copyProperties(wmTaskType2, WmTaskType.class);
+                newOne.setCreateTime(null);
+                newOne.setId(null);
+                newOne.setLevel1Id(wmDaAgent.getId());
+                newOne.setTaskTypeLevel("2");
+                newOne.setTaskEntId(wmDaAgent.getId());
+                newOne.setRuleId(String.valueOf(wmDaAgent.getId()));
+                newOne.setDeptId(wmDaAgent.getDeptId());
+                newOne.setStatus("0");
+                newOne.setBaseId(wmTaskType2.getId());
+                newOne.setTaskReceiverType(wmTaskType2.getTaskReceiverType());
+                List<WmTaskType> taskTypeList = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery()
+                        .eq(WmTaskType::getTaskTypeName, wmTaskType2.getTaskTypeName())
+                        .eq(WmTaskType::getRuleId, newOne.getRuleId())
+                        .eq(WmTaskType::getDeptId, newOne.getDeptId())
+                        .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
+                if (CollectionUtil.isEmpty(taskTypeList)) {
+                    newOne.setCreateTime(LocalDateTime.now());
+                    wmTaskTypeMapper.insert(newOne);
+                }
+            }
+
+            // 查询二级CSO
+            List<SysDept> twoCSODeptList = sysDeptMapper.selectList(Wrappers.<SysDept>lambdaQuery()
+                    .eq(SysDept::getParentId, oneCSODept.getDeptId())
+//					.eq(SysDept::getDelFlag, DelEnum.NOT_DEL.val())
+                    .eq(SysDept::getLevel, 4));
+            for (SysDept twoCSODept : twoCSODeptList) {
+                // 生成二级CSO任务类型
+                WmDaAgent wmDaAgent2 = wmDaAgentMapper.selectOne(Wrappers.<WmDaAgent>lambdaQuery()
+                        .eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.val())
+//						.eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
+                        .eq(WmDaAgent::getDeptId, twoCSODept.getDeptId()));
+                if (wmDaAgent2 == null) {
+                    continue;
+                }
+                for (WmTaskType wmTaskType2 : tempList) {
+                    WmTaskType newOne = BeanUtil.copyProperties(wmTaskType2, WmTaskType.class);
+                    newOne.setCreateTime(null);
+                    newOne.setId(null);
+                    newOne.setLevel1Id(wmDaAgent2.getId());
+                    newOne.setTaskTypeLevel("2");
+                    newOne.setTaskEntId(wmDaAgent2.getId());
+                    newOne.setRuleId(String.valueOf(wmDaAgent2.getId()));
+                    newOne.setDeptId(wmDaAgent2.getDeptId());
+                    newOne.setStatus("0");
+                    newOne.setBaseId(wmTaskType2.getId());
+                    newOne.setTaskReceiverType(wmTaskType2.getTaskReceiverType());
+                    List<WmTaskType> taskTypeList = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery()
+                            .eq(WmTaskType::getTaskTypeName, wmTaskType2.getTaskTypeName())
+                            .eq(WmTaskType::getRuleId, newOne.getRuleId())
+                            .eq(WmTaskType::getDeptId, newOne.getDeptId())
+                            .eq(WmTaskType::getTaskEntId, newOne.getTaskEntId()));
+                    if (CollectionUtil.isEmpty(taskTypeList)) {
+                        newOne.setCreateTime(LocalDateTime.now());
+                        wmTaskTypeMapper.insert(newOne);
+                    }
+                }
+            }
+        }
+        return R.ok();
+    }
+
+    @Inner(value = false)
+    @PostMapping(value = "/cnbg/user/area/{userId}")
+    public R<Boolean> initUserArea(@PathVariable(value = "userId") Long userId) {
+        List<SysAreaEntity> list = areaEntityService.list(Wrappers.<SysAreaEntity>lambdaQuery().eq(SysAreaEntity::getAreaStatus, true));
+
+
+        Set<Long> collect = list.stream().mapToLong(SysAreaEntity::getAreaId).boxed().collect(Collectors.toSet());
+
+        LocalDateTime now = LocalDateTime.now();
+        List<SysUserArea> collect1 = collect.stream().map(aId -> {
+            SysUserArea userArea = new SysUserArea();
+            userArea.setUserId(userId);
+            userArea.setAreaId(aId);
+            userArea.setCreateTime(now);
+            return userArea;
+
+        }).collect(Collectors.toList());
+
+        userAreaService.saveBatch(collect1);
         return R.ok();
     }
 

+ 2 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserController.java

@@ -852,9 +852,9 @@ public class SysUserController {
     @GetMapping("/selectUserList")
     public R<?> selectUserList(Page<UserVO> page, UserDTO userDTO) {
 
-        userDTO.setSubType(null);
+        HnqzUser user = SecurityUtils.getUser();
 
-        IPage<UserVO> userVosPage = userService.selectUserList(page, userDTO);
+        Page<UserVO> userVosPage = userService.selectUserList(page, userDTO, user);
 
         Set<Integer> userIds = userVosPage.getRecords().stream().map(UserVO::getUserId).collect(Collectors.toSet());
 

+ 2 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmScorePackageController.java

@@ -1904,10 +1904,10 @@ public class WmScorePackageController {
 
         if (deptLevel == 2) {
             WmDaDrugEnt wmDaDrugEnt = wmDaDrugEntService.selectByDeptId(sysDeptRuleId.getDeptId());
-            if (wmScorePackage.getAcceptSug().equals(wmDaDrugEnt.getId())) {
+            if (wmScorePackage.getAcceptSug().equals(wmDaDrugEnt.getId().toString())) {
                 wmScorePackage.setRuleId(wmScorePackage.getAcceptSug());
                 wmScorePackage.setDrugEntId(wmDaDrugEnt.getId());
-            } else if (!wmScorePackage.getAcceptSug().equals(wmDaDrugEnt.getId())) {
+            } else {
                 WmTaskType wmTaskType = new WmTaskType();
                 wmTaskType.setRuleId(wmDaDrugEnt.getId() + wmScorePackage.getAcceptSug());
                 List<WmTaskType> wmTaskTypeList = wmTaskTypeService.selectByRuleId(wmTaskType);

+ 30 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmUserSignController.java

@@ -2,12 +2,16 @@ package com.qunzhixinxi.hnqz.admin.controller;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qunzhixinxi.hnqz.admin.api.dto.WmUserSignDTO;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmUserSign;
 import com.qunzhixinxi.hnqz.admin.service.WmUserSignService;
+import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.security.access.prepost.PreAuthorize;
 import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 
@@ -23,6 +27,8 @@ import org.springframework.web.bind.annotation.*;
 public class WmUserSignController {
 
     private final WmUserSignService wmUserSignService;
+    private final RedisTemplate<String, Object> redisTemplate;
+
 
     /**
      * 分页查询
@@ -90,4 +96,28 @@ public class WmUserSignController {
         return R.ok(wmUserSignService.removeById(id));
     }
 
+    /**
+     * 会员临时签到
+     *
+     * @param resource 签到信息
+     * @return 签到时间
+     */
+    @SysLog("临时签到")
+    @PostMapping(value = "/temp/sign")
+    public R<String> doTempSign(@Validated @RequestBody WmUserSignDTO.OnTempSign resource) {
+        return R.ok(wmUserSignService.doTempSign(resource, SecurityUtils.getUser()));
+    }
+
+    /**
+     * 会员临时签到
+     *
+     * @param resource 签到信息
+     * @return 签到时间
+     */
+    @PostMapping(value = "/temp/sign/result")
+    public R<?> getTempSign(@Validated @RequestBody WmUserSignDTO.OnTempSign resource) {
+        Object o = redisTemplate.opsForValue().get(String.format("user:sign:temp:%s:%s", SecurityUtils.getUser().getId(), resource.getLocationId()));
+        return R.ok(o);
+    }
+
 }

+ 2 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysEnterpriseAreaService.java

@@ -46,4 +46,6 @@ public interface SysEnterpriseAreaService extends IService<SysEnterpriseArea> {
      * @param deptId 部门ID
      */
     void delRelation(Long deptId);
+
+    List<Long> listAreaEnts(List<Long> areas);
 }

+ 9 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserAreaService.java

@@ -31,6 +31,15 @@ public interface SysUserAreaService extends IService<SysUserArea> {
      */
     List<Long> listUserAreas(Long userId);
 
+    /**
+     * 获取区域的人员
+     *
+     * @param areaIds 区域列表
+     * @return 人员列表
+     */
+    List<Long> listAreaUser(Collection<Long> areaIds);
+
+
     /**
      * 删除用户的区域
      *

+ 2 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserService.java

@@ -12,6 +12,7 @@ import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
 import com.qunzhixinxi.hnqz.admin.api.dto.CommonUserDTO;
 import com.qunzhixinxi.hnqz.admin.api.model.input.UserCertificationInput;
 import com.qunzhixinxi.hnqz.common.core.util.R;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 
 import java.util.Collection;
 import java.util.List;
@@ -43,7 +44,7 @@ public interface SysUserService extends IService<SysUser> {
 
     Page<UserVO> getUsersWithRolePageNoLock(Page<UserVO> page, UserDTO userDTO);
 
-    IPage selectUserList(Page page, UserDTO userDTO);
+    Page<UserVO> selectUserList(Page<UserVO> page, UserDTO userDTO, HnqzUser user);
 
     /**
      * 删除用户

+ 12 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmUserSignService.java

@@ -1,8 +1,10 @@
 package com.qunzhixinxi.hnqz.admin.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.api.dto.WmUserSignDTO;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmUserSign;
 import com.qunzhixinxi.hnqz.common.core.util.R;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 
 /**
  * 用户签到表
@@ -12,5 +14,14 @@ import com.qunzhixinxi.hnqz.common.core.util.R;
  */
 public interface WmUserSignService extends IService<WmUserSign> {
 
-	R<?> saveWmUserSign(WmUserSign wmUserSign);
+    R<?> saveWmUserSign(WmUserSign wmUserSign);
+
+    /**
+     * 会员临时签到
+     *
+     * @param resource 签到信息
+     * @param user     用户信息
+     * @return 签到结果
+     */
+    String doTempSign(WmUserSignDTO.OnTempSign resource, HnqzUser user);
 }

+ 5 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysEnterpriseAreaServiceImpl.java

@@ -91,6 +91,11 @@ public class SysEnterpriseAreaServiceImpl extends ServiceImpl<SysEnterpriseAreaM
         this.remove(Wrappers.<SysEnterpriseArea>lambdaQuery().eq(SysEnterpriseArea::getEntId, deptId));
 
     }
+
+    @Override
+    public List<Long> listAreaEnts(List<Long> areas) {
+        return this.list(Wrappers.<SysEnterpriseArea>lambdaQuery().in(SysEnterpriseArea::getAreaId, areas)).stream().map(SysEnterpriseArea::getEntId).collect(Collectors.toList());
+    }
 }
 
 

+ 11 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserAreaServiceImpl.java

@@ -70,6 +70,17 @@ public class SysUserAreaServiceImpl extends ServiceImpl<SysUserAreaMapper, SysUs
         return this.list(Wrappers.<SysUserArea>lambdaQuery().eq(SysUserArea::getUserId, userId)).stream().map(SysUserArea::getAreaId).collect(Collectors.toList());
     }
 
+    /**
+     * 获取区域的人员
+     *
+     * @param areaIds 区域列表
+     * @return 人员列表
+     */
+    @Override
+    public List<Long> listAreaUser(Collection<Long> areaIds) {
+        return this.list(Wrappers.<SysUserArea>lambdaQuery().in(SysUserArea::getAreaId, areaIds)).stream().map(SysUserArea::getUserId).distinct().collect(Collectors.toList());
+    }
+
     /**
      * 删除用户的区域
      *

+ 22 - 34
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserServiceImpl.java

@@ -53,6 +53,7 @@ import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @author hnqz
@@ -75,7 +76,6 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     private final SysDeptRelationMapper sysDeptRelationMapper;
     private final RedisTemplate<String, Object> redisTemplate;
     private final SysDeptSubMapper sysDeptSubMapper;
-    private final SysUserSubMapper sysUserSubMapper;
     private final SysCsmUserRelationService sysCsmUserRelationService;
     private final SysUserAreaService userAreaService;
     private final SysAreaEntityService areaEntityService;
@@ -653,25 +653,13 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     }
 
     @Override
-    public IPage selectUserList(Page page, UserDTO userDTO) {
-
-        // 认证状态查询条件
-        if (StrUtil.isNotBlank(userDTO.getSubjectLocation()) && userDTO.getCertType() != null) {
-            LambdaQueryWrapper<SysUserSub> queryWrapper = Wrappers.<SysUserSub>lambdaQuery()
-                    //.eq(SysUserSub::getSubjectLocation, SubjectLocation.resolve(userDTO.getSubjectLocation()))
-                    .eq(SysUserSub::getCertStatus, userDTO.getCertType());
-            if (userDTO.getDeptId() != null) {
-                queryWrapper.eq(SysUserSub::getDeptId, userDTO.getDeptId());
-            }
-            List<SysUserSub> userSubList = sysUserSubMapper.selectList(queryWrapper);
-            if (CollUtil.isNotEmpty(userSubList)) {
-                Set<Integer> certUserIdSet = userSubList.stream().map(SysUserSub::getUserId).collect(Collectors.toSet());
-                userDTO.setUserIdList(CollUtil.newArrayList(certUserIdSet));
-            } else {
-                // 设置为不允许查到
-                userDTO.setUserIdList(CollUtil.newArrayList(-1));
-            }
-        }
+    public Page<UserVO> selectUserList(Page<UserVO> page, UserDTO userDTO, HnqzUser user) {
+
+        List<Long> areas = userAreaService.listUserAreas(Long.valueOf(user.getId()));
+
+        List<Integer> userid = userAreaService.listAreaUser(areas).stream().map(Long::intValue).collect(Collectors.toList());
+
+        userDTO.setUserIdList(userid);
 
         if (SecurityUtils.getRoles().contains(1) || SecurityUtils.getRoles().contains(2) || SecurityUtils.getRoles().contains(35)) {
             return baseMapper.getUserVosPage(page, userDTO, new DataScope());
@@ -683,20 +671,20 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
             userDTO.setCsmUserIdList(allUserIds);
             return baseMapper.getUserVosPage(page, userDTO, new DataScope());
         }
-//		else if (SecurityUtils.getRoles().contains(35)) {
-//			// BC总负责人数据权限
-//			List<Integer> bcRoles = Stream.of(3, 4, 5, 6, 7, 9, 10, 11, 13, 19, 31, 35).collect(Collectors.toList());
-//			if (CollUtil.isNotEmpty(userDTO.getRole())) {
-//				Collection<Integer> intersection = CollUtil.intersectionDistinct(bcRoles, userDTO.getRole());
-//				if (CollUtil.isEmpty(intersection)) {
-//					return page;
-//				}
-//				userDTO.setRole(new ArrayList<>(intersection));
-//			} else {
-//				userDTO.setRole(bcRoles);
-//			}
-//			return baseMapper.getUserVosPage(page, userDTO, new DataScope());
-//		}
+		else if (SecurityUtils.getRoles().contains(35)) {
+			// BC总负责人数据权限
+			List<Integer> bcRoles = Stream.of(3, 4, 5, 6, 7, 9, 10, 11, 13, 19, 31, 35, 37).collect(Collectors.toList());
+			if (CollUtil.isNotEmpty(userDTO.getRole())) {
+				Collection<Integer> intersection = CollUtil.intersectionDistinct(bcRoles, userDTO.getRole());
+				if (CollUtil.isEmpty(intersection)) {
+					return page;
+				}
+				userDTO.setRole(new ArrayList<>(intersection));
+			} else {
+				userDTO.setRole(bcRoles);
+			}
+			return baseMapper.getUserVosPage(page, userDTO, new DataScope());
+		}
         Integer deptId = userDTO.getDeptId();
 //		if (null != userDTO.getDeptId()) {
 //			deptId = userDTO.getDeptId();

+ 8 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDaAgentServiceImpl.java

@@ -34,6 +34,7 @@ import com.qunzhixinxi.hnqz.admin.service.SysCsmUserRelationService;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptRelationService;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
 import com.qunzhixinxi.hnqz.admin.service.SysEnterpriseAreaService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserAreaService;
 import com.qunzhixinxi.hnqz.admin.service.WmDaAgentService;
 import com.qunzhixinxi.hnqz.admin.service.WmDaDrugEntService;
 import com.qunzhixinxi.hnqz.admin.service.WmRelationService;
@@ -87,6 +88,7 @@ public class WmDaAgentServiceImpl extends ServiceImpl<WmDaAgentMapper, WmDaAgent
     private final SysDeptCsmMapper sysDeptCsmMapper;
     private final RedisTemplate<String, Object> redisTemplate;
     private final SysEnterpriseAreaService enterpriseAreaService;
+    private final SysUserAreaService sysUserAreaService;
 
     public String getDeptBuildName(String deptId) {
         String buildName = "";
@@ -221,6 +223,12 @@ public class WmDaAgentServiceImpl extends ServiceImpl<WmDaAgentMapper, WmDaAgent
             queryWrapper.like("zjNamber", wmDaAgent.getZjNumber());
         }
 
+        List<Long> areaIds = sysUserAreaService.listUserAreas(Long.valueOf(SecurityUtils.getUser().getId()));
+
+        List<Long> ents = enterpriseAreaService.listAreaEnts(areaIds);
+        wmDaAgent.setEntIds(ents);
+
+
         wmDaAgentMapper.selectWmManagementPage(page, wmDaAgent);
 
         if (CollUtil.isNotEmpty(page.getRecords())) {

+ 7 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDaDrugEntServiceImpl.java

@@ -11,6 +11,7 @@ import com.qunzhixinxi.hnqz.admin.mapper.WmDaDrugEntMapper;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptRelationService;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
 import com.qunzhixinxi.hnqz.admin.service.SysEnterpriseAreaService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserAreaService;
 import com.qunzhixinxi.hnqz.admin.service.WmDaDrugEntService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskSubmissionPercentRuleService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskSubmissionRuleService;
@@ -42,6 +43,7 @@ public class WmDaDrugEntServiceImpl extends ServiceImpl<WmDaDrugEntMapper, WmDaD
 	private final WmTaskSubmissionRuleService taskSubmissionRuleService;
 	private final SysEnterpriseAreaService enterpriseAreaService;
 	private final WmTaskSubmissionPercentRuleService taskSubmissionPercentRuleService;
+	private final SysUserAreaService sysUserAreaService;
 
 	@Override
 	@Transactional(rollbackFor = Exception.class)
@@ -167,8 +169,12 @@ public class WmDaDrugEntServiceImpl extends ServiceImpl<WmDaDrugEntMapper, WmDaD
 	 */
 	@Override
 	public void selectPage(Page<WmDaDrugEnt> page, WmDaDrugEnt wmDaDrugEnt) {
-		wmDaDrugEntMapper.selectPage(page, wmDaDrugEnt);
 
+		List<Long> areas = sysUserAreaService.listUserAreas(Long.valueOf(SecurityUtils.getUser().getId()));
+
+		List<Long> ents = enterpriseAreaService.listAreaEnts(areas);
+		wmDaDrugEnt.setEntIds(ents);
+		wmDaDrugEntMapper.selectPage(page, wmDaDrugEnt);
 		page.getRecords().forEach(ent -> {
 			List<Long> areaCodes = enterpriseAreaService.listEntAreas(Collections.singletonList(Long.valueOf(ent.getDeptId())));
 			ent.setAreaCodes(areaCodes);;

+ 14 - 15
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskContentServiceImpl.java

@@ -18,7 +18,6 @@ import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionPercentRule;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionRule;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskTypeSubCategory;
 import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
-import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmDaHospital;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmScorePackage;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmScorePackageStatus;
@@ -698,20 +697,20 @@ public class WmTaskContentServiceImpl extends ServiceImpl<WmTaskContentMapper, W
 				}
 
 				// 信用管理A/B/C 积分值设置
-				if ("51".equals(wmTaskContent.getTemp30())) {
-					// 根据选择的信用等级 查任务类型模板
-					WmTaskType baseTaskType = wmTaskTypeService.getById(wmTaskContent.getTemp23());
-					// 查询当前企业的任务类型积分
-					WmScorePackage wmScorePackage1 = wmScorePackageService.getById(wmTaskContent.getTemp32());
-					WmTaskType queryTaskType = new WmTaskType();
-					queryTaskType.setRuleId(wmScorePackage1.getRuleId());
-					queryTaskType.setTaskTypeName(baseTaskType.getTaskTypeName());
-					queryTaskType.setRuleId(wmScorePackage1.getRuleId());
-					score = wmTaskTypeService.getWmTaskTypeByEnt(queryTaskType);
-					// 设置实际的任务类型
-					wmTaskContent.setTemp30(wmTaskContent.getTemp23());
-					wmTask.setTaskTypeId(wmTaskContent.getTemp23());
-				}
+				//if ("51".equals(wmTaskContent.getTemp30())) {
+				//	// 根据选择的信用等级 查任务类型模板
+				//	WmTaskType baseTaskType = wmTaskTypeService.getById(wmTaskContent.getTemp23());
+				//	// 查询当前企业的任务类型积分
+				//	WmScorePackage wmScorePackage1 = wmScorePackageService.getById(wmTaskContent.getTemp32());
+				//	WmTaskType queryTaskType = new WmTaskType();
+				//	queryTaskType.setRuleId(wmScorePackage1.getRuleId());
+				//	queryTaskType.setTaskTypeName(baseTaskType.getTaskTypeName());
+				//	queryTaskType.setRuleId(wmScorePackage1.getRuleId());
+				//	score = wmTaskTypeService.getWmTaskTypeByEnt(queryTaskType);
+				//	// 设置实际的任务类型
+				//	wmTaskContent.setTemp30(wmTaskContent.getTemp23());
+				//	wmTask.setTaskTypeId(wmTaskContent.getTemp23());
+				//}
 				// 首营管理-诊所/药店
 				if ("56".equals(wmTaskContent.getTemp30())) {
 					// 根据选择的终端类型 查任务类型模板

+ 726 - 687
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmUserSignServiceImpl.java

@@ -3,11 +3,13 @@ package com.qunzhixinxi.hnqz.admin.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.copier.CopyOptions;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
+import com.qunzhixinxi.hnqz.admin.api.dto.WmUserSignDTO;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionPercentRule;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionRule;
 import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
@@ -15,11 +17,11 @@ import com.qunzhixinxi.hnqz.admin.api.entity.*;
 import com.qunzhixinxi.hnqz.admin.api.constant.enums.EnableEnum;
 import com.qunzhixinxi.hnqz.admin.api.constant.enums.PackageTypeEnum;
 import com.qunzhixinxi.hnqz.admin.event.TaskInfoImgEvent;
-import com.qunzhixinxi.hnqz.admin.mapper.WmTaskMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmUserSignMapper;
 import com.qunzhixinxi.hnqz.admin.service.*;
 import com.qunzhixinxi.hnqz.common.core.exception.BizException;
 import com.qunzhixinxi.hnqz.common.core.util.R;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
 import com.qunzhixinxi.hnqz.common.sequence.sequence.Sequence;
 import lombok.AllArgsConstructor;
@@ -27,14 +29,16 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
-import java.time.temporal.ChronoUnit;
+import java.time.format.DateTimeFormatter;
 import java.time.temporal.TemporalAdjusters;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -42,6 +46,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -56,691 +61,725 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserSign> implements WmUserSignService {
 
-	private final WmTaskContentService wmTaskContentService;
-	private final SysUserService sysUserService;
-	private final WmTaskTypeService wmTaskTypeService;
-	private final WmScorePackageService wmScorePackageService;
-	private final WmScorePackageStatusService wmScorePackageStatusService;
-	private final WmTaskService wmTaskService;
-	private final WmTaskMapper wmTaskMapper;
-	private final WmTaskContentService taskContentService;
-	private final SysPublicParamService sysPublicParamService;
-	private final WmDeptTaskTypeTemplateService wmDeptTaskTypeTemplateService;
-	private final WmUserSignDetailService wmUserSignDetailService;
-	private final WmTaskSubmissionPercentRuleService wmTaskSubmissionPercentRuleService;
-	private final WmTaskSubmissionRuleService wmTaskSubmissionRuleService;
-	private final WmDaPharmacyService wmDaPharmacyService;
-	private final ApplicationEventPublisher applicationEventPublisher;
-	private final Sequence taskSequence;
-
-	/**
-	 * 校验基础参数
-	 *
-	 * @param wmUserSign 参数
-	 * @return 任务ID
-	 */
-	private Map<String, String> checkBaseInfo(WmUserSign wmUserSign) {
-
-		if (StringUtils.isEmpty(wmUserSign.getSignEntId()) || StringUtils.isEmpty(wmUserSign.getSignEntName())) {
-			throw new BizException("打卡地址异常,请退出后重试");
-		}
-
-		String taskTypeId;
-		String baseTaskTypeId;
-		if ("1".equals(wmUserSign.getSignEntType())) {
-			taskTypeId = "5";
-			baseTaskTypeId = "5";
-		} else if ("2".equals(wmUserSign.getSignEntType())) {
-			taskTypeId = "6";
-			baseTaskTypeId = "6";
-		} else if ("3".equals(wmUserSign.getSignEntType())) {
-			baseTaskTypeId = "33";
-			// 根据药店类型 区分任务类型33-普通药店/73-连锁药房
-			WmDaPharmacy daPharmacy = wmDaPharmacyService.getById(wmUserSign.getSignEntId());
-			if (daPharmacy == null) {
-				throw new BizException("药店不存在或已停用");
-			}
-
-			switch (daPharmacy.getPharmacyType()) {
-				case ORDINARY:
-					taskTypeId = "33";
-					break;
-				case CHAIN:
-					taskTypeId = "73";
-					break;
-				default:
-					taskTypeId = "33";
-			}
-		} else {
-			throw new BizException("拜访类型不存在");
-		}
-
-		Map<String, String> result = new HashMap<>();
-		result.put("taskTypeId", taskTypeId);
-		result.put("baseTaskTypeId", baseTaskTypeId);
-
-		return result;
-	}
-
-	/**
-	 * 获取并校验积分包信息
-	 *
-	 * @param wmUserSign 签到信息
-	 * @return 积分包信息
-	 */
-	private WmScorePackage checkPkgInfo(WmUserSign wmUserSign) {
-		String pkgId = wmUserSign.getPackageId();
-		if (StringUtils.isEmpty(pkgId)) {
-			throw new BizException("关联积分包异常");
-		}
-
-		WmScorePackage tWmScorePackage = wmScorePackageService.getById(pkgId);
-
-		if (tWmScorePackage == null) {
-			log.warn("获取不到积分包:{}", pkgId);
-			throw new BizException("获取不到积分包");
-		}
-		if (LocalDate.now().isAfter(tWmScorePackage.getEndTime())) {
-			throw new BizException("当前积分包已过截止日期");
-		}
-
-		if (StringUtils.isEmpty(tWmScorePackage.getRuleId())) {
-			log.warn("积分包未配置积分规则:{}", pkgId);
-			throw new BizException("积分包未配置积分规则");
-		}
-
-		return tWmScorePackage;
-
-	}
-
-	/**
-	 * 获取用户
-	 *
-	 * @param wmUserSign 打卡信息
-	 * @return 用户vo
-	 */
-	private UserVO checkUser(WmUserSign wmUserSign) {
-
-		Integer userId = SecurityUtils.getUser().getId();
-		if (!userId.toString().equals(wmUserSign.getSignUserid())) {
-			log.warn("客户拜访任务,登录人不符:{}", wmUserSign.getSignUserid());
-			throw new BizException("客户拜访任务,登录人不符");
-		}
-
-		UserVO userVO = sysUserService.selectUserVoById(userId);
-
-		// 校验超过60周岁,不能做任务
-		Map<String, String> checkResult = sysUserService.checkSixtyYearsOld(userVO);
-		if (CollUtil.isNotEmpty(checkResult) && checkResult.containsKey("OVER")) {
-			throw new BizException(checkResult.get("OVER"));
-		}
-
-		return userVO;
-	}
-
-	/**
-	 * 校验任务类型规则
-	 *
-	 * @param entId      企业ID
-	 * @param taskTypeId 任务类型ID
-	 */
-	private void checkTaskTypeRules(Integer entId, String taskTypeId) {
-		List<WmTaskSubmissionPercentRule> taskTypeRules = wmTaskSubmissionPercentRuleService.list(Wrappers.<WmTaskSubmissionPercentRule>lambdaQuery()
-				.eq(WmTaskSubmissionPercentRule::getDeptId, entId)
-				.eq(WmTaskSubmissionPercentRule::getSubCategory, UpmsType.TaskSubCategory2.TASK_TYPE_CONFIG));
-		if (CollUtil.isEmpty(taskTypeRules)) {
-			throw new BizException("当前企业未开启该任务!");
-		}
-		String[] taskTypeIds = taskTypeRules.get(0).getRule().getTaskTypeIds();
-		if (!ArrayUtil.contains(taskTypeIds, taskTypeId)) {
-			throw new BizException("当前企业未开启该任务!");
-		}
-
-	}
-
-	/**
-	 * 校验百分比规则
-	 * 校验任务百分比限制规则(如果积分包值大于【任务配置】-【百分比限制】配置的起始值,
-	 * 且【任务配置】-【百分比限制】所选的任务类型对应的任务总完成积分值>积分包值*【任务配置】-【百分比限制】配置的百分比,则校验不通过)
-	 *
-	 * @param pkg   积分包
-	 * @param entId 企业ID
-	 */
-	private void checkPercentRule(WmScorePackage pkg, Integer entId) {
-		R<?> checkPercentRuleResult =
-				wmTaskSubmissionPercentRuleService.checkPercentRule(pkg, entId, null, Arrays.asList("5", "6", "33", "73"));
-		if (checkPercentRuleResult.getCode() != 0) {
-			throw new BizException(checkPercentRuleResult.getMsg());
-		}
-
-	}
-
-	/**
-	 * 校验任务类型是否启用
-	 *
-	 * @param taskTypeId 任务类型ID
-	 * @param ruleId     规则ID
-	 */
-	private void checkTaskType(String taskTypeId, String ruleId) {
-		WmTaskType _baseTaskType = wmTaskTypeService.getById(taskTypeId);
-		String typeName = _baseTaskType.getTaskTypeName();
-		List<WmTaskType> deptTaskTypes = wmTaskTypeService.list(Wrappers.<WmTaskType>lambdaQuery()
-				.eq(WmTaskType::getRuleId, ruleId)
-				.eq(WmTaskType::getTaskTypeName, typeName)
-				.eq(WmTaskType::getDelFlag, "0"));
-		if (CollUtil.isEmpty(deptTaskTypes)) {
-			throw new BizException(typeName + "任务类型不存在");
-		}
-		if (EnableEnum.DISABLE.val().equals(deptTaskTypes.get(0).getEnableFlag())) {
-			throw new BizException(typeName + "任务类型已停用");
-		}
-	}
-
-	/**
-	 * 获取积分包领取明细
-	 *
-	 * @param pkgId  积分包ID
-	 * @param userId 用户ID
-	 * @return 明细
-	 */
-	private WmScorePackageStatus checkPkgStatus(String pkgId, Integer userId) {
-
-		List<WmScorePackageStatus> statusList = wmScorePackageStatusService.list(Wrappers.<WmScorePackageStatus>lambdaQuery()
-				.eq(WmScorePackageStatus::getUserId, userId.toString())
-				.eq(WmScorePackageStatus::getStatus, "2")
-				.eq(WmScorePackageStatus::getTaskAddFlag, "1")
-				.eq(WmScorePackageStatus::getPackageId, pkgId)
-		);
-		if (CollectionUtils.isEmpty(statusList) || statusList.size() != 1) {
-			log.warn("获取积分包异常,任务保存失败:{}", pkgId);
-			throw new BizException("获取积分包领取异常,任务保存失败");
-		}
-
-		return statusList.get(0);
-	}
-
-	/**
-	 * 保存任务
-	 *
-	 * @param taskTypeId 任务ID
-	 * @param wmUserSign 用户签到信息
-	 * @param userVO     用户信息
-	 * @param pkg        积分包信息
-	 * @return 任务结果
-	 */
-	private WmTask createTask(String taskTypeId, WmUserSign wmUserSign, UserVO userVO, WmScorePackage pkg, int score) {
-
-		// 保存任务详情
-		WmTaskContent wmTaskContent = new WmTaskContent();
-		wmTaskContent.setTemp1(wmUserSign.getLatitude());
-		wmTaskContent.setTemp2(wmUserSign.getLongitude());
-		wmTaskContent.setTemp3(wmUserSign.getId().toString());
-		wmTaskContentService.save(wmTaskContent);
-
-		// 保存任务
-		WmTask wmTask = new WmTask();
-		wmTask.setTaskFrom("1");
-		wmTask.setTaskUserId(userVO.getUserId().toString());
-		wmTask.setTaskTypeId(taskTypeId);
-		wmTask.setSubmitStatus("0");
-		LocalDateTime now = LocalDateTime.now();
-		wmTask.setCreateTime(now);
-		wmTask.setUpdateTime(now);
-		wmTask.setLookintoDate(now);
-		wmTask.setTaskStatus("2"); //直接提交
-		wmTask.setDrugEntId(userVO.getDrugEntId());
-		wmTask.setDeptId(userVO.getDeptId().toString());
-		wmTask.setScorePackageId(pkg.getId());
-		wmTask.setTaskRuleId(pkg.getTaskRuleId());
-		wmTask.setTaskContentId(wmTaskContent.getId().toString());
-		wmTask.setTaskNumber(taskSequence.nextNo());
-		wmTask.setScore(score);
-
-		// 保存任务
-		wmTaskService.save(wmTask);
-
-		return wmTask;
-	}
-
-
-	/**
-	 * 操作积分包和领包状态, 判断任务完成度
-	 *
-	 * @param tWmScorePackage 积分包
-	 * @param packageStatus   领包记录
-	 * @param userVO          用户信息
-	 * @param taskTypeId      任务ID
-	 * @param wmUserSign      签到信息
-	 */
-	private void operatePkgAndPkgStatus(WmScorePackage tWmScorePackage, WmScorePackageStatus packageStatus, UserVO userVO, String taskTypeId, WmUserSign wmUserSign) {
-
-		//  查询出 审核通过和审核中的任务
-		List<WmTask> wmTaskList = wmTaskService.list(Wrappers.<WmTask>lambdaQuery()
-				.eq(WmTask::getScorePackageId, tWmScorePackage.getId())
-				.ne(WmTask::getTaskStatus, "4")
-				.eq(WmTask::getRealFlag, "0"));
-
-		// 判断定量还是定额 1- 定额   2-定量
-		// 20210120 目前 1-定额  1包1人  2-定量   1包多人
-		if ("1".equals(tWmScorePackage.getPackageType1())) {
-
-			int totalCount = wmTaskList.stream().mapToInt(WmTask::getScore).sum();
-
-			if (totalCount >= tWmScorePackage.getScore()) {
-				tWmScorePackage.setTaskAddFlag("0");
-				packageStatus.setTaskAddFlag("0");
-				wmScorePackageStatusService.updateById(packageStatus);
-			}
-
-		} else if ("2".equals(tWmScorePackage.getPackageType1())) {
-
-			String userIdStr = userVO.getUserId().toString();
-			long count = wmTaskList.stream().filter(item -> item.getTaskUserId().equals(userIdStr)).count();
-
-			if (count - packageStatus.getTaskNum() >= 0) {
-				packageStatus.setTaskAddFlag("0");
-				wmScorePackageStatusService.updateById(packageStatus);
-
-				// 改变大包状态
-				List<WmScorePackageStatus> statusAll = wmScorePackageStatusService.list(Wrappers.<WmScorePackageStatus>lambdaQuery()
-						.eq(WmScorePackageStatus::getPackageId, tWmScorePackage.getId())
-						.eq(WmScorePackageStatus::getStatus, "2")
-						.eq(WmScorePackageStatus::getTaskAddFlag, "0"));
-				if (new BigDecimal(tWmScorePackage.getUserNum()).compareTo(new BigDecimal(statusAll.size())) <= 0) {
-					tWmScorePackage.setTaskAddFlag("0");
-				}
-			}
-		}
-
-		tWmScorePackage.setIsConduct("1");
-		wmScorePackageService.updateById(tWmScorePackage);
-
-	}
-
-
-	/**
-	 * 校验打卡规则
-	 *
-	 * @param taskTypeId          任务类型
-	 * @param wmUserSign          签到信息
-	 * @param relatedServiceEntId 关联企业
-	 */
-	private void checkByRule(String taskTypeId, WmUserSign wmUserSign, String relatedServiceEntId) {
-		// 校验药店打卡
-		if ("33".equals(taskTypeId)) {
-			checkPharmacySign(relatedServiceEntId, wmUserSign);
-		}
-		// 医院拜访
-		else if ("5".equals(taskTypeId)) {
-			checkHospitalSign(relatedServiceEntId, wmUserSign);
-		}
-		// 商业公司拜访
-		else {
-			checkBizSign(relatedServiceEntId, wmUserSign);
-		}
-
-
-	}
-
-	/**
-	 * 校验药店打卡
-	 *
-	 * @param relatedServiceEntId 关联企业
-	 * @param wmUserSign          签到信息
-	 */
-	private void checkPharmacySign(String relatedServiceEntId, WmUserSign wmUserSign) {
-		checkCommonSign("33", relatedServiceEntId, wmUserSign);
-	}
-
-	/**
-	 * 校验医院打卡
-	 *
-	 * @param relatedServiceEntId 关联企业
-	 * @param wmUserSign          签到信息
-	 */
-	private void checkHospitalSign(String relatedServiceEntId, WmUserSign wmUserSign) {
-
-		checkCommonSign("5", relatedServiceEntId, wmUserSign);
-
-	}
-
-	/**
-	 * 校验商业公司打卡
-	 *
-	 * @param relatedServiceEntId 关联企业
-	 * @param wmUserSign          签到信息
-	 */
-	private void checkBizSign(String relatedServiceEntId, WmUserSign wmUserSign) {
-		checkCommonSign("6", relatedServiceEntId, wmUserSign);
-	}
-
-	/**
-	 * 公用打卡校验
-	 *
-	 * @param taskTypeId          任务类型
-	 * @param relatedServiceEntId 服务企业
-	 * @param wmUserSign          签到信息
-	 */
-	@SuppressWarnings("unchecked")
-	private void checkCommonSign(String taskTypeId, String relatedServiceEntId, WmUserSign wmUserSign) {
-
-		List<WmTaskSubmissionRule.SubmissionRule> rules = wmTaskContentService.getTaskSubmissionRule(taskTypeId, relatedServiceEntId);
-
-		Map<String, Integer> eachLimitMap = new HashMap<>(3);
-		Map<String, Integer> totalLimitMap = new HashMap<>(3);
-
-		if (CollUtil.isNotEmpty(rules)) {
-			// 获取限制
-			for (int i = 0, size = rules.size(); i < size; i++) {
-				Map<String, Object> map = (Map<String, Object>) rules.get(i);
-				WmTaskSubmissionRule.SubmissionRule r = BeanUtil.mapToBean(map, WmTaskSubmissionRule.SubmissionRule.class, true, new CopyOptions());
-
-				if ("拜访次数上限".equals(r.getManual())) {
-					r.getFrequency().forEach(f -> {
-
-						// 获取数量
-						Object o = f.get("quantity");
-						int limit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
-
-						// 获取单位
-						String timeUnit = (String) f.get("timeUnit");
-
-						// 同一个单位只记录最小的
-						if (totalLimitMap.containsKey(timeUnit)) {
-							Integer l1 = totalLimitMap.get(timeUnit);
-							if (l1 != null && l1 > limit) {
-								totalLimitMap.put(timeUnit, limit);
-							}
-						} else {
-							totalLimitMap.put(timeUnit, limit);
-						}
-
-					});
-
-				}
-				if (r.getManual().startsWith("同一个人")) {
-
-					r.getFrequency().forEach(f -> {
-
-						// 获取数量
-						Object o = f.get("quantity");
-						int limit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
-
-						// 获取单位
-						String timeUnit = (String) f.get("timeUnit");
-
-						// 同一个单位只记录最小的
-						if (eachLimitMap.containsKey(timeUnit)) {
-							Integer l1 = eachLimitMap.get(timeUnit);
-							if (l1 != null && l1 > limit) {
-								eachLimitMap.put(timeUnit, limit);
-							}
-						} else {
-							eachLimitMap.put(timeUnit, limit);
-						}
-
-					});
-
-				}
-			}
-		}
-
-		// 月度为最大单位,以当前时间所在自然月查询范围, 获取签到记录
-		LocalDateTime now = LocalDateTime.now();
-		LocalDateTime start = now.with(TemporalAdjusters.firstDayOfMonth());
-		List<WmUserSign> signs = this.list(Wrappers.<WmUserSign>lambdaQuery()
-				.eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
-				.eq(WmUserSign::getTaskTypeId, taskTypeId)
-				.between(WmUserSign::getSignDate, start, now));
-
-		// 本月未有打卡记录
-		if (CollUtil.isEmpty(signs)) {
-			log.info("当前用户本月不存在打卡任务,放行");
-			return;
-		}
-
-		Set<Integer> signIds = signs.stream().map(WmUserSign::getId).collect(Collectors.toSet());
-
-		List<WmTaskContent> taskContents = taskContentService.list(Wrappers.<WmTaskContent>lambdaQuery()
-				.in(WmTaskContent::getTemp3, signIds)
-				.isNull(WmTaskContent::getTemp30));
-
-		List<WmTaskContent> availTaskContents = taskContents.stream().filter(con -> StrUtil.isNotBlank(con.getTemp3())).collect(Collectors.toList());
-
-		if (CollUtil.isEmpty(availTaskContents)) {
-			log.info("当前用户本月不存在打卡任务记录,放行");
-			return;
-		}
-
-		Map<String, String> signIdAndContentIdMap = availTaskContents.stream().collect(Collectors.toMap(WmTaskContent::getTemp3, cont -> cont.getId().toString()));
-
-		List<WmTask> taskList = wmTaskService.list(Wrappers.<WmTask>lambdaQuery()
-				.eq(WmTask::getTaskUserId, wmUserSign.getSignUserid())
-				.eq(WmTask::getTaskTypeId, taskTypeId)
-				.in(WmTask::getTaskContentId, signIdAndContentIdMap.values()));
-
-		Map<String, WmTask> taskMap = taskList.stream().collect(Collectors.toMap(WmTask::getTaskContentId, Function.identity()));
-
-		List<WmUserSign> availSigned = signs.stream().filter(sign -> {
-			String contId = signIdAndContentIdMap.get(sign.getId().toString());
-			log.info("任务内容ID为:[{}]", contId);
-			if (StrUtil.isBlank(contId)) {
-				return false;
-			}
-
-			WmTask wmTask = taskMap.get(contId);
-
-			if (wmTask == null) {
-				return false;
-			}
-
-			String taskStatus = wmTask.getTaskStatus();
-			log.info("当前任务ID:[{}], 对应的任务状态为:[{}]", contId, taskStatus);
-			return "2".equals(taskStatus) || "3".equals(taskStatus);
-
-		}).collect(Collectors.toList());
-
-		// 校验 同一个人,对同一拜访对象
-		Map<String, List<WmUserSign>> collect = availSigned.stream().collect(Collectors.groupingBy(WmUserSign::getSignEntId));
-		List<WmUserSign> wmUserSigns = collect.get(wmUserSign.getSignEntId());
-		if (CollUtil.isNotEmpty(wmUserSigns)) {
-
-			int currCount = wmUserSigns.size();
-			log.info("当前用户同一地点本月已完成次数:[{}]", currCount);
-			Integer monthLimit = eachLimitMap.get("MONTH");
-			log.info("同一个人,对同一拜访对象打卡每月限制:[{}]", monthLimit);
-			if (monthLimit != null && monthLimit <= currCount) {
-				log.warn("超过同一个人,对同一拜访对象打卡每月限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
-				throw new BizException("超过同一个人,对同一拜访对象打卡每月限制");
-			}
-
-			Integer dailyLimit = eachLimitMap.get("DAY");
-			log.info("同一个人,对同一拜访对象打卡每日限制:[{}]", dailyLimit);
-			if (dailyLimit != null) {
-				LocalDateTime todayStart = LocalDateTime.of(now.toLocalDate(), LocalTime.MIN);
-				long dailyCount = wmUserSigns.stream().filter(sign -> sign.getSignDate().isAfter(todayStart)).count();
-				log.info("当前用户同一地点本日已完成次数:[{}]", dailyCount);
-				if (dailyLimit <= dailyCount) {
-					log.warn("超过同一个人,对同一拜访对象打卡每日限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
-					throw new BizException("超过同一个人,对同一拜访对象打卡每日限制");
-				}
-			}
-
-			Integer hourLimit = eachLimitMap.get("HOUR");
-			log.info("同一个人,对同一拜访对象打卡每小时限制:[{}]", hourLimit);
-			if (hourLimit != null) {
-				LocalDateTime hourStart = now.minusHours(1L);
-				long hourCount = wmUserSigns.stream().filter(sign -> sign.getSignDate().isAfter(hourStart)).count();
-				log.info("当前用户同一地点本小时已完成次数:[{}]", hourCount);
-				if (hourLimit <= hourCount) {
-					log.warn("超过同一个人,对同一拜访对象打卡每小时限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
-					throw new BizException("超过同一个人,对同一拜访对象打卡每小时限制");
-				}
-			}
-		} else {
-			log.info("当前用户本月不存在关于该企业的打卡任务,放行");
-		}
-
-
-		//  校验当日的拜访限制
-		int currCount = availSigned.size();
-		log.info("当前用户本月已完成打卡次数:[{}]", currCount);
-		Integer monthLimit = totalLimitMap.get("MONTH");
-		log.info("拜访次数上限打卡每月限制:[{}]", monthLimit);
-		if (monthLimit != null && monthLimit <= currCount) {
-			log.warn("超过拜访次数上限打卡每月限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
-			throw new BizException("超过拜访次数上限打卡每月限制");
-		}
-
-		Integer dailyLimit = totalLimitMap.get("DAY");
-		log.info("拜访次数上限打卡每天限制:[{}]", dailyLimit);
-		if (dailyLimit != null) {
-			LocalDateTime todayStart = LocalDateTime.of(now.toLocalDate(), LocalTime.MIN);
-			long dailyCount = availSigned.stream().filter(sign -> sign.getSignDate().isAfter(todayStart)).count();
-			log.info("当前用户本日已完成打卡次数:[{}]", dailyCount);
-			if (dailyLimit <= dailyCount) {
-				log.warn("超过拜访次数上限打卡每日限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
-				throw new BizException("超过拜访次数上限打卡每日限制");
-			}
-		}
-
-		Integer hourLimit = totalLimitMap.get("HOUR");
-		log.info("拜访次数上限打卡每小时限制:[{}]", hourLimit);
-		if (hourLimit != null) {
-			LocalDateTime hourStart = now.minusHours(1L);
-			long hourCount = availSigned.stream().filter(sign -> sign.getSignDate().isAfter(hourStart)).count();
-			log.info("当前用户本小时已完成打卡次数:[{}]", hourCount);
-			if (hourLimit <= hourCount) {
-				log.warn("超过拜访次数上限打卡每小时限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
-				throw new BizException("超过拜访次数上限打卡每小时限制");
-			}
-		}
-
-	}
-
-
-	@Override
-	@Transactional(rollbackFor = Exception.class)
-	public R<?> saveWmUserSign(WmUserSign wmUserSign) {
-		// 校验基础参数
-		Map<String, String> taskTypeMap = checkBaseInfo(wmUserSign);
-		// 细分任务类型
-		String taskTypeId = taskTypeMap.get("taskTypeId");
-		// 基础任务类型
-		String baseTaskTypeId = taskTypeMap.get("baseTaskTypeId");
-
-		// 校验积分包
-		WmScorePackage tWmScorePackage = checkPkgInfo(wmUserSign);
-
-		// 获取用户
-		UserVO sysU = checkUser(wmUserSign);
-
-		// 查询任务类型启用状态
-		checkTaskTypeRules(sysU.getDeptId(), taskTypeId);
-
-		// 校验任务类型是否启用
-		checkTaskType(taskTypeId, tWmScorePackage.getRuleId());
-
-		// 根据规则校验限制
-		checkByRule(taskTypeId, wmUserSign, tWmScorePackage.getRelatedService());
-
-		// 校验百分比参数
-		checkPercentRule(tWmScorePackage, sysU.getDeptId());
-
-		// 校验积分包领取明细
-		WmScorePackageStatus packageStatus = checkPkgStatus(tWmScorePackage.getId(), sysU.getUserId());
-
-		// 校验积分限制
-		if (StrUtil.equals(PackageTypeEnum.TYPE1_SCOTE_PACKAGE.val(), tWmScorePackage.getPackageType1())
-				|| StrUtil.equals(PackageTypeEnum.TYPE1_SCORE_AND_TASK_PACKAGE.val(), tWmScorePackage.getPackageType1())) {
-			wmTaskContentService.limitScore(sysU.getUserId(), sysU.getDeptId(), "1");
-		}
-
-		// 设置参数 && 保存
-		if (StringUtils.isEmpty(wmUserSign.getSignEntType())) {
-			wmUserSign.setSignEntType("1");
-		}
-		wmUserSign.setTaskTypeId(taskTypeId);
-		boolean saveSign = this.save(wmUserSign);
-
-		// 保存后续操作
-		if (saveSign) {
-
-			// 获取任务类型积分
-			WmTaskType wmTaskType = new WmTaskType();
-			wmTaskType.setTaskTypeName(wmTaskTypeService.getById(taskTypeId).getTaskTypeName());
-			wmTaskType.setRuleId(tWmScorePackage.getRuleId());
-			int score = wmTaskTypeService.getWmTaskTypeByEnt(wmTaskType);
-			if (score < 0) {
-				throw new BizException("获取任务积分失败");
-			}
-
-			// 保存签到详情, 获取任务分值
-			int detailScore = saveSignDetail(wmUserSign, sysU.getDeptId(), baseTaskTypeId, score);
-			log.info("精细化拜访实际任务分值:{}", detailScore);
-
-			// 保存任务
-			WmTask task = createTask(taskTypeId, wmUserSign, sysU, tWmScorePackage, detailScore);
-			task.setType(tWmScorePackage.getPackageType1());
-
-			// 操作积分包
-			operatePkgAndPkgStatus(tWmScorePackage, packageStatus, sysU, taskTypeId, wmUserSign);
-
-			// 推送任务h5截图
-			applicationEventPublisher.publishEvent(new TaskInfoImgEvent(task.getId()));
-
-			return R.ok(task);
-		}
-
-		return R.failed("签到保存失败");
-	}
-
-	/**
-	 * 保存签到详情
-	 *
-	 * @param wmUserSign 打卡信息
-	 * @param deptId     部门id
-	 * @param taskTypeId 任务类型id
-	 * @param baseScore  任务类型规则分数
-	 * @return int 任务实际分值(拜访科室数 * 任务类型规则分数)
-	 */
-	private int saveSignDetail(WmUserSign wmUserSign, Integer deptId, String taskTypeId, Integer baseScore) {
-		int minDeptmentLimit = 1;
-		// 如果配置了精细化拜访的任务类型模板,则关联保存签到详情
-		List<WmDeptTaskTypeTemplate> taskTypeTemplates = wmDeptTaskTypeTemplateService.getTemplate(deptId, taskTypeId);
-		if (CollUtil.isNotEmpty(taskTypeTemplates)) {
-			WmUserSignDetail userSignDetail = wmUserSign.getUserSignDetail();
-			if (userSignDetail != null) {
-				WmDeptTaskTypeTemplate taskTypeTemplate = taskTypeTemplates.get(0);
-				// 医院拜访限制科室个数
-				if (StrUtil.equals(taskTypeTemplate.getTaskTypeId(), "5")) {
-					Map<String, Object> detail = taskTypeTemplate.getDetail();
-					int numberLimit = 1;
-					if (CollUtil.isNotEmpty(detail)) {
-						numberLimit = (int) detail.getOrDefault("numberLimit", 1);
-					}
-
-					List<Map<String, Object>> signDetailDetail = userSignDetail.getDetail();
-					if (CollUtil.isNotEmpty(signDetailDetail)) {
-						// 模板配置的numberLimit 和 实际传参的拜访科室个数 取最小值
-						minDeptmentLimit = Math.min(numberLimit, signDetailDetail.size());
-
-						List<String> departmentList = new ArrayList<>(signDetailDetail.size());
-						for (Map<String, Object> detailMap : signDetailDetail) {
-							String departmentName = (String) detailMap.get("departmentName");
+    private final WmTaskContentService wmTaskContentService;
+    private final SysUserService sysUserService;
+    private final WmTaskTypeService wmTaskTypeService;
+    private final WmScorePackageService wmScorePackageService;
+    private final WmScorePackageStatusService wmScorePackageStatusService;
+    private final WmTaskService wmTaskService;
+    private final WmTaskContentService taskContentService;
+    private final WmDeptTaskTypeTemplateService wmDeptTaskTypeTemplateService;
+    private final WmUserSignDetailService wmUserSignDetailService;
+    private final WmTaskSubmissionPercentRuleService wmTaskSubmissionPercentRuleService;
+    private final WmDaPharmacyService wmDaPharmacyService;
+    private final ApplicationEventPublisher applicationEventPublisher;
+    private final Sequence taskSequence;
+    private final RedisTemplate<String, Object> redisTemplate;
+
+    /**
+     * 校验基础参数
+     *
+     * @param wmUserSign 参数
+     * @return 任务ID
+     */
+    private Map<String, String> checkBaseInfo(WmUserSign wmUserSign) {
+
+        if (StringUtils.isEmpty(wmUserSign.getSignEntId()) || StringUtils.isEmpty(wmUserSign.getSignEntName())) {
+            throw new BizException("打卡地址异常,请退出后重试");
+        }
+
+        String taskTypeId;
+        String baseTaskTypeId;
+        if ("1".equals(wmUserSign.getSignEntType())) {
+            taskTypeId = "5";
+            baseTaskTypeId = "5";
+        } else if ("2".equals(wmUserSign.getSignEntType())) {
+            taskTypeId = "6";
+            baseTaskTypeId = "6";
+        } else if ("3".equals(wmUserSign.getSignEntType())) {
+            baseTaskTypeId = "33";
+            // 根据药店类型 区分任务类型33-普通药店/73-连锁药房
+            WmDaPharmacy daPharmacy = wmDaPharmacyService.getById(wmUserSign.getSignEntId());
+            if (daPharmacy == null) {
+                throw new BizException("药店不存在或已停用");
+            }
+
+            switch (daPharmacy.getPharmacyType()) {
+                case ORDINARY:
+                    taskTypeId = "33";
+                    break;
+                case CHAIN:
+                    taskTypeId = "73";
+                    break;
+                default:
+                    taskTypeId = "33";
+            }
+        } else {
+            throw new BizException("拜访类型不存在");
+        }
+
+        Map<String, String> result = new HashMap<>();
+        result.put("taskTypeId", taskTypeId);
+        result.put("baseTaskTypeId", baseTaskTypeId);
+
+        return result;
+    }
+
+    /**
+     * 获取并校验积分包信息
+     *
+     * @param wmUserSign 签到信息
+     * @return 积分包信息
+     */
+    private WmScorePackage checkPkgInfo(WmUserSign wmUserSign) {
+        String pkgId = wmUserSign.getPackageId();
+        if (StringUtils.isEmpty(pkgId)) {
+            throw new BizException("关联积分包异常");
+        }
+
+        WmScorePackage tWmScorePackage = wmScorePackageService.getById(pkgId);
+
+        if (tWmScorePackage == null) {
+            log.warn("获取不到积分包:{}", pkgId);
+            throw new BizException("获取不到积分包");
+        }
+        if (LocalDate.now().isAfter(tWmScorePackage.getEndTime())) {
+            throw new BizException("当前积分包已过截止日期");
+        }
+
+        if (StringUtils.isEmpty(tWmScorePackage.getRuleId())) {
+            log.warn("积分包未配置积分规则:{}", pkgId);
+            throw new BizException("积分包未配置积分规则");
+        }
+
+        return tWmScorePackage;
+
+    }
+
+    /**
+     * 获取用户
+     *
+     * @param wmUserSign 打卡信息
+     * @return 用户vo
+     */
+    private UserVO checkUser(WmUserSign wmUserSign) {
+
+        Integer userId = SecurityUtils.getUser().getId();
+        if (!userId.toString().equals(wmUserSign.getSignUserid())) {
+            log.warn("客户拜访任务,登录人不符:{}", wmUserSign.getSignUserid());
+            throw new BizException("客户拜访任务,登录人不符");
+        }
+
+        UserVO userVO = sysUserService.selectUserVoById(userId);
+
+        // 校验超过60周岁,不能做任务
+        Map<String, String> checkResult = sysUserService.checkSixtyYearsOld(userVO);
+        if (CollUtil.isNotEmpty(checkResult) && checkResult.containsKey("OVER")) {
+            throw new BizException(checkResult.get("OVER"));
+        }
+
+        return userVO;
+    }
+
+    /**
+     * 校验任务类型规则
+     *
+     * @param entId      企业ID
+     * @param taskTypeId 任务类型ID
+     */
+    private void checkTaskTypeRules(Integer entId, String taskTypeId) {
+        List<WmTaskSubmissionPercentRule> taskTypeRules = wmTaskSubmissionPercentRuleService.list(Wrappers.<WmTaskSubmissionPercentRule>lambdaQuery()
+                .eq(WmTaskSubmissionPercentRule::getDeptId, entId)
+                .eq(WmTaskSubmissionPercentRule::getSubCategory, UpmsType.TaskSubCategory2.TASK_TYPE_CONFIG));
+        if (CollUtil.isEmpty(taskTypeRules)) {
+            throw new BizException("当前企业未开启该任务!");
+        }
+        String[] taskTypeIds = taskTypeRules.get(0).getRule().getTaskTypeIds();
+        if (!ArrayUtil.contains(taskTypeIds, taskTypeId)) {
+            throw new BizException("当前企业未开启该任务!");
+        }
+
+    }
+
+    /**
+     * 校验百分比规则
+     * 校验任务百分比限制规则(如果积分包值大于【任务配置】-【百分比限制】配置的起始值,
+     * 且【任务配置】-【百分比限制】所选的任务类型对应的任务总完成积分值>积分包值*【任务配置】-【百分比限制】配置的百分比,则校验不通过)
+     *
+     * @param pkg   积分包
+     * @param entId 企业ID
+     */
+    private void checkPercentRule(WmScorePackage pkg, Integer entId) {
+        R<?> checkPercentRuleResult =
+                wmTaskSubmissionPercentRuleService.checkPercentRule(pkg, entId, null, Arrays.asList("5", "6", "33", "73"));
+        if (checkPercentRuleResult.getCode() != 0) {
+            throw new BizException(checkPercentRuleResult.getMsg());
+        }
+
+    }
+
+    /**
+     * 校验任务类型是否启用
+     *
+     * @param taskTypeId 任务类型ID
+     * @param ruleId     规则ID
+     */
+    private void checkTaskType(String taskTypeId, String ruleId) {
+        WmTaskType _baseTaskType = wmTaskTypeService.getById(taskTypeId);
+        String typeName = _baseTaskType.getTaskTypeName();
+        List<WmTaskType> deptTaskTypes = wmTaskTypeService.list(Wrappers.<WmTaskType>lambdaQuery()
+                .eq(WmTaskType::getRuleId, ruleId)
+                .eq(WmTaskType::getTaskTypeName, typeName)
+                .eq(WmTaskType::getDelFlag, "0"));
+        if (CollUtil.isEmpty(deptTaskTypes)) {
+            throw new BizException(typeName + "任务类型不存在");
+        }
+        if (EnableEnum.DISABLE.val().equals(deptTaskTypes.get(0).getEnableFlag())) {
+            throw new BizException(typeName + "任务类型已停用");
+        }
+    }
+
+    /**
+     * 获取积分包领取明细
+     *
+     * @param pkgId  积分包ID
+     * @param userId 用户ID
+     * @return 明细
+     */
+    private WmScorePackageStatus checkPkgStatus(String pkgId, Integer userId) {
+
+        List<WmScorePackageStatus> statusList = wmScorePackageStatusService.list(Wrappers.<WmScorePackageStatus>lambdaQuery()
+                .eq(WmScorePackageStatus::getUserId, userId.toString())
+                .eq(WmScorePackageStatus::getStatus, "2")
+                .eq(WmScorePackageStatus::getTaskAddFlag, "1")
+                .eq(WmScorePackageStatus::getPackageId, pkgId)
+        );
+        if (CollectionUtils.isEmpty(statusList) || statusList.size() != 1) {
+            log.warn("获取积分包异常,任务保存失败:{}", pkgId);
+            throw new BizException("获取积分包领取异常,任务保存失败");
+        }
+
+        return statusList.get(0);
+    }
+
+    /**
+     * 保存任务
+     *
+     * @param taskTypeId 任务ID
+     * @param wmUserSign 用户签到信息
+     * @param userVO     用户信息
+     * @param pkg        积分包信息
+     * @return 任务结果
+     */
+    private WmTask createTask(String taskTypeId, WmUserSign wmUserSign, UserVO userVO, WmScorePackage pkg, int score) {
+
+        // 保存任务详情
+        WmTaskContent wmTaskContent = new WmTaskContent();
+        wmTaskContent.setTemp1(wmUserSign.getLatitude());
+        wmTaskContent.setTemp2(wmUserSign.getLongitude());
+        wmTaskContent.setTemp3(wmUserSign.getId().toString());
+        wmTaskContentService.save(wmTaskContent);
+
+        // 保存任务
+        WmTask wmTask = new WmTask();
+        wmTask.setTaskFrom("1");
+        wmTask.setTaskUserId(userVO.getUserId().toString());
+        wmTask.setTaskTypeId(taskTypeId);
+        wmTask.setSubmitStatus("0");
+        LocalDateTime now = LocalDateTime.now();
+        wmTask.setCreateTime(now);
+        wmTask.setUpdateTime(now);
+        wmTask.setLookintoDate(now);
+        wmTask.setTaskStatus("2"); //直接提交
+        wmTask.setDrugEntId(userVO.getDrugEntId());
+        wmTask.setDeptId(userVO.getDeptId().toString());
+        wmTask.setScorePackageId(pkg.getId());
+        wmTask.setTaskRuleId(pkg.getTaskRuleId());
+        wmTask.setTaskContentId(wmTaskContent.getId().toString());
+        wmTask.setTaskNumber(taskSequence.nextNo());
+        wmTask.setScore(score);
+
+        // 保存任务
+        wmTaskService.save(wmTask);
+
+        return wmTask;
+    }
+
+
+    /**
+     * 操作积分包和领包状态, 判断任务完成度
+     *
+     * @param tWmScorePackage 积分包
+     * @param packageStatus   领包记录
+     * @param userVO          用户信息
+     * @param taskTypeId      任务ID
+     * @param wmUserSign      签到信息
+     */
+    private void operatePkgAndPkgStatus(WmScorePackage tWmScorePackage, WmScorePackageStatus packageStatus, UserVO userVO, String taskTypeId, WmUserSign wmUserSign) {
+
+        //  查询出 审核通过和审核中的任务
+        List<WmTask> wmTaskList = wmTaskService.list(Wrappers.<WmTask>lambdaQuery()
+                .eq(WmTask::getScorePackageId, tWmScorePackage.getId())
+                .ne(WmTask::getTaskStatus, "4")
+                .eq(WmTask::getRealFlag, "0"));
+
+        // 判断定量还是定额 1- 定额   2-定量
+        // 20210120 目前 1-定额  1包1人  2-定量   1包多人
+        if ("1".equals(tWmScorePackage.getPackageType1())) {
+
+            int totalCount = wmTaskList.stream().mapToInt(WmTask::getScore).sum();
+
+            if (totalCount >= tWmScorePackage.getScore()) {
+                tWmScorePackage.setTaskAddFlag("0");
+                packageStatus.setTaskAddFlag("0");
+                wmScorePackageStatusService.updateById(packageStatus);
+            }
+
+        } else if ("2".equals(tWmScorePackage.getPackageType1())) {
+
+            String userIdStr = userVO.getUserId().toString();
+            long count = wmTaskList.stream().filter(item -> item.getTaskUserId().equals(userIdStr)).count();
+
+            if (count - packageStatus.getTaskNum() >= 0) {
+                packageStatus.setTaskAddFlag("0");
+                wmScorePackageStatusService.updateById(packageStatus);
+
+                // 改变大包状态
+                List<WmScorePackageStatus> statusAll = wmScorePackageStatusService.list(Wrappers.<WmScorePackageStatus>lambdaQuery()
+                        .eq(WmScorePackageStatus::getPackageId, tWmScorePackage.getId())
+                        .eq(WmScorePackageStatus::getStatus, "2")
+                        .eq(WmScorePackageStatus::getTaskAddFlag, "0"));
+                if (new BigDecimal(tWmScorePackage.getUserNum()).compareTo(new BigDecimal(statusAll.size())) <= 0) {
+                    tWmScorePackage.setTaskAddFlag("0");
+                }
+            }
+        }
+
+        tWmScorePackage.setIsConduct("1");
+        wmScorePackageService.updateById(tWmScorePackage);
+
+    }
+
+
+    /**
+     * 校验打卡规则
+     *
+     * @param taskTypeId          任务类型
+     * @param wmUserSign          签到信息
+     * @param relatedServiceEntId 关联企业
+     */
+    private void checkByRule(String taskTypeId, WmUserSign wmUserSign, String relatedServiceEntId) {
+        // 校验药店打卡
+        if ("33".equals(taskTypeId)) {
+            checkPharmacySign(relatedServiceEntId, wmUserSign);
+        }
+        // 医院拜访
+        else if ("5".equals(taskTypeId)) {
+            checkHospitalSign(relatedServiceEntId, wmUserSign);
+        }
+        // 商业公司拜访
+        else {
+            checkBizSign(relatedServiceEntId, wmUserSign);
+        }
+
+
+    }
+
+    /**
+     * 校验药店打卡
+     *
+     * @param relatedServiceEntId 关联企业
+     * @param wmUserSign          签到信息
+     */
+    private void checkPharmacySign(String relatedServiceEntId, WmUserSign wmUserSign) {
+        checkCommonSign("33", relatedServiceEntId, wmUserSign);
+    }
+
+    /**
+     * 校验医院打卡
+     *
+     * @param relatedServiceEntId 关联企业
+     * @param wmUserSign          签到信息
+     */
+    private void checkHospitalSign(String relatedServiceEntId, WmUserSign wmUserSign) {
+
+        checkCommonSign("5", relatedServiceEntId, wmUserSign);
+
+    }
+
+    /**
+     * 校验商业公司打卡
+     *
+     * @param relatedServiceEntId 关联企业
+     * @param wmUserSign          签到信息
+     */
+    private void checkBizSign(String relatedServiceEntId, WmUserSign wmUserSign) {
+        checkCommonSign("6", relatedServiceEntId, wmUserSign);
+    }
+
+    /**
+     * 公用打卡校验
+     *
+     * @param taskTypeId          任务类型
+     * @param relatedServiceEntId 服务企业
+     * @param wmUserSign          签到信息
+     */
+    @SuppressWarnings("unchecked")
+    private void checkCommonSign(String taskTypeId, String relatedServiceEntId, WmUserSign wmUserSign) {
+
+        List<WmTaskSubmissionRule.SubmissionRule> rules = wmTaskContentService.getTaskSubmissionRule(taskTypeId, relatedServiceEntId);
+
+        Map<String, Integer> eachLimitMap = new HashMap<>(3);
+        Map<String, Integer> totalLimitMap = new HashMap<>(3);
+
+        if (CollUtil.isNotEmpty(rules)) {
+            // 获取限制
+            for (int i = 0, size = rules.size(); i < size; i++) {
+                Map<String, Object> map = (Map<String, Object>) rules.get(i);
+                WmTaskSubmissionRule.SubmissionRule r = BeanUtil.mapToBean(map, WmTaskSubmissionRule.SubmissionRule.class, true, new CopyOptions());
+
+                if ("拜访次数上限".equals(r.getManual())) {
+                    r.getFrequency().forEach(f -> {
+
+                        // 获取数量
+                        Object o = f.get("quantity");
+                        int limit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
+
+                        // 获取单位
+                        String timeUnit = (String) f.get("timeUnit");
+
+                        // 同一个单位只记录最小的
+                        if (totalLimitMap.containsKey(timeUnit)) {
+                            Integer l1 = totalLimitMap.get(timeUnit);
+                            if (l1 != null && l1 > limit) {
+                                totalLimitMap.put(timeUnit, limit);
+                            }
+                        } else {
+                            totalLimitMap.put(timeUnit, limit);
+                        }
+
+                    });
+
+                }
+                if (r.getManual().startsWith("同一个人")) {
+
+                    r.getFrequency().forEach(f -> {
+
+                        // 获取数量
+                        Object o = f.get("quantity");
+                        int limit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
+
+                        // 获取单位
+                        String timeUnit = (String) f.get("timeUnit");
+
+                        // 同一个单位只记录最小的
+                        if (eachLimitMap.containsKey(timeUnit)) {
+                            Integer l1 = eachLimitMap.get(timeUnit);
+                            if (l1 != null && l1 > limit) {
+                                eachLimitMap.put(timeUnit, limit);
+                            }
+                        } else {
+                            eachLimitMap.put(timeUnit, limit);
+                        }
+
+                    });
+
+                }
+            }
+        }
+
+        // 月度为最大单位,以当前时间所在自然月查询范围, 获取签到记录
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime start = now.with(TemporalAdjusters.firstDayOfMonth());
+        List<WmUserSign> signs = this.list(Wrappers.<WmUserSign>lambdaQuery()
+                .eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
+                .eq(WmUserSign::getTaskTypeId, taskTypeId)
+                .between(WmUserSign::getSignDate, start, now));
+
+        // 本月未有打卡记录
+        if (CollUtil.isEmpty(signs)) {
+            log.info("当前用户本月不存在打卡任务,放行");
+            return;
+        }
+
+        Set<Integer> signIds = signs.stream().map(WmUserSign::getId).collect(Collectors.toSet());
+
+        List<WmTaskContent> taskContents = taskContentService.list(Wrappers.<WmTaskContent>lambdaQuery()
+                .in(WmTaskContent::getTemp3, signIds)
+                .isNull(WmTaskContent::getTemp30));
+
+        List<WmTaskContent> availTaskContents = taskContents.stream().filter(con -> StrUtil.isNotBlank(con.getTemp3())).collect(Collectors.toList());
+
+        if (CollUtil.isEmpty(availTaskContents)) {
+            log.info("当前用户本月不存在打卡任务记录,放行");
+            return;
+        }
+
+        Map<String, String> signIdAndContentIdMap = availTaskContents.stream().collect(Collectors.toMap(WmTaskContent::getTemp3, cont -> cont.getId().toString()));
+
+        List<WmTask> taskList = wmTaskService.list(Wrappers.<WmTask>lambdaQuery()
+                .eq(WmTask::getTaskUserId, wmUserSign.getSignUserid())
+                .eq(WmTask::getTaskTypeId, taskTypeId)
+                .in(WmTask::getTaskContentId, signIdAndContentIdMap.values()));
+
+        Map<String, WmTask> taskMap = taskList.stream().collect(Collectors.toMap(WmTask::getTaskContentId, Function.identity()));
+
+        List<WmUserSign> availSigned = signs.stream().filter(sign -> {
+            String contId = signIdAndContentIdMap.get(sign.getId().toString());
+            log.info("任务内容ID为:[{}]", contId);
+            if (StrUtil.isBlank(contId)) {
+                return false;
+            }
+
+            WmTask wmTask = taskMap.get(contId);
+
+            if (wmTask == null) {
+                return false;
+            }
+
+            String taskStatus = wmTask.getTaskStatus();
+            log.info("当前任务ID:[{}], 对应的任务状态为:[{}]", contId, taskStatus);
+            return "2".equals(taskStatus) || "3".equals(taskStatus);
+
+        }).collect(Collectors.toList());
+
+        // 校验 同一个人,对同一拜访对象
+        Map<String, List<WmUserSign>> collect = availSigned.stream().collect(Collectors.groupingBy(WmUserSign::getSignEntId));
+        List<WmUserSign> wmUserSigns = collect.get(wmUserSign.getSignEntId());
+        if (CollUtil.isNotEmpty(wmUserSigns)) {
+
+            int currCount = wmUserSigns.size();
+            log.info("当前用户同一地点本月已完成次数:[{}]", currCount);
+            Integer monthLimit = eachLimitMap.get("MONTH");
+            log.info("同一个人,对同一拜访对象打卡每月限制:[{}]", monthLimit);
+            if (monthLimit != null && monthLimit <= currCount) {
+                log.warn("超过同一个人,对同一拜访对象打卡每月限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
+                throw new BizException("超过同一个人,对同一拜访对象打卡每月限制");
+            }
+
+            Integer dailyLimit = eachLimitMap.get("DAY");
+            log.info("同一个人,对同一拜访对象打卡每日限制:[{}]", dailyLimit);
+            if (dailyLimit != null) {
+                LocalDateTime todayStart = LocalDateTime.of(now.toLocalDate(), LocalTime.MIN);
+                long dailyCount = wmUserSigns.stream().filter(sign -> sign.getSignDate().isAfter(todayStart)).count();
+                log.info("当前用户同一地点本日已完成次数:[{}]", dailyCount);
+                if (dailyLimit <= dailyCount) {
+                    log.warn("超过同一个人,对同一拜访对象打卡每日限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
+                    throw new BizException("超过同一个人,对同一拜访对象打卡每日限制");
+                }
+            }
+
+            Integer hourLimit = eachLimitMap.get("HOUR");
+            log.info("同一个人,对同一拜访对象打卡每小时限制:[{}]", hourLimit);
+            if (hourLimit != null) {
+                LocalDateTime hourStart = now.minusHours(1L);
+                long hourCount = wmUserSigns.stream().filter(sign -> sign.getSignDate().isAfter(hourStart)).count();
+                log.info("当前用户同一地点本小时已完成次数:[{}]", hourCount);
+                if (hourLimit <= hourCount) {
+                    log.warn("超过同一个人,对同一拜访对象打卡每小时限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
+                    throw new BizException("超过同一个人,对同一拜访对象打卡每小时限制");
+                }
+            }
+        } else {
+            log.info("当前用户本月不存在关于该企业的打卡任务,放行");
+        }
+
+
+        //  校验当日的拜访限制
+        int currCount = availSigned.size();
+        log.info("当前用户本月已完成打卡次数:[{}]", currCount);
+        Integer monthLimit = totalLimitMap.get("MONTH");
+        log.info("拜访次数上限打卡每月限制:[{}]", monthLimit);
+        if (monthLimit != null && monthLimit <= currCount) {
+            log.warn("超过拜访次数上限打卡每月限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
+            throw new BizException("超过拜访次数上限打卡每月限制");
+        }
+
+        Integer dailyLimit = totalLimitMap.get("DAY");
+        log.info("拜访次数上限打卡每天限制:[{}]", dailyLimit);
+        if (dailyLimit != null) {
+            LocalDateTime todayStart = LocalDateTime.of(now.toLocalDate(), LocalTime.MIN);
+            long dailyCount = availSigned.stream().filter(sign -> sign.getSignDate().isAfter(todayStart)).count();
+            log.info("当前用户本日已完成打卡次数:[{}]", dailyCount);
+            if (dailyLimit <= dailyCount) {
+                log.warn("超过拜访次数上限打卡每日限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
+                throw new BizException("超过拜访次数上限打卡每日限制");
+            }
+        }
+
+        Integer hourLimit = totalLimitMap.get("HOUR");
+        log.info("拜访次数上限打卡每小时限制:[{}]", hourLimit);
+        if (hourLimit != null) {
+            LocalDateTime hourStart = now.minusHours(1L);
+            long hourCount = availSigned.stream().filter(sign -> sign.getSignDate().isAfter(hourStart)).count();
+            log.info("当前用户本小时已完成打卡次数:[{}]", hourCount);
+            if (hourLimit <= hourCount) {
+                log.warn("超过拜访次数上限打卡每小时限制:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
+                throw new BizException("超过拜访次数上限打卡每小时限制");
+            }
+        }
+
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R<?> saveWmUserSign(WmUserSign wmUserSign) {
+        // 校验基础参数
+        Map<String, String> taskTypeMap = checkBaseInfo(wmUserSign);
+        // 细分任务类型
+        String taskTypeId = taskTypeMap.get("taskTypeId");
+        // 基础任务类型
+        String baseTaskTypeId = taskTypeMap.get("baseTaskTypeId");
+
+        // 校验积分包
+        WmScorePackage tWmScorePackage = checkPkgInfo(wmUserSign);
+
+        // 获取用户
+        UserVO sysU = checkUser(wmUserSign);
+
+        // 查询任务类型启用状态
+        checkTaskTypeRules(sysU.getDeptId(), taskTypeId);
+
+        // 校验任务类型是否启用
+        checkTaskType(taskTypeId, tWmScorePackage.getRuleId());
+
+        // 根据规则校验限制
+        checkByRule(taskTypeId, wmUserSign, tWmScorePackage.getRelatedService());
+
+        // 校验百分比参数
+        checkPercentRule(tWmScorePackage, sysU.getDeptId());
+
+        // 校验积分包领取明细
+        WmScorePackageStatus packageStatus = checkPkgStatus(tWmScorePackage.getId(), sysU.getUserId());
+
+        // 校验积分限制
+        if (StrUtil.equals(PackageTypeEnum.TYPE1_SCOTE_PACKAGE.val(), tWmScorePackage.getPackageType1())
+                || StrUtil.equals(PackageTypeEnum.TYPE1_SCORE_AND_TASK_PACKAGE.val(), tWmScorePackage.getPackageType1())) {
+            wmTaskContentService.limitScore(sysU.getUserId(), sysU.getDeptId(), "1");
+        }
+
+        // 设置参数 && 保存
+        if (StringUtils.isEmpty(wmUserSign.getSignEntType())) {
+            wmUserSign.setSignEntType("1");
+        }
+        wmUserSign.setTaskTypeId(taskTypeId);
+        boolean saveSign = this.save(wmUserSign);
+
+        // 保存后续操作
+        if (saveSign) {
+
+            // 获取任务类型积分
+            WmTaskType wmTaskType = new WmTaskType();
+            wmTaskType.setTaskTypeName(wmTaskTypeService.getById(taskTypeId).getTaskTypeName());
+            wmTaskType.setRuleId(tWmScorePackage.getRuleId());
+            int score = wmTaskTypeService.getWmTaskTypeByEnt(wmTaskType);
+            if (score < 0) {
+                throw new BizException("获取任务积分失败");
+            }
+
+            // 保存签到详情, 获取任务分值
+            int detailScore = saveSignDetail(wmUserSign, sysU.getDeptId(), baseTaskTypeId, score);
+            log.info("精细化拜访实际任务分值:{}", detailScore);
+
+            // 保存任务
+            WmTask task = createTask(taskTypeId, wmUserSign, sysU, tWmScorePackage, detailScore);
+            task.setType(tWmScorePackage.getPackageType1());
+
+            // 操作积分包
+            operatePkgAndPkgStatus(tWmScorePackage, packageStatus, sysU, taskTypeId, wmUserSign);
+
+            // 推送任务h5截图
+            applicationEventPublisher.publishEvent(new TaskInfoImgEvent(task.getId()));
+
+            return R.ok(task);
+        }
+
+        return R.failed("签到保存失败");
+    }
+
+    /**
+     * 会员临时签到
+     *
+     * @param resource 签到信息
+     * @param user     用户
+     * @return 签到结果
+     */
+    @Override
+    public String doTempSign(WmUserSignDTO.OnTempSign resource, HnqzUser user) {
+
+
+        LocalDateTime now = LocalDateTime.now();
+
+        // 误差不能超过5秒
+        if (Duration.between(resource.getSignTime(), now).toMillis() > 5_000) {
+            throw new BizException("签到误差不能超过5秒");
+        }
+
+        String signTime = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN).format(now);
+
+        // 获取签到key
+        String cacheKey = String.format("user:sign:temp:%s:%s", user.getId(), resource.getLocationId());
+
+        if (Boolean.TRUE.equals(redisTemplate.hasKey(cacheKey))) {
+
+            return redisTemplate.opsForValue().get(cacheKey).toString();
+
+        } else {
+
+            redisTemplate.opsForValue().set(cacheKey, signTime, 6, TimeUnit.HOURS);
+
+            return signTime;
+
+        }
+    }
+
+    /**
+     * 保存签到详情
+     *
+     * @param wmUserSign 打卡信息
+     * @param deptId     部门id
+     * @param taskTypeId 任务类型id
+     * @param baseScore  任务类型规则分数
+     * @return int 任务实际分值(拜访科室数 * 任务类型规则分数)
+     */
+    private int saveSignDetail(WmUserSign wmUserSign, Integer deptId, String taskTypeId, Integer baseScore) {
+        int minDeptmentLimit = 1;
+        // 如果配置了精细化拜访的任务类型模板,则关联保存签到详情
+        List<WmDeptTaskTypeTemplate> taskTypeTemplates = wmDeptTaskTypeTemplateService.getTemplate(deptId, taskTypeId);
+        if (CollUtil.isNotEmpty(taskTypeTemplates)) {
+            WmUserSignDetail userSignDetail = wmUserSign.getUserSignDetail();
+            if (userSignDetail != null) {
+                WmDeptTaskTypeTemplate taskTypeTemplate = taskTypeTemplates.get(0);
+                // 医院拜访限制科室个数
+                if (StrUtil.equals(taskTypeTemplate.getTaskTypeId(), "5")) {
+                    Map<String, Object> detail = taskTypeTemplate.getDetail();
+                    int numberLimit = 1;
+                    if (CollUtil.isNotEmpty(detail)) {
+                        numberLimit = (int) detail.getOrDefault("numberLimit", 1);
+                    }
+
+                    List<Map<String, Object>> signDetailDetail = userSignDetail.getDetail();
+                    if (CollUtil.isNotEmpty(signDetailDetail)) {
+                        // 模板配置的numberLimit 和 实际传参的拜访科室个数 取最小值
+                        minDeptmentLimit = Math.min(numberLimit, signDetailDetail.size());
+
+                        List<String> departmentList = new ArrayList<>(signDetailDetail.size());
+                        for (Map<String, Object> detailMap : signDetailDetail) {
+                            String departmentName = (String) detailMap.get("departmentName");
 //							String[] fileUrl = (String[]) detailMap.get("fileUrl");
-							departmentList.add(departmentName);
-						}
-						userSignDetail.setDepartment(departmentList.toArray(new String[0]));
-					}
-				}
-
-				userSignDetail.setSignId(wmUserSign.getId());
-				wmUserSignDetailService.save(userSignDetail);
-			}
-		}
-
-		return baseScore * minDeptmentLimit;
-	}
+                            departmentList.add(departmentName);
+                        }
+                        userSignDetail.setDepartment(departmentList.toArray(new String[0]));
+                    }
+                }
+
+                userSignDetail.setSignId(wmUserSign.getId());
+                wmUserSignDetailService.save(userSignDetail);
+            }
+        }
+
+        return baseScore * minDeptmentLimit;
+    }
 
 }

+ 7 - 0
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmDaAgentMapper.xml

@@ -109,6 +109,13 @@
                 </foreach>
                 )
             </if>
+            <if test="query.entIds != null and query.entIds.size() > 0">
+                and d.dept_id in (
+                <foreach collection="query.entIds" item="entId" index="index" separator=",">
+                    #{entId}
+                </foreach>
+                )
+            </if>
         </where>
         ORDER BY id DESC
     </select>

+ 7 - 0
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/WmDaDrugEntMapper.xml

@@ -65,6 +65,13 @@
                 </foreach>
                 )
             </if>
+            <if test="query.entIds != null and query.entIds.size() > 0">
+                and d.dept_id in (
+                <foreach collection="query.entIds" item="entId" index="index" separator=",">
+                    #{entId}
+                </foreach>
+                )
+            </if>
         </where>
         ORDER BY e.create_time DESC
     </select>