package grand; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import book.BookName; import book.FlowTable; import book.FreezeCondition; import book.QtyCommand; import book.RecordOperator; import book.rebate.BookCommand; import book.rebate.BookCommandBucket; import foundation.action.ActionBucket; import foundation.action.ActionMeta; import foundation.action.ActionProvider; import foundation.action.WorkStep; import foundation.action.WorkflowDispatcher; import foundation.capacity.ActorTarget; import foundation.code.CodeEngine; import foundation.dao.DataPackage; import foundation.dao.DataSource; import foundation.dao.Filter; import foundation.dao.PackageItem; import foundation.dao.PackageState; import foundation.dao.Settings; import foundation.dao.bizlogic.DocDescription; import foundation.dao.bizlogic.IRequest; import foundation.dao.bizlogic.ResponseType; import foundation.data.entity.Entity; import foundation.data.entity.EntitySet; import foundation.data.mapping.FieldMapping; import foundation.data.mapping.Mappings; import foundation.data.object.DataObject; import foundation.data.object.EntitySaver; import foundation.icall.ICall; import foundation.icall.ICallCenter; import foundation.icall.RemoteContext; import foundation.icall.callout.HttpServerSource; import foundation.icall.callout.JSONResponse; import foundation.json.JArrayReader; import foundation.json.JSONBuilder; import foundation.json.JSONReader; import foundation.persist.NamedSQL; import foundation.persist.SQLRunner; import foundation.send.mail.MailCenter; import foundation.user.OnlineUser; import foundation.util.ID; import foundation.util.Util; import policy.OrderLineType; import policy.rule.OrderCalculator; public class OrderHandler extends ActionProvider { @Override protected void publishMethod() { //1. 订单默认值 addMethod("setDefaultValues"); //2. 订单看板 addMethod("createBoard"); //3. 保存校验 addMethod("saveValidate"); //4. 提交校验 addMethod("commitValidate"); //5. 补充OA-NC字段 addMethod("writeOANCValues"); //6. 检查OA-NC字段 addMethod("checkOANCValues"); //7.1 批量推送OA addMethod("syncOAOrder"); //7.2发送到OA addMethod("sendToOA"); //8. OA订单回写 addMethod("callbackOA"); //9. 创建发货单 addMethod("createDelivery"); //10. 更新发货数量 addMethod("updateQtyDelivery"); //11. 更新收货数量 addMethod("updateQtyReceived"); //12. 更新植入单销售人员信息 addMethod("updateImplantPositionHierarchy"); //13. 订单整单关闭 addMethod("orderClose"); //14. 订单行关闭 addMethod("orderDetailClose"); //15. 订单行撤销关闭 addMethod("orderDetailCancelClose"); } public void setDefaultValues() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); Entity entity = dataPackage.getMasterEntity(DataSource.New); if (entity == null) { dataPackage.createDefaultOneData(); entity = dataPackage.getMasterEntity(DataSource.New); dataPackage.setResultData(DataSource.New); } OnlineUser user = OnlineUser.getInstance(); ActorTarget actor = user.getCurrentActor(); Entity accountEntity = actor.getAccount(); //1. 设置默认主体公司、BU entity.set("company_id", actor.getCompanyId()); entity.set("company_name", actor.getCompanyName()); entity.set("bu_id", actor.getBuId()); entity.set("bu_name", actor.getBUName()); //2. 设置单据日期、客户(开户)编码和名称,结算方式 entity.set("doc_date", new Date()); entity.set("customer_id", actor.getAccountId()); entity.set("customer_code", actor.getAccountCode()); entity.set("customer_name", actor.getAccountName()); if (accountEntity != null ) { entity.set("settlement", accountEntity.getString("settlement")); } //3. 设置默认收货地址 dataWriter.setDataPackage(dataPackage); } public void createBoard() throws Exception { } public void saveValidate() throws Exception { } public void commitValidate() throws Exception { } public void writeOANCValues() throws Exception { //1. 获取订单头 DataPackage dataPackage = dataReader.getDataPackage(); Entity master = dataPackage.getMasterEntity(); String accountId = master.getString("customer_id"); String customerOrgId = master.getString("org_id"); //2. 获取OA和NC信息 DataObject customerObject = DataObject.getInstance("md_org"); Entity customer = customerObject.getTableEntity(customerOrgId); NamedSQL namedSQL = NamedSQL.getInstance("getCustomerSalesEmployee"); Filter filter = new Filter(); filter.add("md_org_account_position.parent_id", accountId); String positionId = dataReader.getString("position_id"); if (!Util.isEmpty(positionId)) { filter.add("md_org_account_position.position_id", positionId); } String employeeId = dataReader.getString("employee_id"); if (!Util.isEmpty(employeeId)) { filter.add("md_position_employee.employee_id", employeeId); } namedSQL.setFilter(filter); EntitySet employees = SQLRunner.getEntitySet(namedSQL); //3. 填写OA和NC信息 if (employees == null || employees.size() != 1 ) { return; } Entity employee = employees.getEntity(0); DataObject dataObject = dataPackage.getMasterDataObject(); EntitySaver saver = dataObject.createEntitySaver(master); saver.set("nc_company_id", employee.getValue("nc_org_id")); saver.set("nc_company_code", employee.getValue("nc_org_code")); saver.set("nc_region_id", employee.getValue("nc_region_id")); saver.set("nc_region_code", employee.getValue("nc_region_code")); saver.set("nc_region_name", employee.getValue("nc_region_name")); saver.set("nc_area_id", employee.getValue("nc_area_id")); saver.set("nc_area_code", employee.getValue("nc_area_code")); saver.set("nc_area_name", employee.getValue("nc_area_name")); saver.set("nc_customer_id", customer.getValue("nc_id")); saver.set("nc_customer_code", customer.getValue("ncc_code")); saver.set("oa_department_id", employee.getValue("oa_department_id")); saver.set("oa_department_name", employee.getValue("oa_department_name")); saver.set("oa_employee_id", employee.getValue("id")); saver.set("oa_employee_code", employee.getValue("code")); saver.set("oa_employee_name", employee.getValue("name")); saver.update(); } public void checkOANCValues() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); Entity master = dataPackage.getMasterEntity(); boolean success = true; if (master.existsEmptyValue("nc_company_id", "nc_company_code")) { success = false; dataWriter.reportOneError("订单检查", "公司主体(NC)信息缺少"); } if (master.existsEmptyValue("nc_region_id", "nc_region_code", "nc_region_name")) { success = false; dataWriter.reportOneError("订单检查", "销售大区(NC)信息缺少"); } if (master.existsEmptyValue("nc_area_id", "nc_area_code", "nc_area_name")) { success = false; dataWriter.reportOneError("订单检查", "销售区域(NC)信息缺少"); } if (master.existsEmptyValue("nc_customer_id", "nc_customer_code")) { success = false; dataWriter.reportOneError("订单检查", "客户(NC)信息缺少"); } if (master.isEmptyValue("oa_department_id")) { success = false; dataWriter.reportOneError("订单检查", "部门(OA)信息缺少"); } if (master.existsEmptyValue("oa_employee_id", "oa_employee_code", "oa_employee_name")) { success = false; dataWriter.reportOneError("订单检查", "部门(OA)信息缺少"); } if (!success) { task.terminate(); } } public void sendToOA() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); Entity master = dataPackage.getMasterEntity(); if (master == null) { logger.debug("订单不存在,跳过发送OA步骤: {}", dataPackage.getMasterId()); return; } RemoteContext remoteContext = context.getContext(RemoteContext.class); //1. 回写OA要货单号 ICall iCall = ICall.getInstance("oa_dms_order_callback"); ICallCenter iCallCenter = ICallCenter.getInstance(); iCallCenter.callRemote(context, iCall); //2. 推送OA sendOneOrderToOA(dataPackage, remoteContext); } public void syncOAOrder() throws Exception { ICallCenter iCallCenter = ICallCenter.getInstance(); ICall iCall = ICall.getInstance("oa_dms_order_send"); RemoteContext remoteContext = new RemoteContext(iCall); //1.获取未推送OA的生效订单 DataObject dataObject = DataObject.getInstance("so_order"); Filter filter = new Filter(); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(Util.quotedStr(OASyncState.Success.getName())).append(","); stringBuilder.append(Util.quotedStr(OASyncState.Syncing.getName())); String oaSyncStateFilter = "(" + stringBuilder.toString() + ")"; filter.add("ifnull(oa_sync_state,'')", " not in", oaSyncStateFilter); filter.add("state_code", "open"); EntitySet entitySet = dataObject.getTableEntitySet(filter); DataPackage dataPackage = DataPackage.getInstance("so_order"); //2. 拼接参数,推送OA for (Entity entity: entitySet) { String orderId = entity.getId(); dataPackage.setState(new PackageState()); dataPackage.setMasterId(orderId); dataPackage.loadOneDataFromDB(); sendOneOrderToOA(dataPackage, remoteContext); //3. 回写OA要货单号 iCall = ICall.getInstance("oa_dms_order_callback"); iCallCenter.callRemote(context, iCall); } } private void sendOneOrderToOA(DataPackage dataPackage, RemoteContext remoteContext) throws Exception { Entity master = dataPackage.getMasterEntity(); OrderState orderState = OrderState.parse(master.getString("state_code")); if (OrderState.Open != orderState) { return ; } ICall iCall = remoteContext.getICall(); HttpServerSource source = iCall.remoteSource(); source.login(context, iCall); Mappings headMappings = remoteContext.getMappings("so_order"); String headData = getSendOrderHeadToOA(dataPackage, headMappings); logger.debug("send OA head: {}", headData); Mappings detailMappings = remoteContext.getMappings("so_order_detail"); String detailData = getSendOrderDetailToOA(dataPackage, detailMappings); logger.debug("send OA details: {}", detailData); //1. 标记推送OA boolean sendOAActive = Settings.getBoolean("OrderSendToOA", false); OASyncState sendOAState = OASyncState.parse(master.getString("oa_sync_state")); //2. 创建请求 IRequest request = remoteContext.createRequest("api/workflow/paService/doCreateRequest"); request.addFormData("workflowId", "164964"); request.addFormData("mainData", headData); request.addFormData("requestName", master.getId()); request.addFormData("detailData", detailData); request.setDocDescription(new DocDescription(master.getId(), master.getString("code"))); SQLRunner.beginTrans(); //3. 获取返回日志 logger.info("订单状态:{}", sendOAState.getName()); if ((!sendOAActive) || sendOAState == OASyncState.Success || sendOAState == OASyncState.Syncing) { logger.info("订单推送功能未启用|已推送OA,本次OA不会收到此订单"); SQLRunner.commit(); return; } else { EntitySaver saver = dataPackage.createMasterEntitySaver(); int sendOaCount = master.getInteger("send_oa_count", 0); sendOaCount++; saver.set("oa_sync_state", OASyncState.Syncing.getName()); saver.set("send_oa_count", sendOaCount); saver.update(); logger.info("订单推送OA"); } //4. 发送请求 JSONResponse response = remoteContext.post(request, ResponseType.JSON); SQLRunner.commit(); //5. 结果返回 if (response == null || response.hasErrors()) { MailCenter mailCenter = MailCenter.getInstance(); mailCenter.sendMailByDataPackage(dataPackage, "orderSendError"); logger.debug("send OA result: null"); } else { String responseValue = response.toString(); logger.debug("send OA result: {}", responseValue); } } private String getSendOrderHeadToOA(DataPackage dataPackage, Mappings mappings) throws Exception { String value; Entity master = dataPackage.getMasterEntity(); String orgId = master.getString("org_id"); DataObject orgObject = DataObject.getInstance("md_org"); Entity orgEntity = orgObject.getTableEntity(orgId); JSONBuilder headerBuilder = new JSONBuilder(); headerBuilder.setEncodeActive(false); headerBuilder.beginArray(); for (FieldMapping mapping: mappings) { if (!mapping.isActive()) { logger.debug("跳过字段:{} --> {}", mapping.getFromName(), mapping.getToName()); continue; } String fromName = mapping.getFromName(); if (fromName.equalsIgnoreCase("receiveman") || fromName.equalsIgnoreCase("receivephone") || fromName.equalsIgnoreCase("receiveaddress") ) { value = getValue(orgEntity, mapping.getToName()); } else { value = getValue(master, mapping.getToName()); } headerBuilder.beginObject(); headerBuilder.write("fieldName", mapping.getFromName()); headerBuilder.write("fieldValue", value); headerBuilder.endObject(); } headerBuilder.endArray(); return headerBuilder.toString(); } private String getSendOrderDetailToOA(DataPackage dataPackage, Mappings mappings) throws Exception { String value; dataPackage.loadOneDataFromDB(); EntitySet entitySet = dataPackage.getItemEntitySet("so_order_detail"); JSONBuilder detailBuilder = new JSONBuilder(); detailBuilder.setEncodeActive(false); detailBuilder.setLowerNameActive(false); int index = 0; detailBuilder.beginArray(); detailBuilder.beginObject(); detailBuilder.write("tableDBName", "formtable_main_1549_dt1"); detailBuilder.beginArray("workflowRequestTableRecords"); for (Entity detail: entitySet) { detailBuilder.beginObject(); detailBuilder.write("recordOrder", index++); detailBuilder.beginArray("workflowRequestTableFields"); for (FieldMapping mapping: mappings) { value = getValue(detail, mapping.getToName()); detailBuilder.beginObject(); detailBuilder.write("fieldName", mapping.getFromName()); detailBuilder.write("fieldValue", value); detailBuilder.endObject(); } detailBuilder.endArray(); detailBuilder.endObject(); } detailBuilder.endArray(); detailBuilder.endObject(); detailBuilder.endArray(); return detailBuilder.toString(); } public void callbackOA() throws Exception { DataObject dataObject = DataObject.getInstance("sys_interface_stamp"); Entity entity; EntitySaver entitySaver; String value; RemoteContext remoteContext = context.getContext(RemoteContext.class); IRequest request = remoteContext.createRequest("api/workflow/paService/getMyWorkflowRequestList"); //1. 设置请求参数 Mappings mappings = remoteContext.getMappings("so_order_callback"); for (FieldMapping mapping: mappings) { if (!mapping.isActive()) { logger.debug("跳过字段:{} --> {}", mapping.getFromName(), mapping.getToName()); continue; } request.addFormData(mapping.getFromName(), mapping.getToName()); } //2. 获取上次请求的时间戳 NamedSQL namedSQL = NamedSQL.getInstance("getLastInterfaceStamp"); namedSQL.setParam("interfaceId", remoteContext.getICall().getId()); Entity lastStamp = namedSQL.getEntity(); //3. 过滤条件 mappings = remoteContext.getMappings("so_order_callback_conditions"); JSONBuilder conditionsBuilder = new JSONBuilder(); conditionsBuilder.setEncodeActive(false); conditionsBuilder.beginObject(); for (FieldMapping mapping: mappings) { if (!mapping.isActive()) { logger.debug("跳过字段:{} --> {}", mapping.getFromName(), mapping.getToName()); continue; } value = getValue(lastStamp, mapping.getToName()); conditionsBuilder.write(mapping.getFromName(), value); } conditionsBuilder.endObject(); String conditions = conditionsBuilder.toString(); logger.info("OA callback conditions: {}", conditions); request.addFormData("conditions", conditions); //4. 发送请求 boolean sendOAActive = Settings.getBoolean("OrderSendToOA", false); if (!sendOAActive) { dataWriter.reportOneMessage("从OA回写订单", "订单推送功能未启用,跳过OA订单回写"); logger.info("订单推送功能未启用,跳过OA订单回写"); return; } else { logger.info("订单推送OA"); } JSONResponse response = remoteContext.post(request, ResponseType.JSON); JArrayReader jarray = response.parseJArrayReader(); //5. 回写订单 dataObject = DataObject.getInstance("so_order"); for (JSONReader json : jarray) { String orderId = json.getString("requestName"); String requestId = json.getString("requestId"); entity = dataObject.getTableEntity(orderId); if (entity == null ) { continue; } entitySaver = dataObject.createEntitySaver(entity); entitySaver.set("oa_code", requestId); if(Util.isEmpty(requestId)) { entitySaver.set("oa_sync_state", OASyncState.Success.getName()); } entitySaver.update(); } } public void createDelivery() throws Exception { String orderNo = dataReader.getString("order_no"); DateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd"); OnlineUser user = OnlineUser.getInstance(); //1. 获取订单 DataPackage dataPackage = DataPackage.getInstance("so_order"); dataPackage.setFilter(new Filter("code", orderNo)); dataPackage.loadOneDataFromDB(); DataObject dataObject = DataObject.getInstance("so_delivery"); EntitySaver saver = dataObject.createEntitySaver(); //2. 创建发货单头 String deliveryId = ID.newValue(); Entity orderMaster = dataPackage.getMasterEntity(DataSource.DB); String deliveryCode = CodeEngine.nextval("Code-Delivery", null); saver.set("id", deliveryId); saver.set("company_name", orderMaster.getValue("company_name")); saver.set("bu_name", orderMaster.getValue("bu_name")); saver.set("state_code", "Unreceived"); saver.set("state_name", "未收货"); saver.set("code", deliveryCode); saver.set("order_id", orderMaster.getId()); saver.set("order_code", orderMaster.getString("code")); saver.set("doc_date", orderMaster.getValue("doc_date")); saver.set("doc_type", "普通销售出库"); saver.set("shipto_date", dateFormat.format(new Date())); saver.set("plan_shipto_date", orderMaster.getValue("date_plan_ship_to")); saver.set("customer_id", orderMaster.getValue("customer_id")); saver.set("customer_code", orderMaster.getValue("customer_code")); saver.set("customer_code_ncc", orderMaster.getValue("nc_customer_code")); saver.set("customer_name", orderMaster.getValue("customer_name")); saver.set("company_name", orderMaster.getValue("company_name")); saver.set("shipto_address", orderMaster.getValue("shipto_address")); saver.set("shipto_contact", orderMaster.getValue("shipto_contact")); saver.set("shipto_phone", orderMaster.getValue("shipto_phone")); saver.set("supplier_code", orderMaster.getValue("company_id")); saver.set("supplier_name", orderMaster.getValue("company_name")); saver.set("transport_type", orderMaster.getValue("plan_shipto_type")); String currentMills = String.valueOf(System.currentTimeMillis()); saver.set("express_code", "SF027" + currentMills.substring(currentMills.length() - 9)); saver.set("express_company", "顺丰"); saver.set("creator_id", user.getCode()); saver.set("creator_name", user.getName()); saver.insert(); //3. 创建发货单明细 EntitySet orderDetails = dataPackage.getItemEntitySet("so_order_detail", DataSource.DB); dataObject = DataObject.getInstance("so_delivery_detail"); saver = dataObject.createEntitySaver(); for (Entity orderDetail : orderDetails) { saver.set("id", ID.newValue()); saver.set("parent_id", deliveryId); saver.set("order_id", orderMaster.getValue("id")); saver.set("order_detail_id", orderDetail.getValue("id")); saver.set("order_code", orderMaster.getValue("code")); saver.set("order_type_code", orderMaster.getValue("type_code")); saver.set("order_right_code", "normal"); saver.set("stock_type_code", "Standard"); saver.set("product_id", orderDetail.getValue("sku_id")); saver.set("product_code", orderDetail.getValue("product_code")); saver.set("product_name", orderDetail.getValue("product_name")); saver.set("material_code", orderDetail.getValue("product_code")); saver.set("material_name", orderDetail.getValue("product_name")); saver.set("spec", orderDetail.getValue("spec")); saver.set("unit", orderDetail.getValue("unit")); saver.set("batch_no", "N/A"); saver.set("valid_from", "2023-07-28"); saver.set("valid_to", "2025-07-28"); saver.set("batch_sn",""); saver.set("qty", orderDetail.getValue("qty")); if ("gift".equals(orderDetail.getValue("type_code"))) { saver.set("is_money_free", 1); } else { saver.set("is_money_free", 0); } saver.set("shipto_address", orderMaster.getValue("shipto_address_fullname")); saver.set("shipto_contact", orderMaster.getValue("shipto_contact")); saver.set("shipto_phone", orderMaster.getValue("shipto_phone")); saver.set("voucher_no", orderDetail.getValue("rebate_code")); saver.set("manufacturer", ""); saver.insert(); } dataObject = DataObject.getInstance("so_order"); saver = dataObject.createEntitySaver(orderMaster); int deliveryQty = orderMaster.getInt("qty_delivery") + orderMaster.getInt("qty_total"); saver.set("qty_delivery", deliveryQty); saver.set("state_code", "Whole"); saver.set("state_delivery_code", "Whole"); saver.set("state_delivery_name", "全部发货"); saver.set("state_name", "已发货"); saver.update(); } public void updateQtyDelivery() throws Exception { String orderId = dataReader.getString("order_id"); //1. 获取发货数量 DataObject dataObject = DataObject.getInstance("so_delivery_detail"); Entity qtyDeliverySumEntity = dataObject.getSummary("qty", new Filter("order_id", orderId)); //2. 获取订单 DataPackage dataPackage = DataPackage.getInstance("so_order"); dataPackage.setFilter(new Filter("id", orderId)); dataPackage.loadOneDataFromDB(); Entity orderMaster = dataPackage.getMasterEntity(); //3. 更新订单发货数量 EntitySaver saver = dataObject.createEntitySaver(orderMaster); saver.set("qty_delivery", qtyDeliverySumEntity.getValue("qty_sum")); saver.update(); } public void updateQtyReceived() throws Exception { String deliveryId = dataReader.getString("id"); String orderId; Entity orderEntity; int deliveryQty = 0, receivedQty = 0, receivingQty = 0, orderQty = 0; if (Util.isEmpty(deliveryId)) { dataWriter.reportOneMessage("订单收货", "未获取到发货单信息,无法收货"); return; } //1. 获取订单收货数量 NamedSQL namedSQL = NamedSQL.getInstance("getQtyReceived"); namedSQL.setParam("deliveryId", deliveryId); EntitySet qtyReceivedEntitySet = SQLRunner.getEntitySet(namedSQL); //2. 回写订单 DataObject dataObject = DataObject.getInstance("so_order"); EntitySaver saver; SQLRunner.beginTrans(); for(Entity entity: qtyReceivedEntitySet) { orderId = entity.getString("order_id"); receivingQty = entity.getInt("qty_received"); if (Util.isEmpty(orderId)) { dataWriter.reportOneMessage("订单收货", "未获取到订单信息,无法收货"); return; } orderEntity = dataObject.getTableEntity(orderId); orderQty = orderEntity.getInt("qty_total"); deliveryQty = orderEntity.getInt("qty_delivery"); receivedQty = orderEntity.getInt("qty_received"); receivedQty = receivedQty + receivingQty; saver = dataObject.createEntitySaver(orderEntity); if (receivedQty > deliveryQty) { dataWriter.reportOneMessage("订单收货", "收货数量大于发货数量,请勿重复收货"); SQLRunner.rollback(); return; } else if (receivedQty > orderQty) { dataWriter.reportOneMessage("订单收货", "收货数量大于订单数量,请勿重复收货"); SQLRunner.rollback(); return; } else if(receivedQty == orderQty){ saver.set("qty_received",receivedQty); } else if(receivedQty < orderQty) { saver.set("qty_received",receivedQty); } saver.update(); } SQLRunner.commit(); } private String getValue(Entity entity, String fieldName) { if (Util.isEmpty(fieldName)) { return ""; } //1. 如果是常数,直接返回 if (!fieldName.startsWith("@{")) { return fieldName; } //2. 如果是字段名称,获取 Entity 字段数据 fieldName = fieldName.substring(2, fieldName.length() - 1); String result = onGetEntityValue(fieldName, entity); if (result != null) { return result; } return entity.getString(fieldName, ""); } private String onGetEntityValue(String fieldName, Entity entity) { if ("doc_date".equals(fieldName)) { Date date = entity.getDate("doc_date", null); String result = Util.DataTimeToString(date, "yyyy-MM-dd"); if (result == null) { result = ""; } return result; } else if ("rate_discount".equals(fieldName)) { BigDecimal amtNet = entity.getBigDecimal("amt_net", BigDecimal.ZERO); BigDecimal listAmt = entity.getBigDecimal("amt_list", BigDecimal.ZERO); BigDecimal rate = OrderCalculator.divide(amtNet, listAmt, 8); rate = rate.multiply(BigDecimal.valueOf(100)); rate.setScale(6, RoundingMode.HALF_UP); return rate.toPlainString(); } else if ("is_gift".equals(fieldName)) { OrderLineType lineType = OrderLineType.parse(entity.getString("type_code")); String result = "0"; if (OrderLineType.OnsiteQty == lineType || OrderLineType.RebateQty == lineType) { result = "1"; } return result; } else if ("amt_list".equals(fieldName)) { OrderLineType lineType = OrderLineType.parse(entity.getString("type_code")); BigDecimal result = entity.getBigDecimal("amt_list", BigDecimal.ZERO); if (OrderLineType.OnsiteQty == lineType || OrderLineType.RebateQty == lineType) { result = BigDecimal.ZERO; } return result.toString(); } return null; } public void updateImplantPositionHierarchy() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); DataObject dateObject = DataObject.getInstance("so_implant"); Entity masterEntity = dataPackage.getMasterEntity(); EntitySaver saver = dateObject.createEntitySaver(masterEntity); NamedSQL namedSQL = NamedSQL.getInstance("getImplantPositionHierarchy"); String hospitalId = masterEntity.getString("hospital_id"); namedSQL.setParam("hospitalId", hospitalId); Entity hierarchyEntity = SQLRunner.getEntity(namedSQL); String positionId = hierarchyEntity.getString("position_id"); String areaPosition = hierarchyEntity.getString("level3"); String regionPosition = hierarchyEntity.getString("level2"); if (areaPosition == null || areaPosition.isEmpty()) { areaPosition = hierarchyEntity.getString("level2"); regionPosition = hierarchyEntity.getString("level1"); } namedSQL = NamedSQL.getInstance("getPositionEmployee"); namedSQL.setParam("positionId", regionPosition); Entity positionEntity = SQLRunner.getEntity(namedSQL); saver.set("sale_region", positionEntity.getString("position_name")); saver.set("sale_region_employee_code", positionEntity.getString("employee_code")); saver.set("sale_region_employee_name", positionEntity.getString("employee_name")); namedSQL.setParam("positionId", areaPosition); positionEntity = SQLRunner.getEntity(namedSQL); saver.set("sale_area", positionEntity.getString("position_name")); saver.set("sale_area_employee_code", positionEntity.getString("employee_code")); saver.set("sale_area_employee_name", positionEntity.getString("employee_name")); namedSQL.setParam("positionId", positionId); positionEntity = SQLRunner.getEntity(namedSQL); saver.set("sale_position_employee_code", positionEntity.getString("employee_code")); saver.set("sale_position_employee_name", positionEntity.getString("employee_name")); saver.set("sale_position_id", positionEntity.getString("position_id")); saver.update(); } public void orderClose() throws Exception { DataPackage dataPackage = dataReader.getDataPackage(); Entity master = dataPackage.getMasterEntity(DataSource.Request); master = dataPackage.getMasterEntity(); EntitySet details = dataPackage.getItemEntitySet("so_order_detail",DataSource.Request); String orderId = master.getId(); //1. 检查头状态 SQLRunner.beginTrans(); OrderState orderState = loadOrderState(master); if(!OrderState.Open.equals(orderState)) { dataWriter.reportOneError("orderLineClose", "当前状态不允许整单订单:" + orderState.getName()); SQLRunner.commit(); return ; } try { DataObject dataObject = dataPackage.getDetailDataObject(); EntitySaver entitySaver; String detailCloseReason; BigDecimal orderCloseRebateAmt = BigDecimal.ZERO; BigDecimal orderCloseQty = BigDecimal.ZERO; for (Entity detail : details) { String detailId = detail.getId(); detailCloseReason = detail.getString("close_reason", ""); //2.1 关闭明细行 entitySaver = dataObject.createEntitySaver(detailId); BigDecimal lineCloseQty = detail.getBigDecimal("qty_close", BigDecimal.ZERO); BigDecimal lineRebateCloseAmt = detail.getBigDecimal("amt_rebate_close", BigDecimal.ZERO); BigDecimal qtyRebateClose = detail.getBigDecimal("qty_rebate_close", BigDecimal.ZERO); orderCloseQty = orderCloseQty.add(lineCloseQty); //2.2 关闭积分,数量校验 orderCloseRebateAmt = orderCloseRebateAmt.add(lineRebateCloseAmt); if (checkQty(detailId, lineCloseQty) || checkRebateAmt(orderId, orderCloseRebateAmt)) { dataWriter.reportOneError("orderLineClose", "关闭数量/金额超过行数量/金额,不允许关闭"); SQLRunner.rollback(); return ; } entitySaver.set("amt_rebate_close", lineRebateCloseAmt); entitySaver.set("qty_close", lineCloseQty); entitySaver.set("line_state_code", detail.getString("line_state_code")); entitySaver.set("qty_rebate_close", qtyRebateClose); entitySaver.set("close_reason", detailCloseReason); if (!Util.isEmpty(detail.getString("todate_close"))) { entitySaver.set("todate_close", detail.getValue("todate_close")); } entitySaver.update(); //3.记账 writerCloseBook(detail, "order.line.rebate.qty.close",detailId, BigDecimal.ZERO.compareTo(qtyRebateClose) < 0); writerCloseBook(detail, "order.line.rebate.amt.close",detailId, BigDecimal.ZERO.compareTo(lineRebateCloseAmt) < 0); } //4.回写头状态 master.set("qty_close", orderCloseQty); dataObject = DataObject.getInstance("so_order"); dataObject.updateEntity(master); orderState = loadOrderState(master); } catch (Exception e) { dataWriter.reportOneError("orderLineClose", "订单行关闭失败"); e.printStackTrace(); SQLRunner.rollback(); } SQLRunner.commit(); dataWriter.addValue("订单行关闭成功"); } public void orderDetailClose() throws Exception { String detailId = dataReader.getString("id"); DataObject dataObject = DataObject.getInstance("so_order_detail"); Entity detailEntity = dataObject.getTableEntity(detailId); String orderId = detailEntity.getString("parent_id"); dataObject = DataObject.getInstance("so_order"); Entity masterEntity = dataObject.getTableEntity(orderId); SQLRunner.beginTrans(); //1. 检查头状态 OrderState orderState = loadOrderState(masterEntity); if(!(orderState.equals(OrderState.Partial) || OrderState.Open.equals(orderState))) { dataWriter.reportOneError("orderLineClose", "当前状态不允许关闭订单:" + orderState.getName()); SQLRunner.commit(); return ; } try { //2.1 关闭明细行 BigDecimal qtyClose = dataReader.getBigDecimal("qty_close", BigDecimal.ZERO); //2.2 关闭积分,数量校验 BigDecimal rebateCloseAmt = dataReader.getBigDecimal("amt_rebate_close", BigDecimal.ZERO); detailEntity.set("amt_rebate_close", rebateCloseAmt); if (checkQty(detailId, qtyClose) || checkRebateAmt(orderId, rebateCloseAmt)) { dataWriter.reportOneError("orderLineClose", "关闭数量/金额超过行数量/金额,不允许关闭"); SQLRunner.rollback(); return ; } detailEntity.set("qty_close", qtyClose); detailEntity.set("line_state_code", dataReader.getString("line_state_code")); detailEntity.set("qty_rebate_close", dataReader.getValue("qty_rebate_close")); detailEntity.set("close_reason", dataReader.getValue("close_reason")); if (!Util.isEmpty(dataReader.getString("todate_close"))) { detailEntity.set("todate_close", dataReader.getValue("todate_close")); } dataObject = DataObject.getInstance("so_order_detail"); dataObject.updateEntity(detailEntity); //3.记账 writerCloseBook(detailEntity, "order.line.rebate.qty.close", detailId); writerCloseBook(detailEntity, "order.line.rebate.amt.close", detailId); //4.回写头状态 BigDecimal orderCloseQty = masterEntity.getBigDecimal("qty_close", BigDecimal.ZERO); orderCloseQty = orderCloseQty.add(qtyClose); masterEntity.set("qty_close", orderCloseQty); dataObject = DataObject.getInstance("so_order"); dataObject.updateEntity(masterEntity); orderState = loadOrderState(masterEntity); } catch (Exception e) { dataWriter.reportOneError("orderLineClose", "订单行关闭失败"); e.printStackTrace(); SQLRunner.rollback(); } SQLRunner.commit(); dataWriter.addValue("订单行关闭成功"); } public void orderDetailCancelClose() throws Exception{ ActionBucket actionBucket = ActionBucket.getInstance(); ActionMeta action = actionBucket.get("orderDetailCloseCancel"); WorkStep workStep = new WorkStep(action); WorkflowDispatcher dispatcher = WorkflowDispatcher.getInstance(); dispatcher.execWorkflow(dataReader, dataWriter, workStep, context); // 更新订单 DataPackage dataPackage = dataReader.getDataPackage(); dataPackage.loadOneDataFromPersist(); Entity master = dataPackage.getMasterEntity(); PackageItem detailItem = dataPackage.getDetailItem(); DataObject dataObject = detailItem.getDataObject(); EntitySet detailSet = detailItem.getEntitySet(DataSource.Request); EntitySaver saver; Entity detailEntity; String detailId; BigDecimal orderQtyClose = master.getBigDecimal("qty_close", BigDecimal.ZERO), detailQtyClose; for (Entity detail : detailSet) { detailId = detail.getId(); detailEntity = dataObject.getTableEntity(detailId); detailQtyClose = detailEntity.getBigDecimal("qty_close", BigDecimal.ZERO); orderQtyClose = orderQtyClose.subtract(detailQtyClose); saver = dataObject.createEntitySaver(detailId); saver.set("qty_close", ""); saver.set("todate_close", ""); saver.set("amt_rebate_close", ""); saver.set("qty_rebate_close", ""); saver.set("line_state_code", ""); saver.update(); } dataObject = dataPackage.getMasterDataObject(); saver = dataObject.createEntitySaver(dataPackage.getMasterId()); master.set("qty_close", orderQtyClose); saver.set("qty_close", orderQtyClose); saver.update(); loadOrderState(master); } public void orderDetailCloseCancel() throws Exception{ } private boolean checkQty(String orderDetailId, BigDecimal closeQty) throws Exception { DataObject dataObject = DataObject.getInstance("so_order_detail"); Entity detailEntity = dataObject.getTableEntity(orderDetailId); BigDecimal lineQty = detailEntity.getBigDecimal("qty", BigDecimal.ZERO); // 关闭数量超过行数量,则校验不通过 return closeQty.compareTo(lineQty) > 0; } private boolean checkRebateAmt(String orderId, BigDecimal rebateCloseAmt) throws Exception { DataObject dataObject = DataObject.getInstance("so_order_detail_rebate"); Entity rebateClosedAmtEntity = dataObject.getSummary(" sum(amt) amt_sum ", new Filter("parent_id", orderId)); BigDecimal orderRebateAmt = rebateClosedAmtEntity.getBigDecimal("amt_sum", BigDecimal.ZERO); // 关闭数量汇总超过订单总折扣,则校验不通过 return orderRebateAmt.compareTo(rebateCloseAmt) < 0; } private void writerCloseBook(Entity detail, String code, String detailId, boolean isBook) throws Exception { if(!isBook) { return ; } writerCloseBook(detail, code, detailId); } private void writerCloseBook(Entity detailEntity, String code, String detailId) throws Exception { List bookCommands = BookCommandBucket.get(code); for(BookCommand bookCommand : bookCommands) { //1. 获取数据 NamedSQL getBookFlow; BigDecimal rebateCloseNum; Filter filter = new Filter(); if(BookName.RebateAmt.equals(bookCommand.getBookName())){ getBookFlow = NamedSQL.getInstance("getCloseOrderDetailRebateAmtBookFlow"); rebateCloseNum = detailEntity.getBigDecimal("amt_rebate_close", BigDecimal.ZERO); } else { getBookFlow = NamedSQL.getInstance("getCloseOrderDetailRebateQtyBookFlow"); rebateCloseNum = detailEntity.getBigDecimal("qty_rebate_close", BigDecimal.ZERO); } if (BigDecimal.ZERO.equals(rebateCloseNum)) { return; } getBookFlow.setParam("document_num", rebateCloseNum); getBookFlow.setParam("documentTypeCode" ,bookCommand.getConfigDocTypeSegment()); getBookFlow.setParam("expireDate", detailEntity.getString("todate_close") ); getBookFlow.setParam("batch_mark", bookCommand.getBatchMark()); filter.add("document_detail.id",detailEntity.getString("id")); getBookFlow.setFilter(filter); EntitySet entitySet = SQLRunner.getEntitySet(getBookFlow); FlowTable flowTable = bookCommand.getFlowTable(); flowTable.setEntitySet(entitySet); //2. 写入流水,明细 writerRebateFlow(bookCommand); writerRebateDetail(bookCommand); } } private void writerRebateDetail(BookCommand bookCommand) throws Exception { FlowTable flowTable = bookCommand.getFlowTable(); String fieldType = bookCommand.getBookName().getField(); DataObject dataObject = DataObject.getInstance(bookCommand.getDetailTableName()); for (Entity flow : flowTable) { Entity entity = dataObject.createTableEntity(false); String rebateId = bookCommand.getBatchMark(); entity.set("id", rebateId); entity.set("item_name", flow.getString("rebate_name")); entity.set("code", flow.getValue("rebate_code")); entity.set("year", flow.getValue("year")); entity.set("season", flow.getValue("season")); entity.set("valid_to", flow.getValue("valid_to")); entity.set("doc_date", flow.getValue("doc_date")); entity.set("expire_date", flow.getValue("valid_to")); entity.set("valid_from", flow.getValue("valid_from")); entity.set("bu_id", flow.getString("bu_id")); entity.set("bu_name", flow.getString("bu_name")); entity.set("company_id", flow.getString("company_id")); entity.set("company_name", flow.getString("company_name")); entity.set("org_id", flow.getString("org_id")); entity.set("account_id", flow.getString("account_id")); entity.set("account_code", flow.getString("account_code")); entity.set("account_name", flow.getString("account_name")); entity.set("spec", flow.getString("spec")); entity.set("sku_id", flow.getString("sku_id")); entity.set("product_id", flow.getString("product_id")); entity.set("product_code", flow.getString("product_code")); entity.set("product_name", flow.getString("product_name")); BigDecimal amtUsed = flow.getBigDecimal(fieldType) == null ? BigDecimal.ZERO : flow.getBigDecimal(fieldType); entity.set(fieldType + "_book", 0); entity.set(fieldType + "_used", amtUsed.negate()); entity.set(fieldType + "_net", amtUsed); entity.set(fieldType + "_freeze", 0); entity.set(fieldType + "_available", amtUsed); entity.set("operate_name", flow.getValue("operate_name")); entity.set("batch_mark", flow.getValue("batch_mark")); entity.set("create_time", new Date()); entity.set("update_time", new Date()); dataObject.insertEntity(entity, true); updateDocDetailRebateId(flow.getString("document_detail_id"), rebateId, fieldType); } } private void updateDocDetailRebateId(String docDetailId, String rebateId, String type) throws Exception { DataObject dataObject = DataObject.getInstance("so_order_detail"); EntitySaver saver = dataObject.createEntitySaver(docDetailId); if ("amt".equals(type)) { saver.set("close_amt_rebate_id", rebateId); } else { saver.set("close_qty_rebate_id", rebateId); } saver.update(); } private void writerRebateFlow(BookCommand bookCommand) throws Exception { QtyCommand qtyCommand = bookCommand.getQtyCommand(); if (qtyCommand.isDoNothing()) { return; } //1. 记录流水账 DataObject dataObject = DataObject.getInstance(bookCommand.getFlowTableName()); String batchMark = bookCommand.getBatchMark(); FlowTable flowTable = bookCommand.getFlowTable(); for (Entity flow : flowTable) { String field = bookCommand.getBookName().getField(); BigDecimal qty = flow.getBigDecimal(field); EntitySaver saver = dataObject.createEntitySaver(); saver.set("id", ID.newValue()); saver.set("rebate_id", flow.getValue("rebate_id")); saver.set("rebate_code", flow.getValue("rebate_code")); saver.set("operate_name", flow.getValue("operate_name")); saver.set("year", flow.getValue("year")); saver.set("season", flow.getValue("season")); saver.set("doc_code", flow.getValue("doc_code")); saver.set("doc_date", flow.getValue("doc_date")); saver.set("expire_date", flow.getValue("valid_to")); saver.set("valid_from", flow.getValue("valid_from")); saver.set("valid_to", flow.getValue("valid_to")); saver.set("bu_id", flow.getValue("bu_id")); saver.set("bu_name", flow.getValue("bu_name")); saver.set("company_id", flow.getValue("company_id")); saver.set("company_name", flow.getValue("company_name")); saver.set("org_id", flow.getValue("org_id")); saver.set("account_id", flow.getValue("account_id")); saver.set("account_code", flow.getValue("account_code")); saver.set("account_name", flow.getString("account_name")); saver.set("spec", flow.getString("spec")); saver.set("sku_id", flow.getString("sku_id")); saver.set("product_id", flow.getString("product_id")); saver.set("product_code", flow.getString("product_code")); saver.set("product_name", flow.getString("product_name")); boolean negativeConver = bookCommand.isNegativeConvert(); if (qtyCommand.isSetAdd()) { BigDecimal qty_add = qty.multiply(qtyCommand.getAddOperator()); if (qty_add.compareTo(BigDecimal.ZERO) < 0 && negativeConver) { saver.set("num_used", BigDecimal.ZERO.subtract(qty_add)); } else { saver.set("num_return", qty_add); } } if (qtyCommand.isSetDelete()) { BigDecimal qty_delete = qty.multiply(qtyCommand.getDeleteOperator()); if (qty_delete.compareTo(BigDecimal.ZERO) < 0 && negativeConver) { saver.set("num_return", BigDecimal.ZERO.subtract(qty_delete)); } else { saver.set("num_used", qty_delete); } } FreezeCondition freezeCondition = bookCommand.getFreezeCondition(); if (qtyCommand.isSetFreeze()) { BigDecimal qty_freeze = qty.multiply(qtyCommand.getFreezeOperator()); if (freezeCondition.isCompatible(qty_freeze)) { saver.set("num_freeze", qty_freeze); } } if (qtyCommand.isSetUnfreeze()) { BigDecimal qty_unfreeze = qty.multiply(qtyCommand.getUnfreezeOperator()); if (freezeCondition.isCompatible(qty_unfreeze)) { saver.set("num_unfreeze", qty_unfreeze); } } saver.set("record_operator", RecordOperator.Insert.name()); saver.set("batch_mark", batchMark); saver.insert(); } } private OrderState loadOrderState(Entity order) throws Exception { OrderState orderState = OrderState.parse(order.getString("state_code")); OrderState refreshState; BigDecimal deliveryQty = order.getBigDecimal("qty_delivery", BigDecimal.ZERO); BigDecimal totalQty = order.getBigDecimal("qty_total", BigDecimal.ZERO); BigDecimal returnQty = order.getBigDecimal("qty_return", BigDecimal.ZERO); BigDecimal closeQty = order.getBigDecimal("qty_close", BigDecimal.ZERO); BigDecimal orderQty = totalQty; BigDecimal completedQty = deliveryQty.add(closeQty); completedQty = completedQty.add(returnQty); if (BigDecimal.ZERO.equals(deliveryQty)) { refreshState = OrderState.Open; } if (completedQty.compareTo(orderQty) >= 0) { refreshState = OrderState.Whole; } else if (BigDecimal.ZERO.compareTo(deliveryQty) < 0) { refreshState = OrderState.Partial; } else { logger.info("订单状态【" + orderState.getName() + "】未发生改变"); return orderState; } DataObject dataObject = DataObject.getInstance("so_order"); if(!orderState.equals(refreshState)) { EntitySaver saver = dataObject.createEntitySaver(order); String stateName = refreshState.getName(); saver.set("state_code",refreshState); saver.set("state_name",stateName); saver.update(); logger.info("订单【" + order.getString("code") + "】状态为:" + stateName); } return refreshState; } }