|
|
@@ -161,9 +161,11 @@ public class contractService {
|
|
|
{
|
|
|
try {
|
|
|
|
|
|
+ boolean flag = AddServiceServiceBundle(uc, dto);//新增服务或者服务包
|
|
|
+
|
|
|
AddContractServiceProduct(uc, dto);//新增服务或者服务包--关联产品
|
|
|
|
|
|
- boolean flag = AddServiceServiceBundle(uc, dto);//新增服务或者服务包
|
|
|
+ //更新服务产品价格
|
|
|
|
|
|
if (!flag) {
|
|
|
resultDto.put("success", false);
|
|
|
@@ -438,11 +440,16 @@ public class contractService {
|
|
|
service.set("UNIT_COST", unit_cost);
|
|
|
unit_price = unit_price.multiply(rate);
|
|
|
service.set("UNIT_PRICE", unit_price);
|
|
|
+
|
|
|
+ service.set("PERIOD_TYPE", contract.getString("PERIOD_TYPE"));//计费周期更新
|
|
|
}
|
|
|
|
|
|
contractServiceLogger.info("计算-service-ADJUSTED_PRICE");
|
|
|
|
|
|
+ service.set("TOTAL_PRICE", multiply(service.get("QUANTITY"), service.get("UNIT_PRICE")));//总价
|
|
|
service.set("ADJUSTED_PRICE", multiply(service.get("QUANTITY"), service.get("UNIT_PRICE")));//总价
|
|
|
+ service.set("TOTAL_COST", multiply(service.get("QUANTITY"), service.get("UNIT_COST")));//总价
|
|
|
+
|
|
|
|
|
|
SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_SERVICE", service, conn);//保存
|
|
|
|
|
|
@@ -513,13 +520,15 @@ public class contractService {
|
|
|
|
|
|
ADJUST_PERIOD = LocalDateYYYYMMDD(EFFECTIVE_DATE) + "~" + LocalDateYYYYMMDD(end);
|
|
|
|
|
|
- csa.set("PRORATED_COST_CHANGE", service.get("ADJUSTED_PRICE"));
|
|
|
-
|
|
|
contractServiceLogger.info("计算-csa-ADJUST_PRORATED_PRICE_CHANGE");
|
|
|
csa.set("ADJUST_PRORATED_PRICE_CHANGE", multiply(service.get("ADJUSTED_PRICE"), periodRate));
|
|
|
csa.set("PRORATED_PRICE_CHANGE", csa.get("ADJUST_PRORATED_PRICE_CHANGE"));
|
|
|
csa.set("VENDOR_ACCOUNT_ID", vendor_account_id);
|
|
|
csa.setBindId(service.getString("BINDID"));
|
|
|
+
|
|
|
+ //服务周期成本
|
|
|
+ csa.set("PRORATED_COST_CHANGE", multiply(service.get("TOTAL_COST"), periodRate));
|
|
|
+
|
|
|
SDK.getBOAPI().createDataBO("BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST", csa, uc, conn);
|
|
|
|
|
|
// 插入服务调整表包含的服务ctt_contract_service_adjust_bundle_service
|
|
|
@@ -572,7 +581,7 @@ public class contractService {
|
|
|
csp.set("PERIOD_PRICE", period_price);
|
|
|
|
|
|
contractServiceLogger.info("计算-csp-PERIOD_COST");
|
|
|
- BigDecimal period_cost = multiply(service.get("PERIOD_COST"), service.get("QUANTITY"));
|
|
|
+ BigDecimal period_cost = multiply(service.get("UNIT_COST"), service.get("QUANTITY"));
|
|
|
period_cost = periodRate.multiply(period_cost);
|
|
|
csp.set("PERIOD_COST", period_cost);
|
|
|
|
|
|
@@ -628,80 +637,124 @@ public class contractService {
|
|
|
/**
|
|
|
* 一个服务对应添加一个合同产品
|
|
|
* @param uc
|
|
|
+ * @param contract
|
|
|
+ * @param conn
|
|
|
* @return
|
|
|
+ * @throws SQLException
|
|
|
*/
|
|
|
- public boolean AddContractServiceProduct(UserContext uc, RowMap contract) throws SQLException {
|
|
|
- contractServiceLogger.info("新增服务或服务包");
|
|
|
+ public boolean AddContractServiceProduct(UserContext uc, RowMap contract, Connection conn) throws SQLException {
|
|
|
+ //获取服务列表
|
|
|
+ List<BO> serviceList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("BINDID=", contract.get("BINDID")).list();
|
|
|
+ List<BO> serviceList2 = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("BINDID!=", contract.get("BINDID")).addQuery("CONTRACT_ID=", contract.get("ID")).list();
|
|
|
+
|
|
|
+ if (serviceList == null)
|
|
|
+ serviceList = new ArrayList<BO>();
|
|
|
+ if (serviceList2 != null && serviceList2.size() > 0)
|
|
|
+ for (BO service : serviceList2) {
|
|
|
+ serviceList.add(service);
|
|
|
+ }
|
|
|
|
|
|
- Connection conn = null;
|
|
|
- try {
|
|
|
- conn = DBSql.open();
|
|
|
- conn.setAutoCommit(false);
|
|
|
- //获取服务列表
|
|
|
- List<BO> serviceList = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("BINDID=", contract.get("BINDID")).list();
|
|
|
- List<BO> serviceList2 = SDK.getBOAPI().query("BO_EU_DNCTT_CONTRACT_SERVICE").connection(conn).addQuery("BINDID!=", contract.get("BINDID")).addQuery("CONTRACT_ID=", contract.get("ID")).list();
|
|
|
+ for (BO service : serviceList) {
|
|
|
|
|
|
- if (serviceList == null)
|
|
|
- serviceList = new ArrayList<BO>();
|
|
|
- if (serviceList2 != null && serviceList2.size() > 0)
|
|
|
- for (BO service : serviceList2) {
|
|
|
- serviceList.add(service);
|
|
|
- }
|
|
|
+ String PRODUCT_ID = null;
|
|
|
+ if (service.getString("OBJECT_TYPE").equals("2"))//服务包
|
|
|
+ {
|
|
|
+ // String serviceIDS = DBSql.getString(conn, "select SERVICE_ID from BO_EU_DNIVT_SERVICE_BUNDLE where ID=?", new Object[]{service.getString("OBJECT_ID")});
|
|
|
+ RowMap serviceBUNDLE = DBSql.getMap(conn,"SELECT SERVICE_ID,UNIT_COST,UNIT_PRICE FROM BO_EU_DNIVT_SERVICE_BUNDLE WHERE ID=?", new Object[]{service.getString("OBJECT_ID")});
|
|
|
+ String serviceIDS = serviceBUNDLE.getString("SERVICE_ID");
|
|
|
|
|
|
- for (BO service : serviceList) {
|
|
|
+ Double BUNDLE_UNIT_COST = serviceBUNDLE.getDouble("UNIT_COST");
|
|
|
+ Double BUNDLE_UNIT_PRICE = serviceBUNDLE.getDouble("UNIT_PRICE");
|
|
|
|
|
|
- String PRODUCT_ID = null;
|
|
|
- if (service.getString("OBJECT_TYPE").equals("2"))//服务包
|
|
|
- {
|
|
|
- String serviceIDS = DBSql.getString(conn, "select SERVICE_ID from BO_EU_DNIVT_SERVICE_BUNDLE where ID=?", new Object[]{service.getString("OBJECT_ID")});
|
|
|
- for (String serviceID : serviceIDS.split(",")) {
|
|
|
- String contractCostId = DBSql.getString(conn, "select ID from BO_EU_DNCTT_CONTRACT_COST where CONTRACT_ID=? and SERVICE_ID=? and PRODUCT_ID in(select PRODUCT_ID from BO_EU_DNIVT_SERVICE where ID=?)", new Object[]{contract.getString("ID"), service.getString("ID"), serviceID});
|
|
|
-
|
|
|
- String NEED_PURCHASE = service.getString("NEED_PURCHASE");
|
|
|
- if (NEED_PURCHASE.equals("1")) {
|
|
|
- Map<String, String> contractCost = new HashMap<String, String>();
|
|
|
- contractCost.put("ID", contractCostId);
|
|
|
- contractCost.put("SERVICE_ID", service.getString("ID"));
|
|
|
- contractCost.put("SERVICE_NAME", service.getString("NAME"));
|
|
|
- contractCost.put("serviceID", serviceID);
|
|
|
- contractCost.put("CONTRACT_ID", contract.getString("ID"));
|
|
|
- contractCost.put("QUANTITY", service.getString("QUANTITY"));
|
|
|
- PRODUCT_ID = AddContractServiceProduct(uc, conn, contractCost);
|
|
|
- } else {
|
|
|
- //是否 删除 contractCostId 没有采购 没有拣货时可删除
|
|
|
- if (DBSql.getInt(conn, "select count(*) from BO_EU_DNCTT_CONTRACT_COST_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0 && DBSql.getInt(conn, "select count(*) from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0) {
|
|
|
- String contractCostBINDId = DBSql.getString(conn, "select BINDID from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
|
|
|
- SDK.getProcessAPI().deleteById(contractCostBINDId, uc.getUID());
|
|
|
- DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
|
|
|
- }
|
|
|
- }
|
|
|
+ List<RowMap> ivtServiceList = DBSql.getMaps(conn,"select ID,UNIT_COST,UNIT_PRICE from BO_EU_DNIVT_SERVICE where FIND_IN_SET(ID,?)", new Object[]{serviceIDS});
|
|
|
+
|
|
|
+ RowMap ivtServiceSum = DBSql.getMap(conn,"SELECT SUM(UNIT_COST) AS SUM_COST,SUM(UNIT_PRICE) AS SUM_PRICE FROM BO_EU_DNIVT_SERVICE where FIND_IN_SET(ID,?)", new Object[]{serviceIDS});
|
|
|
+
|
|
|
+ Map<String, Double> unitPriceMap = new HashMap<String, Double>();
|
|
|
+ Map<String, Double> unitCostMap = new HashMap<String, Double>();
|
|
|
+ for (RowMap ivtService : ivtServiceList) {
|
|
|
+ Double UNIT_PRICE = ivtService.getDouble("UNIT_PRICE");
|
|
|
+ Double UNIT_COST = ivtService.getDouble("UNIT_COST");
|
|
|
+
|
|
|
+ UNIT_PRICE = ivtServiceSum.getDouble("SUM_PRICE") == 0 ? 0.0 : BUNDLE_UNIT_PRICE * UNIT_PRICE / ivtServiceSum.getDouble("SUM_PRICE");
|
|
|
+ unitPriceMap.put(ivtService.getString("ID"), UNIT_PRICE);
|
|
|
+
|
|
|
+ UNIT_COST = ivtServiceSum.getDouble("SUM_COST") == 0 ? 0.0 : BUNDLE_UNIT_COST * UNIT_COST / ivtServiceSum.getDouble("SUM_COST");
|
|
|
+ unitCostMap.put(ivtService.getString("ID"), UNIT_COST);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (String serviceID : serviceIDS.split(",")) {
|
|
|
+ String contractCostId = DBSql.getString(conn, "select ID from BO_EU_DNCTT_CONTRACT_COST where IS_SERVICE_PRODUCT=1 AND CONTRACT_ID=? and SERVICE_ID=? and PRODUCT_ID in(select PRODUCT_ID from BO_EU_DNIVT_SERVICE where ID=?)", new Object[]{contract.getString("ID"), service.getString("ID"), serviceID});
|
|
|
|
|
|
- }
|
|
|
- } else {
|
|
|
- String contractCostId = DBSql.getString(conn, "select ID from BO_EU_DNCTT_CONTRACT_COST where CONTRACT_ID=? and SERVICE_ID=?", new Object[]{contract.getString("ID"), service.getString("ID")});
|
|
|
String NEED_PURCHASE = service.getString("NEED_PURCHASE");
|
|
|
if (NEED_PURCHASE.equals("1")) {
|
|
|
Map<String, String> contractCost = new HashMap<String, String>();
|
|
|
contractCost.put("ID", contractCostId);
|
|
|
contractCost.put("SERVICE_ID", service.getString("ID"));
|
|
|
contractCost.put("SERVICE_NAME", service.getString("NAME"));
|
|
|
- contractCost.put("serviceID", service.getString("OBJECT_ID"));
|
|
|
+ contractCost.put("serviceID", serviceID);
|
|
|
contractCost.put("CONTRACT_ID", contract.getString("ID"));
|
|
|
contractCost.put("QUANTITY", service.getString("QUANTITY"));
|
|
|
+
|
|
|
+ contractCost.put("UNIT_PRICE", String.valueOf(unitPriceMap.get(serviceID)));
|
|
|
+ contractCost.put("UNIT_COST", String.valueOf(unitCostMap.get(serviceID)));
|
|
|
+
|
|
|
PRODUCT_ID = AddContractServiceProduct(uc, conn, contractCost);
|
|
|
} else {
|
|
|
- //是否 删除 contractCostId
|
|
|
//是否 删除 contractCostId 没有采购 没有拣货时可删除
|
|
|
if (DBSql.getInt(conn, "select count(*) from BO_EU_DNCTT_CONTRACT_COST_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0 && DBSql.getInt(conn, "select count(*) from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0) {
|
|
|
String contractCostBINDId = DBSql.getString(conn, "select BINDID from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
|
|
|
SDK.getProcessAPI().deleteById(contractCostBINDId, uc.getUID());
|
|
|
DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
+ } else {
|
|
|
+ String contractCostId = DBSql.getString(conn, "select ID from BO_EU_DNCTT_CONTRACT_COST where IS_SERVICE_PRODUCT=1 AND CONTRACT_ID=? and SERVICE_ID=?", new Object[]{contract.getString("ID"), service.getString("ID")});
|
|
|
+ String NEED_PURCHASE = service.getString("NEED_PURCHASE");
|
|
|
+ if (NEED_PURCHASE.equals("1")) {
|
|
|
+ Map<String, String> contractCost = new HashMap<String, String>();
|
|
|
+ contractCost.put("ID", contractCostId);
|
|
|
+ contractCost.put("SERVICE_ID", service.getString("ID"));
|
|
|
+ contractCost.put("SERVICE_NAME", service.getString("NAME"));
|
|
|
+ contractCost.put("serviceID", service.getString("OBJECT_ID"));
|
|
|
+ contractCost.put("CONTRACT_ID", contract.getString("ID"));
|
|
|
+ contractCost.put("QUANTITY", service.getString("QUANTITY"));
|
|
|
+
|
|
|
+ contractCost.put("UNIT_PRICE", service.getString("UNIT_PRICE"));
|
|
|
+ contractCost.put("UNIT_COST", service.getString("UNIT_COST"));
|
|
|
+
|
|
|
+ PRODUCT_ID = AddContractServiceProduct(uc, conn, contractCost);
|
|
|
+ } else {
|
|
|
+ //是否 删除 contractCostId
|
|
|
+ //是否 删除 contractCostId 没有采购 没有拣货时可删除
|
|
|
+ if (DBSql.getInt(conn, "select count(*) from BO_EU_DNCTT_CONTRACT_COST_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0 && DBSql.getInt(conn, "select count(*) from BO_EU_DNIVT_ORDER_PRODUCT where CONTRACT_COST_ID=?", new Object[]{contractCostId}) == 0) {
|
|
|
+ String contractCostBINDId = DBSql.getString(conn, "select BINDID from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
|
|
|
+ SDK.getProcessAPI().deleteById(contractCostBINDId, uc.getUID());
|
|
|
+ DBSql.update(conn, "delete from BO_EU_DNCTT_CONTRACT_COST where ID=?", new Object[]{contractCostId});
|
|
|
+ }
|
|
|
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 一个服务对应添加一个合同产品
|
|
|
+ * @param uc
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public boolean AddContractServiceProduct(UserContext uc, RowMap contract) throws SQLException {
|
|
|
+ contractServiceLogger.info("新增服务或服务包");
|
|
|
+
|
|
|
+ Connection conn = null;
|
|
|
+ try {
|
|
|
+ conn = DBSql.open();
|
|
|
+ conn.setAutoCommit(false);
|
|
|
+ AddContractServiceProduct(uc,contract,conn);
|
|
|
conn.commit();
|
|
|
return true;
|
|
|
} catch (SQLException e) {
|
|
|
@@ -744,22 +797,33 @@ public class contractService {
|
|
|
BO product = SDK.getBOAPI().get("BO_EU_DNIVT_PRODUCT", contractCost.getString("PRODUCT_ID"));
|
|
|
|
|
|
if (product != null) {
|
|
|
-
|
|
|
contractCost.set("DESCRIPTION", product.getString("DESCRIPTION"));
|
|
|
contractCost.set("COST_CODE_ID", product.getString("COST_CODE_ID"));
|
|
|
- contractCost.set("UNIT_COST", product.getString("UNIT_COST"));
|
|
|
- contractCost.set("UNIT_PRICE", product.getString("UNIT_PRICE"));
|
|
|
contractCost.set("PRODUCT_NAME", product.getString("NAME"));
|
|
|
-
|
|
|
contractCost.set("TAX_CATEGORY_ID", DBSql.getString("select TAX_CATEGORY_ID from BO_EU_DND_COST_CODE where OID=?", new Object[]{product.getString("COST_CODE_ID")}));
|
|
|
contractCost.set("COST_CODE_NAME", DBSql.getString("select NAME from BO_EU_DND_COST_CODE where OID=?", new Object[]{product.getString("COST_CODE_ID")}));
|
|
|
}
|
|
|
}
|
|
|
+ contractCost.set("IS_SERVICE_PRODUCT", 1);
|
|
|
+ //单价
|
|
|
+ contractCost.set("UNIT_COST", service.get("UNIT_COST"));
|
|
|
+
|
|
|
+ //成本
|
|
|
+ contractCost.set("UNIT_PRICE", service.get("UNIT_PRICE"));
|
|
|
+
|
|
|
+ //数量
|
|
|
+ contractCost.set("QUANTITY", DBSql.getDouble(conn, "SELECT COUNT(1) as CNT FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "CNT") + DBSql.getDouble(conn, "SELECT COUNT(1) as CNT FROM BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "CNT"));
|
|
|
+
|
|
|
+ //总成本
|
|
|
+ contractCost.set("EXTENDED_COST", DBSql.getDouble(conn, "SELECT SUM(PERIOD_COST) as COST FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "COST") + DBSql.getDouble(conn, "SELECT SUM(PRORATED_COST_CHANGE) as COST FROM BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "COST"));
|
|
|
+
|
|
|
+ //总价格
|
|
|
+ contractCost.set("EXTENDED_PRICE", DBSql.getDouble(conn, "SELECT SUM(PERIOD_ADJUSTED_PRICE) as PRICE FROM BO_EU_DNCTT_CONTRACT_SERVICE_PERIOD WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "PRICE") + DBSql.getDouble(conn, "SELECT SUM(ADJUST_PRORATED_PRICE_CHANGE) as PRICE FROM BO_EU_DNCTT_CONTRACT_SERVICE_ADJUST WHERE CONTRACT_SERVICE_ID='" + service.get("SERVICE_ID") + "'", "PRICE"));
|
|
|
|
|
|
if (contractCost.isNew()) {
|
|
|
- SDK.getBOAPI().create("BO_EU_DNCTT_CONTRACT_COST", contractCost, contractCost.getBindId(), uc.getUID());
|
|
|
+ SDK.getBOAPI().create("BO_EU_DNCTT_CONTRACT_COST", contractCost, contractCost.getBindId(), uc.getUID(), conn);
|
|
|
} else {
|
|
|
- SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_COST", contractCost);
|
|
|
+ SDK.getBOAPI().update("BO_EU_DNCTT_CONTRACT_COST", contractCost, conn);
|
|
|
}
|
|
|
|
|
|
return contractCost.getId();
|