wangzhuo 3 anni fa
parent
commit
5899929dfc
17 ha cambiato i file con 1074 aggiunte e 3 eliminazioni
  1. 6 0
      blade-service-api/trade-purchase-api/pom.xml
  2. 99 1
      blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/extra/entity/Claim.java
  3. 31 0
      blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/extra/entity/ClaimItem.java
  4. 110 0
      blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/extra/entity/JdModule.java
  5. 41 0
      blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/extra/entity/JdTenant.java
  6. 6 0
      blade-service/trade-purchase/pom.xml
  7. 10 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/controller/ClaimController.java
  8. 32 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/mapper/JdyModuleMapper.java
  9. 6 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/mapper/JdyModuleMapper.xml
  10. 32 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/mapper/JdyTenantMapper.java
  11. 7 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/mapper/JdyTenantMapper.xml
  12. 5 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/service/IClaimService.java
  13. 410 2
      blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/service/impl/ClaimServiceImpl.java
  14. 216 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/tool/JdyTool.java
  15. 17 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/vojo/JDYassist.java
  16. 28 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/vojo/JDYentries.java
  17. 18 0
      blade-service/trade-purchase/src/main/java/com/trade/purchase/vojo/JDYitems.java

+ 6 - 0
blade-service-api/trade-purchase-api/pom.xml

@@ -17,6 +17,12 @@
             <groupId>com.alibaba</groupId>
             <artifactId>easyexcel</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-client-api</artifactId>
+            <version>2.8.2.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     <packaging>jar</packaging>
 

+ 99 - 1
blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/extra/entity/Claim.java

@@ -23,11 +23,11 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springblade.client.entity.CommonFile;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
-import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
 
