package tqq9.lc123.cloud.app.plugin.task; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import kd.bos.coderule.api.CodeRuleInfo; import kd.bos.context.RequestContext; import kd.bos.dataentity.OperateOption; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.entity.botp.runtime.PushArgs; import kd.bos.entity.operate.result.OperationResult; import kd.bos.exception.KDException; import kd.bos.logging.Log; import kd.bos.logging.LogFactory; import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.schedule.executor.AbstractTask; import kd.bos.service.business.datamodel.DynamicFormModelProxy; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.botp.BFTrackerServiceHelper; import kd.bos.servicehelper.coderule.CodeRuleServiceHelper; import kd.bos.servicehelper.operation.OperationServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper; import kd.bos.servicehelper.user.UserServiceHelper; import kd.bos.util.StringUtils; import kd.sdk.plugin.Plugin; import tqq9.lc123.cloud.app.api.utils.GyDeliverySyncMappingUtil; import tqq9.lc123.cloud.app.api.utils.GyOpenApiUtil; import tqq9.lc123.cloud.app.plugin.utils.BillCloseCancelUtils; import tqq9.lc123.cloud.app.plugin.utils.BotpParamUtils; import java.math.BigDecimal; import java.util.*; import static tqq9.lc123.cloud.app.plugin.form.result.CloneBill.cloneOperation; /** * 后台任务插件 * 定时获取OMS的发货单生成金蝶的发货通知单 */ public class GyDeliverySyncTask extends AbstractTask implements Plugin { private static Log logger = LogFactory.getLog(GyDeliverySyncTask.class); private static String DELIVERNOTICE = "sm_delivernotice"; private static String ADMINORG = "bos_adminorg"; private static String SALOUT = "im_saloutbill"; private static String SALORDER = "sm_salorder"; private static String USER = "bos_user"; private static String BILLTYPE = "bos_billtype"; private static String BIZTYPE = "bd_biztype"; private static String CUSTOMER = "bd_customer"; private static String LINETYPE = "bd_linetype"; private static String MATERIALSALINFO = "bd_materialsalinfo"; private static String MEASUREUNITS = "bd_measureunits"; private static String INVOICEBIZTYPE = "bd_invoicebiztype"; private static String OPERATOR = "bd_operator"; private static String EXRATETABLE = "bd_exratetable"; private static String CURRENCY = "bd_currency"; @Override public void execute(RequestContext requestContext, Map map) throws KDException { Map params = new HashMap<>(); //管易发货单列表接口 params.put("method", "gy.erp.trade.deliverys.get"); Map listObjectMap = GyOpenApiUtil.buildRequestParams(params); String listGuanyiApi = GyOpenApiUtil.callGuanyiApi(listObjectMap); JSONObject listRoot = JSON.parseObject(listGuanyiApi); //管易发货单列表-查询成功 if(listRoot.getBoolean("success")) { JSONArray deliverys = listRoot.getJSONArray("deliverys"); //遍历,逐个拿 code for (int i = 0; i < deliverys.size(); i++) { params = new HashMap<>(); //管易发货单详情接口 params.put("method", "gy.erp.trade.deliverys.detail.get"); params.put("code", deliverys.getJSONObject(i).getString("code")); Map stringObjectMap = GyOpenApiUtil.buildRequestParams(params); String callGuanyiApi = GyOpenApiUtil.callGuanyiApi(stringObjectMap); JSONObject callRoot = JSON.parseObject(listGuanyiApi); //管易发货单详情-查询成功 if(callRoot.getBoolean("success")) { try { //解析处理 JsonNode delivery = new ObjectMapper() .readTree(callGuanyiApi) .path("delivery"); GyDeliverySyncMappingUtil.parse(delivery); String api_gyfhdh = (String) GyDeliverySyncMappingUtil.get("tqq9_gyfhdh"); String api_ptddh = (String) GyDeliverySyncMappingUtil.get("tqq9_ptddh"); //判断该发货单是否生成金蝶的发货通知单 QFilter filter_gyfhdh = new QFilter("tqq9_gyfhdh", QCP.equals, api_gyfhdh);//发货单号 QFilter filter_ptddh = new QFilter("tqq9_ptddh", QCP.equals, api_ptddh);//平台单号 DynamicObject deliveryNotice = BusinessDataServiceHelper.loadSingle(DELIVERNOTICE, "billno,tqq9_gyfhdh,tqq9_ptddh,tqq9_trading,tqq9_interstatus,org.*,tqq9_ck.*", new QFilter[]{filter_gyfhdh, filter_ptddh}); //获取发货通知单信息 if (deliveryNotice != null) { Boolean api_isCancel = (Boolean) GyDeliverySyncMappingUtil.get("isCancel"); //发货单状态为取消, 更新平台交易状态并拦截发货 if (api_isCancel != null && api_isCancel) { String billno = deliveryNotice.getString("billno");//发货通知单编码 //拦截发货 Map> targetBills = BFTrackerServiceHelper.findTargetBills(DELIVERNOTICE, new Long[]{deliveryNotice.getLong("id")}); //下游存在系统进行提示不允许后续操作 if (null != targetBills && targetBills.size() > 0 && targetBills.containsKey(SALOUT)) { deliveryNotice.set("tqq9_interstatus","fail");//拦截失败 logger.info(billno+":存在下游单据,不允许拦截"); } String message = null; DynamicObject org = deliveryNotice.getDynamicObject("org");//收货组织 if (null != org) { String number = org.getString("number"); if ("SHLC".equals(number)) { String warehouseCode = null; DynamicObject warehouse = deliveryNotice.getDynamicObject("tqq9_ck");//仓库处理状态 if (null != warehouse) { warehouseCode = warehouse.getString("number"); } message = BillCloseCancelUtils.wmsCancel("PTCK", warehouseCode, billno, DELIVERNOTICE, "WMS-SH-发货通知单取消", "tqq9_isclose"); } if (StringUtils.isNotEmpty(message) && message.contains("关闭成功")) { cloneOperation(deliveryNotice, "发货通知单", DELIVERNOTICE); //克隆单据操作后,原有单据已做删除处理,需重新获取发货通知单 deliveryNotice = BusinessDataServiceHelper.loadSingle(DELIVERNOTICE, new QFilter[]{new QFilter("billno", QCP.equals, billno)}); deliveryNotice.set("tqq9_interstatus","sucess");//拦截成功 }else if (StringUtils.isNotEmpty(message)) { logger.info(billno+":"+message); deliveryNotice.set("tqq9_interstatus","fail");//拦截失败 } } deliveryNotice.set("tqq9_trading","TRADE_FINISHED");//交易关闭 SaveServiceHelper.save(new DynamicObject[]{deliveryNotice}); } }else{ //通过发货单新增发货通知单 DynamicFormModelProxy modelProxy = new DynamicFormModelProxy(DELIVERNOTICE, UUID.randomUUID().toString(), new HashMap<>()); DynamicObject newDeliveryNotice = (DynamicObject) modelProxy.createNewData(); //默认数据 DynamicObject org = BusinessDataServiceHelper.loadSingle(ADMINORG, new QFilter[]{new QFilter("number", QCP.equals, "SHLC")});//固定销售组织为SHLC newDeliveryNotice.set("org",org);//固定销售组织为SHLC newDeliveryNotice.set("deliverorg",org);//固定发货组织为SHLC CodeRuleInfo rule = CodeRuleServiceHelper.getCodeRule(DELIVERNOTICE, newDeliveryNotice, null);// 获取本单据的编码规则 String billno = CodeRuleServiceHelper.getNumber(rule, newDeliveryNotice);// 通过编码规则获取单据编号 newDeliveryNotice.set("billno", billno);//单据编码 newDeliveryNotice.set("billstatus","A");//单据状态 DynamicObject operator = BusinessDataServiceHelper.loadSingle(OPERATOR, new QFilter[]{new QFilter("operatornumber", QCP.equals, "SHKF001")});//默认吴海艳 newDeliveryNotice.set("tqq9_sskf",operator);//业务人员 DynamicObject bd_billtype = BusinessDataServiceHelper.loadSingle(BILLTYPE, new QFilter[]{new QFilter("number", QCP.equals, "sm_delivernotice_STD_BT_S")});//默认标准销售发货通知单 newDeliveryNotice.set("billtype",bd_billtype);//单据类型 DynamicObject bd_biztype = BusinessDataServiceHelper.loadSingle(BIZTYPE, new QFilter[]{new QFilter("number", QCP.equals, "210")});//默认物料类销售 newDeliveryNotice.set("biztype",bd_biztype);//业务类型 newDeliveryNotice.set("bizdate",new Date());//通知日期 newDeliveryNotice.set("closestatus","A");//关闭状态-正常 //当前用户 long userId = RequestContext.get().getCurrUserId(); //查询用户所属部门 long deptId = UserServiceHelper.getUserMainOrgId(Long.valueOf(userId)); DynamicObject deptOrg = BusinessDataServiceHelper.loadSingle(ADMINORG, new QFilter[]{new QFilter("id", QCP.equals, deptId)}); newDeliveryNotice.set("tqq9_dept",deptOrg);//创建人部门 newDeliveryNotice.set("tqq9_ddlx","tmall");//订单类型-默认 newDeliveryNotice.set("tqq9_ddly","天猫订单");//订单来源-默认 newDeliveryNotice.set("exchangerate",1);//汇率-默认 DynamicObject bd_exratetable = BusinessDataServiceHelper.loadSingle(EXRATETABLE, new QFilter[]{new QFilter("number", QCP.equals, "ERT-01")});//默认 newDeliveryNotice.set("exratetable",bd_exratetable);//汇率表 DynamicObject bd_currency = BusinessDataServiceHelper.loadSingle(CURRENCY, new QFilter[]{new QFilter("number", QCP.equals, "CNY")});//默认 newDeliveryNotice.set("currency",bd_currency);//本位币 newDeliveryNotice.set("settlecurrency",bd_currency);//结算币 //接口数据 newDeliveryNotice.set("tqq9_gyfhdh",api_gyfhdh);//管易发货单号 newDeliveryNotice.set("tqq9_ptddh",api_ptddh);//平台订单号 newDeliveryNotice.set("tqq9_sjr",GyDeliverySyncMappingUtil.get("tqq9_sjr"));//收件人 newDeliveryNotice.set("tqq9_sjrsj",GyDeliverySyncMappingUtil.get("tqq9_sjrsj"));//收件人手机号 newDeliveryNotice.set("tqq9_xxdz",GyDeliverySyncMappingUtil.get("tqq9_xxdz"));//收件人详细地址 // newDeliveryNotice.set("tqq9_ck",GyDeliverySyncMappingUtil.get("tqq9_sjr"));//发货仓库-仓库名称 String api_customer = (String) GyDeliverySyncMappingUtil.get("customer");//订货客户-名称 //----------------------测试给值 上海励齿--待改动 DynamicObject bd_customer = BusinessDataServiceHelper.loadSingle(CUSTOMER, new QFilter[]{new QFilter("name", QCP.equals, "上海励齿")}); newDeliveryNotice.set("customer",bd_customer);//订货客户 newDeliveryNotice.set("tqq9_invoicett",bd_customer);//发票抬头 DynamicObject bd_tinviceType = BusinessDataServiceHelper.loadSingle(INVOICEBIZTYPE, new QFilter[]{new QFilter("number", QCP.equals, "SP00001_S")}); newDeliveryNotice.set("tqq9_fplx", bd_tinviceType);//发票类型 //---------------------测试给值 // 发票信息 invoices List invoices = (List) GyDeliverySyncMappingUtil.get("invoices"); if (invoices != null && !invoices.isEmpty()) { Object row = invoices.get(0);//单据只有一个发票信息 Map rowMap = (Map) row; newDeliveryNotice.set("tqq9_invoicett",bd_customer);//发票抬头 String fplxNumber = ""; if("增值普通发票".equals(rowMap.get("tqq9_fplx"))){//发票类型 fplxNumber = "SP00001_S"; }else if("增值专用发票".equals(rowMap.get("tqq9_fplx"))){ fplxNumber = "SP00002_S"; } DynamicObject bd_inviceType = BusinessDataServiceHelper.loadSingle(INVOICEBIZTYPE, new QFilter[]{new QFilter("number", QCP.equals, fplxNumber)}); newDeliveryNotice.set("tqq9_fplx", bd_inviceType);//发票类型 newDeliveryNotice.set("tqq9_registerno", rowMap.get("tqq9_registerno"));//纳税人识别号 newDeliveryNotice.set("tqq9_bank",rowMap.get("tqq9_bank"));//开户行 newDeliveryNotice.set("tqq9_bankno",rowMap.get("tqq9_bankno"));//账号 } // 物料明细 details DynamicObjectCollection billentry = newDeliveryNotice.getDynamicObjectCollection("billentry"); billentry.clear(); List details = (List) GyDeliverySyncMappingUtil.get("details"); if (details != null && !details.isEmpty()) { for (int j = 0; j < details.size(); j++) { Object row = details.get(j); Map rowMap = (Map) row; //新增分录 DynamicObject newEntry = new DynamicObject(billentry.getDynamicObjectType()); DynamicObject bd_linetype = BusinessDataServiceHelper.loadSingle(LINETYPE, new QFilter[]{new QFilter("number", QCP.equals, "010")});//默认物资 newEntry.set("linetype", bd_linetype);//行类型 String api_material = (String) rowMap.get("material");//物料-编码 DynamicObject bd_materialsalinfo = BusinessDataServiceHelper.loadSingle(MATERIALSALINFO, new QFilter[]{new QFilter("masterid.number", QCP.equals, api_material)});//物料查询 newEntry.set("material", bd_materialsalinfo);//物料 if (bd_materialsalinfo!=null) newEntry.set("materialname", bd_materialsalinfo.get("masterid.name"));//物料名称 String api_unit = (String) rowMap.get("unit");//计量单位-编码 DynamicObject bd_measureunits = BusinessDataServiceHelper.loadSingle(MEASUREUNITS, new QFilter[]{new QFilter("name", QCP.equals, api_unit)});//计量单位查询 newEntry.set("unit", bd_measureunits);//计量单位 newEntry.set("qty", rowMap.get("qty"));//数量 newEntry.set("baseqty", rowMap.get("qty"));//基本数量 newEntry.set("amount", rowMap.get("amount"));//金额 newEntry.set("entrysettleorg", org);//结算组织 newEntry.set("e_deliverorg", org);//发货组织 newEntry.set("salesorg", org);//销售组织 newEntry.set("discounttype", "NULL");//折扣方式 newEntry.set("deliverydate1", new Date());//要货日期 //-----------------测试给值 newEntry.set("associatedqty", 1);//关联数量 newEntry.set("associatedbaseqty", 1);//关联基本数量 newEntry.set("deliverbaseqtyup", 2);//发货上限基本数量>关联基本数量 newEntry.set("isinspect", false);//是否检验 //-----------------测试给值 newEntry.set("ownertype", "bos_org");//货主类型 newEntry.set("rowclosestatus", "A");//行关闭状态 billentry.add(newEntry); } } SaveServiceHelper.save(new DynamicObject[]{newDeliveryNotice}); //发货通知单为审核状态-走标准提交审核操作 StringBuilder message = new StringBuilder(); OperationResult submitResult = OperationServiceHelper.executeOperate("submit", DELIVERNOTICE, new DynamicObject[]{newDeliveryNotice}, OperateOption.create()); if (submitResult.isSuccess()) { OperationResult auditResult = OperationServiceHelper.executeOperate("audit", DELIVERNOTICE, new DynamicObject[]{newDeliveryNotice}, OperateOption.create()); if (!auditResult.isSuccess()) { auditResult.getAllErrorOrValidateInfo().forEach((error) -> { message.append(error.getMessage()); }); logger.info("Gy发货通知单 " + billno + "审核 失败:" + message); } }else{ submitResult.getAllErrorOrValidateInfo().forEach((error) -> { message.append(error.getMessage()); }); logger.info("Gy发货通知单 " + billno + "提交 失败:" + message); } } } catch (JsonProcessingException e) { throw new RuntimeException(e); } } } } //销售出库单全部出库之后,由金蝶的销售出库单生成金蝶销售订单 QFilter filter_gyfhdh = new QFilter("tqq9_gyfhdh", QCP.not_equals, "");//发货单号 QFilter filter_ptddh = new QFilter("tqq9_ptddh", QCP.not_equals, "");//平台单号 DynamicObject[] deliveryNotices = BusinessDataServiceHelper.load(DELIVERNOTICE, "billno,billentry,billentry.qty,billentry.associatedqty", new QFilter[]{filter_gyfhdh, filter_ptddh}); //遍历查询管易生成的发货通知单 for (DynamicObject deliveryNotice : deliveryNotices) { //通过关联关系下查,判断下游销售出库单是否已存在 Map> tarBills = BFTrackerServiceHelper.findTargetBills(DELIVERNOTICE, new Long[]{Long.valueOf(deliveryNotice.getPkValue().toString())}); //返回的Map对象 如果有数据 String 对应的是 目标单据标识 ,value 对应的目标单ids Set saloutId = new HashSet(); if (tarBills.containsKey(SALOUT)) { saloutId = tarBills.get(SALOUT); } // 销售出库单存在的,查询是否已全部出库,通过系统自动下推销售订单 if (!saloutId.isEmpty()) { Long srcSalOutId = saloutId.toArray(new Long[0])[0]; QFilter filter_id = new QFilter("id", QCP.equals, srcSalOutId); DynamicObject salOutBill = BusinessDataServiceHelper.loadSingle(SALOUT, new QFilter[]{filter_id}); //查询销售出库单是否全部出库-----根据发货通知单关联数量 关联数量等于发货通知单数量就是全部出库了 boolean allunverify = true; DynamicObjectCollection billentrys = deliveryNotice.getDynamicObjectCollection("billentry"); for (DynamicObject billentry : billentrys) { BigDecimal qty = billentry.getBigDecimal("qty");//数量 BigDecimal associatedqty = billentry.getBigDecimal("associatedqty");//关联数量 if (associatedqty.compareTo(qty) != 0) { //未全部出库 allunverify = false; } } if (allunverify) { //销售出库单下推销售订单 Map param = new HashMap<>(); List salOutIds = new ArrayList<>(); salOutIds.add((Long) salOutBill.getPkValue()); String salOutRule = BotpParamUtils.getBotpRuleId(SALOUT, SALORDER, "OMS_销售出库单推发货方销售订单_转换规则"); PushArgs salOutPushArgs = BotpParamUtils.getPushArgs(SALOUT, SALORDER, param, salOutIds, salOutRule); List saleOrders = BotpParamUtils.getDestObject(salOutPushArgs); DynamicObject saleOrder = null; //客户付款通知书 仅为保存状态 if (!saleOrders.isEmpty()) { saleOrder = saleOrders.get(0); try { SaveServiceHelper.saveOperate(SALORDER, new DynamicObject[] {saleOrder}, OperateOption.create()); //销售订单为审核状态-走标准提交审核操作 StringBuilder message = new StringBuilder(); OperationResult submitResult = OperationServiceHelper.executeOperate("submit", SALORDER, new DynamicObject[]{saleOrder}, OperateOption.create()); if (submitResult.isSuccess()) { //需重新查询一遍 saleOrder = BusinessDataServiceHelper.loadSingle(SALORDER, new QFilter[]{new QFilter("id", QCP.equals, saleOrder.getPkValue())}); OperationResult auditResult = OperationServiceHelper.executeOperate("audit", SALORDER, new DynamicObject[]{saleOrder}, OperateOption.create()); if (!auditResult.isSuccess()) { auditResult.getAllErrorOrValidateInfo().forEach((error) -> { message.append(error.getMessage()); }); logger.info("Gy销售订单 " + salOutBill.get("number") + "审核 失败:" + message); } }else{ submitResult.getAllErrorOrValidateInfo().forEach((error) -> { message.append(error.getMessage()); }); logger.info("Gy销售订单 " + salOutBill.get("number") + "提交 失败:" + message); } } catch (Exception ee) { logger.info("Gy处理销售出库单:" + salOutBill.get("number") + "下推销售订单出错:" + ee.getMessage()); } } } } } } }