package grand;
|
|
import foundation.action.ActionProvider;
|
import foundation.dao.DataPackage;
|
import foundation.dao.Filter;
|
import foundation.data.entity.Entity;
|
import foundation.data.entity.EntitySet;
|
import foundation.data.object.DataObject;
|
import foundation.data.object.EntitySaver;
|
import foundation.icall.ICall;
|
import foundation.icall.ICallCenter;
|
import foundation.persist.NamedSQL;
|
import foundation.persist.SQLRunner;
|
import foundation.util.ID;
|
|
public class DeliveryHandler extends ActionProvider {
|
|
private DataObject orderHeaderObject;
|
private DataObject dmsDeliveryObject;
|
private DataObject dmsDeliveryDetailObject;
|
|
public DeliveryHandler() {
|
orderHeaderObject = DataObject.getInstance("so_order");
|
dmsDeliveryObject = DataObject.getInstance("so_delivery");
|
dmsDeliveryDetailObject = DataObject.getInstance("so_delivery_detail");
|
}
|
|
@Override
|
protected void publishMethod() {
|
//1. 同步NC订单、NC发货单、NC出库单、 回写订单状态
|
addMethod("receiveNCODS");
|
|
//2. 获取NC订单
|
addMethod("receiveNCOrders");
|
|
//3. 获取NC发货单
|
addMethod("receiveNCDelivery");
|
|
//4. 获取NC出库单
|
addMethod("receiveNCGeneralOut");
|
|
//5.1 回写订单状态
|
addMethod("callbackDMSOrder");
|
|
//5.2 回写订单状态(渠道订单)
|
addMethod("callbackChannelOrder");
|
}
|
|
public void receiveNCODS() throws Exception {
|
ICallCenter iCallCenter = ICallCenter.getInstance();
|
|
//1.1 获取NC-订单-头
|
logger.debug("1.1 获取NC-订单-头---------->>");
|
ICall iCall = ICall.getInstance("nc_v_ods_saleorder");
|
iCallCenter.callRemote(context, iCall);
|
|
//1.2 获取NC-订单-明细
|
logger.debug("1.2 获取NC-订单-明细---------->>");
|
iCall = ICall.getInstance("nc_v_ods_saleorder_b");
|
iCallCenter.callRemote(context, iCall);
|
|
//1.3 获取NC-发货单-头
|
logger.debug("1.3 获取NC-发货单-头---------->>");
|
iCall = ICall.getInstance("nc_v_ods_delivery");
|
iCallCenter.callRemote(context, iCall);
|
|
//1.4 获取NC-发货单-明细
|
logger.debug("1.4 获取NC-发货单-明细---------->>");
|
iCall = ICall.getInstance("nc_v_ods_delivery_b");
|
iCallCenter.callRemote(context, iCall);
|
|
//1.5 获取NC-出库单-头
|
logger.debug("1.5 获取NC-出库单-头---------->>");
|
iCall = ICall.getInstance("nc_v_ods_generaloutas");
|
iCallCenter.callRemote(context, iCall);
|
|
//1.6 获取NC-出库单-明细
|
logger.debug("1.6 获取NC-出库单-明细---------->>");
|
iCall = ICall.getInstance("nc_v_ods_generalout_b");
|
iCallCenter.callRemote(context, iCall);
|
|
//2.1 同步NC订单
|
logger.debug("2.1 同步NC订单---------->>");
|
receiveNCOrders();
|
|
//2.2. 获取NC发货单
|
logger.debug("2.2 同步NC发货单---------->>");
|
receiveNCDelivery();
|
|
//2.3 获取NC出库单
|
logger.debug("2.3 同步NC出库单---------->>");
|
receiveNCGeneralOut();
|
|
//2.4 回写订单状态
|
logger.debug("2.4 回写订单状态---------->>");
|
callbackDMSOrder();
|
}
|
|
public void receiveNCOrders() throws Exception {
|
//1.1 获取本地的NC订单列表
|
DataObject dataObject = DataObject.getInstance("mirror_nc_v_ods_saleorder");
|
EntitySet entitySet = dataObject.getTableEntitySet();
|
|
//1.2 遍历NC订单,根据NC订单修改DMS订单状态或(NC订单号)
|
for (Entity entity: entitySet) {
|
updateOneDMSOrderHeader(entity);
|
}
|
}
|
|
public void receiveNCDelivery() throws Exception {
|
//1. 更新已存在的发货单
|
updateExistsDelivery();
|
|
//1. 拿到本地获取的NC发货单列表
|
NamedSQL namedSQL = NamedSQL.getInstance("getSoDeliveryFromMirror");
|
EntitySet entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
//2. 遍历NC发货单,生成DMS发货单
|
for (Entity entity: entitySet) {
|
createOneDMSDelivery(entity);
|
}
|
}
|
|
private void updateExistsDelivery() throws Exception {
|
NamedSQL namedSQL = NamedSQL.getInstance("getSoDeliveryExistsFromMirror");
|
EntitySet entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
for (Entity entity: entitySet) {
|
//1. 更新明细
|
String deliveryId = entity.getString("id");
|
updateDeliveryDetail(deliveryId);
|
|
//2. 更新发货单头总数量
|
updateDeliveryTotalCnt(deliveryId);
|
}
|
}
|
|
private void updateDeliveryDetail(String deliveryId) throws Exception {
|
//1. 删除不存在的发货明细
|
NamedSQL namedSQL = NamedSQL.getInstance("deleteCancelDeliveryDetail");
|
namedSQL.setParam("deliveryId", deliveryId);
|
namedSQL.execute();
|
|
//2. 更新已存在的发货明细
|
namedSQL = NamedSQL.getInstance("getSoDeliveryDetailExistsFromMirror");
|
namedSQL.setParam("deliveryId", deliveryId);
|
EntitySet entitySet = SQLRunner.getEntitySet(namedSQL);
|
EntitySaver saver;
|
|
for (Entity entity: entitySet) {
|
saver = dmsDeliveryDetailObject.createEntitySaver(entity.getId());
|
|
saver.set("product_id", entity.getString("product_id"));
|
saver.set("product_code", entity.getString("product_code"));
|
saver.set("product_name", entity.getString("product_name"));
|
saver.set("spec", entity.getString("spec"));
|
saver.set("unit", entity.getString("unit"));
|
saver.set("batch_no", entity.getString("batch_no"));
|
saver.set("batch_sn", entity.getString("batch_sn"));
|
saver.set("valid_from", entity.getString("valid_from"));
|
saver.set("valid_to", entity.getString("valid_to"));
|
saver.set("batch_no", entity.getString("batch_no"));
|
saver.set("batch_sn", entity.getString("batch_sn"));
|
saver.set("qty", entity.getString("qty"));
|
saver.set("shipto_address", entity.getString("shipto_address"));
|
saver.set("manufacturer", entity.getString("manufacturer"));
|
saver.set("nc_order_id", entity.getString("nc_order_id"));
|
saver.set("nc_product_id", entity.getString("nc_product_id"));
|
saver.set("update_time", entity.getString("update_time"));
|
|
saver.update();
|
}
|
|
//3. 增加新增的发货明细
|
namedSQL = NamedSQL.getInstance("appendSoDeliveryDetailFromMirror");
|
namedSQL.setParam("deliveryId", deliveryId);
|
namedSQL.execute();
|
}
|
|
private void updateDeliveryTotalCnt(String deliveryId) throws Exception {
|
NamedSQL namedSQL = NamedSQL.getInstance("updateDeliveryTotalCnt");
|
namedSQL.setParam("deliveryId", deliveryId);
|
|
namedSQL.execute();
|
}
|
|
public void receiveNCGeneralOut() throws Exception {
|
//1. 更新有发货明细的出库数量
|
NamedSQL namedSQL = NamedSQL.getInstance("getGeneralOutWithDeliveryDetail");
|
EntitySet entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
//2. 遍历出库明细,更新出库数量
|
for (Entity entity: entitySet) {
|
updateOneDMSGeneralOutDetail(entity);
|
}
|
|
//3. 新增没有发货明细的出库
|
namedSQL = NamedSQL.getInstance("getGeneralOutWithoutDeliveryDetail");
|
entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
//4. 新增出库明细
|
for (Entity entity: entitySet) {
|
createOneDMSGeneralOutDetail(entity);
|
}
|
|
//5. 获取出库单号
|
namedSQL = NamedSQL.getInstance("getDeliveryGeneralOut");
|
entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
//6. 更新出库单号
|
for (Entity entity: entitySet) {
|
updateOneDMSGeneralOut(entity);
|
}
|
}
|
|
private void updateOneDMSGeneralOut(Entity entity) throws Exception {
|
Filter filter = new Filter();
|
filter.add("nc_id", entity.getString("nc_id"));
|
Entity deliveryDetailEntity = dmsDeliveryObject.getTableEntity(filter);
|
|
EntitySaver saver = dmsDeliveryObject.createEntitySaver(deliveryDetailEntity);
|
|
//1. 回写出库数量
|
saver.set("out_id", entity.getValue("out_id"));
|
saver.set("out_code", entity.getValue("out_code"));
|
saver.update();
|
}
|
|
public void callbackDMSOrder() throws Exception {
|
EntitySaver orderSaver;
|
//1. 获取本次更新涉及的订单(退货单)
|
NamedSQL namedSQL = NamedSQL.getInstance("getSoOrderByMirrorReturn");
|
EntitySet entitySet = SQLRunner.getEntitySet(namedSQL);
|
for (Entity entity: entitySet) {
|
Entity orderEntity = orderHeaderObject.getTableEntity(entity.getString("order_id"));
|
orderSaver = orderHeaderObject.createEntitySaver(orderEntity);
|
|
int returnQty = entity.getInteger("qty_return", 0);
|
|
orderSaver.set("qty_return", returnQty);
|
orderSaver.update();
|
}
|
|
//2. 获取本次更新涉及的订单(发货单)
|
namedSQL = NamedSQL.getInstance("getSoOrderByMirrorDelivery");
|
entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
//3. 更新订单的发货数量,状态
|
for (Entity entity: entitySet) {
|
String orderId = entity.getString("order_id");
|
int deliveryQty = entity.getInt("qty_delivery");
|
calculateDeliveryState(orderHeaderObject, orderId, deliveryQty);
|
}
|
}
|
|
public void callbackChannelOrder() throws Exception {
|
DataObject dataObject = DataObject.getInstance("so_channel");
|
DataPackage dataPackage = dataReader.getDataPackage();
|
Entity master = dataPackage.getMasterEntity();
|
String orderId = master.getString("order_channel_id");
|
int deliveryQty = master.getInteger("qty_total", 0);
|
calculateDeliveryState(dataObject, orderId, deliveryQty);
|
}
|
|
public void calculateDeliveryState(DataObject dataObject, String orderId, int deliveryQty) throws Exception {
|
Entity orderEntity = dataObject.getTableEntity(orderId);
|
EntitySaver orderSaver = dataObject.createEntitySaver(orderEntity);
|
int returnQty = orderEntity.getInteger("qty_return", 0);
|
int orderQty = orderEntity.getInt("qty_total");
|
int closedQty = orderEntity.getInt("qty_close");
|
int deliveryActualQty = returnQty + deliveryQty + closedQty;
|
|
if (deliveryActualQty < orderQty) {
|
orderSaver.set("state_code", "Partial");
|
orderSaver.set("state_name", "部分发货");
|
orderSaver.set("state_delivery_code", "Partial");
|
|
orderSaver.set("state_delivery_name", "部分发货");
|
}
|
else if (deliveryActualQty == orderQty) {
|
orderSaver.set("state_code", "Whole");
|
orderSaver.set("state_name", "已完成");
|
orderSaver.set("state_delivery_code", "Whole");
|
orderSaver.set("state_delivery_name", "全部发货");
|
}
|
else {
|
orderSaver.set("state_code", "Whole");
|
orderSaver.set("state_name", "超额发货");
|
orderSaver.set("state_delivery_code", "Whole");
|
orderSaver.set("state_delivery_name", "超额发货");
|
}
|
|
orderSaver.set("qty_delivery", deliveryQty);
|
orderSaver.update();
|
|
}
|
|
private void updateOneDMSOrderHeader(Entity entity) throws Exception {
|
String oaCode = entity.getString("要货单号");
|
Entity orderEntity = orderHeaderObject.getTableEntity(new Filter("oa_code", oaCode));
|
|
if (orderEntity == null || orderEntity.isEmpty()) {
|
logger.info("can not find order in DMS by oaCode:{}.", oaCode);
|
return ;
|
}
|
|
EntitySaver saver = orderHeaderObject.createEntitySaver(orderEntity);
|
|
//1. 会写NC订单编号
|
saver.set("nc_code", entity.getString("订单ID"));
|
|
//2. 如果NC订单被关闭,关闭DMS订单
|
String ncState = entity.getString("状态编码");
|
|
if (Constants.NC_ORDER_STATE_CLOSE.equalsIgnoreCase(ncState)) {
|
saver.set("state_code", entity.getString("Closed"));
|
saver.set("state_name", entity.getString("关闭"));
|
}
|
|
saver.update();
|
}
|
|
private void createOneDMSDelivery(Entity ncDelivery) throws Exception {
|
String deliveryId = ID.newValue();
|
|
//1. 插入DMS发货单明细
|
NamedSQL namedSQL = NamedSQL.getInstance("getSoDeliveryDetailFromMirror");
|
namedSQL.setParam("ncDeliveryId", ncDelivery.getString("nc_id"));
|
namedSQL.setParam("dmsDeliveryId", deliveryId);
|
EntitySet entitySet = SQLRunner.getEntitySet(namedSQL);
|
|
int deliveryQty = 0;
|
for (Entity ncDetail: entitySet) {
|
EntitySaver detailEntitySaver = dmsDeliveryDetailObject.createEntitySaver();
|
|
detailEntitySaver.set("id", ID.newValue());
|
detailEntitySaver.set("parent_id", deliveryId);
|
detailEntitySaver.set("qty_received", 0 );
|
detailEntitySaver.set("nc_id", ncDetail.getValue("nc_id"));
|
detailEntitySaver.set("customer_id", ncDelivery.getValue("customer_id"));
|
detailEntitySaver.set("order_id", ncDelivery.getValue("order_id"));
|
detailEntitySaver.set("order_code", ncDelivery.getValue("order_code"));
|
detailEntitySaver.set("order_type_code", ncDetail.getValue("order_type_code"));
|
detailEntitySaver.set("order_right_code", ncDetail.getValue("order_right_code"));
|
detailEntitySaver.set("stock_type_code", ncDetail.getValue("stock_type_code"));
|
detailEntitySaver.set("product_id", ncDetail.getValue("product_id"));
|
detailEntitySaver.set("product_code", ncDetail.getValue("product_code"));
|
detailEntitySaver.set("product_name", ncDetail.getValue("product_name"));
|
detailEntitySaver.set("spec", ncDetail.getValue("spec"));
|
detailEntitySaver.set("unit", ncDetail.getValue("unit"));
|
detailEntitySaver.set("batch_no", ncDetail.getValue("batch_no"));
|
detailEntitySaver.set("batch_sn", ncDetail.getValue("batch_sn"));
|
detailEntitySaver.set("valid_from", ncDetail.getValue("valid_from"));
|
detailEntitySaver.set("valid_to", ncDetail.getValue("valid_to"));
|
int lineQty = ncDetail.getInteger("qty", 0);
|
deliveryQty += lineQty;
|
detailEntitySaver.set("qty", lineQty);
|
detailEntitySaver.set("shipto_address", ncDetail.getValue("shipto_address"));
|
detailEntitySaver.set("manufacturer", ncDetail.getValue("manufacturer"));
|
detailEntitySaver.set("nc_order_id", ncDetail.getValue("nc_order_id"));
|
detailEntitySaver.set("nc_order_detail_id", ncDetail.getValue("nc_order_detail_id"));
|
detailEntitySaver.set("nc_product_id", ncDetail.getValue("nc_product_id"));
|
detailEntitySaver.set("create_time", ncDetail.getValue("create_time"));
|
detailEntitySaver.set("update_time", ncDetail.getValue("update_time"));
|
detailEntitySaver.insert();
|
}
|
|
// 2. 插入发货单
|
EntitySaver entitySaver = dmsDeliveryObject.createEntitySaver(ncDelivery);
|
entitySaver.set("id", deliveryId);
|
entitySaver.set("code", ncDelivery.getValue("code"));
|
entitySaver.set("nc_id", ncDelivery.getValue("nc_id"));
|
entitySaver.set("company_name", ncDelivery.getString("company_name"));
|
entitySaver.set("bu_name", ncDelivery.getString("bu_name"));
|
entitySaver.set("order_id", ncDelivery.getString("order_id"));
|
entitySaver.set("order_code", ncDelivery.getString("order_code"));
|
entitySaver.set("state_code", ncDelivery.getString("state_code"));
|
entitySaver.set("state_name", ncDelivery.getString("state_name"));
|
entitySaver.set("doc_date", ncDelivery.getString("doc_date"));
|
entitySaver.set("doc_type", ncDelivery.getString("doc_type"));
|
entitySaver.set("customer_id", ncDelivery.getString("customer_id"));
|
entitySaver.set("customer_code", ncDelivery.getString("customer_code"));
|
entitySaver.set("customer_code_ncc", ncDelivery.getString("customer_code_ncc"));
|
entitySaver.set("customer_name", ncDelivery.getString("customer_name"));
|
entitySaver.set("warehouse_code", ncDelivery.getString("warehouse_code"));
|
entitySaver.set("warehouse_name", ncDelivery.getString("warehouse_name"));
|
entitySaver.set("qty_total", deliveryQty);
|
entitySaver.set("shipto_date", ncDelivery.getString("shipto_date"));
|
entitySaver.set("shipto_address", ncDelivery.getString("shipto_address"));
|
entitySaver.set("shipto_contact", ncDelivery.getString("shipto_contact"));
|
entitySaver.set("shipto_phone", ncDelivery.getString("shipto_phone"));
|
entitySaver.set("supplier_code", ncDelivery.getString("supplier_code"));
|
entitySaver.set("supplier_name", ncDelivery.getString("supplier_name"));
|
entitySaver.set("transport_type", ncDelivery.getString("transport_type"));
|
entitySaver.set("express_code", ncDelivery.getString("express_code"));
|
entitySaver.set("express_company", ncDelivery.getString("express_company"));
|
entitySaver.set("supplier_name", ncDelivery.getString("supplier_name"));
|
entitySaver.set("remark", ncDelivery.getString("remark"));
|
entitySaver.set("creator_id", ncDelivery.getString("creator_id"));
|
entitySaver.set("creator_name", ncDelivery.getString("creator_name"));
|
entitySaver.insert();
|
}
|
|
private void updateOneDMSGeneralOutDetail(Entity generalOutDetailEntity) throws Exception {
|
Filter filter = new Filter();
|
filter.add("nc_id", generalOutDetailEntity.getString("nc_id"));
|
filter.add("nc_product_id", generalOutDetailEntity.getString("nc_product_id"));
|
Entity deliveryDetailEntity = dmsDeliveryDetailObject.getTableEntity(filter);
|
|
EntitySaver saver = dmsDeliveryDetailObject.createEntitySaver(deliveryDetailEntity);
|
|
//1. 回写出库数量
|
saver.set("qty_general_out", generalOutDetailEntity.getString("qty"));
|
saver.update();
|
}
|
|
private void createOneDMSGeneralOutDetail(Entity generalOutDetailEntity) throws Exception {
|
String ncDeliveryId = generalOutDetailEntity.getString("nc_id");
|
Entity deliveryHeadEntity = dmsDeliveryObject.getTableEntity(new Filter("nc_id", ncDeliveryId));
|
|
if (deliveryHeadEntity == null || deliveryHeadEntity.isEmpty()) {
|
logger.info("can not find delivery head in DMS by nc id:{}", ncDeliveryId);
|
return ;
|
}
|
|
EntitySaver saver = dmsDeliveryDetailObject.createEntitySaver(generalOutDetailEntity);
|
saver.set("id", ID.newValue());
|
saver.set("parent_id", deliveryHeadEntity.getId());
|
saver.set("customer_id", deliveryHeadEntity.getString("customer_id"));
|
|
saver.insert();
|
}
|
}
|