lc/tqq9/lc123/cloud/app/plugin/task/GyDeliverySyncTask.java

363 lines
26 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<String, Object> map) throws KDException {
Map<String, Object> params = new HashMap<>();
//管易发货单列表接口
params.put("method", "gy.erp.trade.deliverys.get");
Map<String, Object> 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<String, Object> 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<String, HashSet<Long>> 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<Object> invoices = (List<Object>) GyDeliverySyncMappingUtil.get("invoices");
if (invoices != null && !invoices.isEmpty()) {
Object row = invoices.get(0);//单据只有一个发票信息
Map<String, Object> rowMap = (Map<String, Object>) 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<Object> details = (List<Object>) GyDeliverySyncMappingUtil.get("details");
if (details != null && !details.isEmpty()) {
for (int j = 0; j < details.size(); j++) {
Object row = details.get(j);
Map<String, Object> rowMap = (Map<String, Object>) 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<String, HashSet<Long>> tarBills = BFTrackerServiceHelper.findTargetBills(DELIVERNOTICE, new Long[]{Long.valueOf(deliveryNotice.getPkValue().toString())});
//返回的Map对象 如果有数据 String 对应的是 目标单据标识 value 对应的目标单ids
Set<Long> saloutId = new HashSet<Long>();
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<String, Object> param = new HashMap<>();
List<Long> 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<DynamicObject> 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());
}
}
}
}
}
}
}