فهرست منبع

Merge remote-tracking branch 'origin/master'

wangjun 1 ماه پیش
والد
کامیت
e04c0f153d

+ 57 - 1
code/base/nckd-jimin-base-helper/src/main/java/nckd/base/helper/CommonHelperUtils.java

@@ -1,5 +1,7 @@
 package nckd.base.helper;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.orm.query.QCP;
@@ -173,7 +175,7 @@ public class CommonHelperUtils {
             return null;
         }
 
-        List<Long> parentIds = OrgUnitServiceHelper.getAllSuperiorOrgs(OrgViewType.Bankroll, openOrg.getLong("org.id"));
+        List<Long> parentIds = OrgUnitServiceHelper.getAllSuperiorOrgs(OrgViewType.Admin, openOrg.getLong("org.id"));
         if(!parentIds.contains(openOrg.getLong("org.id"))){
             parentIds.add(openOrg.getLong("org.id"));
         }
@@ -237,4 +239,58 @@ public class CommonHelperUtils {
 
         return exchangeTableId;
     }
+
+    /**
+     * 构造调用esb接口的参数,inputData正常调用第三方接口的参数,通过esb调用时,需要包一层requestHead和requestData
+     * 例如:星瀚的获取apptoken接口需要按以下格式
+     * {
+     * 	"requestHead": {
+     *         "system": "XH",
+     *         "tenantId": "",
+     *         "apiversion": "",
+     *         "timestamp": "",
+     *         "retrycount": 0,
+     *         "mainBodyId": "JY",
+     *         "mainBodyEx1": "",
+     *         "mainBodyEx2": "",
+     *         "mainBodyEx3": ""
+     *     },
+     * 	"requestData": [{
+     * 		"appId": "mdm",
+     * 		"appSecret": "6*KIh+kO117xS@qC",
+     * 		"tenantid": "jmkd-dev",
+     * 		"accountId": "2189944093541401600",
+     * 		"language": "zh_CN"
+     *        }]
+     * }
+     * @param inputData,传 null 时,表示原body为 {}
+     * @return
+     */
+    public static String buildEsbApiBodyJSON(JSONObject inputData){
+        JSONObject jsonBody = new JSONObject();
+
+        //requestHead参数
+        JSONObject requestHead = new JSONObject();
+
+        requestHead.put("system", "");
+        requestHead.put("tenantId", "");
+        requestHead.put("apiversion", "");
+        requestHead.put("timestamp", "");
+        requestHead.put("retrycount", "");
+        requestHead.put("mainBodyId", "JY");
+        requestHead.put("mainBodyEx1", "");
+        requestHead.put("mainBodyEx2", "");
+        requestHead.put("mainBodyEx3", "");
+
+        jsonBody.put("requestHead", requestHead);
+
+        //requestData参数
+        JSONArray requestData = new JSONArray();
+        if(inputData != null) {
+            requestData.add(inputData);
+        }
+        jsonBody.put("requestData", requestData);
+
+        return jsonBody.toJSONString();
+    }
 }

+ 3 - 1
code/jyyy/nckd-jimin-jyyy-bd/src/main/java/nckd/jimin/jyyy/bd/common/oauth/FanWeiSSOAuthtication.java