@@ -102,6 +102,97 @@ public class Claim implements Serializable {
 	 */
 	@ApiModelProperty(value = "合计金额")
 	private BigDecimal totalAmount;
+
+	/**
+	 * 要求支付时间
+	 */
+	@ApiModelProperty(value = "要求支付时间")
+	private Date requiredPaymentTime;
+
+	/**
+	 * 所属公司id
+	 */
+	@ApiModelProperty(value = "所属公司id")
+	private Long belongToCorpId;
+
+	/**
+	 * 所属公司名称
+	 */
+	@ApiModelProperty(value = "所属公司名称")
+	private String belongToCorpName;
+
+	/**
+	 * 所属公司编码
+	 */
+	@ApiModelProperty(value = "所属公司编码")
+	private String belongToCorpCode;
+
+	/**
+	 * 报销人银行户头
+	 */
+	@ApiModelProperty(value = "报销人银行户头")
+	private String accountReimbursement;
+
+	/**
+	 * 报销人账号
+	 */
+	@ApiModelProperty(value = "报销人账号")
+	private String reimbursementAccountNo;
+
+	/**
+	 * 报销人开户行
+	 */
+	@ApiModelProperty(value = "报销人开户行")
+	private String bankOfDeposit;
+
+	/**
+	 * 支付时间
+	 */
+	@ApiModelProperty(value = "支付时间")
+	private Date paymentTime;
+
+	/**
+	 * 支付方式id
+	 */
+	@ApiModelProperty(value = "支付方式id")
+	private Long paymentMethodId;
+
+	/**
+	 * 支付方式名称
+	 */
+	@ApiModelProperty(value = "支付方式名称")
+	private String paymentMethodName;
+
+	/**
+	 * 实际付款金额
+	 */
+	@ApiModelProperty(value = "实际付款金额")
+	private BigDecimal paymentAmount;
+
+	/**
+	 * 给付人
+	 */
+	@ApiModelProperty(value = "给付人")
+	private String dans;
+
+	/**
+	 * 财务出纳
+	 */
+	@ApiModelProperty(value = "财务出纳")
+	private String financialCashier;
+
+	/**
+	 * 科目编码
+	 */
+	@ApiModelProperty(value = "科目编码")
+	private String subjectCode;
+
+	/**
+	 * 单据数量
+	 */
+	@ApiModelProperty(value = "单据数量")
+	private String billQuantity;
+
 	/**
 	 * 状态(待补充)
 	 */
@@ -152,6 +243,7 @@ public class Claim implements Serializable {
 	@ApiModelProperty(value = "是否已删除(0-否、1-是)")
 	private Integer isDeleted;
 
+
 	@TableField(exist = false)
 	private List<ClaimItem> itemList;
 
@@ -170,4 +262,10 @@ public class Claim implements Serializable {
 	@TableField(exist = false)
 	private String pageLabel;
 
+	/**
+	 * 附件
+	 */
+	@TableField(exist = false)
+	private List<CommonFile> fileList;
+
 }

+ 31 - 0
blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/extra/entity/ClaimItem.java

@@ -99,6 +99,37 @@ public class ClaimItem implements Serializable {
 	 */
 	@ApiModelProperty(value = "金额")
 	private BigDecimal amount;
+
+	/**
+	 * 科目名称中文名
+	 */
+	@ApiModelProperty(value = "科目名称中文名")
+	private String subjectName;
+
+	/**
+	 * 核算项目中文名
+	 */
+	@ApiModelProperty(value = "核算项目中文名")
+	private String accountingItemsName;
+
+	/**
+	 * 费用归属人
+	 */
+	@ApiModelProperty(value = "费用归属人")
+	private String expenseOwner;
+
+	/**
+	 * 数量
+	 */
+	@ApiModelProperty(value = "数量")
+	private BigDecimal quantity;
+
+	/**
+	 * 单价
+	 */
+	@ApiModelProperty(value = "单价")
+	private BigDecimal price;
+
 	/**
 	 * 状态(待补充)
 	 */

+ 110 - 0
blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/extra/entity/JdModule.java

@@ -0,0 +1,110 @@
+package com.trade.purchase.extra.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.apache.ibatis.type.Alias;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 租户jd模块表实体类
+ *
+ * @author BladeX
+ * @since 2022-01-20
+ */
+@Data
+@TableName("jd_module")
+@Alias("JdModule1")
+@ApiModel(value = "JdModule对象", description = "租户jd模块表")
+public class JdModule implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private Long id;
+	/**
+	 * 模块名称
+	 */
+	@ApiModelProperty(value = "模块名称")
+	private String module;
+	/**
+	 * d 或 c
+	 */
+	@ApiModelProperty(value = "d 或 c")
+	private String dc;
+	/**
+	 * 科目编码
+	 */
+	@ApiModelProperty(value = "科目编码")
+	private String projectCode;
+
+	@ApiModelProperty(value = "科目编码")
+	private String projectName;
+	/**
+	 * 所属账套id
+	 */
+	@ApiModelProperty(value = "所属账套id")
+	private String accountId;
+	/**
+	 * 所属账套
+	 */
+	@ApiModelProperty(value = "所属账套")
+	private String accountName;
+
+	@ApiModelProperty(value = "租户id")
+	private String tenantId;
+
+	@ApiModelProperty(value = "版本")
+	private String version;
+	/**
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人")
+	private Long createUser;
+	/**
+	 * 创建部门
+	 */
+	@ApiModelProperty(value = "创建部门")
+	private Long createDept;
+	/**
+	 * 创建时间
+	 */
+	@ApiModelProperty(value = "创建时间")
+	private Date createTime;
+	/**
+	 * 修改人
+	 */
+	@ApiModelProperty(value = "修改人")
+	private Long updateUser;
+	/**
+	 * 修改时间
+	 */
+	@ApiModelProperty(value = "修改时间")
+	private Date updateTime;
+	/**
+	 * 状态(0 正常 1停用)
+	 */
+	@ApiModelProperty(value = "状态(0 正常 1停用)")
+	private Integer status;
+	/**
+	 * 是否已删除(0 否 1是)
+	 */
+	@ApiModelProperty(value = "是否已删除(0 否 1是)")
+	private Integer isDeleted;
+
+	private String currency;
+
+	private String currencyCode;
+
+	private String voucher;
+
+	private String voucherType;
+
+	private String projectType;
+
+	private String abstractStatic;
+
+	private String abstractFormula;
+}

+ 41 - 0
blade-service-api/trade-purchase-api/src/main/java/com/trade/purchase/extra/entity/JdTenant.java

@@ -0,0 +1,41 @@
+package com.trade.purchase.extra.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "JdTenant对象", description = "租户jd配置信息表")
+public class JdTenant implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private Long id;
+
+	@ApiModelProperty(value = "租户id")
+	private String tenantId;
+	/**
+	 * 租户名称
+	 */
+	@ApiModelProperty(value = "租户名称")
+	private String tenantName;
+	/**
+	 * 0.未启动 1启动
+	 */
+	@ApiModelProperty(value = "0.未启动 1启动")
+	private Boolean isEnable;
+
+	private String accountId;
+	private String accountName;
+	private String groupName;
+
+	private String clientId;
+	private String clientSecret;
+	private String username;
+	private String password;
+
+
+
+}

+ 6 - 0
blade-service/trade-purchase/pom.xml

@@ -97,6 +97,12 @@
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-excel</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.github.kevinsawicki</groupId>
+            <artifactId>http-request</artifactId>
+            <version>5.6</version>
+            <scope>compile</scope>
+        </dependency>
 
     </dependencies>
 

