Эх сурвалжийг харах

Merge branch 'feat-220815-taskcheck'

# Conflicts:
#	hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java
shc 2 жил өмнө
parent
commit
78121560e7
21 өөрчлөгдсөн 1631 нэмэгдсэн , 178 устгасан
  1. 41 0
      db/v2.1/1wm_task_sub_rule.sql
  2. 46 0
      db/v2.1/2wm_task_type_sub_cate.sql
  3. 4 0
      hnqz-common/hnqz-common-core/pom.xml
  4. 32 0
      hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/constant/enums/CommonFlag.java
  5. 63 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/UpmsType.java
  6. 104 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmTaskSubmissionRule.java
  7. 61 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmTaskTypeSubCategory.java
  8. 172 29
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java
  9. 86 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaskSubmissionRuleController.java
  10. 0 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaxHelperController.java
  11. 16 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskSubmissionRuleMapper.java
  12. 16 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskTypeSubCategoryMapper.java
  13. 16 3
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskContentService.java
  14. 36 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskSubmissionRuleService.java
  15. 14 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskTypeSubCategoryService.java
  16. 13 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDaAgentServiceImpl.java
  17. 6 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmDaDrugEntServiceImpl.java
  18. 753 142
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskContentServiceImpl.java
  19. 85 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskSubmissionRuleServiceImpl.java
  20. 22 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskTypeSubCategoryServiceImpl.java
  21. 45 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmUserSignServiceImpl.java

+ 41 - 0
db/v2.1/1wm_task_sub_rule.sql

