| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- 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<String, Object> 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<String,Object> 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<String> pic = new ArrayList<>();
- pic.add("10");
- orderInfoItem.setPictureSubscription(pic);
- /*测试用
- orderInfoItem.setDismantling("10");
- orderInfoItem.setGoodsTime("2023-09-30 12:00:00");*/
- List<OrderInfoItem> 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<Object, Object> res = BaseUtil.parseFormStoreToMap(response);
- if(Boolean.valueOf(res.get("success").toString())){
- OrderResult orderResult = JsonUtils.serializable(JSON.toJSONString(res.get("data")),new TypeReference<OrderResult>(){});
- 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<String,Object> map = new HashMap<>();
- map.put("success", false);
- map.put("message", "单据不存在!");
- return map;
- }
- }
- @Override
- public Map<String, Object> 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<String,Object> 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<Object, Object> 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<String,Object> 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;
- }
- }
|