+ 10 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/controller/ClaimController.java

@@ -158,4 +158,14 @@ public class ClaimController extends BladeController {
 		return R.success("操作成功");
 	}
 
+	/**
+	 * 报销完成 生成凭证
+	 */
+	@PostMapping("modify")
+	@ApiOperation(value = "财务生成凭证", notes = "传入修改新增收付款信息对象")
+	public R modify(@RequestBody Claim claim) {
+		Claim modify = claimService.modify(claim);
+		return R.data(modify);
+	}
+
 }

+ 32 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/mapper/JdyModuleMapper.java

@@ -0,0 +1,32 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.trade.purchase.extra.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.trade.purchase.extra.entity.JdModule;
+
+/**
+ * 租户jd模块表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2022-01-20
+ */
+public interface JdyModuleMapper extends BaseMapper<JdModule> {
+
+
+
+}

+ 6 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/mapper/JdyModuleMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.trade.purchase.extra.mapper.JdyModuleMapper">
+
+
+</mapper>

+ 32 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/mapper/JdyTenantMapper.java

@@ -0,0 +1,32 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package com.trade.purchase.extra.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.trade.purchase.extra.entity.JdTenant;
+
+/**
+ * 租户jd配置信息表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2022-01-20
+ */
+public interface JdyTenantMapper extends BaseMapper<JdTenant> {
+
+
+
+}

+ 7 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/mapper/JdyTenantMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.trade.purchase.extra.mapper.JdyTenantMapper">
+
+
+
+</mapper>

+ 5 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/service/IClaimService.java

@@ -103,4 +103,9 @@ public interface IClaimService extends IService<Claim> {
 	 */
 	void underReview(Long id);
 
+	/**
+	 * 生成凭证
+	 */
+	Claim modify(Claim claim);
+
 }

+ 410 - 2
blade-service/trade-purchase/src/main/java/com/trade/purchase/extra/service/impl/ClaimServiceImpl.java

@@ -16,21 +16,34 @@
  */
 package com.trade.purchase.extra.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.trade.purchase.extra.entity.Claim;
 import com.trade.purchase.extra.entity.ClaimItem;
+import com.trade.purchase.extra.entity.JdModule;
+import com.trade.purchase.extra.entity.JdTenant;
 import com.trade.purchase.extra.mapper.ClaimItemMapper;
 import com.trade.purchase.extra.mapper.ClaimMapper;
+import com.trade.purchase.extra.mapper.JdyModuleMapper;
+import com.trade.purchase.extra.mapper.JdyTenantMapper;
 import com.trade.purchase.extra.service.IClaimService;
 import com.trade.purchase.extra.vo.ClaimVO;
+import com.trade.purchase.tool.JdyTool;
+import com.trade.purchase.vojo.JDYassist;
+import com.trade.purchase.vojo.JDYentries;
+import com.trade.purchase.vojo.JDYitems;
+import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
+import lombok.Data;
 import org.springblade.check.dto.AuditProecessDTO;
 import org.springblade.check.entity.AuditPathsActs;
 import org.springblade.check.entity.AuditPathsLevels;
 import org.springblade.check.feign.ICheckClient;
+import org.springblade.client.entity.CommonFile;
+import org.springblade.client.feign.ICommonFileClient;
 import org.springblade.client.feign.ISerialClient;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
