java110 %!s(int64=5) %!d(string=hai) anos
pai
achega
387c86ab6c

+ 18 - 0
java110-bean/src/main/java/com/java110/dto/RoomDto.java

@@ -28,11 +28,13 @@ public class RoomDto extends PageDto implements Serializable {
     private String builtUpArea;
     private String builtUpArea;
     private String roomNum;
     private String roomNum;
     private String unitId;
     private String unitId;
+    private String unitArea;
     private String apartment;
     private String apartment;
     private String apartmentName;
     private String apartmentName;
     private String communityId;
     private String communityId;
     private String floorId;
     private String floorId;
     private String floorNum;
     private String floorNum;
+    private String floorArea;
     private String userName;
     private String userName;
     private String ownerId;
     private String ownerId;
     private String ownerName;
     private String ownerName;
@@ -253,4 +255,20 @@ public class RoomDto extends PageDto implements Serializable {
     public void setLink(String link) {
     public void setLink(String link) {
         this.link = link;
         this.link = link;
     }
     }
+
+    public String getUnitArea() {
+        return unitArea;
+    }
+
+    public void setUnitArea(String unitArea) {
+        this.unitArea = unitArea;
+    }
+
+    public String getFloorArea() {
+        return floorArea;
+    }
+
+    public void setFloorArea(String floorArea) {
+        this.floorArea = floorArea;
+    }
 }
 }

+ 1 - 0
java110-core/src/main/java/com/java110/core/factory/WechatFactory.java

@@ -100,6 +100,7 @@ public class WechatFactory {
      * @return
      * @return
      */
      */
     public static String getAppId(String wId) {
     public static String getAppId(String wId) {
+        wId = wId.replace(" ", "+");
         return AuthenticationFactory.decrypt(password, wId);
         return AuthenticationFactory.decrypt(password, wId);
     }
     }
 
 

+ 1 - 1
java110-db/src/main/resources/mapper/community/RoomServiceDaoImplMapper.xml

@@ -603,7 +603,7 @@
         SELECT t.fee_coefficient,t.fee_coefficient feeCoefficient,t.section,t.status_cd,t.status_cd statusCd,t.remark,t.user_id,
         SELECT t.fee_coefficient,t.fee_coefficient feeCoefficient,t.section,t.status_cd,t.status_cd statusCd,t.remark,t.user_id,
         t.user_id userId,t.room_id,t.room_id roomId,t.layer,t.built_up_area,t.built_up_area builtUpArea,t.room_num,
         t.user_id userId,t.room_id,t.room_id roomId,t.layer,t.built_up_area,t.built_up_area builtUpArea,t.room_num,
         t.room_num roomNum,t.unit_id,t.unit_id unitId,t.b_id,t.b_id bId,t.apartment,t.state,u.`unit_num` unitNum,
         t.room_num roomNum,t.unit_id,t.unit_id unitId,t.b_id,t.b_id bId,t.apartment,t.state,u.`unit_num` unitNum,
-        u.unit_id unitId,f.floor_id floorId,f.floor_num floorNum
+        u.unit_id unitId,f.floor_id floorId,f.floor_num floorNum,f.floor_area floorArea,u.unit_area unitArea
         FROM building_room t,building_unit u,f_floor f
         FROM building_room t,building_unit u,f_floor f
         WHERE 1 =1
         WHERE 1 =1
         AND t.`unit_id` = u.`unit_id`
         AND t.`unit_id` = u.`unit_id`

+ 28 - 0
service-fee/src/main/java/com/java110/fee/api/ImportFeeApi.java

@@ -3,6 +3,7 @@ package com.java110.fee.api;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.java110.dto.importFee.ImportFeeDto;
 import com.java110.dto.importFee.ImportFeeDto;
 import com.java110.dto.importFeeDetail.ImportFeeDetailDto;
 import com.java110.dto.importFeeDetail.ImportFeeDetailDto;
+import com.java110.fee.bmo.importFee.IFeeSharingBMO;
 import com.java110.fee.bmo.importFee.IGetImportFeeBMO;
 import com.java110.fee.bmo.importFee.IGetImportFeeBMO;
 import com.java110.fee.bmo.importFeeDetail.IDeleteImportFeeDetailBMO;
 import com.java110.fee.bmo.importFeeDetail.IDeleteImportFeeDetailBMO;
 import com.java110.fee.bmo.importFeeDetail.IGetImportFeeDetailBMO;
 import com.java110.fee.bmo.importFeeDetail.IGetImportFeeDetailBMO;
@@ -33,6 +34,9 @@ public class ImportFeeApi {
     @Autowired
     @Autowired
     private IGetImportFeeBMO getImportFeeBMOImpl;
     private IGetImportFeeBMO getImportFeeBMOImpl;
 
 
+    @Autowired
+    private IFeeSharingBMO feeSharingBMOImpl;
+
     /**
     /**
      * 微信保存消息模板
      * 微信保存消息模板
      *
      *
@@ -140,4 +144,28 @@ public class ImportFeeApi {
         importFeeDto.setCommunityId(communityId);
         importFeeDto.setCommunityId(communityId);
         return getImportFeeBMOImpl.get(importFeeDto);
         return getImportFeeBMOImpl.get(importFeeDto);
     }
     }
+
+    /**
+     * 费用公摊
+     *
+     * @param reqJson 公摊信息
+     * @return
+     * @serviceCode /importFee/feeSharing
+     * @path /app/importFee/feeSharing
+     */
+    @RequestMapping(value = "/feeSharing", method = RequestMethod.POST)
+    public ResponseEntity<String> feeSharing(@RequestBody String reqJson) {
+        JSONObject reqObj = JSONObject.parseObject(reqJson);
+        Assert.hasKeyAndValue(reqObj, "communityId", "未包含小区ID");
+        Assert.hasKeyAndValue(reqObj, "totalDegrees", "未包含使用量");
+        Assert.hasKeyAndValue(reqObj, "scope", "未包含公摊范围");
+        Assert.hasKeyAndValue(reqObj, "formulaId", "未包含公摊公式");
+        Assert.hasKeyAndValue(reqObj, "feeName", "未包含费用名称");
+        Assert.hasKeyAndValue(reqObj, "startTime", "未包含开始时间");
+        Assert.hasKeyAndValue(reqObj, "endTime", "未包含结束时间");
+        Assert.hasKeyAndValue(reqObj, "objId", "未包含公摊对象");
+        Assert.hasKeyAndValue(reqObj, "feeTypeCd", "未包含费用类型");
+
+        return feeSharingBMOImpl.share(reqObj);
+    }
 }
 }

+ 18 - 0
service-fee/src/main/java/com/java110/fee/bmo/importFee/IFeeSharingBMO.java

@@ -0,0 +1,18 @@
+package com.java110.fee.bmo.importFee;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.dto.importFee.ImportFeeDto;
+import org.springframework.http.ResponseEntity;
+
+public interface IFeeSharingBMO {
+
+
+    /**
+     * 查询费用公摊
+     * add by wuxw
+     * @param  reqJson
+     * @return
+     */
+    ResponseEntity<String> share(JSONObject reqJson);
+
+
+}

+ 169 - 0
service-fee/src/main/java/com/java110/fee/bmo/importFee/impl/FeeSharingBMOImpl.java

@@ -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;
+    }
+
+}