363 lines
26 KiB
Java
363 lines
26 KiB
Java
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());
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
} |