@@ -38,13 +51,22 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.StringUtil;
+
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
+import javax.net.ssl.*;
+import java.io.*;
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 费用报销表 服务实现类
@@ -56,12 +78,23 @@ import java.util.List;
 @AllArgsConstructor
 public class ClaimServiceImpl extends ServiceImpl<ClaimMapper, Claim> implements IClaimService {
 
+	private static final String DEFAULT_CHARSET = "UTF-8";
+
+	private static final String METHOD_POST = "POST";
+
 	private final ClaimItemMapper claimItemMapper;
 
 	private final ISerialClient serialClient;
 
+	private final ICommonFileClient commonFileClient;
+
 	private final ICheckClient checkClient;
 
+	private final JdyTenantMapper jdTenantMapper;
+
+	private final JdyModuleMapper moduleMapper;
+
+
 	@Override
 	public IPage<ClaimVO> selectClaimPage(IPage<ClaimVO> page, ClaimVO claim) {
 		return page.setRecords(baseMapper.selectClaimPage(page, claim));
@@ -71,11 +104,16 @@ public class ClaimServiceImpl extends ServiceImpl<ClaimMapper, Claim> implements
 	public Claim getDetail(Claim claim) {
 		Claim detail = baseMapper.selectById(claim.getId());
 		if (ObjectUtil.isNotEmpty(detail)) {
+			//明细
 			List<ClaimItem> itemList = claimItemMapper.selectList(new LambdaQueryWrapper<ClaimItem>()
 				.eq(ClaimItem::getPid, detail.getId())
 				.eq(ClaimItem::getIsDeleted, 0)
 			);
 			detail.setItemList(itemList);
+
+			//附件
+			R<List<CommonFile>> fileList = commonFileClient.getList(claim.getId(), "LAND_CLAIM_FEE");
+			detail.setFileList(fileList.getData());
 		}
 		return detail;
 	}
@@ -135,6 +173,17 @@ public class ClaimServiceImpl extends ServiceImpl<ClaimMapper, Claim> implements
 			i ++;
 		}
 
+		List<CommonFile> fileList = claim.getFileList();
+		if (ObjectUtil.isNotEmpty(fileList)){
+			fileList.forEach(file -> {
+				if (ObjectUtil.isEmpty(file.getId())) {
+					file.setPid(claim.getId());
+					file.setSource("LAND_CLAIM_FEE");
+				}
+			});
+		}
+		commonFileClient.saveList(fileList);
+
 		claim.setTotalAmount(totalAmount);
 		baseMapper.updateById(claim);
 		return claimId;
@@ -240,4 +289,363 @@ public class ClaimServiceImpl extends ServiceImpl<ClaimMapper, Claim> implements
 		);
 	}
 