@@ -0,0 +1,41 @@
+USE hnqzx;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for wm_task_sub_rule
+-- ----------------------------
+DROP TABLE IF EXISTS `wm_task_sub_rule`;
+CREATE TABLE `wm_task_sub_rule`
+(
+    `rule_id`     INT(20)     NOT NULL AUTO_INCREMENT COMMENT '规则ID',
+    `dept_id`     INT(20)     NOT NULL COMMENT '企业id',
+    `sub_cate`    VARCHAR(32) NOT NULL COMMENT '次级分类',
+    `sub_rule`    JSON COMMENT '规则',
+    `opt_flag`    VARCHAR(32) NOT NULL COMMENT '操作标记',
+    `create_time` DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time` DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`rule_id`) USING BTREE,
+    INDEX `idx_dept_id` (`dept_id`) USING BTREE,
+    INDEX `idx_sub_cate` (`sub_cate`) USING BTREE
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='任务提交规则表';
+
+-- ----------------------------
+-- Records of wm_task_sub_rule
+-- ----------------------------
+BEGIN;
+INSERT INTO wm_task_sub_rule (rule_id, dept_id, sub_cate, sub_rule, opt_flag, create_time, update_time) VALUES (1, 1, 'PRODUCT_ALBUM', '[{"manual": "同一个人对同一个相册的转发上限", "multiple": true, "frequency": [{"quantity": 20, "timeUnit": "DAY", "separator": "/"}]}]', 'OK', '2022-08-15 18:18:53', '2022-08-23 16:54:06');
+INSERT INTO wm_task_sub_rule (rule_id, dept_id, sub_cate, sub_rule, opt_flag, create_time, update_time) VALUES (2, 1, 'ACADEMIC_INFO_EXCHANGE', '[{"manual": "同一个人对同一篇文章的转发上限", "multiple": true, "frequency": [{"quantity": 20, "timeUnit": "DAY", "separator": "/"}]}]', 'OK', '2022-08-15 18:18:53', '2022-08-23 16:54:31');
+INSERT INTO wm_task_sub_rule (rule_id, dept_id, sub_cate, sub_rule, opt_flag, create_time, update_time) VALUES (3, 1, 'CONFERENCE', '[{"manual": "任务有效期限", "multiple": false, "frequency": [{"quantity": 30, "timeUnit": "DAY", "separator": ""}]}, {"manual": "举办次数上限", "multiple": true, "frequency": [{"quantity": 2, "timeUnit": "DAY", "separator": "/"}]}]', 'OK', '2022-08-15 18:18:53', '2022-08-23 16:55:20');
+INSERT INTO wm_task_sub_rule (rule_id, dept_id, sub_cate, sub_rule, opt_flag, create_time, update_time) VALUES (4, 1, 'ONE_ON_ONE_INTERVIEW', '[{"manual": "任务有效期限", "multiple": false, "frequency": [{"quantity": 30, "timeUnit": "DAY", "separator": ""}]}, {"manual": "举办次数上限", "multiple": true, "frequency": [{"quantity": 2, "timeUnit": "DAY", "separator": "/"}]}]', 'OK', '2022-08-15 18:18:53', '2022-08-23 16:55:21');
+INSERT INTO wm_task_sub_rule (rule_id, dept_id, sub_cate, sub_rule, opt_flag, create_time, update_time) VALUES (5, 1, 'TRAINING', '[{"manual": "任务有效期限", "multiple": false, "frequency": [{"quantity": 30, "timeUnit": "DAY", "separator": ""}]}, {"manual": "举办次数上限", "multiple": true, "frequency": [{"quantity": 2, "timeUnit": "DAY", "separator": "/"}]}]', 'OK', '2022-08-15 18:18:53', '2022-08-23 16:55:20');
+INSERT INTO wm_task_sub_rule (rule_id, dept_id, sub_cate, sub_rule, opt_flag, create_time, update_time) VALUES (6, 1, 'BUSINESS_COMPANY_VISIT', '[{"manual": "打卡时间间隔", "multiple": false, "frequency": [{"quantity": 30, "timeUnit": "MINUTE", "separator": ""}]}, {"manual": "同一个人在同一个商业公司的打卡时间间隔", "multiple": false, "frequency": [{"quantity": 4, "timeUnit": "HOUR", "separator": ""}]}]', 'OK', '2022-08-15 18:18:53', '2022-08-23 16:56:34');
+INSERT INTO wm_task_sub_rule (rule_id, dept_id, sub_cate, sub_rule, opt_flag, create_time, update_time) VALUES (7, 1, 'HOSPITAL_VISIT', '[{"manual": "打卡时间间隔", "multiple": false, "frequency": [{"quantity": 30, "timeUnit": "MINUTE", "separator": ""}]}, {"manual": "同一个人在同一个医院的打卡时间间隔", "multiple": false, "frequency": [{"quantity": 4, "timeUnit": "HOUR", "separator": ""}]}]', 'OK', '2022-08-15 18:18:53', '2022-08-23 16:57:43');
+INSERT INTO wm_task_sub_rule (rule_id, dept_id, sub_cate, sub_rule, opt_flag, create_time, update_time) VALUES (8, 1, 'PHARMACY_VISIT', '[{"manual": "打卡时间间隔", "multiple": false, "frequency": [{"quantity": 30, "timeUnit": "MINUTE", "separator": ""}]}, {"manual": "同一个人在同一个药店的打卡时间间隔", "multiple": false, "frequency": [{"quantity": 4, "timeUnit": "HOUR", "separator": ""}]}]', 'OK', '2022-08-15 18:18:53', '2022-08-23 16:57:43');
+INSERT INTO wm_task_sub_rule (rule_id, dept_id, sub_cate, sub_rule, opt_flag, create_time, update_time) VALUES (9, 1, 'INVENTORY_INFO_COLLECTION', '[{"manual": "任务上限", "multiple": true, "frequency": [{"quantity": 3, "timeUnit": "DAY", "separator": "/"}]}]', 'OK', '2022-08-15 18:18:53', '2022-08-23 16:59:11');
+INSERT INTO wm_task_sub_rule (rule_id, dept_id, sub_cate, sub_rule, opt_flag, create_time, update_time) VALUES (10, 1, 'HOSPITAL_INFO_COLLECTION', '[{"manual": "同一家医院的修改次数上限", "multiple": true, "frequency": [{"quantity": 3, "timeUnit": "MONTH", "separator": "/"}]}, {"manual": "同一个人对同一家医院的修改次数上限", "multiple": true, "frequency": [{"quantity": 1, "timeUnit": "MONTH", "separator": "/"}]}]', 'OK', '2022-08-15 18:18:53', '2022-08-23 16:59:40');
+COMMIT;
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 46 - 0
db/v2.1/2wm_task_type_sub_cate.sql

@@ -0,0 +1,46 @@
+USE hnqzx;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for wm_task_type_sub_cate
+-- ----------------------------
+DROP TABLE IF EXISTS `wm_task_type_sub_cate`;
+CREATE TABLE `wm_task_type_sub_cate`
+(
+    `ttsc_id`     INT(20)     NOT NULL AUTO_INCREMENT COMMENT '规则ID',
+    `type_id`     INT(20)     NOT NULL COMMENT '企业id',
+    `type_name`   VARCHAR(32) NOT NULL COMMENT '任务名称',
+    `sub_cate`    VARCHAR(32) NOT NULL COMMENT '次级分类',
+    `create_time` DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time` DATETIME    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY (`ttsc_id`) USING BTREE,
+    INDEX `idx_dept_id` (`type_id`) USING BTREE,
+    INDEX `idx_sub_cate` (`sub_cate`) USING BTREE
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='任务提交规则表';
+
+-- ----------------------------
+-- Records of wm_task_type_sub_cate
+-- ----------------------------
+BEGIN;
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (1, 1, '医院科室推广会', 'CONFERENCE', '2022-08-17 17:11:16', '2022-08-17 17:11:16');
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (2, 2, '区域学术沙龙', 'CONFERENCE', '2022-08-17 17:11:16', '2022-08-17 17:11:16');
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (3, 3, '城市卫星会', 'CONFERENCE', '2022-08-17 17:11:16', '2022-08-17 17:11:16');
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (4, 4, '省级学科年会', 'CONFERENCE', '2022-08-17 17:11:16', '2022-08-17 17:11:16');
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (5, 5, '医院拜访', 'HOSPITAL_VISIT', '2022-08-17 17:11:16', '2022-08-17 17:11:16');
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (6, 6, '商业公司拜访', 'BUSINESS_COMPANY_VISIT', '2022-08-17 17:11:17', '2022-08-17 17:11:17');
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (7, 8, '产品相册分享', 'PRODUCT_ALBUM', '2022-08-17 17:11:17', '2022-08-17 17:11:17');
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (8, 9, '学术信息交流', 'PRODUCT_ALBUM', '2022-08-17 17:11:17', '2022-08-17 17:11:17');
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (9, 10, '受众阅读文章', 'PRODUCT_ALBUM', '2022-08-17 17:11:17', '2022-08-17 17:11:17');
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (10, 11, '受众打开产品相册', 'PRODUCT_ALBUM', '2022-08-17 17:11:17', '2022-08-17 17:11:17');
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (11, 19, '一对一专访', 'ONE_ON_ONE_INTERVIEW', '2022-08-17 17:11:17', '2022-08-17 17:11:17');
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (12, 30, '医院信息修改', 'HOSPITAL_INFO_COLLECTION', '2022-08-17 17:11:17', '2022-08-17 17:11:17');
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (13, 33, '药店拜访', 'PHARMACY_VISIT', '2022-08-17 17:11:17', '2022-08-17 17:11:17');
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (14, 34, '医院患者教育培训', 'TRAINING', '2022-08-17 17:11:17', '2022-08-17 17:11:17');
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (15, 35, '药店药师培训', 'TRAINING', '2022-08-17 17:11:17', '2022-08-17 17:11:17');
+INSERT INTO wm_task_type_sub_cate (ttsc_id, type_id, type_name, sub_cate, create_time, update_time) VALUES (16, 36, '商业公司培训', 'TRAINING', '2022-08-17 17:11:17', '2022-08-17 17:11:17');
+COMMIT;
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 4 - 0
hnqz-common/hnqz-common-core/pom.xml

@@ -84,5 +84,9 @@
 			<groupId>commons-codec</groupId>
 			<artifactId>commons-codec</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>com.baomidou</groupId>
+			<artifactId>mybatis-plus-extension</artifactId>
+		</dependency>
 	</dependencies>
 </project>

+ 32 - 0
hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/constant/enums/CommonFlag.java

@@ -0,0 +1,32 @@
+package com.qunzhixinxi.hnqz.common.core.constant.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 通用标记
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-08-15 15:08
+ */
+public class CommonFlag {
+
+	@Getter
+	@AllArgsConstructor
+	public enum OptFlag {
+		OK("OK", 0, "正常"),
+		LOCKED("LOCKED", 1, "锁定"),
+		DELETED("DELETED", 9, "删除");
+
+		private final String type;
+
+		@EnumValue
+		private final Integer code;
+
+		private final String description;
+
+
+	}
+}

+ 63 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/UpmsType.java

@@ -0,0 +1,63 @@
+package com.qunzhixinxi.hnqz.admin.api.constant;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * Upms 服务枚举
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-08-15 15:24
+ */
+public class UpmsType {
+
+	/**
+	 * 任务大类
+	 */
+	@Getter
+	@AllArgsConstructor
+	public enum TaskCategory {
+
+		FORWARD("FORWARD", "转发类任务"),
+		CONFERENCES_INTERVIEWS("CONFERENCES_INTERVIEWS", "会议与专访"),
+		CUSTOMER_VISIT("CUSTOMER_VISIT", "客户拜访"),
+		MARKET_INFO_COLLECTION("MARKET_INFO_COLLECTION", "市场信息搜集");
+
+		@EnumValue
+		private final String type;
+
+		private final String description;
+
+
+	}
+
+
+	/**
+	 * 任务二级分类
+	 */
+	@Getter
+	@AllArgsConstructor
+	public enum TaskSubCategory {
+
+		PRODUCT_ALBUM("PRODUCT_ALBUM", TaskCategory.FORWARD, "产品相册"),
+		ACADEMIC_INFO_EXCHANGE("ACADEMIC_INFO_EXCHANGE", TaskCategory.FORWARD, "学术信息交流"),
+		CONFERENCE("CONFERENCE", TaskCategory.CONFERENCES_INTERVIEWS, "会议举办"),
+		ONE_ON_ONE_INTERVIEW("ONE_ON_ONE_INTERVIEW", TaskCategory.CONFERENCES_INTERVIEWS, "一对一专访"),
+		TRAINING("TRAINING", TaskCategory.CONFERENCES_INTERVIEWS, "培训"),
+		BUSINESS_COMPANY_VISIT("BUSINESS_COMPANY_VISIT", TaskCategory.CUSTOMER_VISIT, "商业公司拜访"),
+		HOSPITAL_VISIT("HOSPITAL_VISIT", TaskCategory.CUSTOMER_VISIT, "医院拜访"),
+		PHARMACY_VISIT("PHARMACY_VISIT", TaskCategory.CUSTOMER_VISIT, "药店拜访"),
+		INVENTORY_INFO_COLLECTION("INVENTORY_INFO_COLLECTION", TaskCategory.MARKET_INFO_COLLECTION, "库存信息搜集"),
+		HOSPITAL_INFO_COLLECTION("HOSPITAL_INFO_COLLECTION", TaskCategory.MARKET_INFO_COLLECTION, "医院信息搜集");
+
+		@EnumValue
+		private final String type;
+
+		private final TaskCategory category;
+
+		private final String description;
+
+	}
+}

+ 104 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmTaskSubmissionRule.java

@@ -0,0 +1,104 @@
+package com.qunzhixinxi.hnqz.admin.api.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
+import com.qunzhixinxi.hnqz.common.core.constant.enums.CommonFlag;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 任务提交规则
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-08-15 14:50
+ */
+@Data
+@ToString
+@TableName(value = "wm_task_sub_rule", autoResultMap = true)
+public class WmTaskSubmissionRule implements Serializable {
+	private static final long serialVersionUID = -3042306831006555056L;
+
+	/**
+	 * 提交规则id
+	 */
+	@TableId(value = "rule_id", type = IdType.AUTO)
+	private Integer ruleId;
+
+	/**
+	 * 企业id
+	 */
+	private Integer deptId;
+
+	/**
+	 * 二级分类
+	 */
+	@TableField(value = "sub_cate")
+	private UpmsType.TaskSubCategory subCategory;
+
+	/**
+	 * 任务规则
+	 */
+	@TableField(value = "sub_rule", typeHandler = FastjsonTypeHandler.class)
+	private List<WmTaskSubmissionRule.SubmissionRule> rule;
+
+	/**
+	 * 可操作标记
+	 */
+	private CommonFlag.OptFlag optFlag;
+
+	/**
+	 * 创建时间
+	 */
+	private LocalDateTime createTime;
+
+	/**
+	 * 创建时间
+	 */
+	private LocalDateTime updateTime;
+
+
+	/**
+	 * 提交规则实体
+	 */
+	@Data
+	@ToString
+	public static class SubmissionRule implements Serializable {
+
+		private static final long serialVersionUID = -9205151158528196927L;
+
+		/**
+		 * 限制说明
+		 */
+		private String manual;
+
+		/**
+		 * 限制频次
+		 */
+		private List<Map<String, Object>> frequency;
+
+		/**
+		 * 分隔符
+		 */
+		private String separator;
+
+		/**
+		 * 是否可以新增
+		 */
+		private Boolean multiple;
+
+
+	}
+
+
+}

+ 61 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmTaskTypeSubCategory.java

@@ -0,0 +1,61 @@
+package com.qunzhixinxi.hnqz.admin.api.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 任务类型子类分表
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-08-17 17:16
+ */
+@Data
+@ToString
+@TableName(value = "wm_task_type_sub_cate")
+public class WmTaskTypeSubCategory implements Serializable {
+	private static final long serialVersionUID = 651823588693958084L;
+
+	/**
+	 * id
+	 */
+	@TableId(value = "ttsc_id", type = IdType.AUTO)
+	private Integer taskTypeSubCateId;
+
+	/**
+	 * 任务类型id
+	 */
+	@TableField(value = "type_id")
+	private Integer taskTypeId;
+
+	/**
+	 * 类型名称
+	 */
+	private String typeName;
+
+	/**
+	 * 二级分类
+	 */
+	@TableField(value = "sub_cate")
+	private UpmsType.TaskSubCategory subCategory;
+
+
+	/**
+	 * 创建时间
+	 */
+	private LocalDateTime createTime;
+
+	/**
+	 * 创建时间
+	 */
+	private LocalDateTime updateTime;
+
+}

+ 172 - 29
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/ApiController.java

@@ -1,5 +1,7 @@
 package com.qunzhixinxi.hnqz.admin.controller;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.bean.copier.CopyOptions;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DatePattern;
@@ -20,12 +22,14 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.zxing.WriterException;
 import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
 import com.qunzhixinxi.hnqz.admin.api.dto.UserDTO;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDictItem;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysRole;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmAdRecord;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionRule;
 import com.qunzhixinxi.hnqz.admin.api.enums.SignatureStatusEnum;
 import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
 import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
@@ -86,7 +90,9 @@ import com.qunzhixinxi.hnqz.admin.service.WmTaskContentConfigService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskContentService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskRuleService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskService;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskSubmissionRuleService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskTypeService;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskTypeSubCategoryService;
 import com.qunzhixinxi.hnqz.admin.service.WmUserSignDetailService;
 import com.qunzhixinxi.hnqz.admin.service.WmUserSignService;
 import com.qunzhixinxi.hnqz.admin.service.WmWkAlbumService;
@@ -213,6 +219,8 @@ public class ApiController {
 	private final WmAdRecordService adRecordService;
 	private final SysUserSignCertService sysUserSignCertService;
 	private final SysUserExtRecordService sysUserExtRecordService;
+	private final WmTaskSubmissionRuleService taskSubmissionRuleService;
+	private final WmTaskTypeSubCategoryService taskTypeSubCategoryService;
 
 	@SysLog("通过任务类型获取表单配置")
 	@ApiOperation(value = "任务类型表单配置-通过任务类型获取表单配置", notes = "根据任务类型获取表单配置")
@@ -987,7 +995,7 @@ public class ApiController {
 	@ApiOperation(value = "任务-新增任务内容表", notes = "新增任务内容表")
 	@SysLog("新增任务内容表")
 	@PostMapping("/saveTaskContent")
-	public R saveTaskContent(@RequestBody WmTaskContent wmTaskContent) {
+	public R<?> saveTaskContent(@RequestBody WmTaskContent wmTaskContent) {
 		Set<String> errorHash = new HashSet<>();
 		List<String> ducImgUrl = new ArrayList<>();
 		List<String> all = new ArrayList<>();
@@ -1023,24 +1031,36 @@ public class ApiController {
 			return R.failed(ducImgUrl, "提交重复的图片");
 		}
 
+		if (org.apache.commons.lang.StringUtils.isEmpty(wmTaskContent.getTemp30())) {
+			return R.failed("任务类型不能为空");
+		}
 
-		R r = wmTaskContentService.saveTaskContent(wmTaskContent);
-
-		log.info("结果:{}, 草稿key:{}", r, draftKey);
-		if (r.getCode() == CommonConstants.SUCCESS && StrUtil.isNotEmpty(draftKey)) {
-			String key = String.format(CacheConstants.TASK_CONTENT_DRAFT, taskTypeId, id);
-			log.info("删除草稿:{}", key);
-			redisTemplate.delete(key);
+		if (org.apache.commons.lang.StringUtils.isEmpty(wmTaskContent.getTemp32())) {
+			return R.failed("关联积分包不能为空");
 		}
 
-		if (r.getCode() == CommonConstants.FAIL && CollUtil.isNotEmpty(all)) {
-			// 保存图片
-			log.info("all size:{}", all.size());
-			all.forEach(hash -> {
-				String key = String.format("%s:%s", id, hash);
-				log.info("key: {}", key);
+		R<?> r = null;
+		try {
+			r = wmTaskContentService.saveTaskContent(wmTaskContent);
+		} catch (Exception e){
+			return R.failed(e.getMessage());
+		} finally {
+			log.info("结果:{}, 草稿key:{}", r, draftKey);
+			if (r != null && r.getCode() == CommonConstants.SUCCESS && StrUtil.isNotEmpty(draftKey)) {
+				String key = String.format(CacheConstants.TASK_CONTENT_DRAFT, taskTypeId, id);
+				log.info("删除草稿:{}", key);
 				redisTemplate.delete(key);
-			});
+			}
+
+			if (r == null || (r.getCode() == CommonConstants.FAIL && CollUtil.isNotEmpty(all))) {
+				// 保存图片
+				log.info("all size:{}", all.size());
+				all.forEach(hash -> {
+					String key = String.format("%s:%s", id, hash);
+					log.info("key: {}", key);
+					redisTemplate.delete(key);
+				});
+			}
 		}
 
 		return r;
@@ -3326,6 +3346,8 @@ public class ApiController {
 					map.put("value", wmScorePackage.getId());
 					String drugProducer = ArrayUtils.isEmpty(wmScorePackage.getDrugProducerList()) ? "" : String.join(StrUtil.COMMA, wmScorePackage.getDrugProducerList());
 					map.put("drugProducer", drugProducer);
+					map.put("deptId", wmScorePackage.getDeptId());
+					map.put("relDeptId", wmScorePackage.getRelatedService());
 					listMap.add(map);
 				}
 
@@ -3491,6 +3513,8 @@ public class ApiController {
 			wmWkAlbum = wmWkAlbumService.getById(id);
 		}
 
+
+
 		// 获取分享人
 		SysUser sysUser = sysUserService.getById(shareUserId);
 
@@ -3506,9 +3530,9 @@ public class ApiController {
 				if ("share".equals(type)) {
 					String info = null;
 					if ("album".equalsIgnoreCase(taskCategoryName)) {
-						info = checkAlbumLimit(wmWkAlbum, sysUser);
+						info = checkAlbumLimit(wmWkAlbum, sysUser, "8", tWmScorePackage.getRelatedService());
 					} else if ("article".equalsIgnoreCase(taskCategoryName)) {
-						info = checkArticleLimit(wmWkArticle, sysUser);
+						info = checkArticleLimit(wmWkArticle, sysUser,"9", tWmScorePackage.getRelatedService());
 					}
 					if (StringUtils.isNotEmpty(info)) {
 						return R.failed(info);
@@ -3641,9 +3665,9 @@ public class ApiController {
 					// 校验打开结果
 					if (needToCheckLimit) {
 						if ("article".equalsIgnoreCase(taskCategoryName)) {
-							needToCheckLimit = checkArticleOpenLimit(wmWkArticle, sysUser, wmTask);
+							needToCheckLimit = checkArticleOpenLimit(wmWkArticle, sysUser, wmTask, "10", tWmScorePackage.getRelatedService());
 						} else if ("album".equalsIgnoreCase(taskCategoryName)) {
-							needToCheckLimit = checkAlbumOpenLimit(wmWkAlbum, sysUser, wmTask);
+							needToCheckLimit = checkAlbumOpenLimit(wmWkAlbum, sysUser, wmTask, "11", tWmScorePackage.getRelatedService());
 						}
 					}
 				}
@@ -3796,14 +3820,40 @@ public class ApiController {
 	 * @param article 文章
 	 * @param user    分享用户
 	 * @param task    任务
+	 * @param taskTypeId 任务类型id
+	 * @param pkgId 积分包id
+	 * @return 校验信息
 	 */
-	private Boolean checkArticleOpenLimit(WmWkArticle article, SysUser user, WmTask task) {
+	private Boolean checkArticleOpenLimit(WmWkArticle article, SysUser user, WmTask task,  String taskTypeId, String pkgId) {
 		Assert.notNull(article);
+
+		List<WmTaskSubmissionRule.SubmissionRule> rules = wmTaskContentService.getTaskSubmissionRule(taskTypeId, pkgId);
+
+		int maxShareTimes = upmsConfig.getMaxShareTimes();
+		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())) {
+
+					List<Integer> quantity = r.getFrequency().stream().map(f -> {
+						Object o = f.get("quantity");
+						return o instanceof String ? Integer.parseInt((String) o) : (int) o;
+					}).sorted().collect(Collectors.toList());
+					maxShareTimes = quantity.get(0);
+				}
+			}
+
+
+		}
+
 		LocalDateTime now = LocalDateTime.now();
 		final String cacheKey = CacheConstants.ARTICLE_PERSONAL_SHARE_KEY + DateUtil.format(now, "yyyyMMdd:")
 				+ user.getUserId() + ":" + article.getId();
 		Integer times = (Integer) redisTemplate.opsForValue().get(cacheKey);
-		if (null != times && times >= upmsConfig.getMaxShareTimes()) {
+		if (null != times && times >= maxShareTimes) {
 			log.info("{}:{}已经转发文章{}次数:{}", user.getUserId(), user.getRealname(), article.getId(), times);
 			task.setScore(0);
 			return false;
@@ -3817,9 +3867,35 @@ public class ApiController {
 	 * @param album 相册
 	 * @param user  分享用户
 	 * @param task  任务
+	 * @param taskTypeId 任务类型id
+	 * @param pkgId 积分包id
+	 * @return 校验信息
 	 */
-	private Boolean checkAlbumOpenLimit(WmWkAlbum album, SysUser user, WmTask task) {
+	private Boolean checkAlbumOpenLimit(WmWkAlbum album, SysUser user, WmTask task,  String taskTypeId, String pkgId) {
 		Assert.notNull(album);
+
+		List<WmTaskSubmissionRule.SubmissionRule> rules = wmTaskContentService.getTaskSubmissionRule(taskTypeId, pkgId);
+
+		int maxShareTimes = upmsConfig.getMaxShareTimes();
+		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())) {
+
+					List<Integer> quantity = r.getFrequency().stream().map(f -> {
+						Object o = f.get("quantity");
+						return o instanceof String ? Integer.parseInt((String) o) : (int) o;
+					}).sorted().collect(Collectors.toList());
+					maxShareTimes = quantity.get(0);
+				}
+			}
+
+
+		}
+
 		if (StringUtils.isNotEmpty(album.getGlyp())) {
 			List<WmDaDrugEntDrugtable> drugTableList =
 					wmDaDrugEntDrugtableService.listByIds(Arrays.asList(album.getGlyp().split(",")));
@@ -3834,7 +3910,7 @@ public class ApiController {
 							+ drug.getDrugEntId() + CacheConstants.DRUG_ENT_PERSONAL_SHARE_KEY2 + user.getUserId();
 					log.info("key:{}", key);
 					Integer times = (Integer) redisTemplate.opsForValue().get(key);
-					if (times != null && times >= upmsConfig.getMaxShareTimes()) {
+					if (times != null && times >= maxShareTimes) {
 						task.setScore(0);
 						return false;
 					}
@@ -3849,18 +3925,44 @@ public class ApiController {
 	 *
 	 * @param wmWkArticle 文章
 	 * @param sysUser     转发人
+	 * @param taskTypeId 任务类型id
+	 * @param pkgId 积分包id
 	 * @return 校验信息
 	 */
-	private String checkArticleLimit(WmWkArticle wmWkArticle, SysUser sysUser) {
+	private String checkArticleLimit(WmWkArticle wmWkArticle, SysUser sysUser, String taskTypeId, String pkgId) {
 		Assert.notNull(wmWkArticle);
+
+		List<WmTaskSubmissionRule.SubmissionRule> rules = wmTaskContentService.getTaskSubmissionRule(taskTypeId, pkgId);
+
+		int maxShareTimes = upmsConfig.getMaxShareTimes();
+		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())) {
+
+					List<Integer> quantity = r.getFrequency().stream().map(f -> {
+						Object o = f.get("quantity");
+						return o instanceof String ? Integer.parseInt((String) o) : (int) o;
+					}).sorted().collect(Collectors.toList());
+					maxShareTimes = quantity.get(0);
+				}
+			}
+
+
+		}
+
+
 		LocalDateTime now = LocalDateTime.now();
 		final String cacheKey = CacheConstants.ARTICLE_PERSONAL_SHARE_KEY + DateUtil.format(now, "yyyyMMdd:")
 				+ sysUser.getUserId() + ":" + wmWkArticle.getId();
 		Integer times = (Integer) redisTemplate.opsForValue().get(cacheKey);
 		if (null != times) {
 			log.info("{}:{}已经转发文章{}次数:{}", sysUser.getUserId(), sysUser.getRealname(), wmWkArticle.getId(), times);
-			if (times++ >= upmsConfig.getMaxShareTimes()) {
-				return "您当日转发的该文章次数已超过20次,转发将不再获得积分";
+			if (times++ >= maxShareTimes) {
+				return String.format("您当日转发的该药企产品相册次数已超过%s次,转发将不再获得积分", maxShareTimes);
 			}
 		} else {
 			log.info("{}:{}已经首次转发文章:{}", sysUser.getUserId(), sysUser.getRealname(), wmWkArticle.getId(), times);
@@ -3876,11 +3978,36 @@ public class ApiController {
 	 *
 	 * @param wmWkAlbum 相册
 	 * @param sysUser   分享人
+	 * @param taskTypeId 任务类型id
+	 * @param pkgId 积分包id
 	 * @return 校验结果信息
 	 */
-	private String checkAlbumLimit(WmWkAlbum wmWkAlbum, SysUser sysUser) {
+	private String checkAlbumLimit(WmWkAlbum wmWkAlbum, SysUser sysUser, String taskTypeId, String pkgId) {
 
 		Assert.notNull(wmWkAlbum);
+
+		List<WmTaskSubmissionRule.SubmissionRule> rules = wmTaskContentService.getTaskSubmissionRule(taskTypeId, pkgId);
+
+		int maxShareTimes = upmsConfig.getMaxShareTimes();
+		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())) {
+
+					List<Integer> quantity = r.getFrequency().stream().map(f -> {
+						Object o = f.get("quantity");
+						return o instanceof String ? Integer.parseInt((String) o) : (int) o;
+					}).sorted().collect(Collectors.toList());
+					maxShareTimes = quantity.get(0);
+				}
+			}
+
+
+		}
+
 		if (StringUtils.isNotEmpty(wmWkAlbum.getGlyp())) {
 			List<WmDaDrugEntDrugtable> drugTableList =
 					wmDaDrugEntDrugtableService.listByIds(Arrays.asList(wmWkAlbum.getGlyp().split(",")));
@@ -3901,8 +4028,8 @@ public class ApiController {
 					System.err.println("key" + key);
 					if (redisTemplate.hasKey(key)) {
 						int times = Integer.parseInt(redisTemplate.opsForValue().get(key).toString());
-						if (times >= upmsConfig.getMaxShareTimes()) {
-							return "您当日转发的该药企产品相册次数已超过20次,转发将不再获得积分";
+						if (times >= maxShareTimes) {
+							return String.format("您当日转发的该药企产品相册次数已超过%s次,转发将不再获得积分", maxShareTimes);
 						}
 						times++;
 						redisTemplate.opsForValue().set(key, times, CacheConstants.SHARE_TIME, TimeUnit.DAYS);
@@ -4045,6 +4172,22 @@ public class ApiController {
 
 	}
 
+	/**
+	 * 获取任务类型的小程序端限制规则
+	 *
+	 * @param deptId      企业id
+	 * @param subCategory 二级分类
+	 * @return 限制规则
+	 */
+	@GetMapping(value = "/task-sub-rule")
+	public R<?> listTaskSubmissionRule(@RequestParam(value = "deptId") Integer deptId, @RequestParam(value = "subCategory") UpmsType.TaskSubCategory subCategory) {
+		WmTaskSubmissionRule rule = taskSubmissionRuleService.getOne(Wrappers.<WmTaskSubmissionRule>lambdaQuery()
+				.eq(WmTaskSubmissionRule::getDeptId, deptId)
+				.eq(WmTaskSubmissionRule::getSubCategory, subCategory)
+		);
+		return R.ok(rule.getRule());
+
+	}
 
 
 }

+ 86 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaskSubmissionRuleController.java

@@ -0,0 +1,86 @@
+package com.qunzhixinxi.hnqz.admin.controller;
+
+import cn.hutool.core.collection.CollUtil;
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionRule;
+import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskSubmissionRuleService;
+import com.qunzhixinxi.hnqz.common.core.util.R;
+import lombok.AllArgsConstructor;
+import org.springframework.http.MediaType;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * 任务提交规则前段控制器
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-08-15 18:35
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping(value = "/task/submission/rule", produces = MediaType.APPLICATION_JSON_VALUE)
+public class WmTaskSubmissionRuleController {
+
+	private final WmTaskSubmissionRuleService taskSubmissionRuleService;
+	private final SysDeptService deptService;
+
+
+	/**
+	 * 获取企业的限制
+	 *
+	 * @return 限制信息
+	 */
+	@GetMapping
+	public R<Map<UpmsType.TaskCategory, List<WmTaskSubmissionRule>>> listDeptTaskSubmissionRules(@RequestParam(value = "deptId") Integer deptId) {
+
+		return R.ok(taskSubmissionRuleService.listDeptTaskSubmissionRules(deptId));
+	}
+
+	/**
+	 * 初始化企业限制
+	 *
+	 * @return 初始结果
+	 */
+	@PostMapping(value = "/init")
+	public R<Boolean> initDeptTaskSubmissionRule() {
+
+		List<SysDept> deptList = deptService.list();
+
+		Set<Integer> deptIds = deptList.stream().map(SysDept::getDeptId).filter(id -> id != 1).collect(Collectors.toSet());
+
+		if (CollUtil.isEmpty(deptIds)) {
+			return R.failed(Boolean.FALSE);
+		}
+
+		return R.ok(taskSubmissionRuleService.initDeptTaskSubmissionRule(deptIds));
+
+	}
+
+	/**
+	 * 更新企业的限制信息
+	 *
+	 * @return 更新结果
+	 */
+	@PutMapping
+	@Transactional(rollbackFor = Exception.class)
+	public R<Boolean> modifyDeptTaskSubmissionRule(@RequestBody List<WmTaskSubmissionRule> rules) {
+
+		return R.ok(taskSubmissionRuleService.updateBatchById(rules));
+
+	}
+
+}

+ 0 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmTaxHelperController.java

@@ -57,7 +57,6 @@ import com.qunzhixinxi.hnqz.common.taxhelper.entity.vo.TaxHelperBingCardConfirmV
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.vo.TaxHelperECheckFaceNotify;
 import com.qunzhixinxi.hnqz.common.taxhelper.enums.TaxHelperCertStatus;
 import com.qunzhixinxi.hnqz.common.taxhelper.service.TaxHelperService;
-import jdk.nashorn.internal.parser.Token;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;

+ 16 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskSubmissionRuleMapper.java

@@ -0,0 +1,16 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionRule;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 任务提交规则mapper
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-08-15 18:03
+ */
+@Mapper
+public interface WmTaskSubmissionRuleMapper extends BaseMapper<WmTaskSubmissionRule> {
+}

+ 16 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmTaskTypeSubCategoryMapper.java

@@ -0,0 +1,16 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskTypeSubCategory;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 任务类型二级分类mapper
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-08-17 17:30
+ */
+@Mapper
+public interface WmTaskTypeSubCategoryMapper extends BaseMapper<WmTaskTypeSubCategory> {
+}

+ 16 - 3
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskContentService.java

@@ -18,9 +18,12 @@
 package com.qunzhixinxi.hnqz.admin.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionRule;
 import com.qunzhixinxi.hnqz.admin.entity.WmTaskContent;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 
+import java.util.List;
+
 /**
  * 任务内容表
  *
@@ -30,9 +33,19 @@ import com.qunzhixinxi.hnqz.common.core.util.R;
 public interface WmTaskContentService extends IService<WmTaskContent> {
 
 	/**
-	 * 保存任务内容
+	 * 提交任务
+	 *
 	 * @param wmTaskContent 任务内容
-	 * @return
+	 * @return 保存结果
+	 */
+	R<?> saveTaskContent(WmTaskContent wmTaskContent);
+
+	/**
+	 * 获取任务类型校验规则
+	 *
+	 * @param taskTypeId 任务类型id
+	 * @param deptId     企业id
+	 * @return 任务类型
 	 */
-	R saveTaskContent(WmTaskContent wmTaskContent);
+	List<WmTaskSubmissionRule.SubmissionRule> getTaskSubmissionRule(String taskTypeId, String deptId);
 }

+ 36 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskSubmissionRuleService.java

@@ -0,0 +1,36 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskSubmissionRule;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 任务提交服务
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-08-15 18:06
+ */
+public interface WmTaskSubmissionRuleService extends IService<WmTaskSubmissionRule> {
+
+	/**
+	 * 获取部门限制信息
+	 *
+	 * @param deptId 部门id
+	 * @return 限制信息
+	 */
+	Map<UpmsType.TaskCategory, List<WmTaskSubmissionRule>> listDeptTaskSubmissionRules(Integer deptId);
+
+
+	/**
+	 * 初始化企业限制信息
+	 *
+	 * @param deptIds 企业id集合
+	 * @return 初始化结果
+	 */
+	Boolean initDeptTaskSubmissionRule(Collection<Integer> deptIds);
+}

+ 14 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmTaskTypeSubCategoryService.java

@@ -0,0 +1,14 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskTypeSubCategory;
+
+/**
+ * 任务类型二级分类服务
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-08-17 17:31
+ */
+public interface WmTaskTypeSubCategoryService extends IService<WmTaskTypeSubCategory> {
+}

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

@@ -42,6 +42,8 @@ import org.springframework.stereotype.Service;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -70,6 +72,7 @@ public class WmDaAgentServiceImpl extends ServiceImpl<WmDaAgentMapper, WmDaAgent
 	private final WmTaskTypeEntRefMapper wmTaskTypeEntRefMapper;
 	private final SysDeptMapper sysDeptMapper;
 	private final SysDeptSubMapper sysDeptSubMapper;
+	private final WmTaskSubmissionRuleService taskSubmissionRuleService;
 
 	public String getDeptBuildName(String deptId) {
 		String buildName = "";
@@ -310,6 +313,7 @@ public class WmDaAgentServiceImpl extends ServiceImpl<WmDaAgentMapper, WmDaAgent
 		wmDaAgent.setPgqx(1 + "");
 		super.save(wmDaAgent);
 		List<SysDept> list3 = sysDeptMapper.selectByName(wmDaAgent.getGsmc());
+		int deptId;
 		if (list3.size() == 0) {
 			SysDept sysDept = new SysDept();/**
 			 * @Modify: start
@@ -331,6 +335,7 @@ public class WmDaAgentServiceImpl extends ServiceImpl<WmDaAgentMapper, WmDaAgent
 				sysDeptService.save(sysDept);
 			}
 
+			deptId = sysDept.getDeptId();
 			// for (Map.Entry<String, Integer> entry : wmDaAgent.getSubjectTypeAndChannel().entrySet()){
 			// 	SysDeptSub deptSub = new SysDeptSub();
 			// 	deptSub.setDeptId(sysDept.getDeptId());
@@ -375,7 +380,10 @@ public class WmDaAgentServiceImpl extends ServiceImpl<WmDaAgentMapper, WmDaAgent
 			newList2.add(sysDeptRelation);
 			sysDeptRelationService.saveBatch(newList2);
 		} else {
-			wmDaAgent.setDeptId(String.valueOf(list3.get(0).getDeptId()));
+
+			deptId = list3.get(0).getDeptId();
+			wmDaAgent.setDeptId(String.valueOf(deptId));
+
 			List<WmDaDrugEnt> newList1 = new ArrayList<>();
 			for (String id : ids) {
 				WmDaDrugEnt wmDaDrugEnt = new WmDaDrugEnt();
@@ -397,6 +405,10 @@ public class WmDaAgentServiceImpl extends ServiceImpl<WmDaAgentMapper, WmDaAgent
 			newList2.add(sysDeptRelation);
 			sysDeptRelationService.saveBatch(newList2);
 		}
+
+		// 初始化任务规则
+		taskSubmissionRuleService.initDeptTaskSubmissionRule(Collections.singleton(deptId));
+
 		this.updateById(wmDaAgent);
 		List<WmRelation> newList = new ArrayList<>();
 		for (String upId : ids) {

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

@@ -33,6 +33,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.WmDaDrugEntService;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskSubmissionRuleService;
 import com.qunzhixinxi.hnqz.common.data.datascope.DataScope;
 import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
 import lombok.AllArgsConstructor;
@@ -41,6 +42,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -59,6 +61,7 @@ public class WmDaDrugEntServiceImpl extends ServiceImpl<WmDaDrugEntMapper, WmDaD
 	private final WmDaDrugEntMapper wmDaDrugEntMapper;
 	private final SysDeptRelationService sysDeptRelationService;
 	private final SysDeptSubMapper sysDeptSubMapper;
+	private final WmTaskSubmissionRuleService taskSubmissionRuleService;
 
 	@Override
 	@Transactional
@@ -157,6 +160,9 @@ public class WmDaDrugEntServiceImpl extends ServiceImpl<WmDaDrugEntMapper, WmDaD
 			newList.add(sysDeptRelation1);
 			sysDeptRelationService.saveBatch(newList);
 
+			// 初始化任务规则
+			taskSubmissionRuleService.initDeptTaskSubmissionRule(Collections.singleton(sysDept.getDeptId()));
+
 			// 创建结算渠道和通道
 //			if (CollUtil.isNotEmpty(entity.getSubjectTypeAndChannel())) {
 //				for (Map.Entry<String, Integer> entry : entity.getSubjectTypeAndChannel().entrySet()) {

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 753 - 142
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmTaskContentServiceImpl.java


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

@@ -0,0 +1,85 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+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.entity.WmTaskSubmissionRule;
+import com.qunzhixinxi.hnqz.admin.mapper.WmTaskSubmissionRuleMapper;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskSubmissionRuleService;
+import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 任务提交规则服务实现
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-08-15 18:07
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class WmTaskSubmissionRuleServiceImpl extends ServiceImpl<WmTaskSubmissionRuleMapper, WmTaskSubmissionRule> implements WmTaskSubmissionRuleService {
+
+
+	/**
+	 * 获取部门限制信息
+	 *
+	 * @param deptId 部门id
+	 * @return 限制信息
+	 */
+	@Override
+	public Map<UpmsType.TaskCategory, List<WmTaskSubmissionRule>> listDeptTaskSubmissionRules(Integer deptId) {
+
+		List<WmTaskSubmissionRule> rules = this.list(Wrappers.<WmTaskSubmissionRule>lambdaQuery().eq(WmTaskSubmissionRule::getDeptId, deptId));
+
+		return rules.stream().collect(Collectors.groupingBy(rule -> rule.getSubCategory().getCategory()));
+	}
+
+	/**
+	 * 初始化企业限制信息
+	 *
+	 * @param deptIds 企业id
+	 * @return 初始化结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean initDeptTaskSubmissionRule(Collection<Integer> deptIds) {
+
+		// 查询平台的配置
+		List<WmTaskSubmissionRule> platformRules = this.list(Wrappers.<WmTaskSubmissionRule>lambdaQuery().eq(WmTaskSubmissionRule::getDeptId, CommonConstants.TENANT_ID_1));
+
+
+		if (CollUtil.isEmpty(platformRules)) {
+			return Boolean.FALSE;
+		}
+
+
+		List<WmTaskSubmissionRule> deptRules = new ArrayList<>(deptIds.size() * platformRules.size());
+
+
+		deptIds.forEach(deptId -> {
+			platformRules.forEach(r -> {
+				WmTaskSubmissionRule deptRule = new WmTaskSubmissionRule();
+				deptRule.setRule(r.getRule());
+				deptRule.setDeptId(deptId);
+				deptRule.setOptFlag(r.getOptFlag());
+				deptRule.setSubCategory(r.getSubCategory());
+				deptRules.add(deptRule);
+			});
+
+		});
+
+		return this.saveBatch(deptRules);
+	}
+}

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

@@ -0,0 +1,22 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskTypeSubCategory;
+import com.qunzhixinxi.hnqz.admin.mapper.WmTaskTypeSubCategoryMapper;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskTypeSubCategoryService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * 任务类型二级分类服务实现
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-08-17 17:32
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class WmTaskTypeSubCategoryServiceImpl extends ServiceImpl<WmTaskTypeSubCategoryMapper, WmTaskTypeSubCategory> implements WmTaskTypeSubCategoryService {
+}

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

@@ -16,9 +16,14 @@
  */
 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 com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.entity.*;
 import com.qunzhixinxi.hnqz.admin.mapper.WmUserSignMapper;
@@ -35,6 +40,7 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.temporal.ChronoUnit;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -60,6 +66,8 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 	private final SysPublicParamService sysPublicParamService;
 	private final WmDeptTaskTypeTemplateService wmDeptTaskTypeTemplateService;
 	private final WmUserSignDetailService wmUserSignDetailService;
+	private final WmTaskSubmissionRuleService taskSubmissionRuleService;
+	private final WmTaskTypeSubCategoryService taskTypeSubCategoryService;
 
 	@Override
 	public R saveWmUserSign(WmUserSign wmUserSign) {
@@ -102,15 +110,50 @@ public class WmUserSignServiceImpl extends ServiceImpl<WmUserSignMapper, WmUserS
 			}
 		}
 
+		String taskTypeId;
+		if ("1".equals(wmUserSign.getSignEntType())){
+			taskTypeId = "5";
+		} else if ("2".equals(wmUserSign.getSignEntType())){
+			taskTypeId = "6";
+		} else if ("3".equals(wmUserSign.getSignEntType())){
+			taskTypeId = "33";
+		} else {
+			return R.failed("拜访类型不存在");
+		}
+
+		int totalLimit = 4;
+		int halfHourTotalLimit = 30;
+
+		List<WmTaskSubmissionRule.SubmissionRule> rules = wmTaskContentService.getTaskSubmissionRule(taskTypeId, tWmScorePackage.getRelatedService());
+
+		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())) {
+					Object o = r.getFrequency().get(0).get("quantity");
+					halfHourTotalLimit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
+
+				}
+				if ("同一个人在同一个商业公司的打卡时间间隔".equals(r.getManual())) {
+					Object o = r.getFrequency().get(0).get("quantity");
+					totalLimit = o instanceof String ? Integer.parseInt((String) o) : (int) o;
+				}
+			}
+		}
+
+
 		// 一个用户,在同一打卡地点,4小时内只能打卡一次
 		int total = this.count(Wrappers.<WmUserSign>lambdaQuery()
 				.eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
 				.eq(WmUserSign::getSignEntId, wmUserSign.getSignEntId())
-				.gt(WmUserSign::getSignDate, LocalDateTime.now().minus(4, ChronoUnit.HOURS)));
+				.gt(WmUserSign::getSignDate, LocalDateTime.now().minus(totalLimit, ChronoUnit.HOURS)));
 		// 一个用户,半小时内只能打卡一次
 		int halfHourTotal = this.count(Wrappers.<WmUserSign>lambdaQuery()
 				.eq(WmUserSign::getSignUserid, wmUserSign.getSignUserid())
-				.gt(WmUserSign::getSignDate, LocalDateTime.now().minus(30, ChronoUnit.MINUTES)));
+				.gt(WmUserSign::getSignDate, LocalDateTime.now().minus(halfHourTotalLimit, ChronoUnit.MINUTES)));
 		if (total != 0 || halfHourTotal != 0) {
 			log.warn("打卡间隔过短:{} {}", wmUserSign.getSignUserid(), wmUserSign.getSignEntName());
 			return R.failed("打卡间隔过短");

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно