浏览代码

Merge branch 'fix-missfield' into temp-pre

shc 2 年之前
父节点
当前提交
b9c4ba82be
共有 40 个文件被更改,包括 2060 次插入257 次删除
  1. 13 0
      db/v2.0/221027.sql
  2. 36 0
      db/v2.1/4sys_tenant_rel.sql
  3. 32 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/UpmsLevel.java
  4. 32 1
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/UpmsType.java
  5. 62 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/SysEnterpriseRelationDTO.java
  6. 68 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/SysEnterpriseRelation.java
  7. 34 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/vo/SysEnterpriseRelationVO.java
  8. 24 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/vo/SysEnterpriseServiceChargeVO.java
  9. 65 7
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/GigThirdApiController.java
  10. 59 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysEnterpriseRelationController.java
  11. 9 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserController.java
  12. 62 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/LingcaiaiInputRecord.java
  13. 2 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/SysDeptSub.java
  14. 9 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/GigTypeEnum.java
  15. 39 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/LangChaoCertStatus.java
  16. 4 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/SubjectLocation.java
  17. 1 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/SubjectTypeEnum.java
  18. 26 3
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/listener/OladingFinishTaskEventListener.java
  19. 14 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/LingcaiaiInputRecordMapper.java
  20. 13 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysDeptMapper.java
  21. 3 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysDeptSubMapper.java
  22. 16 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysEnterpriseRelationMapper.java
  23. 44 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mq/GigSignCertReceiver.java
  24. 12 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/LingcaiaiInputRecordService.java
  25. 11 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysDeptService.java
  26. 35 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysEnterpriseRelationService.java
  27. 13 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/GigThirdApiService.java
  28. 130 38
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/impl/GigThirdApiServiceImpl.java
  29. 135 63
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/impl/SysUserSignCertServiceImpl.java
  30. 17 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/LingcaiaiInputRecordServiceImpl.java
  31. 16 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysDeptServiceImpl.java
  32. 1 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysDeptSubServiceImpl.java
  33. 97 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysEnterpriseRelationServiceImpl.java
  34. 1 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserServiceImpl.java
  35. 196 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmPayOffServiceImpl.java
  36. 349 17
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmScorePackageSettleNoteServiceImpl.java
  37. 179 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/Md5Utils.java
  38. 137 116
      hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/SysDeptMapper.xml
  39. 15 0
      hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/SysDeptSubMapper.xml
  40. 49 0
      hnqz-upms/hnqz-upms-biz/src/test/java/com/qunzhixinxi/hnqz/admin/ApiTest.java

+ 13 - 0
db/v2.0/221027.sql

@@ -0,0 +1,13 @@
+create table if not exists lingcaiai_input_record
+(
+    id int auto_increment comment '主键id'
+        primary key,
+    verify varchar(128) not null comment '签名',
+    channel varchar(32) not null comment '通知类型',
+    req_body text not null comment '请求body内容',
+    batch_no varchar(32) null comment '项目单号',
+    account_no varchar(32) null comment '账号单号',
+    order_status int null comment '订单状态',
+    create_time timestamp default CURRENT_TIMESTAMP not null comment '创建时间'
+)
+    comment '浪潮(灵才接好活)结算回调请求记录';

+ 36 - 0
db/v2.1/4sys_tenant_rel.sql

