|
@@ -17,6 +17,7 @@ import com.malk.service.aliwork.YDClient;
|
|
|
import com.malk.utils.PublicUtil;
|
|
import com.malk.utils.PublicUtil;
|
|
|
import com.malk.utils.UtilMap;
|
|
import com.malk.utils.UtilMap;
|
|
|
import com.malk.zhiwei.config.KDWebApiConf;
|
|
import com.malk.zhiwei.config.KDWebApiConf;
|
|
|
|
|
+import com.malk.zhiwei.entity.BillQuery;
|
|
|
import com.malk.zhiwei.entity.CustomerModel;
|
|
import com.malk.zhiwei.entity.CustomerModel;
|
|
|
import com.malk.zhiwei.entity.FNumber;
|
|
import com.malk.zhiwei.entity.FNumber;
|
|
|
import com.malk.zhiwei.service.ZwService;
|
|
import com.malk.zhiwei.service.ZwService;
|
|
@@ -223,7 +224,7 @@ public class ZwServiceImpl implements ZwService {
|
|
|
FNumber xsbm = new FNumber(data.get("textField_mnfujcac").toString());//销售部门
|
|
FNumber xsbm = new FNumber(data.get("textField_mnfujcac").toString());//销售部门
|
|
|
FNumber xsy = new FNumber(data.get("textField_mnfujcad").toString());//销售员
|
|
FNumber xsy = new FNumber(data.get("textField_mnfujcad").toString());//销售员
|
|
|
String kh = data.get("textField_lqanqe6j").toString();// 客户
|
|
String kh = data.get("textField_lqanqe6j").toString();// 客户
|
|
|
- Object empObj = data.get("employeeField_mnft99uj");
|
|
|
|
|
|
|
+ Object empObj = data.get("employeeField_lqanqe6n");
|
|
|
String ywy = "";//业务员
|
|
String ywy = "";//业务员
|
|
|
if (empObj instanceof JSONArray) {
|
|
if (empObj instanceof JSONArray) {
|
|
|
JSONArray empArray = (JSONArray) empObj;
|
|
JSONArray empArray = (JSONArray) empObj;
|
|
@@ -238,6 +239,643 @@ public class ZwServiceImpl implements ZwService {
|
|
|
return saveToAudit("BD_Customer", customerModel);
|
|
return saveToAudit("BD_Customer", customerModel);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ @SneakyThrows
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void product() {
|
|
|
|
|
+ K3CloudApi client = new K3CloudApi(initIden());
|
|
|
|
|
+ int startRow = 0;
|
|
|
|
|
+ int limit = 2000;
|
|
|
|
|
+ BillQuery billQuery = new BillQuery();
|
|
|
|
|
+ billQuery.setFormId("BD_MATERIAL");//产品信息
|
|
|
|
|
+ //编码 名称 规格型号 旧物料编码 物料分组 物料属性 基本单位 长 宽 高 体积 面积 密度 标准工时
|
|
|
|
|
+ billQuery.setFieldKeys("FNumber,FName,FSpecification,FOldNumber,FMaterialGroup,FErpClsID,FBaseUnitId,FLENGTH,FWIDTH,FHEIGHT,FVOLUME,F_UNW_Qty_r03,F_UNW_Qty_6yt,FPerUnitStandHour");
|
|
|
|
|
+ List<Map> filterString = new ArrayList<>();
|
|
|
|
|
+ filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",1,"","","0"));//审核日期在今天之前N天以后
|
|
|
|
|
+ billQuery.setFilterString(filterString);
|
|
|
|
|
+ billQuery.setLimit(limit);
|
|
|
|
|
+ billQuery.setStartRow(startRow);
|
|
|
|
|
+ String result=client.billQuery(JSONObject.toJSONString(billQuery));
|
|
|
|
|
+ JSONArray jsonArray = JSONArray.parseArray(result);
|
|
|
|
|
+ // 遍历每条物料记录
|
|
|
|
|
+ for (int i = 0; i < jsonArray.size(); i++) {
|
|
|
|
|
+ JSONObject item = jsonArray.getJSONObject(i);
|
|
|
|
|
+
|
|
|
|
|
+ // 取出各个字段(注意类型转换)
|
|
|
|
|
+ String number = item.getString("FNumber");
|
|
|
|
|
+ String name = item.getString("FName");
|
|
|
|
|
+ String spec = item.getString("FSpecification");
|
|
|
|
|
+ String oldNumber = item.getString("FOldNumber");
|
|
|
|
|
+ Integer materialGroup = item.getInteger("FMaterialGroup");
|
|
|
|
|
+ String erpClsId = item.getString("FErpClsID");
|
|
|
|
|
+ Integer baseUnitId = item.getInteger("FBaseUnitId");
|
|
|
|
|
+ Double length = item.getDouble("FLENGTH");
|
|
|
|
|
+ Double width = item.getDouble("FWIDTH");
|
|
|
|
|
+ Double height = item.getDouble("FHEIGHT");
|
|
|
|
|
+ Double volume = item.getDouble("FVOLUME");
|
|
|
|
|
+ Double area = item.getDouble("F_UNW_Qty_r03");
|
|
|
|
|
+ Double density = item.getDouble("F_UNW_Qty_6yt");
|
|
|
|
|
+ Double standHour = item.getDouble("FPerUnitStandHour");
|
|
|
|
|
+ //TODO:向宜搭插入数据
|
|
|
|
|
+ String sc = "textField_l43jpnsf, textField_mcijetil, textField_l43jpnsh, textField_mnhe1ryw, textField_mnhe1rz1, textField_mnhe1rz2, textField_mnhe1rz7, textField_mnhe1rzm," +
|
|
|
|
|
+ " textField_mnhe1rzg, textField_mnhe1rzh, textField_mnhe1rzi, textField_mnhe1rzj, textField_mnhe1rzk, textField_mnhe1rzl";//名称 编码 规格 旧编码 物料分组 物料属性 基本单位 标准工时 长 宽 高 体积 面积 密度
|
|
|
|
|
+ List<Map> conditions = Arrays.asList( YDConf.searchCondition_TextFiled("textField_mcijetil", number, "eq"));
|
|
|
|
|
+ Map formData = UtilMap.map(sc,name,number,spec,oldNumber,materialGroup,erpClsId,baseUnitId,length,width,height,volume,area,density,standHour);
|
|
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
|
|
+ .formUuid("FORM-4A7B1A62CCFC4D758AB98ADE3F97D40COYO2")
|
|
|
|
|
+ .searchCondition(JSONObject.toJSONString(conditions))
|
|
|
|
|
+ .formDataJson(JSONObject.toJSONString(formData))
|
|
|
|
|
+ .build(),YDConf.FORM_OPERATION.upsert);
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ log.info("产品信息已同步");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @SneakyThrows
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void purchaseOrder(){
|
|
|
|
|
+ K3CloudApi client = new K3CloudApi(initIden());
|
|
|
|
|
+ int startRow = 0;
|
|
|
|
|
+ int limit = 2000;
|
|
|
|
|
+ BillQuery billQuery = new BillQuery();
|
|
|
|
|
+ billQuery.setFormId("SAL_SaleOrder");//销售订单
|
|
|
|
|
+ //[主表] FSaleOrgId销售组织 FSaleDeptId销售部门 FBillNo单据编号 FCustId客户 F_UNW_Text_ct1客户订单号 FSettleCurrId结算币别 FSalerId销售员 FDate日期 FRecConditionId收款条件
|
|
|
|
|
+ //[明细表] FMaterialId物料编码 FMaterialName物料名称 FMaterialModel规格型号 FMapId客户物料编码 F_UNW_BaseProperty_uow客户物料规格 FUnitID销售单位 FQty销售数量 FPriceUnitQty计价数量 FPrice单价 FTaxPrice含税单价 FEntryTaxRate税率 FEntryTaxAmount税额 FAmount金额 FAllAmount价税合计 FDeliveryDate要货日期 FSettleOrgIds结算组织 FIsFree是否赠品
|
|
|
|
|
+ billQuery.setFieldKeys("FSaleOrgId.FName,FSaleDeptId.FName,FBillNo,FCustId.FName,F_UNW_Text_ct1,FSettleCurrId.FName,FSalerId.FName,FDate,FRecConditionId.FName,FMaterialId.FNumber,FMaterialName,FMaterialModel,FMapId.FNumber,F_UNW_BaseProperty_uow,FUnitID.FName,FQty,FPriceUnitQty,FPrice,FTaxPrice,FEntryTaxRate,FEntryTaxAmount,FAmount,FAllAmount,FDeliveryDate,FSettleOrgIds.FName,FIsFree");
|
|
|
|
|
+ List<Map> filterString = new ArrayList<>();
|
|
|
|
|
+ filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",1,"","","0"));//审核日期在今天之前N天以后
|
|
|
|
|
+ billQuery.setFilterString(filterString);
|
|
|
|
|
+ billQuery.setLimit(limit);
|
|
|
|
|
+ billQuery.setStartRow(startRow);
|
|
|
|
|
+ String result=client.billQuery(JSONObject.toJSONString(billQuery));
|
|
|
|
|
+ JSONArray jsonArray = JSONArray.parseArray(result);
|
|
|
|
|
+
|
|
|
|
|
+ // 按 FBillNo 分组
|
|
|
|
|
+ Map<String, List<JSONObject>> groupMap = new LinkedHashMap<>();
|
|
|
|
|
+ for (int i = 0; i < jsonArray.size(); i++) {
|
|
|
|
|
+ JSONObject item = jsonArray.getJSONObject(i);
|
|
|
|
|
+ String billNo = item.getString("FBillNo");
|
|
|
|
|
+ groupMap.computeIfAbsent(billNo, k -> new ArrayList<>()).add(item);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 组装最终结果
|
|
|
|
|
+ List<Map<String, Object>> orderList = new ArrayList<>();
|
|
|
|
|
+ for (Map.Entry<String, List<JSONObject>> entry : groupMap.entrySet()) {
|
|
|
|
|
+ List<JSONObject> rows = entry.getValue();
|
|
|
|
|
+ JSONObject firstRow = rows.get(0);
|
|
|
|
|
+
|
|
|
|
|
+ // 主表 Map
|
|
|
|
|
+ Map<String, Object> orderMap = new LinkedHashMap<>();
|
|
|
|
|
+ orderMap.put("textField_mniksrqa", firstRow.getString("FBillNo"));//单据编号
|
|
|
|
|
+ orderMap.put("textField_mniksrq4", firstRow.getString("FSaleOrgId.FName")); // 销售组织
|
|
|
|
|
+ orderMap.put("textField_mniksrq5", firstRow.getString("FSaleDeptId.FName")); // 销售组织
|
|
|
|
|
+ orderMap.put("textField_mniksrqb", firstRow.getString("FCustId.FName")); // 客户
|
|
|
|
|
+ orderMap.put("textField_mniksrqe", firstRow.getString("F_UNW_Text_ct1")); // 客户订单号
|
|
|
|
|
+ orderMap.put("textField_mniksrqf", firstRow.getString("FSettleCurrId.FName")); // 结算币别
|
|
|
|
|
+ orderMap.put("textField_mniksrqk", firstRow.getString("FSalerId.FName")); // 销售员
|
|
|
|
|
+ String fDateRaw = firstRow.getString("FDate");
|
|
|
|
|
+ String formattedDate = (fDateRaw != null && fDateRaw.contains("T")) ? fDateRaw.split("T")[0] : fDateRaw;
|
|
|
|
|
+ orderMap.put("textField_mniksrql", formattedDate); // 日期
|
|
|
|
|
+ orderMap.put("textField_mniksrqm", firstRow.getString("FRecConditionId.FName")); // 收款条件
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ // 明细数组
|
|
|
|
|
+ List<Map<String, Object>> details = new ArrayList<>();
|
|
|
|
|
+ for (JSONObject row : rows) {
|
|
|
|
|
+ Map<String, Object> detailMap = new LinkedHashMap<>();
|
|
|
|
|
+ detailMap.put("textField_mniksrqo", row.getString("FMaterialId.FNumber"));//物料编码
|
|
|
|
|
+ detailMap.put("textField_mniksrqp", row.getString("FMaterialName"));//物料名称
|
|
|
|
|
+ detailMap.put("textField_mniksrqq", row.getString("FMaterialModel"));//规格型号
|
|
|
|
|
+ detailMap.put("textField_mniksrqr", row.getString("FMapId.FNumber"));//客户物料编码
|
|
|
|
|
+ detailMap.put("textField_mniksrqs", row.getString("F_UNW_BaseProperty_uow"));//客户物料规格
|
|
|
|
|
+ detailMap.put("textField_mniksrqt", row.getString("FUnitID.FName"));//销售单位
|
|
|
|
|
+ detailMap.put("numberField_mniksrqv", row.getString("FQty"));//销售数量
|
|
|
|
|
+ detailMap.put("numberField_mniksrqw", row.getString("FPriceUnitQty"));//计价数量
|
|
|
|
|
+ detailMap.put("numberField_mniksrqx", row.getString("FPrice"));//单价
|
|
|
|
|
+ detailMap.put("numberField_mniksrqy", row.getString("FTaxPrice"));//含税单价
|
|
|
|
|
+ detailMap.put("numberField_mniksrqz", row.getString("FEntryTaxRate"));//税率
|
|
|
|
|
+ detailMap.put("numberField_mniksrr0", row.getString("FEntryTaxAmount"));//税额
|
|
|
|
|
+ detailMap.put("numberField_mniksrr1", row.getString("FAmount"));//金额
|
|
|
|
|
+ detailMap.put("numberField_mniksrr2", row.getString("FAllAmount"));//价税合计
|
|
|
|
|
+ String deliveryRaw = row.getString("FDeliveryDate");
|
|
|
|
|
+ String formattedDelivery = (deliveryRaw != null && deliveryRaw.contains("T")) ? deliveryRaw.split("T")[0] : deliveryRaw;
|
|
|
|
|
+ detailMap.put("textField_mniksrr3", formattedDelivery);//要货日期
|
|
|
|
|
+ detailMap.put("textField_mniksrr4", row.getString("FSettleOrgIds.FName"));//结算组织
|
|
|
|
|
+ detailMap.put("radioField_mniksrr6", row.getString("FAmount").equals("true") ? "是" : "否");//是否赠品
|
|
|
|
|
+ details.add(detailMap);
|
|
|
|
|
+ }
|
|
|
|
|
+ orderMap.put("tableField_mniksrqn", details);
|
|
|
|
|
+
|
|
|
|
|
+ /*写入宜搭*/
|
|
|
|
|
+ List<Map> conditions = Arrays.asList( YDConf.searchCondition_TextFiled("textField_mniksrqa", firstRow.getString("FBillNo"), "eq"));
|
|
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
|
|
+ .formUuid("FORM-7B112A3733EC412FB27D56D8AC242E5BHIL4")
|
|
|
|
|
+ .searchCondition(JSONObject.toJSONString(conditions))
|
|
|
|
|
+ .formDataJson(JSONObject.toJSONString(orderMap))
|
|
|
|
|
+ .build(), YDConf.FORM_OPERATION.upsert).toString();
|
|
|
|
|
+ orderList.add(orderMap);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ log.info("销售订单已同步");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @SneakyThrows
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void deliveryOrder() throws JsonProcessingException {
|
|
|
|
|
+ K3CloudApi client = new K3CloudApi(initIden());
|
|
|
|
|
+ int startRow = 0;
|
|
|
|
|
+ int limit = 2000;
|
|
|
|
|
+ BillQuery billQuery = new BillQuery();
|
|
|
|
|
+ billQuery.setFormId("SAL_DELIVERYNOTICE");//发货通知单
|
|
|
|
|
+ //[主表] FBillNo单据编号 FDate日期 FSettleCurrId结算币别 FSaleOrgId销售组织 FSaleDeptId销售部门 FSalesManID销售员 F_UNW_Base_tr7发货客户 F_UNW_CheckBox_xjs是否委外
|
|
|
|
|
+ //[明细表] FCustMatName客户物料名称 FCustMatID客户物料编码 FMaterialID物料编码 F_UNW_BaseProperty_3tm客户物料规格型号 FMaterialName物料名称 FMateriaModel型号规格 FUnitID销售单位 FQty销售数量 FIsFree是否赠品 FDeliveryDate要货日期 FDeliveryLoc交货地点 F_UNW_Text_8dq客户订单号
|
|
|
|
|
+ billQuery.setFieldKeys("FBillNo,FDate,FSettleCurrId.FName,FSaleOrgId.FName,FSaleDeptId.FName,FSalesManID.FName,F_UNW_Base_tr7.FName,F_UNW_CheckBox_xjs,FCustMatName,FCustMatID.FNumber,FMaterialID.FNumber,F_UNW_BaseProperty_3tm,FMaterialName,FMateriaModel,FUnitID.FName,FQty,FIsFree,FDeliveryDate,FDeliveryLoc.FName,F_UNW_Text_8dq");
|
|
|
|
|
+ List<Map> filterString = new ArrayList<>();
|
|
|
|
|
+ filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",1,"","","0"));//审核日期在今天之前N天以后
|
|
|
|
|
+ billQuery.setFilterString(filterString);
|
|
|
|
|
+ billQuery.setLimit(limit);
|
|
|
|
|
+ billQuery.setStartRow(startRow);
|
|
|
|
|
+ String result=client.billQuery(JSONObject.toJSONString(billQuery));
|
|
|
|
|
+ JSONArray jsonArray = JSONArray.parseArray(result);
|
|
|
|
|
+
|
|
|
|
|
+ // 按 FBillNo 分组
|
|
|
|
|
+ Map<String, List<JSONObject>> groupMap = new LinkedHashMap<>();
|
|
|
|
|
+ for (int i = 0; i < jsonArray.size(); i++) {
|
|
|
|
|
+ JSONObject item = jsonArray.getJSONObject(i);
|
|
|
|
|
+ String billNo = item.getString("FBillNo");
|
|
|
|
|
+ groupMap.computeIfAbsent(billNo, k -> new ArrayList<>()).add(item);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 组装最终结果
|
|
|
|
|
+ List<Map<String, Object>> orderList = new ArrayList<>();
|
|
|
|
|
+ for (Map.Entry<String, List<JSONObject>> entry : groupMap.entrySet()) {
|
|
|
|
|
+ List<JSONObject> rows = entry.getValue();
|
|
|
|
|
+ JSONObject firstRow = rows.get(0);
|
|
|
|
|
+
|
|
|
|
|
+ // 主表 Map
|
|
|
|
|
+ Map<String, Object> orderMap = new LinkedHashMap<>();
|
|
|
|
|
+ orderMap.put("textField_mnj0cqqp", firstRow.getString("FBillNo"));//单据编号
|
|
|
|
|
+ String fDateRaw = firstRow.getString("FDate");
|
|
|
|
|
+ String formattedDate = (fDateRaw != null && fDateRaw.contains("T")) ? fDateRaw.split("T")[0] : fDateRaw;
|
|
|
|
|
+ orderMap.put("textField_mnj0cqqq", formattedDate); // 日期
|
|
|
|
|
+ orderMap.put("textField_mnj0cqqr", firstRow.getString("FSettleCurrId.FName")); // 结算币别
|
|
|
|
|
+ orderMap.put("textField_mnj0cqqw", firstRow.getString("FSaleOrgId.FName")); // 销售组织
|
|
|
|
|
+ orderMap.put("textField_mnj0cqqx", firstRow.getString("FSaleDeptId.FName")); // 销售部门
|
|
|
|
|
+ orderMap.put("textField_mnj0cqqy", firstRow.getString("FSalesManID.FName")); // 销售员
|
|
|
|
|
+ orderMap.put("textField_mnj0cqr3", firstRow.getString("F_UNW_Base_tr7.FName")); // 发货客户
|
|
|
|
|
+ orderMap.put("radioField_mnj0cqr4", firstRow.getString("F_UNW_CheckBox_xjs").equals("true") ? "是" : "否" ); // 是否委外
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ // 明细数组
|
|
|
|
|
+ List<Map<String, Object>> details = new ArrayList<>();
|
|
|
|
|
+ for (JSONObject row : rows) {
|
|
|
|
|
+ Map<String, Object> detailMap = new LinkedHashMap<>();
|
|
|
|
|
+ detailMap.put("textField_mnj0cqr6", row.getString("FCustMatName"));//客户物料名称
|
|
|
|
|
+ detailMap.put("textField_mnj0cqr7", row.getString("FCustMatID.FNumber"));//客户物料编码
|
|
|
|
|
+ detailMap.put("textField_mnj0cqr8", row.getString("FMaterialID.FNumber"));//物料编码
|
|
|
|
|
+ detailMap.put("textField_mnj0cqr9", row.getString("F_UNW_BaseProperty_3tm"));//客户物料规格型号
|
|
|
|
|
+ detailMap.put("textField_mnj0cqra", row.getString("FMaterialName"));//物料名称
|
|
|
|
|
+ detailMap.put("textField_mnj0cqrb", row.getString("FMateriaModel"));//规格型号
|
|
|
|
|
+ detailMap.put("textField_mnj0cqrc", row.getString("FUnitID.FName"));//销售单位
|
|
|
|
|
+ detailMap.put("numberField_mnj0cqrd", row.getString("FQty"));//销售数量
|
|
|
|
|
+ detailMap.put("radioField_mnj0cqre", row.getString("FIsFree").equals("true") ? "是" : "否");//是否赠品
|
|
|
|
|
+ String rawDeliveryDate = row.getString("FDeliveryDate");
|
|
|
|
|
+ String formattedDeliveryDate = rawDeliveryDate != null ? rawDeliveryDate.replace("T", " ") : null;
|
|
|
|
|
+ detailMap.put("textField_mnj0cqrf", formattedDeliveryDate);//要货日期
|
|
|
|
|
+ detailMap.put("textField_mnj0cqrg", row.getString("FDeliveryLoc.FName"));//交货地点
|
|
|
|
|
+ detailMap.put("textField_mnj0cqrh", row.getString("F_UNW_Text_8dq"));//客户订单号
|
|
|
|
|
+ details.add(detailMap);
|
|
|
|
|
+ }
|
|
|
|
|
+ orderMap.put("tableField_mnj0cqr5", details);
|
|
|
|
|
+
|
|
|
|
|
+ /*写入宜搭*/
|
|
|
|
|
+ List<Map> conditions = Arrays.asList( YDConf.searchCondition_TextFiled("textField_mnj0cqqp", firstRow.getString("FBillNo"), "eq"));
|
|
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
|
|
+ .formUuid("FORM-50CEB72455534364BF9A97C8A49A3A46TBLI")
|
|
|
|
|
+ .searchCondition(JSONObject.toJSONString(conditions))
|
|
|
|
|
+ .formDataJson(JSONObject.toJSONString(orderMap))
|
|
|
|
|
+ .build(), YDConf.FORM_OPERATION.upsert).toString();
|
|
|
|
|
+ orderList.add(orderMap);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ log.info("发货通知单已同步");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @SneakyThrows
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void returnForm() throws JsonProcessingException {
|
|
|
|
|
+ K3CloudApi client = new K3CloudApi(initIden());
|
|
|
|
|
+ int startRow = 0;
|
|
|
|
|
+ int limit = 2000;
|
|
|
|
|
+ BillQuery billQuery = new BillQuery();
|
|
|
|
|
+ billQuery.setFormId("SAL_RETURNSTOCK");//退货单
|
|
|
|
|
+ //[主表] FBillNo单据编号 FDate日期 FRetcustId退货客户 FSettleCurrId结算币别 FSaleOrgId销售组织 FSaledeptid销售部门 FSalesManId销售员
|
|
|
|
|
+ //[明细表] FMapId客户物料编码 FMapName客户物料名称 FMaterialId物料编码 FMaterialName物料名称 FMaterialModel型号规格 FF100001厚度 FSalUnitID销售单位 FSalUnitQty销售数量 FIsFree是否赠品 FDeliveryDate退货日期 FReturnType退货类型 FPrice单价 FTaxPrice含税单价 FNote备注
|
|
|
|
|
+ billQuery.setFieldKeys("FBillNo,FDate,FRetcustId.FName,FSettleCurrId.FName,FSaleOrgId.FName,FSaledeptid.FName,FSalesManId.FName,FMapId.FNumber,FMapName,FMaterialId.FNumber,FMaterialName,FMaterialModel,FAuxpropId.FF100001,FSalUnitID.FName,FSalUnitQty,FIsFree,FDeliveryDate,FReturnType.FDataValue,FPrice,FTaxPrice,FNote");
|
|
|
|
|
+ List<Map> filterString = new ArrayList<>();
|
|
|
|
|
+ filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",1,"","","0"));//审核日期在今天之前N天以后
|
|
|
|
|
+ billQuery.setFilterString(filterString);
|
|
|
|
|
+ billQuery.setLimit(limit);
|
|
|
|
|
+ billQuery.setStartRow(startRow);
|
|
|
|
|
+ String result=client.billQuery(JSONObject.toJSONString(billQuery));
|
|
|
|
|
+ JSONArray jsonArray = JSONArray.parseArray(result);
|
|
|
|
|
+
|
|
|
|
|
+ // 按 FBillNo 分组
|
|
|
|
|
+ Map<String, List<JSONObject>> groupMap = new LinkedHashMap<>();
|
|
|
|
|
+ for (int i = 0; i < jsonArray.size(); i++) {
|
|
|
|
|
+ JSONObject item = jsonArray.getJSONObject(i);
|
|
|
|
|
+ String billNo = item.getString("FBillNo");
|
|
|
|
|
+ groupMap.computeIfAbsent(billNo, k -> new ArrayList<>()).add(item);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 组装最终结果
|
|
|
|
|
+ List<Map<String, Object>> orderList = new ArrayList<>();
|
|
|
|
|
+ for (Map.Entry<String, List<JSONObject>> entry : groupMap.entrySet()) {
|
|
|
|
|
+ List<JSONObject> rows = entry.getValue();
|
|
|
|
|
+ JSONObject firstRow = rows.get(0);
|
|
|
|
|
+
|
|
|
|
|
+ // 主表 Map
|
|
|
|
|
+ Map<String, Object> orderMap = new LinkedHashMap<>();
|
|
|
|
|
+ orderMap.put("textField_mnmru1xp", firstRow.getString("FBillNo"));//单据编号
|
|
|
|
|
+ String fDateRaw = firstRow.getString("FDate");
|
|
|
|
|
+ String formattedDate = (fDateRaw != null && fDateRaw.contains("T")) ? fDateRaw.split("T")[0] : fDateRaw;
|
|
|
|
|
+ orderMap.put("textField_mnmru1xq", formattedDate); // 日期
|
|
|
|
|
+ orderMap.put("textField_mnmru1xr", firstRow.getString("FRetcustId.FName")); // 退货客户
|
|
|
|
|
+ orderMap.put("textField_mnmru1y0", firstRow.getString("FSettleCurrId.FName")); // 结算币别
|
|
|
|
|
+ orderMap.put("textField_mnmru1y1", firstRow.getString("FSaleOrgId.FName")); // 销售组织
|
|
|
|
|
+ orderMap.put("textField_mnmru1y2", firstRow.getString("FSaledeptid.FName")); // 销售部门
|
|
|
|
|
+ orderMap.put("textField_mnmru1y3", firstRow.getString("FSalesManId.FName")); // 销售员
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ // 明细数组
|
|
|
|
|
+ List<Map<String, Object>> details = new ArrayList<>();
|
|
|
|
|
+ for (JSONObject row : rows) {
|
|
|
|
|
+ Map<String, Object> detailMap = new LinkedHashMap<>();
|
|
|
|
|
+ detailMap.put("textField_mnmru1y9", row.getString("FMapId.FNumber"));//客户物料编码
|
|
|
|
|
+ detailMap.put("textField_mnmru1ya", row.getString("FMapName"));//客户物料名称
|
|
|
|
|
+ detailMap.put("textField_mnmru1yb", row.getString("FMaterialId.FNumber"));//物料编码
|
|
|
|
|
+ detailMap.put("textField_mnmru1yc", row.getString("FMaterialName"));//物料名称
|
|
|
|
|
+ detailMap.put("textField_mnmru1yd", row.getString("FMaterialModel"));//规格型号
|
|
|
|
|
+ detailMap.put("textField_mnmru1ye", row.getString("FAuxpropId.FF100001"));//厚度
|
|
|
|
|
+ detailMap.put("textField_mnmru1yf", row.getString("FSalUnitID.FName"));//销售单位
|
|
|
|
|
+ detailMap.put("numberField_mnmru1yg", row.getString("FSalUnitQty"));//销售数量
|
|
|
|
|
+ detailMap.put("radioField_mnmru1yh", row.getString("FIsFree").equals("true") ? "是" : "否");//是否赠品
|
|
|
|
|
+ String rawDeliveryDate = row.getString("FDeliveryDate");
|
|
|
|
|
+ String formattedDeliveryDate = rawDeliveryDate != null ? rawDeliveryDate.replace("T", " ") : null;
|
|
|
|
|
+ detailMap.put("textField_mnmru1yi", formattedDeliveryDate);//退货日期
|
|
|
|
|
+ detailMap.put("textField_mnmru1yj", row.getString("FReturnType.FDataValue"));//退货类型
|
|
|
|
|
+ detailMap.put("numberField_mnmru1yk", row.getString("FPrice"));//单价
|
|
|
|
|
+ detailMap.put("numberField_mnmru1yl", row.getString("FTaxPrice"));//含税单价
|
|
|
|
|
+ detailMap.put("textField_mnmru1ym", row.getString("FNote"));//备注
|
|
|
|
|
+ details.add(detailMap);
|
|
|
|
|
+ }
|
|
|
|
|
+ orderMap.put("tableField_mnmru1y8", details);
|
|
|
|
|
+
|
|
|
|
|
+ /*写入宜搭*/
|
|
|
|
|
+ List<Map> conditions = Arrays.asList( YDConf.searchCondition_TextFiled("textField_mnmru1xp", firstRow.getString("FBillNo"), "eq"));
|
|
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
|
|
+ .formUuid("FORM-48ADB8AA7FEF4821929BFE8FE5B623E42OKY")
|
|
|
|
|
+ .searchCondition(JSONObject.toJSONString(conditions))
|
|
|
|
|
+ .formDataJson(JSONObject.toJSONString(orderMap))
|
|
|
|
|
+ .build(), YDConf.FORM_OPERATION.upsert).toString();
|
|
|
|
|
+ orderList.add(orderMap);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ log.info("退货单已同步");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @SneakyThrows
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void replenishmentOrder() throws JsonProcessingException {
|
|
|
|
|
+ K3CloudApi client = new K3CloudApi(initIden());
|
|
|
|
|
+ int startRow = 0;
|
|
|
|
|
+ int limit = 2000;
|
|
|
|
|
+ BillQuery billQuery = new BillQuery();
|
|
|
|
|
+ billQuery.setFormId("SAL_SaleOrder"); // 销售订单
|
|
|
|
|
+ // 字段查询与销售订单一致,包含 FIsFree
|
|
|
|
|
+ billQuery.setFieldKeys("FSaleOrgId.FName,FSaleDeptId.FName,FBillNo,FCustId.FName,F_UNW_Text_ct1,FSettleCurrId.FName,FSalerId.FName,FDate,FRecConditionId.FName,FMaterialId.FNumber,FMaterialName,FMaterialModel,FMapId.FNumber,F_UNW_BaseProperty_uow,FUnitID.FName,FQty,FPriceUnitQty,FPrice,FTaxPrice,FEntryTaxRate,FEntryTaxAmount,FAmount,FAllAmount,FDeliveryDate,FSettleOrgIds.FName,FIsFree");
|
|
|
|
|
+ List<Map> filterString = new ArrayList<>();
|
|
|
|
|
+ filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic", "FApproveDate", "265", 1, "", "", "0"));
|
|
|
|
|
+ billQuery.setFilterString(filterString);
|
|
|
|
|
+ billQuery.setLimit(limit);
|
|
|
|
|
+ billQuery.setStartRow(startRow);
|
|
|
|
|
+ String result = client.billQuery(JSONObject.toJSONString(billQuery));
|
|
|
|
|
+ JSONArray jsonArray = JSONArray.parseArray(result);
|
|
|
|
|
+
|
|
|
|
|
+ // 按 FBillNo 分组,并过滤出赠品明细
|
|
|
|
|
+ Map<String, List<JSONObject>> groupMap = new LinkedHashMap<>();
|
|
|
|
|
+ for (int i = 0; i < jsonArray.size(); i++) {
|
|
|
|
|
+ JSONObject item = jsonArray.getJSONObject(i);
|
|
|
|
|
+ // 判断是否赠品:注意金蝶返回的 FIsFree 可能是布尔值或字符串 "true"/"false"
|
|
|
|
|
+ boolean isFree = false;
|
|
|
|
|
+ Object freeObj = item.get("FIsFree");
|
|
|
|
|
+ if (freeObj instanceof Boolean) {
|
|
|
|
|
+ isFree = (Boolean) freeObj;
|
|
|
|
|
+ } else if (freeObj instanceof String) {
|
|
|
|
|
+ isFree = "true".equalsIgnoreCase((String) freeObj);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 只处理赠品行
|
|
|
|
|
+ if (isFree) {
|
|
|
|
|
+ String billNo = item.getString("FBillNo");
|
|
|
|
|
+ groupMap.computeIfAbsent(billNo, k -> new ArrayList<>()).add(item);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 组装最终结果(仅包含有赠品行明细的订单)
|
|
|
|
|
+ List<Map<String, Object>> orderList = new ArrayList<>();
|
|
|
|
|
+ for (Map.Entry<String, List<JSONObject>> entry : groupMap.entrySet()) {
|
|
|
|
|
+ List<JSONObject> rows = entry.getValue();
|
|
|
|
|
+ JSONObject firstRow = rows.get(0); // 取该订单的第一条赠品行(主表字段相同)
|
|
|
|
|
+
|
|
|
|
|
+ // 主表 Map
|
|
|
|
|
+ Map<String, Object> orderMap = new LinkedHashMap<>();
|
|
|
|
|
+ orderMap.put("textField_mniksrqa", firstRow.getString("FBillNo")); // 单据编号
|
|
|
|
|
+ orderMap.put("textField_mniksrq4", firstRow.getString("FSaleOrgId.FName")); // 销售组织
|
|
|
|
|
+ orderMap.put("textField_mniksrq5", firstRow.getString("FSaleDeptId.FName")); // 销售部门
|
|
|
|
|
+ orderMap.put("textField_mniksrqb", firstRow.getString("FCustId.FName")); // 客户
|
|
|
|
|
+ orderMap.put("textField_mniksrqe", firstRow.getString("F_UNW_Text_ct1")); // 客户订单号
|
|
|
|
|
+ orderMap.put("textField_mniksrqf", firstRow.getString("FSettleCurrId.FName")); // 结算币别
|
|
|
|
|
+ orderMap.put("textField_mniksrqk", firstRow.getString("FSalerId.FName")); // 销售员
|
|
|
|
|
+ String fDateRaw = firstRow.getString("FDate");
|
|
|
|
|
+ String formattedDate = (fDateRaw != null && fDateRaw.contains("T")) ? fDateRaw.split("T")[0] : fDateRaw;
|
|
|
|
|
+ orderMap.put("textField_mniksrql", formattedDate); // 日期
|
|
|
|
|
+ orderMap.put("textField_mniksrqm", firstRow.getString("FRecConditionId.FName")); // 收款条件
|
|
|
|
|
+
|
|
|
|
|
+ // 明细数组(仅包含赠品行)
|
|
|
|
|
+ List<Map<String, Object>> details = new ArrayList<>();
|
|
|
|
|
+ for (JSONObject row : rows) {
|
|
|
|
|
+ Map<String, Object> detailMap = new LinkedHashMap<>();
|
|
|
|
|
+ detailMap.put("textField_mniksrqo", row.getString("FMaterialId.FNumber")); // 物料编码
|
|
|
|
|
+ detailMap.put("textField_mniksrqp", row.getString("FMaterialName")); // 物料名称
|
|
|
|
|
+ detailMap.put("textField_mniksrqq", row.getString("FMaterialModel")); // 规格型号
|
|
|
|
|
+ detailMap.put("textField_mniksrqr", row.getString("FMapId.FNumber")); // 客户物料编码
|
|
|
|
|
+ detailMap.put("textField_mniksrqs", row.getString("F_UNW_BaseProperty_uow")); // 客户物料规格
|
|
|
|
|
+ detailMap.put("textField_mniksrqt", row.getString("FUnitID.FName")); // 销售单位
|
|
|
|
|
+ detailMap.put("numberField_mniksrqv", row.getString("FQty")); // 销售数量
|
|
|
|
|
+ detailMap.put("numberField_mniksrqw", row.getString("FPriceUnitQty")); // 计价数量
|
|
|
|
|
+ detailMap.put("numberField_mniksrqx", row.getString("FPrice")); // 单价
|
|
|
|
|
+ detailMap.put("numberField_mniksrqy", row.getString("FTaxPrice")); // 含税单价
|
|
|
|
|
+ detailMap.put("numberField_mniksrqz", row.getString("FEntryTaxRate")); // 税率
|
|
|
|
|
+ detailMap.put("numberField_mniksrr0", row.getString("FEntryTaxAmount")); // 税额
|
|
|
|
|
+ detailMap.put("numberField_mniksrr1", row.getString("FAmount")); // 金额
|
|
|
|
|
+ detailMap.put("numberField_mniksrr2", row.getString("FAllAmount")); // 价税合计
|
|
|
|
|
+ String deliveryRaw = row.getString("FDeliveryDate");
|
|
|
|
|
+ String formattedDelivery = (deliveryRaw != null && deliveryRaw.contains("T")) ? deliveryRaw.split("T")[0] : deliveryRaw;
|
|
|
|
|
+ detailMap.put("textField_mniksrr3", formattedDelivery); // 要货日期
|
|
|
|
|
+ detailMap.put("textField_mniksrr4", row.getString("FSettleOrgIds.FName")); // 结算组织
|
|
|
|
|
+ // 赠品标记:这里明细一定是赠品,直接设为"是"
|
|
|
|
|
+ detailMap.put("radioField_mniksrr6", "是");
|
|
|
|
|
+ details.add(detailMap);
|
|
|
|
|
+ }
|
|
|
|
|
+ orderMap.put("tableField_mniksrqn", details);
|
|
|
|
|
+
|
|
|
|
|
+ // 写入宜搭补货单表单
|
|
|
|
|
+ List<Map> conditions = Arrays.asList(
|
|
|
|
|
+ YDConf.searchCondition_TextFiled("textField_mniksrqa", firstRow.getString("FBillNo"), "eq")
|
|
|
|
|
+ );
|
|
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
|
|
+ .formUuid("FORM-837E203B7DCA4B09A9618AA8F584CC45UDFX")
|
|
|
|
|
+ .searchCondition(JSONObject.toJSONString(conditions))
|
|
|
|
|
+ .formDataJson(JSONObject.toJSONString(orderMap))
|
|
|
|
|
+ .build(), YDConf.FORM_OPERATION.upsert).toString();
|
|
|
|
|
+ orderList.add(orderMap);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ log.info("补货单已同步,共 {} 个订单包含赠品明细", orderList.size());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @SneakyThrows
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void invoice() throws JsonProcessingException {
|
|
|
|
|
+ K3CloudApi client = new K3CloudApi(initIden());
|
|
|
|
|
+ int startRow = 0;
|
|
|
|
|
+ int limit = 2000;
|
|
|
|
|
+ BillQuery billQuery = new BillQuery();
|
|
|
|
|
+ billQuery.setFormId("AR_receivable");//开票单
|
|
|
|
|
+ //[主表] FBillTypeID单据类型 FCUSTOMERID客户 FSALEERID销售员 FSetAccountType立账类型 FBillNo单据编号 FCURRENCYID币别 FSETTLEORGID结算组织 FDATE业务日期 FENDDATE_H到期日 FDocumentStatus单据状态 FPayConditon收款条件 FSALEDEPTID销售部门 F_UNW_Text_u4s发票号
|
|
|
|
|
+ //[明细表] FMATERIALID 物料编码 FCustMatID客户物料编码 FCustMatName客户物料名称 F_UNW_BaseProperty_lad规格型号 FMaterialName物料名称 FPRICEUNITID计价单位 FPriceQty计价数量 FEntryTaxRate税率 FF100001厚度 FBASICUNITQTY计价基本数量 FLot批号 FORDERNUMBER销售订单号 FORDERENTRYSEQ销售订单行号 FSalQty销售数量 FSalUnitId销售单位 FIsFree是否赠品
|
|
|
|
|
+ billQuery.setFieldKeys("FBillTypeID.FName,FCUSTOMERID.FName,FSALEERID.FName,FSetAccountType,FBillNo,FCURRENCYID.FName,FSETTLEORGID.FName,FDATE,FENDDATE_H,FDocumentStatus,FPayConditon.FName,FSALEDEPTID.FName,F_UNW_Text_u4s,FMATERIALID.FNumber,FCustMatID.FNumber,FCustMatName,F_UNW_BaseProperty_lad,FMaterialName,FPRICEUNITID.FName,FPriceQty,FEntryTaxRate,FAuxpropId.FF100001,FBASICUNITQTY,FLot.FNumber,FORDERNUMBER,FORDERENTRYSEQ,FSalQty,FSalUnitId.FName,FIsFree");
|
|
|
|
|
+ List<Map> filterString = new ArrayList<>();
|
|
|
|
|
+ filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",1,"","","0"));//审核日期在今天之前N天以后
|
|
|
|
|
+ billQuery.setFilterString(filterString);
|
|
|
|
|
+ billQuery.setLimit(limit);
|
|
|
|
|
+ billQuery.setStartRow(startRow);
|
|
|
|
|
+ String result=client.billQuery(JSONObject.toJSONString(billQuery));
|
|
|
|
|
+ JSONArray jsonArray = JSONArray.parseArray(result);
|
|
|
|
|
+
|
|
|
|
|
+ // 按 FBillNo 分组
|
|
|
|
|
+ Map<String, List<JSONObject>> groupMap = new LinkedHashMap<>();
|
|
|
|
|
+ for (int i = 0; i < jsonArray.size(); i++) {
|
|
|
|
|
+ JSONObject item = jsonArray.getJSONObject(i);
|
|
|
|
|
+ String billNo = item.getString("FBillNo");
|
|
|
|
|
+ groupMap.computeIfAbsent(billNo, k -> new ArrayList<>()).add(item);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 组装最终结果
|
|
|
|
|
+ List<Map<String, Object>> orderList = new ArrayList<>();
|
|
|
|
|
+ for (Map.Entry<String, List<JSONObject>> entry : groupMap.entrySet()) {
|
|
|
|
|
+ List<JSONObject> rows = entry.getValue();
|
|
|
|
|
+ JSONObject firstRow = rows.get(0);
|
|
|
|
|
+
|
|
|
|
|
+ // ========== 新增:检查发票号,无发票号则跳过 ==========
|
|
|
|
|
+ String invoiceNo = firstRow.getString("F_UNW_Text_u4s");
|
|
|
|
|
+ if (invoiceNo == null || invoiceNo.trim().isEmpty()) {
|
|
|
|
|
+ log.info("单据编号 {} 无发票号,跳过同步", firstRow.getString("FBillNo"));
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ // =================================================
|
|
|
|
|
+
|
|
|
|
|
+ // 主表 Map
|
|
|
|
|
+ Map<String, Object> orderMap = new LinkedHashMap<>();
|
|
|
|
|
+ orderMap.put("textField_mno1zcb2", firstRow.getString("FBillTypeID.FName"));//单据类型
|
|
|
|
|
+ orderMap.put("textField_mno1zcb3", firstRow.getString("FCUSTOMERID.FName")); // 客户
|
|
|
|
|
+ orderMap.put("textField_mno1zcb4", firstRow.getString("FSALEERID.FName")); // 销售员
|
|
|
|
|
+ String FSetAccountType = "";
|
|
|
|
|
+ switch (firstRow.getString("FSetAccountType")){
|
|
|
|
|
+ case "1":
|
|
|
|
|
+ FSetAccountType = "业务应收";break;
|
|
|
|
|
+ case "2":
|
|
|
|
|
+ FSetAccountType = "暂估应收";break;
|
|
|
|
|
+ case "3":
|
|
|
|
|
+ FSetAccountType = "财务应收";break;
|
|
|
|
|
+ }
|
|
|
|
|
+ orderMap.put("textField_mno1zcb5", FSetAccountType); // 立账类型
|
|
|
|
|
+ orderMap.put("textField_mno1zcbb", firstRow.getString("FBillNo")); // 单据编号
|
|
|
|
|
+ orderMap.put("textField_mno1zcbc", firstRow.getString("FCURRENCYID.FName")); // 币别
|
|
|
|
|
+ orderMap.put("textField_mno1zcbd", firstRow.getString("FSETTLEORGID.FName")); // 结算组织
|
|
|
|
|
+ String fDateRaw = firstRow.getString("FDATE");
|
|
|
|
|
+ String formattedDate = (fDateRaw != null && fDateRaw.contains("T")) ? fDateRaw.split("T")[0] : fDateRaw;
|
|
|
|
|
+ orderMap.put("textField_mno1zcbe", formattedDate); // 业务日期
|
|
|
|
|
+ String fDateRaw_A = firstRow.getString("FENDDATE_H");
|
|
|
|
|
+ String formattedDate_A = (fDateRaw_A != null && fDateRaw_A.contains("T")) ? fDateRaw_A.split("T")[0] : fDateRaw_A;
|
|
|
|
|
+ orderMap.put("textField_mno1zcbk", formattedDate_A); // 到期日
|
|
|
|
|
+ orderMap.put("textField_mno1zcbl", firstRow.getString("FPayConditon.FName")); // 收款条件
|
|
|
|
|
+ String FDocumentStatus = "";
|
|
|
|
|
+ switch (firstRow.getString("FDocumentStatus")){
|
|
|
|
|
+ case "A":
|
|
|
|
|
+ FDocumentStatus = "创建";break;
|
|
|
|
|
+ case "B":
|
|
|
|
|
+ FDocumentStatus = "审核中";break;
|
|
|
|
|
+ case "C":
|
|
|
|
|
+ FDocumentStatus = "已审核";break;
|
|
|
|
|
+ case "D":
|
|
|
|
|
+ FDocumentStatus = "重新审核";break;
|
|
|
|
|
+ case "Z":
|
|
|
|
|
+ FDocumentStatus = "暂存";break;
|
|
|
|
|
+ }
|
|
|
|
|
+ orderMap.put("textField_mno1zcbm", FDocumentStatus); // 单据状态
|
|
|
|
|
+ orderMap.put("textField_mno1zcbn", firstRow.getString("FSALEDEPTID.FName")); // 销售部门
|
|
|
|
|
+ orderMap.put("textField_mno1zcbt", invoiceNo); // 发票号(已确保非空)
|
|
|
|
|
+
|
|
|
|
|
+ // 明细数组
|
|
|
|
|
+ List<Map<String, Object>> details = new ArrayList<>();
|
|
|
|
|
+ for (JSONObject row : rows) {
|
|
|
|
|
+ Map<String, Object> detailMap = new LinkedHashMap<>();
|
|
|
|
|
+ detailMap.put("textField_mno1zcbv", row.getString("FMATERIALID.FNumber"));//物料编码
|
|
|
|
|
+ detailMap.put("textField_mno1zcbw", row.getString("FCustMatID.FNumber"));//客户物料编码
|
|
|
|
|
+ detailMap.put("textField_mno1zcbx", row.getString("FCustMatName"));//客户物料名称
|
|
|
|
|
+ detailMap.put("textField_mno1zcby", row.getString("F_UNW_BaseProperty_lad"));//规格型号
|
|
|
|
|
+ detailMap.put("textField_mno1zcbz", row.getString("FMaterialName"));//物料名称
|
|
|
|
|
+ detailMap.put("textField_mno1zcc0", row.getString("FPRICEUNITID.FName"));//计价单位
|
|
|
|
|
+ detailMap.put("numberField_mno1zcc2", row.getString("FPriceQty"));//计价数量
|
|
|
|
|
+ detailMap.put("numberField_mno1zcc3", row.getString("FEntryTaxRate"));//税率(%)
|
|
|
|
|
+ detailMap.put("textField_mno1zcc5", row.getString("FAuxpropId.FF100001"));//厚度
|
|
|
|
|
+ detailMap.put("numberField_mno1zcc6", row.getString("FBASICUNITQTY"));//计价基本数量
|
|
|
|
|
+ detailMap.put("textField_mno1zcc7", row.getString("FLot.FNumber"));//批号
|
|
|
|
|
+ detailMap.put("textField_mno1zcc8", row.getString("FORDERNUMBER"));//销售订单号
|
|
|
|
|
+ detailMap.put("textField_mno1zcc9", row.getString("FORDERENTRYSEQ"));//销售订单行号
|
|
|
|
|
+ detailMap.put("numberField_mno1zcca", row.getString("FSalQty"));//销售数量
|
|
|
|
|
+ detailMap.put("textField_mno1zccb", row.getString("FSalUnitId.FName"));//销售单位
|
|
|
|
|
+ detailMap.put("radioField_mno1zccc", row.getString("FIsFree").equals("true") ? "是" : "否");//是否赠品
|
|
|
|
|
+ details.add(detailMap);
|
|
|
|
|
+ }
|
|
|
|
|
+ orderMap.put("tableField_mno1zcbu", details);
|
|
|
|
|
+
|
|
|
|
|
+ /*写入宜搭*/
|
|
|
|
|
+ List<Map> conditions = Arrays.asList(YDConf.searchCondition_TextFiled("textField_mno1zcbb", firstRow.getString("FBillNo"), "eq"));
|
|
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
|
|
+ .formUuid("FORM-CEF87B7F64004AE1A1D9A2A3A8EC4986O1VK")
|
|
|
|
|
+ .searchCondition(JSONObject.toJSONString(conditions))
|
|
|
|
|
+ .formDataJson(JSONObject.toJSONString(orderMap))
|
|
|
|
|
+ .build(), YDConf.FORM_OPERATION.upsert).toString();
|
|
|
|
|
+ orderList.add(orderMap);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ log.info("开票单已同步");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @SneakyThrows
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void receivableNote() throws JsonProcessingException {
|
|
|
|
|
+ K3CloudApi client = new K3CloudApi(initIden());
|
|
|
|
|
+ int startRow = 0;
|
|
|
|
|
+ int limit = 2000;
|
|
|
|
|
+ BillQuery billQuery = new BillQuery();
|
|
|
|
|
+ billQuery.setFormId("AR_receivable"); // 应收单
|
|
|
|
|
+ billQuery.setFieldKeys("FBillTypeID.FName,FCUSTOMERID.FName,FSALEERID.FName,FSetAccountType,FBillNo,FCURRENCYID.FName,FSETTLEORGID.FName,FDATE,FENDDATE_H,FDocumentStatus,FPayConditon.FName,FSALEDEPTID.FName,F_UNW_Text_u4s,FMATERIALID.FNumber,FCustMatID.FNumber,FCustMatName,F_UNW_BaseProperty_lad,FMaterialName,FPRICEUNITID.FName,FPriceQty,FEntryTaxRate,FAuxpropId.FF100001,FBASICUNITQTY,FLot.FNumber,FORDERNUMBER,FORDERENTRYSEQ,FSalQty,FSalUnitId.FName,FIsFree");
|
|
|
|
|
+ List<Map> filterString = new ArrayList<>();
|
|
|
|
|
+ filterString.add(UtilMap.map("FieldName, Compare, Value, Left, Right, Logic","FApproveDate","265",1,"","","0")); // 审核日期条件
|
|
|
|
|
+ billQuery.setFilterString(filterString);
|
|
|
|
|
+ billQuery.setLimit(limit);
|
|
|
|
|
+ billQuery.setStartRow(startRow);
|
|
|
|
|
+ String result = client.billQuery(JSONObject.toJSONString(billQuery));
|
|
|
|
|
+ JSONArray jsonArray = JSONArray.parseArray(result);
|
|
|
|
|
+
|
|
|
|
|
+ // 按 FBillNo 分组
|
|
|
|
|
+ Map<String, List<JSONObject>> groupMap = new LinkedHashMap<>();
|
|
|
|
|
+ for (int i = 0; i < jsonArray.size(); i++) {
|
|
|
|
|
+ JSONObject item = jsonArray.getJSONObject(i);
|
|
|
|
|
+ String billNo = item.getString("FBillNo");
|
|
|
|
|
+ groupMap.computeIfAbsent(billNo, k -> new ArrayList<>()).add(item);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 组装并同步到宜搭(应收单表单)
|
|
|
|
|
+ List<Map<String, Object>> orderList = new ArrayList<>();
|
|
|
|
|
+ for (Map.Entry<String, List<JSONObject>> entry : groupMap.entrySet()) {
|
|
|
|
|
+ List<JSONObject> rows = entry.getValue();
|
|
|
|
|
+ JSONObject firstRow = rows.get(0);
|
|
|
|
|
+
|
|
|
|
|
+ // 二次确认:发票号必须为空(有发票号的跳过)
|
|
|
|
|
+ String invoiceNo = firstRow.getString("F_UNW_Text_u4s");
|
|
|
|
|
+ if (invoiceNo != null && !invoiceNo.trim().isEmpty()) {
|
|
|
|
|
+ log.info("单据编号 {} 含有发票号,不符合应收单同步条件(需要无发票号),跳过", firstRow.getString("FBillNo"));
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 组装主表数据
|
|
|
|
|
+ Map<String, Object> orderMap = new LinkedHashMap<>();
|
|
|
|
|
+ orderMap.put("textField_mno1zcb2", firstRow.getString("FBillTypeID.FName")); // 单据类型
|
|
|
|
|
+ orderMap.put("textField_mno1zcb3", firstRow.getString("FCUSTOMERID.FName")); // 客户
|
|
|
|
|
+ orderMap.put("textField_mno1zcb4", firstRow.getString("FSALEERID.FName")); // 销售员
|
|
|
|
|
+ // 立账类型转换
|
|
|
|
|
+ String FSetAccountType = "";
|
|
|
|
|
+ switch (firstRow.getString("FSetAccountType")){
|
|
|
|
|
+ case "1": FSetAccountType = "业务应收"; break;
|
|
|
|
|
+ case "2": FSetAccountType = "暂估应收"; break;
|
|
|
|
|
+ case "3": FSetAccountType = "财务应收"; break;
|
|
|
|
|
+ }
|
|
|
|
|
+ orderMap.put("textField_mno1zcb5", FSetAccountType);//立账类型
|
|
|
|
|
+ orderMap.put("textField_mno1zcbb", firstRow.getString("FBillNo")); // 单据编号
|
|
|
|
|
+ orderMap.put("textField_mno1zcbc", firstRow.getString("FCURRENCYID.FName")); // 币别
|
|
|
|
|
+ orderMap.put("textField_mno1zcbd", firstRow.getString("FSETTLEORGID.FName")); // 结算组织
|
|
|
|
|
+ String fDateRaw = firstRow.getString("FDATE");
|
|
|
|
|
+ String formattedDate = (fDateRaw != null && fDateRaw.contains("T")) ? fDateRaw.split("T")[0] : fDateRaw;
|
|
|
|
|
+ orderMap.put("textField_mno1zcbe", formattedDate); // 业务日期
|
|
|
|
|
+ String fDateRaw_A = firstRow.getString("FENDDATE_H");
|
|
|
|
|
+ String formattedDate_A = (fDateRaw_A != null && fDateRaw_A.contains("T")) ? fDateRaw_A.split("T")[0] : fDateRaw_A;
|
|
|
|
|
+ orderMap.put("textField_mno1zcbk", formattedDate_A); // 到期日
|
|
|
|
|
+ orderMap.put("textField_mno1zcbl", firstRow.getString("FPayConditon.FName"));// 收款条件
|
|
|
|
|
+ // 单据状态转换
|
|
|
|
|
+ String FDocumentStatus = "";
|
|
|
|
|
+ switch (firstRow.getString("FDocumentStatus")){
|
|
|
|
|
+ case "A": FDocumentStatus = "创建"; break;
|
|
|
|
|
+ case "B": FDocumentStatus = "审核中"; break;
|
|
|
|
|
+ case "C": FDocumentStatus = "已审核"; break;
|
|
|
|
|
+ case "D": FDocumentStatus = "重新审核"; break;
|
|
|
|
|
+ case "Z": FDocumentStatus = "暂存"; break;
|
|
|
|
|
+ }
|
|
|
|
|
+ orderMap.put("textField_mno1zcbm", FDocumentStatus);//单据状态
|
|
|
|
|
+ orderMap.put("textField_mno1zcbn", firstRow.getString("FSALEDEPTID.FName")); // 销售部门
|
|
|
|
|
+ orderMap.put("textField_mno1zcbt", ""); // 留空
|
|
|
|
|
+
|
|
|
|
|
+ // 明细数组(字段映射请对应应收单明细表)
|
|
|
|
|
+ List<Map<String, Object>> details = new ArrayList<>();
|
|
|
|
|
+ for (JSONObject row : rows) {
|
|
|
|
|
+ Map<String, Object> detailMap = new LinkedHashMap<>();
|
|
|
|
|
+ detailMap.put("textField_mno1zcbv", row.getString("FMATERIALID.FNumber"));//物料编码
|
|
|
|
|
+ detailMap.put("textField_mno1zcbw", row.getString("FCustMatID.FNumber"));//客户物料编码
|
|
|
|
|
+ detailMap.put("textField_mno1zcbx", row.getString("FCustMatName"));//客户物料名称
|
|
|
|
|
+ detailMap.put("textField_mno1zcby", row.getString("F_UNW_BaseProperty_lad"));//规格型号
|
|
|
|
|
+ detailMap.put("textField_mno1zcbz", row.getString("FMaterialName"));//物料名称
|
|
|
|
|
+ detailMap.put("textField_mno1zcc0", row.getString("FPRICEUNITID.FName"));//计价单位
|
|
|
|
|
+ detailMap.put("numberField_mno1zcc2", row.getString("FPriceQty"));//计价数量
|
|
|
|
|
+ detailMap.put("numberField_mno1zcc3", row.getString("FEntryTaxRate"));//税率(%)
|
|
|
|
|
+ detailMap.put("textField_mno1zcc5", row.getString("FAuxpropId.FF100001"));//厚度
|
|
|
|
|
+ detailMap.put("numberField_mno1zcc6", row.getString("FBASICUNITQTY"));//计价基本数量
|
|
|
|
|
+ detailMap.put("textField_mno1zcc7", row.getString("FLot.FNumber"));//批号
|
|
|
|
|
+ detailMap.put("textField_mno1zcc8", row.getString("FORDERNUMBER"));//销售订单号
|
|
|
|
|
+ detailMap.put("textField_mno1zcc9", row.getString("FORDERENTRYSEQ"));//销售订单行号
|
|
|
|
|
+ detailMap.put("numberField_mno1zcca", row.getString("FSalQty"));//销售数量
|
|
|
|
|
+ detailMap.put("textField_mno1zccb", row.getString("FSalUnitId.FName"));//销售单位
|
|
|
|
|
+ detailMap.put("radioField_mno1zccc", row.getString("FIsFree").equals("true") ? "是" : "否");//是否赠品
|
|
|
|
|
+ details.add(detailMap);
|
|
|
|
|
+ }
|
|
|
|
|
+ orderMap.put("tableField_mno1zcbu", details);
|
|
|
|
|
+
|
|
|
|
|
+ // 写入宜搭
|
|
|
|
|
+ List<Map> conditions = Arrays.asList(
|
|
|
|
|
+ YDConf.searchCondition_TextFiled("textField_mno1zcbb", firstRow.getString("FBillNo"), "eq")
|
|
|
|
|
+ );
|
|
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
|
|
+ .formUuid("FORM-5A0062877EC246959CE85BC7418D1204229L")
|
|
|
|
|
+ .searchCondition(JSONObject.toJSONString(conditions))
|
|
|
|
|
+ .formDataJson(JSONObject.toJSONString(orderMap))
|
|
|
|
|
+ .build(), YDConf.FORM_OPERATION.upsert).toString();
|
|
|
|
|
+ orderList.add(orderMap);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ log.info("应收单(无发票号)已同步,共处理 {} 张单据", orderList.size());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
|
|
|
private McR saveToAudit(String formid, Object object) throws Exception {
|
|
private McR saveToAudit(String formid, Object object) throws Exception {
|
|
|
JSONObject resultObj = new JSONObject();
|
|
JSONObject resultObj = new JSONObject();
|