|
@@ -0,0 +1,194 @@
|
|
|
+package nc.impl.bm.bmdata;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import nc.bs.dao.BaseDAO;
|
|
|
+import nc.bs.framework.common.NCLocator;
|
|
|
+import nc.bs.framework.common.RuntimeEnv;
|
|
|
+import nc.bs.logging.Logger;
|
|
|
+import nc.itf.hr.bm.bmdata.IBmToU9LogService;
|
|
|
+import nc.itf.hr.bm.bmdata.IBmdataSyncService;
|
|
|
+import nc.itf.hr.wa.erp.IWaToU9LogService;
|
|
|
+import nc.jdbc.framework.processor.MapListProcessor;
|
|
|
+import nc.utils.AnxjHttpClient;
|
|
|
+import nc.utils.U9Interface;
|
|
|
+import nc.vo.bm.sync.BmDataToU9HVO;
|
|
|
+import nc.vo.bm.sync.BmToU9LogHVO;
|
|
|
+import nc.vo.pub.BusinessException;
|
|
|
+import nc.vo.pub.lang.UFDateTime;
|
|
|
+import nc.vo.wa.erp.WaToU9LogHVO;
|
|
|
+import nccloud.openapi.hrwa.vo.WaDataToU9HVO;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.io.FileInputStream;
|
|
|
+import java.io.IOException;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Properties;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+public class BmdataSyncServiceImpl implements IBmdataSyncService {
|
|
|
+
|
|
|
+ public BaseDAO dao;
|
|
|
+ private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+
|
|
|
+ public BaseDAO getBaseDAO() {
|
|
|
+ if (dao == null) {
|
|
|
+ dao = new BaseDAO();
|
|
|
+ }
|
|
|
+ return dao;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static Properties props = new Properties();
|
|
|
+
|
|
|
+ private final static String ERROR_STATUS = "2";
|
|
|
+ private final static String SUCCESS_STATUS = "1";
|
|
|
+
|
|
|
+ static {
|
|
|
+ if (props.size() <= 0) {
|
|
|
+ String propertyUrl = RuntimeEnv.getInstance().getNCHome() + File.separator + "resources/U9url.properties";
|
|
|
+ try {
|
|
|
+ FileInputStream in = new FileInputStream(propertyUrl);
|
|
|
+ props.load(in);
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ throw new RuntimeException(propertyUrl + "===》》U9url.properties not found");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void pushToU9(String pk_group, String pk_org, String pk_bm_class, String cyear, String cperiod, String push_type,String provision) throws BusinessException {
|
|
|
+
|
|
|
+
|
|
|
+ List<Map<String, Object>> reportDataByParam = getReportDataByParam(pk_org, pk_bm_class, cyear, cperiod);
|
|
|
+ if (reportDataByParam != null && reportDataByParam.size() > 0) {
|
|
|
+ Map<String, List<Map<String, Object>>> erporgcode = reportDataByParam.stream().collect(Collectors.groupingBy(e -> (String) e.get("erporgcode"))); // 要根据财务组织分单。因为是分组织审批的
|
|
|
+ for (Map.Entry<String, List<Map<String, Object>>> entry : erporgcode.entrySet()) {
|
|
|
+ String erporgCode = entry.getKey();
|
|
|
+ List<Map<String, Object>> erporgData = entry.getValue();
|
|
|
+ String erporg = (String) erporgData.get(0).get("erporg");
|
|
|
+ if (checkPush(pk_org, pk_bm_class, cyear, cperiod, erporg)) {
|
|
|
+ WaDataToU9HVO waDataToU9HVO = new WaDataToU9HVO();
|
|
|
+ waDataToU9HVO.setErporgcode(erporgCode);
|
|
|
+ waDataToU9HVO.setCperiod(cperiod);
|
|
|
+ waDataToU9HVO.setCyear(cyear);
|
|
|
+ waDataToU9HVO.setHr_pk(pk_bm_class);
|
|
|
+ waDataToU9HVO.setHr_item(erporgData);
|
|
|
+ waDataToU9HVO.setPush_type(push_type);
|
|
|
+ waDataToU9HVO.setErporg(erporg);
|
|
|
+ waDataToU9HVO.setHr_type("bm");
|
|
|
+ waDataToU9HVO.setProvision(provision);
|
|
|
+ BmToU9LogHVO initLogVO = getInitLogVO(pk_org, pk_bm_class, cyear, cperiod, erporg,erporgCode);
|
|
|
+ String paramStr = JSONObject.toJSONString(waDataToU9HVO);
|
|
|
+ try {
|
|
|
+ String res = U9Interface.syncWaToU9(paramStr);
|
|
|
+ initLogVO.setContent(res);
|
|
|
+ JSONObject u9Res = JSONObject.parseObject(res);
|
|
|
+ JSONObject data = u9Res.getJSONObject("Data");
|
|
|
+ Boolean isSucess = data.getBoolean("IsSucess");
|
|
|
+ if (isSucess) {
|
|
|
+ // 成功的 记录日志
|
|
|
+ getBaseDAO().executeUpdate("update bm_u9_log_h set is_flag = 'N' where is_flag = 'Y' and pk_erporg ='" + initLogVO.getPk_erporg() + "' and cperiod = '"
|
|
|
+ + initLogVO.getCperiod() + "' and cyear = '" + initLogVO.getCyear() + "' and pk_bm_class =" + initLogVO.getPk_bm_class() + "' ");
|
|
|
+ initLogVO.setR_status(SUCCESS_STATUS);
|
|
|
+ initLogVO.setIs_flag("Y");
|
|
|
+ } else {
|
|
|
+ initLogVO.setR_status(ERROR_STATUS);
|
|
|
+ Logger.error("社保同步失败参数:" + paramStr);
|
|
|
+ Logger.error("社保同步失败返回结果:" + res);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ Logger.error("社保同步失败参数:" + paramStr);
|
|
|
+ initLogVO.setR_status(ERROR_STATUS);
|
|
|
+ initLogVO.setContent(e.getMessage());
|
|
|
+ } finally {
|
|
|
+ NCLocator.getInstance().lookup(IBmToU9LogService.class).insertLog_RequiresNew(initLogVO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ throw new BusinessException("该险种统计数量为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ BmToU9LogHVO getInitLogVO(String pk_org, String pk_bm_class, String cyear, String cperiod, String pk_erporg,String erporgCode) {
|
|
|
+ BmToU9LogHVO bmToU9LogHVO = new BmToU9LogHVO();
|
|
|
+ bmToU9LogHVO.setCreation_time(new UFDateTime());
|
|
|
+ bmToU9LogHVO.setPk_bm_class(pk_bm_class);
|
|
|
+ bmToU9LogHVO.setPk_org(pk_org);
|
|
|
+ bmToU9LogHVO.setCyear(cyear);
|
|
|
+ bmToU9LogHVO.setCperiod(cperiod);
|
|
|
+ bmToU9LogHVO.setSend_time(sdf.format(new Date()));
|
|
|
+ bmToU9LogHVO.setPk_erporg(pk_erporg);
|
|
|
+ bmToU9LogHVO.setErporgCode(erporgCode);
|
|
|
+ return bmToU9LogHVO;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Boolean checkPush(String pk_org, String pk_bm_class, String cyear, String cperiod, String erporg) throws BusinessException {
|
|
|
+ /**
|
|
|
+ * 校验能否推送 u9 目前 第一次新增可推 重复推,U9 开立状态(等于保存自由态未开流程) 单据覆盖修改, 也是推送成功
|
|
|
+ * 在走流程,U9会报错, 流程走完,审批通过后 回调修改日志表状态 重推无效,审批失败后 可以继续重推
|
|
|
+ */
|
|
|
+ String whereSql = " pk_org = '" + pk_org + "' and pk_bm_class = '" + pk_bm_class + "' and cyear = '"
|
|
|
+ + cyear + "' and cperiod = '" + cperiod + "' and r_status = '200' and pk_erporg = '" + erporg + "' ";
|
|
|
+ List<BmToU9LogHVO> waToU9LogHVOS = (List<BmToU9LogHVO>) getBaseDAO().retrieveByClause(BmToU9LogHVO.class, whereSql);
|
|
|
+ if (waToU9LogHVOS != null && waToU9LogHVOS.size() > 0) {
|
|
|
+ // throw new BusinessException("薪资方案在U9审批已通过了,请勿重新推送。");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<Map<String, Object>> getReportDataByParam(String pk_org, String pk_bm_class, String cyear, String cperiod) throws BusinessException {
|
|
|
+ // 1.动态获取分担项目 在自定义档案 可以随时修改字段
|
|
|
+ Map<String, String> allocateItem = getAllocateItem();
|
|
|
+ StringBuffer sb = new StringBuffer();
|
|
|
+ for (Map.Entry<String, String> entry : allocateItem.entrySet()) {
|
|
|
+ sb.append(", sum(nvl(bd." + entry.getValue() + ",0)) as " + entry.getKey());
|
|
|
+ }
|
|
|
+
|
|
|
+ String sql = " SELECT bd.glbdef1 erporg, erporg.code erporgcode, erpdept.code erpdeptcode,ft.CODE fee_type,count(1) as psnsum " + sb.toString() +
|
|
|
+ " FROM bm_data bd " +
|
|
|
+ " join (SELECT b.code,b.name FROM bd_defdoc b JOIN bd_defdoclist h ON h.pk_defdoclist = b.pk_defdoclist " +
|
|
|
+ " WHERE h.code = 'HRZ04' AND b.enablestate = 2 AND nvl(b.DATATYPE,1) <> 0) ft on ft.name = bd.C_1 " + // 费用类型 说因为社保那里字段类型不是自定义字段 所以存的中文 c_1
|
|
|
+ " JOIN (SELECT b.pk_defdoc,b.code,b.name FROM bd_defdoc b JOIN bd_defdoclist h ON h.pk_defdoclist = b.pk_defdoclist " +
|
|
|
+ " WHERE h.code = 'HRZ07' AND b.enablestate = 2 AND nvl(b.DATATYPE,1) <> 0) erporg ON erporg.pk_defdoc = bd.glbdef1 " +
|
|
|
+ " JOIN (SELECT b.pk_defdoc,b.code,b.name FROM bd_defdoc b JOIN bd_defdoclist h ON h.pk_defdoclist = b.pk_defdoclist " +
|
|
|
+ " WHERE h.code = 'HRZ06' AND b.enablestate = 2 AND nvl(b.DATATYPE,1) <> 0) erpdept ON erpdept.pk_defdoc = bd.glbdef2 " +
|
|
|
+ " WHERE bd.pk_bm_class = '" + pk_bm_class + "' and bd.cyear = '" + cyear + "' and bd.cperiod = '" + cperiod + "' and bd.checkflag = 'Y' and bd.accountstate = 0 AND bd.pk_org = '" + pk_org + "' " +
|
|
|
+ " GROUP BY bd.glbdef1, erporg.code,erpdept.code,ft.code ";
|
|
|
+ List<Map<String, Object>> doc = (List<Map<String, Object>>) getBaseDAO().executeQuery(sql, new MapListProcessor());
|
|
|
+ return doc;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取社保相关分摊项目
|
|
|
+ private Map<String, String> getAllocateItem() throws BusinessException {
|
|
|
+ String sql = " SELECT b.code,b.name,b.memo FROM bd_defdoc b JOIN bd_defdoclist h ON h.pk_defdoclist = b.pk_defdoclist " +
|
|
|
+ " WHERE h.code = 'HRZ08' AND b.enablestate = 2 AND nvl(b.DATATYPE,1) <> 0 AND b.code like 'sb%'";
|
|
|
+
|
|
|
+ List<Map<String, Object>> doc = (List<Map<String, Object>>) getBaseDAO().executeQuery(sql, new MapListProcessor());
|
|
|
+ if (doc != null && doc.size() > 0) {
|
|
|
+ Map<String, String> map = doc.stream().collect(Collectors.toMap(e -> (String) e.get("code"), e -> (String) e.get("memo")));
|
|
|
+ return map;
|
|
|
+ } else {
|
|
|
+ throw new BusinessException("查询分摊项目HRZ08社保相关为空,请检查");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // U9头信息
|
|
|
+ private static JSONObject initU9Heard() {
|
|
|
+ JSONObject heard = new JSONObject();
|
|
|
+ heard.put("usercode", props.getProperty("u9_heard_usercode"));
|
|
|
+ heard.put("entcode", props.getProperty("u9_heard_entcode"));
|
|
|
+ heard.put("orgcode", props.getProperty("u9_heard_orgcode"));
|
|
|
+ heard.put("culturename", "zh-CN");
|
|
|
+ return heard;
|
|
|
+ }
|
|
|
+}
|