.idea/misc.xml
@@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="FrameworkDetectionExcludesConfiguration"> <file type="web" url="file://$PROJECT_DIR$" /> </component> @@ -13,7 +14,7 @@ </list> </option> </component> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <output url="file://$PROJECT_DIR$/out" /> </component> </project> .idea/modules.xml
File was deleted src/main/java/com/zy/asrs/entity/param/InFormIdParam.java
New file @@ -0,0 +1,38 @@ package com.zy.asrs.entity.param; import lombok.Data; @Data public class InFormIdParam { //查找表单唯一标识 private String FormId; //最多允许查询的数量,0或者不要此属性标识不限制 private String TopRowCount; private Integer Limit; private String StartRow; //过滤条件(eg:\"FNumber>'0301010120001' and FCreateDate>'2023-07-05' \") //1、Left:左括号 //3、Compare:比较运算符,如 大于">"、小于"<"、等于"="、包含"like"、左包含"llike"、右包含"rlike" //4、Value:比较值 //5、Right:右括号 //6、Logic:逻辑运算符,如 "and"、"or" private Integer Filterstring; //排序条件 private Integer OrderString; //待查询表单的字段列(期望返回值) private Integer FieldKeys; } src/main/java/com/zy/asrs/entity/param/LoginParam.java
New file @@ -0,0 +1,20 @@ package com.zy.asrs.entity.param; import lombok.Data; import org.springframework.beans.factory.annotation.Value; @Data public class LoginParam { //账号ID private String acctID; //账号 private String username; //密码 private String password; // private Integer lcid; } src/main/java/com/zy/asrs/entity/param/MaterielParam.java
New file @@ -0,0 +1,15 @@ package com.zy.asrs.entity.param; import lombok.Data; @Data public class MaterielParam { //商品编号 private String matnr; //商品名称 private String maktx; //规格 private String specs; } src/main/java/com/zy/asrs/task/kingdee/InboundOrderScheduler.java
New file @@ -0,0 +1,25 @@ package com.zy.asrs.task.kingdee; import com.zy.asrs.task.kingdee.handler.InboundOrderHandler; import com.zy.asrs.task.kingdee.handler.LoginAuthenticationHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Slf4j @Component public class InboundOrderScheduler { @Autowired private InboundOrderHandler inboundOrderHandler; @Scheduled(cron = "0/3 * * * * ? ") void login(){ Boolean fig=false; if(fig){ return; } inboundOrderHandler.start(); } } src/main/java/com/zy/asrs/task/kingdee/LoginAuthenticationScheduler.java
New file @@ -0,0 +1,23 @@ package com.zy.asrs.task.kingdee; import com.zy.asrs.task.kingdee.handler.LoginAuthenticationHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Slf4j @Component public class LoginAuthenticationScheduler { @Autowired private LoginAuthenticationHandler loginAuthenticationHandler; //@Scheduled(cron = "0/3 * * * * ? ") void login(){ Boolean fig=false; if(fig){ return; } loginAuthenticationHandler.start(); } } src/main/java/com/zy/asrs/task/kingdee/OutboundOrderScheduler.java
New file @@ -0,0 +1,4 @@ package com.zy.asrs.task.kingdee; public class OutboundOrderScheduler { } src/main/java/com/zy/asrs/task/kingdee/handler/InboundOrderHandler.java
New file @@ -0,0 +1,306 @@ package com.zy.asrs.task.kingdee.handler; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.common.SnowflakeIdWorker; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.InFormIdParam; import com.zy.asrs.entity.param.MaterielParam; import com.zy.asrs.service.*; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import com.zy.common.constant.MesConstant; import com.zy.common.utils.HttpHandler; import lombok.Data; import lombok.extern.slf4j.Slf4j; import netscape.javascript.JSObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.lang.reflect.Field; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Set; @Service @Slf4j public class InboundOrderHandler extends AbstractHandler<String> { @Value("${erp.address.URL}") //端口 private String URL; @Value("${erp.address.inaddress}") //单据,商品档案地址 private String inaddress; @Autowired private ApiLogService apiLogService; @Autowired private LoginAuthenticationHandler loginAuthenticationHandler; @Autowired private MatService matService; @Autowired private TagService tagService; @Autowired private DocTypeService docTypeService; @Autowired private OrderService orderService; @Autowired private OrderDetlService orderDetlService; @Autowired private SnowflakeIdWorker snowflakeIdWorker; @Transactional public synchronized ReturnT<String> start() { SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //登录金蝶r ReturnT<String> start = loginAuthenticationHandler.start(); for(int i=0;i<14;i++) { InFormIdParam inFormIdParam = new InFormIdParam(); //对应订单类型ID int docName=0; //数量字段 String anfme =null; switch (i){ //物料档案 case 0 : inFormIdParam.setFormId("BD_MATERIAL"); break; //采购入库 case 1 : inFormIdParam.setFormId("STK_InStock");docName=13;anfme ="FRealQty"; break; //采购退料 case 2 : inFormIdParam.setFormId("PUR_MRB");docName=21;anfme ="FRMREALQTY"; break; //生产领料 case 3 : inFormIdParam.setFormId("PRD_PickMtrl");docName=22;anfme ="FActualQty"; break; //生产退料 case 4 : inFormIdParam.setFormId("BD_MATERIAL");docName=24;anfme ="FQty"; break; //生产补料 case 5 : inFormIdParam.setFormId("PRD_FeedMtrl");docName=25;anfme ="FActualQty"; break; //直接调拨单 case 6 : inFormIdParam.setFormId("STK_TransferDirect");docName=26;anfme ="FQty"; break; //盘盈单 case 7 : inFormIdParam.setFormId("STK_StockCountGain");docName=28;anfme ="FGainQty"; break; //盘亏单 case 8 : inFormIdParam.setFormId("STK_StockCountLoss");docName=29;anfme ="FLossQty"; break; //其他出库 case 9 : inFormIdParam.setFormId("STK_MisDelivery");docName=30;anfme ="FQty"; break; //简单生产领料 case 10 : inFormIdParam.setFormId("SP_PickMtrl");docName=31;anfme ="FActualQty"; break; //简单生产退料 case 11 : inFormIdParam.setFormId("SP_ReturnMtrl");docName=32;anfme ="FQty"; break; //销售出库 case 12 : inFormIdParam.setFormId("SAL_OUTSTOCK");docName=14;anfme ="FRealQty"; break; //销售退货 case 13 : inFormIdParam.setFormId("SAL_RETURNSTOCK");docName=33;anfme ="FRealQty"; break; } inFormIdParam.setLimit(10); inFormIdParam.setStartRow("0"); Date time=new Date(); String FDocumentStatus=null; //条件和需要获得的结果拼接 JSONObject jsonObject = new JSONObject(); jsonObject.put("FormId", inFormIdParam.getFormId()); jsonObject.put("Limit", inFormIdParam.getLimit()); jsonObject.put("StartRow", inFormIdParam.getStartRow()); //物料档案查询 if(i==0){ Tag tag = tagService.selectById(20); //最新时间 time=tag.getCreateTime(); //物料状态 FDocumentStatus="C"; jsonObject.put("FilterString", "FCreateDate>'"+sdf.format(time)+"' and FDocumentStatus='"+FDocumentStatus+"'"); jsonObject.put("FieldKeys", "FName,FNumber,FCreateDate,FSpecification,FDocumentStatus"); // FName : 物料名称 ; // FNumber :物料编号; // FCreateDate :物料创建时间; // FSpecification :物料规格; // FDocumentStatus :物料状态 }else{ //获取最新时间 DocType docType= docTypeService.selectById(docName); //单据状态 FDocumentStatus="C"; jsonObject.put("FilterString", "FCreateDate>'"+sdf.format(docType.getCreateTime())+"' and FDocumentStatus='"+FDocumentStatus+"'"); jsonObject.put("FieldKeys", "FBillNo,FCreateDate,FMaterialId.FNumber,FMaterialId.FName,FMaterialId.FSpecification,"+anfme+",FDocumentStatus"); // FBillNo :单据编号; // FCreateDate :单据创建时间; // FMaterialId.FNumber : 物料编码; // FMaterialName :物料名称; // FMaterialId.FSpecification:物料规格 // anfme : 物料数量 // FDocumentStatus :单据状态; } JSONObject jsonObject1 = new JSONObject(); jsonObject1.put("data", jsonObject); String add = jsonObject1.toJSONString(); System.out.println(add); //上报 String response = ""; boolean success = false; try { //获取Cookie值 HashMap<String, Object> headers = new HashMap<>(); headers.put("Cookie", start.getContent()); response = new HttpHandler.Builder() .setHeaders(headers) .setUri(URL) .setPath(inaddress) .setJson(add) .build() .doPost(); JSONArray data = JSON.parseArray(response); if(i==0){ for (int j = 0; j < data.size(); j++) { JSONArray jsonArray = data.getJSONArray(j); //生成商品档案 //商品编号 Mat mat = matService.selectByMatnr(jsonArray.get(1).toString()); if (mat == null) { mat = new Mat(); Tag tag=new Tag(); mat.setMatnr(jsonArray.get(1).toString()); mat.setMaktx(jsonArray.get(0).toString()); mat.setSpecs(jsonArray.get(3).toString());//规格 //对美国时间进行转换 DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; LocalDateTime dateTime = LocalDateTime.parse(jsonArray.get(2).toString(), formatter); String format = dateFormat.format(dateTime); Date date = sdf.parse(format); mat.setCreateTime(date);//商品创建时间 mat.setUpdateTime(new Date()); mat.setStatus(1); //最新抓取商品时间 tag.setCreateTime(date); // tagService.update(tag,new EntityWrapper<Tag>().eq("id",20)); // if (!matService.insert(mat)) { // throw new CoolException("服务器内部错误,请联系管理员"); // } else { // log.info("同步新物料[商品编号:{}]", mat.getMatnr()); // } } } }else { for(int j=0;j<data.size();j++){ JSONArray jsonArray = data.getJSONArray(j); Order order = orderService.selectByNo(jsonArray.get(0).toString()); if (Cools.isEmpty(order)) { DocType docType = docTypeService.selectById(docName); Date now = new Date(); // 单据主档 order = new Order( String.valueOf(snowflakeIdWorker.nextId()), // 编号[非空] jsonArray.get(0).toString(), // 订单编号 DateUtils.convert(now), // 单据日期 docType.getDocId(), // 单据类型 null, // 项目编号 null, // null, // 调拨项目编号 null, // 初始票据号 null, // 票据号 null, // 客户编号 null, // 客户 null, // 联系方式 null, // 操作人员 null, // 合计金额 null, // 优惠率 null, // 优惠金额 null, // 销售或采购费用合计 null, // 实付金额 null, // 付款类型 null, // 业务员 null, // 结算天数 null, // 邮费支付类型 null, // 邮费 null, // 付款时间 null, // 发货时间 null, // 物流名称 null, // 物流单号 1L, // 订单状态 1, // 状态 9527L, // 添加人员 now, // 添加时间 9527L, // 修改人员 now, // 修改时间 null // 备注 ); //对美国时间进行转换 DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; LocalDateTime dateTime = LocalDateTime.parse(jsonArray.get(1).toString(), formatter); String format = dateFormat.format(dateTime); Date date = sdf.parse(format); //最新抓取时间 docType.setCreateTime(date); // docTypeService.update(docType,new EntityWrapper<DocType>().eq("doc_id",docName)); // if (!orderService.insert(order)) { // throw new CoolException("生成单据主档失败,请联系管理员"); // } } //物料编码 Mat mat = matService.selectByMatnr(jsonArray.get(2).toString()); if (Cools.isEmpty(mat)) { throw new CoolException(jsonArray.get(2).toString() + "编号商品检索失败,请先添加商品"); } OrderDetl orderDetl = new OrderDetl(); orderDetl.sync(mat); orderDetl.setBatch(null); orderDetl.setAnfme(Double.parseDouble(jsonArray.get(5).toString())); orderDetl.setOrderId(order.getId()); orderDetl.setOrderNo(order.getOrderNo()); orderDetl.setCreateBy(9527L); orderDetl.setCreateTime(new Date()); orderDetl.setUpdateBy(9527L); orderDetl.setUpdateTime(new Date()); orderDetl.setStatus(1); orderDetl.setQty(0.0D); // if (!orderDetlService.insert(orderDetl)) { // throw new CoolException("生成单据明细失败,请联系管理员"); // } } } } catch (Exception e) { log.error("fail", e); // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg(e.getMessage()); } finally { try { // 保存接口日志 apiLogService.save( "登录金蝶", MesConstant.URL + MesConstant.PAKIN_URL, null, "127.0.0.1", add, response, success ); } catch (Exception e) { log.error("", e); } } } return SUCCESS; } } src/main/java/com/zy/asrs/task/kingdee/handler/LoginAuthenticationHandler.java
New file @@ -0,0 +1,134 @@ package com.zy.asrs.task.kingdee.handler; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.asrs.entity.param.LoginParam; import com.zy.asrs.service.ApiLogService; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import com.zy.common.constant.MesConstant; import com.zy.common.utils.HttpHandler; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Set; @Service @Slf4j @Transactional public class LoginAuthenticationHandler extends AbstractHandler<String> { @Value("${erp.address.URL}") //端口 private String URL; @Value("${erp.address.loginaddress}") //登录地址 private String loginaddress; @Value("${erp.login.acctID}") //账号ID private String acctID; @Value("${erp.login.username}") //账号 private String username; @Value("${erp.login.password}") //密码 private String password; @Value("${erp.login.lcid}") // private Integer lcid; @Autowired private ApiLogService apiLogService; /** * 45分钟登录一次金蝶系统 * @return */ @Transactional public synchronized ReturnT<String> start() { LoginParam loginParam =new LoginParam(); loginParam.setAcctID(acctID); loginParam.setUsername(username); loginParam.setPassword(password); loginParam.setLcid(lcid); //上报 String response = ""; String cookie = ""; boolean success = false; try { response = new HttpHandler.Builder() .setUri(URL) .setPath(loginaddress) .setJson(JSON.toJSONString(loginParam)) .build() .doPost(); JSONObject jsonObject = JSON.parseObject(response); Object sessionId = findValueByKey(JSON.parseObject(response), "SessionId"); cookie="ASP.NET_SessionId="+sessionId+";"+"kdservice-sessionid="+jsonObject.getString("KDSVCSessionId"); if (Cools.isEmpty(jsonObject.getString("Message"))) { success = true; } else { log.error("请求接口失败!!!url:{};request:{};response:{}", URL+loginaddress, JSON.toJSONString(loginParam), response); throw new CoolException("登录金蝶失败"); } } catch (Exception e) { log.error("fail", e); // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return FAIL.setMsg(e.getMessage()); } finally { try { // 保存接口日志 apiLogService.save( "登录金蝶", MesConstant.URL + MesConstant.PAKIN_URL, null, "127.0.0.1", JSON.toJSONString(loginParam), response, success ); } catch (Exception e) { log.error("", e); } } return SUCCESS.setContent(cookie); } public static Object findValueByKey(JSONObject json, String key) { Set<String> keySet = json.keySet(); for (String k : keySet) { Object v = json.get(k); if (k.equals(key)) { return v; } else if (v instanceof JSONArray) { int size = ((JSONArray) v).size(); for (int i = 0; i <= size - 1; i++) { Object result = findValueByKey((JSONObject) ((JSONArray) v).get(i), key); if (result != null){ return result; } } } else if (v instanceof JSONObject){ Object result = findValueByKey((JSONObject) v, key); if (result != null){ return result; } } } return null; } } src/main/java/com/zy/asrs/task/kingdee/handler/OutboundOrderHandler.java
New file @@ -0,0 +1,17 @@ package com.zy.asrs.task.kingdee.handler; import com.zy.asrs.task.AbstractHandler; import com.zy.asrs.task.core.ReturnT; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Slf4j public class OutboundOrderHandler extends AbstractHandler<String> { @Transactional public synchronized ReturnT<String> start() { return SUCCESS; } } src/main/resources/application.yml
@@ -10,7 +10,7 @@ enabled: false datasource: driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://localhost:1433;databasename=tzhtasrs url: jdbc:sqlserver://192.168.4.15:1433;databasename=tzhtasrs username: sa password: sa@123 mvc: @@ -48,4 +48,22 @@ # 双深库位排号 doubleLocs: 1,4,5,8 # 一个堆垛机负责的货架排数 groupCount: 4 groupCount: 4 #erp对接 erp: #地址 address: URL: http://ht01.wlgear.com:16001 #登录地址 loginaddress: K3CLOUD/Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc #单据,商品档案地址 inaddress: K3CLOUD/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc #结果上报(审核)单地址 outaddress: K3CLOUD/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Audit.common.kdsvc #登录账号管理 login : acctID: "64c7666b20caf2" username: "cs" password: "123456" lcid: 2052