@@ -13,6 +13,7 @@ import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.sdk.util.KHttpClientUtils;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
+import nckd.base.helper.CommonHelperUtils;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -119,8 +120,9 @@ public class FanWeiSSOAuthtication extends ThirdAppAuthtication {
                 userUrl = userUrl + "?eteam_token=" + token + "&xybs=" + syscode;
 
                 logger.info("获取泛微用户url:" + userUrl);
+                String bodyString = CommonHelperUtils.buildEsbApiBodyJSON(null);
 
-                apiResult = KHttpClientUtils.postjson(userUrl, header, "{}");
+                apiResult = KHttpClientUtils.postjson(userUrl, header, bodyString);
             } catch (IOException e) {
                 logger.info(e.getMessage());
 

+ 26 - 21
code/jyyy/nckd-jimin-jyyy-bd/src/main/java/nckd/jimin/jyyy/bd/plugin/msg/ecology/FanweiCommonUtil.java

@@ -23,6 +23,7 @@ import kd.bos.workflow.engine.msg.info.MessageInfo;
 import kd.bos.workflow.engine.msg.info.ToDoInfo;
 import kd.bos.workflow.exception.WFErrorCode;
 import kd.bos.workflow.exception.WFMessageServiceException;
+import nckd.base.helper.CommonHelperUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import javax.net.ssl.HttpsURLConnection;
 import javax.net.ssl.SSLContext;
@@ -130,6 +131,7 @@ public final class FanweiCommonUtil {
                 logger.info("泛微推送数据日志保存成功");
 
                 String token = getFanWeiToken(false);
+                String bodyString = "";
                 String url = "";
                 String result = "";
 
@@ -141,7 +143,8 @@ public final class FanweiCommonUtil {
                     url = param_sendflow + "?access_token=" + token + "&secret_key=" + param_secretkey;
                     logger.info("泛微发送消息接口地址:" + url);
 
-                    result = KHttpClientUtils.postjson(url, header, JSON.toJSONString(fanweiBodyData));
+                    bodyString = CommonHelperUtils.buildEsbApiBodyJSON(fanweiBodyData);
+                    result = KHttpClientUtils.postjson(url, header, bodyString);
                 } catch (IOException e) {
                     logger.info(e.getMessage());
 
@@ -222,6 +225,7 @@ public final class FanweiCommonUtil {
                 logger.info("泛微推送数据日志保存成功");
 
                 String token = getFanWeiToken(false);
+                String bodyString = "";
                 String url = "";
                 String result = "";
 
@@ -233,7 +237,8 @@ public final class FanweiCommonUtil {
                     url = param_sendflow + "?access_token=" + token + "&secret_key=" + param_secretkey;
                     logger.info("泛微发送消息接口地址:" + url);
 
-                    result = KHttpClientUtils.postjson(url, header, JSON.toJSONString(fanweiBodyData));
+                    bodyString = CommonHelperUtils.buildEsbApiBodyJSON(fanweiBodyData);
+                    result = KHttpClientUtils.postjson(url, header, bodyString);
                 } catch (IOException e) {
                     logger.info(e.getMessage());
 
@@ -309,6 +314,7 @@ public final class FanweiCommonUtil {
                 logger.info("泛微推送数据日志保存成功");
 
                 String token = getFanWeiToken(false);
+                String bodyString = "";
                 String url = "";
                 String result = "";
 
@@ -320,7 +326,8 @@ public final class FanweiCommonUtil {
                     url = param_sendflow + "?access_token=" + token + "&secret_key=" + param_secretkey;
                     logger.info("泛微发送消息接口地址:" + url);
 
-                    result = KHttpClientUtils.postjson(url, header, JSON.toJSONString(fanweiBodyData));
+                    bodyString = CommonHelperUtils.buildEsbApiBodyJSON(fanweiBodyData);
+                    result = KHttpClientUtils.postjson(url, header, bodyString);
                 } catch (IOException e) {
                     logger.info(e.getMessage());
 
@@ -418,6 +425,7 @@ public final class FanweiCommonUtil {
                 logger.info("泛微推送数据日志保存成功");
 
                 String token = getFanWeiToken(false);
+                String bodyString = "";
                 String url = "";
                 String result = "";
 
@@ -428,8 +436,8 @@ public final class FanweiCommonUtil {
                 try {
                     url = param_sendflow + "?access_token=" + token + "&secret_key=" + param_secretkey;
                     logger.info("泛微发送消息接口地址:" + url);
-
-                    result = KHttpClientUtils.postjson(url, header, JSON.toJSONString(fanweiBodyData));
+                    bodyString = CommonHelperUtils.buildEsbApiBodyJSON(fanweiBodyData);
+                    result = KHttpClientUtils.postjson(url, header, bodyString);
                 } catch (IOException e) {
                     logger.info(e.getMessage());
 
@@ -935,16 +943,22 @@ public final class FanweiCommonUtil {
             setParmamValue();
         }
 
+        String bodyString = "";
         String token = "";
-
         String result = "";
         String url = "";
+
+        Map<String, String> header = new HashMap<>();
+        header.put("Content-Type", "application/json; charset=UTF-8");
+
+
         try {
             url = param_getcode + "?corpid=" + param_cropid + "&response_type=" + param_responsetype + "&state=" + param_state;
 
             logger.info("获取泛微code接口地址:" + url);
             //获取code
-            result = KHttpClientUtils.get(url);
+            bodyString = CommonHelperUtils.buildEsbApiBodyJSON(null);
+            result = KHttpClientUtils.postjson(url, header, bodyString);
         } catch (Exception e) {
             logger.info(e.getMessage());
 
@@ -968,25 +982,14 @@ public final class FanweiCommonUtil {
         }
         String code = codeObj.getString("code");
 
-        Map<String, String> header = new HashMap<>();
-        header.put("Content-Type", "application/json; charset=UTF-8");
-
-        Map<String, Object> params = new HashMap<>();
-//        Map<String, Object> body = new HashMap<>();
-
-        params.put("app_key", param_appkey);
-        params.put("app_secret", param_appsecret);
-        params.put("grant_type", param_granttype);
-        params.put("code", code);
-
         //获取token
         try {
-            url = param_gettoken;
+            url = param_gettoken + "?app_key=" + param_appkey + "&app_secret=" + param_appsecret + "&grant_type=" + param_granttype + "&code=" + code;
             logger.info("获取泛微token接口地址:" + url);
 
-            result = KHttpClientUtils.postjson(url, header, JSON.toJSONString(params));
-
+            bodyString = CommonHelperUtils.buildEsbApiBodyJSON(null);
 
+            result = KHttpClientUtils.postjson(url, header, bodyString);
         } catch (IOException e) {
             logger.info(e.getMessage());
 
@@ -1013,6 +1016,8 @@ public final class FanweiCommonUtil {
         return token;
     }
 
+
+
     /**
      * 保存日志
      * @param userid

+ 187 - 4
code/jyyy/nckd-jimin-jyyy-fi/src/main/java/nckd/jimin/jyyy/fi/webapi/SRMSynPayApiPlugin.java

@@ -8,6 +8,7 @@ import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.dataentity.entity.LocaleString;
 import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
+import kd.bos.db.DB;
 import kd.bos.entity.operate.result.OperationResult;
 import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
@@ -18,13 +19,17 @@ import kd.bos.openapi.common.result.CustomApiResult;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.DispatchServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
 import nckd.base.helper.CommonHelperUtils;
 import javax.validation.Valid;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.text.ParseException;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 /**
  * SRM系统调用,付款同步接口
@@ -239,6 +244,7 @@ public class SRMSynPayApiPlugin implements Serializable {
         bizAcctOutBill.set("abovequota", "0");//超额
         bizAcctOutBill.set("ispush", "false");//合同下推生成
         bizAcctOutBill.set("nckd_srmstatus", "1");//srm状态,1:SRM已推送;2:已退回SRM;3:已反写SRM;4:反写SRM失败
+        bizAcctOutBill.set("nckd_duigong", "01");//是否对公业务
 
         BigDecimal totalReimburseAmount = BigDecimal.ZERO;//报销金额合计
 
@@ -247,6 +253,8 @@ public class SRMSynPayApiPlugin implements Serializable {
         DynamicObjectType type = expenseEntry.getDynamicObjectType();
         JSONArray bizAccountOutBillEntry = inputData.getJSONArray("bizAccountOutBillEntry");
 
+        Long itemEntryId = DB.genLongId("er_publicreimbursebill.expenseentryentity");
+
         for(int i = 0; i < bizAccountOutBillEntry.size(); i++){
             JSONObject jsonData = bizAccountOutBillEntry.getJSONObject(i);
 
@@ -265,6 +273,10 @@ public class SRMSynPayApiPlugin implements Serializable {
 
             DynamicObject entry = new DynamicObject(type);
 
+            if(i == 0){
+                entry.set("id", itemEntryId);
+            }
+
             entry.set("seq", (i+1));
             entry.set("happendate", bizDate);
 
@@ -374,7 +386,7 @@ public class SRMSynPayApiPlugin implements Serializable {
             if(entryBanks.size() > 0){
                 for(DynamicObject entryBank : entryBanks){
                     if(entryBank.getBoolean("isdefault_bank")){
-                        entry.set("payeraccount", entryBank.getString("payeraccount"));//银行账号
+                        entry.set("payeraccount", entryBank.getString("bankaccount"));//银行账号
                         entry.set("payeraccountname", entryBank.getString("accountname"));//账户名称
                         entry.set("payerbank", entryBank.getDynamicObject("bank"));//开户银行
 
@@ -455,20 +467,191 @@ public class SRMSynPayApiPlugin implements Serializable {
 
             String fpNumber = jsonData.getString("fpNumber");//发票号
             String fpCode = jsonData.getString("fpCode");//发票代码
+            String serialNo = jsonData.getString("serialNo");//发票流水号
             String taxAmount = jsonData.getString("taxAmount");//税额
 
+            Long invoiceEntryId = DB.genLongId("er_publicreimbursebill.invoiceentry");
+
             DynamicObject entry = new DynamicObject(type);
+            entry.set("id", invoiceEntryId);
+            entry.set("seq", (i + 1));
             entry.set("invoiceno", fpNumber);//发票号
             entry.set("invoicecode", fpCode);//发票代码
-            entry.set("taxamount_invoice", taxAmount);//税额
+            entry.set("serialno", serialNo);//发票流水号
+
+            List<String> serialNoList = new ArrayList<String>();
+            serialNoList.add(serialNo);
+
+            Map<String, Object> invoiceMap = DispatchServiceHelper.invokeBizService("imc", "rim", "FpzsService", "query", serialNoList);
+
+            if(invoiceMap != null && invoiceMap.get("data") != null){
+                JSONArray invoiceArray =  (JSONArray)invoiceMap.get("data");
+                for(int j = 0; j < invoiceArray.size(); j++) {
+                    //发票表头
+                    JSONObject invoiceObj = invoiceArray.getJSONObject(j);
+
+                    fpNumber = invoiceObj.getString("invoiceNo");
+                    Date invoiceDate = CommonHelperUtils.getDateStringFormat(invoiceObj.getString("invoiceDate"), "yyyy-MM-dd");
+                    Date billCreateTime = CommonHelperUtils.getDateStringFormat(invoiceObj.getString("billCreateTime"), "yyyy-MM-dd HH:mm:ss");
+                    String salerName = invoiceObj.getString("salerName");//销方名称
+                    String salerTaxNo = invoiceObj.getString("salerTaxNo");//销方税号
+                    String buyerName = invoiceObj.getString("buyerName");//购方名称
+                    String buyerTaxNo = invoiceObj.getString("buyerTaxNo");//购方税号
+                    DynamicObject invoiceTypeInfo = CommonHelperUtils.queryBaseDynamicObject("er_invoicetype", "number", invoiceObj.getString("invoiceType"));
+                    BigDecimal taxAmountTotal = CommonHelperUtils.getBigDecimal(invoiceObj.getBigDecimal("totalTaxAmount"));//税额
+                    BigDecimal totalamount = CommonHelperUtils.getBigDecimal(invoiceObj.getBigDecimal("totalAmount"));//价税合计
+                    BigDecimal invoiceAmount = CommonHelperUtils.getBigDecimal(invoiceObj.getBigDecimal("invoiceAmount"));//不含税金额
+
+                    DynamicObject salerInfo = CommonHelperUtils.queryBaseDynamicObject("bd_supplier", "societycreditcode", salerTaxNo);
+                    if(salerInfo == null){
+                        returnMessage = "供应商(" + salerTaxNo + ")在星瀚系统中未匹配到数据!";
+                        return buildReturnData(code, srmBillNo, returnMessage, null, null, null);
+                    }
+
+                    DynamicObject buyer = BusinessDataServiceHelper.loadSingle("bdm_enterprise_baseinfo", (new QFilter("number", QCP.equals, buyerTaxNo)).toArray());
+
 
+                    if(buyer == null){
+                        returnMessage = "购方税号(" + buyerTaxNo + ")在星瀚系统中未匹配到企业信息!";
+                        return buildReturnData(code, srmBillNo, returnMessage, null, null, null);
+                    }
+
+                    entry.set("invoicetype", invoiceObj.getString("invoiceType"));//发票类型
+                    entry.set("invoiceno", invoiceObj.getString("invoiceNo"));//发票号
+                    entry.set("invoicecode", invoiceObj.getString("invoiceNo"));//发票代码
+                    entry.set("serialno", invoiceObj.getString("serialNo"));//发票流水号
+                    entry.set("invoicedate", invoiceDate);//开票日期
+                    entry.set("invexchangerate", "1");//汇率
+                    entry.set("invexpquotetype", "0");//换算方式
+                    entry.set("totalamount", totalamount);//价税合计
+                    entry.set("currtotalamount", totalamount);//价税合计本位币
+//                    entry.set("taxdetails", "");//多税率信息
+                    entry.set("taxamount_invoice", taxAmountTotal);//税额
+                    entry.set("invoicenotaxamount", invoiceAmount);//不含税金额
+                    entry.set("validatemessage", invoiceObj.getString("validateMessage"));//发票校验结果
+                    entry.set("ie_validatest", invoiceObj.getString("checkStatus"));//查验状态
+                    entry.set("invoiceischange", "1");//已修改
+                    entry.set("sequencenum", "2");//连号
+                    entry.set("billcreatetime", billCreateTime);//采集时间
+                    entry.set("buyerorgname", buyerName);//收票公司
+                    entry.set("buyertaxno", buyerTaxNo);//收票方税号
+                    entry.set("makeoutcompname", salerName);//开票公司
+                    entry.set("salertaxno_h", salerTaxNo);//开票方税号
+                    entry.set("count", 1);//发票张数
+                    entry.set("invoicefrom", "1");//发票来源
+                    entry.set("ismapexpense", "1");//关联费用明细
+                    entry.set("offset_invoice", invoiceObj.getString("deductionFlag"));//可抵扣
+                    entry.set("offsetamount", CommonHelperUtils.getBigDecimal(invoiceObj.getString("effectiveTaxAmount")));//可抵扣税额
+                    entry.set("buyerorg", buyer.getDynamicObject("org"));//购方组织
+                    entry.set("sellerorg", salerInfo);//销方供应商
+                    entry.set("issupplement", "0");//后补发票
+                    entry.set("passverifybuyername", "1");//发票抬头一致
+                    entry.set("passverifybuyertaxno", "1");//发票税号一致
+                    entry.set("personalinvoice", "0");//个人发票
+                    entry.set("isred", invoiceObj.getString("type"));//红字发票
+                    entry.set("invoicecurrency", 1L);//发票币种
+                    entry.set("invoicebuyeraddressphone", invoiceObj.getString("buyerAddressPhone"));
+                    entry.set("oribalanceamount", CommonHelperUtils.getBigDecimal(invoiceObj.getBigDecimal("totalAmount")));//账单余额
+                    entry.set("poolreimburseamount", CommonHelperUtils.getBigDecimal(invoiceObj.getBigDecimal("totalAmount")));//本次报销金额
+                    entry.set("transportnote", "0");//运输票据
+
+                    String invoiceGoodsName = "";
+                    List<String> invoiceGoodsCode = new ArrayList<>();
+                    BigDecimal taxRate = BigDecimal.ZERO;
+                    BigDecimal taxRate100 = BigDecimal.ZERO;
+                    JSONArray itemArray = invoiceObj.getJSONArray("items");
+
+                    if(itemArray != null && itemArray.size() > 0) {
+                        DynamicObjectCollection invoiceitementry  = bizAcctOutBill.getDynamicObjectCollection("invoiceitementry");
+                        DynamicObjectType itemType = invoiceitementry.getDynamicObjectType();
+
+                        for (int k = 0; k < itemArray.size(); k++) {
+                            //发票明细
+                            JSONObject itemObj = itemArray.getJSONObject(k);
+
+                            String goodsCode = itemObj.getString("goodsCode");//商品编码
+
+                            DynamicObject goodsCodeInfo = CommonHelperUtils.queryBaseDynamicObject("er_taxclasscode", "mergecode", goodsCode);
+
+                            String goodsName = itemObj.getString("goodsName");//商品名称
+                            String specModel = itemObj.getString("specModel");//规格型号
+                            String unit = itemObj.getString("unit");//单位
+                            BigDecimal unitPrice = CommonHelperUtils.getBigDecimal(itemObj.getString("unitPrice"));//单价
+                            BigDecimal num = CommonHelperUtils.getBigDecimal(itemObj.getString("num"));//数量
+                            BigDecimal taxAmountItem = CommonHelperUtils.getBigDecimal(itemObj.getString("taxAmount"));//税额
+                            taxRate = CommonHelperUtils.getBigDecimal(itemObj.getString("taxRate"));
+                            taxRate100 = taxRate.multiply(new BigDecimal("100"));//税率
+                            BigDecimal detailAmount = CommonHelperUtils.getBigDecimal(itemObj.getString("detailAmount"));//明细金额
+
+                            invoiceGoodsName += (invoiceGoodsName.length() > 0 ? "," : "") + goodsName;
+
+                            if(goodsCodeInfo != null && !invoiceGoodsCode.contains(goodsCodeInfo.getString("name"))){
+                                invoiceGoodsCode.add(goodsCodeInfo.getString("name"));
+                            }
+
+                            DynamicObject itemEntry = new DynamicObject(itemType);
+
+                            itemEntry.set("seq", (k+1));//序号
+                            itemEntry.set("itementryid", itemEntryId);//费用项目分录id
+                            itemEntry.set("invoiceheadentryid", invoiceEntryId);//费用项目分录id
+                            itemEntry.set("invoicetype_item", invoiceTypeInfo);//发票类型
+                            itemEntry.set("invoiceno_item", fpNumber);//发票号码
+                            itemEntry.set("invoicedate_item", invoiceDate);//开票日期
+                            itemEntry.set("invoicecurrency_item", 1L);//发票币种
+                            itemEntry.set("unit", unit);//单位
+                            itemEntry.set("num", num);//数量
+                            itemEntry.set("unitprice", unitPrice.setScale(2, BigDecimal.ROUND_HALF_UP));//不含税单价
+                            itemEntry.set("excludeamount", detailAmount);//不含税金额
+                            itemEntry.set("invoiceitemtaxrate", taxRate);//税率
+                            itemEntry.set("invoiceitemtaxamout", taxAmountItem);//税额
+                            itemEntry.set("totalamount_item", totalamount);//价税合计
+//                            itemEntry.set("invoicetaxrate_item", "");//单头税率
+                            itemEntry.set("invoicetaxamount_item", taxAmountTotal);//单头税额
+                            itemEntry.set("specmodel", specModel);//规格型号
+                            itemEntry.set("goodscode", goodsCode);//税收分类编码
+                            itemEntry.set("goodsname", goodsName);//商品名称
+                            itemEntry.set("invoicefrom1", "1");//发票来源
+                            itemEntry.set("invoiceitemoffset", invoiceObj.getString("deductionFlag"));//可抵扣
+                            itemEntry.set("invoicecloudoffset", "1");//发票抵扣
+                            itemEntry.set("salertaxno", salerTaxNo);//开票方税号
+                            itemEntry.set("invoiceitemisunbind", "0");//解绑
+                            itemEntry.set("invoiceitemserialno", serialNo);//发票序列号
+
+                            //发票信息分录的部分字段取发票明细的第一条记录
+                            if(k == 0){
+                                entry.set("unit_h", unit);//单位
+                                entry.set("alltaxrate", taxRate100);//税率
+                                entry.set("num_h", num);//数量
+                                entry.set("unitprice_h", unitPrice.setScale(2, BigDecimal.ROUND_HALF_UP));//单价
+
+                                DynamicObjectCollection expenseEntrys = bizAcctOutBill.getDynamicObjectCollection("expenseentryentity");
+                                expenseEntrys.get(0).set("invoiceno_entry", invoiceObj.getString("invoiceNo"));
+                                expenseEntrys.get(0).set("expensegoodsname", goodsName);
+                            }
+
+                            invoiceitementry.add(itemEntry);
+                        }
+
+                        bizAcctOutBill.set("invoiceitementry", invoiceitementry);
+
+                        if(invoiceGoodsName.length() > 200){
+                            invoiceGoodsName = invoiceGoodsName.substring(0, 200) + "...";
+                        }
+                        String invoiceGoodsCodeString = String.join(",", invoiceGoodsCode);
+                        if(invoiceGoodsCodeString.length() > 200){
+                            invoiceGoodsCodeString = invoiceGoodsCodeString.substring(0, 200) + "...";
+                        }
+
+                        entry.set("invoicegoodsname", invoiceGoodsName);//商品名称
+                        entry.set("invoicealltaxcode", invoiceGoodsCodeString);//税收分类编码
+                    }
+                }
+            }
             invoiceEntry.add(entry);
         }
         bizAcctOutBill.set("invoiceentry", invoiceEntry);
 
         try {
-
-
             //新增保存供应商对象
             OperationResult resultSave = SaveServiceHelper.saveOperate(ENTITY_PUBLICPAY, new DynamicObject[]{bizAcctOutBill}, OperateOption.create());
 

+ 29 - 19
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/task/SyncUtil.java

@@ -375,14 +375,12 @@ public class SyncUtil {
         sb.append("             r.fnumber EMP_B_PERS_PROPERTY, \n");
         //性别
         sb.append("             case when sex.fid = '1010' then 1 when sex.fid = '1020' then 2 else 0 end EMP_B_GENDER,\n");
-        // TODO 离退休日期 离职单审批日期
         //所属公司
         sb.append("             '上海济煜' EMP_W_COM,\n");
         // 手机号码,实际转正日期
         sb.append("             substring(e.fphone,5,15) EMP_B_MOBI_PHNUM,to_char(h.frealregulardate,'yyyy-MM-dd') EMP_W_OBTA_DATE,\n");
         // 用人单位编码,职级
-        // TODO sb.append("             q.fnumber EMP_B_BELONG_LEGAL, p.fnumber EMP_B_RANK, \n");
-        sb.append("             '1054' EMP_B_BELONG_LEGAL, p.fnumber EMP_B_RANK, \n");
+        sb.append("             case when w.fnumber is null then q.fnumber else w.fnumber end EMP_B_BELONG_LEGAL, p.fnumber EMP_B_RANK, \n");
         sb.append("             to_char(person.fmodifytime,'yyyy-MM-dd hh24:mi:ss') EMP_B_LAST_UPTIME, \n");
         // 邮箱,生日,办公地点
         sb.append("             e.fbusemail EMP_B_EMAIL,to_char(b.fbirthday,'yyyy-MM-dd') EMP_B_DATE_BIRTH,wp.fname EMP_B_WORKSPACE,\n");
@@ -390,42 +388,54 @@ public class SyncUtil {
         sb.append("             g.fnumber EMP_B_IDNUMBER, n.fk_nckd_mdmkey EMP_B_RELA_STATUS, nation.fk_nckd_mdmkey EMP_B_NATIONALITY, \n");
         // 在职状态
         sb.append("             s.fk_nckd_mdmkey EMP_W_WORKSTATE, \n");
+        // 退休日期
+        sb.append("             to_char(i1.fcontractenddate,'yyyy-MM-dd') EMP_W_RETIRDATE, \n");
         // 离职单相关信息
         sb.append("             j.fbillno EMP_W_RESIGNNUMBER,\n");
         sb.append("             to_char(i.fcontractenddate,'yyyy-MM-dd') EMP_W_RESIGNBIZDATE,\n");
+        sb.append("             to_char(i.fcontractenddate,'yyyy-MM-dd') EMP_W_TERMDATE,\n");
         sb.append("             to_char(j.fcreatetime,'yyyy-MM-dd') EMP_W_RESIGNCREATEDATE,\n");
         sb.append("             case when k.fjoincomdate is null then '2025-04-01' else to_char(k.fjoincomdate,'yyyy-MM-dd') end EMP_W_ENTRY_DATE,\n");
         // TODO 现居住地
         sb.append("             case when b.fk_nckd_isgbqs = '1' then '是' else '否' end EMP_B_RELAT_CADRES, \n");
-        sb.append("             d.fnativeplace EMP_B_NATIVE_PLACE ,g1.fnumber EMP_B_PASSPORT,l.fk_nckd_mdmkey EMP_B_NATIONAL \n");
+        sb.append("             d.fnativeplace EMP_B_NATIVE_PLACE ,g1.fnumber EMP_B_PASSPORT,l.fk_nckd_mdmkey EMP_B_NATIONAL, \n");
+        sb.append("             case when a.fdatastatus = '-2' then '是' else '否' end EMP_B_DELE_LOGO, \n");
+        sb.append("             u.fbillno EMP_W_EMPLOYNUMBER \n");
         sb.append(" from t_hrpi_ermanfile person\n");
-        sb.append(" left join t_hrpi_person a on a.fid = person.fpersonid and a.fiscurrentversion = '1'     -- 人员主表\n");
-        sb.append(" left join t_hrpi_pernontsprop b on a.fid = b.fpersonid and b.fiscurrentversion = '1'    -- 非时序\n");
-        sb.append(" left join t_hrpi_pertsprop c on a.fid = c.fpersonid and c.fiscurrentversion = '1'            -- 时序\n");
-        sb.append(" left join t_hrpi_perregion d on a.fid = d.fpersonid and d.fiscurrentversion = '1'         -- 区域信息\n");
-        sb.append(" left join t_hrpi_percontact e on a.fid = e.fpersonid and e.fiscurrentversion = '1'       -- 联系方式\n");
-        sb.append(" inner join t_hrpi_empposorgrel f on f.fid = person.fempposrelid and f.fiscurrentversion = '1' and f.fisprimary = '1'   -- 任职经历\n");
-        sb.append(" left join t_hrpi_percre g on a.fid = g.fpersonid and g.fiscurrentversion = '1' and g.fcredentialstypeid = '1010'                    -- 证件信息 身份证\n");
-        sb.append(" left join t_hrpi_percre g1 on a.fid = g1.fpersonid and g1.fiscurrentversion = '1' and g1.fcredentialstypeid = '1020'           -- 证件信息 护照\n");
-        sb.append(" left join t_hrpi_trialperiod h on a.fid = h.fpersonid and h.fiscurrentversion = '1'        -- 试用期\n");
+        sb.append(" left join t_hrpi_person a on a.fid = person.fpersonid and a.fiscurrentversion = '1' and a.fdatastatus = '1'    -- 人员主表\n");
+        sb.append(" left join t_hrpi_pernontsprop b on a.fid = b.fpersonid and b.fiscurrentversion = '1' and b.fdatastatus = '1'   -- 非时序\n");
+        sb.append(" left join t_hrpi_pertsprop c on a.fid = c.fpersonid and c.fiscurrentversion = '1' and c.fdatastatus = '1'           -- 时序\n");
+        sb.append(" left join t_hrpi_perregion d on a.fid = d.fpersonid and d.fiscurrentversion = '1' and d.fdatastatus = '1'        -- 区域信息\n");
+        sb.append(" left join t_hrpi_percontact e on a.fid = e.fpersonid and e.fiscurrentversion = '1' and e.fdatastatus = '1'      -- 联系方式\n");
+        sb.append(" inner join t_hrpi_empposorgrel f on f.fid = person.fempposrelid and f.fiscurrentversion = '1' and f.fisprimary = '1' and f.fdatastatus = '1'  -- 任职经历\n");
+        sb.append(" left join t_hrpi_percre g on a.fid = g.fpersonid and g.fiscurrentversion = '1' and g.fcredentialstypeid = '1010' and g.fdatastatus = '1' -- 证件信息 身份证\n");
+        sb.append(" left join t_hrpi_percre g1 on a.fid = g1.fpersonid and g1.fiscurrentversion = '1' and g1.fcredentialstypeid = '1020' and g1.fdatastatus = '1' -- 证件信息 护照\n");
+        sb.append(" left join t_hrpi_trialperiod h on a.fid = h.fpersonid and h.fiscurrentversion = '1' and h.fdatastatus = '1'      -- 试用期\n");
         sb.append(" left join t_haos_adminorg org on org.fid = f.fadminorgid                                             -- 所属部门\n");
         sb.append(" left join t_hbpm_position pos on pos.fid = f.fpositionid                                               -- 岗位\n");
         sb.append(" left join t_hbpm_position pos1 on pos1.fid = pos.fparentid                                          -- 上级岗位\n");
         sb.append(" left join t_hbss_sex sex on sex.fid = b.fgenderid                                                            -- 性别\n");
-        sb.append(" left join t_hrpi_baselocation t on t.fpersonid = a.fid and t.fiscurrentversion = '1' and t.fbusinessstatus = '1'  -- 常驻工作地\n ");
+        sb.append(" left join t_hrpi_baselocation t on t.fpersonid = a.fid and t.fiscurrentversion = '1' and t.fbusinessstatus = '1' and t.fdatastatus = '1'  -- 常驻工作地\n ");
         sb.append(" left join t_hbss_workplace wp on wp.fid = t.flocationId                                           -- 工作地点\n");
         sb.append(" left join t_hbss_nationality nation on nation.fid = b.fnationalityid                              -- 国籍\n");
-        sb.append(" left join t_htm_quitfileinfo i on i.femployeeid = f.femployeeid                                       -- 离职档案\n");
-        sb.append(" left join t_htm_quitapplybill j on j.fid = i.fquitapplyid                                                    -- 离职办理单\n");
-        sb.append(" left join t_hrpi_perserlen k on a.fid = k.fpersonid and k.fiscurrentversion = '1'         -- 服务年限\n");
+        sb.append(" left join t_htm_quitfileinfo i on i.femployeeid = f.femployeeid and i.fquittypeid <> '1245492024325465088'  -- 离职档案 非退休 \n");
+        sb.append(" left join t_htm_quitfileinfo i1 on i1.femployeeid = f.femployeeid and i1.fquittypeid = '1245492024325465088'  -- 离职档案 退休 \n");
+        sb.append(" left join t_htm_quitapplybill j on j.fid = i.fquitapplyid      -- 离职办理单 非退休 \n");
+        sb.append(" left join t_htm_quitapplybill j1 on j1.fid = i1.fquitapplyid   -- 离职办理单 退休 \n");
+        sb.append(" left join t_hrpi_perserlen k on a.fid = k.fpersonid and k.fiscurrentversion = '1' and k.fdatastatus = '1' -- 服务年限\n");
         sb.append(" left join t_hbss_flok l on l.fid = b.ffolkid                                                                          -- 民族\n");
-        sb.append(" left join t_hrpi_empentrel m on m.fid = person.fempentrelid                                      -- 职业信息\n");
+        sb.append(" left join t_hrpi_empentrel m on m.fid = person.fempentrelid and m.fdatastatus = '1' -- 职业信息\n");
         sb.append(" left join t_hbss_laborrelstatus n on n.fid = m.flaborrelstatusid                                  -- 用工关系状态\n");
-        sb.append(" left join t_hrpi_empjobrel o on a.fid = o.fpersonid and o.fiscurrentversion  = '1' and o.fbusinessstatus = '1'    -- 职级职等 \n");
+        sb.append(" left join t_hrpi_empjobrel o on a.fid = o.fpersonid and o.fiscurrentversion = '1' and o.fbusinessstatus = '1' and o.fdatastatus = '1'   -- 职级职等 \n");
         sb.append(" left join t_hbjm_joblevel p on p.fjoblevelid = o.fjoblevelid  -- 职级 \n");
         sb.append(" left join t_hbss_enterprise q on q.fid = m.fenterpriseid   -- 用人单位 \n");
         sb.append(" left join tk_nckd_personproperty r on r.fid = b.fk_nckd_personproperty -- 个人性质 \n");
         sb.append(" left join t_hbss_labrelstatuscls s on s.fid = n.flabrelstatusclsid -- 用工状态分类 \n");
+        sb.append(" left join ( select row_number() over (partition by u1.femployeeno order by u2.feffectdate desc) r, u2.fbillno, u1.femployeeNo \n");
+        sb.append("             from t_hom_onbrdbill u1 left join t_hom_onbrdbill_a u2 on u1.fid = u2.fid) u on u.femployeeno = a.fnumber and u.r = 1 -- 入职信息 \n");
+        sb.append(" left join ( select row_number() over (partition by fermanfileid order by fmodifytime desc) r, fermanfileid, fsigncompanyid, fnumber \n");
+        sb.append("             from t_hlcm_contract where fiscurrentversion = '1' ) v on v.fermanfileid = person.fid and v.r = 1  -- 劳动合同档案\n");
+        sb.append(" left join t_hbss_signcompany w on w.fid = v.fsigncompanyid  -- 聘用单位 \n");
         sb.append(" where person.fiscurrentversion = '1' \n");
         sb.append("   and person.fbusinessstatus = '1' \n");
         return sb;