2025-06-06 11:36:05 +08:00
|
|
|
package com.engine.zhuyou.service.impl;
|
|
|
|
|
|
|
|
|
|
import com.engine.core.impl.Service;
|
2025-08-01 14:59:22 +08:00
|
|
|
import com.engine.jz.util.CommonUtil;
|
2025-06-06 11:36:05 +08:00
|
|
|
import com.engine.zhuyou.service.CommonFormModeService;
|
2025-08-12 13:49:27 +08:00
|
|
|
import com.google.gson.Gson;
|
|
|
|
|
import com.google.gson.reflect.TypeToken;
|
2025-06-06 11:36:05 +08:00
|
|
|
import com.weaver.general.BaseBean;
|
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
2025-08-01 14:59:22 +08:00
|
|
|
import org.springframework.util.CollectionUtils;
|
2025-06-06 11:36:05 +08:00
|
|
|
import weaver.common.DateUtil;
|
|
|
|
|
import weaver.conn.RecordSet;
|
2025-08-01 14:59:22 +08:00
|
|
|
import weaver.formmode.setup.ModeRightInfo;
|
2025-06-06 11:36:05 +08:00
|
|
|
import weaver.general.Util;
|
2025-08-01 14:59:22 +08:00
|
|
|
|
2025-08-12 13:49:27 +08:00
|
|
|
import java.lang.reflect.Type;
|
2025-08-01 14:59:22 +08:00
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
|
import java.time.YearMonth;
|
2025-06-06 11:36:05 +08:00
|
|
|
import java.util.ArrayList;
|
2025-08-01 14:59:22 +08:00
|
|
|
import java.util.Date;
|
2025-06-06 11:36:05 +08:00
|
|
|
import java.util.HashMap;
|
2025-08-01 14:59:22 +08:00
|
|
|
import java.util.HashSet;
|
2025-06-06 11:36:05 +08:00
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
2025-08-01 14:59:22 +08:00
|
|
|
import java.util.Set;
|
2025-06-06 11:36:05 +08:00
|
|
|
|
|
|
|
|
public class CommonFormModeServiceImpl extends Service implements CommonFormModeService {
|
|
|
|
|
|
|
|
|
|
public BaseBean bb = new BaseBean();
|
|
|
|
|
|
|
|
|
|
@Override
|
2025-06-10 14:49:39 +08:00
|
|
|
public Map<String, Object> getAllState(Map<String, Object> params) {
|
|
|
|
|
bb.writeLog("getAllState param:" + params);
|
2025-06-06 11:36:05 +08:00
|
|
|
Map<String, Object> resultMap = new HashMap<>();
|
|
|
|
|
try {
|
2025-06-10 14:49:39 +08:00
|
|
|
String rq = Util.null2String(params.get("rq"));
|
2025-06-06 11:36:05 +08:00
|
|
|
if (StringUtils.isEmpty(rq)) {
|
|
|
|
|
rq = DateUtil.getCurrentDate();
|
|
|
|
|
}
|
2025-06-10 14:49:39 +08:00
|
|
|
String bhParam = Util.null2String(params.get("bh"));
|
|
|
|
|
String ygxmParam = Util.null2String(params.get("ygxm"));
|
|
|
|
|
String gcParam = Util.null2String(params.get("gc"));
|
|
|
|
|
String bmParam = Util.null2String(params.get("bm"));
|
|
|
|
|
String zwParam = Util.null2String(params.get("zw"));
|
|
|
|
|
String qfParam = Util.null2String(params.get("qf"));
|
|
|
|
|
String zzParam = Util.null2String(params.get("zz"));
|
|
|
|
|
String zgdjParam = Util.null2String(params.get("zgdj"));
|
|
|
|
|
String jhParam = Util.null2String(params.get("jh"));
|
|
|
|
|
String bbParam = Util.null2String(params.get("bb"));
|
|
|
|
|
// 人事变更记录表billid
|
2025-06-06 11:36:05 +08:00
|
|
|
String billid = bb.getPropValue("zhuyou_prop_zm", "rsbgjl_table_billid");
|
|
|
|
|
if (StringUtils.isEmpty(billid)) {
|
|
|
|
|
billid = "-198";
|
|
|
|
|
}
|
|
|
|
|
RecordSet rs = new RecordSet();
|
|
|
|
|
//表格数据
|
|
|
|
|
List<Map<String, Object>> infos = new ArrayList<>();
|
|
|
|
|
String sql = "SELECT t1.*, t3.lastname, t4.jobactivitymark, t5.zgdj as zgdjName, t6.jhmc, t7.bbmc " +
|
|
|
|
|
"FROM uf_rsbgjl t1\n" +
|
|
|
|
|
"INNER JOIN (\n" +
|
|
|
|
|
" SELECT \n" +
|
|
|
|
|
" xm,\n" +
|
|
|
|
|
" MAX(sxrq) AS sxrq " +
|
|
|
|
|
" FROM uf_rsbgjl\n" +
|
|
|
|
|
" WHERE sxrq <= '" + rq + "' " +
|
|
|
|
|
" GROUP BY xm\n" +
|
|
|
|
|
") t2 ON t1.xm = t2.xm \n" +
|
|
|
|
|
" AND t1.sxrq = t2.sxrq " +
|
|
|
|
|
"LEFT JOIN hrmresource t3 ON t1.xm = t3.id " +
|
|
|
|
|
"LEFT JOIN hrmjobactivities t4 ON t1.zw = t4.id " +
|
|
|
|
|
"LEFT JOIN uf_zgdjda t5 ON t1.zgdj = t5.zgdjbh " +
|
|
|
|
|
"LEFT JOIN uf_jhda t6 ON t1.jh = t6.jhbm " +
|
|
|
|
|
"LEFT JOIN uf_bbgl t7 on t1.bb = t7.bbbm ";
|
|
|
|
|
|
|
|
|
|
rs.execute(sql);
|
|
|
|
|
while (rs.next()) {
|
|
|
|
|
String xm = rs.getString("xm");
|
|
|
|
|
String lastname = rs.getString("lastname");
|
|
|
|
|
String gh = rs.getString("gh");
|
|
|
|
|
String bmmc = rs.getString("bmmc");
|
|
|
|
|
String gcmc = rs.getString("gcmc");
|
|
|
|
|
String jobactivitymark = rs.getString("jobactivitymark");
|
|
|
|
|
String qf = rs.getString("qf");
|
|
|
|
|
String zz = rs.getString("zz");
|
|
|
|
|
String zgdjName = rs.getString("zgdjName");
|
|
|
|
|
String jhmc = rs.getString("jhmc");
|
|
|
|
|
String bbmc = rs.getString("bbmc");
|
|
|
|
|
String sxrq = rs.getString("sxrq");
|
|
|
|
|
|
2025-06-10 14:49:39 +08:00
|
|
|
String qfName = null;
|
|
|
|
|
if (StringUtils.isNotEmpty(qf)) {
|
|
|
|
|
qfName = getSelectNameMain("qf", billid, qf);
|
|
|
|
|
}
|
|
|
|
|
String zzName = null;
|
|
|
|
|
if (StringUtils.isNotEmpty(zz)) {
|
|
|
|
|
zzName = getSelectNameMain("zz", billid, zz);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (StringUtils.isNotEmpty(bhParam)) {
|
|
|
|
|
if (StringUtils.isEmpty(gh) || !gh.contains(bhParam)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isNotEmpty(ygxmParam)) {
|
|
|
|
|
if (StringUtils.isEmpty(lastname) || !lastname.contains(ygxmParam)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isNotEmpty(gcParam)) {
|
|
|
|
|
if (StringUtils.isEmpty(gcmc) || !gcmc.contains(gcParam)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isNotEmpty(bmParam)) {
|
|
|
|
|
if (StringUtils.isEmpty(bmmc) || !bmmc.contains(bmParam)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isNotEmpty(zwParam)) {
|
|
|
|
|
if (StringUtils.isEmpty(jobactivitymark) || !jobactivitymark.contains(zwParam)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isNotEmpty(qfParam)) {
|
|
|
|
|
if (StringUtils.isEmpty(qfName) || !qfName.contains(qfParam)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isNotEmpty(zzParam)) {
|
|
|
|
|
if (StringUtils.isEmpty(zzName) || !zzName.contains(zzParam)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isNotEmpty(zgdjParam)) {
|
|
|
|
|
if (StringUtils.isEmpty(zgdjName) || !zgdjName.contains(zgdjParam)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isNotEmpty(jhParam)) {
|
|
|
|
|
if (StringUtils.isEmpty(jhmc) || !jhmc.contains(jhParam)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (StringUtils.isNotEmpty(bbParam)) {
|
|
|
|
|
if (StringUtils.isEmpty(bbmc) || !bbmc.contains(bbParam)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-06 11:36:05 +08:00
|
|
|
Map<String, Object> info = new HashMap<>();
|
|
|
|
|
info.put("ryid", xm);
|
|
|
|
|
info.put("xm", lastname);
|
|
|
|
|
info.put("gh", gh);
|
|
|
|
|
info.put("gc", gcmc);
|
2025-06-10 14:49:39 +08:00
|
|
|
info.put("bm", bmmc);
|
2025-06-06 11:36:05 +08:00
|
|
|
info.put("zw", jobactivitymark);
|
2025-06-10 14:49:39 +08:00
|
|
|
info.put("qf", qfName);
|
|
|
|
|
info.put("zz", zzName);
|
2025-06-06 11:36:05 +08:00
|
|
|
info.put("zgdj", zgdjName);
|
|
|
|
|
info.put("jh", jhmc);
|
|
|
|
|
info.put("bb", bbmc);
|
|
|
|
|
info.put("sxrq", sxrq);
|
|
|
|
|
infos.add(info);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<Map<String, String>> colMapList = new ArrayList<>();
|
|
|
|
|
Map<String, String> colMap = new HashMap<>();
|
|
|
|
|
colMap.put("colSpan", "1");
|
|
|
|
|
colMap.put("dataIndex", "gh");
|
|
|
|
|
colMap.put("width", "100");
|
|
|
|
|
colMap.put("title", "工号");
|
|
|
|
|
colMapList.add(colMap);
|
|
|
|
|
|
|
|
|
|
colMap = new HashMap<>();
|
|
|
|
|
colMap.put("colSpan", "1");
|
|
|
|
|
colMap.put("dataIndex", "xm");
|
|
|
|
|
colMap.put("width", "100");
|
|
|
|
|
colMap.put("title", "姓名");
|
|
|
|
|
colMapList.add(colMap);
|
|
|
|
|
colMap = new HashMap<>();
|
|
|
|
|
colMap.put("colSpan", "1");
|
2025-06-10 14:49:39 +08:00
|
|
|
colMap.put("dataIndex", "gc");
|
2025-06-06 11:36:05 +08:00
|
|
|
colMap.put("width", "100");
|
2025-06-10 14:49:39 +08:00
|
|
|
colMap.put("title", "工程");
|
2025-06-06 11:36:05 +08:00
|
|
|
colMapList.add(colMap);
|
|
|
|
|
colMap = new HashMap<>();
|
|
|
|
|
colMap.put("colSpan", "1");
|
2025-06-10 14:49:39 +08:00
|
|
|
colMap.put("dataIndex", "bm");
|
2025-06-06 11:36:05 +08:00
|
|
|
colMap.put("width", "100");
|
2025-06-10 14:49:39 +08:00
|
|
|
colMap.put("title", "部门");
|
2025-06-06 11:36:05 +08:00
|
|
|
colMapList.add(colMap);
|
|
|
|
|
colMap = new HashMap<>();
|
|
|
|
|
colMap.put("colSpan", "1");
|
|
|
|
|
colMap.put("dataIndex", "zw");
|
|
|
|
|
colMap.put("width", "100");
|
|
|
|
|
colMap.put("title", "职务");
|
|
|
|
|
colMapList.add(colMap);
|
|
|
|
|
colMap = new HashMap<>();
|
|
|
|
|
colMap.put("colSpan", "1");
|
|
|
|
|
colMap.put("dataIndex", "qf");
|
|
|
|
|
colMap.put("width", "100");
|
|
|
|
|
colMap.put("title", "区分");
|
|
|
|
|
colMapList.add(colMap);
|
|
|
|
|
colMap = new HashMap<>();
|
|
|
|
|
colMap.put("colSpan", "1");
|
|
|
|
|
colMap.put("dataIndex", "zz");
|
|
|
|
|
colMap.put("width", "100");
|
|
|
|
|
colMap.put("title", "职种");
|
|
|
|
|
colMapList.add(colMap);
|
|
|
|
|
colMap = new HashMap<>();
|
|
|
|
|
colMap.put("colSpan", "1");
|
|
|
|
|
colMap.put("dataIndex", "zgdj");
|
|
|
|
|
colMap.put("width", "100");
|
|
|
|
|
colMap.put("title", "资格等级");
|
|
|
|
|
colMapList.add(colMap);
|
|
|
|
|
colMap = new HashMap<>();
|
|
|
|
|
colMap.put("colSpan", "1");
|
|
|
|
|
colMap.put("dataIndex", "jh");
|
|
|
|
|
colMap.put("width", "100");
|
|
|
|
|
colMap.put("title", "级号");
|
|
|
|
|
colMapList.add(colMap);
|
|
|
|
|
colMap = new HashMap<>();
|
|
|
|
|
colMap.put("colSpan", "1");
|
|
|
|
|
colMap.put("dataIndex", "bb");
|
|
|
|
|
colMap.put("width", "100");
|
|
|
|
|
colMap.put("title", "班别");
|
|
|
|
|
colMapList.add(colMap);
|
|
|
|
|
|
|
|
|
|
resultMap.put("count", infos.size());
|
|
|
|
|
resultMap.put("dataList", infos);
|
|
|
|
|
resultMap.put("colList", colMapList);
|
|
|
|
|
resultMap.put("code", "200");
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
resultMap.put("code", "500");
|
|
|
|
|
bb.writeLog("getAllState error:" + e);
|
|
|
|
|
}
|
|
|
|
|
bb.writeLog("getAllState end.");
|
|
|
|
|
return resultMap;
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-01 14:59:22 +08:00
|
|
|
@Override
|
|
|
|
|
public Map<String, Object> handlePushData(Map<String, Object> param) {
|
|
|
|
|
bb.writeLog("handlePushData start.");
|
|
|
|
|
Map<String, Object> resultMap = new HashMap<>();
|
|
|
|
|
try {
|
|
|
|
|
String ip = Util.null2String(param.get("ip"));
|
|
|
|
|
if (StringUtils.isEmpty(ip)) {
|
|
|
|
|
resultMap.put("errCode", "01");
|
|
|
|
|
resultMap.put("errMes", "handlePushData ip is null.");
|
|
|
|
|
bb.writeLog("handlePushData ip is null.");
|
|
|
|
|
return resultMap;
|
|
|
|
|
}
|
|
|
|
|
Object dataObj = param.get("data");
|
|
|
|
|
if (dataObj == null || dataObj == "") {
|
|
|
|
|
resultMap.put("errCode", "01");
|
|
|
|
|
resultMap.put("errMes", "handlePushData data is null.");
|
|
|
|
|
bb.writeLog("handlePushData data is null.");
|
|
|
|
|
return resultMap;
|
|
|
|
|
}
|
2025-08-12 13:49:27 +08:00
|
|
|
String dataStr = dataObj.toString();
|
|
|
|
|
Gson gson = new Gson();
|
|
|
|
|
Type type = new TypeToken<List<Map<String, String>>>() {}.getType();
|
|
|
|
|
List<Map<String, String>> dataMapList = gson.fromJson(dataStr, type);
|
|
|
|
|
// List<Map<String, String>> dataMapList = (List<Map<String, String>>) dataObj;
|
2025-08-01 14:59:22 +08:00
|
|
|
if (CollectionUtils.isEmpty(dataMapList)) {
|
|
|
|
|
resultMap.put("errCode", "01");
|
|
|
|
|
resultMap.put("errMes", "handlePushData dataMapList is null.");
|
|
|
|
|
bb.writeLog("handlePushData dataMapList is null.");
|
|
|
|
|
return resultMap;
|
|
|
|
|
}
|
|
|
|
|
RecordSet rs = new RecordSet();
|
|
|
|
|
// 获取工号与id对应
|
|
|
|
|
Map<String, String> ghAndIdMap = new HashMap<>();
|
|
|
|
|
rs.execute("SELECT id, workcode FROM hrmresource WHERE workcode is not null");
|
|
|
|
|
while (rs.next()) {
|
|
|
|
|
String id = rs.getString("id");
|
|
|
|
|
String workcode = rs.getString("workcode");
|
|
|
|
|
if (StringUtils.isEmpty(id) || StringUtils.isEmpty(workcode)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
ghAndIdMap.put(workcode, id);
|
|
|
|
|
}
|
|
|
|
|
if (CollectionUtils.isEmpty(ghAndIdMap)) {
|
|
|
|
|
bb.writeLog("handlePushData ghAndIdMap is null.");
|
|
|
|
|
resultMap.put("errCode", "01");
|
|
|
|
|
resultMap.put("errMes", "handlePushData ghAndIdMap is null.");
|
|
|
|
|
return resultMap;
|
|
|
|
|
}
|
|
|
|
|
// 获取老数据去重
|
|
|
|
|
Set<String> oldDataSet = new HashSet<>();
|
|
|
|
|
YearMonth ny = YearMonth.now();
|
|
|
|
|
String ksrq = ny.minusMonths(2) + "-01";
|
|
|
|
|
rs.execute("SELECT transactionid, person_code FROM uf_ysdkjl WHERE signtime >= '" + ksrq + "'");
|
|
|
|
|
while (rs.next()) {
|
|
|
|
|
String transactionid = rs.getString("transactionid");
|
|
|
|
|
String person_code = rs.getString("person_code");
|
|
|
|
|
if (StringUtils.isEmpty(transactionid) || StringUtils.isEmpty(person_code)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
oldDataSet.add(transactionid + "_" + person_code);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<List> insertParams = new ArrayList<>();
|
|
|
|
|
SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
|
SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss");
|
|
|
|
|
|
|
|
|
|
for (Map<String, String> map : dataMapList) {
|
|
|
|
|
String id = map.get("id");
|
|
|
|
|
if (StringUtils.isEmpty(id)) {
|
|
|
|
|
id = "";
|
|
|
|
|
}
|
|
|
|
|
String pers_person_name = map.get("pers_person_name");
|
|
|
|
|
String pers_person_pin = map.get("pers_person_pin");
|
|
|
|
|
if (StringUtils.isEmpty(pers_person_pin)) {
|
|
|
|
|
pers_person_pin = "";
|
|
|
|
|
}
|
|
|
|
|
String att_datetime = map.get("att_datetime");
|
|
|
|
|
String machine_no = map.get("machine_no");
|
|
|
|
|
String mark = map.get("mark");
|
|
|
|
|
String update_time = map.get("update_time");
|
|
|
|
|
|
|
|
|
|
if ((!CollectionUtils.isEmpty(oldDataSet)) && oldDataSet.contains(id + "_" + pers_person_pin)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List insertParam = new ArrayList<>();
|
|
|
|
|
insertParam.add(att_datetime);
|
|
|
|
|
insertParam.add(pers_person_name);
|
|
|
|
|
insertParam.add(pers_person_pin);
|
|
|
|
|
insertParam.add(machine_no);
|
|
|
|
|
insertParam.add(mark);
|
|
|
|
|
insertParam.add(update_time);
|
|
|
|
|
insertParam.add(id);
|
|
|
|
|
insertParam.add(machine_no);
|
|
|
|
|
insertParam.add(ip);
|
|
|
|
|
insertParam.add("95");
|
|
|
|
|
insertParam.add("141");
|
|
|
|
|
insertParam.add("1");
|
|
|
|
|
insertParam.add("0");
|
|
|
|
|
insertParam.add(sdfDate.format(new Date()));
|
|
|
|
|
insertParam.add(sdfTime.format(new Date()));
|
|
|
|
|
insertParams.add(insertParam);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (org.springframework.util.CollectionUtils.isEmpty(insertParams)) {
|
|
|
|
|
bb.writeLog("handlePushData insertParams is null.");
|
|
|
|
|
} else {
|
|
|
|
|
String insertSql = "INSERT INTO uf_ysdkjl (signtime,person_name,person_code,machine_no,mark,storets,transactionid," +
|
|
|
|
|
"deviceid,ip,formmodeid,MODEUUID, modedatacreater,modedatacreatertype, modedatacreatedate," +
|
|
|
|
|
" modedatacreatetime) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
|
|
|
|
|
rs.executeBatchSql(insertSql, insertParams);
|
|
|
|
|
//权限重构
|
|
|
|
|
ModeRightInfo modeRightInfo = new ModeRightInfo();
|
|
|
|
|
modeRightInfo.setNewRight(true);
|
|
|
|
|
modeRightInfo.editModeDataShare(1, 95, 141);
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
bb.writeLog("handlePushData error:" + e);
|
|
|
|
|
resultMap.put("errCode", "01");
|
|
|
|
|
resultMap.put("errMes", "handlePushData error is:" + e);
|
|
|
|
|
return resultMap;
|
|
|
|
|
}
|
|
|
|
|
resultMap.put("errCode", "00");
|
|
|
|
|
resultMap.put("errMes", "handlePushData end.");
|
|
|
|
|
bb.writeLog("handlePushData end.");
|
|
|
|
|
return resultMap;
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-06 11:36:05 +08:00
|
|
|
private String getSelectNameMain(String fieldName, String billid, String selectValue) {
|
|
|
|
|
RecordSet rs = new RecordSet();
|
|
|
|
|
rs.executeQuery("select id from workflow_billfield where fieldname = ? and billid = ? and viewtype=0", fieldName, billid);
|
|
|
|
|
rs.next();
|
|
|
|
|
int fieldId = com.weaver.general.Util.getIntValue(rs.getString("id"),-1);
|
|
|
|
|
rs.executeQuery("select selectname from workflow_SelectItem where fieldid = ? and selectvalue = ?", fieldId, selectValue);
|
|
|
|
|
rs.next();
|
|
|
|
|
return com.weaver.general.Util.null2String(rs.getString("selectname"));
|
|
|
|
|
}
|
|
|
|
|
}
|