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

363 lines
26 KiB
Java
Raw Normal View History

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());
}
}
}
}
}
}
}