+	@Override
+	@Transactional
+	@GlobalTransactional
+	public Claim modify(Claim claim) {
+		Long id = claim.getId();
+		Claim claimOne = baseMapper.selectById(id);
+
+		if ("681169".equals(AuthUtil.getTenantId())){
+
+			if (claimOne == null) {
+				throw new SecurityException("未查到相关数据,操作失败");
+			}
+
+			//获得明细
+			List<ClaimItem> itemList = claimItemMapper.selectList(new LambdaQueryWrapper<ClaimItem>()
+				.eq(ClaimItem::getPid, claimOne.getId())
+				.eq(ClaimItem::getIsDeleted, 0)
+			);
+			//=============生成凭证所需信息==============
+			String accountName = claim.getBelongToCorpName();
+			if (!"青岛通用沃德轮胎有限公司".equals(accountName)) {
+				accountName="青岛达沃特轮胎有限公司";
+			}
+			LambdaQueryWrapper<JdTenant> jdTenantLambdaQueryWrapper = new LambdaQueryWrapper<>();
+			jdTenantLambdaQueryWrapper
+				.eq(JdTenant::getIsEnable, 1)
+				.eq(JdTenant::getTenantId, AuthUtil.getTenantId())
+				.eq(JdTenant::getAccountName, accountName);
+			JdTenant jdTenant = jdTenantMapper.selectOne(jdTenantLambdaQueryWrapper);
+			if (jdTenant != null)
+			{
+				if (ObjectUtil.isNotEmpty(itemList)){
+					itemList.forEach(item -> {
+						try {
+							//财务保存凭证
+							this.ClaimSaveVoucher(claimOne.getPaymentTime(), item.getSubjectName(), item.getExpenseOwner(), item.getAccountingItemsName(), item.getAmount().toString());
+						} catch (Exception exception) {
+							throw new SecurityException(exception.getMessage());
+						}
+					});
+				}
+			}
+
+		}
+		return claim;
+	}
+
+	//财务生成账单
+	public void ClaimSaveVoucher(Date PaymentTime, String accountName, String corpName, String corpNumber, String account) throws Exception {
+		// TODO 临时屏蔽
+
+		//非达沃特用户直接返回
+		if (!"681169".equals(AuthUtil.getTenantId())) {
+			return;
+		}
+		//如果金额大于0,才生成凭证
+		if (new BigDecimal(account).compareTo(BigDecimal.ZERO) < 1) {
+			return;
+		}
+
+		//获取token
+		String token = this.getAccountGroupRequest();
+		//获取套账url
+		String getAccountUrl = "https://api.kingdee.com/jdy/sys/accountGroup?access_token=" + token;
+		Map<String, String> urlParams = new HashMap<>();
+		String result = this.doPost(getAccountUrl, urlParams);
+		JdyTool.getAccountGroup getAccountGroup = JSONObject.parseObject(result, JdyTool.getAccountGroup.class);
+
+		List<JdyTool.AccountGroup> list = new ArrayList<>();
+		if (!CollectionUtils.isNotEmpty(getAccountGroup.getData())) {
+			throw new SecurityException("操作失败,暂无账套信息");
+		}
+		//获取此账号下,全部账套
+		getAccountGroup.getData().forEach(e -> {
+			list.addAll(e.getAccountGroups());
+		});
+		//匹配账套
+		List<JdyTool.AccountGroup> groupList = list.stream().filter(e -> e.getAccountName().equals(accountName)).collect(Collectors.toList());
+		if (!CollectionUtils.isNotEmpty(groupList)) {
+			throw new SecurityException("未找到: " + accountName + " 的账套信息");
+		}
+		JdyTool.AccountGroup group = groupList.get(0);
+		//1.获取租户信息
+		LambdaQueryWrapper<JdTenant> jdTenantLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		jdTenantLambdaQueryWrapper
+			.eq(JdTenant::getIsEnable, 1)
+			.eq(JdTenant::getTenantId, AuthUtil.getTenantId())
+			.eq(JdTenant::getAccountName, accountName);
+		JdTenant jdTenant = jdTenantMapper.selectOne(jdTenantLambdaQueryWrapper);
+		if (jdTenant == null) {
+			return;
+		}
+		//保存凭证
+		JdyTool.voucher voucher = toSaleCollectionJinDie(PaymentTime,accountName, account, corpName, corpNumber, jdTenant.getAccountId(), group.getGroupName(), jdTenant);
+		if (voucher == null) {
+			throw new SecurityException("获取凭证信息失败");
+		}
+
+	}
+
+	//金蝶保存凭证测试-生成凭证
+	public JdyTool.voucher toSaleCollectionJinDie(Date date,String subjectNumber, String account, String corpName,String corpNumber, String accountId, String groupName, JdTenant jdTenant) {
+		JDYitems item = new JDYitems();
+		item.setDate(new SimpleDateFormat("yyyy-MM-dd").format(date));
+		List<JDYentries> entriesList = new ArrayList<>();
+		List<JDYitems> jdYitems = new ArrayList<>();
+
+		//财务借方
+		JDYentries d = new JDYentries();
+		d.setDc("1");
+		LambdaQueryWrapper<JdModule> dLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		dLambdaQueryWrapper
+			.eq(JdModule::getAccountId, accountId)
+			.eq(JdModule::getModule, "报销")
+			.eq(JdModule::getDc, "1")
+			.last("limit 1")
+			.eq(JdModule::getTenantId, AuthUtil.getTenantId());
+		JdModule dModule = moduleMapper.selectOne(dLambdaQueryWrapper);
+		if (dModule == null) {
+			throw new SecurityException("获取科目号失败");
+		}
+		if (null != subjectNumber && !subjectNumber.equals("")){
+			dModule.setProjectCode(subjectNumber);
+		}else {
+			throw new SecurityException("科目编码为空");
+		}
+		d.setExplanation(dModule.getAbstractStatic() + "-" + corpName);
+		d.setAccount_number(dModule.getProjectCode());
+		d.setDebitamount(account);
+		entriesList.add(d);
+
+		//===========辅助核算=================
+		List<JDYassist> cList = new ArrayList<>();
+
+		JDYassist jdYassist = new JDYassist();
+		jdYassist.setType("bd_employee");
+
+		jdYassist.setNumber(corpNumber);
+
+		cList.add(jdYassist);
+		d.setAssist(cList);
+		//===========辅助核算=================
+
+
+		//财务贷方
+		JDYentries c = new JDYentries();
+		c.setDc("-1");
+
+		LambdaQueryWrapper<JdModule> cLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		cLambdaQueryWrapper
+			.eq(JdModule::getAccountId, accountId)
+			.eq(JdModule::getModule, "报销")
+			.eq(JdModule::getDc, "-1")
+			.last("limit 1")
+			.eq(JdModule::getTenantId, AuthUtil.getTenantId());
+		JdModule cModule = moduleMapper.selectOne(cLambdaQueryWrapper);
+		if (cModule == null) {
+			throw new SecurityException("获取科目号失败");
+		}
+		c.setExplanation(cModule.getAbstractStatic() + "-" + corpName);
+		c.setAccount_number(cModule.getProjectCode());
+		c.setCreditamount(account);
+
+		entriesList.add(c);
+
+		//组装数据
+		item.setEntries(entriesList);
+		jdYitems.add(item);
+		try {
+			String token = this.getAccountGroupRequest();
+			String saveUrl = "http://api.kingdee.com/jdy/gl/voucher_save?access_token=" + token;
+			return JdyTool.testSaveVoucher(token, saveUrl, accountId, groupName, jdYitems);
+		} catch (Exception exception) {
+			throw new SecurityException("操作失败,保存金蝶错误:" + exception.getMessage());
+		}
+	}
+
+	//测试获取AccountGroupRequest
+	public String getAccountGroupRequest() throws Exception {
+		//校验当前租户配置,如果存在配置,返回token
+		LambdaQueryWrapper<JdTenant> jdTenantLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		jdTenantLambdaQueryWrapper
+			.last("limit 1")
+			.eq(JdTenant::getTenantId, AuthUtil.getTenantId())
+			.eq(JdTenant::getIsEnable, 1);
+		JdTenant jdTenant = jdTenantMapper.selectOne(jdTenantLambdaQueryWrapper);
+		if (jdTenant == null) {
+			throw new SecurityException("当前租户未配置凭证信息");
+		}
+		//获取测试账套token的url
+		String getTokenUrl = "https://api.kingdee.com/auth/user/access_token?client_id=" + jdTenant.getClientId() +
+			"&client_secret=" + jdTenant.getClientSecret() +
+			"&username=" + jdTenant.getUsername() +
+			"&password=" + jdTenant.getPassword();
+		Map<String, String> urlParams = new HashMap<>();
+
+		String result = this.doGet(getTokenUrl, urlParams);
+		tokenDTO tokenDTO = JSONObject.parseObject(result, tokenDTO.class);
+		if (tokenDTO.errcode == 1006) {
+			throw new SecurityException("当前密码错误次数超过限定值");
+		}
+		return tokenDTO.getData().getAccess_token();
+	}
+
+	public String doGet(String url, Map<String, String> urlParams)
+		throws IOException {
+		if (isEmpty(url)) {
+			throw new IllegalArgumentException("The parameter 'url' can not be null or blank.");
+		}
+		url += buildQuery(urlParams, "UTF-8");
+		HttpURLConnection conn = getConnection(new URL(url), "GET");
+		return getResponseAsString(conn);
+	}
+
+	public String doPost(String url, Map<String, String> urlParams) throws IOException {
+		if (isEmpty(url)) {
+			throw new IllegalArgumentException("The parameter 'url' can not be null or blank.");
+		}
+		url += buildQuery(urlParams, DEFAULT_CHARSET);
+		HttpURLConnection conn = getConnection(new URL(url), METHOD_POST);
+		return getResponseAsString(conn);
+	}
+
+	private boolean isEmpty(String str) {
+		return str == null || str.trim().length() == 0;
+	}
+
+	public String buildQuery(Map<String, String> params, String charset) throws UnsupportedEncodingException {
+		if (params == null || params.isEmpty()) {
+			return "";
+		}
+		StringBuilder sb = new StringBuilder();
+		boolean first = true;
+		for (Map.Entry<String, String> entry : params.entrySet()) {
+			if (first) {
+				sb.append("?");
+				first = false;
+			} else {
+				sb.append("&");
+			}
+			String key = entry.getKey();
+			String value = entry.getValue();
+			if (areNotEmpty(key, value)) {
+				sb.append(key).append("=").append(URLEncoder.encode(value, charset));
+			}
+		}
+		return sb.toString();
+
+	}
+
+	public boolean areNotEmpty(String... values) {
+		if (values == null || values.length == 0) {
+			return false;
+		}
+
+		for (String value : values) {
+			if (isEmpty(value)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	private HttpURLConnection getConnection(URL url, String method)
+		throws IOException {
+
+		HttpURLConnection conn;
+		if ("https".equals(url.getProtocol())) {
+			SSLContext ctx;
+			try {
+				ctx = SSLContext.getInstance("TLS");
+				ctx.init(new KeyManager[0], new TrustManager[]{new ClaimServiceImpl.DefaultTrustManager()},
+					new SecureRandom());
+			} catch (Exception e) {
+				throw new IOException(e);
+			}
+			HttpsURLConnection connHttps = (HttpsURLConnection) url.openConnection();
+			connHttps.setSSLSocketFactory(ctx.getSocketFactory());
+			connHttps.setHostnameVerifier((hostname, session) -> {
+				// 默认都认证通过
+				return true;
+			});
+			conn = connHttps;
+		} else {
+			conn = (HttpURLConnection) url.openConnection();
+		}
+		conn.setRequestMethod(method);
+		conn.setDoInput(true);
+		conn.setDoOutput(true);
+		conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
+		conn.setRequestProperty("Connection", "Keep-Alive");
+		return conn;
+
+	}
+
+	private String getResponseAsString(HttpURLConnection conn) throws IOException {
+		InputStream es = conn.getErrorStream();
+		if (es == null) {
+			return getStreamAsString(conn.getInputStream(), "UTF-8");
+		} else {
+			String msg = getStreamAsString(es, "UTF-8");
+			if (isEmpty(msg)) {
+				throw new IOException(conn.getResponseCode() + " : " + conn.getResponseMessage());
+			} else {
+				throw new IOException(msg);
+			}
+		}
+
+	}
+
+	private String getStreamAsString(InputStream input, String charset) throws IOException {
+		StringBuilder sb = new StringBuilder();
+		try (BufferedReader bf = new BufferedReader(new InputStreamReader(input, charset))) {
+			String str;
+			while ((str = bf.readLine()) != null) {
+				sb.append(str);
+			}
+			return sb.toString();
+		}
+
+	}
+
+	private static class DefaultTrustManager implements X509TrustManager {
+
+		@Override
+		public X509Certificate[] getAcceptedIssuers() {
+			return null;
+		}
+
+		@Override
+		public void checkClientTrusted(X509Certificate[] cert, String oauthType) {
+		}
+
+		@Override
+		public void checkServerTrusted(X509Certificate[] cert, String oauthType) {
+		}
+	}
+
+	@Data
+	public static class tokenDTO {
+		private Long errcode;
+
+		private String description;
+
+		private ClaimServiceImpl.tokenData data;
+	}
+
+	@Data
+	public static class tokenData {
+		private String access_token;
+		private String avatar;
+		private String expires;
+		private String expires_in;
+		private String gender;
+		private String nickname;
+		private String uid;
+
+
+	}
 }

+ 216 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/tool/JdyTool.java

@@ -0,0 +1,216 @@
+package com.trade.purchase.tool;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import com.github.kevinsawicki.http.HttpRequest;
+import com.trade.purchase.vojo.JDYitems;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 金蝶测试demo, 如果需要正式的,则需要替换
+ * */
+@Slf4j
+public class JdyTool {
+
+	//测试-调用金蝶云官方账号的保存
+	public static voucher testSaveVoucher (String token, String url, String accountId, String groupName, List<JDYitems> jdYitems) throws Exception
+	{
+		HttpRequest httpRequest = new HttpRequest(url,"POST");
+		httpRequest.header("accountId",accountId);
+		httpRequest.header("charset","utf-8");
+		httpRequest.header("groupName",groupName);
+		httpRequest.header("Content-Type","application/json");
+		JSONObject data=new JSONObject();
+		data.put("items",jdYitems);
+		log.info("请求内容:" + data.toJSONString());
+		httpRequest.send(data.toJSONString());
+
+
+		String body = httpRequest.body().toString();
+		log.info("请求结果:"+body);
+		//获取返回对象
+		JDYSaveResponse saveResponse = JSONObject.parseObject(body, JDYSaveResponse.class);
+		log.info("请求结果结果:"+saveResponse.getSuccess());
+		log.info("请求结果状态码:"+saveResponse.getErrorCode());
+		/*log.info("请求返回体:"+saveResponse.toString());*/
+		//验证,如果返回不对, 连同业务回滚
+		boolean error=false;
+		if(CollectionUtils.isNotEmpty(saveResponse.getData()))
+		{
+			error = saveResponse.getData().stream().anyMatch(e -> e.getSuccess() == false);
+		}
+
+		if(saveResponse.getSuccess()==false)
+		{
+			throw new SecurityException("调用凭证API失败,请检查日志");
+		}
+		else
+		{
+
+			if(error)
+			{
+				throw new SecurityException("保存凭证失败,请检查日志");
+			}
+		}
+
+
+		//获取主表id
+		List<String> successPkIds = saveResponse.getData().get(0).getSuccessPkIds();
+		String id = successPkIds.toString().replace("[", "").replace("]", "");
+		String getUrl= "http://api.kingdee.com/jdy/gl/voucher_detail?access_token="+token;
+		HttpRequest httpRequest2 = new HttpRequest(getUrl,"POST");
+		httpRequest2.header("accountId",accountId);
+		httpRequest2.header("charset","utf-8");
+		httpRequest2.header("groupName",groupName);
+		httpRequest2.header("Content-Type","application/json");
+
+		JSONObject data2=new JSONObject();
+		data2.put("id",id);
+		httpRequest2.send(data2.toJSONString());
+		String body2 = httpRequest2.body().toString();
+		log.info("请求结果:"+body2);
+		getVoucherResponse getVoucherResponse = JSONObject.parseObject(body2, getVoucherResponse.class);
+		return getVoucherResponse.getData();
+	}
+
+	public static List<checkitementry> testGetCheckitementryList(String token, String accountId, String groupName, String number)
+	{
+		String url="http://api.kingdee.com/jdy/gl/account_detail?access_token="+token;
+		HttpRequest httpRequest = new HttpRequest(url,"POST");
+		httpRequest.header("accountId",accountId);
+		httpRequest.header("groupName",groupName);
+		httpRequest.header("Content-Type","application/json");
+		JSONObject data = new JSONObject();
+		data.put("number",number);//科目的编码
+		httpRequest.send(data.toJSONString());
+		String body = httpRequest.body().toString();
+
+		//获取返回对象
+		accountDetailResponse accountDetailResponse = JSONObject.parseObject(body, accountDetailResponse.class);
+		List<checkitementry> checkitementryList = accountDetailResponse.data.checkitementry;
+		return checkitementryList;
+	}
+
+
+
+	@Data
+	public static class JDYSaveResponse implements Serializable
+	{
+		private Boolean success;
+		private Boolean reachPlugin;
+		private List<SaveResponseData> data;
+		private String errorCode;
+	}
+
+
+	@Data
+	public static class SaveResponseData implements Serializable
+	{
+
+		public List<String> successPkIds;
+
+		public Boolean success;
+
+		public List<com.jdy.v7sdk.business.models.errorInfo> errorInfo;
+
+		public String message;
+
+		public String errorLevel;
+	}
+
+	@Data
+	public static  class  getAccountGroup implements Serializable
+	{
+		private Boolean success;
+		private String errorCode;
+		private String message;
+		private List<AccountGroups> Data;
+	}
+
+	@Data
+	public static class AccountGroups implements Serializable
+	{
+		private String serviceId;
+		private String serviceName;
+		private String serviceAddr;
+		private List<AccountGroup> accountGroups;
+	}
+
+	@Data
+	public static class AccountGroup implements Serializable
+	{
+		private String accountName;
+		private String accountId;
+		private String enable;
+		private String groupId;
+		private String groupName;
+	}
+
+	@Data
+	public static class supplier implements Serializable
+	{
+		private String id;
+		private String number;
+		private String name;
+		private String groupId;
+		private String groupName;
+		private String groupNumber;
+		private String rate;
+		private String bank;
+		private String bankaccount;
+		private String accountopenaddr;
+
+	}
+
+	@Data
+	public static class getVoucherResponse implements Serializable
+	{
+		private voucher data;
+		private String  success;
+	}
+
+	//部分凭证对象属性
+	@Data
+	public static class  voucher implements Serializable
+	{
+		private String date;
+		private String id;
+		private String period;
+		private String number;
+		private String voucherno;
+	}
+
+	@Data
+	public static class accountDetailResponse implements Serializable
+	{
+		private accountDetail data;
+		private String  success;
+	}
+
+	@Data
+	public static class accountDetail implements Serializable
+	{
+		private  String name;
+		private  String number;
+		private  List<checkitementry> checkitementry;
+	}
+
+	@Data
+	public static class checkitementry implements Serializable
+	{
+		private String asstactitem_id;
+		private String bd_auxinfo_type_id;
+		private String asstactitem_name;
+		private String id;
+		private String isrequire;
+		private String type;
+		private String seq;
+		private String asstactitem_number;
+	}
+
+}

+ 17 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/vojo/JDYassist.java

@@ -0,0 +1,17 @@
+package com.trade.purchase.vojo;
+
+import lombok.Data;
+
+/**
+ * 金蝶测试类-辅助核算列表对象
+ * */
+@Data
+public class JDYassist {
+	private  String type;
+
+	private  String bd_auxinfo_type_id;
+
+	private  String  id;
+
+	private String number;
+}

+ 28 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/vojo/JDYentries.java

@@ -0,0 +1,28 @@
+package com.trade.purchase.vojo;
+
+import lombok.Data;
+
+import java.util.List;
+
+//分录列表
+/**
+ * 金蝶测试类-分录列表
+ * */
+@Data
+public class JDYentries
+{
+	//借贷方向 (1:借 ,-1:贷)
+	private String dc;
+	//摘要: 类似于备注
+	private String explanation;
+	//借方金额(本位币)
+	private String debitamount;
+	//贷方金额(本位币)
+	private String creditamount;
+	//科目id(必填)
+	private String account_id;
+	//科目编码
+	private String account_number;
+	//辅助核算列表
+	private List<JDYassist> assist;
+}

+ 18 - 0
blade-service/trade-purchase/src/main/java/com/trade/purchase/vojo/JDYitems.java

@@ -0,0 +1,18 @@
+package com.trade.purchase.vojo;
+
+import lombok.Data;
+
+import java.util.List;
+
+//凭证列表对象
+/**
+ * 金蝶测试类-凭证列表
+ * */
+@Data
+public class JDYitems
+{
+	//凭证日期 YYYY-MM-DD形式
+	private  String date;
+	//分录列表
+	private List<JDYentries> entries;
+}