|
|
@@ -0,0 +1,169 @@
|
|
|
+package com.java110.fee.bmo.importFee.impl;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.java110.core.annotation.Java110Transactional;
|
|
|
+import com.java110.core.factory.GenerateCodeFactory;
|
|
|
+import com.java110.dto.RoomDto;
|
|
|
+import com.java110.dto.fee.FeeDto;
|
|
|
+import com.java110.dto.feeFormula.FeeFormulaDto;
|
|
|
+import com.java110.fee.bmo.importFee.IFeeSharingBMO;
|
|
|
+import com.java110.intf.community.IRoomInnerServiceSMO;
|
|
|
+import com.java110.intf.fee.IFeeFormulaInnerServiceSMO;
|
|
|
+import com.java110.intf.fee.IFeeInnerServiceSMO;
|
|
|
+import com.java110.intf.fee.IImportFeeInnerServiceSMO;
|
|
|
+import com.java110.po.fee.PayFeePo;
|
|
|
+import com.java110.utils.util.Assert;
|
|
|
+import com.java110.vo.ResultVo;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.http.ResponseEntity;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.script.ScriptEngine;
|
|
|
+import javax.script.ScriptEngineManager;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+@Service("feeSharingBMOImpl")
|
|
|
+public class FeeSharingBMOImpl implements IFeeSharingBMO {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IImportFeeInnerServiceSMO importFeeInnerServiceSMOImpl;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IFeeFormulaInnerServiceSMO feeFormulaInnerServiceSMOImpl;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加小区信息
|
|
|
+ *
|
|
|
+ * @param reqJson
|
|
|
+ * @return 订单服务能够接受的报文
|
|
|
+ */
|
|
|
+ @Java110Transactional
|
|
|
+ public ResponseEntity<String> share(JSONObject reqJson) {
|
|
|
+
|
|
|
+
|
|
|
+ String scope = reqJson.getString("scope");
|
|
|
+ RoomDto roomDto = new RoomDto();
|
|
|
+ roomDto.setState(RoomDto.STATE_SELL); // 已售房屋
|
|
|
+ List<RoomDto> roomDtos = null;
|
|
|
+ if ("1001".equals(scope)) {//小区
|
|
|
+ roomDto.setCommunityId(reqJson.getString("objId"));
|
|
|
+ roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
|
|
|
+ } else if ("2002".equals(scope)) {//楼栋
|
|
|
+ roomDto.setCommunityId(reqJson.getString("communityId"));
|
|
|
+ roomDto.setFloorId(reqJson.getString("objId"));
|
|
|
+ roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
|
|
|
+ } else {//单元
|
|
|
+ roomDto.setCommunityId(reqJson.getString("communityId"));
|
|
|
+ roomDto.setUnitId(reqJson.getString("objId"));
|
|
|
+ roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (roomDtos == null || roomDtos.size() < 1) {
|
|
|
+ throw new IllegalArgumentException("未找到相应房屋公摊费用");
|
|
|
+ }
|
|
|
+
|
|
|
+ FeeFormulaDto feeFormulaDto = new FeeFormulaDto();
|
|
|
+ feeFormulaDto.setCommunityId(reqJson.getString("communityId"));
|
|
|
+ feeFormulaDto.setFormulaId(reqJson.getString("formulaId"));
|
|
|
+
|
|
|
+ List<FeeFormulaDto> feeFormulaDtos = feeFormulaInnerServiceSMOImpl.queryFeeFormulas(feeFormulaDto);
|
|
|
+ Assert.listOnlyOne(feeFormulaDtos, "公摊公式错误");
|
|
|
+
|
|
|
+ //公摊公式
|
|
|
+ String formulaValue = deakFormula(feeFormulaDtos.get(0));
|
|
|
+
|
|
|
+ //公摊费用到房屋
|
|
|
+ sharingFeeToRoom(formulaValue, roomDtos, reqJson);
|
|
|
+
|
|
|
+
|
|
|
+ return ResultVo.createResponseEntity(ResultVo.CODE_ERROR, "保存失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 公摊费用到房屋
|
|
|
+ *
|
|
|
+ * @param formulaValue
|
|
|
+ * @param roomDtos
|
|
|
+ */
|
|
|
+ private void sharingFeeToRoom(String formulaValue, List<RoomDto> roomDtos, JSONObject reqJson) {
|
|
|
+
|
|
|
+
|
|
|
+ List<PayFeePo> payFeePos = new ArrayList<>();
|
|
|
+ for (RoomDto roomDto : roomDtos) {
|
|
|
+ doSharingFeeToRoom(formulaValue, roomDto, reqJson, payFeePos);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 每个房屋公式
|
|
|
+ * T 代表总量,如电费总使用量
|
|
|
+ * F 代表房屋对应楼栋面积
|
|
|
+ * U 代表房屋对应单元面积
|
|
|
+ * R 代表房屋面积
|
|
|
+ * X 代表房屋收费系数(房屋管理中配置)
|
|
|
+ * 举例:公共区域公摊电费 电量/楼栋面积*房屋面积*单价
|
|
|
+ * 公式:T/F * R * 1.5 1.5为单价
|
|
|
+ *
|
|
|
+ * @param formulaValue
|
|
|
+ * @param roomDto
|
|
|
+ */
|
|
|
+ private void doSharingFeeToRoom(String formulaValue, RoomDto roomDto, JSONObject reqJson, List<PayFeePo> payFeePos) {
|
|
|
+ Assert.hasKeyAndValue(reqJson, "communityId", "未包含小区ID");
|
|
|
+ Assert.hasKeyAndValue(reqJson, "totalDegrees", "未包含使用量");
|
|
|
+ Assert.hasKeyAndValue(reqJson, "scope", "未包含公摊范围");
|
|
|
+ Assert.hasKeyAndValue(reqJson, "formulaId", "未包含公摊公式");
|
|
|
+ Assert.hasKeyAndValue(reqJson, "feeName", "未包含费用名称");
|
|
|
+ Assert.hasKeyAndValue(reqJson, "startTime", "未包含开始时间");
|
|
|
+ Assert.hasKeyAndValue(reqJson, "endTime", "未包含结束时间");
|
|
|
+ Assert.hasKeyAndValue(reqJson, "objId", "未包含公摊对象");
|
|
|
+ Assert.hasKeyAndValue(reqJson, "feeTypeCd", "未包含费用类型");
|
|
|
+
|
|
|
+
|
|
|
+ String orgFormulaValue = formulaValue;
|
|
|
+ formulaValue = formulaValue.replace("T", reqJson.getString("totalDegrees"))
|
|
|
+ .replace("F", roomDto.getFloorArea())
|
|
|
+ .replace("U", roomDto.getUnitArea())
|
|
|
+ .replace("R", roomDto.getBuiltUpArea())
|
|
|
+ .replace("X", roomDto.getFeeCoefficient());
|
|
|
+
|
|
|
+ ScriptEngineManager manager = new ScriptEngineManager();
|
|
|
+ ScriptEngine engine = manager.getEngineByName("JavaScript");
|
|
|
+ String value = "";
|
|
|
+ try {
|
|
|
+ value = engine.eval(formulaValue).toString();
|
|
|
+ value = engine.eval(value + ".toFixed(2)").toString();
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new IllegalArgumentException("公式计算异常,公式为【" + orgFormulaValue + "】,计算 【" + formulaValue + "】异常");
|
|
|
+ }
|
|
|
+
|
|
|
+ PayFeePo payFeePo = new PayFeePo();
|
|
|
+ payFeePo.setEndTime(reqJson.getString("endTime"));
|
|
|
+ payFeePo.setUserId(reqJson.getString("userId"));
|
|
|
+ payFeePo.setPayerObjId(roomDto.getRoomId());
|
|
|
+ payFeePo.setCommunityId(reqJson.getString("communityId"));
|
|
|
+ payFeePo.setFeeId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_feeId));
|
|
|
+ payFeePo.setState(FeeDto.STATE_DOING);
|
|
|
+ payFeePo.setIncomeObjId(reqJson.getString("storeId"));
|
|
|
+ //payFeePo.setFeeFlag();
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private String deakFormula(FeeFormulaDto feeFormulaDto) {
|
|
|
+ String value = feeFormulaDto.getFormulaValue();
|
|
|
+
|
|
|
+ value = value.replace("\n", "")
|
|
|
+ .replace("\r", "")
|
|
|
+ .trim();
|
|
|
+
|
|
|
+ return value;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|