@@ -0,0 +1,36 @@
+USE hnqzx;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for sys_ent_rel
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_ent_rel`;
+CREATE TABLE `sys_ent_rel`
+(
+    `rel_id`      INT(20) AUTO_INCREMENT COMMENT 'id',
+    `ent_id`      INT(20)    NOT NULL COMMENT '企业id',
+    `e_type`      VARCHAR(8) NOT NULL COMMENT '租户类型',
+    `pro_line`    VARCHAR(8) NOT NULL COMMENT '产品线',
+    `e_level`     VARCHAR(8) NOT NULL COMMENT '租户层级',
+    `parent_id`   INT(20)    NOT NULL COMMENT '父级id',
+    `root_id`     INT(20)    NOT NULL COMMENT '顶层id',
+    `create_time` DATETIME   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `update_time` DATETIME   NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
+    PRIMARY KEY `pk_id` (`rel_id`) USING BTREE,
+    INDEX `idx_type` (`e_type`) USING BTREE,
+    INDEX `idx_pro_line` (`pro_line`) USING BTREE,
+    INDEX `idx_pid` (`parent_id`) USING BTREE,
+    INDEX `idx_level` (`e_level`) USING BTREE,
+    INDEX `idx_rid` (`root_id`) USING BTREE
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='企业层级关系表';
+
+-- ----------------------------
+-- Records of sys_tenant_rel
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 32 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/UpmsLevel.java

@@ -0,0 +1,32 @@
+package com.qunzhixinxi.hnqz.admin.api.constant;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 层级标签
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-11-02 10:53
+ */
+public final class UpmsLevel {
+
+	private UpmsLevel() {
+	}
+
+	// 企业等级
+	@Getter
+	@AllArgsConstructor
+	public enum EnterpriseLevel {
+
+		L1("L1", "一级"),
+		L2("L2", "二级");
+
+		@EnumValue
+		private final String level;
+		private final String description;
+
+	}
+}

+ 32 - 1
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/constant/UpmsType.java

@@ -11,7 +11,10 @@ import lombok.Getter;
  * @version 1.0.0
  * @date 2022-08-15 15:24
  */
-public class UpmsType {
+public final class UpmsType {
+
+	private UpmsType() {
+	}
 
 	/**
 	 * 任务大类
@@ -60,4 +63,32 @@ public class UpmsType {
 		private final String description;
 
 	}
+
+	// 企业类型
+	@Getter
+	@AllArgsConstructor
+	public enum EnterpriseType {
+
+		CMO("CMO", "药企"),
+		CSO("CSO", "CSO"),
+		NET_MED("NET_MED", "互联网医疗"),
+		MED_MED("MED_MED", "医学传媒"),
+		MEETING("MEETING", "科室会");
+
+		@EnumValue
+		private final String type;
+		private final String description;
+	}
+
+	// 产品线
+	@Getter
+	@AllArgsConstructor
+	public enum ProductLine {
+
+		CSO1("CSO1", "CSO1");
+
+		@EnumValue
+		private final String type;
+		private final String description;
+	}
 }

+ 62 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/SysEnterpriseRelationDTO.java

@@ -0,0 +1,62 @@
+package com.qunzhixinxi.hnqz.admin.api.dto;
+
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsLevel;
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 企业关系Dto
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-11-02 14:45
+ */
+@Data
+@ToString
+public class SysEnterpriseRelationDTO implements Serializable {
+	private static final long serialVersionUID = 1318703734982431471L;
+
+
+	/**
+	 * id
+	 */
+	private Integer relId;
+
+	/**
+	 * 企业id
+	 */
+	private Integer enterpriseId;
+
+	/**
+	 * 企业类型
+	 */
+	private UpmsType.EnterpriseType enterpriseType;
+
+	/**
+	 * 产品线
+	 */
+	private UpmsType.ProductLine productLine;
+
+	/**
+	 * 企业等级
+	 */
+	private UpmsLevel.EnterpriseLevel enterpriseLevel;
+
+	/**
+	 * 父级id
+	 */
+	private Integer parentId;
+
+	/**
+	 * 服务费
+	 */
+	private List<Map<String, Object>> serviceCharges;
+
+
+}

+ 68 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/SysEnterpriseRelation.java

@@ -0,0 +1,68 @@
+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.UpmsLevel;
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+
+/**
+ * 企业关系表
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-11-02 10:45
+ */
+@Data
+@ToString
+@TableName(value = "sys_ent_rel")
+public class SysEnterpriseRelation implements Serializable {
+	private static final long serialVersionUID = 6584285982757215110L;
+
+	/**
+	 * id
+	 */
+	@TableId(value = "rel_id", type = IdType.AUTO)
+	private Integer relId;
+
+	/**
+	 * 企业id
+	 */
+	@TableField(value = "ent_id")
+	private Integer enterpriseId;
+
+	/**
+	 * 企业类型
+	 */
+	@TableField(value = "e_type")
+	private UpmsType.EnterpriseType enterpriseType;
+
+	/**
+	 * 产品线
+	 */
+	@TableField(value = "pro_line")
+	private UpmsType.ProductLine productLine;
+
+	/**
+	 * 企业等级
+	 */
+	@TableField(value = "e_level")
+	private UpmsLevel.EnterpriseLevel enterpriseLevel;
+
+	/**
+	 * 父级id
+	 */
+	private Integer parentId;
+
+	/**
+	 * 根id
+	 */
+	private Integer rootId;
+
+
+}

+ 34 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/vo/SysEnterpriseRelationVO.java

@@ -0,0 +1,34 @@
+package com.qunzhixinxi.hnqz.admin.api.vo;
+
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsLevel;
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 企业关系vo
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-11-02 14:45
+ */
+@Data
+@ToString
+public class SysEnterpriseRelationVO implements Serializable {
+	private static final long serialVersionUID = 1318703734982431471L;
+
+	private Long relId;
+	private Long entId;
+	private String entName;
+	private Long rootId;
+	private String rootName;
+	private UpmsType.EnterpriseType entType;
+	private UpmsType.ProductLine productLine;
+	private UpmsLevel.EnterpriseLevel entLevel;
+	private List<SysEnterpriseServiceChargeVO> serviceCharges;
+
+
+}

+ 24 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/vo/SysEnterpriseServiceChargeVO.java

@@ -0,0 +1,24 @@
+package com.qunzhixinxi.hnqz.admin.api.vo;
+
+import lombok.Data;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 企业服务费率
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-11-02 15:53
+ */
+@Data
+@ToString
+public class SysEnterpriseServiceChargeVO implements Serializable {
+	private static final long serialVersionUID = 6688063328094811017L;
+
+	private Integer entId;
+	private String subjectLocation;
+	private BigDecimal serviceCharge;
+}

+ 65 - 7
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/GigThirdApiController.java

@@ -1,12 +1,15 @@
 package com.qunzhixinxi.hnqz.admin.controller;
 
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONArray;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
 import com.qunzhixinxi.hnqz.admin.api.dto.OladingCommonRequest;
+import com.qunzhixinxi.hnqz.admin.entity.LingcaiaiInputRecord;
 import com.qunzhixinxi.hnqz.admin.entity.OladingInputRecord;
 import com.qunzhixinxi.hnqz.admin.entity.XinbadaInputRecord;
+import com.qunzhixinxi.hnqz.admin.service.LingcaiaiInputRecordService;
 import com.qunzhixinxi.hnqz.admin.service.XinbadaInputRecordService;
 import com.qunzhixinxi.hnqz.admin.service.gig.GigThirdApiService;
 import com.qunzhixinxi.hnqz.admin.service.gig.OladingInputRecordService;
@@ -27,6 +30,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.time.LocalDateTime;
+import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -51,19 +55,73 @@ public class GigThirdApiController {
 
 	private final XinbadaInputRecordService xinbadaInputRecordService;
 
+	private final LingcaiaiInputRecordService lingcaiaiInputRecordService;
+
+
 	private final RedisTemplate redisTemplate;
 
-	private static final HMACSignProvider hMACSignProvide = new HMACSignProvider();
+// 阿拉钉签名验签
+//	private static final HMACSignProvider hMACSignProvide = new HMACSignProvider();
+//
+//	/**
+//	 * 公钥
+//	 */
+//	private static final String PUBLIC_KEY = "123123123";
+//
+//	/**
+//	 * 算法类型
+//	 */
+//	private static final String ALGORITHM_TYPE = "HmacSHA256";
 
 	/**
-	 * 公钥 TODO 暂时没有
+	 * 浪潮(灵才接好活)结算回调
+	 *
+	 * @param request
+	 * @return
 	 */
-	private static final String PUBLIC_KEY = "123123123";
+	@Inner(value = false)
+	@SysLog("浪潮异步通知回调")
+	@PostMapping("/lingcaiai")
+	public String lingcaiaiNotify(HttpServletRequest request) {
+		Map<String, String[]> parameterMap = request.getParameterMap();
+		log.info("浪潮结算回调请求方法参数:parameterMap={}", JSONUtil.toJsonStr(parameterMap));
 
-	/**
-	 * 算法类型
-	 */
-	private static final String ALGORITHM_TYPE = "HmacSHA256";
+		// 签名
+		String verify = parameterMap.get("verify")[0];
+		// 通知类型
+		String channel = parameterMap.get("channel")[0];
+		// 项目单号
+		String batchNo = parameterMap.get("batch_no")[0];
+		// 订单状态
+		String orderStatus = parameterMap.get("status")[0];
+		// project_accounts
+		String projectAccounts = parameterMap.get("project_accounts")[0];
+		// 账号单号
+		if (StrUtil.isBlank(projectAccounts)) {
+			log.warn("project_accounts为空");
+			return "fail";
+		}
+
+		String redisKey = String.format("%s_%s_%s", CacheConstants.ZHEGN_QI_ZHI_XING_NOTIFY_KEY, channel, batchNo);
+		Boolean absent = redisTemplate.opsForValue().setIfAbsent(redisKey, batchNo, 30, TimeUnit.MINUTES);
+		if (!absent) {
+			return "success";
+		}
+
+		// 请求存入数据库
+		LingcaiaiInputRecord record = new LingcaiaiInputRecord();
+		record.setVerify(verify);
+		record.setChannel(channel);
+		record.setReqBody(JSONUtil.toJsonStr(parameterMap));
+		record.setBatchNo(batchNo);
+		record.setOrderStatus(Integer.valueOf(orderStatus));
+		record.setCreateTime(LocalDateTime.now());
+		lingcaiaiInputRecordService.save(record);
+
+		gigThirdApiService.lingcaiaiNotify(channel, batchNo, Integer.valueOf(orderStatus));
+
+		return "success";
+	}
 
 	/**
 	 * 正启之星异步通知回调

+ 59 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysEnterpriseRelationController.java

@@ -0,0 +1,59 @@
+package com.qunzhixinxi.hnqz.admin.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qunzhixinxi.hnqz.admin.api.dto.SysEnterpriseRelationDTO;
+import com.qunzhixinxi.hnqz.admin.api.vo.SysEnterpriseRelationVO;
+import com.qunzhixinxi.hnqz.admin.service.SysEnterpriseRelationService;
+import com.qunzhixinxi.hnqz.common.core.util.R;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+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;
+
+/**
+ * 企业关系控制层
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-11-02 11:12
+ */
+@Slf4j
+@RestController
+@AllArgsConstructor
+@RequestMapping(value = "/ent/rel")
+public class SysEnterpriseRelationController {
+
+
+	private final SysEnterpriseRelationService enterpriseRelationService;
+
+
+	/**
+	 * 获取企业分页
+	 *
+	 * @param page 分页参数
+	 * @return 分页
+	 */
+	@GetMapping(value = "/page")
+	public R<Page<SysEnterpriseRelationVO>> pageEntRels(Page<SysEnterpriseRelationVO> page,
+														@RequestParam(value = "entName", required = false) String entName) {
+		return R.ok(enterpriseRelationService.pageEntRels(page, entName));
+	}
+
+	/**
+	 * 更新企业关系
+	 *
+	 * @param relationDTO 关系内容
+	 * @return 更新结果
+	 */
+	@PostMapping
+	public R<Boolean> updateEntRel(@RequestBody SysEnterpriseRelationDTO relationDTO) {
+
+		return R.ok(enterpriseRelationService.updateEntRel(relationDTO));
+
+
+	}
+}

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

@@ -307,6 +307,15 @@ public class SysUserController {
 
 		SysDept sysDept = sysDeptService.getById(userDto.getDeptId());
 
+		List<SysUser> queryUserByPhoneList =
+				userService.list(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUsername, userDto.getUsername()));
+		if (CollUtil.isNotEmpty(queryUserByPhoneList)) {
+			SysUser queryUserByPhone = queryUserByPhoneList.get(0);
+			if (!StrUtil.equals(queryUserByPhone.getRealname(), userDto.getRealname())) {
+				return R.failed(String.format("创建失败,已存在该手机号,姓名为%s,请核对信息", queryUserByPhone.getRealname()));
+			}
+		}
+
 		// TODO qcc调用企查查查询是否为主要人员
 		/**
 		 * @Modify: start qcc调用企查查查询是否为主要人员

+ 62 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/LingcaiaiInputRecord.java

@@ -0,0 +1,62 @@
+package com.qunzhixinxi.hnqz.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author: lixuesong
+ * @createTime: 2022/10/27 11:20
+ * @description: 浪潮(灵才接好活)结算回调记录
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName(value = "lingcaiai_input_record")
+public class LingcaiaiInputRecord extends Model<LingcaiaiInputRecord> {
+
+	/**
+	 * 主键id
+	 */
+	@TableId(type = IdType.AUTO)
+	private Integer id;
+
+	/**
+	 * 签名
+	 */
+	private String verify;
+
+	/**
+	 * 通知类型
+	 */
+	private String channel;
+
+	/**
+	 * 请求body内容
+	 */
+	private String reqBody;
+
+	/**
+	 * 项目单号
+	 */
+	private String batchNo;
+
+	/**
+	 * 账号单号
+	 */
+	private String accountNo;
+
+	/**
+	 * 订单状态(0未支付,1已支付,2已取消)
+	 */
+	private Integer orderStatus;
+
+	/**
+	 * 创建时间
+	 */
+	private LocalDateTime createTime;
+}

+ 2 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/SysDeptSub.java

@@ -74,4 +74,6 @@ public class SysDeptSub extends Model<SysDeptSub> {
 
 	@ApiModelProperty(value = "更新时间")
 	private LocalDateTime updateTime;
+
+	private BigDecimal serviceCharge;
 }

+ 9 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/GigTypeEnum.java

@@ -20,7 +20,9 @@ public enum GigTypeEnum {
 	TAX_HELPOR(1, "税邦云", "税邦云", TaxHelperCertStatus.class),
 	OLADING(2, "钉灵工", "钉灵工-海南飞亿", OladingCertStatus.class),
 	YEE(3, "易联数科", "易联数科", YeeCertStatus.class),
-	ZHENG_QI_ZHI_XING(4, "正启之星", "正启之星", ZhengQiZhiXingCertStatus.class);
+	ZHENG_QI_ZHI_XING(4, "正启之星", "正启之星", ZhengQiZhiXingCertStatus.class),
+
+	LANG_CHAO(5, "浪潮", "浪潮", null);// TODO
 
 	@EnumValue
 	private int code;
@@ -65,6 +67,9 @@ public enum GigTypeEnum {
 			case ZHENG_QI_ZHI_XING:
 				certStatusStr = ZhengQiZhiXingCertStatus.resolve(certStatus).name();
 				break;
+			case LANG_CHAO:
+				certStatusStr = LangChaoCertStatus.resolve(certStatus).name();
+				break;
 			default:
 		}
 
@@ -96,6 +101,9 @@ public enum GigTypeEnum {
 			case ZHENG_QI_ZHI_XING:
 				certStatusStr = ZhengQiZhiXingCertStatus.resolve(certStatus).getMessage();
 				break;
+			case LANG_CHAO:
+				certStatusStr = LangChaoCertStatus.resolve(certStatus).getMessage();
+				break;
 			default:
 		}
 

+ 39 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/LangChaoCertStatus.java

@@ -0,0 +1,39 @@
+package com.qunzhixinxi.hnqz.admin.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author: lixuesong
+ * @createTime: 2022/10/27 15:03
+ * @description: 浪潮认证状态
+ */
+@Getter
+@AllArgsConstructor
+public enum LangChaoCertStatus {
+
+	// 签约状态(注意:CERT实际对应浪潮的已签约状态/最终状态,SIGN为我们内部额外添加的状态)
+	UN_SIGN(0, "未签约"),
+	CERT(1, "已认证"),
+	SIGN(2, "已签约");
+
+	private final int code;
+
+	private final String message;
+
+	/**
+	 * 根据枚举编码获取枚举对象
+	 *
+	 * @param code 枚举编码
+	 * @return 如果存在返回枚举,否则返回 {@code null}
+	 */
+	public static LangChaoCertStatus resolve(final int code) {
+		for (LangChaoCertStatus certStatus : LangChaoCertStatus.values()) {
+			if (certStatus.getCode() == code) {
+				return certStatus;
+			}
+		}
+		return UN_SIGN;
+
+	}
+}

+ 4 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/SubjectLocation.java

@@ -30,7 +30,10 @@ public enum SubjectLocation {
 	YI_LIAN("YI_LIAN", GigTypeEnum.YEE, "易联数科", 6),
 
 	// 正启之星
-	ZHENG_QI_ZHI_XING("ZHENG_QI_ZHI_XING",  GigTypeEnum.ZHENG_QI_ZHI_XING, "正启之星", 7);
+	ZHENG_QI_ZHI_XING("ZHENG_QI_ZHI_XING",  GigTypeEnum.ZHENG_QI_ZHI_XING, "正启之星", 7),
+
+	// 浪潮
+	LANG_CHAO("LANG_CHAO", GigTypeEnum.LANG_CHAO, "浪潮", 8);
 
 	@EnumValue
 	private final String type;

+ 1 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/SubjectTypeEnum.java

@@ -15,6 +15,7 @@ public enum SubjectTypeEnum {
 	TYPE_OLADING("2", "自由职家"),
 	TYPE_YEE("3", "易联数科"),
 	TYPE_ZHENG_QI_ZHI_XING("4", "政企之星"),
+	TYPE_LANG_CHAO("5", "浪潮"),
 
 
 	ENABLE_FLAG_FALSE("0", "无效"),

+ 26 - 3
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/listener/OladingFinishTaskEventListener.java

@@ -1,12 +1,34 @@
 package com.qunzhixinxi.hnqz.admin.listener;
 
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
+import com.qunzhixinxi.hnqz.admin.config.TaxNotifyConfig;
+import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
+import com.qunzhixinxi.hnqz.admin.entity.WmScorePackage;
+import com.qunzhixinxi.hnqz.admin.entity.WmScorePackageSettleNote;
 import com.qunzhixinxi.hnqz.admin.event.OladingFinishTaskEvent;
+import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
+import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
+import com.qunzhixinxi.hnqz.admin.service.WmScorePackageSettleNoteService;
 import com.qunzhixinxi.hnqz.admin.service.gig.GigThirdApiService;
+import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.RandomStringUtils;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.context.event.EventListener;
 import org.springframework.core.annotation.Order;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
 import org.springframework.scheduling.annotation.Async;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * @author: lixuesong
@@ -15,15 +37,16 @@ import org.springframework.scheduling.annotation.Async;
  */
 @Slf4j
 @AllArgsConstructor
+@Configuration
 public class OladingFinishTaskEventListener {
-
 	private final GigThirdApiService gigThirdApiService;
 
 	@Async
 	@Order
 	@EventListener(OladingFinishTaskEvent.class)
 	public void pushEvent(OladingFinishTaskEvent event) {
-		log.info("阿拉钉完单操作事件开始触发");
-		event.getNoteList().forEach(gigThirdApiService::finishTask);
+
+		gigThirdApiService.finishTask(event.getNoteList());
 	}
+
 }

+ 14 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/LingcaiaiInputRecordMapper.java

@@ -0,0 +1,14 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.entity.LingcaiaiInputRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author: lixuesong
+ * @createTime: 2022/10/27 13:39
+ * @description: 浪潮(灵才接好活)结算回调记录mapper
+ */
+@Mapper
+public interface LingcaiaiInputRecordMapper extends BaseMapper<LingcaiaiInputRecord> {
+}

+ 13 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysDeptMapper.java

@@ -19,8 +19,10 @@
 
 package com.qunzhixinxi.hnqz.admin.mapper;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
+import com.qunzhixinxi.hnqz.admin.api.vo.SysEnterpriseRelationVO;
 import com.qunzhixinxi.hnqz.common.data.datascope.DataScopeMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -48,9 +50,9 @@ public interface SysDeptMapper extends DataScopeMapper<SysDept> {
 
 	SysDept selectDistinctDeptId(@Param("query") SysDept sysDept);
 
-	List<SysDept> selectDeptByName(@Param("query")SysDept sysDept);
+	List<SysDept> selectDeptByName(@Param("query") SysDept sysDept);
 
-	List<Map<String,Object>> selectDeptById(@Param("query") SysDept sysDept);
+	List<Map<String, Object>> selectDeptById(@Param("query") SysDept sysDept);
 
 	List<SysDept> selectByName(String entname);
 
@@ -85,4 +87,13 @@ public interface SysDeptMapper extends DataScopeMapper<SysDept> {
 	 * @return
 	 */
 	List<SysDept> selectByIds(@Param("ids") List<Integer> ids);
+
+	/**
+	 * 获取企业关系分页
+	 *
+	 * @param entName 企业名称
+	 * @param page    分页信息
+	 * @return 分页结果
+	 */
+	Page<SysEnterpriseRelationVO> pageEntRels(Page<SysEnterpriseRelationVO> page, @Param("entName") String entName);
 }

+ 3 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysDeptSubMapper.java

@@ -18,6 +18,7 @@
 package com.qunzhixinxi.hnqz.admin.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.api.vo.SysEnterpriseServiceChargeVO;
 import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
 import com.qunzhixinxi.hnqz.admin.entity.input.SettleAmountMonitorInput;
 import com.qunzhixinxi.hnqz.admin.entity.output.SettleAmountMonitorOutput;
@@ -40,4 +41,6 @@ public interface SysDeptSubMapper extends BaseMapper<SysDeptSub> {
 	List<SettleAmountMonitorOutput> getDeptAmountMonitor(@Param("query") SettleAmountMonitorInput input);
 
 	List<SettleAmountMonitorOutput> getYaoyiAmountMonitor(@Param("query") SettleAmountMonitorInput yaoyiMonitorInput);
+
+	List<SysEnterpriseServiceChargeVO> listSysEnterpriseServiceCharge(@Param("deptId") Integer deptId);
 }

+ 16 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysEnterpriseRelationMapper.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.SysEnterpriseRelation;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 企业关系mapper
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-11-02 11:04
+ */
+@Mapper
+public interface SysEnterpriseRelationMapper extends BaseMapper<SysEnterpriseRelation> {
+}

+ 44 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mq/GigSignCertReceiver.java

@@ -17,6 +17,7 @@ import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
 import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.GigCallBackStatus;
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.LangChaoCertStatus;
 import com.qunzhixinxi.hnqz.admin.enums.LockEnum;
 import com.qunzhixinxi.hnqz.admin.enums.OladingCertStatus;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
@@ -136,6 +137,8 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
 							case ZHENG_QI_ZHI_XING:
 								this.zhengQiZhiXingHandler(user, dept, subjectResult);
 								break;
+							case LANG_CHAO:
+								this.langchaoHandler(user, dept, subjectResult);
 							default:
 						}
 					});
@@ -152,6 +155,47 @@ public class GigSignCertReceiver extends BaseRabbiMqHandler<String> {
         });
     }
 
+	/**
+	 * 浪潮回调状态处理
+	 *
+	 * @param user
+	 * @param dept
+	 * @param subjectResult
+	 */
+	private void langchaoHandler(SysUser user, SysDept dept, JSONObject subjectResult) {
+		String code = subjectResult.getStr("code");
+		String certStatus = subjectResult.getStr("certStatus");
+		LocalDateTime now = LocalDateTime.now();
+		LangChaoCertStatus langChaoCertStatus = Enum.valueOf(LangChaoCertStatus.class, certStatus);
+
+		// 拼接更新条件
+		LambdaUpdateWrapper<SysUserSub> updateWrapper = Wrappers.<SysUserSub>lambdaUpdate()
+				.eq(SysUserSub::getUserId, user.getUserId())
+				.eq(SysUserSub::getDeptId, dept.getDeptId())
+				.eq(SysUserSub::getSubjectLocation, SubjectLocation.LANG_CHAO)
+				.eq(SysUserSub::getGigType, GigTypeEnum.LANG_CHAO)
+				.set(SysUserSub::getCallbackStatus, GigCallBackStatus.RETURNED)
+				.set(SysUserSub::getUpdateTime, now)
+				.set(SysUserSub::getUpdateUser, 0)
+				.set(SysUserSub::getCertRemark, JSONUtil.toJsonStr(subjectResult));
+
+		if (LangChaoCertStatus.SIGN.equals(langChaoCertStatus)) {
+			// 这里记为已认证(对应浪潮的已签约状态)
+			updateWrapper.set(SysUserSub::getCertStatus, LangChaoCertStatus.CERT.getCode());
+		}
+
+		sysUserSubService.update(updateWrapper);
+
+		// 结果放到redis
+		Map<String, Map<String, String>> resultMap = new HashMap<>(1);
+		Map<String, String> subMap = new HashMap<>(1);
+		subMap.put("certStatus", certStatus);
+		resultMap.put("LANG_CHAO", subMap);
+		String key = CacheConstants.USER_SIGN_CERT_RESPONSE_KEY + user.getUserId();
+		log.info("缓存认证结果到redis:{}", JSONUtil.toJsonStr(resultMap));
+		redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(resultMap), 1, TimeUnit.MINUTES);
+	}
+
 	/**
 	 * 正启之星结果处理
 	 *

+ 12 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/LingcaiaiInputRecordService.java

@@ -0,0 +1,12 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.entity.LingcaiaiInputRecord;
+
+/**
+ * @author: lixuesong
+ * @createTime: 2022/10/27 13:40
+ * @description: 浪潮(灵才接好活)结算回调记录service
+ */
+public interface LingcaiaiInputRecordService extends IService<LingcaiaiInputRecord> {
+}

+ 11 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysDeptService.java

@@ -23,6 +23,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qunzhixinxi.hnqz.admin.api.dto.DeptTree;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
+import com.qunzhixinxi.hnqz.admin.api.vo.SysEnterpriseRelationVO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -105,9 +106,18 @@ public interface SysDeptService extends IService<SysDept> {
 	/**
 	 * 分页查询药企和CSO代理商
 	 *
-	 * @param page 分页参数
+	 * @param page     分页参数
 	 * @param deptName 部门名称
 	 * @return
 	 */
 	Map<String, Object> listEntAndAgent(Page page, String deptName);
+
+	/**
+	 * 获取分页
+	 *
+	 * @param entName 企业名称
+	 * @param page    分页参数
+	 * @return 翻页结果
+	 */
+	Page<SysEnterpriseRelationVO> pageEntRels(Page<SysEnterpriseRelationVO> page, String entName);
 }

+ 35 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysEnterpriseRelationService.java

@@ -0,0 +1,35 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.api.dto.SysEnterpriseRelationDTO;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysEnterpriseRelation;
+import com.qunzhixinxi.hnqz.admin.api.vo.SysEnterpriseRelationVO;
+
+/**
+ * 企业关系服务
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-11-02 11:08
+ */
+public interface SysEnterpriseRelationService extends IService<SysEnterpriseRelation> {
+
+
+	/**
+	 * 获取分页
+	 *
+	 * @param entName 企业名称
+	 * @param page    分页参数
+	 * @return 翻页结果
+	 */
+	Page<SysEnterpriseRelationVO> pageEntRels(Page<SysEnterpriseRelationVO> page, String entName);
+
+	/**
+	 * 更新企业关系信息
+	 *
+	 * @param relationDTO 更新内容
+	 * @return 更新结果
+	 */
+	Boolean updateEntRel(SysEnterpriseRelationDTO relationDTO);
+}

+ 13 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/GigThirdApiService.java

@@ -4,6 +4,8 @@ import com.qunzhixinxi.hnqz.admin.api.dto.OladingCommonRequest;
 import com.qunzhixinxi.hnqz.admin.entity.WmScorePackage;
 import com.qunzhixinxi.hnqz.admin.entity.WmScorePackageSettleNote;
 
+import java.util.List;
+
 /**
  * 第三方零工接口处理
  *
@@ -12,6 +14,15 @@ import com.qunzhixinxi.hnqz.admin.entity.WmScorePackageSettleNote;
  */
 public interface GigThirdApiService {
 
+	/**
+	 * 浪潮(灵才接好活)结算回调
+	 *
+	 * @param channel 通知类型(recharge 充值,batchQuery 批量结果,refund  退款)
+	 * @param batchNo 项目单号
+	 * @param orderStatus 项目订单状态(0未支付,1已支付,2已取消)
+	 */
+	void lingcaiaiNotify(String channel, String batchNo, Integer orderStatus);
+
 	/**
 	 * 正启之星回调业务处理
 	 *
@@ -56,8 +67,8 @@ public interface GigThirdApiService {
 	/**
 	 * 完单操作
 	 *
-	 * @param note
+	 * @param noteList
 	 */
-	void finishTask(WmScorePackageSettleNote note);
+	void finishTask(List<WmScorePackageSettleNote> noteList);
 
 }

+ 130 - 38
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/impl/GigThirdApiServiceImpl.java

@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
 import com.qunzhixinxi.hnqz.admin.api.dto.OladingCommonRequest;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
 import com.qunzhixinxi.hnqz.admin.config.TaxNotifyConfig;
 import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
 import com.qunzhixinxi.hnqz.admin.entity.SysUserSub;
@@ -23,6 +24,7 @@ import com.qunzhixinxi.hnqz.admin.enums.OladingCertStatus;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import com.qunzhixinxi.hnqz.admin.event.OladingFinishTaskEvent;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserService;
 import com.qunzhixinxi.hnqz.admin.service.SysUserSubService;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageSettleNoteService;
@@ -70,11 +72,84 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 	private final WmScorePackageSettleNoteService scorePackageSettleNoteService;
 	private final WmScorePackageService scorePackageService;
 	private final SysDeptService sysDeptService;
+	private final SysUserService sysUserService;
 	private final UpmsConfig upmsConfig;
 	private final TaxNotifyConfig taxNotifyConfig;
 
 	private final ApplicationEventPublisher applicationEventPublisher;
 
+	/**
+	 * 浪潮(灵才接好活)结算回调
+	 *
+	 * @param channel 通知类型(recharge 充值,batchQuery 批量结果,refund  退款)
+	 * @param batchNo 项目单号
+	 * @param orderStatus 项目订单状态(0未支付,1已支付,2已取消)
+	 */
+	@Override
+	public void lingcaiaiNotify(String channel, String batchNo, Integer orderStatus) {
+		switch (channel) {
+			case "recharge":
+				// 充值 暂不实现~
+				break;
+			case "refund":
+				// 退款 暂不实现~
+				break;
+			case "batchQuery":
+				// 订单状态转换为
+				int yaoyiStatus;
+				switch (orderStatus){
+					case 1:
+						yaoyiStatus = 1;
+						break;
+					default:
+						yaoyiStatus = 2;
+						break;
+				}
+
+				// 批量结果
+				// 根据orderNo查询结算单
+				List<WmScorePackageSettleNote> settleNoteList = scorePackageSettleNoteService.list(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
+						.eq(WmScorePackageSettleNote::getStreamId, batchNo));
+				if (CollUtil.isEmpty(settleNoteList)) {
+					log.warn("订单streamId={}对应结算单不存在", batchNo);
+					return;
+				}
+
+				// 修改结算状态
+				List<WmScorePackageSettleNote> updateList = settleNoteList.stream().map(note -> {
+					WmScorePackageSettleNote updateEntity = new WmScorePackageSettleNote();
+					updateEntity.setId(note.getId());
+					updateEntity.setSettleNoteStatus(yaoyiStatus);
+					if (yaoyiStatus == 1){
+						updateEntity.setNotifyTime(LocalDateTime.now());
+					}
+					updateEntity.setUpdateTime(LocalDateTime.now());
+					return updateEntity;
+				}).collect(Collectors.toList());
+
+				scorePackageSettleNoteService.updateBatchById(updateList);
+
+				WmScorePackageSettleNote tmp = settleNoteList.get(0);
+				WmScorePackage scorePackage = scorePackageService.getById(tmp.getPackageId());
+
+				// 遥领不修改
+				if (!"1611890566".equals(scorePackage.getSendPackageDeptId())) {
+					// 更新积分包状态
+					log.info("更新积分包状态:{}", tmp);
+					WmScorePackage wmScorePackage = new WmScorePackage();
+					wmScorePackage.setId(tmp.getPackageId());
+					wmScorePackage.setSettleStatus(yaoyiStatus);
+					wmScorePackage.setUpdateTime(LocalDateTime.now());
+					scorePackageService.updateById(wmScorePackage);
+				}
+
+				redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + tmp.getId());
+
+				break;
+			default:
+		}
+	}
+
 	/**
 	 * 正启之星回调业务处理
 	 *
@@ -257,9 +332,11 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 			}
 			redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + tmp.getId());
 
-			// 异步发起完单操作,是否成功不做处理
+			// 如果结算成功,则异步发起完单操作,是否成功不做处理
 			try {
-				applicationEventPublisher.publishEvent(new OladingFinishTaskEvent(noteList));
+				if (yaoyiStatus == 1) {
+					applicationEventPublisher.publishEvent(new OladingFinishTaskEvent(noteList));
+				}
 			} catch (Exception e) {
 				log.warn("阿拉钉异步发起完单操作异常requestId={}", requestId);
 				log.error("阿拉钉异步发起完单操作异常", e);
@@ -569,44 +646,59 @@ public class GigThirdApiServiceImpl implements GigThirdApiService {
 	/**
 	 * 完单操作
 	 *
-	 * @param note
+	 * @param noteList
 	 */
-	public void finishTask(WmScorePackageSettleNote note) {
-		WmScorePackage wmScorePackage = scorePackageService.getById(note.getPackageId());
-		SysDept dept = sysDeptService.getById(wmScorePackage.getDeptId());
-
-		String gigFinishTaskUrl = upmsConfig.getGigServiceUrl() + "/gig/operation/settlement/finish-task";
-		// 封装结算参数
-		Map<String, Object> params = new HashMap<>();
-		params.put("requestId", RandomStringUtils.randomAlphabetic(12));
-		params.put("endType", "CSO");
-		params.put("enterpriseCode", dept.getTaxCode());
-		params.put("subjectType", "OLADING");
-		params.put("channel", "DEFAULT");
-		params.put("subjectLocation", note.getSubjectLocation());
-		params.put("taskId", note.getThirdTaskId());
-		params.put("credentialLink", taxNotifyConfig.getTaskUrl() + "/#/h5/indexTask?id=" + note.getPackageId() + "&userId=" + note.getUserId());
-
-		// 发起完单操作
-		HttpHeaders headers = new HttpHeaders();
-		headers.setContentType(MediaType.APPLICATION_JSON);
-		log.info("阿拉丁完单操作req: {}", params);
-		HttpEntity<String> result = new RestTemplate().exchange(gigFinishTaskUrl, HttpMethod.POST, new HttpEntity<>(params, headers), String.class);
-		log.warn("阿拉丁完单操作resp: {}", result.getBody());
-		if (!JSONUtil.isJson(result.getBody())) {
-			log.warn("完单操作失败:taskId={}", note.getThirdTaskId());
+	public void finishTask(List<WmScorePackageSettleNote> noteList) {
+		// 使用thirdTaskId分组
+		Map<String, List<WmScorePackageSettleNote>> noteTaskIdMap = noteList.stream()
+				.filter(note -> StrUtil.isNotBlank(note.getThirdTaskId()))
+				.collect(Collectors.groupingBy(WmScorePackageSettleNote::getThirdTaskId));
+		if (CollUtil.isEmpty(noteTaskIdMap)) {
+			log.info("任务id为空,不发起阿拉丁完单操作");
+			return;
 		}
-		JSONObject resultObj = JSONUtil.parseObj(result.getBody());
-		// {"code":0,"msg":"SUCCESS","data":{"success":true,"message":"成功","result":"4154"}}
-		if (Objects.equals(resultObj.getInt("code"), CommonConstants.SUCCESS)) {
-			JSONObject dataJsonObj = resultObj.getJSONObject("data");
-			if (dataJsonObj != null && dataJsonObj.getBool("success", false)) {
-				// 完单操作成功,更新状态
-				WmScorePackageSettleNote updateNote = new WmScorePackageSettleNote();
-				updateNote.setId(note.getId());
-				updateNote.setFinishTaskFlag(1);
-				scorePackageSettleNoteService.updateById(updateNote);
+
+		noteTaskIdMap.forEach((thirdTaskId, notes) -> {
+			WmScorePackageSettleNote note = notes.get(0);
+			WmScorePackage wmScorePackage = scorePackageService.getById(note.getPackageId());
+			SysDept dept = sysDeptService.getById(wmScorePackage.getDeptId());
+			SysUser sysUser = sysUserService.getById(note.getUserId());
+
+			String gigFinishTaskUrl = upmsConfig.getGigServiceUrl() + "/gig/operation/settlement/finish-task";
+			// 封装结算参数
+			Map<String, Object> params = new HashMap<>();
+			params.put("requestId", RandomStringUtils.randomAlphabetic(12));
+			params.put("endType", "CSO");
+			params.put("enterpriseCode", dept.getTaxCode());
+			params.put("subjectType", "OLADING");
+			params.put("channel", "DEFAULT");
+			params.put("subjectLocation", note.getSubjectLocation());
+			params.put("taskId", note.getThirdTaskId());
+			params.put("username", sysUser.getUsername());
+			String packageIds = notes.stream().map(WmScorePackageSettleNote::getPackageId).collect(Collectors.joining(StrUtil.COMMA));
+			params.put("credentialLink", taxNotifyConfig.getTaskUrl() + "/#/h5/indexTask?id=" + packageIds + "&userId=" + note.getUserId());
+
+			// 发起完单操作
+			HttpHeaders headers = new HttpHeaders();
+			headers.setContentType(MediaType.APPLICATION_JSON);
+			log.info("阿拉丁完单操作req: {}", params);
+			HttpEntity<String> result = new RestTemplate().exchange(gigFinishTaskUrl, HttpMethod.POST, new HttpEntity<>(params, headers), String.class);
+			log.warn("阿拉丁完单操作resp: {}", result.getBody());
+			if (!JSONUtil.isJson(result.getBody())) {
+				log.warn("完单操作失败:taskId={}", note.getThirdTaskId());
 			}
-		}
+			JSONObject resultObj = JSONUtil.parseObj(result.getBody());
+			// {"code":0,"msg":"SUCCESS","data":{"success":true,"message":"成功","result":"4154"}}
+			if (Objects.equals(resultObj.getInt("code"), CommonConstants.SUCCESS)) {
+				JSONObject dataJsonObj = resultObj.getJSONObject("data");
+				if (dataJsonObj != null && dataJsonObj.getBool("success", false)) {
+					// 完单操作成功,更新状态
+					WmScorePackageSettleNote updateNote = new WmScorePackageSettleNote();
+					updateNote.setId(note.getId());
+					updateNote.setFinishTaskFlag(1);
+					scorePackageSettleNoteService.updateById(updateNote);
+				}
+			}
+		});
 	}
 }

+ 135 - 63
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/gig/impl/SysUserSignCertServiceImpl.java

@@ -28,6 +28,7 @@ import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.GigCallBackStatus;
 import com.qunzhixinxi.hnqz.admin.enums.GigChannelEnum;
 import com.qunzhixinxi.hnqz.admin.enums.GigTypeEnum;
+import com.qunzhixinxi.hnqz.admin.enums.LangChaoCertStatus;
 import com.qunzhixinxi.hnqz.admin.enums.LockEnum;
 import com.qunzhixinxi.hnqz.admin.enums.MemberIDCardType;
 import com.qunzhixinxi.hnqz.admin.enums.MemberType;
@@ -290,63 +291,58 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 		if (userSub == null) {
 			return R.failed("用户sub数据不存在");
 		}
-		// 判断是否已签约/增员
-		if (userSignCertDTO.getSubjectLocation().getGigType().equals(GigTypeEnum.TAX_HELPOR)) {
-			if (userSub.getCertStatus() > TaxHelperCertStatus.UN_CERT.getCode()) {
-				return R.ok();
-			}
-		} else if (userSignCertDTO.getSubjectLocation().getGigType().equals(GigTypeEnum.OLADING)) {
-			if (OladingCertStatus.SIGNED.getCode().equals(String.valueOf(userSub.getCertStatus()))
-					|| OladingCertStatus.SIGNING.getCode().equals(String.valueOf(userSub.getCertStatus()))
-					|| OladingCertStatus.CERT.getCode().equals(String.valueOf(userSub.getCertStatus()))) {
-				return R.ok(MapUtil.builder("certStatus", OladingCertStatus.resolve(String.valueOf(userSub.getCertStatus()))).build());
-			}
-		} else if (userSignCertDTO.getSubjectLocation().getGigType().equals(GigTypeEnum.ZHENG_QI_ZHI_XING)) {
-			if (userSub.getCertStatus() > ZhengQiZhiXingCertStatus.UN_SIGN.getCode()) {
-				return R.ok();
-			}
-		}
-
-		// 查询dept
-		SysDept dept = sysDeptService.getById(sysUser.getDeptId());
-
-		// 发起签约/增员
-		Map<String, Object> params = new HashMap<>();
-		params.put("enterpriseCode", dept.getTaxCode());
-		params.put("subjectLocation", userSub.getSubjectLocation().name());
-		params.put("subjectChannel", userSub.getGigChannel().name());
-		params.put("realName", sysUser.getRealname());
-		params.put("phone", sysUser.getUsername());
-		params.put("bankPhone", userSub.getBankPhone());
-		params.put("bankCard", userSub.getBankCardNumber());
-		params.put("idCard", sysUser.getIdCardNumber());
-		params.put("endType", "CSO");
-		params.put("email", "service@yaoyi.net");
-		params.put("address", "北京市房山区");
-
-		log.info("签约/增员,req={}", JSONUtil.toJsonStr(params));
-		String postResult = HttpUtil.post(upmsConfig.getGigServiceUrl() + GIG_CERT_ACTION_SIGN_UP, JSONUtil.toJsonStr(params));
-		log.info("签约/增员,resp={}", postResult);
 
+		String postResult = null;
 		String message = "增员/签约失败";
 		Integer certStatus = null;
 		boolean successFlag = false;
 		String requestId = null;
-		if (JSONUtil.isJsonObj(postResult)) {
-			JSONObject jsonResult = JSONUtil.parseObj(postResult);
-			if (jsonResult.getInt("code") == 0) {
-				JSONObject data = jsonResult.getJSONObject("data");
-				message = data.getStr("message");
 
-				// 根据不同渠道 处理不同的返回结果
-				switch (userSignCertDTO.getSubjectLocation().getGigType()) {
-					case TAX_HELPOR:
+		// 根据不同渠道处理
+		switch (userSignCertDTO.getSubjectLocation().getGigType()) {
+			case TAX_HELPOR:
+				// 税邦云
+				if (userSub.getCertStatus() > TaxHelperCertStatus.UN_CERT.getCode()) {
+					return R.ok();
+				}
+
+				postResult = this.toSignCommonRequest(sysUser, userSub);
+
+				if (JSONUtil.isJsonObj(postResult)) {
+					JSONObject jsonResult = JSONUtil.parseObj(postResult);
+					if (jsonResult.getInt("code") == 0) {
+						JSONObject data = jsonResult.getJSONObject("data");
+						message = data.getStr("message");
+
 						if ("2000".equals(data.getStr("code"))) {
 							successFlag = true;
 							certStatus = TaxHelperCertStatus.ADD_MEMBER.getCode();
 						}
-						break;
-					case OLADING:
+					}
+				}
+
+				// 修改userSub状态
+				this.updateUserCertStatus(userSub.getId(), message, certStatus, requestId);
+
+				if (successFlag) {
+					return R.ok();
+				}
+			case OLADING:
+				// 自由职家
+				if (OladingCertStatus.SIGNED.getCode().equals(String.valueOf(userSub.getCertStatus()))
+						|| OladingCertStatus.SIGNING.getCode().equals(String.valueOf(userSub.getCertStatus()))
+						|| OladingCertStatus.CERT.getCode().equals(String.valueOf(userSub.getCertStatus()))) {
+					return R.ok(MapUtil.builder("certStatus", OladingCertStatus.resolve(String.valueOf(userSub.getCertStatus()))).build());
+				}
+
+				postResult = this.toSignCommonRequest(sysUser, userSub);
+
+				if (JSONUtil.isJsonObj(postResult)) {
+					JSONObject jsonResult = JSONUtil.parseObj(postResult);
+					if (jsonResult.getInt("code") == 0) {
+						JSONObject data = jsonResult.getJSONObject("data");
+						message = data.getStr("message");
+
 						if ("0".equals(data.getStr("code"))) {
 							successFlag = true;
 							certStatus = Integer.parseInt(OladingCertStatus.SIGNING.getCode());
@@ -355,36 +351,110 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 							successFlag = true;
 							certStatus = Integer.parseInt(OladingCertStatus.SIGNING.getCode());
 						}
-						break;
-					case ZHENG_QI_ZHI_XING:
+					}
+				}
+
+				this.updateUserCertStatus(userSub.getId(), message, certStatus, requestId);
+
+				if (successFlag) {
+					if (userSignCertDTO.getSubjectLocation().getGigType().equals(GigTypeEnum.OLADING)) {
+						// 阿拉钉返回具体认证状态,区分签约中、已签约的情况
+						return R.ok(MapUtil.builder("certStatus", OladingCertStatus.resolve(String.valueOf(certStatus))).build());
+					}
+					return R.ok();
+				}
+
+				break;
+			case ZHENG_QI_ZHI_XING:
+				// 正启之星
+				if (userSub.getCertStatus() > ZhengQiZhiXingCertStatus.UN_SIGN.getCode()) {
+					return R.ok();
+				}
+
+				postResult = this.toSignCommonRequest(sysUser, userSub);
+
+				if (JSONUtil.isJsonObj(postResult)) {
+					JSONObject jsonResult = JSONUtil.parseObj(postResult);
+					if (jsonResult.getInt("code") == 0) {
+						JSONObject data = jsonResult.getJSONObject("data");
+						message = data.getStr("message");
+
 						if ("200".equals(data.getStr("code"))) {
 							successFlag = true;
 							certStatus = ZhengQiZhiXingCertStatus.SIGN.getCode();
 						}
-						break;
-					default:
+					}
 				}
-			}
+
+				this.updateUserCertStatus(userSub.getId(), message, certStatus, requestId);
+
+				if (successFlag) {
+					return R.ok();
+				}
+				break;
+			case LANG_CHAO:
+				// 浪潮
+				if (userSub.getCertStatus() > LangChaoCertStatus.UN_SIGN.getCode()) {
+					return R.ok();
+				}
+				this.updateUserCertStatus(userSub.getId(), "内部状态对其", LangChaoCertStatus.SIGN.getCode(), null);
+				return R.ok();
+			default:
+				message = "不支持该税源地操作";
 		}
 
+		return R.failed(message);
+	}
+
+	/**
+	 * 更新认证状态
+	 *
+	 * @param userSubId
+	 * @param message
+	 * @param certStatus
+	 * @param requestId
+	 */
+	private void updateUserCertStatus(Integer userSubId, String message, Integer certStatus, String requestId) {
 		// 修改userSub状态
 		SysUserSub updateUserSub = new SysUserSub();
-		updateUserSub.setId(userSub.getId());
+		updateUserSub.setId(userSubId);
 		updateUserSub.setCertStatus(certStatus);
 		updateUserSub.setCertRemark("签约/增员:" + message);
 		updateUserSub.setRequestId(requestId);
 		updateUserSub.setUpdateUser(SecurityUtils.getUser().getId());
 		updateUserSub.setUpdateTime(LocalDateTime.now());
 		sysUserSubService.updateById(updateUserSub);
+	}
 
-		if (successFlag) {
-			if (userSignCertDTO.getSubjectLocation().getGigType().equals(GigTypeEnum.OLADING)) {
-				// 阿拉钉返回具体认证状态,区分签约中、已签约的情况
-				return R.ok(MapUtil.builder("certStatus", OladingCertStatus.resolve(String.valueOf(certStatus))).build());
-			}
-			return R.ok();
-		}
-		return R.failed(message);
+	/**
+	 * 发起签约request
+	 *
+	 * @param sysUser
+	 * @param userSub
+	 * @return
+	 */
+	private String toSignCommonRequest(SysUser sysUser, SysUserSub userSub) {
+		// 查询dept
+		SysDept dept = sysDeptService.getById(sysUser.getDeptId());
+
+		// 发起签约/增员
+		Map<String, Object> params = new HashMap<>();
+		params.put("enterpriseCode", dept.getTaxCode());
+		params.put("subjectLocation", userSub.getSubjectLocation().name());
+		params.put("subjectChannel", userSub.getGigChannel().name());
+		params.put("realName", sysUser.getRealname());
+		params.put("phone", sysUser.getUsername());
+		params.put("bankPhone", userSub.getBankPhone());
+		params.put("bankCard", userSub.getBankCardNumber());
+		params.put("idCard", sysUser.getIdCardNumber());
+		params.put("endType", "CSO");
+		params.put("email", "service@yaoyi.net");
+		params.put("address", "北京市房山区");
+
+		log.info("签约/增员,req={}", JSONUtil.toJsonStr(params));
+		String postResult = HttpUtil.post(upmsConfig.getGigServiceUrl() + GIG_CERT_ACTION_SIGN_UP, JSONUtil.toJsonStr(params));
+		log.info("签约/增员,resp={}", postResult);
+		return postResult;
 	}
 
 	/**
@@ -495,6 +565,8 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 					return true;
 				} else if (GigTypeEnum.ZHENG_QI_ZHI_XING.equals(sysUserSub.getGigType())) {
 					return true;
+				} else if (GigTypeEnum.LANG_CHAO.equals(sysUserSub.getGigType())) {
+					return true;
 				}
 				return false;
 			}).forEach(userSub -> {
@@ -689,10 +761,10 @@ public class SysUserSignCertServiceImpl implements SysUserSignCertService {
 		userInfoModel.setBankCard(userSub.getBankCardNumber());
 		userInfoModel.setUploadFaceID(uploadFaceID);
 		userInfoModel.setIdCardFront(StrUtil.isBlank(userSub.getIdCardFrontUrl())
-				? null : userSub.getIdCardFrontUrl().startsWith("https")
+				? userExtRecord.getIdCardFrontUrl() : userSub.getIdCardFrontUrl().startsWith("https")
 				? userSub.getIdCardFrontUrl() : upmsConfig.getClientUrl() + userSub.getIdCardFrontUrl());
 		userInfoModel.setIdCardBack(StrUtil.isBlank(userSub.getIdCardBackUrl())
-				? null : userSub.getIdCardBackUrl().startsWith("https")
+				? userExtRecord.getIdCardBackUrl() : userSub.getIdCardBackUrl().startsWith("https")
 				? userSub.getIdCardBackUrl() : upmsConfig.getClientUrl() + userSub.getIdCardBackUrl());
 		userInfoModel.setCertVideo1(StrUtil.isBlank(userSub.getCertVideo1Url())
 				? null : userSub.getCertVideo1Url().startsWith("https")

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

@@ -0,0 +1,17 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.entity.LingcaiaiInputRecord;
+import com.qunzhixinxi.hnqz.admin.mapper.LingcaiaiInputRecordMapper;
+import com.qunzhixinxi.hnqz.admin.service.LingcaiaiInputRecordService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author: lixuesong
+ * @createTime: 2022/10/27 13:40
+ * @description: 浪潮(灵才接好活)结算回调记录service
+ */
+@Service
+public class LingcaiaiInputRecordServiceImpl
+		extends ServiceImpl<LingcaiaiInputRecordMapper, LingcaiaiInputRecord> implements LingcaiaiInputRecordService {
+}

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

@@ -29,6 +29,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qunzhixinxi.hnqz.admin.api.dto.DeptTree;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDeptRelation;
+import com.qunzhixinxi.hnqz.admin.api.vo.SysEnterpriseRelationVO;
 import com.qunzhixinxi.hnqz.admin.api.vo.TreeUtil;
 import com.qunzhixinxi.hnqz.admin.entity.base.HnqzPage;
 import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
@@ -463,7 +464,7 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
 	/**
 	 * 分页查询药企和CSO代理商
 	 *
-	 * @param page 分页参数
+	 * @param page     分页参数
 	 * @param deptName 部门名称
 	 * @return
 	 */
@@ -493,7 +494,8 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
 		if (StringUtils.isNotBlank(deptName)) {
 			csoWrapper.like(SysDept::getName, deptName);
 		}
-		Page<SysDept> csoPage = this.page(page, csoWrapper);List<Map<String, Object>> csoMapList = csoPage.getRecords().stream().map(sysDept -> {
+		Page<SysDept> csoPage = this.page(page, csoWrapper);
+		List<Map<String, Object>> csoMapList = csoPage.getRecords().stream().map(sysDept -> {
 			Map<String, Object> deptMap = MapUtil.newHashMap(2);
 			deptMap.put("deptId", sysDept.getDeptId());
 			deptMap.put("name", sysDept.getName());
@@ -507,4 +509,16 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
 		resultMap.put("csoPage", new HnqzPage<>(csoHnqzPage));
 		return resultMap;
 	}
+
+	/**
+	 * 获取分页
+	 *
+	 * @param entName 企业名称
+	 * @param page    分页参数
+	 * @return 翻页结果
+	 */
+	@Override
+	public Page<SysEnterpriseRelationVO> pageEntRels(Page<SysEnterpriseRelationVO> page, String entName) {
+		return this.baseMapper.pageEntRels(page, entName);
+	}
 }

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

@@ -126,7 +126,7 @@ public class SysDeptSubServiceImpl extends ServiceImpl<SysDeptSubMapper, SysDept
 	public void saveSettleConfig(DeptSubLimitAmountInput input) {
 		// 更新结算主体
 		String[] subTypeArr = input.getSubList().stream()
-				.map(sysDeptSub -> sysDeptSub.getSubjectLocation().getGigType().name())
+				.map(sysDeptSub -> String.valueOf(sysDeptSub.getSubjectLocation().getGigType().getCode()))
 				.distinct()
 				.toArray(String[]::new);
 		SysDept dept = sysDeptMapper.selectById(input.getDeptId());

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

@@ -0,0 +1,97 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.api.dto.SysEnterpriseRelationDTO;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysEnterpriseRelation;
+import com.qunzhixinxi.hnqz.admin.api.vo.SysEnterpriseRelationVO;
+import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
+import com.qunzhixinxi.hnqz.admin.mapper.SysEnterpriseRelationMapper;
+import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
+import com.qunzhixinxi.hnqz.admin.service.SysDeptSubService;
+import com.qunzhixinxi.hnqz.admin.service.SysEnterpriseRelationService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 企业关系实现
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2022-11-02 11:09
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class SysEnterpriseRelationServiceImpl extends ServiceImpl<SysEnterpriseRelationMapper, SysEnterpriseRelation> implements SysEnterpriseRelationService {
+
+	private final SysDeptService deptService;
+	private final SysDeptSubService deptSubService;
+
+	/**
+	 * 获取分页
+	 *
+	 * @param page 分页参数
+	 * @return 翻页结果
+	 */
+	@Override
+	public Page<SysEnterpriseRelationVO> pageEntRels(Page<SysEnterpriseRelationVO> page, String entName) {
+		return deptService.pageEntRels(page, entName);
+	}
+
+	/**
+	 * 更新企业关系信息
+	 *
+	 * @param relationDTO 更新内容
+	 * @return 更新结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Boolean updateEntRel(SysEnterpriseRelationDTO relationDTO) {
+
+		SysEnterpriseRelation relation = BeanUtil.copyProperties(relationDTO, SysEnterpriseRelation.class);
+		relation.setRootId(relation.getParentId());
+
+		this.saveOrUpdate(relation);
+
+
+		List<Map<String, Object>> serviceCharges = relationDTO.getServiceCharges();
+
+		if (CollUtil.isNotEmpty(serviceCharges)) {
+
+			List<SysDeptSub> deptSubs = deptSubService.list(Wrappers.<SysDeptSub>lambdaQuery().eq(SysDeptSub::getDeptId, relation.getEnterpriseId()));
+
+			if (CollUtil.isNotEmpty(deptSubs)) {
+				Map<SubjectLocation, Integer> subMap = deptSubs.stream().collect(Collectors.toMap(SysDeptSub::getSubjectLocation, SysDeptSub::getSubId));
+
+				List<SysDeptSub> subs = serviceCharges.stream().map(m -> {
+					SysDeptSub sub = new SysDeptSub();
+					sub.setDeptId(relation.getEnterpriseId());
+					SubjectLocation location = Enum.valueOf(SubjectLocation.class, (String) m.get("subjectLocation"));
+					Integer subId = subMap.get(location);
+					sub.setSubId(subId);
+					sub.setSubjectLocation(location);
+					sub.setServiceCharge(new BigDecimal(m.get("serviceCharge").toString()));
+					return sub;
+				}).collect(Collectors.toList());
+
+				deptSubService.updateBatchById(subs);
+			}
+
+		}
+
+
+		return Boolean.TRUE;
+	}
+}

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

@@ -214,6 +214,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 				case REN_LI_JIA:
 				case OLADING:
 				case ZHENG_QI_ZHI_XING:
+				case LANG_CHAO:
 					if (!Objects.equals(userSub.getCertStatus(), DingEnum.CER_STATUS_1.getType())) {
 						throw new RuntimeException(user.getRealname() + "未认证,不能发起结算");
 					}

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

@@ -180,6 +180,9 @@ public class WmPayOffServiceImpl extends ServiceImpl<WmPayOffMapper, WmPayOff> i
 				note.setIdCardNumber(noteUser.getIdCardNumber());
 				notes.add(note);
 			}
+			if (wmScorePackage.getLocation() != null) {
+				wmScorePackage.setSubjectLocation(wmScorePackage.getLocation().name());
+			}
 		} else {
 
 			notes.forEach(item -> {
@@ -413,6 +416,7 @@ public class WmPayOffServiceImpl extends ServiceImpl<WmPayOffMapper, WmPayOff> i
 		SysDeptSub sysDeptSub = sysDeptSubService.getDeptSub(operator.getDeptId(), location);
 		SysDept sysDept = sysDeptService.getById(sysDeptSub.getDeptId());
 		String taxCode = sysDept.getTaxCode();
+		String enterpriseName = sysDept.getName();
 		if (StringUtils.isEmpty(taxCode)) {
 			return R.failed("未配置企业的统一社会信用代码");
 		}
@@ -431,6 +435,10 @@ public class WmPayOffServiceImpl extends ServiceImpl<WmPayOffMapper, WmPayOff> i
 		else if (SubjectTypeEnum.TYPE_ZHENG_QI_ZHI_XING.getCode().equals(subType)){
 			return settleBySinbaad(input, wmScorePackage, taxCode, operator);
 		}
+		// 浪潮
+		else if (SubjectTypeEnum.TYPE_LANG_CHAO.getCode().equals(subType)) {
+			return this.settleByLangchao(input, wmScorePackage, taxCode, enterpriseName, operator);
+		}
 		// 税邦云
 		else {
 			log.info("税邦云结算开始-获取会员所属企业的统一社会信用代码:{} ", taxCode);
@@ -440,7 +448,193 @@ public class WmPayOffServiceImpl extends ServiceImpl<WmPayOffMapper, WmPayOff> i
 	}
 
 	/**
-	 * 阿拉丁结算操作
+	 * 浪潮结算操作
+	 *
+	 * @param input          结算数据
+	 * @param wmScorePackage 积分包
+	 * @param taxCode        税号
+	 * @param enterpriseName 企业名称
+	 * @param operator       操作员
+	 * @return 结果
+	 */
+	private R<?> settleByLangchao(WmScorePackageSettleInput input,
+								 WmScorePackage wmScorePackage,
+								 String taxCode,
+								 String enterpriseName,
+								 HnqzUser operator) {
+
+		List<WmScorePackageSettleNote> notes = input.getNotes();
+		StringBuilder noticeInfo = new StringBuilder();
+
+		// WmScorePackageSettleNote
+		for (WmScorePackageSettleNote note : notes) {
+			note.setInvoiceType(input.getInvoiceCategory());
+			note.setCategoryName(StrUtil.isNotBlank(input.getCategoryName()) ? input.getCategoryName() : note.getCategoryName());
+			note.setSubToGigTime(LocalDateTime.now());
+		}
+		noteService.updateBatchById(notes);
+
+
+		for (WmScorePackageSettleNote note : notes) {
+			SysUser sysUser = sysUserMapper.selectById(note.getUserId());
+
+			SysUserSub userSub = sysUserSubMapper.selectOne(Wrappers.<SysUserSub>lambdaQuery()
+					.eq(SysUserSub::getUserId, sysUser.getUserId())
+					.eq(SysUserSub::getSubjectLocation, input.getSubjectLocation())
+					.eq(SysUserSub::getDeptId, operator.getDeptId())
+			);
+
+			if (userSub == null) {
+				log.info("结算对象-" + sysUser.getRealname() + ":认证信息不存在,不能结算");
+				return R.failed("结算对象-" + sysUser.getRealname() + ":认证信息不存在,不能结算");
+			}
+
+			if (!Objects.equals(userSub.getCertStatus(), DingEnum.CER_STATUS_1.getType())) {
+				return R.failed(sysUser.getRealname() + "人员未认证或未绑卡,不能结算");
+			}
+
+			if (Boolean.TRUE.equals(redisTemplate.hasKey(CacheConstants.SETTLE_PACKAGE_KEY + note.getId()))) {
+				return R.failed("结算对象-" + sysUser.getRealname() + ":正在结算,请勿重复结算");
+			}
+
+			if (DingEnum.NOTE_STATUS_SUCCESS.getType().equals(note.getSettleNoteStatus())) {
+				log.info("结算对象-" + sysUser.getRealname() + ":已结算,请勿重复结算");
+				return R.failed("结算对象-" + sysUser.getRealname() + ":已结算,请勿重复结算");
+			}
+			if (DingEnum.NOTE_STATUS_SUBMIT.getType().equals(note.getSettleNoteStatus())) {
+				log.info("结算对象-" + sysUser.getRealname() + ":已提交,请等待耐心结算结果");
+				return R.failed("结算对象-" + sysUser.getRealname() + ":已提交,请等待耐心结算结果");
+			}
+		}
+
+		for (WmScorePackageSettleNote note : notes) {
+			// 加锁
+			redisTemplate.opsForValue().set(CacheConstants.SETTLE_PACKAGE_KEY + note.getId(),
+					note.getId(), CacheConstants.SETTLE_TIME, TimeUnit.DAYS);
+
+			SysUser sysUser = sysUserMapper.selectById(note.getUserId());
+
+			try {
+
+				// 获取请求token
+				String url = String.format(GIG_TOKEN_URL, upmsConfig.getGigServiceUrl());
+				log.info("远端请求gig-token:{}", url);
+				ResponseEntity<String> tokenResult = new RestTemplate().getForEntity(url, String.class,
+						String.valueOf(operator.getDeptId()), "settle", String.valueOf(operator.getId()));
+				log.warn("获取结算token:{}", tokenResult.getBody());
+				if (!JSONUtil.isJson(tokenResult.getBody())) {
+					return R.failed("获取结算token失败");
+				}
+
+				JSONObject jsonObject = JSONUtil.parseObj(tokenResult.getBody());
+
+				if (jsonObject.getInt("code") != 0 || StrUtil.isBlank(jsonObject.getStr("data"))) {
+					return R.failed("获取结算token失败");
+				}
+
+				String token = jsonObject.getStr("data");
+
+				// 间隔100毫秒
+				Thread.sleep(100);
+
+				// 封装结算参数
+				Map<String, Object> params = new HashMap<>();
+				params.put("token", token);
+				params.put("tenantId", operator.getDeptId());
+				params.put("operatorId", operator.getId());
+				params.put("amount", String.valueOf(note.getSettleAmount().doubleValue()));
+				params.put("username", sysUser.getUsername());
+				params.put("idCard", sysUser.getIdCardNumber());
+				params.put("realName", sysUser.getRealname());
+				params.put("bankCard", sysUser.getBankCardNumber());
+				params.put("endType", "CSO");
+				params.put("enterpriseCode", taxCode);
+				params.put("enterpriseName", enterpriseName);
+				params.put("idCardType","ID_CARD");
+				params.put("subjectType", "LANG_CHAO");
+				params.put("channel", "DEFAULT");
+				params.put("subjectLocation", input.getSubjectLocation().getType());
+				params.put("taskDescription", "根据要求,执行、并完成学术推广活动,并以在线平台工具采集、记录活动内容");
+				params.put("taskName", wmScorePackage.getScorePackageName() + "_" + System.currentTimeMillis());
+
+				if (SubjectLocation.JIN_YUAN.equals(input.getSubjectLocation())) {
+					params.put("taxMode", "GENERAL");
+					params.put("transactionModel", "SUPERVISE");
+				}
+				// 海南飞亿 和 河南薪泰梓
+				else {
+					params.put("taxMode", "SPECIAL");
+					params.put("transactionModel", "CHANNEL");
+				}
+
+				// 发起结算
+				String url1 = String.format(GIG_SETTLE_URL, upmsConfig.getGigServiceUrl());
+				log.info("远端请求gig-settle:{}", url);
+				HttpHeaders headers = new HttpHeaders();
+				headers.setContentType(MediaType.APPLICATION_JSON);
+				log.info("浪潮结算req: {}", params);
+				HttpEntity<String> result = new RestTemplate().exchange(url1, HttpMethod.POST, new HttpEntity<>(params, headers), String.class);
+				log.info("浪潮结算resp:{}", result.getBody());
+				if (!JSONUtil.isJson(result.getBody())) {
+					return R.failed("结算失败");
+				}
+
+				JSONObject settleObj = JSONUtil.parseObj(result.getBody());
+
+
+				if (Objects.equals(settleObj.getInt("code"), CommonConstants.SUCCESS)) {
+					JSONObject dataJsonObj = settleObj.getJSONObject("data");
+					log.info("浪潮结算提交成功: {}", settleObj.getStr("data"));
+					//streamId 获取不到
+					if (dataJsonObj == null) {
+						log.warn("浪潮结算提交成功 data 获取不到: {}", note.getSettleNo());
+						noticeInfo.append(sysUser.getRealname()).append(":提交结算成功,业务流水号获取不到,请联系管理员;");
+					}
+					if (!StrUtil.equals("200", dataJsonObj.getStr("code"))) {
+						log.info("浪潮提交成功 code 状态异常");
+						noticeInfo.append(sysUser.getRealname()).append(":提交结算成功,业务流水号获取不到,请联系管理员;");
+					}
+					note.setUpdateTime(LocalDateTime.now());
+					note.setSettleNoteStatus(DingEnum.NOTE_STATUS_SUBMIT.getType());
+					// 新增字段streamId
+					note.setStreamId(dataJsonObj.getStr("requestId"));
+					noticeInfo.append(sysUser.getRealname()).append(":提交结算成功;");
+				} else {
+					log.warn("浪潮结算失败: {}", note.getSettleNo());
+					note.setUpdateTime(LocalDateTime.now());
+					note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+					noticeInfo.append(sysUser.getRealname()).append(":结算提交失败-").append(settleObj.getStr("msg")).append(";");
+
+					log.info("认证状态异常,结算解锁settleNoteId:{}", note.getId());
+					redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + note.getId());
+
+				}
+			} catch (Exception e) {
+				log.error("", e);
+				log.warn("浪潮结算提交失败: {}", note.getSettleNo());
+				note.setUpdateTime(LocalDateTime.now());
+				note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+				noticeInfo.append(sysUser.getRealname()).append(":结算提交失败;");
+
+				log.info("认证状态异常,结算解锁settleNoteId:{}", note.getId());
+				redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + note.getId());
+			}
+		}
+
+		noteService.updateBatchById(notes);
+
+		// 更新结算结果
+		SettleNoteStatusOutput output = noteService.selectSettleNoteStatus(input.getId());
+		WmScorePackage updateEntity = new WmScorePackage();
+		updateEntity.setId(input.getId());
+		updateEntity.setSettleStatus(output.toSettleStatus());
+		wmScorePackageService.updateById(updateEntity);
+
+		return R.ok(null, noticeInfo.toString());
+	}
+
+	/**
+	 * 正启之星结算操作
 	 *
 	 * @param input          结算数据
 	 * @param wmScorePackage 积分包
@@ -714,7 +908,7 @@ public class WmPayOffServiceImpl extends ServiceImpl<WmPayOffMapper, WmPayOff> i
 				params.put("amount", String.valueOf(note.getSettleAmount().doubleValue()));
 				params.put("taskStartTime", wmScorePackage.getCreateTime().toLocalDate());
 				params.put("taskEndTime", wmScorePackage.getUpdateTime().toLocalDate());
-				params.put("taskLocation", "要易云");
+				params.put("taskLocation", "全国");
 				params.put("username", sysUser.getUsername());
 				params.put("idCard", sysUser.getIdCardNumber());
 				params.put("realName", sysUser.getRealname());

+ 349 - 17
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmScorePackageSettleNoteServiceImpl.java

@@ -544,6 +544,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			case REN_LI_JIA:
 			case OLADING:
 			case ZHENG_QI_ZHI_XING:
+			case LANG_CHAO:
 				if (!Objects.equals(userSub.getCertStatus(), DingEnum.CER_STATUS_1.getType())) {
 					return R.failed(sysUser.getRealname() + "未认证,不能发起结算");
 				}
@@ -583,6 +584,12 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			String taxCode = sysDept.getTaxCode();
 			return settleBySinbaad(note, wmScorePackage, sysUser, taxCode);
 		}
+		// 浪潮
+		else if (SubjectTypeEnum.TYPE_LANG_CHAO.getCode().equals(subType)) {
+			String taxCode = sysDept.getTaxCode();
+			String enterpriseName = sysDept.getName();
+			return this.settleByLangchao(note, wmScorePackage, sysUser, taxCode, enterpriseName);
+		}
 		// 税邦云
 		else {
 			String taxCode = sysDept.getTaxCode();
@@ -618,6 +625,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 		String[] ids = input.getIdStr().split(",");
 		List<WmScorePackageSettleNote> noteList = new ArrayList<>(ids.length);
 		List<WmScorePackageSettleNote> oladingNoteList = new ArrayList<>(ids.length);
+		List<WmScorePackageSettleNote> langchaoNoteList = new ArrayList<>(ids.length);
 		for (int i = 0; i < ids.length; i++) {
 			String id = ids[i];
 			WmScorePackageSettleNote note = this.baseMapper.selectById(id);
@@ -667,6 +675,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 				case REN_LI_JIA:
 				case OLADING:
 				case ZHENG_QI_ZHI_XING:
+				case LANG_CHAO:
 					if (!Objects.equals(userSub.getCertStatus(), DingEnum.CER_STATUS_1.getType())) {
 						return R.failed(sysUser.getRealname() + "未认证,不能发起结算");
 					}
@@ -699,6 +708,10 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			else if (SubjectTypeEnum.TYPE_OLADING.getCode().equals(subType) || SubjectTypeEnum.TYPE_ZHENG_QI_ZHI_XING.getCode().equals(subType)) {
 				oladingNoteList.add(note);
 			}
+			// 浪潮
+			else if (SubjectTypeEnum.TYPE_LANG_CHAO.getCode().equals(subType)) {
+				langchaoNoteList.add(note);
+			}
 			// 税邦云
 			else {
 				noteList.add(note);
@@ -707,6 +720,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 
 		// 税邦云结算
 		String taxCode = sysDept.getTaxCode();
+		String enterpriseName = sysDept.getName();
 		if (CollectionUtils.isNotEmpty(noteList)) {
 			if (StringUtils.isNotEmpty(taxCode)) {
 				log.info("税邦云结算开始-获取会员所属企业的统一社会信用代码:{} ", taxCode);
@@ -743,6 +757,11 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			// return settleByTaxHelper();
 		}
 
+		// 浪潮结算
+		if (CollectionUtils.isNotEmpty(langchaoNoteList)) {
+			return this.batchSettleByLangchao(langchaoNoteList, taxCode, enterpriseName);
+		}
+
 		return R.ok();
 	}
 
@@ -752,13 +771,14 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 	}
 
 	/**
-	 * 政企之星结算
+	 * 浪潮结算
 	 *
 	 * @param noteList 结算记录
 	 * @param taxCode  企业三合一码
+	 * @param enterpriseName  企业名称
 	 * @return 结果
 	 */
-	private R batchSettleBySinbaad(List<WmScorePackageSettleNote> noteList, String taxCode) {
+	private R batchSettleByLangchao(List<WmScorePackageSettleNote> noteList, String taxCode, String enterpriseName) {
 
 		// 加锁
 		List<Integer> noteIdList = noteList.stream().filter(note ->
@@ -787,26 +807,197 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 		List<Map<String, Object>> settleParamsMapper = new ArrayList<>();
 		Map<String, Map<String, Object>> detailMap = new HashMap<>();
 		noteList.forEach(note -> {
-			WmScorePackage wmScorePackage = wmScorePackageMapper.selectById(note.getPackageId());
 			// 封装结算参数
 			Map<String, Object> params;
 			if (detailMap.containsKey(note.getIdCardNumber())) {
 				params = detailMap.get(note.getIdCardNumber());
 				params.put("amount", String.valueOf(new BigDecimal((String) params.get("amount")).add(note.getSettleAmount()).doubleValue()));
 
+				Set<Integer> ids = (Set<Integer>) params.get("noteIds");
+				ids.add(note.getId());
+				params.put("noteIds", ids);
+			} else {
+				SysUser sysUser = sysUserService.getById(note.getUserId());
+				params = new HashMap<>(19);
+				params.put("tenantId", operator.getDeptId());
+				params.put("operatorId", operator.getId());
+				params.put("amount", String.valueOf(note.getSettleAmount().doubleValue()));
+				params.put("username", sysUser.getUsername());
+				params.put("idCard", sysUser.getIdCardNumber());
+				params.put("realName", sysUser.getRealname());
+				params.put("bankCard", sysUser.getBankCardNumber());
+				params.put("endType", "CSO");
+				params.put("enterpriseCode", taxCode);
+				params.put("enterpriseName", enterpriseName);
+				params.put("idCardType","ID_CARD");
+				params.put("subjectType", "LANG_CHAO");
+				params.put("channel", "DEFAULT");
+				params.put("subjectLocation", note.getSubjectLocation());
+				params.put("taskDescription", "根据要求,执行、并完成学术推广活动,并以在线平台工具采集、记录活动内容");
+				params.put("taskName", String.format("%s(%s)_%s", sysUser.getRealname(), sysUser.getUsername(), System.currentTimeMillis()));
 
-				LocalDate startTime = (LocalDate) params.get("taskStartTime");
-				LocalDate endTime = (LocalDate) params.get("taskEndTime");
-				LocalDate noteCreateTime = wmScorePackage.getCreateTime().toLocalDate();
-				LocalDate noteUpdateTime = wmScorePackage.getUpdateTime().toLocalDate();
+				if (SubjectLocation.JIN_YUAN.equals(note.getSubjectLocation())) {
+					params.put("taxMode", "GENERAL");
+					params.put("transactionModel", "SUPERVISE");
+				}
+				// 海南飞亿 和 河南薪泰梓
+				else {
+					params.put("taxMode", "SPECIAL");
+					params.put("transactionModel", "CHANNEL");
+				}
 
-				if (noteCreateTime.isBefore(startTime)) {
-					params.put("taskStartTime", wmScorePackage.getCreateTime().toLocalDate());
+				Set<Integer> noteIds = new HashSet<>();
+				noteIds.add(note.getId());
+				params.put("noteIds", noteIds);
+				detailMap.put(note.getIdCardNumber(), params);
+			}
+		});
+
+		detailMap.forEach((key, value) -> settleParamsMapper.add(value));
+
+
+		// 开始结算
+		for (Map<String, Object> params : settleParamsMapper) {
+
+			Set<Integer> noteIds = (Set<Integer>) params.get("noteIds");
+			try {
+				// 获取请求token
+				ResponseEntity<String> tokenResult = new RestTemplate().getForEntity(gigTokenUrl, String.class,
+						String.valueOf(operator.getDeptId()), "settle", String.valueOf(operator.getId()));
+				log.warn("获取结算token:{}", tokenResult.getBody());
+				if (!JSONUtil.isJson(tokenResult.getBody())) {
+					return R.failed("获取结算token失败");
 				}
-				if (noteUpdateTime.isAfter(endTime)) {
-					params.put("taskEndTime", wmScorePackage.getUpdateTime().toLocalDate());
+
+				JSONObject jsonObject = JSONUtil.parseObj(tokenResult.getBody());
+
+				if (jsonObject.getInt("code") != 0 || StrUtil.isBlank(jsonObject.getStr("data"))) {
+					return R.failed("获取结算token失败");
+				}
+
+				String token = jsonObject.getStr("data");
+
+				// 间隔100毫秒
+				Thread.sleep(100);
+
+				params.put("token", token);
+
+				// 发起结算
+				HttpHeaders headers = new HttpHeaders();
+				headers.setContentType(MediaType.APPLICATION_JSON);
+				log.info("浪潮结算req: {}", params);
+				HttpEntity<String> result = new RestTemplate().exchange(gigSettleUrl, HttpMethod.POST, new HttpEntity<>(params, headers), String.class);
+				log.info("浪潮结算resp: {}", result.getBody());
+				if (!JSONUtil.isJson(result.getBody())) {
+					return R.failed("结算失败");
+				}
+				JSONObject settelObj = JSONUtil.parseObj(result.getBody());
+
+				if (Objects.equals(settelObj.getInt("code"), CommonConstants.SUCCESS)) {
+					JSONObject dataJsonObj = settelObj.getJSONObject("data");
+
+					noteIds.forEach(id -> {
+						log.info("浪潮结算结算提交成功");
+						// data获取不到
+						if (dataJsonObj == null) {
+							log.info("浪潮提交成功 data 获取不到");
+							return;
+						}
+						if (!StrUtil.equals("200", dataJsonObj.getStr("code"))) {
+							log.info("浪潮提交成功 code 状态异常");
+							return;
+						}
+						WmScorePackageSettleNote note = new WmScorePackageSettleNote();
+						LocalDateTime now = LocalDateTime.now();
+						note.setId(id);
+						note.setUpdateTime(LocalDateTime.now());
+						note.setSubToGigTime(now);
+						note.setSettleNoteStatus(DingEnum.NOTE_STATUS_SUBMIT.getType());
+						// 新增字段streamId
+						note.setStreamId(dataJsonObj.getStr("requestId"));
+						this.baseMapper.updateById(note);
+					});
+
+				} else {
+					noteIds.forEach(id -> {
+						WmScorePackageSettleNote note = new WmScorePackageSettleNote();
+						note.setId(id);
+						log.info("浪潮结算提交失败: {}", note.getSettleNo());
+						LocalDateTime now = LocalDateTime.now();
+						note.setUpdateTime(LocalDateTime.now());
+						note.setSubToGigTime(now);
+						note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+						this.baseMapper.updateById(note);
+						log.info("认证状态异常,结算解锁settleNoteId:{}", note.getId());
+						redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + ":note_id_" + note.getId());
+					});
+
+					return R.ok("结算失败");
 				}
 
+			} catch (Exception e) {
+				log.error("", e);
+				noteIds.forEach(id -> {
+					WmScorePackageSettleNote note = new WmScorePackageSettleNote();
+					note.setId(id);
+					log.info("浪潮结算提交失败: {}", note.getSettleNo());
+					LocalDateTime now = LocalDateTime.now();
+					note.setUpdateTime(LocalDateTime.now());
+					note.setSubToGigTime(now);
+					note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+					this.baseMapper.updateById(note);
+					log.info("认证状态异常,结算解锁settleNoteId:{}", note.getId());
+					redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + ":note_id_" + note.getId());
+				});
+				return R.ok("结算失败");
+			}
+		}
+
+		return R.ok("提交结算成功");
+	}
+
+	/**
+	 * 政企之星结算
+	 *
+	 * @param noteList 结算记录
+	 * @param taxCode  企业三合一码
+	 * @return 结果
+	 */
+	private R batchSettleBySinbaad(List<WmScorePackageSettleNote> noteList, String taxCode) {
+
+		// 加锁
+		List<Integer> noteIdList = noteList.stream().filter(note ->
+						redisTemplate.opsForValue().setIfAbsent(
+								CacheConstants.SETTLE_PACKAGE_KEY + ":note_id_" + note.getId(),
+								noteList, CacheConstants.SETTLE_TIME, TimeUnit.DAYS))
+				.mapToInt(WmScorePackageSettleNote::getId).boxed().collect(Collectors.toList());
+
+		// 加锁记录数不等于提交记录数,说明存在在途交易
+		if (CollectionUtils.isEmpty(noteIdList)) {
+			log.error("当前用户存在其他结算请求");
+			return R.failed("当前用户存在其他结算请求");
+		} else {
+			if (!Objects.equals(noteList.size(), noteIdList.size())) {
+				// 删除锁
+				noteIdList.forEach(id -> redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + ":note_id_" + id));
+				log.error("当前用户存在其他结算请求");
+				return R.failed("当前用户存在其他结算请求");
+			}
+		}
+
+		HnqzUser operator = SecurityUtils.getUser();
+		String gigTokenUrl = upmsConfig.getGigServiceUrl() + "/gig/operation/token?tenantId={tenantId}&action={action}&userId={userId}";
+		String gigSettleUrl = upmsConfig.getGigServiceUrl() + "/gig/operation/settlement";
+
+		List<Map<String, Object>> settleParamsMapper = new ArrayList<>();
+		Map<String, Map<String, Object>> detailMap = new HashMap<>();
+		noteList.forEach(note -> {
+			// 封装结算参数
+			Map<String, Object> params;
+			if (detailMap.containsKey(note.getIdCardNumber())) {
+				params = detailMap.get(note.getIdCardNumber());
+				params.put("amount", String.valueOf(new BigDecimal((String) params.get("amount")).add(note.getSettleAmount()).doubleValue()));
+
 				Set<Integer> ids = (Set<Integer>) params.get("noteIds");
 				ids.add(note.getId());
 				params.put("noteIds", ids);
@@ -895,8 +1086,10 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 							return;
 						}
 						WmScorePackageSettleNote note = new WmScorePackageSettleNote();
+						LocalDateTime now = LocalDateTime.now();
 						note.setId(id);
 						note.setUpdateTime(LocalDateTime.now());
+						note.setSubToGigTime(now);
 						note.setSettleNoteStatus(DingEnum.NOTE_STATUS_SUBMIT.getType());
 						// 新增字段streamId
 						note.setStreamId(dataJsonObj.getStr("requestId"));
@@ -908,7 +1101,9 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 						WmScorePackageSettleNote note = new WmScorePackageSettleNote();
 						note.setId(id);
 						log.info("政企之星结算提交失败: {}", note.getSettleNo());
+						LocalDateTime now = LocalDateTime.now();
 						note.setUpdateTime(LocalDateTime.now());
+						note.setSubToGigTime(now);
 						note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
 						this.baseMapper.updateById(note);
 						log.info("认证状态异常,结算解锁settleNoteId:{}", note.getId());
@@ -924,7 +1119,9 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 					WmScorePackageSettleNote note = new WmScorePackageSettleNote();
 					note.setId(id);
 					log.info("政企之星结算提交失败: {}", note.getSettleNo());
+					LocalDateTime now = LocalDateTime.now();
 					note.setUpdateTime(LocalDateTime.now());
+					note.setSubToGigTime(now);
 					note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
 					this.baseMapper.updateById(note);
 					log.info("认证状态异常,结算解锁settleNoteId:{}", note.getId());
@@ -1006,7 +1203,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 				params.put("amount", String.valueOf(note.getSettleAmount().doubleValue()));
 				params.put("taskStartTime", wmScorePackage.getCreateTime().toLocalDate());
 				params.put("taskEndTime", wmScorePackage.getUpdateTime().toLocalDate());
-				params.put("taskLocation", "要易云");
+				params.put("taskLocation", "全国");
 				params.put("username", sysUser.getUsername());
 				params.put("idCard", note.getIdCardNumber());
 				params.put("realName", sysUser.getRealname());
@@ -1228,6 +1425,139 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 		}
 	}
 
+	/**
+	 * 浪潮结算
+	 *
+	 * @param note
+	 * @param wmScorePackage
+	 * @param sysUser
+	 * @param taxCode
+	 * @return
+	 */
+	private R settleByLangchao(WmScorePackageSettleNote note,
+							   WmScorePackage wmScorePackage,
+							   SysUser sysUser,
+							   String taxCode,
+							   String enterpriseName) {
+
+		/**
+		 * 加锁
+		 */
+		redisTemplate.opsForValue().set(CacheConstants.SETTLE_PACKAGE_KEY + note.getId(),
+				note.getId(), CacheConstants.SETTLE_TIME, TimeUnit.DAYS);
+
+		/**
+		 * 开始结算
+		 */
+
+		HnqzUser operator = SecurityUtils.getUser();
+		String gigTokenUrl = upmsConfig.getGigServiceUrl() + "/gig/operation/token?tenantId={tenantId}&action={action}&userId={userId}";
+		String gigSettleUrl = upmsConfig.getGigServiceUrl() + "/gig/operation/settlement";
+
+		try {
+			// 获取请求token
+			ResponseEntity<String> tokenResult = new RestTemplate().getForEntity(gigTokenUrl, String.class,
+					String.valueOf(operator.getDeptId()), "settle", String.valueOf(operator.getId()));
+			log.warn("获取结算token:{}", tokenResult.getBody());
+			if (!JSONUtil.isJson(tokenResult.getBody())) {
+				return R.failed("获取结算token失败");
+			}
+
+			JSONObject jsonObject = JSONUtil.parseObj(tokenResult.getBody());
+
+			if (jsonObject.getInt("code") != 0 || StrUtil.isBlank(jsonObject.getStr("data"))) {
+				return R.failed("获取结算token失败");
+			}
+
+			String token = jsonObject.getStr("data");
+
+			// 间隔100毫秒
+			Thread.sleep(100);
+
+
+			// 封装结算参数
+
+			// 封装结算参数
+			Map<String, Object> params = new HashMap<>();
+			params.put("token", token);
+			params.put("tenantId", operator.getDeptId());
+			params.put("operatorId", operator.getId());
+			params.put("amount", String.valueOf(note.getSettleAmount().doubleValue()));
+			params.put("username", sysUser.getUsername());
+			params.put("idCard", sysUser.getIdCardNumber());
+			params.put("realName", sysUser.getRealname());
+			params.put("bankCard", sysUser.getBankCardNumber());
+			params.put("endType", "CSO");
+			params.put("enterpriseCode", taxCode);
+			params.put("enterpriseName", enterpriseName);
+			params.put("idCardType","ID_CARD");
+			params.put("subjectType", "LANG_CHAO");
+			params.put("channel", "DEFAULT");
+			params.put("subjectLocation", note.getSubjectLocation());
+			params.put("taskDescription", "根据要求,执行、并完成学术推广活动,并以在线平台工具采集、记录活动内容");
+			params.put("taskName", wmScorePackage.getScorePackageName() + "_" + System.currentTimeMillis());
+
+			if (SubjectLocation.JIN_YUAN.equals(note.getSubjectLocation())) {
+				params.put("taxMode", "GENERAL");
+				params.put("transactionModel", "SUPERVISE");
+			}
+			// 海南飞亿 和 河南薪泰梓
+			else {
+				params.put("taxMode", "SPECIAL");
+				params.put("transactionModel", "CHANNEL");
+			}
+
+			// 发起结算
+			HttpHeaders headers = new HttpHeaders();
+			headers.setContentType(MediaType.APPLICATION_JSON);
+			log.info("浪潮结算req: {}", params);
+			HttpEntity<String> result = new RestTemplate().exchange(gigSettleUrl, HttpMethod.POST, new HttpEntity<>(params, headers), String.class);
+			log.info("浪潮结算resp: {}", result.getBody());
+			if (!JSONUtil.isJson(result.getBody())) {
+				return R.failed("结算失败");
+			}
+			JSONObject settelObj = JSONUtil.parseObj(result.getBody());
+
+
+			if (Objects.equals(settelObj.getInt("code"), CommonConstants.SUCCESS)) {
+				JSONObject dataJsonObj = settelObj.getJSONObject("data");
+
+				log.info("浪潮结算提交成功: {}", note.getSettleNo());
+				//data 获取不到
+				if (dataJsonObj == null) {
+					log.warn("浪潮结算提交成功 data 获取不到: {}", note.getSettleNo());
+				}
+				if (!StrUtil.equals("200", dataJsonObj.getStr("code"))) {
+					log.info("浪潮提交成功 code 状态异常");
+				}
+				note.setUpdateTime(LocalDateTime.now());
+				note.setSettleNoteStatus(DingEnum.NOTE_STATUS_SUBMIT.getType());
+				// 新增字段streamId
+				note.setStreamId(dataJsonObj.getStr("requestId"));
+			} else {
+				log.warn("浪潮结算提交失败: {}", note.getSettleNo());
+				note.setUpdateTime(LocalDateTime.now());
+				note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+
+				log.info("认证状态异常,结算解锁settleNoteId:{}", note.getId());
+				redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + note.getId());
+
+			}
+		} catch (Exception e) {
+			log.error("", e);
+			log.warn("浪潮结算提交失败: {}", note.getSettleNo());
+			note.setUpdateTime(LocalDateTime.now());
+			note.setSettleNoteStatus(DingEnum.NOTE_STATUS_FAIL.getType());
+
+			log.info("认证状态异常,结算解锁settleNoteId:{}", note.getId());
+			redisTemplate.delete(CacheConstants.SETTLE_PACKAGE_KEY + note.getId());
+		}
+
+		this.baseMapper.updateById(note);
+
+		return R.ok();
+	}
+
 	private R settleBySinbaad(WmScorePackageSettleNote note,
 							  WmScorePackage wmScorePackage,
 							  SysUser sysUser,
@@ -1309,15 +1639,17 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 
 
 			if (Objects.equals(settelObj.getInt("code"), CommonConstants.SUCCESS)) {
+				JSONObject dataJsonObj = settelObj.getJSONObject("data");
+
 				log.info("政企之星结算提交成功: {}", note.getSettleNo());
-				//streamId 获取不到
-				if (StringUtils.isEmpty(settelObj.getStr("data"))) {
-					log.warn("政企之星结算提交成功 requestId 获取不到: {}", note.getSettleNo());
+				//data 获取不到
+				if (dataJsonObj == null) {
+					log.warn("政企之星结算提交成功 data 获取不到: {}", note.getSettleNo());
 				}
 				note.setUpdateTime(LocalDateTime.now());
 				note.setSettleNoteStatus(DingEnum.NOTE_STATUS_SUBMIT.getType());
 				// 新增字段streamId
-				note.setStreamId(settelObj.getStr("data"));
+				note.setStreamId(dataJsonObj.getStr("requestId"));
 			} else {
 				log.warn("政企之星结算提交失败: {}", note.getSettleNo());
 				note.setUpdateTime(LocalDateTime.now());
@@ -1392,7 +1724,7 @@ public class WmScorePackageSettleNoteServiceImpl extends ServiceImpl<WmScorePack
 			params.put("amount", String.valueOf(note.getSettleAmount().doubleValue()));
 			params.put("taskStartTime", wmScorePackage.getCreateTime().toLocalDate());
 			params.put("taskEndTime", wmScorePackage.getUpdateTime().toLocalDate());
-			params.put("taskLocation", "要易云");
+			params.put("taskLocation", "全国");
 			params.put("username", sysUser.getUsername());
 			params.put("idCard", sysUser.getIdCardNumber());
 			params.put("realName", sysUser.getRealname());

+ 179 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/Md5Utils.java

@@ -0,0 +1,179 @@
+package com.qunzhixinxi.hnqz.admin.util;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.nio.MappedByteBuffer;
+import java.nio.channels.FileChannel;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+@Slf4j
+public class Md5Utils {
+
+    public static String MD5(String s) {
+        try {
+            byte[] btInput = s.getBytes("utf-8");
+            // 获得MD5摘要算法的 MessageDigest 对象
+            MessageDigest mdInst = MessageDigest.getInstance("MD5");
+            // 使用指定的字节更新摘要
+            mdInst.update(btInput);
+            // 获得密文
+            byte[] md = mdInst.digest();
+            // 把密文转换成十六进制的字符串形式
+            return byteArrayToHex(md);
+        } catch (Exception e) {
+            //e.printStackTrace();
+            log.error("秘闻转换异常",e);
+            return null;
+        }
+    }
+
+    public static String getMd5ByFileProperty(String fileProperty) {
+        try {
+            // 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”)
+            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
+            // 输入的字符串转换成字节数组
+            byte[] inputByteArray = fileProperty.getBytes();
+            // inputByteArray是输入字符串转换得到的字节数组
+            messageDigest.update(inputByteArray);
+            // 转换并返回结果,也是字节数组,包含16个元素
+            byte[] resultByteArray = messageDigest.digest();
+            // 字符数组转换成字符串返回
+            return byteArrayToHex(resultByteArray);
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public static String byteArrayToHex(byte[] byteArray) {
+        // 首先初始化一个字符数组,用来存放每个16进制字符
+        char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+                'A', 'B', 'C', 'D', 'E', 'F' };
+        // new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方))
+        char[] resultCharArray = new char[byteArray.length * 2];
+        // 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去
+        int index = 0;
+        for (byte b : byteArray) {
+            resultCharArray[index++] = hexDigits[b >>> 4 & 0xf];
+            resultCharArray[index++] = hexDigits[b & 0xf];
+        }
+        // 字符数组组合成字符串返回
+        return new String(resultCharArray);
+
+    }
+
+    public static String getMd5ByFile(File file) {
+        String value = null;
+        FileInputStream in = null;
+        FileChannel ch = null;
+        try {
+            in = new FileInputStream(file);
+            ch = in.getChannel();
+            MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
+            MessageDigest md5 = MessageDigest.getInstance("MD5");
+            md5.update(byteBuffer);
+            BigInteger bi = new BigInteger(1, md5.digest());
+            value = bi.toString(16);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (null != ch) {
+                try {
+                    ch.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (null != in) {
+                try {
+                    in.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return value.toUpperCase();
+    }
+
+    /**
+     * MD5校验
+     * @param request
+     * @param key
+     * @param strMd5
+     * @return
+     */
+    public static boolean check(List<String> listSort, HashMap<String, String> hm, String key, String strMd5, HashMap<String, String> remove, StringBuffer log) {
+        String str = "";
+        for (String mkey : listSort) {
+            if(null != remove.get(mkey) && !"".equals(remove.get(mkey))) continue;
+            if (null == hm.get(mkey)) continue;
+            str+=hm.get(mkey);
+        }
+        str+=key;
+        String tempMd5 = MD5(str);
+
+        if (tempMd5.equals(strMd5.toUpperCase())) {
+            return true;
+        }
+
+        log.append("MD5(").append(str).append(") = ").append(tempMd5.toLowerCase()).append("\r\n");
+        return false;
+    }
+
+    public static String getSign(List<String> listSort, HashMap<String, String> hm, String key) {
+        Collections.sort(listSort, new Comparator<String>() {
+            public int compare(String arg0, String arg1) {
+                return arg0.compareTo(arg1);
+            }
+        });
+        String str = "";
+        for (String mkey : listSort) {
+            if (null == hm.get(mkey)) continue;
+            str+=hm.get(mkey);
+        }
+        str+=key;
+        String tempMd5 = MD5(str);
+
+        return tempMd5;
+    }
+    private static String byteArrayToHexString(byte b[]) {
+        StringBuffer resultSb = new StringBuffer();
+        for (int i = 0; i < b.length; i++)
+            resultSb.append(byteToHexString(b[i]));
+
+        return resultSb.toString();
+    }
+
+    private static String byteToHexString(byte b) {
+        int n = b;
+        if (n < 0)
+            n += 256;
+        int d1 = n / 16;
+        int d2 = n % 16;
+        return hexDigits[d1] + hexDigits[d2];
+    }
+    public static String MD5Encode(String origin, String charsetname) {
+        String resultString = null;
+        try {
+            resultString = new String(origin);
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            if (charsetname == null || "".equals(charsetname))
+                resultString = byteArrayToHexString(md.digest(resultString
+                        .getBytes()));
+            else
+                resultString = byteArrayToHexString(md.digest(resultString
+                        .getBytes(charsetname)));
+        } catch (Exception exception) {
+        }
+        return resultString;
+    }
+    private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
+            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
+}

+ 137 - 116
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/SysDeptMapper.xml

@@ -46,105 +46,102 @@
 		<result property="taxCode" column="tax_code"/>
 	</resultMap>
 
+	<resultMap id="sysEntRelMap" type="com.qunzhixinxi.hnqz.admin.api.vo.SysEnterpriseRelationVO">
+		<id property="relId" column="rel_id"/>
+		<result property="entId" column="ent_id"/>
+		<result property="entName" column="ent_name"/>
+		<result property="rootId" column="root_id"/>
+		<result property="rootName" column="root_name"/>
+		<result property="entType" column="ent_type"/>
+		<result property="productLine" column="product_line"/>
+		<result property="entLevel" column="ent_level"/>
+		<collection property="serviceCharges" ofType="com.qunzhixinxi.hnqz.admin.api.vo.SysEnterpriseServiceChargeVO"
+					select="com.qunzhixinxi.hnqz.admin.mapper.SysDeptSubMapper.listSysEnterpriseServiceCharge"
+					column="ent_id"/>
+	</resultMap>
+
 	<select id="selectDistinctDeptId" resultMap="sysDeptMap">
-		select
-		DISTINCT dept_id,
-		level
-		from
-		sys_dept
-		where
-		dept_id = #{query.deptId,jdbcType=INTEGER}
-		order by level
-		limit 1
+		SELECT DISTINCT dept_id,
+						level
+		FROM sys_dept
+		WHERE dept_id = #{query.deptId,jdbcType=INTEGER}
+		ORDER BY level
+		LIMIT 1
 	</select>
 
 	<select id="selectDeptList" resultMap="sysDeptMap">
-		select
-		dept_id,
-		sort,
-		name
-		from
-		sys_dept
+		SELECT dept_id,
+			   sort,
+			   name
+		FROM sys_dept
 	</select>
 
 	<select id="selectDeptByIds" resultMap="sysDeptMap">
-  		select
-  		*
-   		from
-   		sys_dept
-   		where
-   		dept_id = #{query.deptId,jdbcType=INTEGER}
+		SELECT *
+		FROM sys_dept
+		WHERE dept_id = #{query.deptId,jdbcType=INTEGER}
 	</select>
 
 	<select id="selectDeptByName" resultMap="sysDeptMap">
-  		select
-  		dept_id,name
-   		from
-   		sys_dept
-   		where
-   		dept_id = #{query.deptId,jdbcType=INTEGER}
+		SELECT dept_id,
+			   name
+		FROM sys_dept
+		WHERE dept_id = #{query.deptId,jdbcType=INTEGER}
 	</select>
 
 	<select id="selectDept" resultMap="sysDeptMap">
-  		select
-  		*
-   		from
-   		sys_dept
-   		where
-   		dept_id = #{deptId,jdbcType=INTEGER}
+		SELECT *
+		FROM sys_dept
+		WHERE dept_id = #{deptId,jdbcType=INTEGER}
 	</select>
 
 	<select id="selectListByDept" resultMap="sysDeptMap">
-		select
-		dept_id,
-		name
-		from
-		sys_dept
-		where del_flag = 0
+		SELECT dept_id,
+			   name
+		FROM sys_dept
+		WHERE del_flag = 0
 	</select>
 
 	<select id="selectDeptById" resultType="java.util.HashMap">
-  		SELECT
-		d.dept_id as deptId,d.name,d.level,
-		CASE WHEN a.zj_number IS NULL THEN e.entcode ELSE a.zj_number END entcode
-		FROM
-		sys_dept d
-		LEFT JOIN wm_da_agent a ON d.dept_id = a.dept_id
-		LEFT JOIN wm_da_drug_ent e ON d.dept_id = e.dept_id
-		WHERE
-		d.dept_id = #{query.deptId,jdbcType=INTEGER}
+		SELECT d.dept_id AS                                                      deptid,
+			   d.name,
+			   d.level,
+			   CASE WHEN a.zj_number IS NULL THEN e.entcode ELSE a.zj_number END entcode
+		FROM sys_dept d
+				 LEFT JOIN wm_da_agent a ON d.dept_id = a.dept_id
+				 LEFT JOIN wm_da_drug_ent e ON d.dept_id = e.dept_id
+		WHERE d.dept_id = #{query.deptId,jdbcType=INTEGER}
 	</select>
 
 	<select id="getAllParentDept" resultMap="sysDeptMap">
-		select DISTINCT
-		dept_id,
-		`name`,
-		`level`
-		from sys_dept
-		where dept_id IN
-		(select d.dept_id  from sys_dept d
-		where d.dept_id=#{query.deptId}
-		union
-		select r.up_id from sys_dept d
-		left join wm_relation r on d.dept_id=r.down_id
-		where d.dept_id=#{query.deptId}
-		union
-		select r2.up_id from sys_dept d
-		left join wm_relation r on d.dept_id=r.down_id
-		left join wm_relation r2 on r.up_id=r2.down_id
-		where d.dept_id=#{query.deptId}
-				)
-		and del_flag=0
-		AND dept_id NOT in(1)
+		SELECT DISTINCT dept_id,
+						`name`,
+						`level`
+		FROM sys_dept
+		WHERE dept_id IN
+			  (SELECT d.dept_id
+			   FROM sys_dept d
+			   WHERE d.dept_id = #{query.deptId}
+			   UNION
+			   SELECT r.up_id
+			   FROM sys_dept d
+						LEFT JOIN wm_relation r ON d.dept_id = r.down_id
+			   WHERE d.dept_id = #{query.deptId}
+			   UNION
+			   SELECT r2.up_id
+			   FROM sys_dept d
+						LEFT JOIN wm_relation r ON d.dept_id = r.down_id
+						LEFT JOIN wm_relation r2 ON r.up_id = r2.down_id
+			   WHERE d.dept_id = #{query.deptId}
+			  )
+		  AND del_flag = 0
+		  AND dept_id NOT IN (1)
 	</select>
 
 	<select id="selectByName" resultMap="sysDeptMap">
-		select
-		*
-		from
-		sys_dept
-		where
-		name = #{name,jdbcType=VARCHAR}
+		SELECT *
+		FROM sys_dept
+		WHERE name = #{name,jdbcType=VARCHAR}
 	</select>
 	<select id="selectEntCodeByLevelId" resultType="string">
 		<choose>
@@ -158,19 +155,19 @@
 		WHERE `id` = #{levelId}
 	</select>
 
-	<update id="updateByPrimaryKeySelective" parameterType="com.qunzhixinxi.hnqz.admin.api.entity.SysDept" >
+	<update id="updateByPrimaryKeySelective" parameterType="com.qunzhixinxi.hnqz.admin.api.entity.SysDept">
 		update sys_dept
-		<set >
-			<if test="delFlag != null" >
+		<set>
+			<if test="delFlag != null">
 				del_flag = #{delFlag,jdbcType=VARCHAR},
 			</if>
-			<if test="name != null" >
+			<if test="name != null">
 				name = #{name,jdbcType=VARCHAR},
 			</if>
-			<if test="subjectType != null" >
+			<if test="subjectType != null">
 				subject_type = #{subjectType,jdbcType=VARCHAR},
 			</if>
-			<if test="taxCode != null" >
+			<if test="taxCode != null">
 				tax_code = #{taxCode,jdbcType=VARCHAR},
 			</if>
 			<if test="deptPermissions != null and deptPermissions != ''">
@@ -181,52 +178,56 @@
 	</update>
 
 	<select id="getParentDept" resultType="map">
-		select DISTINCT
-		dept_id  deptId,
-		`name`
-		from sys_dept
-		where dept_id IN
-		(
-		select r.up_id from sys_dept d
-		left join wm_relation r on d.dept_id=r.down_id
-		where d.dept_id=#{query.deptId}
-		union
-		select r2.up_id from sys_dept d
-		left join wm_relation r on d.dept_id=r.down_id
-		left join wm_relation r2 on r.up_id=r2.down_id
-		where d.dept_id=#{query.deptId}
-				)
-		and del_flag=0
-		AND dept_id NOT in(1)
+		SELECT DISTINCT dept_id deptid,
+						`name`
+		FROM sys_dept
+		WHERE dept_id IN
+			  (
+				  SELECT r.up_id
+				  FROM sys_dept d
+						   LEFT JOIN wm_relation r ON d.dept_id = r.down_id
+				  WHERE d.dept_id = #{query.deptId}
+				  UNION
+				  SELECT r2.up_id
+				  FROM sys_dept d
+						   LEFT JOIN wm_relation r ON d.dept_id = r.down_id
+						   LEFT JOIN wm_relation r2 ON r.up_id = r2.down_id
+				  WHERE d.dept_id = #{query.deptId}
+			  )
+		  AND del_flag = 0
+		  AND dept_id NOT IN (1)
 	</select>
 
 	<select id="getChildDept" resultType="map">
-		select DISTINCT
-		dept_id  deptId,
-		`name`
-		from sys_dept
-		where dept_id IN
-		(
-		select r.down_id from sys_dept d
-		left join wm_relation r on d.dept_id=r.up_id
-		where d.dept_id=#{query.deptId}
-		union
-		select r2.down_id from sys_dept d
-		left join wm_relation r on d.dept_id=r.up_id
-		left join wm_relation r2 on r.down_id=r2.up_id
-		where d.dept_id=#{query.deptId}
-				)
-		and del_flag=0
-		AND dept_id NOT in(1)
+		SELECT DISTINCT dept_id deptid,
+						`name`
+		FROM sys_dept
+		WHERE dept_id IN
+			  (
+				  SELECT r.down_id
+				  FROM sys_dept d
+						   LEFT JOIN wm_relation r ON d.dept_id = r.up_id
+				  WHERE d.dept_id = #{query.deptId}
+				  UNION
+				  SELECT r2.down_id
+				  FROM sys_dept d
+						   LEFT JOIN wm_relation r ON d.dept_id = r.up_id
+						   LEFT JOIN wm_relation r2 ON r.down_id = r2.up_id
+				  WHERE d.dept_id = #{query.deptId}
+			  )
+		  AND del_flag = 0
+		  AND dept_id NOT IN (1)
 	</select>
 
 	<select id="getDeptConvertToName" resultType="map">
-		select  dept_id  deptId, `name` from sys_dept
+		SELECT dept_id deptid, `name`
+		FROM sys_dept
 	</select>
 
 	<!-- 查询所有dept -->
 	<select id="listAllDept" resultMap="sysDeptMap">
-		select * from sys_dept
+		SELECT *
+		FROM sys_dept
 	</select>
 
 	<!-- 根据id批量查询 -->
@@ -236,4 +237,24 @@
 			#{item}
 		</foreach>
 	</select>
+
+	<select id="pageEntRels" resultMap="sysEntRelMap">
+		SELECT el.rel_id,
+		d.dept_id AS `ent_id`,
+		d.name AS `ent_name`,
+		d1.dept_id AS `root_id`,
+		d1.name AS `root_name`,
+		el.e_type AS `ent_type`,
+		el.pro_line AS `product_line`,
+		el.e_level AS `ent_level`
+		FROM sys_dept d
+		LEFT JOIN sys_ent_rel el ON el.ent_id = d.dept_id
+		LEFT JOIN sys_dept d1 ON el.root_id = d1.dept_id
+		<where>
+			d.del_flag = 0
+			<if test="entName != null and entName != ''">
+				AND d.name like CONCAT('%', #{entName},'%')
+			</if>
+		</where>
+	</select>
 </mapper>

+ 15 - 0
hnqz-upms/hnqz-upms-biz/src/main/resources/mapper/SysDeptSubMapper.xml

@@ -15,6 +15,12 @@
 		<result property="enableFlag" column="enable_flag"/>
 	</resultMap>
 
+	<resultMap id="serviceChargeMap" type="com.qunzhixinxi.hnqz.admin.api.vo.SysEnterpriseServiceChargeVO">
+		<id property="entId" column="ent_id"/>
+		<result property="subjectLocation" column="app_id"/>
+		<result property="serviceCharge" column="app_secret"/>
+	</resultMap>
+
 	<select id="getSettleAmountMonitor" resultType="com.qunzhixinxi.hnqz.admin.entity.output.SettleAmountMonitorOutput">
 		SELECT
 		t.id_card_number,
@@ -76,4 +82,13 @@
 		GROUP BY t.id_card_number
 	</select>
 
+	<select id="listSysEnterpriseServiceCharge" resultMap="serviceChargeMap">
+		SELECT ds.dept_id AS `ent_id`,
+			   ds.subject_location ,
+			   ds.service_charge
+		FROM  sys_dept_sub ds
+		WHERE ds.dept_id = #{deptId}
+	</select>
+
+
 </mapper>

+ 49 - 0
hnqz-upms/hnqz-upms-biz/src/test/java/com/qunzhixinxi/hnqz/admin/ApiTest.java

@@ -0,0 +1,49 @@
+package com.qunzhixinxi.hnqz.admin;
+
+import cn.hutool.core.collection.CollUtil;
+import com.qunzhixinxi.hnqz.admin.entity.WmScorePackage;
+import com.qunzhixinxi.hnqz.admin.entity.WmScorePackageSettleNote;
+import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
+import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
+import com.qunzhixinxi.hnqz.admin.service.WmScorePackageSettleNoteService;
+import com.qunzhixinxi.hnqz.admin.service.gig.GigThirdApiService;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import java.util.List;
+
+/**
+ * @author: lixuesong
+ * @createTime: 2022/10/10 10:53
+ * @description:
+ */
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest(classes = {HnqzAdminApplication.class})
+public class ApiTest {
+
+	@Autowired
+	private WmScorePackageService wmScorePackageService;
+
+	@Autowired
+	private WmScorePackageSettleNoteService wmScorePackageSettleNoteService;
+
+	@Autowired
+	private GigThirdApiService gigThirdApiService;
+
+	@Test
+	public void finishTaskTest() {
+		List<WmScorePackageSettleNote> settleNoteList = wmScorePackageSettleNoteService.listByIds(CollUtil.toList(7688,
+				7690,
+				7700,
+				7741,
+				7742,
+				7743,
+				7744,
+				7746));
+
+		gigThirdApiService.finishTask(settleNoteList);
+	}
+}