package com.uas.eis.service.Impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.kyexpress.openapi.bo.request.batchorder.OrderCustomerInfo; import com.kyexpress.openapi.bo.request.batchorder.OrderInfoItem; import com.kyexpress.openapi.bo.response.batchorder.InvalidResult; import com.kyexpress.openapi.bo.response.batchorder.SuccessOrderResult; import com.kyexpress.openapi.bo.response.batchorder.UnconfirmResult; import com.kyexpress.openapi.sdk.utils.JsonUtils; import com.uas.eis.config.KyeConfig; import com.uas.eis.core.config.SpObserver; import com.uas.eis.dao.*; import com.uas.eis.dto.OrderUpdateInfoDTO; import com.uas.eis.service.CommonService; import com.uas.eis.service.ERPService; import com.uas.eis.utils.BaseUtil; import com.uas.eis.utils.StringUtil; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.kyexpress.openapi.bo.request.batchorder.OrderInfo; import com.kyexpress.openapi.bo.response.batchorder.OrderResult; import com.kyexpress.openapi.sdk.KyeDefaultOpenApi; import com.kyexpress.openapi.sdk.exception.KyeOpenApiException; import java.io.IOException; import com.fasterxml.jackson.core.type.TypeReference; import java.util.*; /** * @author koul * @email koul@usoftchina.com * @date 2021-12-06 18:27 */ @Service public class ERPServiceImpl implements ERPService { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private BaseDao baseDao; @Autowired private KyeConfig kyeConfig; @Autowired private CommonService commonService; @Override public Map pushKyeOrder(String master, Integer id) throws IOException { SpObserver.putSp(master); SqlRowList rs = baseDao.queryForRowSet("select pi_inoutno,pi_title,PI_SERVICEMODE,PI_PAYMODE,PI_PAYMENTCUSTOMER,nvl(PI_IFRECEIPTFLAG,0) PI_IFRECEIPTFLAG," + "pi_recordman,em_mobile,pi_purposename,pi_expresscode,pi_catename_user,pi_address,nvl(pi_receiptcount,1) pi_receiptcount,PI_KYEREMAKR,SYSSENDKYE_,nvl(pi_insuranceValue,0) pi_insuranceValue"+ " from prodinout left join employee on em_name=pi_recordman where pi_id=?",id); if(rs.next()) { Map map = new HashMap<>(); /*if(!StringUtil.hasText(rs.getString("em_mobile"))){ map.put("success", false); map.put("message", "录入人手机号必填!"); return map; }*/ //出货单联系人pi_purposename ,联系人手机号pi_catename_user 为空不允许发送 if(!StringUtil.hasText(rs.getString("pi_purposename"))){ map.put("success", false); map.put("message", "出货单联系人必填!"); return map; } if(!StringUtil.hasText(rs.getString("pi_catename_user"))){ map.put("success", false); map.put("message", "出货单联系人手机号必填!"); return map; } //收货地址为空不允许发送:pi_address if(!StringUtil.hasText(rs.getString("pi_address"))){ map.put("success", false); map.put("message", "收货地址必填!"); return map; } //时效为空pi_servicemode if(!StringUtil.hasText(rs.getString("pi_servicemode"))){ map.put("success", false); map.put("message", "时效必填!"); return map; } //PI_PAYMODE 付款方式为空,付款方式代码 PI_PAYMENTCUSTOMER 为空 校验当付款方式=10-寄方付 或者 30-第三方付 时,付款账号必填 if(!StringUtil.hasText(rs.getString("pi_paymode"))){ map.put("success", false); map.put("message", "物流付款方式必填!"); return map; } if((rs.getString("pi_paymode").equals("10")|| rs.getString("pi_paymode").equals("30")) && !StringUtil.hasText(rs.getString("pi_paymentcustomer"))){ map.put("success", false); map.put("message", "当物流付款方式寄方付或者第三方付时,物流付款账号必填!"); return map; } logger.info("pushKyeOrder begin: master {} ,id {} ",master,id); Object en_kyename = baseDao.getFieldDataByCondition("enterprise","En_kyename","1=1"); //组装请求参数,设置具体业务值 OrderInfo orderInfo = new OrderInfo(); orderInfo.setCustomerCode(kyeConfig.getCustomerCode());//固定值 orderInfo.setPlatformFlag(kyeConfig.getPlatformFlag());//固定值 //设置寄件方 OrderCustomerInfo preWaybillDelivery = new OrderCustomerInfo(); preWaybillDelivery.setCompanyName("深圳华商龙"); //固定值 preWaybillDelivery.setPerson(rs.getGeneralString("pi_recordman")); //pi_recordman preWaybillDelivery.setMobile(rs.getGeneralString("13480992146")); //改成固定 电话 人员资料的 em_mobile preWaybillDelivery.setAddress("深圳市南山区西丽松白路1026号南岗第二工业园13栋2楼"); //固定值 preWaybillDelivery.setContactName("甘维东"); //取货人 preWaybillDelivery.setContactPhone("13480992146"); //取货人电话固定值 OrderInfoItem orderInfoItem = new OrderInfoItem(); orderInfoItem.setPreWaybillDelivery(preWaybillDelivery); //设置收件方 OrderCustomerInfo preWaybillPickup = new OrderCustomerInfo(); preWaybillPickup.setCompanyName(rs.getString("pi_title")); //出货单客户名称(pi_title) preWaybillPickup.setPerson(rs.getString("pi_purposename")); //出货单 联系人(pi_purposename)必填 preWaybillPickup.setPhone(rs.getGeneralString("pi_expresscode"));//"出货单(座机)pi_expresscode" preWaybillPickup.setMobile(rs.getGeneralString("pi_catename_user")); // "出货单(手机)pi_catename_user 必填" preWaybillPickup.setAddress(rs.getGeneralString("pi_address")); //必填 出货单收货地址字段(pi_address)--目前看好像有些地址没到省市,后续需要规范 orderInfoItem.setPreWaybillPickup(preWaybillPickup); orderInfoItem.setServiceMode(rs.getString("pi_servicemode")); //出货单目前没有字段,新增一个字段时效 填写(pi_servicemode)必填 10-当天达,20-次日达,30-隔日达,40-陆运件,50-同城次日,70-同城即日,160-省内次日,170-省内即日,210-表示空运,220-专运 orderInfoItem.setPayMode(rs.getString("PI_PAYMODE")); //出货单增加字段自行填写 10-寄方付 ,20-收方付 ,30-第三方付 (传代码) 必填 if(rs.getString("pi_paymode").equals("10")) { orderInfoItem.setPaymentCustomer(kyeConfig.getCustomerCode()); }else if( rs.getString("pi_paymode").equals("30")){ orderInfoItem.setPaymentCustomer(rs.getString("PI_PAYMENTCUSTOMER")); //正式值:75532690963 校验当付款方式=10-寄方付 或者 30-第三方付 时,付款账号必填 } orderInfoItem.setGoodsType("电子"); orderInfoItem.setOrderId(en_kyename+":"+rs.getString("pi_inoutno")); //取出货单的单据编号 对应账套代码拼接出货单号pi_inoutno if(rs.getInt("PI_IFRECEIPTFLAG") == 0) { orderInfoItem.setReceiptFlag("20"); //必填 出货单增加字段是否回单原件,是就是:10,否是:20 10:回单原件(含回单照片),20:无需回单,30:回单照片,40:电子回单(传代码) }else{ orderInfoItem.setReceiptFlag("10"); } //保价值 orderInfoItem.setInsuranceValue(rs.getGeneralBigDecimal("pi_insuranceValue")); //回单张数 orderInfoItem.setReceiptCount(rs.getGeneralInt("pi_receiptCount")); //默认值为1 orderInfoItem.setWaybillRemark(rs.getString("pi_kyeremakr"));// 备注:PI_KYEREMAKR orderInfoItem.setDismantling("20"); //固定值 20-否 10-是,表示根据预约揽件的时间上门揽收,20-否,表示线下自主联系揽收(传代码,是否预约取货为“10”时,货好时间字段必填,同时根据货好时间安排司机上门揽收) //回单联 List pic = new ArrayList<>(); pic.add("10"); orderInfoItem.setPictureSubscription(pic); /*测试用 orderInfoItem.setDismantling("10"); orderInfoItem.setGoodsTime("2023-09-30 12:00:00");*/ List infoItems = new ArrayList<>(); infoItems.add(orderInfoItem); orderInfo.setRepeatCheck("10"); orderInfo.setOrderInfos(infoItems); boolean suc = true; String response = callWebserviceKYE("open.api.openCommon.batchOrder", JSONArray.toJSONString(orderInfo)); Map res = BaseUtil.parseFormStoreToMap(response); if(Boolean.valueOf(res.get("success").toString())){ OrderResult orderResult = JsonUtils.serializable(JSON.toJSONString(res.get("data")),new TypeReference(){}); if(orderResult.getTotal().getSuccessTotal()>0) { SuccessOrderResult result = orderResult.getSuccess().get(0); //更新单号,时间 、物料信息 SYSSENDKYE_ 、SYSSENDKYEDATE_ 、 pi_listcode baseDao.execute("update prodinout set SYSSENDKYE_=-1,SYSSENDKYEDATE_=sysdate, pi_listcode=? where pi_id=" + id, result.getWaybillNumber()); commonService.logKyeSRecord(rs.getString("pi_inoutno"), id, result.getWaybillNumber(),"下单成功"); suc = true; }else if(orderResult.getTotal().getUnconfirmTotal()>0){ UnconfirmResult result = orderResult.getUnconfirm().get(0); commonService.logKyeSRecord(rs.getString("pi_inoutno"),id,result.getWaybillNumber(),result.getMessage()+",确认链接:"+orderResult.getConfirmUrl()); map.put("confirmUrl",orderResult.getConfirmUrl()); suc = true; }else{ InvalidResult result = orderResult.getFailure().get(0); commonService.logKyeFRecord(rs.getString("pi_inoutno"),id,result.getMessage(),null); map.put("message", result.getMessage()); suc = false; } }else{ if(StringUtil.hasText(res.get("msg"))) { commonService.logKyeFRecord(rs.getString("pi_inoutno"), id, res.get("msg").toString(), null); map.put("message", res.get("msg").toString()); } suc = false; } logger.info("pushKyeOrder end: master {} ,id {} ",master,id); map.put("success", suc); return map; }else{ Map map = new HashMap<>(); map.put("success", false); map.put("message", "单据不存在!"); return map; } } @Override public Map updateKyeOrder(String master, int id) throws IOException { SpObserver.putSp(master); SqlRowList rs = baseDao.queryForRowSet("select pi_inoutno,pi_title,PI_SERVICEMODE,PI_PAYMODE,PI_PAYMENTCUSTOMER,nvl(PI_IFRECEIPTFLAG,0) PI_IFRECEIPTFLAG," + "pi_recordman,em_mobile,pi_purposename,pi_expresscode,pi_catename_user,pi_address,SYSSENDKYE_,pi_listcode,nvl(pi_insuranceValue,0) pi_insuranceValue "+ " from prodinout left join employee on em_name=pi_recordman where pi_id=? and nvl(SYSSENDKYE_,0)<>0 and nvl(pi_listcode,' ')<>' ' ",id); if(rs.next()) { logger.info("updateKyeOrder begin: master {} ,id {} ",master,id); Map map = new HashMap<>(); //组装请求参数,设置具体业务值 OrderUpdateInfoDTO orderInfo = new OrderUpdateInfoDTO(); orderInfo.setCustomerCode(kyeConfig.getCustomerCode());//固定值 orderInfo.setPlatformFlag(kyeConfig.getPlatformFlag());//固定值 orderInfo.setWaybillNumber(rs.getString("pi_listcode")); orderInfo.setType("20"); //为空默认为10,10-修改订单和运单数据 、20-只修改运单数据 //保价值 orderInfo.setInsuranceValue(rs.getGeneralBigDecimal("pi_insuranceValue")); //设置寄件方 OrderCustomerInfo preWaybillDelivery = new OrderCustomerInfo(); preWaybillDelivery.setCompanyName("深圳华商龙"); //固定值 preWaybillDelivery.setPerson(rs.getGeneralString("pi_recordman")); //pi_recordman preWaybillDelivery.setMobile("13480992146"); //人员资料的 em_mobile preWaybillDelivery.setAddress("深圳市南山区西丽松白路1026号南岗第二工业园13栋2楼"); //固定值 orderInfo.setPreWaybillDelivery(preWaybillDelivery); //设置收件方 OrderCustomerInfo preWaybillPickup = new OrderCustomerInfo(); preWaybillPickup.setCompanyName(rs.getString("pi_title")); //出货单客户名称(pi_title) preWaybillPickup.setPerson(rs.getString("pi_purposename")); //出货单 联系人(pi_purposename)必填 preWaybillPickup.setPhone(rs.getGeneralString("pi_expresscode"));//"出货单(座机)pi_expresscode" preWaybillPickup.setMobile(rs.getGeneralString("pi_catename_user")); // "出货单(手机)pi_catename_user 必填" preWaybillPickup.setAddress(rs.getGeneralString("pi_address")); //必填 出货单收货地址字段(pi_address)--目前看好像有些地址没到省市,后续需要规范 orderInfo.setPreWaybillPickup(preWaybillPickup); orderInfo.setServiceMode(rs.getString("pi_servicemode")); //出货单目前没有字段,新增一个字段时效 填写(pi_servicemode)必填 10-当天达,20-次日达,30-隔日达,40-陆运件,50-同城次日,70-同城即日,160-省内次日,170-省内即日,210-表示空运,220-专运 if(rs.getInt("PI_IFRECEIPTFLAG") == 0) { orderInfo.setReceiptFlag("20"); //必填 出货单增加字段是否回单原件,是就是:10,否是:20 10:回单原件(含回单照片),20:无需回单,30:回单照片,40:电子回单(传代码) }else{ orderInfo.setReceiptFlag("10"); } boolean suc = true; String response = callWebserviceKYE("open.api.openCommon.updateYdByCondition", JSONArray.toJSONString(orderInfo)); Map res = BaseUtil.parseFormStoreToMap(response); if(Boolean.valueOf(res.get("success").toString())){ //更新单号,时间 、物料信息 SYSSENDKYE_ 、SYSSENDKYEDATE_ 、 pi_listcode baseDao.execute("update prodinout set SYSSENDKYE_=-1,SYSSENDKYEDATE_=sysdate where pi_id=" + id); commonService.logKyeSRecord(rs.getString("pi_inoutno"), id, rs.getString("pi_listcode"),res.get("msg").toString()); }else{ commonService.logKyeFRecord(rs.getString("pi_inoutno"),id,res.get("msg").toString(),rs.getString("pi_listcode")); map.put("message", res.get("msg").toString()); } logger.info("updateKyeOrder end: master {} ,id {} ",master,id); map.put("success", suc); return map; }else{ Map map = new HashMap<>(); map.put("success", false); map.put("message", "单据不存在!"); return map; } } private String callWebserviceKYE(String apiCode, String toJSONString) throws IOException { String appkey = kyeConfig.getAppKey(); String appsecret = kyeConfig.getAppSecret(); //String body = JsonUtils.deserializer(orderInfo);*/ String body = toJSONString; String response= ""; try { response = KyeDefaultOpenApi.builder (appkey, appsecret) //应用Key,密钥 .env("prod") //对应环境,包含(uat:测试环境,prod:生产环境),获取对应环境的请求路径 .api(apiCode) //所调用Api Code .sandbox(kyeConfig.isSandbox()) .body(body) //请求体参数,可接受字符串,List,Map三种类型的参数 .connectTimeout(3000) //连接超时时间 .readTimeout(15000) //读取超时时间 .request() .response(); // System.out.println(response); } catch (KyeOpenApiException e) { e.printStackTrace(); } if(!StringUtils.isEmpty(response)){ //返回值对象 return response; } return null; } }