|
|
@@ -123,8 +123,30 @@ public class contractService {
|
|
|
DBSql.update("update BO_EU_DNCTT_CONTRACT set IS_SDT_DEFAULT=0 where ACCOUNT_ID=?", new Object[]{contractBO.getString("ACCOUNT_ID")});
|
|
|
}
|
|
|
|
|
|
- if (idApply)
|
|
|
- SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_APPLY", contractBO);//更新合同
|
|
|
+
|
|
|
+ //2025年10月25日 生成合同编号
|
|
|
+
|
|
|
+ String contractNo = contractBO.getString("NO");
|
|
|
+ if (StringUtils.isBlank(contractNo) || contractNo.indexOf("XHT") != 0) {
|
|
|
+ contractNo = SDK.getRuleAPI().executeAtScript("@sequenceYear(@companyId_contract,5)");
|
|
|
+ String DISTRICT_ID = DBSql.getString("select DISTRICT_ID from BO_EU_DNCRM_ACCOUNT where ID=?", new Object[]{contractBO.getString("ACCOUNT_ID")});
|
|
|
+ String cssx = "SH";//城市缩写
|
|
|
+ if (StringUtils.isNotBlank(DISTRICT_ID)) {
|
|
|
+ RowMap city = DBSql.getMap("SELECT EXTTEXT1,EXTTEXT2 FROM BO_ACT_DICT_KV_ITEM WHERE DICTKEY = 'GB.ADDR' AND ITEMNO= ?", new Object[]{DISTRICT_ID});
|
|
|
+ if (city != null) {
|
|
|
+ cssx = city.getString("EXTTEXT1");
|
|
|
+ if (!cssx.contains("市")) {
|
|
|
+ cssx = city.getString("EXTTEXT2");
|
|
|
+ }
|
|
|
+ //如果 cssx="上海市" 则输出 SH
|
|
|
+ cssx = getCityAbbreviation(cssx);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ contractNo = "XHT-" + cssx + "-" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + "-" + contractNo;
|
|
|
+ contractBO.set("NO", contractNo);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (idApply) SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_APPLY", contractBO);//更新合同
|
|
|
else {
|
|
|
dn.recordFormChanges.record(uc, contractBO, "合同编辑");
|
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT", contractBO);
|
|
|
@@ -138,8 +160,7 @@ public class contractService {
|
|
|
|
|
|
RowMap dto = new RowMap(contractBO.asMap());//合同对象
|
|
|
|
|
|
- if (idApply)
|
|
|
- insertContract(uc, dto);//创建合同详情,用于提交后查看和修改相关配置项、工单、服务等
|
|
|
+ if (idApply) insertContract(uc, dto);//创建合同详情,用于提交后查看和修改相关配置项、工单、服务等
|
|
|
else {
|
|
|
//更新
|
|
|
DBSql.update("update BO_EU_DNCTT_CONTRACT_RATE set CONTRACT_ID=? where BINDID=?", new Object[]{dto.getString("ID"), dto.getString("BINDID")});
|
|
|
@@ -176,7 +197,8 @@ public class contractService {
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
e.printStackTrace();
|
|
|
- contractServiceLogger.info("info--失败。。。");
|
|
|
+
|
|
|
+ contractServiceLogger.info("新增服务--info--失败。。。" + e.getMessage());
|
|
|
|
|
|
resultDto.put("success", false);
|
|
|
resultDto.put("msg", e.getMessage());
|
|
|
@@ -189,7 +211,7 @@ public class contractService {
|
|
|
return resultDto;
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
- contractServiceLogger.info("info--失败。。。");
|
|
|
+ contractServiceLogger.info("合同报错-info--失败。。。");
|
|
|
}
|
|
|
resultDto.put("success", false);
|
|
|
return resultDto;
|
|
|
@@ -270,7 +292,31 @@ public class contractService {
|
|
|
//更新
|
|
|
DBSql.update("update BO_EU_DNCTT_CONTRACT_RATE set PROCESSDEFID=?,BINDID=?,CONTRACT_ID=? where BINDID=?", new Object[]{processDefId, contractBINDID, exitsBOID, APPLY_BINDID});
|
|
|
DBSql.update("update BO_EU_DNCTT_CONTRACT_MILESTONE set PROCESSDEFID=?,BINDID=?,CONTRACT_ID=? where BINDID=?", new Object[]{processDefId, contractBINDID, exitsBOID, APPLY_BINDID});
|
|
|
- DBSql.update("update BO_EU_DNCTT_CONTRACT_SERVICE set PROCESSDEFID=?,BINDID=?,CONTRACT_ID=? where BINDID=?", new Object[]{processDefId, contractBINDID, exitsBOID, APPLY_BINDID});
|
|
|
+
|
|
|
+ // DBSql.update("update BO_EU_DNCTT_CONTRACT_SERVICE set PROCESSDEFID=?,BINDID=?,CONTRACT_ID=? where BINDID=?", new Object[]{processDefId, contractBINDID, exitsBOID, APPLY_BINDID});
|
|
|
+
|
|
|
+ // 合同服务
|
|
|
+ List<BO> serviceList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").addQuery("BINDID =", APPLY_BINDID).list();
|
|
|
+ for (BO service : serviceList) {
|
|
|
+
|
|
|
+ ProcessInstance costServiceProcessInst = SDK.getProcessAPI().createBOProcessInstance("obj_58693e03feac4879901430440b42efd9", uc.getUID(), "合同服务管理");
|
|
|
+
|
|
|
+ Map<String, Object> serviceMap = service.asMap();
|
|
|
+
|
|
|
+ BO serviceBO = new BO();
|
|
|
+ for (String key : excludesArray) {
|
|
|
+ serviceMap.remove(key);
|
|
|
+ }
|
|
|
+ serviceBO.setAll(serviceMap);
|
|
|
+
|
|
|
+ serviceBO.setBindId(costServiceProcessInst.getId());
|
|
|
+ serviceBO.set("CONTRACT_ID", exitsBOID);
|
|
|
+ dn.recordFormChanges.record(uc, serviceBO, "合同服务新增");
|
|
|
+
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE", serviceBO, uc);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
DBSql.update("update BO_EU_DNCTT_CONTRACT_BLOCK set PROCESSDEFID=?,BINDID=?,CONTRACT_ID=? where BINDID=?", new Object[]{processDefId, contractBINDID, exitsBOID, APPLY_BINDID});
|
|
|
}
|
|
|
|
|
|
@@ -303,6 +349,10 @@ public class contractService {
|
|
|
//如果服务周期的结束时间不等于合同的结束时间,则需要延长服务周期或缩短
|
|
|
String PERIOD = service.getString("PERIOD");//服务起止日期
|
|
|
String ADJUST_PERIOD = service.getString("ADJUST_PERIOD");//服务调整的起止日期
|
|
|
+
|
|
|
+ contractServiceLogger.info("PERIOD---" + PERIOD);
|
|
|
+ contractServiceLogger.info("ADJUST_PERIOD---" + ADJUST_PERIOD);
|
|
|
+
|
|
|
LocalDate PERIOD_END;
|
|
|
if (StringUtils.isNotBlank(PERIOD)) {
|
|
|
PERIOD_END = getLocalDate(PERIOD.split("~")[1]);
|
|
|
@@ -327,11 +377,11 @@ public class contractService {
|
|
|
contractServiceLogger.info("合同结束日期--" + LocalDateYYYYMMDD(END_DATE));
|
|
|
|
|
|
|
|
|
- if (PERIOD_END.isEqual(END_DATE)) {
|
|
|
+ if (!PERIOD_END.isEqual(END_DATE)) {
|
|
|
if (PERIOD_END.isBefore(END_DATE)) {
|
|
|
contractServiceLogger.info("服务周期延长--" + service.getString("NAME"));
|
|
|
//延长
|
|
|
- List<BO> servicePeriodList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").connection(conn).addQuery("CONTRACT_SERVICE_ID =", service.getString("CONTRACT_SERVICE_ID")).addQuery("PERIOD_END_DATE >=", PERIOD_END).orderBy("PERIOD_BEGIN_DATE").desc().list();
|
|
|
+ List<BO> servicePeriodList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").connection(conn).addQuery("CONTRACT_SERVICE_ID =", service.getId()).addQuery("PERIOD_END_DATE >=", LocalDateYYYYMMDD(PERIOD_END)).orderBy("PERIOD_BEGIN_DATE").desc().list();
|
|
|
|
|
|
BO servicePeriod = servicePeriodList.get(0);
|
|
|
LocalDate period_begin_date = getLocalDate(servicePeriod.get("PERIOD_BEGIN_DATE"));
|
|
|
@@ -413,10 +463,10 @@ public class contractService {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- } else {
|
|
|
+ } else if (PERIOD_END.isAfter(END_DATE)) {
|
|
|
contractServiceLogger.info("服务周期缩短--" + service.getString("NAME"));
|
|
|
//缩短
|
|
|
- List<BO> servicePeriodList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").connection(conn).addQuery("CONTRACT_SERVICE_ID =", service.getString("CONTRACT_SERVICE_ID")).addQuery("PERIOD_END_DATE >=", END_DATE).orderBy("PERIOD_BEGIN_DATE").asc().list();
|
|
|
+ List<BO> servicePeriodList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").connection(conn).addQuery("CONTRACT_SERVICE_ID =", service.getId()).addQuery("PERIOD_END_DATE >=", LocalDateYYYYMMDD(END_DATE)).orderBy("PERIOD_BEGIN_DATE").asc().list();
|
|
|
|
|
|
BO servicePeriod = servicePeriodList.get(0);
|
|
|
servicePeriod.set("PERIOD_END_DATE", END_DATE);
|
|
|
@@ -448,10 +498,12 @@ public class contractService {
|
|
|
conn.commit();
|
|
|
return true;
|
|
|
} catch (SQLException e) {
|
|
|
+
|
|
|
+ contractServiceLogger.info("AddServiceServiceBundle--error--失败。。。" + e.getMessage());
|
|
|
+
|
|
|
e.printStackTrace();
|
|
|
- conn.rollback();
|
|
|
|
|
|
- contractServiceLogger.error("AddServiceServiceBundle--error--失败。。。", e);
|
|
|
+ conn.rollback();
|
|
|
|
|
|
} finally {
|
|
|
if (conn != null) DBSql.close(conn);
|
|
|
@@ -839,6 +891,9 @@ public class contractService {
|
|
|
|
|
|
//更新合同服务上的
|
|
|
DBSql.update(conn, "update BO_EU_DNCTT_CONTRACT_SERVICE set PERIOD=?,ADJUST_PERIOD=? where ID=? and BINDID=?", new Object[]{PERIOD, ADJUST_PERIOD, service.get("ID"), service.get("BINDID")});
|
|
|
+ service.set("PERIOD", PERIOD);
|
|
|
+ service.set("ADJUST_PERIOD", ADJUST_PERIOD);
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
@@ -1968,7 +2023,7 @@ public class contractService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- RowMap ca = DBSql.getMap("select TAX_REGION_ID,IS_TAX_EXEMPT from BO_EU_DNCRM_ACCOUNT where ID=?", new Object[]{cad.get("ACCOUNT_ID")});
|
|
|
+ RowMap ca = DBSql.getMap("select NAME,TAX_REGION_ID,IS_TAX_EXEMPT from BO_EU_DNCRM_ACCOUNT where ID=?", new Object[]{cad.get("ACCOUNT_ID")});
|
|
|
String tax_category_name = null;//税收种类
|
|
|
String tax_region_name = null;//税区
|
|
|
double tax_rate = 0;//税率
|
|
|
@@ -1994,10 +2049,24 @@ public class contractService {
|
|
|
// cad.set("EXTENDED_COST", tax_rate);
|
|
|
// cad.extended_cost = GetCost(id);
|
|
|
|
|
|
+ contractServiceLogger.info("定期服务计算税额");
|
|
|
+ contractServiceLogger.info("是否免税" + ca.get("IS_TAX_EXEMPT"));
|
|
|
+ contractServiceLogger.info(ca.getString("NAME") + cad.get("ACCOUNT_ID") + "是否免税" + ca.get("IS_TAX_EXEMPT"));
|
|
|
//是否免税
|
|
|
- if (!ca.getString("IS_TAX_EXEMPT").equals("1") && ca.get("EXTENDED_PRICE") != null && tax_rate > 0) {
|
|
|
- double tax_dollars = cad.get("EXTENDED_PRICE", Double.class) * (1 - 1 / (1 + tax_rate));//税额
|
|
|
- cad.set("TAX_DOLLARS", tax_dollars);
|
|
|
+ if (ca.get("IS_TAX_EXEMPT") != null && ca.getString("IS_TAX_EXEMPT").equals("1")) {
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ contractServiceLogger.info("cad.extended_price:" + cad.get("EXTENDED_PRICE"));
|
|
|
+ contractServiceLogger.info("tax_rate:" + tax_rate);
|
|
|
+
|
|
|
+ if (cad.get("EXTENDED_PRICE") != null && tax_rate > 0) {
|
|
|
+ double tax_dollars = cad.get("EXTENDED_PRICE", Double.class) * (1 - 1 / (1 + tax_rate));//税额
|
|
|
+ contractServiceLogger.info("cad.tax_dollars:" + tax_dollars);
|
|
|
+ //截取前四位
|
|
|
+ tax_dollars = Math.round(tax_dollars * 10000) / 10000.0;
|
|
|
+ cad.set("TAX_DOLLARS", tax_dollars);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
//计费客户
|
|
|
@@ -2213,21 +2282,29 @@ public class contractService {
|
|
|
throw new RuntimeException("该服务已经生成发票,请先删除发票");
|
|
|
}
|
|
|
|
|
|
- if (bo.get("TYPE_ID").equals(cttConstant.ACCOUNT_DEDUCTION_TYPE_SERVICE)) //类型:服务
|
|
|
+ if (bo.getString("TYPE_ID").equals(String.valueOf(cttConstant.ACCOUNT_DEDUCTION_TYPE_SERVICE))) //类型:服务
|
|
|
{
|
|
|
+ /*
|
|
|
BO ccsp = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD").addQuery("CONTRACT_ID =", bo.getString("CONTRACT_ID")).addQuery("ID =", bo.getString("OBJECT_ID")).detail();
|
|
|
ccsp.set("APPROVE_AND_POST_DATE", null);
|
|
|
ccsp.set("APPROVE_AND_POST_USER_ID", null);
|
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD", ccsp, connUpdate);
|
|
|
+ */
|
|
|
+ DBSql.update(connUpdate, "update BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD set APPROVE_AND_POST_DATE=null,APPROVE_AND_POST_USER_ID=null where ID=?", new Object[]{bo.getString("OBJECT_ID")});
|
|
|
|
|
|
- } else if (bo.get("TYPE_ID").equals(cttConstant.ACCOUNT_DEDUCTION_TYPE_INITIAL_COST)) //类型:初始费用
|
|
|
+ } else if (bo.getString("TYPE_ID").equals(String.valueOf(cttConstant.ACCOUNT_DEDUCTION_TYPE_INITIAL_COST))) //类型:初始费用
|
|
|
{
|
|
|
+ /*
|
|
|
BO ccc = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT").addQuery("ID =", bo.getString("CONTRACT_ID")).detail();
|
|
|
ccc.set("SETUP_FEE_APPROVE_AND_POST_USER_ID", null);
|
|
|
ccc.set("SETUP_FEE_APPROVE_AND_POST_DATE", null);
|
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT", ccc, connUpdate);
|
|
|
+
|
|
|
+ */
|
|
|
+
|
|
|
+ DBSql.update(connUpdate, "update BO_EU_DNCTT_CONTRACT set SETUP_FEE_APPROVE_AND_POST_USER_ID=null,SETUP_FEE_APPROVE_AND_POST_DATE=null where ID=?", new Object[]{bo.getString("OBJECT_ID")});
|
|
|
}
|
|
|
- bo.set("CLOSED", 1);
|
|
|
+ //bo.set("CLOSED", 1);
|
|
|
dn.recordFormChanges.record(uc, bo, "撤销定期服务");
|
|
|
SDK.getBOAPI().remove("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo.getId(), connUpdate);
|
|
|
//SDK.getBOAPI().update("BO_EU_DNCRM_ACCOUNT_DEDUCTION", bo, connUpdate);
|