package tqq9.lc123.cloud.app.api.controller; import com.alibaba.fastjson.JSONObject; import com.drew.lang.annotations.NotNull; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.openapi.common.custom.annotation.ApiController; import kd.bos.openapi.common.custom.annotation.ApiParam; import kd.bos.openapi.common.custom.annotation.ApiPostMapping; import kd.bos.openapi.common.result.CustomApiResult; import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.botp.BFTrackerServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper; import kd.bos.util.StringUtils; import tqq9.lc123.cloud.app.api.utils.ApiResultExt; import tqq9.lc123.cloud.app.api.utils.Constants; import tqq9.lc123.cloud.app.plugin.form.result.CloneBill; import tqq9.lc123.cloud.app.plugin.utils.BillCloseCancelUtils; import tqq9.lc123.cloud.app.plugin.utils.ConfigUtils; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; /** * 发货通知单接口 */ @ApiController(value = "SmDeliverNoticeController", desc = "发货通知单接口") public class SmDeliverNoticeController { /** * 销售订单拦截状态:成功 */ private static final String LJ_SUCCESS = "1"; /** * 销售订单拦截状态:失败 */ private static final String LJ_FAIL = "2"; @ApiPostMapping(value = "/closeSmDeliverNotice", desc = "根据销售订单编号关闭发货通知单") public CustomApiResult closeSmDeliverNotice(@NotNull @ApiParam(value = "销售订单编号", required = true) String orderBillNo) { //返回值初始化 ApiResultExt resultExt = new ApiResultExt(); List results = new ArrayList<>(); resultExt.setResult(results); ApiResultExt.ResultBean resultBean = new ApiResultExt.ResultBean(); results.add(resultBean); JSONObject key = new JSONObject(); key.put("billno", orderBillNo); resultBean.setKeys(key); ApiResultExt.Error error = new ApiResultExt.Error(); resultBean.setErrors(error); ArrayList rowmsg = new ArrayList<>(); error.setRowMsg(rowmsg); String errormsg = null; resultBean.setBillIndex(0); resultBean.setKeys(key); resultBean.setNumber(orderBillNo); resultBean.setType(Constants.TYPE_CLOSE); // 查询销售订单 DynamicObject saleOrder = BusinessDataServiceHelper.loadSingle(Constants.SM_SALORDER, "id,tqq9_ljzt", new QFilter[]{ new QFilter("billno", QCP.equals, orderBillNo) }); if (null == saleOrder) { errormsg = "传入参数订单编号:" + orderBillNo + " 未查询到对应的销售订单!"; ApiResultExt.errorRetrun(Constants.SM_DELIVERNOTICE, errormsg, error, resultExt); return CustomApiResult.success(resultExt); } // 判断销售订单是否已拦截成功,如果是拦截成功,直接返回成功 if (LJ_SUCCESS.equals(saleOrder.getString("tqq9_ljzt"))) { resultExt.setFailCount(0); resultExt.setSuccessCount(1); resultExt.setResult(results); return CustomApiResult.success(resultExt); } // 关联查询销售订单下游单据 Map> saleOrderTargetBills = BFTrackerServiceHelper.findTargetBills(Constants.SM_SALORDER, new Long[]{saleOrder.getLong("id")}); // 如果没有下游单据或者没有下游发货通知单,返回成功 if (null == saleOrderTargetBills || saleOrderTargetBills.isEmpty() || !saleOrderTargetBills.containsKey(Constants.SM_DELIVERNOTICE)) { saveLjStatus(saleOrder, LJ_SUCCESS); resultExt.setFailCount(0); resultExt.setSuccessCount(1); resultExt.setResult(results); return CustomApiResult.success(resultExt); } // 发货通知单id HashSet smDeliveryNoticeIdSet = saleOrderTargetBills.get(Constants.SM_DELIVERNOTICE); // 根据id集合查询发货通知单(一个销售订单只有一个发货通知单) DynamicObject smDeliverNotice = BusinessDataServiceHelper.loadSingle(Constants.SM_DELIVERNOTICE, "id,billno,org,tqq9_isclose,tqq9_gldjh,tqq9_ck", new QFilter[]{ new QFilter("id", QCP.equals, smDeliveryNoticeIdSet.iterator().next()) }); // 判断是否查询到发货通知单 或者已关闭 if (null == smDeliverNotice || smDeliverNotice.getBoolean("tqq9_isclose")) { saveLjStatus(saleOrder, LJ_SUCCESS); resultExt.setFailCount(0); resultExt.setSuccessCount(1); resultExt.setResult(results); return CustomApiResult.success(resultExt); } // 下游是否存在出库单,如果存在出库单,返回拦截失败 if (saleOrderTargetBills.containsKey(Constants.IM_SALOUTBILL)) { errormsg = "传入参数订单编号:" + orderBillNo + " 在金蝶系统中已生成下游出库单据,无法关闭"; ApiResultExt.errorRetrun(Constants.SM_DELIVERNOTICE, errormsg, error, resultExt); saveLjStatus(saleOrder, LJ_FAIL); return CustomApiResult.success(resultExt); } // 销售组织 DynamicObject org = smDeliverNotice.getDynamicObject("org"); if (null != org) { // 发货通知单编码 String billNo = smDeliverNotice.getString("billno"); String entityName; String label = "tqq9_isclose"; String closeMessage = ""; String number = org.getString("number"); if ("SHLC".equals(number)) { String warehouseCode = null; DynamicObject warehouse = smDeliverNotice.getDynamicObject("tqq9_ck"); if (null != warehouse) { warehouseCode = warehouse.getString("number"); } String orderType = "PTCK"; entityName = "WMS-SH-发货通知单取消"; closeMessage = BillCloseCancelUtils.wmsCancel(orderType, warehouseCode, billNo, Constants.SM_DELIVERNOTICE, entityName, label); } else if ("BJLC".equals(number)) { String BJ_URL = ConfigUtils.getThirdConfigByNumber("BJ_POSTURL"); entityName = "WMS-BJ-发货通知单取消"; closeMessage = BillCloseCancelUtils.BGSaCancelSalesOrder(billNo, BJ_URL, Constants.SM_DELIVERNOTICE, entityName, label); } else if ("GZLC".equals(number)) { String GZURL = ConfigUtils.getThirdConfigByNumber("GZ_POSTURL"); entityName = "WMS-GZ-发货通知单取消"; closeMessage = BillCloseCancelUtils.BGSaCancelSalesOrder(billNo, GZURL, Constants.SM_DELIVERNOTICE, entityName, label); } if (StringUtils.isNotEmpty(closeMessage) && closeMessage.contains("关闭成功")) { saveLjStatus(saleOrder, LJ_SUCCESS); CloneBill.cloneOperation(smDeliverNotice, "发货通知单", Constants.SM_SALORDER); } if (StringUtils.isNotEmpty(closeMessage)) { errormsg = "传入参数订单编号:" + orderBillNo + " 关闭发货通知单失败,失败信息:" + closeMessage; ApiResultExt.errorRetrun(Constants.SM_DELIVERNOTICE, errormsg, error, resultExt); saveLjStatus(saleOrder, LJ_FAIL); return CustomApiResult.success(resultExt); } } //回传成功 resultExt.setFailCount(0); resultExt.setSuccessCount(1); resultExt.setResult(results); return CustomApiResult.success(resultExt); } /** * 保存销售订单拦截状态 * * @param saleOrder 销售订单 * @param status 0:正常 1:拦截成功 2:拦截失败 */ private void saveLjStatus(DynamicObject saleOrder, String status) { saleOrder.set("tqq9_ljzt", status); SaveServiceHelper.save(new DynamicObject[]{saleOrder}); } }